aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src
diff options
context:
space:
mode:
Diffstat (limited to 'OpenKeychain/src')
-rw-r--r--OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricFileOperationTests.java2
-rw-r--r--OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricTextOperationTests.java33
-rw-r--r--OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/MiscCryptOperationTests.java15
-rw-r--r--OpenKeychain/src/main/AndroidManifest.xml23
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/compatibility/AppCompatPreferenceActivity.java127
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java13
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ConsolidateOperation.java46
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java11
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ExportOperation.java343
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java)436
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeybaseVerificationOperation.java158
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java1
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/KeybaseVerificationResult.java78
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java14
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ConsolidateInputParcel.java58
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DeleteKeyringParcel.java63
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ExportKeyringParcel.java99
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ImportKeyringParcel.java74
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeybaseVerificationParcel.java62
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainNewService.java188
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java679
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java13
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PromoteKeyringParcel.java66
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/RequiredInputParcel.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java13
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java102
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java99
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java37
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java270
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyBlankFragment.java90
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyImportFragment.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java)112
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinFragment.java128
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinRepeatFragment.java152
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyWaitFragment.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyWaitFragment.java)4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java92
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java14
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java18
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptOverviewFragment.java24
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java126
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java116
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java164
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java132
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java80
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyServerActivity.java194
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java367
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java94
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java91
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java235
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java65
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CachingCryptoOperationFragment.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java215
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java326
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddKeyserverDialogFragment.java)89
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java113
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/DividerItemDecoration.java106
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperAdapter.java41
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperDragCallback.java92
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperViewHolder.java39
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/RecyclerItemClickListener.java70
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/Editor.java28
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyServerEditor.java84
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java55
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java85
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java6
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_add_white_24dp.pngbin0 -> 127 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_reorder_grey_500_24dp.pngbin0 -> 134 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_add_white_24dp.pngbin0 -> 88 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_reorder_grey_500_24dp.pngbin0 -> 101 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_add_white_24dp.pngbin0 -> 97 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_reorder_grey_500_24dp.pngbin0 -> 138 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_add_white_24dp.pngbin0 -> 97 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_reorder_grey_500_24dp.pngbin0 -> 186 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.pngbin0 -> 102 bytes
-rw-r--r--OpenKeychain/src/main/res/layout/create_yubi_key_blank_fragment.xml76
-rw-r--r--OpenKeychain/src/main/res/layout/create_yubi_key_import_fragment.xml (renamed from OpenKeychain/src/main/res/layout/create_yubikey_import_fragment.xml)0
-rw-r--r--OpenKeychain/src/main/res/layout/create_yubi_key_pin_fragment.xml109
-rw-r--r--OpenKeychain/src/main/res/layout/create_yubi_key_pin_repeat_fragment.xml110
-rw-r--r--OpenKeychain/src/main/res/layout/create_yubi_key_wait_fragment.xml (renamed from OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml)0
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_text_fragment.xml7
-rw-r--r--OpenKeychain/src/main/res/layout/key_server_preference.xml117
-rw-r--r--OpenKeychain/src/main/res/layout/preference_toolbar.xml (renamed from OpenKeychain/src/main/res/layout/preference_toolbar_activity.xml)5
-rw-r--r--OpenKeychain/src/main/res/layout/settings_keyserver_fragment.xml7
-rw-r--r--OpenKeychain/src/main/res/layout/settings_keyserver_item.xml46
-rw-r--r--OpenKeychain/src/main/res/menu/decrypt_item_context_menu.xml2
-rw-r--r--OpenKeychain/src/main/res/menu/keyserver_pref_menu.xml10
-rw-r--r--OpenKeychain/src/main/res/raw-ar/help_about.md65
-rw-r--r--OpenKeychain/src/main/res/raw-ar/help_certification.md28
-rw-r--r--OpenKeychain/src/main/res/raw-ar/help_changelog.md278
-rw-r--r--OpenKeychain/src/main/res/raw-ar/help_start.md16
-rw-r--r--OpenKeychain/src/main/res/raw-bg/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-bg/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-cs/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-cs/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-de/help_about.md33
-rw-r--r--OpenKeychain/src/main/res/raw-de/help_certification.md32
-rw-r--r--OpenKeychain/src/main/res/raw-de/help_changelog.md75
-rw-r--r--OpenKeychain/src/main/res/raw-de/help_start.md12
-rw-r--r--OpenKeychain/src/main/res/raw-es/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-es/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-et/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-et/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-eu/help_about.md65
-rw-r--r--OpenKeychain/src/main/res/raw-eu/help_certification.md26
-rw-r--r--OpenKeychain/src/main/res/raw-eu/help_changelog.md79
-rw-r--r--OpenKeychain/src/main/res/raw-eu/help_start.md24
-rw-r--r--OpenKeychain/src/main/res/raw-fi/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-fi/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-fr/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-fr/help_certification.md4
-rw-r--r--OpenKeychain/src/main/res/raw-fr/help_changelog.md27
-rw-r--r--OpenKeychain/src/main/res/raw-fr/help_start.md6
-rw-r--r--OpenKeychain/src/main/res/raw-is/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-is/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-it/help_about.md41
-rw-r--r--OpenKeychain/src/main/res/raw-it/help_certification.md38
-rw-r--r--OpenKeychain/src/main/res/raw-it/help_changelog.md23
-rw-r--r--OpenKeychain/src/main/res/raw-it/help_start.md24
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_about.md29
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_certification.md8
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-kn/help_about.md65
-rw-r--r--OpenKeychain/src/main/res/raw-kn/help_certification.md28
-rw-r--r--OpenKeychain/src/main/res/raw-kn/help_changelog.md278
-rw-r--r--OpenKeychain/src/main/res/raw-kn/help_start.md16
-rw-r--r--OpenKeychain/src/main/res/raw-nl/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-nl/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-pl/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-pl/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-pt/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-pt/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-ro/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-ro/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_certification.md8
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_start.md22
-rw-r--r--OpenKeychain/src/main/res/raw-sl/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-sl/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-sr/help_about.md57
-rw-r--r--OpenKeychain/src/main/res/raw-sr/help_certification.md2
-rw-r--r--OpenKeychain/src/main/res/raw-sr/help_changelog.md23
-rw-r--r--OpenKeychain/src/main/res/raw-sv/help_about.md45
-rw-r--r--OpenKeychain/src/main/res/raw-sv/help_certification.md18
-rw-r--r--OpenKeychain/src/main/res/raw-sv/help_changelog.md41
-rw-r--r--OpenKeychain/src/main/res/raw-sv/help_start.md20
-rw-r--r--OpenKeychain/src/main/res/raw-tr/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-tr/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-uk/help_about.md31
-rw-r--r--OpenKeychain/src/main/res/raw-uk/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-vi/help_about.md65
-rw-r--r--OpenKeychain/src/main/res/raw-vi/help_certification.md28
-rw-r--r--OpenKeychain/src/main/res/raw-vi/help_changelog.md278
-rw-r--r--OpenKeychain/src/main/res/raw-vi/help_start.md16
-rw-r--r--OpenKeychain/src/main/res/raw-zh-rTW/help_about.md39
-rw-r--r--OpenKeychain/src/main/res/raw-zh-rTW/help_certification.md32
-rw-r--r--OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.md83
-rw-r--r--OpenKeychain/src/main/res/raw-zh-rTW/help_start.md22
-rw-r--r--OpenKeychain/src/main/res/raw-zh/help_about.md65
-rw-r--r--OpenKeychain/src/main/res/raw-zh/help_certification.md18
-rw-r--r--OpenKeychain/src/main/res/raw-zh/help_changelog.md21
-rw-r--r--OpenKeychain/src/main/res/raw-zh/help_start.md24
-rw-r--r--OpenKeychain/src/main/res/raw/help_changelog.md7
-rw-r--r--OpenKeychain/src/main/res/values-ar/strings.xml72
-rw-r--r--OpenKeychain/src/main/res/values-bg/strings.xml4
-rw-r--r--OpenKeychain/src/main/res/values-cs/strings.xml264
-rw-r--r--OpenKeychain/src/main/res/values-de/strings.xml185
-rw-r--r--OpenKeychain/src/main/res/values-es/strings.xml281
-rw-r--r--OpenKeychain/src/main/res/values-et/strings.xml9
-rw-r--r--OpenKeychain/src/main/res/values-eu/strings.xml500
-rw-r--r--OpenKeychain/src/main/res/values-fi/strings.xml24
-rw-r--r--OpenKeychain/src/main/res/values-fr/strings.xml307
-rw-r--r--OpenKeychain/src/main/res/values-is/strings.xml4
-rw-r--r--OpenKeychain/src/main/res/values-it/strings.xml123
-rw-r--r--OpenKeychain/src/main/res/values-kn/strings.xml72
-rw-r--r--OpenKeychain/src/main/res/values-nl/strings.xml229
-rw-r--r--OpenKeychain/src/main/res/values-pl/strings.xml80
-rw-r--r--OpenKeychain/src/main/res/values-pt/strings.xml4
-rw-r--r--OpenKeychain/src/main/res/values-ro/strings.xml4
-rw-r--r--OpenKeychain/src/main/res/values-sl/strings.xml70
-rw-r--r--OpenKeychain/src/main/res/values-sv/strings.xml170
-rw-r--r--OpenKeychain/src/main/res/values-tr/strings.xml47
-rw-r--r--OpenKeychain/src/main/res/values-uk/strings.xml46
-rw-r--r--OpenKeychain/src/main/res/values-vi/strings.xml72
-rw-r--r--OpenKeychain/src/main/res/values-zh-rTW/strings.xml195
-rw-r--r--OpenKeychain/src/main/res/values-zh/strings.xml75
-rw-r--r--OpenKeychain/src/main/res/values/strings.xml37
-rw-r--r--OpenKeychain/src/main/res/values/styles.xml8
-rw-r--r--OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/ExportTest.java3
-rw-r--r--OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperationTest.java7
202 files changed, 9012 insertions, 4273 deletions
diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricFileOperationTests.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricFileOperationTests.java
index 20ee6a8b1..5570b627f 100644
--- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricFileOperationTests.java
+++ b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricFileOperationTests.java
@@ -184,7 +184,7 @@ public class AsymmetricFileOperationTests {
handleSaveDecryptedFileIntent(savedFile, file.getName());
// save decrypted content
- onView(withText(R.string.btn_save)).perform(click());
+ onView(withText(R.string.btn_save_file)).perform(click());
checkSnackbar(Style.OK, R.string.file_saved);
assertThat("decrypted file has been saved", true, is(savedFile.exists()));
diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricTextOperationTests.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricTextOperationTests.java
index 6b226142c..cb3d2cb17 100644
--- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricTextOperationTests.java
+++ b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricTextOperationTests.java
@@ -32,15 +32,14 @@ import org.junit.runner.RunWith;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.ui.util.Notify.Style;
+import org.sufficientlysecure.keychain.util.FileHelper;
import static android.support.test.espresso.Espresso.onData;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.Espresso.pressBack;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.typeText;
-import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.contrib.DrawerActions.openDrawer;
import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
@@ -115,33 +114,13 @@ public class AsymmetricTextOperationTests {
onView(withId(R.id.passphrase_passphrase)).perform(typeText("x"));
onView(withText(R.string.btn_unlock)).perform(click());
-
onView(isRecyclerItemView(R.id.decrypted_files_list,
hasDescendant(withText(R.string.filename_unknown_text))))
- .check(matches(allOf(withEncryptionStatus(true), withSignatureNone())));
-
- }
-
- }
-
- @Test
- public void testTextEncryptDecryptFromKeyView() throws Exception {
-
- String cleartext = randomString(10, 30);
-
- pressBack();
-
- { // encrypt
-
- // navigate to edit key dialog
- onData(withKeyItemId(0x9D604D2F310716A3L))
- .inAdapterView(allOf(isAssignableFrom(AdapterView.class),
- isDescendantOfA(withId(R.id.key_list_list))))
- .perform(click());
- onView(withId(R.id.view_key_action_encrypt_text)).perform(click());
-
- // make sure the encrypt is correctly set
- onView(withId(R.id.result_encryption_icon)).check(matches(withDisplayedChild(1)));
+ .check(matches(allOf(
+ hasDescendant(withText(FileHelper.readableFileSize(cleartext.length()))),
+ withEncryptionStatus(true),
+ withSignatureNone()
+ )));
}
diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/MiscCryptOperationTests.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/MiscCryptOperationTests.java
index 96d69e833..7b4506986 100644
--- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/MiscCryptOperationTests.java
+++ b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/MiscCryptOperationTests.java
@@ -23,6 +23,9 @@ import java.io.File;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Instrumentation.ActivityResult;
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build.VERSION_CODES;
@@ -144,6 +147,18 @@ public class MiscCryptOperationTests {
}
@Test
+ public void testDecryptEmptyClipboard() throws Exception {
+
+ // decrypt any non-pgp file
+ ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE);
+ clipboard.setPrimaryClip(ClipData.newPlainText("", ""));
+
+ onView(withId(R.id.decrypt_from_clipboard)).perform(click());
+ checkSnackbar(Style.ERROR, R.string.error_clipboard_empty);
+
+ }
+
+ @Test
public void testDecryptNonPgpClipboard() throws Exception {
// decrypt any non-pgp file
diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml
index c8073da00..b3754d360 100644
--- a/OpenKeychain/src/main/AndroidManifest.xml
+++ b/OpenKeychain/src/main/AndroidManifest.xml
@@ -95,6 +95,15 @@
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.MainActivity" />
+ <!-- Connect with YubiKeys. This Activity will automatically show/import/create YubiKeys -->
+ <intent-filter android:label="@string/app_name">
+ <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <data
+ android:scheme="https"
+ android:host="my.yubico.com"
+ android:pathPrefix="/neo"/>
+ </intent-filter>
</activity>
<activity
android:name=".ui.EditKeyActivity"
@@ -687,17 +696,6 @@
android:launchMode="singleTop"
android:taskAffinity=":Nfc" />
- <!--<activity-->
- <!--android:name=".ui.NfcIntentActivity"-->
- <!--android:launchMode="singleTop">-->
- <!--<intent-filter>-->
- <!--<action android:name="android.nfc.action.NDEF_DISCOVERED" />-->
-
- <!--<category android:name="android.intent.category.DEFAULT" />-->
- <!--<data android:host="my.yubico.com" android:scheme="https"/>-->
- <!--</intent-filter>-->
- <!--</activity>-->
-
<activity
android:name=".ui.HelpActivity"
android:label="@string/title_help" />
@@ -712,9 +710,6 @@
android:exported="false"
android:process=":remote_api" />
<service
- android:name=".service.KeychainNewService"
- android:exported="false" />
- <service
android:name=".service.KeychainService"
android:exported="false" />
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/compatibility/AppCompatPreferenceActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/compatibility/AppCompatPreferenceActivity.java
new file mode 100644
index 000000000..5200b8ced
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/compatibility/AppCompatPreferenceActivity.java
@@ -0,0 +1,127 @@
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sufficientlysecure.keychain.compatibility;
+
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+import android.support.annotation.LayoutRes;
+import android.support.annotation.Nullable;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatDelegate;
+import android.support.v7.widget.Toolbar;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls
+ * to be used with AppCompat.
+ * <p/>
+ * This technique can be used with an {@link android.app.Activity} class, not just
+ * {@link android.preference.PreferenceActivity}.
+ */
+public abstract class AppCompatPreferenceActivity extends PreferenceActivity {
+ private AppCompatDelegate mDelegate;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ getDelegate().installViewFactory();
+ getDelegate().onCreate(savedInstanceState);
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+ getDelegate().onPostCreate(savedInstanceState);
+ }
+
+ public ActionBar getSupportActionBar() {
+ return getDelegate().getSupportActionBar();
+ }
+
+ public void setSupportActionBar(@Nullable Toolbar toolbar) {
+ getDelegate().setSupportActionBar(toolbar);
+ }
+
+ @Override
+ public MenuInflater getMenuInflater() {
+ return getDelegate().getMenuInflater();
+ }
+
+ @Override
+ public void setContentView(@LayoutRes int layoutResID) {
+ getDelegate().setContentView(layoutResID);
+ }
+
+ @Override
+ public void setContentView(View view) {
+ getDelegate().setContentView(view);
+ }
+
+ @Override
+ public void setContentView(View view, ViewGroup.LayoutParams params) {
+ getDelegate().setContentView(view, params);
+ }
+
+ @Override
+ public void addContentView(View view, ViewGroup.LayoutParams params) {
+ getDelegate().addContentView(view, params);
+ }
+
+ @Override
+ protected void onPostResume() {
+ super.onPostResume();
+ getDelegate().onPostResume();
+ }
+
+ @Override
+ protected void onTitleChanged(CharSequence title, int color) {
+ super.onTitleChanged(title, color);
+ getDelegate().setTitle(title);
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ getDelegate().onConfigurationChanged(newConfig);
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ getDelegate().onStop();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ getDelegate().onDestroy();
+ }
+
+ public void invalidateOptionsMenu() {
+ getDelegate().invalidateOptionsMenu();
+ }
+
+ private AppCompatDelegate getDelegate() {
+ if (mDelegate == null) {
+ mDelegate = AppCompatDelegate.create(this, null);
+ }
+ return mDelegate;
+ }
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java
index c0221fad3..649cede10 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java
@@ -45,6 +45,7 @@ public class CloudSearch {
}
final ImportKeysList results = new ImportKeysList(servers.size());
+ ArrayList<Thread> searchThreads = new ArrayList<>();
for (final Keyserver keyserver : servers) {
Runnable r = new Runnable() {
@Override
@@ -57,19 +58,25 @@ public class CloudSearch {
results.finishedAdding(); // notifies if all searchers done
}
};
- new Thread(r).start();
+ Thread searchThread = new Thread(r);
+ searchThreads.add(searchThread);
+ searchThread.start();
}
// wait for either all the searches to come back, or 10 seconds
- synchronized(results) {
+ synchronized (results) {
try {
results.wait(10 * SECONDS);
+ for (Thread thread : searchThreads) {
+ // kill threads that haven't returned yet
+ thread.interrupt();
+ }
} catch (InterruptedException e) {
}
}
if (results.outstandingSuppliers() > 0) {
- String message = "Launched " + servers.size() + " cloud searchers, but" +
+ String message = "Launched " + servers.size() + " cloud searchers, but" +
results.outstandingSuppliers() + "failed to complete.";
problems.add(new Keyserver.QueryFailedException(message));
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java
index 439260b74..0806e6a16 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java
@@ -58,12 +58,13 @@ import java.util.concurrent.atomic.AtomicBoolean;
* @see CertifyActionsParcel
*
*/
-public class CertifyOperation extends BaseOperation {
+public class CertifyOperation extends BaseOperation<CertifyActionsParcel> {
public CertifyOperation(Context context, ProviderHelper providerHelper, Progressable progressable, AtomicBoolean cancelled) {
super(context, providerHelper, progressable, cancelled);
}
+ @Override
public CertifyResult execute(CertifyActionsParcel parcel, CryptoInputParcel cryptoInput) {
OperationLog log = new OperationLog();
@@ -86,8 +87,10 @@ public class CertifyOperation extends BaseOperation {
case PATTERN:
case PASSPHRASE:
if (!cryptoInput.hasPassphrase()) {
- return new CertifyResult(log, RequiredInputParcel.createRequiredSignPassphrase(
- certificationKey.getKeyId(), certificationKey.getKeyId(), null));
+ return new CertifyResult(log,
+ RequiredInputParcel.createRequiredSignPassphrase(
+ certificationKey.getKeyId(), certificationKey.getKeyId(), null)
+ );
}
// certification is always with the master key id, so use that one
passphrase = cryptoInput.getPassphrase();
@@ -185,10 +188,10 @@ public class CertifyOperation extends BaseOperation {
}
HkpKeyserver keyServer = null;
- ImportExportOperation importExportOperation = null;
+ ExportOperation exportOperation = null;
if (parcel.keyServerUri != null) {
keyServer = new HkpKeyserver(parcel.keyServerUri);
- importExportOperation = new ImportExportOperation(mContext, mProviderHelper, mProgressable);
+ exportOperation = new ExportOperation(mContext, mProviderHelper, mProgressable);
}
// Write all certified keys into the database
@@ -206,10 +209,10 @@ public class CertifyOperation extends BaseOperation {
mProviderHelper.clearLog();
SaveKeyringResult result = mProviderHelper.savePublicKeyRing(certifiedKey);
- if (importExportOperation != null) {
+ if (exportOperation != null) {
// TODO use subresult, get rid of try/catch!
try {
- importExportOperation.uploadKeyRingToServer(keyServer, certifiedKey);
+ exportOperation.uploadKeyRingToServer(keyServer, certifiedKey);
uploadOk += 1;
} catch (AddKeyException e) {
Log.e(Constants.TAG, "error uploading key", e);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ConsolidateOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ConsolidateOperation.java
new file mode 100644
index 000000000..bda574e0a
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ConsolidateOperation.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ * Copyright (C) 2015 Adithya Abraham Philip <adithyaphilip@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.operations;
+
+import android.content.Context;
+
+import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
+import org.sufficientlysecure.keychain.pgp.Progressable;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.service.ConsolidateInputParcel;
+import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
+
+public class ConsolidateOperation extends BaseOperation<ConsolidateInputParcel> {
+
+ public ConsolidateOperation(Context context, ProviderHelper providerHelper, Progressable
+ progressable) {
+ super(context, providerHelper, progressable);
+ }
+
+ @Override
+ public ConsolidateResult execute(ConsolidateInputParcel consolidateInputParcel,
+ CryptoInputParcel cryptoInputParcel) {
+ if (consolidateInputParcel.mConsolidateRecovery) {
+ return mProviderHelper.consolidateDatabaseStep2(mProgressable);
+ } else {
+ return mProviderHelper.consolidateDatabaseStep1(mProgressable);
+ }
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java
index 5ef04ab05..50b2ef69b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java
@@ -27,6 +27,8 @@ import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingData;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
+import org.sufficientlysecure.keychain.service.DeleteKeyringParcel;
+import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
/** An operation which implements a high level keyring delete operation.
@@ -37,13 +39,18 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
* a list.
*
*/
-public class DeleteOperation extends BaseOperation {
+public class DeleteOperation extends BaseOperation<DeleteKeyringParcel> {
public DeleteOperation(Context context, ProviderHelper providerHelper, Progressable progressable) {
super(context, providerHelper, progressable);
}
- public DeleteResult execute(long[] masterKeyIds, boolean isSecret) {
+ @Override
+ public DeleteResult execute(DeleteKeyringParcel deleteKeyringParcel,
+ CryptoInputParcel cryptoInputParcel) {
+
+ long[] masterKeyIds = deleteKeyringParcel.mMasterKeyIds;
+ boolean isSecret = deleteKeyringParcel.mIsSecret;
OperationLog log = new OperationLog();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ExportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ExportOperation.java
new file mode 100644
index 000000000..01a45bc79
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ExportOperation.java
@@ -0,0 +1,343 @@
+/*
+ * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2010-2014 Thialfihar <thi@thialfihar.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.operations;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+
+import org.spongycastle.bcpg.ArmoredOutputStream;
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
+import org.sufficientlysecure.keychain.keyimport.Keyserver.AddKeyException;
+import org.sufficientlysecure.keychain.operations.results.ExportResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
+import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing;
+import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
+import org.sufficientlysecure.keychain.pgp.Progressable;
+import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
+import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.service.ExportKeyringParcel;
+import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+import org.sufficientlysecure.keychain.util.FileHelper;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * An operation class which implements high level export
+ * operations.
+ * This class receives a source and/or destination of keys as input and performs
+ * all steps for this export.
+ *
+ * @see org.sufficientlysecure.keychain.ui.adapter.ImportKeysAdapter#getSelectedEntries()
+ * For the export operation, the input consists of a set of key ids and
+ * either the name of a file or an output uri to write to.
+ * TODO rework uploadKeyRingToServer
+ */
+public class ExportOperation extends BaseOperation<ExportKeyringParcel> {
+
+ public ExportOperation(Context context, ProviderHelper providerHelper, Progressable
+ progressable) {
+ super(context, providerHelper, progressable);
+ }
+
+ public ExportOperation(Context context, ProviderHelper providerHelper,
+ Progressable progressable, AtomicBoolean cancelled) {
+ super(context, providerHelper, progressable, cancelled);
+ }
+
+ public void uploadKeyRingToServer(HkpKeyserver server, CanonicalizedPublicKeyRing keyring)
+ throws AddKeyException {
+ uploadKeyRingToServer(server, keyring.getUncachedKeyRing());
+ }
+
+ public void uploadKeyRingToServer(HkpKeyserver server, UncachedKeyRing keyring) throws
+ AddKeyException {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ArmoredOutputStream aos = null;
+ try {
+ aos = new ArmoredOutputStream(bos);
+ keyring.encode(aos);
+ aos.close();
+
+ String armoredKey = bos.toString("UTF-8");
+ server.add(armoredKey);
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException", e);
+ throw new AddKeyException();
+ } finally {
+ try {
+ if (aos != null) {
+ aos.close();
+ }
+ bos.close();
+ } catch (IOException e) {
+ // this is just a finally thing, no matter if it doesn't work out.
+ }
+ }
+ }
+
+ public ExportResult exportToFile(long[] masterKeyIds, boolean exportSecret, String outputFile) {
+
+ OperationLog log = new OperationLog();
+ if (masterKeyIds != null) {
+ log.add(LogType.MSG_EXPORT, 0, masterKeyIds.length);
+ } else {
+ log.add(LogType.MSG_EXPORT_ALL, 0);
+ }
+
+ // do we have a file name?
+ if (outputFile == null) {
+ log.add(LogType.MSG_EXPORT_ERROR_NO_FILE, 1);
+ return new ExportResult(ExportResult.RESULT_ERROR, log);
+ }
+
+ // check if storage is ready
+ if (!FileHelper.isStorageMounted(outputFile)) {
+ log.add(LogType.MSG_EXPORT_ERROR_STORAGE, 1);
+ return new ExportResult(ExportResult.RESULT_ERROR, log);
+ }
+
+ try {
+ OutputStream outStream = new FileOutputStream(outputFile);
+ try {
+ ExportResult result = exportKeyRings(log, masterKeyIds, exportSecret, outStream);
+ if (result.cancelled()) {
+ //noinspection ResultOfMethodCallIgnored
+ new File(outputFile).delete();
+ }
+ return result;
+ } finally {
+ outStream.close();
+ }
+ } catch (IOException e) {
+ log.add(LogType.MSG_EXPORT_ERROR_FOPEN, 1);
+ return new ExportResult(ExportResult.RESULT_ERROR, log);
+ }
+
+ }
+
+ public ExportResult exportToUri(long[] masterKeyIds, boolean exportSecret, Uri outputUri) {
+
+ OperationLog log = new OperationLog();
+ if (masterKeyIds != null) {
+ log.add(LogType.MSG_EXPORT, 0, masterKeyIds.length);
+ } else {
+ log.add(LogType.MSG_EXPORT_ALL, 0);
+ }
+
+ // do we have a file name?
+ if (outputUri == null) {
+ log.add(LogType.MSG_EXPORT_ERROR_NO_URI, 1);
+ return new ExportResult(ExportResult.RESULT_ERROR, log);
+ }
+
+ try {
+ OutputStream outStream = mProviderHelper.getContentResolver().openOutputStream
+ (outputUri);
+ return exportKeyRings(log, masterKeyIds, exportSecret, outStream);
+ } catch (FileNotFoundException e) {
+ log.add(LogType.MSG_EXPORT_ERROR_URI_OPEN, 1);
+ return new ExportResult(ExportResult.RESULT_ERROR, log);
+ }
+
+ }
+
+ ExportResult exportKeyRings(OperationLog log, long[] masterKeyIds, boolean exportSecret,
+ OutputStream outStream) {
+
+ /* TODO isn't this checked above, with the isStorageMounted call?
+ if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+ log.add(LogType.MSG_EXPORT_ERROR_STORAGE, 1);
+ return new ExportResult(ExportResult.RESULT_ERROR, log);
+ }
+ */
+
+ if (!BufferedOutputStream.class.isInstance(outStream)) {
+ outStream = new BufferedOutputStream(outStream);
+ }
+
+ int okSecret = 0, okPublic = 0, progress = 0;
+
+ Cursor cursor = null;
+ try {
+
+ String selection = null, ids[] = null;
+
+ if (masterKeyIds != null) {
+ // generate placeholders and string selection args
+ ids = new String[masterKeyIds.length];
+ StringBuilder placeholders = new StringBuilder("?");
+ for (int i = 0; i < masterKeyIds.length; i++) {
+ ids[i] = Long.toString(masterKeyIds[i]);
+ if (i != 0) {
+ placeholders.append(",?");
+ }
+ }
+
+ // put together selection string
+ selection = Tables.KEY_RINGS_PUBLIC + "." + KeyRings.MASTER_KEY_ID
+ + " IN (" + placeholders + ")";
+ }
+
+ cursor = mProviderHelper.getContentResolver().query(
+ KeyRings.buildUnifiedKeyRingsUri(), new String[]{
+ KeyRings.MASTER_KEY_ID, KeyRings.PUBKEY_DATA,
+ KeyRings.PRIVKEY_DATA, KeyRings.HAS_ANY_SECRET
+ }, selection, ids, Tables.KEYS + "." + KeyRings.MASTER_KEY_ID
+ );
+
+ if (cursor == null || !cursor.moveToFirst()) {
+ log.add(LogType.MSG_EXPORT_ERROR_DB, 1);
+ return new ExportResult(ExportResult.RESULT_ERROR, log, okPublic, okSecret);
+ }
+
+ int numKeys = cursor.getCount();
+
+ updateProgress(
+ mContext.getResources().getQuantityString(R.plurals.progress_exporting_key,
+ numKeys), 0, numKeys);
+
+ // For each public masterKey id
+ while (!cursor.isAfterLast()) {
+
+ long keyId = cursor.getLong(0);
+ ArmoredOutputStream arOutStream = null;
+
+ // Create an output stream
+ try {
+ arOutStream = new ArmoredOutputStream(outStream);
+
+ log.add(LogType.MSG_EXPORT_PUBLIC, 1, KeyFormattingUtils.beautifyKeyId(keyId));
+
+ byte[] data = cursor.getBlob(1);
+ CanonicalizedKeyRing ring =
+ UncachedKeyRing.decodeFromData(data).canonicalize(log, 2, true);
+ ring.encode(arOutStream);
+
+ okPublic += 1;
+ } catch (PgpGeneralException e) {
+ log.add(LogType.MSG_EXPORT_ERROR_KEY, 2);
+ updateProgress(progress++, numKeys);
+ continue;
+ } finally {
+ // make sure this is closed
+ if (arOutStream != null) {
+ arOutStream.close();
+ }
+ arOutStream = null;
+ }
+
+ if (exportSecret && cursor.getInt(3) > 0) {
+ try {
+ arOutStream = new ArmoredOutputStream(outStream);
+
+ // export secret key part
+ log.add(LogType.MSG_EXPORT_SECRET, 2, KeyFormattingUtils.beautifyKeyId
+ (keyId));
+ byte[] data = cursor.getBlob(2);
+ CanonicalizedKeyRing ring =
+ UncachedKeyRing.decodeFromData(data).canonicalize(log, 2, true);
+ ring.encode(arOutStream);
+
+ okSecret += 1;
+ } catch (PgpGeneralException e) {
+ log.add(LogType.MSG_EXPORT_ERROR_KEY, 2);
+ updateProgress(progress++, numKeys);
+ continue;
+ } finally {
+ // make sure this is closed
+ if (arOutStream != null) {
+ arOutStream.close();
+ }
+ }
+ }
+
+ updateProgress(progress++, numKeys);
+
+ cursor.moveToNext();
+ }
+
+ updateProgress(R.string.progress_done, numKeys, numKeys);
+
+ } catch (IOException e) {
+ log.add(LogType.MSG_EXPORT_ERROR_IO, 1);
+ return new ExportResult(ExportResult.RESULT_ERROR, log, okPublic, okSecret);
+ } finally {
+ // Make sure the stream is closed
+ if (outStream != null) try {
+ outStream.close();
+ } catch (Exception e) {
+ Log.e(Constants.TAG, "error closing stream", e);
+ }
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+
+
+ log.add(LogType.MSG_EXPORT_SUCCESS, 1);
+ return new ExportResult(ExportResult.RESULT_OK, log, okPublic, okSecret);
+
+ }
+
+ public ExportResult execute(ExportKeyringParcel exportInput, CryptoInputParcel cryptoInput) {
+ switch (exportInput.mExportType) {
+ case UPLOAD_KEYSERVER: {
+ HkpKeyserver hkpKeyserver = new HkpKeyserver(exportInput.mKeyserver);
+ try {
+ CanonicalizedPublicKeyRing keyring
+ = mProviderHelper.getCanonicalizedPublicKeyRing(
+ exportInput.mCanonicalizedPublicKeyringUri);
+ uploadKeyRingToServer(hkpKeyserver, keyring);
+ // TODO: replace with proper log
+ return new ExportResult(ExportResult.RESULT_OK, new OperationLog());
+ } catch (Exception e) {
+ return new ExportResult(ExportResult.RESULT_ERROR, new OperationLog());
+ // TODO: Implement better exception handling, replace with log
+ }
+ }
+ case EXPORT_FILE: {
+ return exportToFile(exportInput.mMasterKeyIds, exportInput.mExportSecret,
+ exportInput.mOutputFile);
+ }
+ case EXPORT_URI: {
+ return exportToUri(exportInput.mMasterKeyIds, exportInput.mExportSecret,
+ exportInput.mOutputUri);
+ }
+ default: { // can't happen
+ return null;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java
index cdda42dae..ace059dac 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java
@@ -19,57 +19,50 @@
package org.sufficientlysecure.keychain.operations;
import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import org.spongycastle.bcpg.ArmoredOutputStream;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
import org.sufficientlysecure.keychain.keyimport.KeybaseKeyserver;
import org.sufficientlysecure.keychain.keyimport.Keyserver;
-import org.sufficientlysecure.keychain.keyimport.Keyserver.AddKeyException;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
-import org.sufficientlysecure.keychain.operations.results.ExportResult;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
-import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing;
-import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
-import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
-import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
-import org.sufficientlysecure.keychain.util.FileHelper;
+import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
+import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ParcelableFileCache;
import org.sufficientlysecure.keychain.util.ParcelableFileCache.IteratorWithSize;
import org.sufficientlysecure.keychain.util.ProgressScaler;
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorCompletionService;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
-/** An operation class which implements high level import and export
+/**
+ * An operation class which implements high level import
* operations.
- *
* This class receives a source and/or destination of keys as input and performs
- * all steps for this import or export.
- *
+ * all steps for this import.
* For the import operation, the only valid source is an Iterator of
* ParcelableKeyRing, each of which must contain either a single
* keyring encoded as bytes, or a unique reference to a keyring
@@ -78,72 +71,57 @@ import java.util.concurrent.atomic.AtomicBoolean;
* secret keys, because some implementations (notably Symantec PGP Desktop) do
* not include self certificates for user ids in the secret keyring. The import
* method here will generally import keyrings in the order given by the
- * iterator. so this should be ensured beforehand.
- * @see org.sufficientlysecure.keychain.ui.adapter.ImportKeysAdapter#getSelectedEntries()
- *
- * For the export operation, the input consists of a set of key ids and
- * either the name of a file or an output uri to write to.
- *
- * TODO rework uploadKeyRingToServer
+ * iterator, so this should be ensured beforehand.
*
+ * @see org.sufficientlysecure.keychain.ui.adapter.ImportKeysAdapter#getSelectedEntries()
*/
-public class ImportExportOperation extends BaseOperation {
+public class ImportOperation extends BaseOperation<ImportKeyringParcel> {
- public ImportExportOperation(Context context, ProviderHelper providerHelper, Progressable progressable) {
+ public ImportOperation(Context context, ProviderHelper providerHelper, Progressable
+ progressable) {
super(context, providerHelper, progressable);
}
- public ImportExportOperation(Context context, ProviderHelper providerHelper,
- Progressable progressable, AtomicBoolean cancelled) {
+ public ImportOperation(Context context, ProviderHelper providerHelper,
+ Progressable progressable, AtomicBoolean cancelled) {
super(context, providerHelper, progressable, cancelled);
}
- public void uploadKeyRingToServer(HkpKeyserver server, CanonicalizedPublicKeyRing keyring) throws AddKeyException {
- uploadKeyRingToServer(server, keyring.getUncachedKeyRing());
+ // Overloaded functions for using progressable supplied in constructor during import
+ public ImportKeyResult serialKeyRingImport(Iterator<ParcelableKeyRing> entries, int num,
+ String keyServerUri) {
+ return serialKeyRingImport(entries, num, keyServerUri, mProgressable);
}
- public void uploadKeyRingToServer(HkpKeyserver server, UncachedKeyRing keyring) throws AddKeyException {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- ArmoredOutputStream aos = null;
- try {
- aos = new ArmoredOutputStream(bos);
- keyring.encode(aos);
- aos.close();
+ public ImportKeyResult serialKeyRingImport(List<ParcelableKeyRing> entries,
+ String keyServerUri) {
+
+ Iterator<ParcelableKeyRing> it = entries.iterator();
+ int numEntries = entries.size();
+
+ return serialKeyRingImport(it, numEntries, keyServerUri, mProgressable);
- String armoredKey = bos.toString("UTF-8");
- server.add(armoredKey);
- } catch (IOException e) {
- Log.e(Constants.TAG, "IOException", e);
- throw new AddKeyException();
- } finally {
- try {
- if (aos != null) {
- aos.close();
- }
- bos.close();
- } catch (IOException e) {
- // this is just a finally thing, no matter if it doesn't work out.
- }
- }
}
- public ImportKeyResult importKeyRings(List<ParcelableKeyRing> entries, String keyServerUri) {
+ public ImportKeyResult serialKeyRingImport(List<ParcelableKeyRing> entries, String keyServerUri,
+ Progressable progressable) {
Iterator<ParcelableKeyRing> it = entries.iterator();
int numEntries = entries.size();
- return importKeyRings(it, numEntries, keyServerUri);
+ return serialKeyRingImport(it, numEntries, keyServerUri, progressable);
}
- public ImportKeyResult importKeyRings(ParcelableFileCache<ParcelableKeyRing> cache, String keyServerUri) {
+ public ImportKeyResult serialKeyRingImport(ParcelableFileCache<ParcelableKeyRing> cache,
+ String keyServerUri) {
// get entries from cached file
try {
IteratorWithSize<ParcelableKeyRing> it = cache.readCache();
int numEntries = it.getSize();
- return importKeyRings(it, numEntries, keyServerUri);
+ return serialKeyRingImport(it, numEntries, keyServerUri, mProgressable);
} catch (IOException e) {
// Special treatment here, we need a lot
@@ -157,15 +135,18 @@ public class ImportExportOperation extends BaseOperation {
}
/**
- * Since the introduction of multithreaded import, we expect calling functions to handle the key sync i,e
- * ContactSyncAdapterService.requestSync()
+ * Since the introduction of multithreaded import, we expect calling functions to handle the
+ * key sync i,eContactSyncAdapterService.requestSync()
*
- * @param entries keys to import
- * @param num number of keys to import
+ * @param entries keys to import
+ * @param num number of keys to import
* @param keyServerUri contains uri of keyserver to import from, if it is an import from cloud
+ * @param progressable Allows multi-threaded import to supply a progressable that ignores the
+ * progress of a single key being imported
* @return
*/
- public ImportKeyResult importKeyRings(Iterator<ParcelableKeyRing> entries, int num, String keyServerUri) {
+ public ImportKeyResult serialKeyRingImport(Iterator<ParcelableKeyRing> entries, int num,
+ String keyServerUri, Progressable progressable) {
updateProgress(R.string.progress_importing, 0, 100);
OperationLog log = new OperationLog();
@@ -208,7 +189,8 @@ public class ImportExportOperation extends BaseOperation {
else {
// We fetch from keyservers first, because we tend to get more certificates
- // from there, so the number of certificates which are merged in later is smaller.
+ // from there, so the number of certificates which are merged in later is
+ // smaller.
// If we have a keyServerUri and a fingerprint or at least a keyId,
// download from HKP
@@ -224,7 +206,8 @@ public class ImportExportOperation extends BaseOperation {
byte[] data;
// Download by fingerprint, or keyId - whichever is available
if (entry.mExpectedFingerprint != null) {
- log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER, 2, "0x" + entry.mExpectedFingerprint.substring(24));
+ log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER, 2, "0x" +
+ entry.mExpectedFingerprint.substring(24));
data = keyServer.get("0x" + entry.mExpectedFingerprint).getBytes();
} else {
log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER, 2, entry.mKeyIdHex);
@@ -302,10 +285,12 @@ public class ImportExportOperation extends BaseOperation {
mProviderHelper.clearLog();
if (key.isSecret()) {
result = mProviderHelper.saveSecretKeyRing(key,
- new ProgressScaler(mProgressable, (int)(position*progSteps), (int)((position+1)*progSteps), 100));
+ new ProgressScaler(progressable, (int) (position * progSteps),
+ (int) ((position + 1) * progSteps), 100));
} else {
result = mProviderHelper.savePublicKeyRing(key,
- new ProgressScaler(mProgressable, (int)(position*progSteps), (int)((position+1)*progSteps), 100));
+ new ProgressScaler(progressable, (int) (position * progSteps),
+ (int) ((position + 1) * progSteps), 100));
}
if (!result.success()) {
badKeys += 1;
@@ -333,7 +318,7 @@ public class ImportExportOperation extends BaseOperation {
// Special: consolidate on secret key import (cannot be cancelled!)
if (secret > 0) {
setPreventCancel();
- ConsolidateResult result = mProviderHelper.consolidateDatabaseStep1(mProgressable);
+ ConsolidateResult result = mProviderHelper.consolidateDatabaseStep1(progressable);
log.add(result, 1);
}
@@ -376,7 +361,7 @@ public class ImportExportOperation extends BaseOperation {
}
// Final log entry, it's easier to do this individually
- if ( (newKeys > 0 || updatedKeys > 0) && badKeys > 0) {
+ if ((newKeys > 0 || updatedKeys > 0) && badKeys > 0) {
log.add(LogType.MSG_IMPORT_PARTIAL, 1);
} else if (newKeys > 0 || updatedKeys > 0) {
log.add(LogType.MSG_IMPORT_SUCCESS, 1);
@@ -388,206 +373,193 @@ public class ImportExportOperation extends BaseOperation {
importedMasterKeyIdsArray);
}
- public ExportResult exportToFile(long[] masterKeyIds, boolean exportSecret, String outputFile) {
+ @Override
+ public ImportKeyResult execute(ImportKeyringParcel importInput, CryptoInputParcel cryptoInput) {
+ return importKeys(importInput.mKeyList, importInput.mKeyserver);
+ }
- OperationLog log = new OperationLog();
- if (masterKeyIds != null) {
- log.add(LogType.MSG_EXPORT, 0, masterKeyIds.length);
- } else {
- log.add(LogType.MSG_EXPORT_ALL, 0);
- }
+ public ImportKeyResult importKeys(ArrayList<ParcelableKeyRing> keyList, String keyServer) {
- // do we have a file name?
- if (outputFile == null) {
- log.add(LogType.MSG_EXPORT_ERROR_NO_FILE, 1);
- return new ExportResult(ExportResult.RESULT_ERROR, log);
- }
+ ImportKeyResult result;
- // check if storage is ready
- if (!FileHelper.isStorageMounted(outputFile)) {
- log.add(LogType.MSG_EXPORT_ERROR_STORAGE, 1);
- return new ExportResult(ExportResult.RESULT_ERROR, log);
- }
+ if (keyList == null) {// import from file, do serially
+ ParcelableFileCache<ParcelableKeyRing> cache = new ParcelableFileCache<>(mContext,
+ "key_import.pcl");
- try {
- OutputStream outStream = new FileOutputStream(outputFile);
- try {
- ExportResult result = exportKeyRings(log, masterKeyIds, exportSecret, outStream);
- if (result.cancelled()) {
- //noinspection ResultOfMethodCallIgnored
- new File(outputFile).delete();
- }
- return result;
- } finally {
- outStream.close();
+ result = serialKeyRingImport(cache, keyServer);
+ } else {
+ // if there is more than one key with the same fingerprint, we do a serial import to
+ // prevent
+ // https://github.com/open-keychain/open-keychain/issues/1221
+ HashSet<String> keyFingerprintSet = new HashSet<>();
+ for (int i = 0; i < keyList.size(); i++) {
+ keyFingerprintSet.add(keyList.get(i).mExpectedFingerprint);
+ }
+ if (keyFingerprintSet.size() == keyList.size()) {
+ // all keys have unique fingerprints
+ result = multiThreadedKeyImport(keyList.iterator(), keyList.size(), keyServer);
+ } else {
+ result = serialKeyRingImport(keyList, keyServer);
}
- } catch (IOException e) {
- log.add(LogType.MSG_EXPORT_ERROR_FOPEN, 1);
- return new ExportResult(ExportResult.RESULT_ERROR, log);
}
+ ContactSyncAdapterService.requestSync();
+ return result;
}
- public ExportResult exportToUri(long[] masterKeyIds, boolean exportSecret, Uri outputUri) {
+ private ImportKeyResult multiThreadedKeyImport(Iterator<ParcelableKeyRing> keyListIterator,
+ int totKeys, final String keyServer) {
+ Log.d(Constants.TAG, "Multi-threaded key import starting");
+ if (keyListIterator != null) {
+ KeyImportAccumulator accumulator = new KeyImportAccumulator(totKeys, mProgressable);
- OperationLog log = new OperationLog();
- if (masterKeyIds != null) {
- log.add(LogType.MSG_EXPORT, 0, masterKeyIds.length);
- } else {
- log.add(LogType.MSG_EXPORT_ALL, 0);
- }
+ final ProgressScaler ignoreProgressable = new ProgressScaler();
- // do we have a file name?
- if (outputUri == null) {
- log.add(LogType.MSG_EXPORT_ERROR_NO_URI, 1);
- return new ExportResult(ExportResult.RESULT_ERROR, log);
- }
+ final int maxThreads = 200;
+ ExecutorService importExecutor = new ThreadPoolExecutor(0, maxThreads,
+ 30L, TimeUnit.SECONDS,
+ new SynchronousQueue<Runnable>());
- try {
- OutputStream outStream = mProviderHelper.getContentResolver().openOutputStream(outputUri);
- return exportKeyRings(log, masterKeyIds, exportSecret, outStream);
- } catch (FileNotFoundException e) {
- log.add(LogType.MSG_EXPORT_ERROR_URI_OPEN, 1);
- return new ExportResult(ExportResult.RESULT_ERROR, log);
- }
+ ExecutorCompletionService<ImportKeyResult> importCompletionService =
+ new ExecutorCompletionService(importExecutor);
- }
+ while (keyListIterator.hasNext()) { // submit all key rings to be imported
- ExportResult exportKeyRings(OperationLog log, long[] masterKeyIds, boolean exportSecret,
- OutputStream outStream) {
+ final ParcelableKeyRing pkRing = keyListIterator.next();
- /* TODO isn't this checked above, with the isStorageMounted call?
- if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
- log.add(LogType.MSG_EXPORT_ERROR_STORAGE, 1);
- return new ExportResult(ExportResult.RESULT_ERROR, log);
- }
- */
+ Callable<ImportKeyResult> importOperationCallable = new Callable<ImportKeyResult>
+ () {
- if ( ! BufferedOutputStream.class.isInstance(outStream)) {
- outStream = new BufferedOutputStream(outStream);
- }
+ @Override
+ public ImportKeyResult call() {
- int okSecret = 0, okPublic = 0, progress = 0;
+ ArrayList<ParcelableKeyRing> list = new ArrayList<>();
+ list.add(pkRing);
- Cursor cursor = null;
- try {
+ return serialKeyRingImport(list, keyServer, ignoreProgressable);
+ }
+ };
- String selection = null, ids[] = null;
+ importCompletionService.submit(importOperationCallable);
+ }
- if (masterKeyIds != null) {
- // generate placeholders and string selection args
- ids = new String[masterKeyIds.length];
- StringBuilder placeholders = new StringBuilder("?");
- for (int i = 0; i < masterKeyIds.length; i++) {
- ids[i] = Long.toString(masterKeyIds[i]);
- if (i != 0) {
- placeholders.append(",?");
+ while (!accumulator.isImportFinished()) { // accumulate the results of each import
+ try {
+ accumulator.accumulateKeyImport(importCompletionService.take().get());
+ } catch (InterruptedException | ExecutionException e) {
+ Log.e(Constants.TAG, "A key could not be imported during multi-threaded " +
+ "import", e);
+ // do nothing?
+ if (e instanceof ExecutionException) {
+ // Since serialKeyRingImport does not throw any exceptions, this is what
+ // would have happened if
+ // we were importing the key on this thread
+ throw new RuntimeException();
}
}
-
- // put together selection string
- selection = Tables.KEY_RINGS_PUBLIC + "." + KeyRings.MASTER_KEY_ID
- + " IN (" + placeholders + ")";
}
+ return accumulator.getConsolidatedResult();
+ }
+ return null; // TODO: Decide if we should just crash instead of returning null
+ }
- cursor = mProviderHelper.getContentResolver().query(
- KeyRings.buildUnifiedKeyRingsUri(), new String[]{
- KeyRings.MASTER_KEY_ID, KeyRings.PUBKEY_DATA,
- KeyRings.PRIVKEY_DATA, KeyRings.HAS_ANY_SECRET
- }, selection, ids, Tables.KEYS + "." + KeyRings.MASTER_KEY_ID
- );
-
- if (cursor == null || !cursor.moveToFirst()) {
- log.add(LogType.MSG_EXPORT_ERROR_DB, 1);
- return new ExportResult(ExportResult.RESULT_ERROR, log, okPublic, okSecret);
- }
+ /**
+ * Used to accumulate the results of individual key imports
+ */
+ private class KeyImportAccumulator {
+ private OperationResult.OperationLog mImportLog = new OperationResult.OperationLog();
+ Progressable mProgressable;
+ private int mTotalKeys;
+ private int mImportedKeys = 0;
+ ArrayList<Long> mImportedMasterKeyIds = new ArrayList<Long>();
+ private int mBadKeys = 0;
+ private int mNewKeys = 0;
+ private int mUpdatedKeys = 0;
+ private int mSecret = 0;
+ private int mResultType = 0;
+
+ /**
+ * Accumulates keyring imports and updates the progressable whenever a new key is imported.
+ * Also sets the progress to 0 on instantiation.
+ *
+ * @param totalKeys total number of keys to be imported
+ * @param externalProgressable the external progressable to be updated every time a key
+ * is imported
+ */
+ public KeyImportAccumulator(int totalKeys, Progressable externalProgressable) {
+ mTotalKeys = totalKeys;
+ mProgressable = externalProgressable;
+ mProgressable.setProgress(0, totalKeys);
+ }
- int numKeys = cursor.getCount();
+ public int getTotalKeys() {
+ return mTotalKeys;
+ }
- updateProgress(
- mContext.getResources().getQuantityString(R.plurals.progress_exporting_key,
- numKeys), 0, numKeys);
+ public int getImportedKeys() {
+ return mImportedKeys;
+ }
- // For each public masterKey id
- while (!cursor.isAfterLast()) {
+ public synchronized void accumulateKeyImport(ImportKeyResult result) {
+ mImportedKeys++;
- long keyId = cursor.getLong(0);
- ArmoredOutputStream arOutStream = null;
+ mProgressable.setProgress(mImportedKeys, mTotalKeys);
- // Create an output stream
- try {
- arOutStream = new ArmoredOutputStream(outStream);
+ mImportLog.addAll(result.getLog().toList());//accumulates log
+ mBadKeys += result.mBadKeys;
+ mNewKeys += result.mNewKeys;
+ mUpdatedKeys += result.mUpdatedKeys;
+ mSecret += result.mSecret;
- log.add(LogType.MSG_EXPORT_PUBLIC, 1, KeyFormattingUtils.beautifyKeyId(keyId));
+ long[] masterKeyIds = result.getImportedMasterKeyIds();
+ for (long masterKeyId : masterKeyIds) {
+ mImportedMasterKeyIds.add(masterKeyId);
+ }
- byte[] data = cursor.getBlob(1);
- CanonicalizedKeyRing ring =
- UncachedKeyRing.decodeFromData(data).canonicalize(log, 2, true);
- ring.encode(arOutStream);
+ // if any key import has been cancelled, set result type to cancelled
+ // resultType is added to in getConsolidatedKayImport to account for remaining factors
+ mResultType |= result.getResult() & ImportKeyResult.RESULT_CANCELLED;
+ }
- okPublic += 1;
- } catch (PgpGeneralException e) {
- log.add(LogType.MSG_EXPORT_ERROR_KEY, 2);
- updateProgress(progress++, numKeys);
- continue;
- } finally {
- // make sure this is closed
- if (arOutStream != null) {
- arOutStream.close();
- }
- arOutStream = null;
+ /**
+ * returns accumulated result of all imports so far
+ */
+ public ImportKeyResult getConsolidatedResult() {
+
+ // adding required information to mResultType
+ // special case,no keys requested for import
+ if (mBadKeys == 0 && mNewKeys == 0 && mUpdatedKeys == 0) {
+ mResultType = ImportKeyResult.RESULT_FAIL_NOTHING;
+ } else {
+ if (mNewKeys > 0) {
+ mResultType |= ImportKeyResult.RESULT_OK_NEWKEYS;
}
-
- if (exportSecret && cursor.getInt(3) > 0) {
- try {
- arOutStream = new ArmoredOutputStream(outStream);
-
- // export secret key part
- log.add(LogType.MSG_EXPORT_SECRET, 2, KeyFormattingUtils.beautifyKeyId(keyId));
- byte[] data = cursor.getBlob(2);
- CanonicalizedKeyRing ring =
- UncachedKeyRing.decodeFromData(data).canonicalize(log, 2, true);
- ring.encode(arOutStream);
-
- okSecret += 1;
- } catch (PgpGeneralException e) {
- log.add(LogType.MSG_EXPORT_ERROR_KEY, 2);
- updateProgress(progress++, numKeys);
- continue;
- } finally {
- // make sure this is closed
- if (arOutStream != null) {
- arOutStream.close();
- }
+ if (mUpdatedKeys > 0) {
+ mResultType |= ImportKeyResult.RESULT_OK_UPDATED;
+ }
+ if (mBadKeys > 0) {
+ mResultType |= ImportKeyResult.RESULT_WITH_ERRORS;
+ if (mNewKeys == 0 && mUpdatedKeys == 0) {
+ mResultType |= ImportKeyResult.RESULT_ERROR;
}
}
-
- updateProgress(progress++, numKeys);
-
- cursor.moveToNext();
+ if (mImportLog.containsWarnings()) {
+ mResultType |= ImportKeyResult.RESULT_WARNINGS;
+ }
}
- updateProgress(R.string.progress_done, numKeys, numKeys);
-
- } catch (IOException e) {
- log.add(LogType.MSG_EXPORT_ERROR_IO, 1);
- return new ExportResult(ExportResult.RESULT_ERROR, log, okPublic, okSecret);
- } finally {
- // Make sure the stream is closed
- if (outStream != null) try {
- outStream.close();
- } catch (Exception e) {
- Log.e(Constants.TAG, "error closing stream", e);
- }
- if (cursor != null) {
- cursor.close();
+ long masterKeyIds[] = new long[mImportedMasterKeyIds.size()];
+ for (int i = 0; i < masterKeyIds.length; i++) {
+ masterKeyIds[i] = mImportedMasterKeyIds.get(i);
}
- }
-
- log.add(LogType.MSG_EXPORT_SUCCESS, 1);
- return new ExportResult(ExportResult.RESULT_OK, log, okPublic, okSecret);
+ return new ImportKeyResult(mResultType, mImportLog, mNewKeys, mUpdatedKeys, mBadKeys,
+ mSecret, masterKeyIds);
+ }
+ public boolean isImportFinished() {
+ return mTotalKeys == mImportedKeys;
+ }
}
-}
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeybaseVerificationOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeybaseVerificationOperation.java
new file mode 100644
index 000000000..57b99951d
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeybaseVerificationOperation.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ * Copyright (C) 2015 Adithya Abraham Philip <adithyaphilip@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.operations;
+
+import android.content.Context;
+
+import com.textuality.keybase.lib.Proof;
+import com.textuality.keybase.lib.prover.Prover;
+import de.measite.minidns.Client;
+import de.measite.minidns.DNSMessage;
+import de.measite.minidns.Question;
+import de.measite.minidns.Record;
+import de.measite.minidns.record.Data;
+import de.measite.minidns.record.TXT;
+import org.json.JSONObject;
+import org.spongycastle.openpgp.PGPUtil;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
+import org.sufficientlysecure.keychain.operations.results.KeybaseVerificationResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
+import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify;
+import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel;
+import org.sufficientlysecure.keychain.pgp.Progressable;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.service.KeybaseVerificationParcel;
+import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+public class KeybaseVerificationOperation extends BaseOperation<KeybaseVerificationParcel> {
+
+ public KeybaseVerificationOperation(Context context, ProviderHelper providerHelper,
+ Progressable progressable) {
+ super(context, providerHelper, progressable);
+ }
+
+ @Override
+ public KeybaseVerificationResult execute(KeybaseVerificationParcel keybaseInput,
+ CryptoInputParcel cryptoInput) {
+
+ String requiredFingerprint = keybaseInput.mRequiredFingerprint;
+
+ OperationResult.OperationLog log = new OperationResult.OperationLog();
+ log.add(OperationResult.LogType.MSG_KEYBASE_VERIFICATION, 0, requiredFingerprint);
+
+ try {
+ String keybaseProof = keybaseInput.mKeybaseProof;
+ Proof proof = new Proof(new JSONObject(keybaseProof));
+ mProgressable.setProgress(R.string.keybase_message_fetching_data, 0, 100);
+
+ Prover prover = Prover.findProverFor(proof);
+
+ if (prover == null) {
+ log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_NO_PROVER, 1,
+ proof.getPrettyName());
+ return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log);
+ }
+
+ if (!prover.fetchProofData()) {
+ log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_FETCH_PROOF, 1);
+ return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log);
+ }
+
+ if (!prover.checkFingerprint(requiredFingerprint)) {
+ log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_FINGERPRINT_MISMATCH, 1);
+ return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log);
+ }
+
+ String domain = prover.dnsTxtCheckRequired();
+ if (domain != null) {
+ DNSMessage dnsQuery = new Client().query(new Question(domain, Record.TYPE.TXT));
+ if (dnsQuery == null) {
+ log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_DNS_FAIL, 1);
+ log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_SPECIFIC, 2,
+ getFlattenedProverLog(prover));
+ return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log);
+ }
+ Record[] records = dnsQuery.getAnswers();
+ List<List<byte[]>> extents = new ArrayList<List<byte[]>>();
+ for (Record r : records) {
+ Data d = r.getPayload();
+ if (d instanceof TXT) {
+ extents.add(((TXT) d).getExtents());
+ }
+ }
+ if (!prover.checkDnsTxt(extents)) {
+ log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_SPECIFIC, 1,
+ getFlattenedProverLog(prover));
+ return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log);
+ }
+ }
+
+ byte[] messageBytes = prover.getPgpMessage().getBytes();
+ if (prover.rawMessageCheckRequired()) {
+ InputStream messageByteStream = PGPUtil.getDecoderStream(new
+ ByteArrayInputStream
+ (messageBytes));
+ if (!prover.checkRawMessageBytes(messageByteStream)) {
+ log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_SPECIFIC, 1,
+ getFlattenedProverLog(prover));
+ return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log);
+ }
+ }
+
+ PgpDecryptVerify op = new PgpDecryptVerify(mContext, mProviderHelper, mProgressable);
+
+ PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(messageBytes)
+ .setSignedLiteralData(true)
+ .setRequiredSignerFingerprint(requiredFingerprint);
+
+ DecryptVerifyResult decryptVerifyResult = op.execute(input, new CryptoInputParcel());
+
+ if (!decryptVerifyResult.success()) {
+ log.add(decryptVerifyResult, 1);
+ return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log);
+ }
+
+ if (!prover.validate(new String(decryptVerifyResult.getOutputBytes()))) {
+ log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_PAYLOAD_MISMATCH, 1);
+ return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log);
+ }
+
+ return new KeybaseVerificationResult(OperationResult.RESULT_OK, log, prover);
+ } catch (Exception e) {
+ // just adds the passed parameter, in this case e.getMessage()
+ log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_SPECIFIC, 1, e.getMessage());
+ return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log);
+ }
+ }
+
+ private String getFlattenedProverLog(Prover prover) {
+ String log = "";
+ for (String line : prover.getLog()) {
+ log += line + "\n";
+ }
+ return log;
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java
index 558756378..6291f14a3 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java
@@ -29,13 +29,13 @@ import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKey;
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
-import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.provider.ProviderHelper.NotFoundException;
+import org.sufficientlysecure.keychain.service.PromoteKeyringParcel;
+import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.ProgressScaler;
-import java.util.Arrays;
import java.util.concurrent.atomic.AtomicBoolean;
/** An operation which promotes a public key ring to a secret one.
@@ -45,13 +45,24 @@ import java.util.concurrent.atomic.AtomicBoolean;
* without secret key material, using a GNU_DUMMY s2k type.
*
*/
-public class PromoteKeyOperation extends BaseOperation {
+public class PromoteKeyOperation extends BaseOperation<PromoteKeyringParcel> {
public PromoteKeyOperation(Context context, ProviderHelper providerHelper,
Progressable progressable, AtomicBoolean cancelled) {
super(context, providerHelper, progressable, cancelled);
}
+ @Override
+ public PromoteKeyResult execute(PromoteKeyringParcel promoteKeyringParcel,
+ CryptoInputParcel cryptoInputParcel) {
+ // Input
+ long masterKeyId = promoteKeyringParcel.mKeyRingId;
+ byte[] cardAid = promoteKeyringParcel.mCardAid;
+ long[] subKeyIds = promoteKeyringParcel.mSubKeyIds;
+
+ return execute(masterKeyId, cardAid, subKeyIds);
+ }
+
public PromoteKeyResult execute(long masterKeyId, byte[] cardAid, long[] subKeyIds) {
OperationLog log = new OperationLog();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java
index 7c58d62f8..8fe5b86c5 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java
@@ -25,7 +25,6 @@ import org.sufficientlysecure.keychain.operations.results.OperationResult.LogTyp
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
import org.sufficientlysecure.keychain.operations.results.PgpSignEncryptResult;
import org.sufficientlysecure.keychain.operations.results.SignEncryptResult;
-import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
import org.sufficientlysecure.keychain.pgp.PgpSignEncryptOperation;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/KeybaseVerificationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/KeybaseVerificationResult.java
new file mode 100644
index 000000000..420cbbf01
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/KeybaseVerificationResult.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ * Copyright (C) 2015 Adithya Abraham Philip <adithyaphilip@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.operations.results;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import com.textuality.keybase.lib.KeybaseException;
+import com.textuality.keybase.lib.prover.Prover;
+
+public class KeybaseVerificationResult extends OperationResult implements Parcelable {
+ public final String mProofUrl;
+ public final String mPresenceUrl;
+ public final String mPresenceLabel;
+
+ public KeybaseVerificationResult(int result, OperationLog log) {
+ super(result, log);
+ mProofUrl = null;
+ mPresenceLabel = null;
+ mPresenceUrl = null;
+ }
+
+ public KeybaseVerificationResult(int result, OperationLog log, Prover prover)
+ throws KeybaseException {
+ super(result, log);
+ mProofUrl = prover.getProofUrl();
+ mPresenceUrl = prover.getPresenceUrl();
+ mPresenceLabel = prover.getPresenceLabel();
+ }
+
+ protected KeybaseVerificationResult(Parcel in) {
+ super(in);
+ mProofUrl = in.readString();
+ mPresenceUrl = in.readString();
+ mPresenceLabel = in.readString();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+ dest.writeString(mProofUrl);
+ dest.writeString(mPresenceUrl);
+ dest.writeString(mPresenceLabel);
+ }
+
+ public static final Parcelable.Creator<KeybaseVerificationResult> CREATOR = new Parcelable.Creator<KeybaseVerificationResult>() {
+ @Override
+ public KeybaseVerificationResult createFromParcel(Parcel in) {
+ return new KeybaseVerificationResult(in);
+ }
+
+ @Override
+ public KeybaseVerificationResult[] newArray(int size) {
+ return new KeybaseVerificationResult[size];
+ }
+ };
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java
index c9e427462..f0561bef2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java
@@ -750,7 +750,19 @@ public abstract class OperationResult implements Parcelable {
MSG_DEL_OK (LogLevel.OK, R.plurals.msg_del_ok),
MSG_DEL_FAIL (LogLevel.WARN, R.plurals.msg_del_fail),
- //export log
+ // keybase verification
+ MSG_KEYBASE_VERIFICATION(LogLevel.START, R.string.msg_keybase_verification),
+
+ MSG_KEYBASE_ERROR_NO_PROVER(LogLevel.ERROR, R.string.msg_keybase_error_no_prover),
+ MSG_KEYBASE_ERROR_FETCH_PROOF(LogLevel.ERROR, R.string.msg_keybase_error_fetching_evidence),
+ MSG_KEYBASE_ERROR_FINGERPRINT_MISMATCH(LogLevel.ERROR,
+ R.string.msg_keybase_error_key_mismatch),
+ MSG_KEYBASE_ERROR_DNS_FAIL(LogLevel.ERROR, R.string.msg_keybase_error_dns_fail),
+ MSG_KEYBASE_ERROR_SPECIFIC(LogLevel.ERROR, R.string.msg_keybase_error_specific),
+ MSG_KEYBASE_ERROR_PAYLOAD_MISMATCH(LogLevel.ERROR,
+ R.string.msg_keybase_error_msg_payload_mismatch),
+
+ // export log
MSG_EXPORT_LOG(LogLevel.START,R.string.msg_export_log_start),
MSG_EXPORT_LOG_EXPORT_ERROR_NO_FILE(LogLevel.ERROR,R.string.msg_export_log_error_no_file),
MSG_EXPORT_LOG_EXPORT_ERROR_FOPEN(LogLevel.ERROR,R.string.msg_export_log_error_fopen),
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java
index 7a4c85178..a6d260d22 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java
@@ -938,7 +938,14 @@ public class PgpDecryptVerify extends BaseOperation<PgpDecryptVerifyInputParcel>
log.add(LogType.MSG_DC_OK, indent);
+ OpenPgpMetadata metadata = new OpenPgpMetadata(
+ "",
+ "text/plain",
+ -1,
+ clearText.length);
+
DecryptVerifyResult result = new DecryptVerifyResult(DecryptVerifyResult.RESULT_OK, log);
+ result.setDecryptMetadata(metadata);
result.setSignatureResult(signatureResultBuilder.build());
return result;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
index bf7014853..590c58f97 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
@@ -32,7 +32,7 @@ import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
-import org.sufficientlysecure.keychain.operations.ImportExportOperation;
+import org.sufficientlysecure.keychain.operations.ImportOperation;
import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
@@ -1248,9 +1248,9 @@ public class ProviderHelper {
// 3. Re-Import secret keyrings from cache
if (numSecrets > 0) {
- ImportKeyResult result = new ImportExportOperation(mContext, this,
+ ImportKeyResult result = new ImportOperation(mContext, this,
new ProgressFixedScaler(progress, 10, 25, 100, R.string.progress_con_reimport))
- .importKeyRings(itSecrets, numSecrets, null);
+ .serialKeyRingImport(itSecrets, numSecrets, null);
log.add(result, indent);
} else {
log.add(LogType.MSG_CON_REIMPORT_SECRET_SKIP, indent);
@@ -1276,9 +1276,9 @@ public class ProviderHelper {
// 4. Re-Import public keyrings from cache
if (numPublics > 0) {
- ImportKeyResult result = new ImportExportOperation(mContext, this,
+ ImportKeyResult result = new ImportOperation(mContext, this,
new ProgressFixedScaler(progress, 25, 99, 100, R.string.progress_con_reimport))
- .importKeyRings(itPublics, numPublics, null);
+ .serialKeyRingImport(itPublics, numPublics, null);
log.add(result, indent);
} else {
log.add(LogType.MSG_CON_REIMPORT_PUBLIC_SKIP, indent);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
index 0d2d3256d..ac66bd097 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
@@ -167,7 +167,7 @@ public class OpenPgpService extends RemoteService {
Intent data, RequiredInputParcel requiredInput) {
switch (requiredInput.mType) {
- case NFC_KEYTOCARD:
+ case NFC_MOVE_KEY_TO_CARD:
case NFC_DECRYPT:
case NFC_SIGN: {
// build PendingIntent for YubiKey NFC operations
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ConsolidateInputParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ConsolidateInputParcel.java
new file mode 100644
index 000000000..15d109814
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ConsolidateInputParcel.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ * Copyright (C) 2015 Adithya Abraham Philip <adithyaphilip@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.service;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class ConsolidateInputParcel implements Parcelable {
+
+ public boolean mConsolidateRecovery;
+
+ public ConsolidateInputParcel(boolean consolidateRecovery) {
+ mConsolidateRecovery = consolidateRecovery;
+ }
+
+ protected ConsolidateInputParcel(Parcel in) {
+ mConsolidateRecovery = in.readByte() != 0x00;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeByte((byte) (mConsolidateRecovery ? 0x01 : 0x00));
+ }
+
+ public static final Parcelable.Creator<ConsolidateInputParcel> CREATOR = new Parcelable.Creator<ConsolidateInputParcel>() {
+ @Override
+ public ConsolidateInputParcel createFromParcel(Parcel in) {
+ return new ConsolidateInputParcel(in);
+ }
+
+ @Override
+ public ConsolidateInputParcel[] newArray(int size) {
+ return new ConsolidateInputParcel[size];
+ }
+ };
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DeleteKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DeleteKeyringParcel.java
new file mode 100644
index 000000000..b412a6e2b
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DeleteKeyringParcel.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ * Copyright (C) 2015 Adithya Abraham Philip <adithyaphilip@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.service;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class DeleteKeyringParcel implements Parcelable {
+
+ public long[] mMasterKeyIds;
+ public boolean mIsSecret;
+
+ public DeleteKeyringParcel(long[] masterKeyIds, boolean isSecret) {
+ mMasterKeyIds = masterKeyIds;
+ mIsSecret = isSecret;
+ }
+
+ protected DeleteKeyringParcel(Parcel in) {
+ mIsSecret = in.readByte() != 0x00;
+ mMasterKeyIds = in.createLongArray();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeByte((byte) (mIsSecret ? 0x01 : 0x00));
+ dest.writeLongArray(mMasterKeyIds);
+ }
+
+ public static final Parcelable.Creator<DeleteKeyringParcel> CREATOR = new Parcelable.Creator<DeleteKeyringParcel>() {
+ @Override
+ public DeleteKeyringParcel createFromParcel(Parcel in) {
+ return new DeleteKeyringParcel(in);
+ }
+
+ @Override
+ public DeleteKeyringParcel[] newArray(int size) {
+ return new DeleteKeyringParcel[size];
+ }
+ };
+}
+
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ExportKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ExportKeyringParcel.java
new file mode 100644
index 000000000..ef5b48df3
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ExportKeyringParcel.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ * Copyright (C) 2015 Adithya Abraham Philip <adithyaphilip@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.service;
+
+import android.net.Uri;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class ExportKeyringParcel implements Parcelable {
+ public String mKeyserver;
+ public Uri mCanonicalizedPublicKeyringUri;
+
+ public boolean mExportSecret;
+ public long mMasterKeyIds[];
+ public String mOutputFile;
+ public Uri mOutputUri;
+ public ExportType mExportType;
+
+ public enum ExportType {
+ UPLOAD_KEYSERVER,
+ EXPORT_FILE,
+ EXPORT_URI
+ }
+
+ public ExportKeyringParcel(String keyserver, Uri keyringUri) {
+ mExportType = ExportType.UPLOAD_KEYSERVER;
+ mKeyserver = keyserver;
+ mCanonicalizedPublicKeyringUri = keyringUri;
+ }
+
+ public ExportKeyringParcel(long[] masterKeyIds, boolean exportSecret, String outputFile) {
+ mExportType = ExportType.EXPORT_FILE;
+ mMasterKeyIds = masterKeyIds;
+ mExportSecret = exportSecret;
+ mOutputFile = outputFile;
+ }
+
+ public ExportKeyringParcel(long[] masterKeyIds, boolean exportSecret, Uri outputUri) {
+ mExportType = ExportType.EXPORT_URI;
+ mMasterKeyIds = masterKeyIds;
+ mExportSecret = exportSecret;
+ mOutputUri = outputUri;
+ }
+
+ protected ExportKeyringParcel(Parcel in) {
+ mKeyserver = in.readString();
+ mCanonicalizedPublicKeyringUri = (Uri) in.readValue(Uri.class.getClassLoader());
+ mExportSecret = in.readByte() != 0x00;
+ mOutputFile = in.readString();
+ mOutputUri = (Uri) in.readValue(Uri.class.getClassLoader());
+ mExportType = (ExportType) in.readValue(ExportType.class.getClassLoader());
+ mMasterKeyIds = in.createLongArray();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mKeyserver);
+ dest.writeValue(mCanonicalizedPublicKeyringUri);
+ dest.writeByte((byte) (mExportSecret ? 0x01 : 0x00));
+ dest.writeString(mOutputFile);
+ dest.writeValue(mOutputUri);
+ dest.writeValue(mExportType);
+ dest.writeLongArray(mMasterKeyIds);
+ }
+
+ public static final Parcelable.Creator<ExportKeyringParcel> CREATOR = new Parcelable.Creator<ExportKeyringParcel>() {
+ @Override
+ public ExportKeyringParcel createFromParcel(Parcel in) {
+ return new ExportKeyringParcel(in);
+ }
+
+ @Override
+ public ExportKeyringParcel[] newArray(int size) {
+ return new ExportKeyringParcel[size];
+ }
+ };
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ImportKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ImportKeyringParcel.java
new file mode 100644
index 000000000..a41dd71cb
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ImportKeyringParcel.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 Adithya Abraham Philip <adithyaphilip@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.service;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
+
+import java.util.ArrayList;
+
+public class ImportKeyringParcel implements Parcelable {
+ // if null, keys are expected to be read from a cache file in ImportExportOperations
+ public ArrayList<ParcelableKeyRing> mKeyList;
+ public String mKeyserver; // must be set if keys are to be imported from a keyserver
+
+ public ImportKeyringParcel (ArrayList<ParcelableKeyRing> keyList, String keyserver) {
+ mKeyList = keyList;
+ mKeyserver = keyserver;
+ }
+
+ protected ImportKeyringParcel(Parcel in) {
+ if (in.readByte() == 0x01) {
+ mKeyList = new ArrayList<>();
+ in.readList(mKeyList, ParcelableKeyRing.class.getClassLoader());
+ } else {
+ mKeyList = null;
+ }
+ mKeyserver = in.readString();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ if (mKeyList == null) {
+ dest.writeByte((byte) (0x00));
+ } else {
+ dest.writeByte((byte) (0x01));
+ dest.writeList(mKeyList);
+ }
+ dest.writeString(mKeyserver);
+ }
+
+ public static final Parcelable.Creator<ImportKeyringParcel> CREATOR = new Parcelable.Creator<ImportKeyringParcel>() {
+ @Override
+ public ImportKeyringParcel createFromParcel(Parcel in) {
+ return new ImportKeyringParcel(in);
+ }
+
+ @Override
+ public ImportKeyringParcel[] newArray(int size) {
+ return new ImportKeyringParcel[size];
+ }
+ };
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeybaseVerificationParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeybaseVerificationParcel.java
new file mode 100644
index 000000000..1872191af
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeybaseVerificationParcel.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ * Copyright (C) 2015 Adithya Abraham Philip <adithyaphilip@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.service;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class KeybaseVerificationParcel implements Parcelable {
+
+ public String mKeybaseProof;
+ public String mRequiredFingerprint;
+
+ public KeybaseVerificationParcel(String keybaseProof, String requiredFingerprint) {
+ mKeybaseProof = keybaseProof;
+ mRequiredFingerprint = requiredFingerprint;
+ }
+
+ protected KeybaseVerificationParcel(Parcel in) {
+ mKeybaseProof = in.readString();
+ mRequiredFingerprint = in.readString();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mKeybaseProof);
+ dest.writeString(mRequiredFingerprint);
+ }
+
+ public static final Parcelable.Creator<KeybaseVerificationParcel> CREATOR = new Parcelable.Creator<KeybaseVerificationParcel>() {
+ @Override
+ public KeybaseVerificationParcel createFromParcel(Parcel in) {
+ return new KeybaseVerificationParcel(in);
+ }
+
+ @Override
+ public KeybaseVerificationParcel[] newArray(int size) {
+ return new KeybaseVerificationParcel[size];
+ }
+ };
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainNewService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainNewService.java
deleted file mode 100644
index 9e33a1421..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainNewService.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de>
- * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.sufficientlysecure.keychain.service;
-
-
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.Parcelable;
-import android.os.RemoteException;
-
-import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.operations.BaseOperation;
-import org.sufficientlysecure.keychain.operations.CertifyOperation;
-import org.sufficientlysecure.keychain.operations.EditKeyOperation;
-import org.sufficientlysecure.keychain.operations.SignEncryptOperation;
-import org.sufficientlysecure.keychain.operations.results.OperationResult;
-import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify;
-import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel;
-import org.sufficientlysecure.keychain.pgp.Progressable;
-import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;
-import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus;
-import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
-import org.sufficientlysecure.keychain.util.Log;
-
-/**
- * This Service contains all important long lasting operations for OpenKeychain. It receives Intents with
- * data from the activities or other apps, executes them, and stops itself after doing them.
- */
-public class KeychainNewService extends Service implements Progressable {
-
- // messenger for communication (hack)
- public static final String EXTRA_MESSENGER = "messenger";
-
- // extras for operation
- public static final String EXTRA_OPERATION_INPUT = "op_input";
- public static final String EXTRA_CRYPTO_INPUT = "crypto_input";
-
- // this attribute can possibly merged with the one above? not sure...
- private AtomicBoolean mActionCanceled = new AtomicBoolean(false);
-
- ThreadLocal<Messenger> mMessenger = new ThreadLocal<>();
-
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
-
- /**
- * This is run on the main thread, we need to spawn a runnable which runs on another thread for the actual operation
- */
- @Override
- public int onStartCommand(final Intent intent, int flags, int startId) {
-
- Runnable actionRunnable = new Runnable() {
- @Override
- public void run() {
- // We have not been cancelled! (yet)
- mActionCanceled.set(false);
-
- Bundle extras = intent.getExtras();
-
- // Set messenger for communication (for this particular thread)
- mMessenger.set(extras.<Messenger>getParcelable(EXTRA_MESSENGER));
-
- // Input
- Parcelable inputParcel = extras.getParcelable(EXTRA_OPERATION_INPUT);
- CryptoInputParcel cryptoInput = extras.getParcelable(EXTRA_CRYPTO_INPUT);
-
- // Operation
- BaseOperation op;
-
- // just for brevity
- KeychainNewService outerThis = KeychainNewService.this;
- if (inputParcel instanceof SignEncryptParcel) {
- op = new SignEncryptOperation(outerThis, new ProviderHelper(outerThis), outerThis, mActionCanceled);
- } else if (inputParcel instanceof PgpDecryptVerifyInputParcel) {
- op = new PgpDecryptVerify(outerThis, new ProviderHelper(outerThis), outerThis);
- } else if (inputParcel instanceof SaveKeyringParcel) {
- op = new EditKeyOperation(outerThis, new ProviderHelper(outerThis), outerThis, mActionCanceled);
- } else if (inputParcel instanceof CertifyAction) {
- op = new CertifyOperation(outerThis, new ProviderHelper(outerThis), outerThis, mActionCanceled);
- } else {
- return;
- }
-
- @SuppressWarnings("unchecked") // this is unchecked, we make sure it's the correct op above!
- OperationResult result = op.execute(inputParcel, cryptoInput);
-
- sendMessageToHandler(MessageStatus.OKAY, result);
-
- }
- };
-
- Thread actionThread = new Thread(actionRunnable);
- actionThread.start();
-
- return START_NOT_STICKY;
- }
-
- private void sendMessageToHandler(MessageStatus status, Integer arg2, Bundle data) {
-
- Message msg = Message.obtain();
- assert msg != null;
- msg.arg1 = status.ordinal();
- if (arg2 != null) {
- msg.arg2 = arg2;
- }
- if (data != null) {
- msg.setData(data);
- }
-
- try {
- mMessenger.get().send(msg);
- } catch (RemoteException e) {
- Log.w(Constants.TAG, "Exception sending message, Is handler present?", e);
- } catch (NullPointerException e) {
- Log.w(Constants.TAG, "Messenger is null!", e);
- }
- }
-
- private void sendMessageToHandler(MessageStatus status, OperationResult data) {
- Bundle bundle = new Bundle();
- bundle.putParcelable(OperationResult.EXTRA_RESULT, data);
- sendMessageToHandler(status, null, bundle);
- }
-
- private void sendMessageToHandler(MessageStatus status) {
- sendMessageToHandler(status, null, null);
- }
-
- /**
- * Set progress of ProgressDialog by sending message to handler on UI thread
- */
- @Override
- public void setProgress(String message, int progress, int max) {
- Log.d(Constants.TAG, "Send message by setProgress with progress=" + progress + ", max="
- + max);
-
- Bundle data = new Bundle();
- if (message != null) {
- data.putString(ServiceProgressHandler.DATA_MESSAGE, message);
- }
- data.putInt(ServiceProgressHandler.DATA_PROGRESS, progress);
- data.putInt(ServiceProgressHandler.DATA_PROGRESS_MAX, max);
-
- sendMessageToHandler(MessageStatus.UPDATE_PROGRESS, null, data);
- }
-
- @Override
- public void setProgress(int resourceId, int progress, int max) {
- setProgress(getString(resourceId), progress, max);
- }
-
- @Override
- public void setProgress(int progress, int max) {
- setProgress(null, progress, max);
- }
-
- @Override
- public void setPreventCancel() {
- sendMessageToHandler(MessageStatus.PREVENT_CANCEL);
- }
-
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java
index ba877c2a2..1cd76b462 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java
@@ -20,70 +20,35 @@ package org.sufficientlysecure.keychain.service;
import android.app.Service;
import android.content.Intent;
-import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
+import android.os.Parcelable;
import android.os.RemoteException;
-import com.textuality.keybase.lib.Proof;
-import com.textuality.keybase.lib.prover.Prover;
-
-import org.json.JSONObject;
-import org.spongycastle.openpgp.PGPUtil;
import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
-import org.sufficientlysecure.keychain.keyimport.Keyserver;
-import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
+import org.sufficientlysecure.keychain.operations.BaseOperation;
import org.sufficientlysecure.keychain.operations.CertifyOperation;
+import org.sufficientlysecure.keychain.operations.ConsolidateOperation;
import org.sufficientlysecure.keychain.operations.DeleteOperation;
import org.sufficientlysecure.keychain.operations.EditKeyOperation;
-import org.sufficientlysecure.keychain.operations.ImportExportOperation;
+import org.sufficientlysecure.keychain.operations.ExportOperation;
+import org.sufficientlysecure.keychain.operations.ImportOperation;
+import org.sufficientlysecure.keychain.operations.KeybaseVerificationOperation;
import org.sufficientlysecure.keychain.operations.PromoteKeyOperation;
import org.sufficientlysecure.keychain.operations.SignEncryptOperation;
-import org.sufficientlysecure.keychain.operations.results.CertifyResult;
-import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
-import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
-import org.sufficientlysecure.keychain.operations.results.DeleteResult;
-import org.sufficientlysecure.keychain.operations.results.ExportResult;
-import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
-import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
-import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult;
-import org.sufficientlysecure.keychain.operations.results.SignEncryptResult;
-import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;
-import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
-import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralMsgIdException;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus;
+import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.util.Log;
-import org.sufficientlysecure.keychain.util.ParcelableFileCache;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import de.measite.minidns.Client;
-import de.measite.minidns.DNSMessage;
-import de.measite.minidns.Question;
-import de.measite.minidns.Record;
-import de.measite.minidns.record.Data;
-import de.measite.minidns.record.TXT;
+import java.util.concurrent.atomic.AtomicBoolean;
/**
* This Service contains all important long lasting operations for OpenKeychain. It receives Intents with
@@ -91,75 +56,19 @@ import de.measite.minidns.record.TXT;
*/
public class KeychainService extends Service implements Progressable {
- /* extras that can be given by intent */
+ // messenger for communication (hack)
public static final String EXTRA_MESSENGER = "messenger";
- public static final String EXTRA_DATA = "data";
-
- /* possible actions */
-
- public static final String ACTION_VERIFY_KEYBASE_PROOF = Constants.INTENT_PREFIX + "VERIFY_KEYBASE_PROOF";
-
- public static final String ACTION_EDIT_KEYRING = Constants.INTENT_PREFIX + "EDIT_KEYRING";
-
- public static final String ACTION_PROMOTE_KEYRING = Constants.INTENT_PREFIX + "PROMOTE_KEYRING";
-
- public static final String ACTION_IMPORT_KEYRING = Constants.INTENT_PREFIX + "IMPORT_KEYRING";
- public static final String ACTION_EXPORT_KEYRING = Constants.INTENT_PREFIX + "EXPORT_KEYRING";
-
- public static final String ACTION_UPLOAD_KEYRING = Constants.INTENT_PREFIX + "UPLOAD_KEYRING";
-
- public static final String ACTION_DELETE = Constants.INTENT_PREFIX + "DELETE";
- public static final String ACTION_CONSOLIDATE = Constants.INTENT_PREFIX + "CONSOLIDATE";
-
- public static final String ACTION_CANCEL = Constants.INTENT_PREFIX + "CANCEL";
-
- /* keys for data bundle */
-
- // keybase proof
- public static final String KEYBASE_REQUIRED_FINGERPRINT = "keybase_required_fingerprint";
- public static final String KEYBASE_PROOF = "keybase_proof";
-
- // save keyring
- public static final String EDIT_KEYRING_PARCEL = "save_parcel";
- public static final String EDIT_KEYRING_PASSPHRASE = "passphrase";
+ // extras for operation
+ public static final String EXTRA_OPERATION_INPUT = "op_input";
public static final String EXTRA_CRYPTO_INPUT = "crypto_input";
- // delete keyring(s)
- public static final String DELETE_KEY_LIST = "delete_list";
- public static final String DELETE_IS_SECRET = "delete_is_secret";
-
- // import key
- public static final String IMPORT_KEY_LIST = "import_key_list";
- public static final String IMPORT_KEY_SERVER = "import_key_server";
-
- // export key
- public static final String EXPORT_FILENAME = "export_filename";
- public static final String EXPORT_URI = "export_uri";
- public static final String EXPORT_SECRET = "export_secret";
- public static final String EXPORT_ALL = "export_all";
- public static final String EXPORT_KEY_RING_MASTER_KEY_ID = "export_key_ring_id";
-
- // upload key
- public static final String UPLOAD_KEY_SERVER = "upload_key_server";
-
- // promote key
- public static final String PROMOTE_MASTER_KEY_ID = "promote_master_key_id";
- public static final String PROMOTE_CARD_AID = "promote_card_aid";
- public static final String PROMOTE_SUBKEY_IDS = "promote_fingerprints";
-
- // consolidate
- public static final String CONSOLIDATE_RECOVERY = "consolidate_recovery";
-
- Messenger mMessenger;
+ public static final String ACTION_CANCEL = "action_cancel";
// this attribute can possibly merged with the one above? not sure...
private AtomicBoolean mActionCanceled = new AtomicBoolean(false);
-
- private KeyImportAccumulator mKeyImportAccumulator;
-
- private KeychainService mKeychainService;
+ ThreadLocal<Messenger> mMessenger = new ThreadLocal<>();
@Override
public IBinder onBind(Intent intent) {
@@ -171,9 +80,8 @@ public class KeychainService extends Service implements Progressable {
*/
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
- mKeychainService = this;
- if (ACTION_CANCEL.equals(intent.getAction())) {
+ if (intent.getAction() != null && intent.getAction().equals(ACTION_CANCEL)) {
mActionCanceled.set(true);
return START_NOT_STICKY;
}
@@ -185,315 +93,62 @@ public class KeychainService extends Service implements Progressable {
mActionCanceled.set(false);
Bundle extras = intent.getExtras();
- if (extras == null) {
- Log.e(Constants.TAG, "Extras bundle is null!");
- return;
- }
- if (!(extras.containsKey(EXTRA_MESSENGER) || extras.containsKey(EXTRA_DATA) || (intent
- .getAction() == null))) {
- Log.e(Constants.TAG,
- "Extra bundle must contain a messenger, a data bundle, and an action!");
+ // Set messenger for communication (for this particular thread)
+ mMessenger.set(extras.<Messenger>getParcelable(EXTRA_MESSENGER));
+
+ // Input
+ Parcelable inputParcel = extras.getParcelable(EXTRA_OPERATION_INPUT);
+ CryptoInputParcel cryptoInput = extras.getParcelable(EXTRA_CRYPTO_INPUT);
+
+ // Operation
+ BaseOperation op;
+
+ // just for brevity
+ KeychainService outerThis = KeychainService.this;
+ if (inputParcel instanceof SignEncryptParcel) {
+ op = new SignEncryptOperation(outerThis, new ProviderHelper(outerThis),
+ outerThis, mActionCanceled);
+ } else if (inputParcel instanceof PgpDecryptVerifyInputParcel) {
+ op = new PgpDecryptVerify(outerThis, new ProviderHelper(outerThis), outerThis);
+ } else if (inputParcel instanceof SaveKeyringParcel) {
+ op = new EditKeyOperation(outerThis, new ProviderHelper(outerThis), outerThis,
+ mActionCanceled);
+ } else if (inputParcel instanceof CertifyActionsParcel) {
+ op = new CertifyOperation(outerThis, new ProviderHelper(outerThis), outerThis,
+ mActionCanceled);
+ } else if (inputParcel instanceof DeleteKeyringParcel) {
+ op = new DeleteOperation(outerThis, new ProviderHelper(outerThis), outerThis);
+ } else if (inputParcel instanceof PromoteKeyringParcel) {
+ op = new PromoteKeyOperation(outerThis, new ProviderHelper(outerThis),
+ outerThis, mActionCanceled);
+ } else if (inputParcel instanceof ImportKeyringParcel) {
+ op = new ImportOperation(outerThis, new ProviderHelper(outerThis), outerThis,
+ mActionCanceled);
+ } else if (inputParcel instanceof ExportKeyringParcel) {
+ op = new ExportOperation(outerThis, new ProviderHelper(outerThis), outerThis,
+ mActionCanceled);
+ } else if (inputParcel instanceof ConsolidateInputParcel) {
+ op = new ConsolidateOperation(outerThis, new ProviderHelper(outerThis),
+ outerThis);
+ } else if (inputParcel instanceof KeybaseVerificationParcel) {
+ op = new KeybaseVerificationOperation(outerThis, new ProviderHelper(outerThis),
+ outerThis);
+ } else {
return;
}
- Uri dataUri = intent.getData();
-
- mMessenger = (Messenger) extras.get(EXTRA_MESSENGER);
- Bundle data = extras.getBundle(EXTRA_DATA);
- if (data == null) {
- Log.e(Constants.TAG, "data extra is null!");
- return;
- }
+ @SuppressWarnings("unchecked") // this is unchecked, we make sure it's the correct op above!
+ OperationResult result = op.execute(inputParcel, cryptoInput);
+ sendMessageToHandler(MessageStatus.OKAY, result);
- Log.logDebugBundle(data, "EXTRA_DATA");
-
- ProviderHelper providerHelper = new ProviderHelper(mKeychainService);
-
- String action = intent.getAction();
-
- // executeServiceMethod action from extra bundle
- switch (action) {
- case ACTION_CONSOLIDATE: {
-
- // Operation
- ConsolidateResult result;
- if (data.containsKey(CONSOLIDATE_RECOVERY) && data.getBoolean(CONSOLIDATE_RECOVERY)) {
- result = providerHelper.consolidateDatabaseStep2(mKeychainService);
- } else {
- result = providerHelper.consolidateDatabaseStep1(mKeychainService);
- }
-
- // Result
- sendMessageToHandler(MessageStatus.OKAY, result);
-
- break;
- }
- case ACTION_VERIFY_KEYBASE_PROOF: {
-
- try {
- Proof proof = new Proof(new JSONObject(data.getString(KEYBASE_PROOF)));
- setProgress(R.string.keybase_message_fetching_data, 0, 100);
-
- Prover prover = Prover.findProverFor(proof);
-
- if (prover == null) {
- sendProofError(getString(R.string.keybase_no_prover_found) + ": " + proof
- .getPrettyName());
- return;
- }
-
- if (!prover.fetchProofData()) {
- sendProofError(prover.getLog(), getString(R.string.keybase_problem_fetching_evidence));
- return;
- }
- String requiredFingerprint = data.getString(KEYBASE_REQUIRED_FINGERPRINT);
- if (!prover.checkFingerprint(requiredFingerprint)) {
- sendProofError(getString(R.string.keybase_key_mismatch));
- return;
- }
-
- String domain = prover.dnsTxtCheckRequired();
- if (domain != null) {
- DNSMessage dnsQuery = new Client().query(new Question(domain, Record.TYPE.TXT));
- if (dnsQuery == null) {
- sendProofError(prover.getLog(), getString(R.string.keybase_dns_query_failure));
- return;
- }
- Record[] records = dnsQuery.getAnswers();
- List<List<byte[]>> extents = new ArrayList<List<byte[]>>();
- for (Record r : records) {
- Data d = r.getPayload();
- if (d instanceof TXT) {
- extents.add(((TXT) d).getExtents());
- }
- }
- if (!prover.checkDnsTxt(extents)) {
- sendProofError(prover.getLog(), null);
- return;
- }
- }
-
- byte[] messageBytes = prover.getPgpMessage().getBytes();
- if (prover.rawMessageCheckRequired()) {
- InputStream messageByteStream = PGPUtil.getDecoderStream(new ByteArrayInputStream
- (messageBytes));
- if (!prover.checkRawMessageBytes(messageByteStream)) {
- sendProofError(prover.getLog(), null);
- return;
- }
- }
-
- PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper,
- mKeychainService);
-
- PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(messageBytes)
- .setSignedLiteralData(true)
- .setRequiredSignerFingerprint(requiredFingerprint);
-
- DecryptVerifyResult decryptVerifyResult = op.execute(input, new CryptoInputParcel());
-
- if (!decryptVerifyResult.success()) {
- OperationLog log = decryptVerifyResult.getLog();
- OperationResult.LogEntryParcel lastEntry = null;
- for (OperationResult.LogEntryParcel entry : log) {
- lastEntry = entry;
- }
- sendProofError(getString(lastEntry.mType.getMsgId()));
- return;
- }
-
- if (!prover.validate(new String(decryptVerifyResult.getOutputBytes()))) {
- sendProofError(getString(R.string.keybase_message_payload_mismatch));
- return;
- }
-
- Bundle resultData = new Bundle();
- resultData.putString(ServiceProgressHandler.DATA_MESSAGE, "OK");
-
- // these help the handler construct a useful human-readable message
- resultData.putString(ServiceProgressHandler.KEYBASE_PROOF_URL, prover.getProofUrl());
- resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_URL, prover.getPresenceUrl());
- resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_LABEL, prover
- .getPresenceLabel());
- sendMessageToHandler(MessageStatus.OKAY, resultData);
- } catch (Exception e) {
- sendErrorToHandler(e);
- }
-
- break;
- }
- case ACTION_DELETE: {
-
- // Input
- long[] masterKeyIds = data.getLongArray(DELETE_KEY_LIST);
- boolean isSecret = data.getBoolean(DELETE_IS_SECRET);
-
- // Operation
- DeleteOperation op = new DeleteOperation(mKeychainService, providerHelper, mKeychainService);
- DeleteResult result = op.execute(masterKeyIds, isSecret);
-
- // Result
- sendMessageToHandler(MessageStatus.OKAY, result);
-
- break;
- }
- case ACTION_EDIT_KEYRING: {
-
- // Input
- SaveKeyringParcel saveParcel = data.getParcelable(EDIT_KEYRING_PARCEL);
- CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT);
-
- // Operation
- EditKeyOperation op = new EditKeyOperation(mKeychainService, providerHelper,
- mKeychainService, mActionCanceled);
- OperationResult result = op.execute(saveParcel, cryptoInput);
-
- // Result
- sendMessageToHandler(MessageStatus.OKAY, result);
-
- break;
- }
- case ACTION_PROMOTE_KEYRING: {
-
- // Input
- long keyRingId = data.getLong(PROMOTE_MASTER_KEY_ID);
- byte[] cardAid = data.getByteArray(PROMOTE_CARD_AID);
- long[] subKeyIds = data.getLongArray(PROMOTE_SUBKEY_IDS);
-
- // Operation
- PromoteKeyOperation op = new PromoteKeyOperation(
- mKeychainService, providerHelper, mKeychainService,
- mActionCanceled);
- PromoteKeyResult result = op.execute(keyRingId, cardAid, subKeyIds);
-
- // Result
- sendMessageToHandler(MessageStatus.OKAY, result);
-
- break;
- }
- case ACTION_EXPORT_KEYRING: {
-
- // Input
- boolean exportSecret = data.getBoolean(EXPORT_SECRET, false);
- String outputFile = data.getString(EXPORT_FILENAME);
- Uri outputUri = data.getParcelable(EXPORT_URI);
-
- boolean exportAll = data.getBoolean(EXPORT_ALL);
- long[] masterKeyIds = exportAll ? null : data.getLongArray(EXPORT_KEY_RING_MASTER_KEY_ID);
-
- // Operation
- ImportExportOperation importExportOperation = new ImportExportOperation(
- mKeychainService, providerHelper, mKeychainService);
- ExportResult result;
- if (outputFile != null) {
- result = importExportOperation.exportToFile(masterKeyIds, exportSecret, outputFile);
- } else {
- result = importExportOperation.exportToUri(masterKeyIds, exportSecret, outputUri);
- }
-
- // Result
- sendMessageToHandler(MessageStatus.OKAY, result);
-
- break;
- }
- case ACTION_IMPORT_KEYRING: {
-
- // Input
- String keyServer = data.getString(IMPORT_KEY_SERVER);
- ArrayList<ParcelableKeyRing> keyList = data.getParcelableArrayList(IMPORT_KEY_LIST);
-
- // either keyList or cache must be null, no guarantees otherwise
- if (keyList == null) {// import from file, do serially
- serialKeyImport(null, keyServer, providerHelper);
- } else {
- // if there is more than one key with the same fingerprint, we do a serial import to prevent
- // https://github.com/open-keychain/open-keychain/issues/1221
- HashSet<String> keyFingerprintSet = new HashSet<>();
- for (int i = 0; i < keyList.size(); i++) {
- keyFingerprintSet.add(keyList.get(i).mExpectedFingerprint);
- }
- if (keyFingerprintSet.size() == keyList.size()) {
- // all keys have unique fingerprints
- multiThreadedKeyImport(keyList.iterator(), keyList.size(), keyServer);
- } else {
- serialKeyImport(keyList, keyServer, providerHelper);
- }
- }
-
- break;
- }
- case ACTION_UPLOAD_KEYRING: {
- try {
-
- // Input
- String keyServer = data.getString(UPLOAD_KEY_SERVER);
- // and dataUri!
-
- // Operation
- HkpKeyserver server = new HkpKeyserver(keyServer);
-
- CanonicalizedPublicKeyRing keyring = providerHelper.getCanonicalizedPublicKeyRing(dataUri);
- ImportExportOperation importExportOperation = new ImportExportOperation(mKeychainService,
- providerHelper, mKeychainService);
-
- try {
- importExportOperation.uploadKeyRingToServer(server, keyring);
- } catch (Keyserver.AddKeyException e) {
- throw new PgpGeneralException("Unable to export key to selected server");
- }
-
- sendMessageToHandler(MessageStatus.OKAY);
- } catch (Exception e) {
- sendErrorToHandler(e);
- }
- break;
- }
- }
- if (!intent.getAction().equals(ACTION_IMPORT_KEYRING)) {
- // import keyring handles stopping service on its own
- stopSelf();
- }
}
};
Thread actionThread = new Thread(actionRunnable);
actionThread.start();
-
- return START_NOT_STICKY;
- }
-
- private void sendProofError(List<String> log, String label) {
- String msg = null;
- label = (label == null) ? "" : label + ": ";
- for (String m : log) {
- Log.e(Constants.TAG, label + m);
- msg = m;
- }
- sendProofError(label + msg);
- }
- private void sendProofError(String msg) {
- Bundle bundle = new Bundle();
- bundle.putString(ServiceProgressHandler.DATA_ERROR, msg);
- sendMessageToHandler(MessageStatus.OKAY, bundle);
- }
-
- private void sendErrorToHandler(Exception e) {
- // TODO: Implement a better exception handling here
- // contextualize the exception, if necessary
- String message;
- if (e instanceof PgpGeneralMsgIdException) {
- e = ((PgpGeneralMsgIdException) e).getContextualized(mKeychainService);
- message = e.getMessage();
- } else {
- message = e.getMessage();
- }
- Log.d(Constants.TAG, "KeychainService Exception: ", e);
-
- Bundle data = new Bundle();
- data.putString(ServiceProgressHandler.DATA_ERROR, message);
- sendMessageToHandler(MessageStatus.EXCEPTION, null, data);
+ return START_NOT_STICKY;
}
private void sendMessageToHandler(MessageStatus status, Integer arg2, Bundle data) {
@@ -509,7 +164,7 @@ public class KeychainService extends Service implements Progressable {
}
try {
- mMessenger.send(msg);
+ mMessenger.get().send(msg);
} catch (RemoteException e) {
Log.w(Constants.TAG, "Exception sending message, Is handler present?", e);
} catch (NullPointerException e) {
@@ -523,10 +178,6 @@ public class KeychainService extends Service implements Progressable {
sendMessageToHandler(status, null, bundle);
}
- private void sendMessageToHandler(MessageStatus status, Bundle data) {
- sendMessageToHandler(status, null, data);
- }
-
private void sendMessageToHandler(MessageStatus status) {
sendMessageToHandler(status, null, null);
}
@@ -564,214 +215,4 @@ public class KeychainService extends Service implements Progressable {
sendMessageToHandler(MessageStatus.PREVENT_CANCEL);
}
- public void serialKeyImport(ArrayList<ParcelableKeyRing> keyList, final String keyServer,
- ProviderHelper providerHelper) {
- Log.d(Constants.TAG, "serial key import starting");
- ParcelableFileCache<ParcelableKeyRing> cache =
- new ParcelableFileCache<>(mKeychainService, "key_import.pcl");
-
- // Operation
- ImportExportOperation importExportOperation = new ImportExportOperation(
- mKeychainService, providerHelper, mKeychainService,
- mActionCanceled);
- // Either list or cache must be null, no guarantees otherwise.
- ImportKeyResult result = keyList != null
- ? importExportOperation.importKeyRings(keyList, keyServer)
- : importExportOperation.importKeyRings(cache, keyServer);
-
- ContactSyncAdapterService.requestSync();
- // Result
- sendMessageToHandler(MessageStatus.OKAY, result);
-
- stopSelf();
- }
-
- public void multiThreadedKeyImport(Iterator<ParcelableKeyRing> keyListIterator, int totKeys, final String
- keyServer) {
- Log.d(Constants.TAG, "Multi-threaded key import starting");
- if (keyListIterator != null) {
- mKeyImportAccumulator = new KeyImportAccumulator(totKeys, mKeychainService);
- setProgress(0, totKeys);
-
- final int maxThreads = 200;
- ExecutorService importExecutor = new ThreadPoolExecutor(0, maxThreads,
- 30L, TimeUnit.SECONDS,
- new SynchronousQueue<Runnable>());
-
- while (keyListIterator.hasNext()) {
-
- final ParcelableKeyRing pkRing = keyListIterator.next();
-
- Runnable importOperationRunnable = new Runnable() {
-
- @Override
- public void run() {
- ImportKeyResult result = null;
- try {
- ImportExportOperation importExportOperation = new ImportExportOperation(
- mKeychainService,
- new ProviderHelper(mKeychainService),
- mKeyImportAccumulator.getImportProgressable(),
- mActionCanceled);
-
- ArrayList<ParcelableKeyRing> list = new ArrayList<>();
- list.add(pkRing);
-
- result = importExportOperation.importKeyRings(list,
- keyServer);
- } finally {
- // in the off-chance that importKeyRings does something to crash the
- // thread before it can call singleKeyRingImportCompleted, our imported
- // key count will go wrong. This will cause the service to never die,
- // and the progress dialog to stay displayed. The finally block was
- // originally meant to ensure singleKeyRingImportCompleted was called,
- // and checks for null were to be introduced, but in such a scenario,
- // knowing an uncaught error exists in importKeyRings is more important.
-
- // if a null gets passed, something wrong is happening. We want a crash.
-
- mKeyImportAccumulator.singleKeyRingImportCompleted(result);
- }
- }
- };
-
- importExecutor.execute(importOperationRunnable);
- }
- }
- }
-
- /**
- * Used to accumulate the results of individual key imports
- */
- private class KeyImportAccumulator {
- private OperationResult.OperationLog mImportLog = new OperationResult.OperationLog();
- private int mTotalKeys;
- private int mImportedKeys = 0;
- private Progressable mInternalProgressable;
- ArrayList<Long> mImportedMasterKeyIds = new ArrayList<Long>();
- private int mBadKeys = 0;
- private int mNewKeys = 0;
- private int mUpdatedKeys = 0;
- private int mSecret = 0;
- private int mResultType = 0;
-
- /**
- * meant to be used with a service due to stopSelf() in singleKeyRingImportCompleted. Remove this if
- * generalising.
- *
- * @param totalKeys total number of keys to be imported
- * @param externalProgressable the external progressable to be updated every time a key is imported
- */
- public KeyImportAccumulator(int totalKeys, Progressable externalProgressable) {
- mTotalKeys = totalKeys;
- // ignore updates from ImportExportOperation for now
- mInternalProgressable = new Progressable() {
- @Override
- public void setProgress(String message, int current, int total) {
-
- }
-
- @Override
- public void setProgress(int resourceId, int current, int total) {
-
- }
-
- @Override
- public void setProgress(int current, int total) {
-
- }
-
- @Override
- public void setPreventCancel() {
-
- }
- };
- }
-
- private synchronized void singleKeyRingImportCompleted(ImportKeyResult result) {
- // increase imported key count and accumulate log and bad, new etc. key counts from result
- mKeyImportAccumulator.accumulateKeyImport(result);
-
- setProgress(mKeyImportAccumulator.getImportedKeys(), mKeyImportAccumulator.getTotalKeys());
-
- if (mKeyImportAccumulator.isImportFinished()) {
- ContactSyncAdapterService.requestSync();
-
- sendMessageToHandler(ServiceProgressHandler.MessageStatus.OKAY,
- mKeyImportAccumulator.getConsolidatedImportKeyResult());
-
- stopSelf();//we're done here
- }
- }
-
- public Progressable getImportProgressable() {
- return mInternalProgressable;
- }
-
- public int getTotalKeys() {
- return mTotalKeys;
- }
-
- public int getImportedKeys() {
- return mImportedKeys;
- }
-
- public synchronized void accumulateKeyImport(ImportKeyResult result) {
- mImportedKeys++;
- mImportLog.addAll(result.getLog().toList());//accumulates log
- mBadKeys += result.mBadKeys;
- mNewKeys += result.mNewKeys;
- mUpdatedKeys += result.mUpdatedKeys;
- mSecret += result.mSecret;
-
- long[] masterKeyIds = result.getImportedMasterKeyIds();
- for (long masterKeyId : masterKeyIds) {
- mImportedMasterKeyIds.add(masterKeyId);
- }
-
- // if any key import has been cancelled, set result type to cancelled
- // resultType is added to in getConsolidatedKayImport to account for remaining factors
- mResultType |= result.getResult() & ImportKeyResult.RESULT_CANCELLED;
- }
-
- /**
- * returns accumulated result of all imports so far
- */
- public ImportKeyResult getConsolidatedImportKeyResult() {
-
- // adding required information to mResultType
- // special case,no keys requested for import
- if (mBadKeys == 0 && mNewKeys == 0 && mUpdatedKeys == 0) {
- mResultType = ImportKeyResult.RESULT_FAIL_NOTHING;
- } else {
- if (mNewKeys > 0) {
- mResultType |= ImportKeyResult.RESULT_OK_NEWKEYS;
- }
- if (mUpdatedKeys > 0) {
- mResultType |= ImportKeyResult.RESULT_OK_UPDATED;
- }
- if (mBadKeys > 0) {
- mResultType |= ImportKeyResult.RESULT_WITH_ERRORS;
- if (mNewKeys == 0 && mUpdatedKeys == 0) {
- mResultType |= ImportKeyResult.RESULT_ERROR;
- }
- }
- if (mImportLog.containsWarnings()) {
- mResultType |= ImportKeyResult.RESULT_WARNINGS;
- }
- }
-
- long masterKeyIds[] = new long[mImportedMasterKeyIds.size()];
- for (int i = 0; i < masterKeyIds.length; i++) {
- masterKeyIds[i] = mImportedMasterKeyIds.get(i);
- }
-
- return new ImportKeyResult(mResultType, mImportLog, mNewKeys, mUpdatedKeys, mBadKeys,
- mSecret, masterKeyIds);
- }
-
- public boolean isImportFinished() {
- return mTotalKeys == mImportedKeys;
- }
- }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java
index a0b470add..7c0b7eaef 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java
@@ -459,11 +459,16 @@ public class PassphraseCacheService extends Service {
* Called when one specific passphrase for keyId timed out
*/
private void timeout(long keyId) {
+
CachedPassphrase cPass = mPassphraseCache.get(keyId);
- // clean internal char[] from memory!
- cPass.getPassphrase().removeFromMemory();
- // remove passphrase object
- mPassphraseCache.remove(keyId);
+ if (cPass != null) {
+ if (cPass.getPassphrase() != null) {
+ // clean internal char[] from memory!
+ cPass.getPassphrase().removeFromMemory();
+ }
+ // remove passphrase object
+ mPassphraseCache.remove(keyId);
+ }
Log.d(Constants.TAG, "PassphraseCacheService Timeout of keyId " + keyId + ", removed from memory!");
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PromoteKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PromoteKeyringParcel.java
new file mode 100644
index 000000000..d268c3694
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PromoteKeyringParcel.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ * Copyright (C) 2015 Adithya Abraham Philip <adithyaphilip@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.service;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class PromoteKeyringParcel implements Parcelable {
+
+ public long mKeyRingId;
+ public byte[] mCardAid;
+ public long[] mSubKeyIds;
+
+ public PromoteKeyringParcel(long keyRingId, byte[] cardAid, long[] subKeyIds) {
+ mKeyRingId = keyRingId;
+ mCardAid = cardAid;
+ mSubKeyIds = subKeyIds;
+ }
+
+ protected PromoteKeyringParcel(Parcel in) {
+ mKeyRingId = in.readLong();
+ mCardAid = in.createByteArray();
+ mSubKeyIds = in.createLongArray();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeLong(mKeyRingId);
+ dest.writeByteArray(mCardAid);
+ dest.writeLongArray(mSubKeyIds);
+ }
+
+ public static final Parcelable.Creator<PromoteKeyringParcel> CREATOR = new Parcelable.Creator<PromoteKeyringParcel>() {
+ @Override
+ public PromoteKeyringParcel createFromParcel(Parcel in) {
+ return new PromoteKeyringParcel(in);
+ }
+
+ @Override
+ public PromoteKeyringParcel[] newArray(int size) {
+ return new PromoteKeyringParcel[size];
+ }
+ };
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java
index 989b0c4bd..d294e5057 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java
@@ -64,6 +64,8 @@ public class ServiceProgressHandler extends Handler {
public static final String KEYBASE_PRESENCE_URL = "keybase_presence_url";
public static final String KEYBASE_PRESENCE_LABEL = "keybase_presence_label";
+ public static final String TAG_PROGRESS_DIALOG = "progressDialog";
+
FragmentActivity mActivity;
public ServiceProgressHandler(FragmentActivity activity) {
@@ -88,7 +90,7 @@ public class ServiceProgressHandler extends Handler {
Handler handler = new Handler();
handler.post(new Runnable() {
public void run() {
- frag.show(manager, "progressDialog");
+ frag.show(manager, TAG_PROGRESS_DIALOG);
}
});
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/RequiredInputParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/RequiredInputParcel.java
index 930c2ee4f..efe844145 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/RequiredInputParcel.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/RequiredInputParcel.java
@@ -12,7 +12,7 @@ import android.os.Parcelable;
public class RequiredInputParcel implements Parcelable {
public enum RequiredInputType {
- PASSPHRASE, PASSPHRASE_SYMMETRIC, NFC_SIGN, NFC_DECRYPT, NFC_KEYTOCARD
+ PASSPHRASE, PASSPHRASE_SYMMETRIC, NFC_SIGN, NFC_DECRYPT, NFC_MOVE_KEY_TO_CARD
}
public Date mSignatureTime;
@@ -226,7 +226,7 @@ public class RequiredInputParcel implements Parcelable {
ByteBuffer buf = ByteBuffer.wrap(mSubkeysToExport.get(0));
// We need to pass in a subkey here...
- return new RequiredInputParcel(RequiredInputType.NFC_KEYTOCARD,
+ return new RequiredInputParcel(RequiredInputType.NFC_MOVE_KEY_TO_CARD,
inputHashes, null, null, mMasterKeyId, buf.getLong());
}
@@ -241,7 +241,7 @@ public class RequiredInputParcel implements Parcelable {
if (!mMasterKeyId.equals(input.mMasterKeyId)) {
throw new AssertionError("Master keys must match, this is a programming error!");
}
- if (input.mType != RequiredInputType.NFC_KEYTOCARD) {
+ if (input.mType != RequiredInputType.NFC_MOVE_KEY_TO_CARD) {
throw new AssertionError("Operation types must match, this is a programming error!");
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java
index e39a3a0bf..891c2268c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java
@@ -19,15 +19,12 @@
package org.sufficientlysecure.keychain.ui;
import android.app.Activity;
-import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
import android.os.Parcel;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
@@ -52,15 +49,11 @@ import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.CertifyActionsParcel;
import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction;
-import org.sufficientlysecure.keychain.service.KeychainService;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
-import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.ui.adapter.MultiUserIdsAdapter;
import org.sufficientlysecure.keychain.ui.base.CachingCryptoOperationFragment;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.ui.widget.CertifyKeySpinner;
import org.sufficientlysecure.keychain.util.Log;
-import org.sufficientlysecure.keychain.util.Preferences;
import java.util.ArrayList;
@@ -302,7 +295,7 @@ public class CertifyKeyFragment
}
@Override
- protected CertifyActionsParcel createOperationInput() {
+ public CertifyActionsParcel createOperationInput() {
// Bail out if there is not at least one user id selected
ArrayList<CertifyAction> certifyActions = mUserIdsAdapter.getSelectedCertifyActions();
@@ -325,7 +318,7 @@ public class CertifyKeyFragment
}
@Override
- protected void onCryptoOperationSuccess(CertifyResult result) {
+ public void onCryptoOperationSuccess(CertifyResult result) {
Intent intent = new Intent();
intent.putExtra(CertifyResult.EXTRA_RESULT, result);
getActivity().setResult(Activity.RESULT_OK, intent);
@@ -333,7 +326,7 @@ public class CertifyKeyFragment
}
@Override
- protected void onCryptoOperationCancelled() {
+ public void onCryptoOperationCancelled() {
super.onCryptoOperationCancelled();
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java
index 6a9bb7b11..7a473e49f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java
@@ -17,25 +17,27 @@
package org.sufficientlysecure.keychain.ui;
-import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
import android.support.v4.app.FragmentActivity;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.service.KeychainService;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
+import org.sufficientlysecure.keychain.service.ConsolidateInputParcel;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
/**
* We can not directly create a dialog on the application context.
* This activity encapsulates a DialogFragment to emulate a dialog.
*/
-public class ConsolidateDialogActivity extends FragmentActivity {
+public class ConsolidateDialogActivity extends FragmentActivity
+ implements CryptoOperationHelper.Callback<ConsolidateInputParcel, ConsolidateResult> {
public static final String EXTRA_CONSOLIDATE_RECOVERY = "consolidate_recovery";
+ private CryptoOperationHelper<ConsolidateInputParcel, ConsolidateResult> mConsolidateOpHelper;
+ private boolean mRecovery;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -48,55 +50,45 @@ public class ConsolidateDialogActivity extends FragmentActivity {
}
private void consolidateRecovery(boolean recovery) {
- // Message is received after importing is done in KeychainService
- ServiceProgressHandler saveHandler = new ServiceProgressHandler(this) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- /* don't care about the results (for now?)
-
- // get returned data bundle
- Bundle returnData = message.getInputData();
- if (returnData == null) {
- return;
- }
- final ConsolidateResult result =
- returnData.getParcelable(KeychainService.RESULT_CONSOLIDATE);
- if (result == null) {
- return;
- }
- result.createNotify(ConsolidateDialogActivity.this).show();
- */
-
- ConsolidateDialogActivity.this.finish();
- }
- }
- };
-
- // Send all information needed to service to import key in other thread
- Intent intent = new Intent(this, KeychainService.class);
- intent.setAction(KeychainService.ACTION_CONSOLIDATE);
-
- // fill values for this action
- Bundle data = new Bundle();
- data.putBoolean(KeychainService.CONSOLIDATE_RECOVERY, recovery);
- intent.putExtra(KeychainService.EXTRA_DATA, data);
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
-
- // show progress dialog
- saveHandler.showProgressDialog(
- getString(R.string.progress_importing),
- ProgressDialog.STYLE_HORIZONTAL, false
- );
-
- // start service with intent
- startService(intent);
+
+ mRecovery = recovery;
+
+ mConsolidateOpHelper = new CryptoOperationHelper<>(this, this, R.string.progress_importing);
+ mConsolidateOpHelper.cryptoOperation();
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (mConsolidateOpHelper != null) {
+ mConsolidateOpHelper.handleActivityResult(requestCode, resultCode, data);
+ }
}
+ @Override
+ public ConsolidateInputParcel createOperationInput() {
+ return new ConsolidateInputParcel(mRecovery);
+ }
+
+ @Override
+ public void onCryptoOperationSuccess(ConsolidateResult result) {
+ // don't care about result (for now?)
+ ConsolidateDialogActivity.this.finish();
+ }
+
+ @Override
+ public void onCryptoOperationCancelled() {
+
+ }
+
+ @Override
+ public void onCryptoOperationError(ConsolidateResult result) {
+ // don't care about result (for now?)
+ ConsolidateDialogActivity.this.finish();
+ }
+
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
index 68a809b69..36ab62cb4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
@@ -17,9 +17,8 @@
package org.sufficientlysecure.keychain.ui;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
import android.content.Intent;
+import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
@@ -43,7 +42,9 @@ public class CreateKeyActivity extends BaseNfcActivity {
public static final String EXTRA_FIRST_TIME = "first_time";
public static final String EXTRA_ADDITIONAL_EMAILS = "additional_emails";
public static final String EXTRA_PASSPHRASE = "passphrase";
- public static final String EXTRA_USE_SMART_CARD_SETTINGS = "use_smart_card_settings";
+ public static final String EXTRA_CREATE_YUBI_KEY = "create_yubi_key";
+ public static final String EXTRA_YUBI_KEY_PIN = "yubi_key_pin";
+ public static final String EXTRA_YUBI_KEY_ADMIN_PIN = "yubi_key_admin_pin";
public static final String EXTRA_NFC_USER_ID = "nfc_user_id";
public static final String EXTRA_NFC_AID = "nfc_aid";
@@ -56,7 +57,9 @@ public class CreateKeyActivity extends BaseNfcActivity {
ArrayList<String> mAdditionalEmails;
Passphrase mPassphrase;
boolean mFirstTime;
- boolean mUseSmartCardSettings;
+ boolean mCreateYubiKey;
+ String mYubiKeyPin;
+ String mYubiKeyAdminPin;
Fragment mCurrentFragment;
@@ -64,6 +67,23 @@ public class CreateKeyActivity extends BaseNfcActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ // React on NDEF_DISCOVERED from Manifest
+ // NOTE: ACTION_NDEF_DISCOVERED and not ACTION_TAG_DISCOVERED like in BaseNfcActivity
+ if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
+ try {
+ handleTagDiscoveredIntent(getIntent());
+ } catch (CardException e) {
+ handleNfcError(e);
+ } catch (IOException e) {
+ handleNfcError(e);
+ }
+
+ setTitle(R.string.title_manage_my_keys);
+
+ // done
+ return;
+ }
+
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
@@ -72,7 +92,9 @@ public class CreateKeyActivity extends BaseNfcActivity {
mAdditionalEmails = savedInstanceState.getStringArrayList(EXTRA_ADDITIONAL_EMAILS);
mPassphrase = savedInstanceState.getParcelable(EXTRA_PASSPHRASE);
mFirstTime = savedInstanceState.getBoolean(EXTRA_FIRST_TIME);
- mUseSmartCardSettings = savedInstanceState.getBoolean(EXTRA_USE_SMART_CARD_SETTINGS);
+ mCreateYubiKey = savedInstanceState.getBoolean(EXTRA_CREATE_YUBI_KEY);
+ mYubiKeyPin = savedInstanceState.getString(EXTRA_YUBI_KEY_PIN);
+ mYubiKeyAdminPin = savedInstanceState.getString(EXTRA_YUBI_KEY_ADMIN_PIN);
mCurrentFragment = getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
} else {
@@ -82,24 +104,32 @@ public class CreateKeyActivity extends BaseNfcActivity {
mName = intent.getStringExtra(EXTRA_NAME);
mEmail = intent.getStringExtra(EXTRA_EMAIL);
mFirstTime = intent.getBooleanExtra(EXTRA_FIRST_TIME, false);
- mUseSmartCardSettings = intent.getBooleanExtra(EXTRA_USE_SMART_CARD_SETTINGS, false);
+ mCreateYubiKey = intent.getBooleanExtra(EXTRA_CREATE_YUBI_KEY, false);
if (intent.hasExtra(EXTRA_NFC_FINGERPRINTS)) {
byte[] nfcFingerprints = intent.getByteArrayExtra(EXTRA_NFC_FINGERPRINTS);
String nfcUserId = intent.getStringExtra(EXTRA_NFC_USER_ID);
byte[] nfcAid = intent.getByteArrayExtra(EXTRA_NFC_AID);
- Fragment frag2 = CreateKeyYubiKeyImportFragment.createInstance(
- nfcFingerprints, nfcAid, nfcUserId);
- loadFragment(frag2, FragAction.START);
+ if (containsKeys(nfcFingerprints)) {
+ Fragment frag = CreateYubiKeyImportFragment.newInstance(
+ nfcFingerprints, nfcAid, nfcUserId);
+ loadFragment(frag, FragAction.START);
+
+ setTitle(R.string.title_import_keys);
+ } else {
+ Fragment frag = CreateYubiKeyBlankFragment.newInstance();
+ loadFragment(frag, FragAction.START);
+ setTitle(R.string.title_manage_my_keys);
+ }
- setTitle(R.string.title_import_keys);
+ // done
return;
- } else {
- CreateKeyStartFragment frag = CreateKeyStartFragment.newInstance();
- loadFragment(frag, FragAction.START);
}
+ // normal key creation
+ CreateKeyStartFragment frag = CreateKeyStartFragment.newInstance();
+ loadFragment(frag, FragAction.START);
}
if (mFirstTime) {
@@ -122,16 +152,7 @@ public class CreateKeyActivity extends BaseNfcActivity {
byte[] nfcAid = nfcGetAid();
String userId = nfcGetUserId();
- // If all fingerprint bytes are 0, the card contains no keys.
- boolean cardContainsKeys = false;
- for (byte b : scannedFingerprints) {
- if (b != 0) {
- cardContainsKeys = true;
- break;
- }
- }
-
- if (cardContainsKeys) {
+ if (containsKeys(scannedFingerprints)) {
try {
long masterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(scannedFingerprints);
CachedPublicKeyRing ring = new ProviderHelper(this).getCachedPublicKeyRing(masterKeyId);
@@ -146,25 +167,29 @@ public class CreateKeyActivity extends BaseNfcActivity {
finish();
} catch (PgpKeyNotFoundException e) {
- Fragment frag = CreateKeyYubiKeyImportFragment.createInstance(
+ Fragment frag = CreateYubiKeyImportFragment.newInstance(
scannedFingerprints, nfcAid, userId);
loadFragment(frag, FragAction.TO_RIGHT);
}
} else {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle(R.string.first_time_blank_smartcard_title)
- .setMessage(R.string.first_time_blank_smartcard_message)
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int button) {
- CreateKeyActivity.this.mUseSmartCardSettings = true;
- }
- })
- .setNegativeButton(android.R.string.no, null).show();
+ Fragment frag = CreateYubiKeyBlankFragment.newInstance();
+ loadFragment(frag, FragAction.TO_RIGHT);
}
}
+ private boolean containsKeys(byte[] scannedFingerprints) {
+ // If all fingerprint bytes are 0, the card contains no keys.
+ boolean cardContainsKeys = false;
+ for (byte b : scannedFingerprints) {
+ if (b != 0) {
+ cardContainsKeys = true;
+ break;
+ }
+ }
+ return cardContainsKeys;
+ }
+
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
@@ -174,7 +199,9 @@ public class CreateKeyActivity extends BaseNfcActivity {
outState.putStringArrayList(EXTRA_ADDITIONAL_EMAILS, mAdditionalEmails);
outState.putParcelable(EXTRA_PASSPHRASE, mPassphrase);
outState.putBoolean(EXTRA_FIRST_TIME, mFirstTime);
- outState.putBoolean(EXTRA_USE_SMART_CARD_SETTINGS, mUseSmartCardSettings);
+ outState.putBoolean(EXTRA_CREATE_YUBI_KEY, mCreateYubiKey);
+ outState.putString(EXTRA_YUBI_KEY_PIN, mYubiKeyPin);
+ outState.putString(EXTRA_YUBI_KEY_ADMIN_PIN, mYubiKeyAdminPin);
}
@Override
@@ -182,7 +209,7 @@ public class CreateKeyActivity extends BaseNfcActivity {
setContentView(R.layout.create_key_activity);
}
- public static enum FragAction {
+ public enum FragAction {
START,
TO_RIGHT,
TO_LEFT
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java
index 597f04d6b..69dd232cf 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java
@@ -18,6 +18,7 @@
package org.sufficientlysecure.keychain.ui;
import android.app.Activity;
+import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -29,6 +30,7 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
@@ -37,9 +39,9 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
import org.sufficientlysecure.keychain.ui.dialog.AddEmailDialogFragment;
-import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.ui.widget.EmailEditText;
+import org.sufficientlysecure.keychain.util.Passphrase;
import java.util.ArrayList;
import java.util.List;
@@ -201,7 +203,7 @@ public class CreateKeyEmailFragment extends Fragment {
Handler returnHandler = new Handler() {
@Override
public void handleMessage(Message message) {
- if (message.what == SetPassphraseDialogFragment.MESSAGE_OKAY) {
+ if (message.what == AddEmailDialogFragment.MESSAGE_OKAY) {
Bundle data = message.getData();
String email = data.getString(AddEmailDialogFragment.MESSAGE_DATA_EMAIL);
@@ -232,11 +234,38 @@ public class CreateKeyEmailFragment extends Fragment {
mCreateKeyActivity.mEmail = mEmailEdit.getText().toString();
mCreateKeyActivity.mAdditionalEmails = getAdditionalEmails();
- CreateKeyPassphraseFragment frag = CreateKeyPassphraseFragment.newInstance();
- mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT);
+ CreateKeyActivity createKeyActivity = ((CreateKeyActivity) getActivity());
+
+ if (createKeyActivity.mCreateYubiKey) {
+ hideKeyboard();
+
+ // set empty passphrase
+ createKeyActivity.mPassphrase = new Passphrase();
+
+ CreateYubiKeyPinFragment frag = CreateYubiKeyPinFragment.newInstance();
+ mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT);
+ } else {
+ CreateKeyPassphraseFragment frag = CreateKeyPassphraseFragment.newInstance();
+ mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT);
+ }
}
}
+ private void hideKeyboard() {
+ if (getActivity() == null) {
+ return;
+ }
+ InputMethodManager inputManager = (InputMethodManager) getActivity()
+ .getSystemService(Context.INPUT_METHOD_SERVICE);
+
+ // check if no view has focus
+ View v = getActivity().getCurrentFocus();
+ if (v == null)
+ return;
+
+ inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
+ }
+
private ArrayList<String> getAdditionalEmails() {
ArrayList<String> emails = new ArrayList<>();
for (EmailAdapter.ViewModel holder : mAdditionalEmailModels) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
index ebbd01afe..8c7abb874 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2014-2015 Dominik Schürmann <dominik@dominikschuermann.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -18,12 +18,10 @@
package org.sufficientlysecure.keychain.ui;
import android.app.Activity;
-import android.app.ProgressDialog;
import android.content.Intent;
+import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
@@ -35,15 +33,19 @@ import org.spongycastle.bcpg.sig.KeyFlags;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.EditKeyResult;
+import org.sufficientlysecure.keychain.operations.results.ExportResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.pgp.KeyRing;
+import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
+import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract;
-import org.sufficientlysecure.keychain.service.KeychainService;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.service.ExportKeyringParcel;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Algorithm;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.ChangeUnlockParcel;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Preferences;
@@ -63,6 +65,10 @@ public class CreateKeyFinalFragment extends Fragment {
SaveKeyringParcel mSaveKeyringParcel;
+ private CryptoOperationHelper<ExportKeyringParcel, ExportResult> mUploadOpHelper;
+ private CryptoOperationHelper<SaveKeyringParcel, EditKeyResult> mCreateOpHelper;
+ private CryptoOperationHelper<SaveKeyringParcel, EditKeyResult> mMoveToCardOpHelper;
+
public static CreateKeyFinalFragment newInstance() {
CreateKeyFinalFragment frag = new CreateKeyFinalFragment();
@@ -129,11 +135,26 @@ public class CreateKeyFinalFragment extends Fragment {
}
});
+ // If this is a debug build, don't upload by default
+ if (Constants.DEBUG) {
+ mUploadCheckbox.setChecked(false);
+ }
+
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mCreateOpHelper != null) {
+ mCreateOpHelper.handleActivityResult(requestCode, resultCode, data);
+ }
+ if (mMoveToCardOpHelper != null) {
+ mMoveToCardOpHelper.handleActivityResult(requestCode, resultCode, data);
+ }
+ if (mUploadOpHelper != null) {
+ mUploadOpHelper.handleActivityResult(requestCode, resultCode, data);
+ }
+
switch (requestCode) {
case REQUEST_EDIT_KEY: {
if (resultCode == Activity.RESULT_OK) {
@@ -156,7 +177,8 @@ public class CreateKeyFinalFragment extends Fragment {
if (mSaveKeyringParcel == null) {
mSaveKeyringParcel = new SaveKeyringParcel();
- if (createKeyActivity.mUseSmartCardSettings) {
+
+ if (createKeyActivity.mCreateYubiKey) {
mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA,
2048, null, KeyFlags.SIGN_DATA | KeyFlags.CERTIFY_OTHER, 0L));
mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA,
@@ -164,6 +186,7 @@ public class CreateKeyFinalFragment extends Fragment {
mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA,
2048, null, KeyFlags.AUTHENTICATION, 0L));
mEditText.setText(R.string.create_key_custom);
+ mEditButton.setEnabled(false);
} else {
mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA,
4096, null, KeyFlags.CERTIFY_OTHER, 0L));
@@ -192,115 +215,184 @@ public class CreateKeyFinalFragment extends Fragment {
}
}
-
private void createKey() {
- Intent intent = new Intent(getActivity(), KeychainService.class);
- intent.setAction(KeychainService.ACTION_EDIT_KEYRING);
+ final CreateKeyActivity createKeyActivity = (CreateKeyActivity) getActivity();
- ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) {
+ CryptoOperationHelper.Callback<SaveKeyringParcel, EditKeyResult> createKeyCallback
+ = new CryptoOperationHelper.Callback<SaveKeyringParcel, EditKeyResult>() {
@Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // get returned data bundle
- Bundle returnData = message.getData();
- if (returnData == null) {
- return;
- }
- final EditKeyResult result =
- returnData.getParcelable(OperationResult.EXTRA_RESULT);
- if (result == null) {
- Log.e(Constants.TAG, "result == null");
- return;
- }
-
- if (result.mMasterKeyId != null && mUploadCheckbox.isChecked()) {
- // result will be displayed after upload
- uploadKey(result);
- } else {
- Intent data = new Intent();
- data.putExtra(OperationResult.EXTRA_RESULT, result);
- getActivity().setResult(Activity.RESULT_OK, data);
- getActivity().finish();
- }
+ public SaveKeyringParcel createOperationInput() {
+ return mSaveKeyringParcel;
+ }
+
+ @Override
+ public void onCryptoOperationSuccess(EditKeyResult result) {
+
+ if (createKeyActivity.mCreateYubiKey) {
+ moveToCard(result);
+ return;
+ }
+
+ if (result.mMasterKeyId != null && mUploadCheckbox.isChecked()) {
+ // result will be displayed after upload
+ uploadKey(result);
+ return;
}
+
+ Intent data = new Intent();
+ data.putExtra(OperationResult.EXTRA_RESULT, result);
+ getActivity().setResult(Activity.RESULT_OK, data);
+ getActivity().finish();
+ }
+
+ @Override
+ public void onCryptoOperationCancelled() {
+
+ }
+
+ @Override
+ public void onCryptoOperationError(EditKeyResult result) {
+ result.createNotify(getActivity()).show();
+ }
+
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
}
};
- // fill values for this action
- Bundle data = new Bundle();
+ mCreateOpHelper = new CryptoOperationHelper<>(this, createKeyCallback,
+ R.string.progress_building_key);
+ mCreateOpHelper.cryptoOperation();
+ }
- // get selected key entries
- data.putParcelable(KeychainService.EDIT_KEYRING_PARCEL, mSaveKeyringParcel);
+ private void moveToCard(final EditKeyResult saveKeyResult) {
+ CachedPublicKeyRing key = (new ProviderHelper(getActivity()))
+ .getCachedPublicKeyRing(saveKeyResult.mMasterKeyId);
- intent.putExtra(KeychainService.EXTRA_DATA, data);
+ final SaveKeyringParcel changeKeyringParcel;
+ try {
+ changeKeyringParcel = new SaveKeyringParcel(key.getMasterKeyId(), key.getFingerprint());
+ } catch (PgpKeyNotFoundException e) {
+ Log.e(Constants.TAG, "Key that should be moved to YubiKey not found in database!");
+ return;
+ }
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
+ Cursor cursor = getActivity().getContentResolver().query(
+ KeychainContract.Keys.buildKeysUri(changeKeyringParcel.mMasterKeyId),
+ new String[]{KeychainContract.Keys.KEY_ID,}, null, null, null
+ );
+ try {
+ while (cursor != null && cursor.moveToNext()) {
+ long subkeyId = cursor.getLong(0);
+ changeKeyringParcel.getOrCreateSubkeyChange(subkeyId).mMoveKeyToCard = true;
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
- saveHandler.showProgressDialog(getString(R.string.progress_building_key),
- ProgressDialog.STYLE_HORIZONTAL, false);
+ CryptoOperationHelper.Callback<SaveKeyringParcel, EditKeyResult> callback
+ = new CryptoOperationHelper.Callback<SaveKeyringParcel, EditKeyResult>() {
- getActivity().startService(intent);
- }
+ @Override
+ public SaveKeyringParcel createOperationInput() {
+ return changeKeyringParcel;
+ }
- // TODO move into EditKeyOperation
- private void uploadKey(final EditKeyResult saveKeyResult) {
- // Send all information needed to service to upload key in other thread
- final Intent intent = new Intent(getActivity(), KeychainService.class);
+ @Override
+ public void onCryptoOperationSuccess(EditKeyResult result) {
+ handleResult(result);
+ }
- intent.setAction(KeychainService.ACTION_UPLOAD_KEYRING);
+ @Override
+ public void onCryptoOperationCancelled() {
+
+ }
+
+ @Override
+ public void onCryptoOperationError(EditKeyResult result) {
+ handleResult(result);
+ }
+
+ public void handleResult(EditKeyResult result) {
+ // merge logs of createKey with moveToCard
+ saveKeyResult.getLog().add(result, 0);
+
+ if (result.mMasterKeyId != null && mUploadCheckbox.isChecked()) {
+ // result will be displayed after upload
+ uploadKey(saveKeyResult);
+ return;
+ }
+
+ Intent data = new Intent();
+ data.putExtra(OperationResult.EXTRA_RESULT, saveKeyResult);
+ getActivity().setResult(Activity.RESULT_OK, data);
+ getActivity().finish();
+ }
+
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
+ };
+
+
+ mMoveToCardOpHelper = new CryptoOperationHelper<>(this, callback, R.string.progress_modify);
+ mMoveToCardOpHelper.cryptoOperation();
+ }
+ private void uploadKey(final EditKeyResult saveKeyResult) {
// set data uri as path to keyring
- Uri blobUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(
+ final Uri blobUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(
saveKeyResult.mMasterKeyId);
- intent.setData(blobUri);
+ // upload to favorite keyserver
+ final String keyserver = Preferences.getPreferences(getActivity()).getPreferredKeyserver();
- // fill values for this action
- Bundle data = new Bundle();
+ CryptoOperationHelper.Callback<ExportKeyringParcel, ExportResult> callback
+ = new CryptoOperationHelper.Callback<ExportKeyringParcel, ExportResult>() {
- // upload to favorite keyserver
- String keyserver = Preferences.getPreferences(getActivity()).getPreferredKeyserver();
- data.putString(KeychainService.UPLOAD_KEY_SERVER, keyserver);
+ @Override
+ public ExportKeyringParcel createOperationInput() {
+ return new ExportKeyringParcel(keyserver, blobUri);
+ }
- intent.putExtra(KeychainService.EXTRA_DATA, data);
+ @Override
+ public void onCryptoOperationSuccess(ExportResult result) {
+ handleResult(result);
+ }
- ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) {
@Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // TODO: upload operation needs a result!
- // TODO: then combine these results
- //if (result.getResult() == OperationResultParcel.RESULT_OK) {
- //Notify.create(getActivity(), R.string.key_send_success,
- //Notify.Style.OK).show();
-
- Intent data = new Intent();
- data.putExtra(OperationResult.EXTRA_RESULT, saveKeyResult);
- getActivity().setResult(Activity.RESULT_OK, data);
- getActivity().finish();
- }
+ public void onCryptoOperationCancelled() {
+
}
- };
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
+ @Override
+ public void onCryptoOperationError(ExportResult result) {
+ handleResult(result);
+ }
- // show progress dialog
- saveHandler.showProgressDialog(
- getString(R.string.progress_uploading),
- ProgressDialog.STYLE_HORIZONTAL, false);
+ public void handleResult(ExportResult result) {
+ // TODO: ExportOperation UPLOAD_KEYSERVER needs logs!
+ // TODO: then merge logs here!
+ //saveKeyResult.getLog().add(result, 0);
+
+ Intent data = new Intent();
+ data.putExtra(OperationResult.EXTRA_RESULT, saveKeyResult);
+ getActivity().setResult(Activity.RESULT_OK, data);
+ getActivity().finish();
+ }
+
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
+ };
- // start service with intent
- getActivity().startService(intent);
+ mUploadOpHelper = new CryptoOperationHelper<>(this, callback, R.string.progress_uploading);
+ mUploadOpHelper.cryptoOperation();
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java
index 1a844e6e4..cd97ef108 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java
@@ -81,7 +81,7 @@ public class CreateKeyStartFragment extends Fragment {
mYubiKey.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- CreateKeyYubiKeyWaitFragment frag = new CreateKeyYubiKeyWaitFragment();
+ CreateYubiKeyWaitFragment frag = new CreateYubiKeyWaitFragment();
mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT);
}
});
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyBlankFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyBlankFragment.java
new file mode 100644
index 000000000..5b13dc88e
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyBlankFragment.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.ui;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
+
+public class CreateYubiKeyBlankFragment extends Fragment {
+
+ CreateKeyActivity mCreateKeyActivity;
+ View mBackButton;
+ View mNextButton;
+
+ /**
+ * Creates new instance of this fragment
+ */
+ public static CreateYubiKeyBlankFragment newInstance() {
+ CreateYubiKeyBlankFragment frag = new CreateYubiKeyBlankFragment();
+
+ Bundle args = new Bundle();
+
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.create_yubi_key_blank_fragment, container, false);
+
+ mBackButton = view.findViewById(R.id.create_key_back_button);
+ mNextButton = view.findViewById(R.id.create_key_next_button);
+
+ mBackButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (getFragmentManager().getBackStackEntryCount() == 0) {
+ getActivity().setResult(Activity.RESULT_CANCELED);
+ getActivity().finish();
+ } else {
+ mCreateKeyActivity.loadFragment(null, FragAction.TO_LEFT);
+ }
+ }
+ });
+ mNextButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ nextClicked();
+ }
+ });
+
+ return view;
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ mCreateKeyActivity = (CreateKeyActivity) getActivity();
+ }
+
+ private void nextClicked() {
+ mCreateKeyActivity.mCreateYubiKey = true;
+
+ CreateKeyNameFragment frag = CreateKeyNameFragment.newInstance();
+ mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT);
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyImportFragment.java
index 2ab8c5967..9897fa237 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyImportFragment.java
@@ -22,11 +22,8 @@ import java.nio.ByteBuffer;
import java.util.ArrayList;
import android.app.Activity;
-import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
@@ -37,18 +34,19 @@ import android.widget.TextView;
import org.spongycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
-import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
-import org.sufficientlysecure.keychain.service.KeychainService;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.NfcListenerFragment;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationFragment;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Preferences;
-public class CreateKeyYubiKeyImportFragment extends Fragment implements NfcListenerFragment {
+public class CreateYubiKeyImportFragment
+ extends CryptoOperationFragment<ImportKeyringParcel, ImportKeyResult>
+ implements NfcListenerFragment {
private static final String ARG_FINGERPRINT = "fingerprint";
public static final String ARG_AID = "aid";
@@ -64,9 +62,13 @@ public class CreateKeyYubiKeyImportFragment extends Fragment implements NfcListe
private TextView vSerNo;
private TextView vUserId;
- public static Fragment createInstance(byte[] scannedFingerprints, byte[] nfcAid, String userId) {
+ // for CryptoOperationFragment key import
+ private String mKeyserver;
+ private ArrayList<ParcelableKeyRing> mKeyList;
- CreateKeyYubiKeyImportFragment frag = new CreateKeyYubiKeyImportFragment();
+ public static Fragment newInstance(byte[] scannedFingerprints, byte[] nfcAid, String userId) {
+
+ CreateYubiKeyImportFragment frag = new CreateYubiKeyImportFragment();
Bundle args = new Bundle();
args.putByteArray(ARG_FINGERPRINT, scannedFingerprints);
@@ -95,7 +97,7 @@ public class CreateKeyYubiKeyImportFragment extends Fragment implements NfcListe
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.create_yubikey_import_fragment, container, false);
+ View view = inflater.inflate(R.layout.create_yubi_key_import_fragment, container, false);
vSerNo = (TextView) view.findViewById(R.id.yubikey_serno);
vUserId = (TextView) view.findViewById(R.id.yubikey_userid);
@@ -175,77 +177,20 @@ public class CreateKeyYubiKeyImportFragment extends Fragment implements NfcListe
public void importKey() {
- // Message is received after decrypting is done in KeychainService
- ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // get returned data bundle
- Bundle returnData = message.getData();
-
- ImportKeyResult result =
- returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
-
- long[] masterKeyIds = result.getImportedMasterKeyIds();
-
- // TODO handle masterKeyIds.length != 1...? sorta outlandish scenario
-
- if (!result.success() || masterKeyIds.length == 0) {
- result.createNotify(getActivity()).show();
- return;
- }
-
- Intent intent = new Intent(getActivity(), ViewKeyActivity.class);
- // use the imported masterKeyId, not the one from the yubikey, because
- // that one might* just have been a subkey of the imported key
- intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyIds[0]));
- intent.putExtra(ViewKeyActivity.EXTRA_DISPLAY_RESULT, result);
- intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, mNfcAid);
- intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, mNfcUserId);
- intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, mNfcFingerprints);
- startActivity(intent);
- getActivity().finish();
-
- }
-
- }
- };
-
- // Send all information needed to service to decrypt in other thread
- Intent intent = new Intent(getActivity(), KeychainService.class);
-
- // fill values for this action
- Bundle data = new Bundle();
-
- intent.setAction(KeychainService.ACTION_IMPORT_KEYRING);
-
ArrayList<ParcelableKeyRing> keyList = new ArrayList<>();
keyList.add(new ParcelableKeyRing(mNfcFingerprint, null, null));
- data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keyList);
+ mKeyList = keyList;
{
Preferences prefs = Preferences.getPreferences(getActivity());
Preferences.CloudSearchPrefs cloudPrefs =
new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver());
- data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);
+ mKeyserver = cloudPrefs.keyserver;
}
- intent.putExtra(KeychainService.EXTRA_DATA, data);
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
+ super.setProgressMessageResource(R.string.progress_importing);
- saveHandler.showProgressDialog(
- getString(R.string.progress_importing),
- ProgressDialog.STYLE_HORIZONTAL, false
- );
-
- // start service with intent
- getActivity().startService(intent);
+ super.cryptoOperation();
}
@@ -264,4 +209,29 @@ public class CreateKeyYubiKeyImportFragment extends Fragment implements NfcListe
refreshSearch();
}
+
+ @Override
+ public ImportKeyringParcel createOperationInput() {
+ return new ImportKeyringParcel(mKeyList, mKeyserver);
+ }
+
+ @Override
+ public void onCryptoOperationSuccess(ImportKeyResult result) {
+ long[] masterKeyIds = result.getImportedMasterKeyIds();
+ if (masterKeyIds.length == 0) {
+ super.onCryptoOperationError(result);
+ return;
+ }
+
+ Intent intent = new Intent(getActivity(), ViewKeyActivity.class);
+ // use the imported masterKeyId, not the one from the yubikey, because
+ // that one might* just have been a subkey of the imported key
+ intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyIds[0]));
+ intent.putExtra(ViewKeyActivity.EXTRA_DISPLAY_RESULT, result);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, mNfcAid);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, mNfcUserId);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, mNfcFingerprints);
+ startActivity(intent);
+ getActivity().finish();
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinFragment.java
new file mode 100644
index 000000000..8744762fe
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinFragment.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.ui;
+
+import android.app.Activity;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.util.Pair;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
+
+import java.security.SecureRandom;
+
+public class CreateYubiKeyPinFragment extends Fragment {
+
+ // view
+ CreateKeyActivity mCreateKeyActivity;
+ TextView mPin;
+ TextView mAdminPin;
+ View mBackButton;
+ View mNextButton;
+
+ /**
+ * Creates new instance of this fragment
+ */
+ public static CreateYubiKeyPinFragment newInstance() {
+ CreateYubiKeyPinFragment frag = new CreateYubiKeyPinFragment();
+
+ Bundle args = new Bundle();
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.create_yubi_key_pin_fragment, container, false);
+
+ mPin = (TextView) view.findViewById(R.id.create_yubi_key_pin);
+ mAdminPin = (TextView) view.findViewById(R.id.create_yubi_key_admin_pin);
+ mBackButton = view.findViewById(R.id.create_key_back_button);
+ mNextButton = view.findViewById(R.id.create_key_next_button);
+
+ if (mCreateKeyActivity.mYubiKeyPin == null) {
+ new AsyncTask<Void, Void, Pair<String, String>>() {
+ @Override
+ protected Pair<String, String> doInBackground(Void... unused) {
+ SecureRandom secureRandom = new SecureRandom();
+ // min = 6, we choose 6
+ String pin = "" + secureRandom.nextInt(999999);
+ // min = 8, we choose 10, but 6 are equals the PIN
+ String adminPin = pin + secureRandom.nextInt(9999);
+
+ return new Pair<>(pin, adminPin);
+ }
+
+ @Override
+ protected void onPostExecute(Pair<String, String> pair) {
+ mCreateKeyActivity.mYubiKeyPin = pair.first;
+ mCreateKeyActivity.mYubiKeyAdminPin = pair.second;
+
+ mPin.setText(mCreateKeyActivity.mYubiKeyPin);
+ mAdminPin.setText(mCreateKeyActivity.mYubiKeyAdminPin);
+ }
+ }.execute();
+ } else {
+ mPin.setText(mCreateKeyActivity.mYubiKeyPin);
+ mAdminPin.setText(mCreateKeyActivity.mYubiKeyAdminPin);
+ }
+
+ mBackButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ back();
+ }
+ });
+ mNextButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ nextClicked();
+ }
+ });
+
+
+ return view;
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ mCreateKeyActivity = (CreateKeyActivity) getActivity();
+ }
+
+
+ private void nextClicked() {
+ // save state
+// mCreateKeyActivity.mPassphrase = new Passphrase(mPassphraseEdit);
+
+ CreateYubiKeyPinRepeatFragment frag = CreateYubiKeyPinRepeatFragment.newInstance();
+ mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT);
+ }
+
+ private void back() {
+ mCreateKeyActivity.loadFragment(null, FragAction.TO_LEFT);
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinRepeatFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinRepeatFragment.java
new file mode 100644
index 000000000..dc437577a
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinRepeatFragment.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.ui;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
+
+public class CreateYubiKeyPinRepeatFragment extends Fragment {
+
+ // view
+ CreateKeyActivity mCreateKeyActivity;
+ EditText mPin;
+ EditText mAdminPin;
+ View mBackButton;
+ View mNextButton;
+
+ /**
+ * Creates new instance of this fragment
+ */
+ public static CreateYubiKeyPinRepeatFragment newInstance() {
+ CreateYubiKeyPinRepeatFragment frag = new CreateYubiKeyPinRepeatFragment();
+
+ Bundle args = new Bundle();
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ /**
+ * Checks if text of given EditText is not empty. If it is empty an error is
+ * set and the EditText gets the focus.
+ *
+ * @param context
+ * @param editText
+ * @return true if EditText is not empty
+ */
+ private static boolean isEditTextNotEmpty(Context context, EditText editText) {
+ boolean output = true;
+ if (editText.getText().length() == 0) {
+ editText.setError(context.getString(R.string.create_key_empty));
+ editText.requestFocus();
+ output = false;
+ } else {
+ editText.setError(null);
+ }
+
+ return output;
+ }
+
+ private static boolean checkPin(Context context, EditText editText1, String pin) {
+ boolean output = editText1.getText().toString().equals(pin);
+
+ if (!output) {
+ editText1.setError(context.getString(R.string.create_key_yubi_key_pin_not_correct));
+ editText1.requestFocus();
+ } else {
+ editText1.setError(null);
+ }
+
+ return output;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.create_yubi_key_pin_repeat_fragment, container, false);
+
+ mPin = (EditText) view.findViewById(R.id.create_yubi_key_pin_repeat);
+ mAdminPin = (EditText) view.findViewById(R.id.create_yubi_key_admin_pin_repeat);
+ mBackButton = view.findViewById(R.id.create_key_back_button);
+ mNextButton = view.findViewById(R.id.create_key_next_button);
+
+ mPin.requestFocus();
+ mBackButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ back();
+ }
+ });
+ mNextButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ nextClicked();
+ }
+ });
+
+ return view;
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ mCreateKeyActivity = (CreateKeyActivity) getActivity();
+ }
+
+ private void back() {
+ hideKeyboard();
+ mCreateKeyActivity.loadFragment(null, FragAction.TO_LEFT);
+ }
+
+ private void nextClicked() {
+ if (isEditTextNotEmpty(getActivity(), mPin)
+ && checkPin(getActivity(), mPin, mCreateKeyActivity.mYubiKeyPin)
+ && isEditTextNotEmpty(getActivity(), mAdminPin)
+ && checkPin(getActivity(), mAdminPin, mCreateKeyActivity.mYubiKeyAdminPin)) {
+
+ CreateKeyFinalFragment frag = CreateKeyFinalFragment.newInstance();
+ hideKeyboard();
+ mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT);
+ }
+ }
+
+ private void hideKeyboard() {
+ if (getActivity() == null) {
+ return;
+ }
+ InputMethodManager inputManager = (InputMethodManager) getActivity()
+ .getSystemService(Context.INPUT_METHOD_SERVICE);
+
+ // check if no view has focus
+ View v = getActivity().getCurrentFocus();
+ if (v == null)
+ return;
+
+ inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyWaitFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyWaitFragment.java
index 0b8586c0a..d45195512 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyWaitFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyWaitFragment.java
@@ -28,14 +28,14 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
-public class CreateKeyYubiKeyWaitFragment extends Fragment {
+public class CreateYubiKeyWaitFragment extends Fragment {
CreateKeyActivity mCreateKeyActivity;
View mBackButton;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.create_yubikey_wait_fragment, container, false);
+ View view = inflater.inflate(R.layout.create_yubi_key_wait_fragment, container, false);
mBackButton = view.findViewById(R.id.create_key_back_button);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
index 4375be740..04f54f151 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
@@ -120,7 +120,14 @@ public class DecryptActivity extends BaseActivity {
case ACTION_DECRYPT_FROM_CLIPBOARD: {
ClipboardManager clipMan = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
+ if (clipMan == null) {
+ break;
+ }
+
ClipData clip = clipMan.getPrimaryClip();
+ if (clip == null) {
+ break;
+ }
// check if data is available as uri
Uri uri = null;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
index c8ae867b2..4eb8cd5e8 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
@@ -27,6 +27,7 @@ import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.support.v4.app.Fragment;
+import android.os.Parcelable;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
@@ -45,14 +46,14 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
-import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.service.KeychainService;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
+import org.sufficientlysecure.keychain.ui.base.CachingCryptoOperationFragment;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State;
import org.sufficientlysecure.keychain.ui.util.Notify;
@@ -78,6 +79,8 @@ public abstract class DecryptFragment extends Fragment implements LoaderManager.
private DecryptVerifyResult mDecryptVerifyResult;
private ViewAnimator mOverlayAnimator;
+ private CryptoOperationHelper<ImportKeyringParcel, ImportKeyResult> mImportOpHelper;
+
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
@@ -135,43 +138,15 @@ public abstract class DecryptFragment extends Fragment implements LoaderManager.
private void lookupUnknownKey(long unknownKeyId) {
- // Message is received after importing is done in KeychainService
- ServiceProgressHandler serviceHandler = new ServiceProgressHandler(getActivity()) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // get returned data bundle
- Bundle returnData = message.getData();
-
- if (returnData == null) {
- return;
- }
-
- final ImportKeyResult result =
- returnData.getParcelable(OperationResult.EXTRA_RESULT);
-
- Activity activity = getActivity();
- if (result != null && activity != null) {
- result.createNotify(activity).show();
- }
-
- getLoaderManager().restartLoader(LOADER_ID_UNIFIED, null, DecryptFragment.this);
- }
- }
- };
-
- // fill values for this action
- Bundle data = new Bundle();
+ final ArrayList<ParcelableKeyRing> keyList;
+ final String keyserver;
// search config
{
Preferences prefs = Preferences.getPreferences(getActivity());
Preferences.CloudSearchPrefs cloudPrefs =
new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver());
- data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);
+ keyserver = cloudPrefs.keyserver;
}
{
@@ -180,19 +155,43 @@ public abstract class DecryptFragment extends Fragment implements LoaderManager.
ArrayList<ParcelableKeyRing> selectedEntries = new ArrayList<>();
selectedEntries.add(keyEntry);
- data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, selectedEntries);
+ keyList = selectedEntries;
}
- // Send all information needed to service to query keys in other thread
- Intent intent = new Intent(getActivity(), KeychainService.class);
- intent.setAction(KeychainService.ACTION_IMPORT_KEYRING);
- intent.putExtra(KeychainService.EXTRA_DATA, data);
+ CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult> callback
+ = new CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult>() {
+
+ @Override
+ public ImportKeyringParcel createOperationInput() {
+ return new ImportKeyringParcel(keyList, keyserver);
+ }
+
+ @Override
+ public void onCryptoOperationSuccess(ImportKeyResult result) {
+ result.createNotify(getActivity()).show();
+
+ getLoaderManager().restartLoader(LOADER_ID_UNIFIED, null, DecryptFragment.this);
+ }
+
+ @Override
+ public void onCryptoOperationCancelled() {
+ // do nothing
+ }
+
+ @Override
+ public void onCryptoOperationError(ImportKeyResult result) {
+ result.createNotify(getActivity()).show();
+ }
+
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
+ };
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(serviceHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
+ mImportOpHelper = new CryptoOperationHelper<>(this, callback, R.string.progress_importing);
- getActivity().startService(intent);
+ mImportOpHelper.cryptoOperation();
}
private void showKey(long keyId) {
@@ -457,4 +456,11 @@ public abstract class DecryptFragment extends Fragment implements LoaderManager.
protected abstract void onVerifyLoaded(boolean hideErrorOverlay);
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mImportOpHelper != null) {
+ mImportOpHelper.handleActivityResult(requestCode, resultCode, data);
+ }
+ super.onActivityResult(requestCode, resultCode, data);
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java
index d2bff8336..96767463e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java
@@ -254,18 +254,12 @@ public class DecryptListFragment
}
@Override
- protected boolean onCryptoSetProgress(String msg, int progress, int max) {
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
mAdapter.setProgress(mCurrentInputUri, progress, max, msg);
return true;
}
-
- @Override
- protected void dismissProgress() {
- // progress shown inline, so never mind
- }
-
@Override
- protected void onCryptoOperationError(DecryptVerifyResult result) {
+ public void onCryptoOperationError(DecryptVerifyResult result) {
final Uri uri = mCurrentInputUri;
mCurrentInputUri = null;
@@ -275,7 +269,7 @@ public class DecryptListFragment
}
@Override
- protected void onCryptoOperationSuccess(DecryptVerifyResult result) {
+ public void onCryptoOperationSuccess(DecryptVerifyResult result) {
Uri uri = mCurrentInputUri;
mCurrentInputUri = null;
@@ -439,7 +433,7 @@ public class DecryptListFragment
}
@Override
- protected PgpDecryptVerifyInputParcel createOperationInput() {
+ public PgpDecryptVerifyInputParcel createOperationInput() {
if (mCurrentInputUri == null) {
if (mPendingInputUris.isEmpty()) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
index 48aa3016d..1363d44f2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
@@ -18,7 +18,6 @@
package org.sufficientlysecure.keychain.ui;
import android.app.Activity;
-import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
@@ -26,7 +25,6 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
-import android.os.Parcelable;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
@@ -40,9 +38,6 @@ import android.widget.ListView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
-import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
-import org.sufficientlysecure.keychain.operations.results.EditKeyResult;
-import org.sufficientlysecure.keychain.operations.results.InputPendingResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.SingletonResult;
@@ -54,8 +49,6 @@ import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.provider.ProviderHelper.NotFoundException;
-import org.sufficientlysecure.keychain.service.KeychainService;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.ChangeUnlockParcel;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.SubkeyChange;
@@ -65,7 +58,12 @@ import org.sufficientlysecure.keychain.ui.adapter.SubkeysAddedAdapter;
import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter;
import org.sufficientlysecure.keychain.ui.adapter.UserIdsAddedAdapter;
import org.sufficientlysecure.keychain.ui.base.CryptoOperationFragment;
-import org.sufficientlysecure.keychain.ui.dialog.*;
+import org.sufficientlysecure.keychain.ui.dialog.AddSubkeyDialogFragment;
+import org.sufficientlysecure.keychain.ui.dialog.AddUserIdDialogFragment;
+import org.sufficientlysecure.keychain.ui.dialog.EditSubkeyDialogFragment;
+import org.sufficientlysecure.keychain.ui.dialog.EditSubkeyExpiryDialogFragment;
+import org.sufficientlysecure.keychain.ui.dialog.EditUserIdDialogFragment;
+import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Passphrase;
@@ -609,12 +607,12 @@ public class EditKeyFragment extends CryptoOperationFragment<SaveKeyringParcel,
}
@Override
- protected SaveKeyringParcel createOperationInput() {
+ public SaveKeyringParcel createOperationInput() {
return mSaveKeyringParcel;
}
@Override
- protected void onCryptoOperationSuccess(OperationResult result) {
+ public void onCryptoOperationSuccess(OperationResult result) {
// if good -> finish, return result to showkey and display there!
Intent intent = new Intent();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptOverviewFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptOverviewFragment.java
index 590d02c6f..779b22535 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptOverviewFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptOverviewFragment.java
@@ -29,6 +29,7 @@ import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -37,6 +38,7 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.ui.util.Notify.Style;
import org.sufficientlysecure.keychain.ui.util.SubtleAttentionSeeker;
import org.sufficientlysecure.keychain.util.FileHelper;
@@ -92,15 +94,31 @@ public class EncryptDecryptOverviewFragment extends Fragment {
mDecryptFromClipboard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- Intent clipboardDecrypt = new Intent(getActivity(), DecryptActivity.class);
- clipboardDecrypt.setAction(DecryptActivity.ACTION_DECRYPT_FROM_CLIPBOARD);
- startActivityForResult(clipboardDecrypt, 0);
+ decryptFromClipboard();
}
});
return view;
}
+ private void decryptFromClipboard() {
+
+ Activity activity = getActivity();
+ if (activity == null) {
+ return;
+ }
+
+ final CharSequence clipboardText = ClipboardReflection.getClipboardText(activity);
+ if (clipboardText == null || TextUtils.isEmpty(clipboardText)) {
+ Notify.create(activity, R.string.error_clipboard_empty, Style.ERROR).show();
+ return;
+ }
+
+ Intent clipboardDecrypt = new Intent(getActivity(), DecryptActivity.class);
+ clipboardDecrypt.setAction(DecryptActivity.ACTION_DECRYPT_FROM_CLIPBOARD);
+ startActivityForResult(clipboardDecrypt, 0);
+ }
+
@Override
public void onResume() {
super.onResume();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java
index d7c6b2049..215af5885 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java
@@ -386,7 +386,7 @@ public class EncryptFilesFragment
}
@Override
- protected void onCryptoOperationSuccess(final SignEncryptResult result) {
+ public void onCryptoOperationSuccess(final SignEncryptResult result) {
if (mDeleteAfterEncrypt) {
// TODO make behavior coherent here
@@ -485,7 +485,7 @@ public class EncryptFilesFragment
}
- protected SignEncryptParcel createOperationInput() {
+ public SignEncryptParcel createOperationInput() {
SignEncryptParcel actionsParcel = getCachedActionsParcel();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java
index e0629eb73..886c52651 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java
@@ -202,7 +202,7 @@ public class EncryptTextFragment
}
- protected SignEncryptParcel createOperationInput() {
+ public SignEncryptParcel createOperationInput() {
if (mMessage == null || mMessage.isEmpty()) {
Notify.create(getActivity(), R.string.error_empty_text, Notify.Style.ERROR)
@@ -316,7 +316,7 @@ public class EncryptTextFragment
}
@Override
- protected void onCryptoOperationSuccess(SignEncryptResult result) {
+ public void onCryptoOperationSuccess(SignEncryptResult result) {
if (mShareAfterEncrypt) {
// Share encrypted message/file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
index 07ab88b02..ba4f759e6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -17,12 +17,10 @@
package org.sufficientlysecure.keychain.ui;
-import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Message;
-import android.os.Messenger;
import android.support.v4.app.Fragment;
import android.view.View;
import android.view.View.OnClickListener;
@@ -35,9 +33,10 @@ import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
-import org.sufficientlysecure.keychain.service.KeychainService;
+import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
import org.sufficientlysecure.keychain.ui.base.BaseNfcActivity;
import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Log;
@@ -47,7 +46,8 @@ import org.sufficientlysecure.keychain.util.ParcelableFileCache.IteratorWithSize
import java.io.IOException;
import java.util.ArrayList;
-public class ImportKeysActivity extends BaseNfcActivity {
+public class ImportKeysActivity extends BaseNfcActivity
+ implements CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult> {
public static final String ACTION_IMPORT_KEY = OpenKeychainIntents.IMPORT_KEY;
public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER = OpenKeychainIntents.IMPORT_KEY_FROM_KEYSERVER;
@@ -82,6 +82,12 @@ public class ImportKeysActivity extends BaseNfcActivity {
private Fragment mTopFragment;
private View mImportButton;
+ // for CryptoOperationHelper.Callback
+ private String mKeyserver;
+ private ArrayList<ParcelableKeyRing> mKeyList;
+
+ private CryptoOperationHelper<ImportKeyringParcel, ImportKeyResult> mOperationHelper;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -388,23 +394,9 @@ public class ImportKeysActivity extends BaseNfcActivity {
return;
}
- ServiceProgressHandler serviceHandler = new ServiceProgressHandler(this) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- ImportKeysActivity.this.handleMessage(message);
- }
- };
-
- // Send all information needed to service to import key in other thread
- Intent intent = new Intent(this, KeychainService.class);
-
- intent.setAction(KeychainService.ACTION_IMPORT_KEYRING);
-
- // fill values for this action
- Bundle data = new Bundle();
+ mOperationHelper = new CryptoOperationHelper<ImportKeyringParcel, ImportKeyResult>(
+ this, this, R.string.progress_importing
+ );
ImportKeysListFragment.LoaderState ls = mListFragment.getLoaderState();
if (ls instanceof ImportKeysListFragment.BytesLoaderState) {
@@ -423,30 +415,18 @@ public class ImportKeysActivity extends BaseNfcActivity {
new ParcelableFileCache<>(this, "key_import.pcl");
cache.writeCache(selectedEntries);
- intent.putExtra(KeychainService.EXTRA_DATA, data);
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(serviceHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
-
- // show progress dialog
- serviceHandler.showProgressDialog(
- getString(R.string.progress_importing),
- ProgressDialog.STYLE_HORIZONTAL,
- true
- );
+ mKeyList = null;
+ mKeyserver = null;
+ mOperationHelper.cryptoOperation();
- // start service with intent
- startService(intent);
} catch (IOException e) {
Log.e(Constants.TAG, "Problem writing cache file", e);
Notify.create(this, "Problem writing cache file!", Notify.Style.ERROR)
.show((ViewGroup) findViewById(R.id.import_snackbar));
}
} else if (ls instanceof ImportKeysListFragment.CloudLoaderState) {
- ImportKeysListFragment.CloudLoaderState sls = (ImportKeysListFragment.CloudLoaderState) ls;
-
- data.putString(KeychainService.IMPORT_KEY_SERVER, sls.mCloudPrefs.keyserver);
+ ImportKeysListFragment.CloudLoaderState sls =
+ (ImportKeysListFragment.CloudLoaderState) ls;
// get selected key entries
ArrayList<ParcelableKeyRing> keys = new ArrayList<>();
@@ -459,22 +439,11 @@ public class ImportKeysActivity extends BaseNfcActivity {
);
}
}
- data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keys);
-
- intent.putExtra(KeychainService.EXTRA_DATA, data);
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(serviceHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
- // show progress dialog
- serviceHandler.showProgressDialog(
- getString(R.string.progress_importing),
- ProgressDialog.STYLE_HORIZONTAL, true
- );
+ mKeyList = keys;
+ mKeyserver = sls.mCloudPrefs.keyserver;
+ mOperationHelper.cryptoOperation();
- // start service with intent
- startService(intent);
}
}
@@ -485,4 +454,57 @@ public class ImportKeysActivity extends BaseNfcActivity {
// either way, finish afterwards
finish();
}
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mOperationHelper == null ||
+ !mOperationHelper.handleActivityResult(requestCode, resultCode, data)) {
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+ }
+
+ public void handleResult (ImportKeyResult result) {
+ if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT.equals(getIntent().getAction())
+ || ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN.equals(getIntent().getAction())) {
+ Intent intent = new Intent();
+ intent.putExtra(ImportKeyResult.EXTRA_RESULT, result);
+ ImportKeysActivity.this.setResult(RESULT_OK, intent);
+ ImportKeysActivity.this.finish();
+ return;
+ }
+ if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_TO_SERVICE.equals(getIntent().getAction())) {
+ ImportKeysActivity.this.setResult(RESULT_OK, mPendingIntentData);
+ ImportKeysActivity.this.finish();
+ return;
+ }
+
+ result.createNotify(ImportKeysActivity.this)
+ .show((ViewGroup) findViewById(R.id.import_snackbar));
+ }
+ // methods from CryptoOperationHelper.Callback
+
+ @Override
+ public ImportKeyringParcel createOperationInput() {
+ return new ImportKeyringParcel(mKeyList, mKeyserver);
+ }
+
+ @Override
+ public void onCryptoOperationSuccess(ImportKeyResult result) {
+ handleResult(result);
+ }
+
+ @Override
+ public void onCryptoOperationCancelled() {
+ // do nothing
+ }
+
+ @Override
+ public void onCryptoOperationError(ImportKeyResult result) {
+ handleResult(result);
+ }
+
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
index 9f3beff43..da713d0d8 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
@@ -18,7 +18,6 @@
package org.sufficientlysecure.keychain.ui;
import android.annotation.TargetApi;
-import android.app.ProgressDialog;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.net.Uri;
@@ -26,8 +25,6 @@ import android.nfc.NdefMessage;
import android.nfc.NfcAdapter;
import android.os.Build;
import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
import android.os.Parcelable;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;
@@ -43,8 +40,8 @@ import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.SingletonResult;
-import org.sufficientlysecure.keychain.service.KeychainService;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import org.sufficientlysecure.keychain.util.IntentIntegratorSupportV4;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Preferences;
@@ -55,7 +52,8 @@ import java.util.Locale;
/**
* Proxy activity (just a transparent content view) to scan QR Codes using the Barcode Scanner app
*/
-public class ImportKeysProxyActivity extends FragmentActivity {
+public class ImportKeysProxyActivity extends FragmentActivity
+ implements CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult> {
public static final String ACTION_QR_CODE_API = OpenKeychainIntents.IMPORT_KEY_FROM_QR_CODE;
// implies activity returns scanned fingerprint as extra and does not import
@@ -64,6 +62,11 @@ public class ImportKeysProxyActivity extends FragmentActivity {
public static final String EXTRA_FINGERPRINT = "fingerprint";
+ // for CryptoOperationHelper
+ private String mKeyserver;
+ private ArrayList<ParcelableKeyRing> mKeyList;
+ private CryptoOperationHelper<ImportKeyringParcel, ImportKeyResult> mImportOpHelper;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -106,6 +109,10 @@ public class ImportKeysProxyActivity extends FragmentActivity {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mImportOpHelper != null) {
+ mImportOpHelper.cryptoOperation();
+ }
+
if (requestCode == IntentIntegratorSupportV4.REQUEST_CODE) {
IntentResult scanResult = IntentIntegratorSupportV4.parseActivityResult(requestCode,
resultCode, data);
@@ -205,75 +212,56 @@ public class ImportKeysProxyActivity extends FragmentActivity {
private void startImportService(ArrayList<ParcelableKeyRing> keyRings) {
- // Message is received after importing is done in KeychainService
- ServiceProgressHandler serviceHandler = new ServiceProgressHandler(this) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // get returned data bundle
- Bundle returnData = message.getData();
- if (returnData == null) {
- finish();
- return;
- }
- final ImportKeyResult result =
- returnData.getParcelable(OperationResult.EXTRA_RESULT);
- if (result == null) {
- Log.e(Constants.TAG, "result == null");
- finish();
- return;
- }
-
- if (!result.success()) {
- // only return if no success...
- Intent data = new Intent();
- data.putExtras(returnData);
- returnResult(data);
- return;
- }
-
- Intent certifyIntent = new Intent(ImportKeysProxyActivity.this,
- CertifyKeyActivity.class);
- certifyIntent.putExtra(CertifyKeyActivity.EXTRA_RESULT, result);
- certifyIntent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS,
- result.getImportedMasterKeyIds());
- startActivityForResult(certifyIntent, 0);
- }
- }
- };
-
- // fill values for this action
- Bundle data = new Bundle();
-
// search config
{
Preferences prefs = Preferences.getPreferences(this);
Preferences.CloudSearchPrefs cloudPrefs =
new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver());
- data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);
+ mKeyserver = cloudPrefs.keyserver;
}
- data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keyRings);
+ mKeyList = keyRings;
+
+ mImportOpHelper = new CryptoOperationHelper<>(this, this, R.string.progress_importing);
+
+ mImportOpHelper.cryptoOperation();
+ }
+
+
+ // CryptoOperationHelper.Callback methods
- // Send all information needed to service to query keys in other thread
- Intent intent = new Intent(this, KeychainService.class);
- intent.setAction(KeychainService.ACTION_IMPORT_KEYRING);
- intent.putExtra(KeychainService.EXTRA_DATA, data);
+ @Override
+ public ImportKeyringParcel createOperationInput() {
+ return new ImportKeyringParcel(mKeyList, mKeyserver);
+ }
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(serviceHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
+ @Override
+ public void onCryptoOperationSuccess(ImportKeyResult result) {
+ Intent certifyIntent = new Intent(this, CertifyKeyActivity.class);
+ certifyIntent.putExtra(CertifyKeyActivity.EXTRA_RESULT, result);
+ certifyIntent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS,
+ result.getImportedMasterKeyIds());
+ startActivityForResult(certifyIntent, 0);
+ }
- // show progress dialog
- serviceHandler.showProgressDialog(
- getString(R.string.progress_importing),
- ProgressDialog.STYLE_HORIZONTAL, true);
+ @Override
+ public void onCryptoOperationCancelled() {
- // start service with intent
- startService(intent);
+ }
+
+ @Override
+ public void onCryptoOperationError(ImportKeyResult result) {
+ Bundle returnData = new Bundle();
+ returnData.putParcelable(OperationResult.EXTRA_RESULT, result);
+ Intent data = new Intent();
+ data.putExtras(returnData);
+ returnResult(data);
+ return;
+ }
+
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
}
/**
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
index 780558b27..e038cf948 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
@@ -21,7 +21,6 @@ package org.sufficientlysecure.keychain.ui;
import android.animation.ObjectAnimator;
import android.annotation.TargetApi;
import android.app.Activity;
-import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
@@ -64,9 +63,10 @@ import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainDatabase;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.service.KeychainService;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.service.ConsolidateInputParcel;
+import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.adapter.KeyAdapter;
@@ -90,7 +90,8 @@ import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
*/
public class KeyListFragment extends LoaderFragment
implements SearchView.OnQueryTextListener, AdapterView.OnItemClickListener,
- LoaderManager.LoaderCallbacks<Cursor>, FabContainer {
+ LoaderManager.LoaderCallbacks<Cursor>, FabContainer,
+ CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult> {
static final int REQUEST_REPEAT_PASSPHRASE = 1;
static final int REQUEST_ACTION = 2;
@@ -107,6 +108,14 @@ public class KeyListFragment extends LoaderFragment
private FloatingActionsMenu mFab;
+ // for CryptoOperationHelper import
+ private ArrayList<ParcelableKeyRing> mKeyList;
+ private String mKeyserver;
+ private CryptoOperationHelper<ImportKeyringParcel, ImportKeyResult> mImportOpHelper;
+
+ // for ConsolidateOperation
+ private CryptoOperationHelper<ConsolidateInputParcel, ConsolidateResult> mConsolidateOpHelper;
+
// This ids for multiple key export.
private ArrayList<Long> mIdsForRepeatAskPassphrase;
// This index for remembering the number of master key.
@@ -580,112 +589,59 @@ public class KeyListFragment extends LoaderFragment
ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null);
keyList.add(keyEntry);
}
+ mKeyList = keyList;
} finally {
cursor.close();
}
- ServiceProgressHandler serviceHandler = new ServiceProgressHandler(getActivity()) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // get returned data bundle
- Bundle returnData = message.getData();
- if (returnData == null) {
- return;
- }
- final ImportKeyResult result =
- returnData.getParcelable(OperationResult.EXTRA_RESULT);
- if (result == null) {
- Log.e(Constants.TAG, "result == null");
- return;
- }
-
- result.createNotify(getActivity()).show();
- }
- }
- };
-
- // Send all information needed to service to query keys in other thread
- Intent intent = new Intent(getActivity(), KeychainService.class);
- intent.setAction(KeychainService.ACTION_IMPORT_KEYRING);
-
- // fill values for this action
- Bundle data = new Bundle();
-
// search config
{
Preferences prefs = Preferences.getPreferences(getActivity());
Preferences.CloudSearchPrefs cloudPrefs =
new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver());
- data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);
+ mKeyserver = cloudPrefs.keyserver;
}
- data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keyList);
-
- intent.putExtra(KeychainService.EXTRA_DATA, data);
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(serviceHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
-
- // show progress dialog
- serviceHandler.showProgressDialog(
- getString(R.string.progress_updating),
- ProgressDialog.STYLE_HORIZONTAL, true);
-
- // start service with intent
- getActivity().startService(intent);
+ mImportOpHelper = new CryptoOperationHelper<>(this,
+ this, R.string.progress_updating);
+ mImportOpHelper.cryptoOperation();
}
private void consolidate() {
- // Message is received after importing is done in KeychainService
- ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // get returned data bundle
- Bundle returnData = message.getData();
- if (returnData == null) {
- return;
- }
- final ConsolidateResult result =
- returnData.getParcelable(OperationResult.EXTRA_RESULT);
- if (result == null) {
- return;
- }
- result.createNotify(getActivity()).show();
- }
+ CryptoOperationHelper.Callback<ConsolidateInputParcel, ConsolidateResult> callback
+ = new CryptoOperationHelper.Callback<ConsolidateInputParcel, ConsolidateResult>() {
+
+ @Override
+ public ConsolidateInputParcel createOperationInput() {
+ return new ConsolidateInputParcel(false); // we want to perform a full consolidate
}
- };
- // Send all information needed to service to import key in other thread
- Intent intent = new Intent(getActivity(), KeychainService.class);
+ @Override
+ public void onCryptoOperationSuccess(ConsolidateResult result) {
+ result.createNotify(getActivity()).show();
+ }
- intent.setAction(KeychainService.ACTION_CONSOLIDATE);
+ @Override
+ public void onCryptoOperationCancelled() {
- // fill values for this action
- Bundle data = new Bundle();
+ }
- intent.putExtra(KeychainService.EXTRA_DATA, data);
+ @Override
+ public void onCryptoOperationError(ConsolidateResult result) {
+ result.createNotify(getActivity()).show();
+ }
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
+ };
- // show progress dialog
- saveHandler.showProgressDialog(
- getString(R.string.progress_importing),
- ProgressDialog.STYLE_HORIZONTAL, false);
+ mConsolidateOpHelper =
+ new CryptoOperationHelper<>(this, callback, R.string.progress_importing);
- // start service with intent
- getActivity().startService(intent);
+ mConsolidateOpHelper.cryptoOperation();
}
private void showMultiExportDialog(long[] masterKeyIds) {
@@ -724,6 +680,14 @@ public class KeyListFragment extends LoaderFragment
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mImportOpHelper != null) {
+ mImportOpHelper.handleActivityResult(requestCode, resultCode, data);
+ }
+
+ if (mConsolidateOpHelper != null) {
+ mConsolidateOpHelper.handleActivityResult(requestCode, resultCode, data);
+ }
+
if (requestCode == REQUEST_REPEAT_PASSPHRASE) {
if (resultCode != Activity.RESULT_OK) {
return;
@@ -769,6 +733,32 @@ public class KeyListFragment extends LoaderFragment
anim.start();
}
+ // CryptoOperationHelper.Callback methods
+ @Override
+ public ImportKeyringParcel createOperationInput() {
+ return new ImportKeyringParcel(mKeyList, mKeyserver);
+ }
+
+ @Override
+ public void onCryptoOperationSuccess(ImportKeyResult result) {
+ result.createNotify(getActivity()).show();
+ }
+
+ @Override
+ public void onCryptoOperationCancelled() {
+
+ }
+
+ @Override
+ public void onCryptoOperationError(ImportKeyResult result) {
+ result.createNotify(getActivity()).show();
+ }
+
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
+
public class KeyListAdapter extends KeyAdapter implements StickyListHeadersAdapter {
private HashMap<Integer, Boolean> mSelection = new HashMap<>();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java
index c5fc9abe0..addfb6a23 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java
@@ -63,7 +63,7 @@ public class NfcOperationActivity extends BaseNfcActivity {
mServiceIntent = data.getParcelable(EXTRA_SERVICE_INTENT);
// obtain passphrase for this subkey
- if (mRequiredInput.mType != RequiredInputParcel.RequiredInputType.NFC_KEYTOCARD) {
+ if (mRequiredInput.mType != RequiredInputParcel.RequiredInputType.NFC_MOVE_KEY_TO_CARD) {
obtainYubiKeyPin(mRequiredInput);
}
}
@@ -96,7 +96,7 @@ public class NfcOperationActivity extends BaseNfcActivity {
}
break;
}
- case NFC_KEYTOCARD: {
+ case NFC_MOVE_KEY_TO_CARD: {
ProviderHelper providerHelper = new ProviderHelper(this);
CanonicalizedSecretKeyRing secretKeyRing;
try {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java
index 7408135ae..a1cb77546 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java
@@ -18,15 +18,11 @@
package org.sufficientlysecure.keychain.ui;
import android.annotation.TargetApi;
-import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
-import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.NumberPicker;
@@ -38,9 +34,9 @@ import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.service.KeychainService;
+import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ParcelableFileCache;
@@ -52,7 +48,8 @@ import edu.cmu.cylab.starslinger.exchange.ExchangeActivity;
import edu.cmu.cylab.starslinger.exchange.ExchangeConfig;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
-public class SafeSlingerActivity extends BaseActivity {
+public class SafeSlingerActivity extends BaseActivity
+ implements CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult> {
private static final int REQUEST_CODE_SAFE_SLINGER = 211;
@@ -61,6 +58,12 @@ public class SafeSlingerActivity extends BaseActivity {
private long mMasterKeyId;
private int mSelectedNumber = 2;
+ // for CryptoOperationHelper
+ private ArrayList<ParcelableKeyRing> mKeyList;
+ private String mKeyserver;
+ private CryptoOperationHelper<ImportKeyringParcel, ImportKeyResult> mOperationHelper;
+
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -116,65 +119,17 @@ public class SafeSlingerActivity extends BaseActivity {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mOperationHelper != null) {
+ mOperationHelper.handleActivityResult(requestCode, resultCode, data);
+ }
+
if (requestCode == REQUEST_CODE_SAFE_SLINGER) {
if (resultCode == ExchangeActivity.RESULT_EXCHANGE_CANCELED) {
return;
}
- final FragmentActivity activity = SafeSlingerActivity.this;
-
- // Message is received after importing is done in KeychainService
- ServiceProgressHandler saveHandler = new ServiceProgressHandler(activity) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // get returned data bundle
- Bundle returnData = message.getData();
- if (returnData == null) {
- return;
- }
- final ImportKeyResult result =
- returnData.getParcelable(OperationResult.EXTRA_RESULT);
- if (result == null) {
- Log.e(Constants.TAG, "result == null");
- return;
- }
-
- if (!result.success()) {
-// result.createNotify(activity).show();
- // only return if no success...
- Intent data = new Intent();
- data.putExtras(returnData);
- setResult(RESULT_OK, data);
- finish();
- return;
- }
-
-// if (mExchangeMasterKeyId == null) {
-// return;
-// }
-
- Intent certifyIntent = new Intent(activity, CertifyKeyActivity.class);
- certifyIntent.putExtra(CertifyKeyActivity.EXTRA_RESULT, result);
- certifyIntent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, result.getImportedMasterKeyIds());
- certifyIntent.putExtra(CertifyKeyActivity.EXTRA_CERTIFY_KEY_ID, mMasterKeyId);
- startActivityForResult(certifyIntent, 0);
-
-// mExchangeMasterKeyId = null;
- }
- }
- };
-
Log.d(Constants.TAG, "importKeys started");
- // Send all information needed to service to import key in other thread
- Intent intent = new Intent(activity, KeychainService.class);
-
- intent.setAction(KeychainService.ACTION_IMPORT_KEYRING);
-
// instead of giving the entries by Intent extra, cache them into a
// file to prevent Java Binder problems on heavy imports
// read FileImportCache for more info.
@@ -185,28 +140,18 @@ public class SafeSlingerActivity extends BaseActivity {
// We parcel this iteratively into a file - anything we can
// display here, we should be able to import.
ParcelableFileCache<ParcelableKeyRing> cache =
- new ParcelableFileCache<>(activity, "key_import.pcl");
+ new ParcelableFileCache<>(this, "key_import.pcl");
cache.writeCache(it.size(), it.iterator());
- // fill values for this action
- Bundle bundle = new Bundle();
- intent.putExtra(KeychainService.EXTRA_DATA, bundle);
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
-
- // show progress dialog
- saveHandler.showProgressDialog(
- getString(R.string.progress_importing),
- ProgressDialog.STYLE_HORIZONTAL, true
- );
+ mOperationHelper =
+ new CryptoOperationHelper(this, this, R.string.progress_importing);
- // start service with intent
- activity.startService(intent);
+ mKeyList = null;
+ mKeyserver = null;
+ mOperationHelper.cryptoOperation();
} catch (IOException e) {
Log.e(Constants.TAG, "Problem writing cache file", e);
- Notify.create(activity, "Problem writing cache file!", Notify.Style.ERROR).show();
+ Notify.create(this, "Problem writing cache file!", Notify.Style.ERROR).show();
}
} else {
// give everything else down to KeyListActivity!
@@ -233,4 +178,39 @@ public class SafeSlingerActivity extends BaseActivity {
return list;
}
+ // CryptoOperationHelper.Callback functions
+
+ @Override
+ public ImportKeyringParcel createOperationInput() {
+ return new ImportKeyringParcel(mKeyList, mKeyserver);
+ }
+
+ @Override
+ public void onCryptoOperationSuccess(ImportKeyResult result) {
+ Intent certifyIntent = new Intent(this, CertifyKeyActivity.class);
+ certifyIntent.putExtra(CertifyKeyActivity.EXTRA_RESULT, result);
+ certifyIntent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, result.getImportedMasterKeyIds());
+ certifyIntent.putExtra(CertifyKeyActivity.EXTRA_CERTIFY_KEY_ID, mMasterKeyId);
+ startActivityForResult(certifyIntent, 0);
+ }
+
+ @Override
+ public void onCryptoOperationCancelled() {
+
+ }
+
+ @Override
+ public void onCryptoOperationError(ImportKeyResult result) {
+ Bundle returnData = new Bundle();
+ returnData.putParcelable(OperationResult.EXTRA_RESULT, result);
+ Intent data = new Intent();
+ data.putExtras(returnData);
+ setResult(RESULT_OK, data);
+ finish();
+ }
+
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java
index 442bdf8f7..6fc0aaac6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2014-2015 Dominik Schürmann <dominik@dominikschuermann.de>
* Copyright (C) 2010-2014 Thialfihar <thi@thialfihar.org>
*
* This program is free software: you can redistribute it and/or modify
@@ -17,14 +18,11 @@
package org.sufficientlysecure.keychain.ui;
-import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
-import android.os.Build;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
-import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.support.v7.widget.Toolbar;
@@ -32,15 +30,16 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
-import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.compatibility.AppCompatPreferenceActivity;
import org.sufficientlysecure.keychain.ui.widget.IntegerListPreference;
+import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Preferences;
import java.util.List;
-public class SettingsActivity extends PreferenceActivity {
+public class SettingsActivity extends AppCompatPreferenceActivity {
public static final String ACTION_PREFS_CLOUD = "org.sufficientlysecure.keychain.ui.PREFS_CLOUD";
public static final String ACTION_PREFS_ADV = "org.sufficientlysecure.keychain.ui.PREFS_ADV";
@@ -91,22 +90,6 @@ public class SettingsActivity extends PreferenceActivity {
initializePassphraseCacheTtl(
(IntegerListPreference) findPreference(Constants.Pref.PASSPHRASE_CACHE_TTL));
- int[] valueIds = new int[]{
- CompressionAlgorithmTags.UNCOMPRESSED,
- CompressionAlgorithmTags.ZIP,
- CompressionAlgorithmTags.ZLIB,
- CompressionAlgorithmTags.BZIP2,
- };
- String[] entries = new String[]{
- getString(R.string.choice_none) + " (" + getString(R.string.compression_fast) + ")",
- "ZIP (" + getString(R.string.compression_fast) + ")",
- "ZLIB (" + getString(R.string.compression_fast) + ")",
- "BZIP2 (" + getString(R.string.compression_very_slow) + ")",};
- String[] values = new String[valueIds.length];
- for (int i = 0; i < values.length; ++i) {
- values[i] = "" + valueIds[i];
- }
-
initializeUseDefaultYubiKeyPin(
(CheckBoxPreference) findPreference(Constants.Pref.USE_DEFAULT_YUBIKEY_PIN));
@@ -122,13 +105,14 @@ public class SettingsActivity extends PreferenceActivity {
private void setupToolbar() {
ViewGroup root = (ViewGroup) findViewById(android.R.id.content);
LinearLayout content = (LinearLayout) root.getChildAt(0);
- LinearLayout toolbarContainer = (LinearLayout) View.inflate(this, R.layout.preference_toolbar_activity, null);
+ LinearLayout toolbarContainer = (LinearLayout) View.inflate(this, R.layout.preference_toolbar, null);
root.removeAllViews();
toolbarContainer.addView(content);
root.addView(toolbarContainer);
Toolbar toolbar = (Toolbar) toolbarContainer.findViewById(R.id.toolbar);
+
toolbar.setTitle(R.string.title_preferences);
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_white_24dp));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@@ -141,34 +125,13 @@ public class SettingsActivity extends PreferenceActivity {
}
@Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- switch (requestCode) {
- case REQUEST_CODE_KEYSERVER_PREF: {
- if (resultCode == RESULT_CANCELED || data == null) {
- return;
- }
- String servers[] = data
- .getStringArrayExtra(SettingsKeyServerActivity.EXTRA_KEY_SERVERS);
- sPreferences.setKeyServers(servers);
- mKeyServerPreference.setSummary(keyserverSummary(this));
- break;
- }
-
- default: {
- super.onActivityResult(requestCode, resultCode, data);
- break;
- }
- }
- }
-
- @Override
public void onBuildHeaders(List<Header> target) {
super.onBuildHeaders(target);
loadHeadersFromResource(R.xml.preference_headers, target);
}
/**
- * This fragment shows the Cloud Search preferences in android 3.0+
+ * This fragment shows the Cloud Search preferences
*/
public static class CloudSearchPrefsFragment extends PreferenceFragment {
@@ -207,12 +170,7 @@ public class SettingsActivity extends PreferenceActivity {
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_KEYSERVER_PREF: {
- if (resultCode == RESULT_CANCELED || data == null) {
- return;
- }
- String servers[] = data
- .getStringArrayExtra(SettingsKeyServerActivity.EXTRA_KEY_SERVERS);
- sPreferences.setKeyServers(servers);
+ // update preference, in case it changed
mKeyServerPreference.setSummary(keyserverSummary(getActivity()));
break;
}
@@ -226,7 +184,7 @@ public class SettingsActivity extends PreferenceActivity {
}
/**
- * This fragment shows the advanced preferences in android 3.0+
+ * This fragment shows the PIN/password preferences
*/
public static class AdvancedPrefsFragment extends PreferenceFragment {
@@ -243,25 +201,6 @@ public class SettingsActivity extends PreferenceActivity {
initializePassphraseCacheTtl(
(IntegerListPreference) findPreference(Constants.Pref.PASSPHRASE_CACHE_TTL));
- int[] valueIds = new int[]{
- CompressionAlgorithmTags.UNCOMPRESSED,
- CompressionAlgorithmTags.ZIP,
- CompressionAlgorithmTags.ZLIB,
- CompressionAlgorithmTags.BZIP2,
- };
-
- String[] entries = new String[]{
- getString(R.string.choice_none) + " (" + getString(R.string.compression_fast) + ")",
- "ZIP (" + getString(R.string.compression_fast) + ")",
- "ZLIB (" + getString(R.string.compression_fast) + ")",
- "BZIP2 (" + getString(R.string.compression_very_slow) + ")",
- };
-
- String[] values = new String[valueIds.length];
- for (int i = 0; i < values.length; ++i) {
- values[i] = "" + valueIds[i];
- }
-
initializeUseDefaultYubiKeyPin(
(CheckBoxPreference) findPreference(Constants.Pref.USE_DEFAULT_YUBIKEY_PIN));
@@ -270,7 +209,6 @@ public class SettingsActivity extends PreferenceActivity {
}
}
- @TargetApi(Build.VERSION_CODES.KITKAT)
protected boolean isValidFragment(String fragmentName) {
return AdvancedPrefsFragment.class.getName().equals(fragmentName)
|| CloudSearchPrefsFragment.class.getName().equals(fragmentName)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyServerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyServerActivity.java
index dc203756f..f61ada84f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyServerActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyServerActivity.java
@@ -17,89 +17,23 @@
package org.sufficientlysecure.keychain.ui;
-import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Messenger;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
-import org.sufficientlysecure.keychain.ui.dialog.AddKeyserverDialogFragment;
-import org.sufficientlysecure.keychain.ui.util.Notify;
-import org.sufficientlysecure.keychain.ui.widget.Editor;
-import org.sufficientlysecure.keychain.ui.widget.Editor.EditorListener;
-import org.sufficientlysecure.keychain.ui.widget.KeyServerEditor;
-import java.util.Vector;
-
-public class SettingsKeyServerActivity extends BaseActivity implements OnClickListener,
- EditorListener {
+public class SettingsKeyServerActivity extends BaseActivity {
public static final String EXTRA_KEY_SERVERS = "key_servers";
- private LayoutInflater mInflater;
- private ViewGroup mEditors;
- private View mAdd;
- private View mRotate;
- private TextView mTitle;
- private TextView mSummary;
-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- // Inflate a "Done"/"Cancel" custom action bar view
- setFullScreenDialogDoneClose(R.string.btn_save,
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- okClicked();
- }
- },
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- cancelClicked();
- }
- });
-
- mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
- mTitle = (TextView) findViewById(R.id.title);
- mSummary = (TextView) findViewById(R.id.summary);
- mSummary.setText(getText(R.string.label_first_keyserver_is_used));
-
- mTitle.setText(R.string.label_keyservers);
-
- mEditors = (ViewGroup) findViewById(R.id.editors);
- mAdd = findViewById(R.id.add);
- mAdd.setOnClickListener(this);
-
- mRotate = findViewById(R.id.rotate);
- mRotate.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- Vector<String> servers = serverList();
- String first = servers.get(0);
- if (first != null) {
- servers.remove(0);
- servers.add(first);
- String[] dummy = {};
- makeServerList(servers.toArray(dummy));
- }
- }
- });
-
Intent intent = getIntent();
String servers[] = intent.getStringArrayExtra(EXTRA_KEY_SERVERS);
- makeServerList(servers);
+ loadFragment(savedInstanceState, servers);
}
@Override
@@ -107,118 +41,22 @@ public class SettingsKeyServerActivity extends BaseActivity implements OnClickLi
setContentView(R.layout.key_server_preference);
}
- private void makeServerList(String[] servers) {
- if (servers != null) {
- mEditors.removeAllViews();
- for (String serv : servers) {
- KeyServerEditor view = (KeyServerEditor) mInflater.inflate(
- R.layout.key_server_editor, mEditors, false);
- view.setEditorListener(this);
- view.setValue(serv);
- mEditors.addView(view);
- }
+ private void loadFragment(Bundle savedInstanceState, String[] keyservers) {
+ // However, if we're being restored from a previous state,
+ // then we don't need to do anything and should return or else
+ // we could end up with overlapping fragments.
+ if (savedInstanceState != null) {
+ return;
}
- }
-
- public void onDeleted(Editor editor, boolean wasNewItem) {
- // nothing to do
- }
- @Override
- public void onEdited() {
+ SettingsKeyserverFragment fragment = SettingsKeyserverFragment.newInstance(keyservers);
- }
-
- // button to add keyserver clicked
- public void onClick(View v) {
- Handler returnHandler = new Handler() {
- @Override
- public void handleMessage(Message message) {
- Bundle data = message.getData();
- switch (message.what) {
- case AddKeyserverDialogFragment.MESSAGE_OKAY: {
- boolean verified = data.getBoolean(AddKeyserverDialogFragment.MESSAGE_VERIFIED);
- if (verified) {
- Notify.create(SettingsKeyServerActivity.this,
- R.string.add_keyserver_verified, Notify.Style.OK).show();
- } else {
- Notify.create(SettingsKeyServerActivity.this,
- R.string.add_keyserver_without_verification,
- Notify.Style.WARN).show();
- }
- String keyserver = data.getString(AddKeyserverDialogFragment.MESSAGE_KEYSERVER);
- addKeyserver(keyserver);
- break;
- }
- case AddKeyserverDialogFragment.MESSAGE_VERIFICATION_FAILED: {
- AddKeyserverDialogFragment.FailureReason failureReason =
- (AddKeyserverDialogFragment.FailureReason) data.getSerializable(
- AddKeyserverDialogFragment.MESSAGE_FAILURE_REASON);
- switch (failureReason) {
- case CONNECTION_FAILED: {
- Notify.create(SettingsKeyServerActivity.this,
- R.string.add_keyserver_connection_failed,
- Notify.Style.ERROR).show();
- break;
- }
- case INVALID_URL: {
- Notify.create(SettingsKeyServerActivity.this,
- R.string.add_keyserver_invalid_url,
- Notify.Style.ERROR).show();
- break;
- }
- }
- break;
- }
- }
- }
- };
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(returnHandler);
- AddKeyserverDialogFragment dialogFragment = AddKeyserverDialogFragment
- .newInstance(messenger);
- dialogFragment.show(getSupportFragmentManager(), "addKeyserverDialog");
- }
-
- public void addKeyserver(String keyserverUrl) {
- KeyServerEditor view = (KeyServerEditor) mInflater.inflate(R.layout.key_server_editor,
- mEditors, false);
- view.setEditorListener(this);
- view.setValue(keyserverUrl);
- mEditors.addView(view);
- }
-
- private void cancelClicked() {
- setResult(RESULT_CANCELED, null);
- finish();
- }
-
- private Vector<String> serverList() {
- Vector<String> servers = new Vector<>();
- for (int i = 0; i < mEditors.getChildCount(); ++i) {
- KeyServerEditor editor = (KeyServerEditor) mEditors.getChildAt(i);
- String tmp = editor.getValue();
- if (tmp.length() > 0) {
- servers.add(tmp);
- }
- }
- return servers;
- }
-
- private void okClicked() {
- Intent data = new Intent();
- Vector<String> servers = new Vector<>();
- for (int i = 0; i < mEditors.getChildCount(); ++i) {
- KeyServerEditor editor = (KeyServerEditor) mEditors.getChildAt(i);
- String tmp = editor.getValue();
- if (tmp.length() > 0) {
- servers.add(tmp);
- }
- }
- String[] dummy = new String[0];
- data.putExtra(EXTRA_KEY_SERVERS, servers.toArray(dummy));
- setResult(RESULT_OK, data);
- finish();
+ // Add the fragment to the 'fragment_container' FrameLayout
+ // NOTE: We use commitAllowingStateLoss() to prevent weird crashes!
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.keyserver_settings_fragment_container, fragment)
+ .commitAllowingStateLoss();
+ // do it immediately!
+ getSupportFragmentManager().executePendingTransactions();
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java
new file mode 100644
index 000000000..2ae64d90b
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java
@@ -0,0 +1,367 @@
+/*
+ * Copyright (C) 2012-2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 Adithya Abraham Philip <adithyaphilip@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.ui;
+
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Messenger;
+import android.support.v4.app.Fragment;
+import android.support.v4.view.MotionEventCompat;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.ui.dialog.AddEditKeyserverDialogFragment;
+import org.sufficientlysecure.keychain.ui.util.recyclerview.ItemTouchHelperAdapter;
+import org.sufficientlysecure.keychain.ui.util.recyclerview.ItemTouchHelperViewHolder;
+import org.sufficientlysecure.keychain.ui.util.recyclerview.ItemTouchHelperDragCallback;
+import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.ui.util.recyclerview.RecyclerItemClickListener;
+import org.sufficientlysecure.keychain.util.Preferences;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class SettingsKeyserverFragment extends Fragment implements RecyclerItemClickListener.OnItemClickListener {
+
+ private static final String ARG_KEYSERVER_ARRAY = "arg_keyserver_array";
+ private ItemTouchHelper mItemTouchHelper;
+
+ private ArrayList<String> mKeyservers;
+ private KeyserverListAdapter mAdapter;
+
+ public static SettingsKeyserverFragment newInstance(String[] keyservers) {
+ Bundle args = new Bundle();
+ args.putStringArray(ARG_KEYSERVER_ARRAY, keyservers);
+
+ SettingsKeyserverFragment fragment = new SettingsKeyserverFragment();
+ fragment.setArguments(args);
+
+ return fragment;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
+ savedInstanceState) {
+
+ return inflater.inflate(R.layout.settings_keyserver_fragment, null);
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ String keyservers[] = getArguments().getStringArray(ARG_KEYSERVER_ARRAY);
+ mKeyservers = new ArrayList<>(Arrays.asList(keyservers));
+
+ mAdapter = new KeyserverListAdapter(mKeyservers);
+
+ RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.keyserver_recycler_view);
+ // recyclerView.setHasFixedSize(true); // the size of the first item changes
+ recyclerView.setAdapter(mAdapter);
+ recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
+
+
+ ItemTouchHelper.Callback callback = new ItemTouchHelperDragCallback(mAdapter);
+ mItemTouchHelper = new ItemTouchHelper(callback);
+ mItemTouchHelper.attachToRecyclerView(recyclerView);
+
+ // for clicks
+ recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), this));
+
+ // can't use item decoration because it doesn't move with drag and drop
+ // recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), null));
+
+ // We have a menu item to show in action bar.
+ setHasOptionsMenu(true);
+ }
+
+ @Override
+ public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
+ inflater.inflate(R.menu.keyserver_pref_menu, menu);
+
+ super.onCreateOptionsMenu(menu, inflater);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+
+ case R.id.menu_add_keyserver:
+ startAddKeyserverDialog();
+ return true;
+
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ private void startAddKeyserverDialog() {
+ // keyserver and position have no meaning
+ startEditKeyserverDialog(AddEditKeyserverDialogFragment.DialogAction.ADD, null, -1);
+ }
+
+ private void startEditKeyserverDialog(AddEditKeyserverDialogFragment.DialogAction action,
+ String keyserver, final int position) {
+ Handler returnHandler = new Handler() {
+ @Override
+ public void handleMessage(Message message) {
+ Bundle data = message.getData();
+ switch (message.what) {
+ case AddEditKeyserverDialogFragment.MESSAGE_OKAY: {
+ boolean deleted =
+ data.getBoolean(AddEditKeyserverDialogFragment.MESSAGE_KEYSERVER_DELETED
+ , false);
+ if (deleted) {
+ Notify.create(getActivity(),
+ getActivity().getString(
+ R.string.keyserver_preference_deleted, mKeyservers.get(position)),
+ Notify.Style.OK)
+ .show();
+ deleteKeyserver(position);
+ return;
+ }
+ boolean verified =
+ data.getBoolean(AddEditKeyserverDialogFragment.MESSAGE_VERIFIED);
+ if (verified) {
+ Notify.create(getActivity(),
+ R.string.add_keyserver_verified, Notify.Style.OK).show();
+ } else {
+ Notify.create(getActivity(),
+ R.string.add_keyserver_without_verification,
+ Notify.Style.WARN).show();
+ }
+ String keyserver = data.getString(
+ AddEditKeyserverDialogFragment.MESSAGE_KEYSERVER);
+
+ AddEditKeyserverDialogFragment.DialogAction dialogAction
+ = (AddEditKeyserverDialogFragment.DialogAction) data.getSerializable(
+ AddEditKeyserverDialogFragment.MESSAGE_DIALOG_ACTION);
+ switch (dialogAction) {
+ case ADD:
+ addKeyserver(keyserver);
+ break;
+ case EDIT:
+ editKeyserver(keyserver, position);
+ break;
+ }
+ break;
+ }
+ case AddEditKeyserverDialogFragment.MESSAGE_VERIFICATION_FAILED: {
+ AddEditKeyserverDialogFragment.FailureReason failureReason =
+ (AddEditKeyserverDialogFragment.FailureReason) data.getSerializable(
+ AddEditKeyserverDialogFragment.MESSAGE_FAILURE_REASON);
+ switch (failureReason) {
+ case CONNECTION_FAILED: {
+ Notify.create(getActivity(),
+ R.string.add_keyserver_connection_failed,
+ Notify.Style.ERROR).show();
+ break;
+ }
+ case INVALID_URL: {
+ Notify.create(getActivity(),
+ R.string.add_keyserver_invalid_url,
+ Notify.Style.ERROR).show();
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+ };
+
+ // Create a new Messenger for the communication back
+ Messenger messenger = new Messenger(returnHandler);
+ AddEditKeyserverDialogFragment dialogFragment = AddEditKeyserverDialogFragment
+ .newInstance(messenger, action, keyserver, position);
+ dialogFragment.show(getFragmentManager(), "addKeyserverDialog");
+ }
+
+ private void addKeyserver(String keyserver) {
+ mKeyservers.add(keyserver);
+ mAdapter.notifyItemInserted(mKeyservers.size() - 1);
+ saveKeyserverList();
+ }
+
+ private void editKeyserver(String newKeyserver, int position) {
+ mKeyservers.set(position, newKeyserver);
+ mAdapter.notifyItemChanged(position);
+ saveKeyserverList();
+ }
+
+ private void deleteKeyserver(int position) {
+ if (mKeyservers.size() == 1) {
+ Notify.create(getActivity(), R.string.keyserver_preference_cannot_delete_last,
+ Notify.Style.ERROR).show();
+ return;
+ }
+ mKeyservers.remove(position);
+ // we use this
+ mAdapter.notifyItemRemoved(position);
+ if (position == 0 && mKeyservers.size() > 0) {
+ // if we deleted the first item, we need the adapter to redraw the new first item
+ mAdapter.notifyItemChanged(0);
+ }
+ saveKeyserverList();
+ }
+
+ private void saveKeyserverList() {
+ String servers[] = mKeyservers.toArray(new String[mKeyservers.size()]);
+ Preferences.getPreferences(getActivity()).setKeyServers(servers);
+ }
+
+ @Override
+ public void onItemClick(View view, int position) {
+ startEditKeyserverDialog(AddEditKeyserverDialogFragment.DialogAction.EDIT,
+ mKeyservers.get(position), position);
+ }
+
+ public class KeyserverListAdapter extends RecyclerView.Adapter<KeyserverListAdapter.ViewHolder>
+ implements ItemTouchHelperAdapter {
+
+ // to update the ViewHolder associated with first item, for when an item is deleted
+ private ViewHolder mFirstItem;
+
+ private final List<String> mKeyservers;
+
+ public KeyserverListAdapter(List<String> keyservers) {
+ mKeyservers = keyservers;
+ }
+
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.settings_keyserver_item, parent, false);
+ ViewHolder viewHolder = new ViewHolder(view);
+ return viewHolder;
+ }
+
+ @Override
+ public void onBindViewHolder(final ViewHolder holder, int position) {
+ if (position == 0) {
+ mFirstItem = holder;
+ }
+ holder.keyserverUrl.setText(mKeyservers.get(position));
+
+ // Start a drag whenever the handle view it touched
+ holder.dragHandleView.setOnTouchListener(new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
+ mItemTouchHelper.startDrag(holder);
+ }
+ return false;
+ }
+ });
+
+ selectUnselectKeyserver(holder, position);
+ }
+
+ private void selectUnselectKeyserver(ViewHolder holder, int position) {
+
+ if (position == 0) {
+ holder.showAsSelectedKeyserver();
+ } else {
+ holder.showAsUnselectedKeyserver();
+ }
+ }
+
+ @Override
+ public void onItemMove(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target,
+ int fromPosition, int toPosition) {
+ Collections.swap(mKeyservers, fromPosition, toPosition);
+ saveKeyserverList();
+ selectUnselectKeyserver((ViewHolder) target, fromPosition);
+ // we don't want source to change color while dragging, therefore we just set
+ // isSelectedKeyserver instead of selectUnselectKeyserver
+ ((ViewHolder) source).isSelectedKeyserver = toPosition == 0;
+
+ notifyItemMoved(fromPosition, toPosition);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mKeyservers.size();
+ }
+
+ public class ViewHolder extends RecyclerView.ViewHolder implements
+ ItemTouchHelperViewHolder {
+
+ public final ViewGroup outerLayout;
+ public final TextView selectedServerLabel;
+ public final TextView keyserverUrl;
+ public final ImageView dragHandleView;
+
+ private boolean isSelectedKeyserver = false;
+
+ public ViewHolder(View itemView) {
+ super(itemView);
+ outerLayout = (ViewGroup) itemView.findViewById(R.id.outer_layout);
+ selectedServerLabel = (TextView) itemView.findViewById(
+ R.id.selected_keyserver_title);
+ keyserverUrl = (TextView) itemView.findViewById(R.id.keyserver_tv);
+ dragHandleView = (ImageView) itemView.findViewById(R.id.drag_handle);
+
+ itemView.setClickable(true);
+ }
+
+ public void showAsSelectedKeyserver() {
+ isSelectedKeyserver = true;
+ selectedServerLabel.setVisibility(View.VISIBLE);
+ outerLayout.setBackgroundColor(getResources().getColor(R.color.android_green_dark));
+ }
+
+ public void showAsUnselectedKeyserver() {
+ isSelectedKeyserver = false;
+ selectedServerLabel.setVisibility(View.GONE);
+ outerLayout.setBackgroundColor(Color.WHITE);
+ }
+
+ @Override
+ public void onItemSelected() {
+ selectedServerLabel.setVisibility(View.GONE);
+ itemView.setBackgroundColor(Color.LTGRAY);
+ }
+
+ @Override
+ public void onItemClear() {
+ if (isSelectedKeyserver) {
+ showAsSelectedKeyserver();
+ } else {
+ showAsUnselectedKeyserver();
+ }
+ }
+ }
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
index e4dff6083..8b49f3b96 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
@@ -17,12 +17,9 @@
package org.sufficientlysecure.keychain.ui;
-import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
import android.support.v4.app.NavUtils;
import android.view.MenuItem;
import android.view.View;
@@ -33,23 +30,30 @@ import android.widget.Toast;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.operations.results.ExportResult;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
-import org.sufficientlysecure.keychain.service.KeychainService;
+import org.sufficientlysecure.keychain.service.ExportKeyringParcel;
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Preferences;
/**
* Sends the selected public key to a keyserver
*/
-public class UploadKeyActivity extends BaseActivity {
+public class UploadKeyActivity extends BaseActivity
+ implements CryptoOperationHelper.Callback<ExportKeyringParcel, ExportResult> {
private View mUploadButton;
private Spinner mKeyServerSpinner;
private Uri mDataUri;
+ // CryptoOperationHelper.Callback vars
+ private String mKeyserver;
+ private Uri mUnifiedKeyringUri;
+ private CryptoOperationHelper<ExportKeyringParcel, ExportResult> mUploadOpHelper;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -89,51 +93,23 @@ public class UploadKeyActivity extends BaseActivity {
setContentView(R.layout.upload_key_activity);
}
- private void uploadKey() {
- // Send all information needed to service to upload key in other thread
- Intent intent = new Intent(this, KeychainService.class);
-
- intent.setAction(KeychainService.ACTION_UPLOAD_KEYRING);
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mUploadOpHelper != null) {
+ mUploadOpHelper.handleActivityResult(requestCode, resultCode, data);
+ }
+ super.onActivityResult(requestCode, resultCode, data);
+ }
- // set data uri as path to keyring
+ private void uploadKey() {
Uri blobUri = KeyRings.buildUnifiedKeyRingUri(mDataUri);
- intent.setData(blobUri);
-
- // fill values for this action
- Bundle data = new Bundle();
+ mUnifiedKeyringUri = blobUri;
String server = (String) mKeyServerSpinner.getSelectedItem();
- data.putString(KeychainService.UPLOAD_KEY_SERVER, server);
-
- intent.putExtra(KeychainService.EXTRA_DATA, data);
-
- // Message is received after uploading is done in KeychainService
- ServiceProgressHandler saveHandler = new ServiceProgressHandler(this) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
-
- Toast.makeText(UploadKeyActivity.this, R.string.msg_crt_upload_success,
- Toast.LENGTH_SHORT).show();
- finish();
- }
- }
- };
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
-
- // show progress dialog
- saveHandler.showProgressDialog(
- getString(R.string.progress_uploading),
- ProgressDialog.STYLE_HORIZONTAL, false);
+ mKeyserver = server;
- // start service with intent
- startService(intent);
+ mUploadOpHelper = new CryptoOperationHelper(this, this, R.string.progress_uploading);
+ mUploadOpHelper.cryptoOperation();
}
@Override
@@ -148,4 +124,30 @@ public class UploadKeyActivity extends BaseActivity {
}
return super.onOptionsItemSelected(item);
}
+
+ @Override
+ public ExportKeyringParcel createOperationInput() {
+ return new ExportKeyringParcel(mKeyserver, mUnifiedKeyringUri);
+ }
+
+ @Override
+ public void onCryptoOperationSuccess(ExportResult result) {
+ Toast.makeText(UploadKeyActivity.this, R.string.msg_crt_upload_success,
+ Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onCryptoOperationCancelled() {
+
+ }
+
+ @Override
+ public void onCryptoOperationError(ExportResult result) {
+ // TODO: Implement proper log for key upload then show error
+ }
+
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
index 5f6a32e5a..d3849c892 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -65,11 +65,13 @@ import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
import org.sufficientlysecure.keychain.service.KeychainService;
import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.ui.base.BaseNfcActivity;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
import org.sufficientlysecure.keychain.ui.util.FormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
@@ -89,7 +91,8 @@ import java.util.ArrayList;
import java.util.HashMap;
public class ViewKeyActivity extends BaseNfcActivity implements
- LoaderManager.LoaderCallbacks<Cursor> {
+ LoaderManager.LoaderCallbacks<Cursor>,
+ CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult> {
public static final String EXTRA_NFC_USER_ID = "nfc_user_id";
public static final String EXTRA_NFC_AID = "nfc_aid";
@@ -105,6 +108,11 @@ public class ViewKeyActivity extends BaseNfcActivity implements
protected Uri mDataUri;
+ // For CryptoOperationHelper.Callback
+ private String mKeyserver;
+ private ArrayList<ParcelableKeyRing> mKeyList;
+ private CryptoOperationHelper<ImportKeyringParcel, ImportKeyResult> mOperationHelper;
+
private TextView mName;
private TextView mStatusText;
private ImageView mStatusImage;
@@ -396,7 +404,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements
private void certifyImmediate() {
Intent intent = new Intent(this, CertifyKeyActivity.class);
- intent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, new long[] {mMasterKeyId});
+ intent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, new long[]{mMasterKeyId});
startCertifyIntent(intent);
}
@@ -486,6 +494,10 @@ public class ViewKeyActivity extends BaseNfcActivity implements
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mOperationHelper != null) {
+ mOperationHelper.handleActivityResult(requestCode, resultCode, data);
+ }
+
if (requestCode == REQUEST_QR_FINGERPRINT && resultCode == Activity.RESULT_OK) {
// If there is an EXTRA_RESULT, that's an error. Just show it.
@@ -651,56 +663,20 @@ public class ViewKeyActivity extends BaseNfcActivity implements
ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null);
ArrayList<ParcelableKeyRing> entries = new ArrayList<>();
entries.add(keyEntry);
-
- // Message is received after importing is done in KeychainService
- ServiceProgressHandler serviceHandler = new ServiceProgressHandler(this) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // get returned data bundle
- Bundle returnData = message.getData();
-
- mIsRefreshing = false;
-
- if (returnData == null) {
- finish();
- return;
- }
- final ImportKeyResult result =
- returnData.getParcelable(OperationResult.EXTRA_RESULT);
- result.createNotify(ViewKeyActivity.this).show();
- }
- }
- };
-
- // fill values for this action
- Bundle data = new Bundle();
+ mKeyList = entries;
// search config
{
Preferences prefs = Preferences.getPreferences(this);
Preferences.CloudSearchPrefs cloudPrefs =
new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver());
- data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);
+ mKeyserver = cloudPrefs.keyserver;
}
- data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, entries);
-
- // Send all information needed to service to query keys in other thread
- Intent intent = new Intent(this, KeychainService.class);
- intent.setAction(KeychainService.ACTION_IMPORT_KEYRING);
- intent.putExtra(KeychainService.EXTRA_DATA, data);
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(serviceHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
-
- // start service with intent
- startService(intent);
+ mOperationHelper = new CryptoOperationHelper<>(
+ this, this, R.string.progress_importing);
+ mOperationHelper.cryptoOperation();
}
private void editKey(Uri dataUri) {
@@ -986,4 +962,33 @@ public class ViewKeyActivity extends BaseNfcActivity implements
public void onLoaderReset(Loader<Cursor> loader) {
}
+
+ // CryptoOperationHelper.Callback functions
+
+ @Override
+ public ImportKeyringParcel createOperationInput() {
+ return new ImportKeyringParcel(mKeyList, mKeyserver);
+ }
+
+ @Override
+ public void onCryptoOperationSuccess(ImportKeyResult result) {
+ mIsRefreshing = false;
+ result.createNotify(this).show();
+ }
+
+ @Override
+ public void onCryptoOperationCancelled() {
+ mIsRefreshing = false;
+ }
+
+ @Override
+ public void onCryptoOperationError(ImportKeyResult result) {
+ mIsRefreshing = false;
+ result.createNotify(this).show();
+ }
+
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java
index c33485adc..6052eec16 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java
@@ -17,15 +17,12 @@
package org.sufficientlysecure.keychain.ui;
-import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
@@ -48,9 +45,10 @@ import com.textuality.keybase.lib.User;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.operations.results.KeybaseVerificationResult;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
-import org.sufficientlysecure.keychain.service.KeychainService;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.service.KeybaseVerificationParcel;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Log;
@@ -59,7 +57,8 @@ import java.util.Hashtable;
import java.util.List;
public class ViewKeyTrustFragment extends LoaderFragment implements
- LoaderManager.LoaderCallbacks<Cursor> {
+ LoaderManager.LoaderCallbacks<Cursor>,
+ CryptoOperationHelper.Callback<KeybaseVerificationParcel, KeybaseVerificationResult> {
public static final String ARG_DATA_URI = "uri";
@@ -76,6 +75,14 @@ public class ViewKeyTrustFragment extends LoaderFragment implements
// for retrieving the key we’re working on
private Uri mDataUri;
+ private Proof mProof;
+
+ // for CryptoOperationHelper,Callback
+ private String mKeybaseProof;
+ private String mKeybaseFingerprint;
+ private CryptoOperationHelper<KeybaseVerificationParcel, KeybaseVerificationResult>
+ mKeybaseOpHelper;
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
View root = super.onCreateView(inflater, superContainer, savedInstanceState);
@@ -349,112 +356,130 @@ public class ViewKeyTrustFragment extends LoaderFragment implements
}
private void verify(final Proof proof, final String fingerprint) {
- Intent intent = new Intent(getActivity(), KeychainService.class);
- Bundle data = new Bundle();
- intent.setAction(KeychainService.ACTION_VERIFY_KEYBASE_PROOF);
- data.putString(KeychainService.KEYBASE_PROOF, proof.toString());
- data.putString(KeychainService.KEYBASE_REQUIRED_FINGERPRINT, fingerprint);
- intent.putExtra(KeychainService.EXTRA_DATA, data);
+ mProof = proof;
+ mKeybaseProof = proof.toString();
+ mKeybaseFingerprint = fingerprint;
mProofVerifyDetail.setVisibility(View.GONE);
- // Create a new Messenger for the communication back after proof work is done
- ServiceProgressHandler handler = new ServiceProgressHandler(getActivity()) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- Bundle returnData = message.getData();
- String msg = returnData.getString(ServiceProgressHandler.DATA_MESSAGE);
- SpannableStringBuilder ssb = new SpannableStringBuilder();
-
- if ((msg != null) && msg.equals("OK")) {
-
- //yay
- String proofUrl = returnData.getString(ServiceProgressHandler.KEYBASE_PROOF_URL);
- String presenceUrl = returnData.getString(ServiceProgressHandler.KEYBASE_PRESENCE_URL);
- String presenceLabel = returnData.getString(ServiceProgressHandler.KEYBASE_PRESENCE_LABEL);
-
- String proofLabel;
- switch (proof.getType()) {
- case Proof.PROOF_TYPE_TWITTER:
- proofLabel = getString(R.string.keybase_twitter_proof);
- break;
- case Proof.PROOF_TYPE_DNS:
- proofLabel = getString(R.string.keybase_dns_proof);
- break;
- case Proof.PROOF_TYPE_WEB_SITE:
- proofLabel = getString(R.string.keybase_web_site_proof);
- break;
- case Proof.PROOF_TYPE_GITHUB:
- proofLabel = getString(R.string.keybase_github_proof);
- break;
- case Proof.PROOF_TYPE_REDDIT:
- proofLabel = getString(R.string.keybase_reddit_proof);
- break;
- default:
- proofLabel = getString(R.string.keybase_a_post);
- break;
- }
+ mKeybaseOpHelper = new CryptoOperationHelper<>(this, this,
+ R.string.progress_verifying_signature);
+ mKeybaseOpHelper.cryptoOperation();
+ }
- ssb.append(getString(R.string.keybase_proof_succeeded));
- StyleSpan bold = new StyleSpan(Typeface.BOLD);
- ssb.setSpan(bold, 0, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- ssb.append("\n\n");
- int length = ssb.length();
- ssb.append(proofLabel);
- if (proofUrl != null) {
- URLSpan postLink = new URLSpan(proofUrl);
- ssb.setSpan(postLink, length, length + proofLabel.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- if (Proof.PROOF_TYPE_DNS == proof.getType()) {
- ssb.append(" ").append(getString(R.string.keybase_for_the_domain)).append(" ");
- } else {
- ssb.append(" ").append(getString(R.string.keybase_fetched_from)).append(" ");
- }
- length = ssb.length();
- URLSpan presenceLink = new URLSpan(presenceUrl);
- ssb.append(presenceLabel);
- ssb.setSpan(presenceLink, length, length + presenceLabel.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- if (Proof.PROOF_TYPE_REDDIT == proof.getType()) {
- ssb.append(", ").
- append(getString(R.string.keybase_reddit_attribution)).
- append(" “").append(proof.getHandle()).append("”, ");
- }
- ssb.append(" ").append(getString(R.string.keybase_contained_signature));
- } else {
- // verification failed!
- msg = returnData.getString(ServiceProgressHandler.DATA_ERROR);
- ssb.append(getString(R.string.keybase_proof_failure));
- if (msg == null) {
- msg = getString(R.string.keybase_unknown_proof_failure);
- }
- StyleSpan bold = new StyleSpan(Typeface.BOLD);
- ssb.setSpan(bold, 0, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- ssb.append("\n\n").append(msg);
- }
- mProofVerifyHeader.setVisibility(View.VISIBLE);
- mProofVerifyDetail.setVisibility(View.VISIBLE);
- mProofVerifyDetail.setMovementMethod(LinkMovementMethod.getInstance());
- mProofVerifyDetail.setText(ssb);
- }
- }
- };
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (mKeybaseOpHelper != null) {
+ mKeybaseOpHelper.handleActivityResult(requestCode, resultCode, data);
+ }
+ }
+
+ // CryptoOperationHelper.Callback methods
+ @Override
+ public KeybaseVerificationParcel createOperationInput() {
+ return new KeybaseVerificationParcel(mKeybaseProof, mKeybaseFingerprint);
+ }
+
+ @Override
+ public void onCryptoOperationSuccess(KeybaseVerificationResult result) {
+
+ result.createNotify(getActivity()).show();
+
+ String proofUrl = result.mProofUrl;
+ String presenceUrl = result.mPresenceUrl;
+ String presenceLabel = result.mPresenceLabel;
+
+ Proof proof = mProof; // TODO: should ideally be contained in result
+
+ String proofLabel;
+ switch (proof.getType()) {
+ case Proof.PROOF_TYPE_TWITTER:
+ proofLabel = getString(R.string.keybase_twitter_proof);
+ break;
+ case Proof.PROOF_TYPE_DNS:
+ proofLabel = getString(R.string.keybase_dns_proof);
+ break;
+ case Proof.PROOF_TYPE_WEB_SITE:
+ proofLabel = getString(R.string.keybase_web_site_proof);
+ break;
+ case Proof.PROOF_TYPE_GITHUB:
+ proofLabel = getString(R.string.keybase_github_proof);
+ break;
+ case Proof.PROOF_TYPE_REDDIT:
+ proofLabel = getString(R.string.keybase_reddit_proof);
+ break;
+ default:
+ proofLabel = getString(R.string.keybase_a_post);
+ break;
+ }
+
+ SpannableStringBuilder ssb = new SpannableStringBuilder();
+
+ ssb.append(getString(R.string.keybase_proof_succeeded));
+ StyleSpan bold = new StyleSpan(Typeface.BOLD);
+ ssb.setSpan(bold, 0, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ ssb.append("\n\n");
+ int length = ssb.length();
+ ssb.append(proofLabel);
+ if (proofUrl != null) {
+ URLSpan postLink = new URLSpan(proofUrl);
+ ssb.setSpan(postLink, length, length + proofLabel.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
+ if (Proof.PROOF_TYPE_DNS == proof.getType()) {
+ ssb.append(" ").append(getString(R.string.keybase_for_the_domain)).append(" ");
+ } else {
+ ssb.append(" ").append(getString(R.string.keybase_fetched_from)).append(" ");
+ }
+ length = ssb.length();
+ URLSpan presenceLink = new URLSpan(presenceUrl);
+ ssb.append(presenceLabel);
+ ssb.setSpan(presenceLink, length, length + presenceLabel.length(), Spanned
+ .SPAN_EXCLUSIVE_EXCLUSIVE);
+ if (Proof.PROOF_TYPE_REDDIT == proof.getType()) {
+ ssb.append(", ").
+ append(getString(R.string.keybase_reddit_attribution)).
+ append(" “").append(proof.getHandle()).append("”, ");
+ }
+ ssb.append(" ").append(getString(R.string.keybase_contained_signature));
+
+ displaySpannableResult(ssb);
+ }
+
+ @Override
+ public void onCryptoOperationCancelled() {
+
+ }
+
+ @Override
+ public void onCryptoOperationError(KeybaseVerificationResult result) {
+
+ result.createNotify(getActivity()).show();
+
+ SpannableStringBuilder ssb = new SpannableStringBuilder();
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(handler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
+ ssb.append(getString(R.string.keybase_proof_failure));
+ String msg = getString(result.getLog().getLast().mType.mMsgId);
+ if (msg == null) {
+ msg = getString(R.string.keybase_unknown_proof_failure);
+ }
+ StyleSpan bold = new StyleSpan(Typeface.BOLD);
+ ssb.setSpan(bold, 0, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ ssb.append("\n\n").append(msg);
+
+ displaySpannableResult(ssb);
+ }
- // show progress dialog
- handler.showProgressDialog(
- getString(R.string.progress_verifying_signature),
- ProgressDialog.STYLE_HORIZONTAL, false
- );
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
- // start service with intent
- getActivity().startService(intent);
+ private void displaySpannableResult(SpannableStringBuilder ssb) {
+ mProofVerifyHeader.setVisibility(View.VISIBLE);
+ mProofVerifyDetail.setVisibility(View.VISIBLE);
+ mProofVerifyDetail.setMovementMethod(LinkMovementMethod.getInstance());
+ mProofVerifyDetail.setText(ssb);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java
index ab25341d3..f8c3b59ea 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java
@@ -21,12 +21,8 @@ package org.sufficientlysecure.keychain.ui;
import java.nio.ByteBuffer;
import java.util.Arrays;
-import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
-import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
@@ -39,16 +35,16 @@ import android.widget.TextView;
import org.spongycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
-import org.sufficientlysecure.keychain.service.KeychainService;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.service.PromoteKeyringParcel;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationFragment;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
-public class ViewKeyYubiKeyFragment extends Fragment
+public class ViewKeyYubiKeyFragment
+ extends CryptoOperationFragment<PromoteKeyringParcel, PromoteKeyResult>
implements LoaderCallbacks<Cursor> {
public static final String ARG_MASTER_KEY_ID = "master_key_id";
@@ -60,6 +56,8 @@ public class ViewKeyYubiKeyFragment extends Fragment
private String mUserId;
private byte[] mCardAid;
private long mMasterKeyId;
+ private long[] mSubKeyIds;
+
private Button vButton;
private TextView vStatus;
@@ -127,50 +125,15 @@ public class ViewKeyYubiKeyFragment extends Fragment
}
public void promoteToSecretKey() {
-
- ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // get returned data bundle
- Bundle returnData = message.getData();
-
- PromoteKeyResult result =
- returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
-
- result.createNotify(getActivity()).show();
- }
-
- }
- };
-
- // Send all information needed to service to decrypt in other thread
- Intent intent = new Intent(getActivity(), KeychainService.class);
-
- // fill values for this action
-
- intent.setAction(KeychainService.ACTION_PROMOTE_KEYRING);
-
- Bundle data = new Bundle();
- data.putLong(KeychainService.PROMOTE_MASTER_KEY_ID, mMasterKeyId);
- data.putByteArray(KeychainService.PROMOTE_CARD_AID, mCardAid);
long[] subKeyIds = new long[mFingerprints.length];
for (int i = 0; i < subKeyIds.length; i++) {
subKeyIds[i] = KeyFormattingUtils.getKeyIdFromFingerprint(mFingerprints[i]);
}
- data.putLongArray(KeychainService.PROMOTE_SUBKEY_IDS, subKeyIds);
- intent.putExtra(KeychainService.EXTRA_DATA, data);
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
- // start service with intent
- getActivity().startService(intent);
+ // mMasterKeyId and mCardAid are already set
+ mSubKeyIds = subKeyIds;
+ cryptoOperation();
}
public static final String[] PROJECTION = new String[]{
@@ -240,4 +203,14 @@ public class ViewKeyYubiKeyFragment extends Fragment
public void onLoaderReset(Loader<Cursor> loader) {
}
+
+ @Override
+ public PromoteKeyringParcel createOperationInput() {
+ return new PromoteKeyringParcel(mMasterKeyId, mCardAid, mSubKeyIds);
+ }
+
+ @Override
+ protected void onCryptoOperationResult(PromoteKeyResult result) {
+ result.createNotify(getActivity()).show();
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
index db88de676..93c6593ab 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
@@ -33,6 +33,7 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
+import org.sufficientlysecure.keychain.operations.ImportOperation;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.ui.util.FormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Highlighter;
@@ -92,8 +93,8 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
}
/** This method returns a list of all selected entries, with public keys sorted
- * before secret keys, see ImportExportOperation for specifics.
- * @see org.sufficientlysecure.keychain.operations.ImportExportOperation
+ * before secret keys, see ImportOperation for specifics.
+ * @see ImportOperation
*/
public ArrayList<ImportKeysListEntry> getSelectedEntries() {
ArrayList<ImportKeysListEntry> result = new ArrayList<>();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java
index a28a5ea59..bede16b2a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java
@@ -94,7 +94,7 @@ public abstract class BaseNfcActivity extends BaseActivity {
public void onNewIntent(Intent intent) {
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
try {
- handleNdefDiscoveredIntent(intent);
+ handleTagDiscoveredIntent(intent);
} catch (CardException e) {
handleNfcError(e);
} catch (IOException e) {
@@ -269,7 +269,7 @@ public abstract class BaseNfcActivity extends BaseActivity {
* This method is called by onNewIntent above upon discovery of an NFC tag.
* It handles initialization and login to the application, subsequently
* calls either nfcCalculateSignature() or nfcDecryptSessionKey(), then
- * finishes the activity with an appropiate result.
+ * finishes the activity with an appropriate result.
*
* On general communication, see also
* http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4_annex-a.aspx
@@ -278,7 +278,7 @@ public abstract class BaseNfcActivity extends BaseActivity {
* on ISO SmartCard Systems specification.
*
*/
- protected void handleNdefDiscoveredIntent(Intent intent) throws IOException {
+ protected void handleTagDiscoveredIntent(Intent intent) throws IOException {
Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CachingCryptoOperationFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CachingCryptoOperationFragment.java
index 87c6ee3ca..17e4e6ede 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CachingCryptoOperationFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CachingCryptoOperationFragment.java
@@ -36,7 +36,8 @@ public abstract class CachingCryptoOperationFragment <T extends Parcelable, S ex
mCachedActionsParcel = null;
}
- protected abstract T createOperationInput();
+ @Override
+ public abstract T createOperationInput();
protected T getCachedActionsParcel() {
return mCachedActionsParcel;
@@ -46,7 +47,7 @@ public abstract class CachingCryptoOperationFragment <T extends Parcelable, S ex
mCachedActionsParcel = cachedActionsParcel;
}
- protected void onCryptoOperationCancelled() {
+ public void onCryptoOperationCancelled() {
mCachedActionsParcel = null;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java
index 764602735..115f52d56 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java
@@ -18,217 +18,78 @@
package org.sufficientlysecure.keychain.ui.base;
-import android.app.Activity;
-import android.app.ProgressDialog;
import android.content.Intent;
-import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
import android.os.Parcelable;
import android.support.v4.app.Fragment;
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.operations.results.InputPendingResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
-import org.sufficientlysecure.keychain.service.KeychainNewService;
-import org.sufficientlysecure.keychain.service.KeychainService;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
-import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
-import org.sufficientlysecure.keychain.ui.NfcOperationActivity;
-import org.sufficientlysecure.keychain.ui.PassphraseDialogActivity;
-import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;
-
/**
* All fragments executing crypto operations need to extend this class.
*/
-public abstract class CryptoOperationFragment <T extends Parcelable, S extends OperationResult>
- extends Fragment {
-
- public static final int REQUEST_CODE_PASSPHRASE = 0x00008001;
- public static final int REQUEST_CODE_NFC = 0x00008002;
-
- private void initiateInputActivity(RequiredInputParcel requiredInput) {
-
- switch (requiredInput.mType) {
- case NFC_KEYTOCARD:
- case NFC_DECRYPT:
- case NFC_SIGN: {
- Intent intent = new Intent(getActivity(), NfcOperationActivity.class);
- intent.putExtra(NfcOperationActivity.EXTRA_REQUIRED_INPUT, requiredInput);
- startActivityForResult(intent, REQUEST_CODE_NFC);
- return;
- }
-
- case PASSPHRASE:
- case PASSPHRASE_SYMMETRIC: {
- Intent intent = new Intent(getActivity(), PassphraseDialogActivity.class);
- intent.putExtra(PassphraseDialogActivity.EXTRA_REQUIRED_INPUT, requiredInput);
- startActivityForResult(intent, REQUEST_CODE_PASSPHRASE);
- return;
- }
- }
-
- throw new RuntimeException("Unhandled pending result!");
- }
-
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (resultCode == Activity.RESULT_CANCELED) {
- onCryptoOperationCancelled();
- return;
- }
-
- switch (requestCode) {
- case REQUEST_CODE_PASSPHRASE: {
- if (resultCode == Activity.RESULT_OK && data != null) {
- CryptoInputParcel cryptoInput =
- data.getParcelableExtra(PassphraseDialogActivity.RESULT_CRYPTO_INPUT);
- cryptoOperation(cryptoInput);
- return;
- }
- break;
- }
-
- case REQUEST_CODE_NFC: {
- if (resultCode == Activity.RESULT_OK && data != null) {
- CryptoInputParcel cryptoInput =
- data.getParcelableExtra(NfcOperationActivity.RESULT_DATA);
- cryptoOperation(cryptoInput);
- return;
- }
- break;
- }
-
- default: {
- super.onActivityResult(requestCode, resultCode, data);
- }
- }
- }
+public abstract class CryptoOperationFragment<T extends Parcelable, S extends OperationResult>
+ extends Fragment implements CryptoOperationHelper.Callback<T, S> {
- protected void dismissProgress() {
+ private CryptoOperationHelper<T, S> mOperationHelper;
- ProgressDialogFragment progressDialogFragment =
- (ProgressDialogFragment) getFragmentManager().findFragmentByTag("progressDialog");
+ public CryptoOperationFragment() {
- if (progressDialogFragment == null) {
- return;
- }
-
- progressDialogFragment.dismissAllowingStateLoss();
+ mOperationHelper = new CryptoOperationHelper<>(this, this);
+ }
+ public void setProgressMessageResource(int id) {
+ mOperationHelper.setProgressMessageResource(id);
}
- protected abstract T createOperationInput();
- protected void cryptoOperation(CryptoInputParcel cryptoInput) {
- cryptoOperation(cryptoInput, true);
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ mOperationHelper.handleActivityResult(requestCode, resultCode, data);
}
+ @Override
+ public abstract T createOperationInput();
+
protected void cryptoOperation() {
cryptoOperation(new CryptoInputParcel());
}
- protected void cryptoOperation(CryptoInputParcel cryptoInput, boolean showProgress) {
-
- T operationInput = createOperationInput();
- if (operationInput == null) {
- return;
- }
-
- // Send all information needed to service to edit key in other thread
- Intent intent = new Intent(getActivity(), KeychainNewService.class);
-
- intent.putExtra(KeychainNewService.EXTRA_OPERATION_INPUT, operationInput);
- intent.putExtra(KeychainNewService.EXTRA_CRYPTO_INPUT, cryptoInput);
-
- ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
-
- // get returned data bundle
- Bundle returnData = message.getData();
- if (returnData == null) {
- return;
- }
-
- final OperationResult result =
- returnData.getParcelable(OperationResult.EXTRA_RESULT);
-
- onHandleResult(result);
- }
- }
-
- @Override
- protected void onSetProgress(String msg, int progress, int max) {
- // allow handling of progress in fragment, or delegate upwards
- if ( ! onCryptoSetProgress(msg, progress, max)) {
- super.onSetProgress(msg, progress, max);
- }
- }
- };
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
-
- if (showProgress) {
- saveHandler.showProgressDialog(
- getString(R.string.progress_building_key),
- ProgressDialog.STYLE_HORIZONTAL, false);
- }
-
- getActivity().startService(intent);
-
+ protected void cryptoOperation(CryptoInputParcel cryptoInput) {
+ cryptoOperation(cryptoInput, true);
}
- protected void onCryptoOperationResult(S result) {
- if (result.success()) {
- onCryptoOperationSuccess(result);
- } else {
- onCryptoOperationError(result);
- }
+ protected void cryptoOperation(CryptoInputParcel cryptoInput, boolean showProgress) {
+ mOperationHelper.cryptoOperation(cryptoInput, showProgress);
}
- abstract protected void onCryptoOperationSuccess(S result);
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
- protected void onCryptoOperationError(S result) {
+ @Override
+ public void onCryptoOperationError(S result) {
+ onCryptoOperationResult(result);
result.createNotify(getActivity()).show();
}
- protected void onCryptoOperationCancelled() {
+ @Override
+ public void onCryptoOperationCancelled() {
}
- public void onHandleResult(OperationResult result) {
-
- if (result instanceof InputPendingResult) {
- InputPendingResult pendingResult = (InputPendingResult) result;
- if (pendingResult.isPending()) {
- RequiredInputParcel requiredInput = pendingResult.getRequiredInputParcel();
- initiateInputActivity(requiredInput);
- return;
- }
- }
-
- dismissProgress();
-
- try {
- // noinspection unchecked, because type erasure :(
- onCryptoOperationResult((S) result);
- } catch (ClassCastException e) {
- throw new AssertionError("bad return class ("
- + result.getClass().getSimpleName() + "), this is a programming error!");
- }
-
+ @Override
+ public void onCryptoOperationSuccess(S result) {
+ onCryptoOperationResult(result);
}
- protected boolean onCryptoSetProgress(String msg, int progress, int max) {
- return false;
+ /**
+ *
+ * To be overriden by subclasses, if desired. Provides a way to access the method by the
+ * same name in CryptoOperationHelper, if super.onCryptoOperationSuccess and
+ * super.onCryptoOperationError are called at the start of the respective functions in the
+ * subclass overriding them
+ * @param result
+ */
+ protected void onCryptoOperationResult(S result) {
}
-
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java
new file mode 100644
index 000000000..240dd0972
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java
@@ -0,0 +1,326 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ * Copyright (C) 2015 Adithya Abraham Philip <adithyaphilip@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.ui.base;
+
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.Parcelable;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+
+import android.support.v4.app.FragmentManager;
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.operations.results.InputPendingResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
+import org.sufficientlysecure.keychain.service.KeychainService;
+import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
+import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
+import org.sufficientlysecure.keychain.ui.NfcOperationActivity;
+import org.sufficientlysecure.keychain.ui.PassphraseDialogActivity;
+import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;
+import org.sufficientlysecure.keychain.util.Log;
+
+/**
+ * Designed to be integrated into activities or fragments used for CryptoOperations.
+ * Encapsulates the execution of a crypto operation and handling of input pending cases.s
+ *
+ * @param <T> The type of input parcel sent to the operation
+ * @param <S> The type of result returned by the operation
+ */
+public class CryptoOperationHelper<T extends Parcelable, S extends OperationResult> {
+
+ public interface Callback <T extends Parcelable, S extends OperationResult> {
+ T createOperationInput();
+ void onCryptoOperationSuccess(S result);
+ void onCryptoOperationCancelled();
+ void onCryptoOperationError(S result);
+ boolean onCryptoSetProgress(String msg, int progress, int max);
+ }
+
+ public static final int REQUEST_CODE_PASSPHRASE = 0x00008001;
+ public static final int REQUEST_CODE_NFC = 0x00008002;
+
+ // keeps track of request code used to start an activity from this CryptoOperationHelper.
+ // this is necessary when multiple CryptoOperationHelpers are used in the same fragment/activity
+ // otherwise all CryptoOperationHandlers may respond to the same onActivityResult
+ private int mRequestedCode = -1;
+
+ private int mProgressMessageResource;
+
+ private FragmentActivity mActivity;
+ private Fragment mFragment;
+ private Callback<T, S> mCallback;
+
+ private boolean mUseFragment; // short hand for mActivity == null
+
+ /**
+ * If OperationHelper is being integrated into an activity
+ *
+ * @param activity
+ */
+ public CryptoOperationHelper(FragmentActivity activity, Callback<T, S> callback, int progressMessageString) {
+ mActivity = activity;
+ mUseFragment = false;
+ mCallback = callback;
+ mProgressMessageResource = progressMessageString;
+ }
+
+ /**
+ * if OperationHelper is being integrated into a fragment
+ *
+ * @param fragment
+ */
+ public CryptoOperationHelper(Fragment fragment, Callback<T, S> callback, int progressMessageString) {
+ mFragment = fragment;
+ mUseFragment = true;
+ mProgressMessageResource = progressMessageString;
+ mCallback = callback;
+ }
+
+ /**
+ * if OperationHelper is being integrated into a fragment with default message for the progress dialog
+ *
+ * @param fragment
+ */
+ public CryptoOperationHelper(Fragment fragment, Callback<T, S> callback) {
+ mFragment = fragment;
+ mUseFragment = true;
+ mProgressMessageResource = R.string.progress_building_key;
+ mCallback = callback;
+ }
+
+ public void setProgressMessageResource(int id) {
+ mProgressMessageResource = id;
+ }
+
+ private void initiateInputActivity(RequiredInputParcel requiredInput) {
+
+ Activity activity = mUseFragment ? mFragment.getActivity() : mActivity;
+
+ switch (requiredInput.mType) {
+ case NFC_MOVE_KEY_TO_CARD:
+ case NFC_DECRYPT:
+ case NFC_SIGN: {
+ Intent intent = new Intent(activity, NfcOperationActivity.class);
+ intent.putExtra(NfcOperationActivity.EXTRA_REQUIRED_INPUT, requiredInput);
+ mRequestedCode = REQUEST_CODE_NFC;
+ if (mUseFragment) {
+ mFragment.startActivityForResult(intent, mRequestedCode);
+ } else {
+ mActivity.startActivityForResult(intent, mRequestedCode);
+ }
+ return;
+ }
+
+ case PASSPHRASE:
+ case PASSPHRASE_SYMMETRIC: {
+ Intent intent = new Intent(activity, PassphraseDialogActivity.class);
+ intent.putExtra(PassphraseDialogActivity.EXTRA_REQUIRED_INPUT, requiredInput);
+ mRequestedCode = REQUEST_CODE_PASSPHRASE;
+ if (mUseFragment) {
+ mFragment.startActivityForResult(intent, mRequestedCode);
+ } else {
+ mActivity.startActivityForResult(intent, mRequestedCode);
+ }
+ return;
+ }
+ }
+
+ throw new RuntimeException("Unhandled pending result!");
+ }
+
+ /**
+ * Attempts the result of an activity started by this helper. Returns true if requestCode is recognized,
+ * false otherwise.
+ *
+ * @param requestCode
+ * @param resultCode
+ * @param data
+ * @return true if requestCode was recognized, false otherwise
+ */
+ public boolean handleActivityResult(int requestCode, int resultCode, Intent data) {
+ Log.d(Constants.TAG, "received activity result in OperationHelper");
+
+ if (mRequestedCode != requestCode) {
+ // this wasn't meant for us to handle
+ return false;
+ } else {
+ mRequestedCode = -1;
+ }
+ if (resultCode == Activity.RESULT_CANCELED) {
+ mCallback.onCryptoOperationCancelled();
+ return true;
+ }
+
+ switch (requestCode) {
+ case REQUEST_CODE_PASSPHRASE: {
+ if (resultCode == Activity.RESULT_OK && data != null) {
+ CryptoInputParcel cryptoInput =
+ data.getParcelableExtra(PassphraseDialogActivity.RESULT_CRYPTO_INPUT);
+ cryptoOperation(cryptoInput);
+ return true;
+ }
+ break;
+ }
+
+ case REQUEST_CODE_NFC: {
+ if (resultCode == Activity.RESULT_OK && data != null) {
+ CryptoInputParcel cryptoInput =
+ data.getParcelableExtra(NfcOperationActivity.RESULT_DATA);
+ cryptoOperation(cryptoInput);
+ return true;
+ }
+ break;
+ }
+
+ default: {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ protected void dismissProgress() {
+ FragmentManager fragmentManager =
+ mUseFragment ? mFragment.getFragmentManager() :
+ mActivity.getSupportFragmentManager();
+
+ if (fragmentManager == null) { // the fragment holding us has died
+ // fragmentManager was null when used with DialogFragments. (they close on click?)
+ return;
+ }
+
+ ProgressDialogFragment progressDialogFragment =
+ (ProgressDialogFragment) fragmentManager.findFragmentByTag(
+ ServiceProgressHandler.TAG_PROGRESS_DIALOG);
+
+ if (progressDialogFragment == null) {
+ return;
+ }
+
+ progressDialogFragment.dismissAllowingStateLoss();
+
+ }
+
+ public void cryptoOperation(CryptoInputParcel cryptoInput, boolean showProgress) {
+
+ FragmentActivity activity = mUseFragment ? mFragment.getActivity() : mActivity;
+
+ T operationInput = mCallback.createOperationInput();
+ if (operationInput == null) {
+ return;
+ }
+
+ // Send all information needed to service to edit key in other thread
+ Intent intent = new Intent(activity, KeychainService.class);
+
+ intent.putExtra(KeychainService.EXTRA_OPERATION_INPUT, operationInput);
+ intent.putExtra(KeychainService.EXTRA_CRYPTO_INPUT, cryptoInput);
+
+ ServiceProgressHandler saveHandler = new ServiceProgressHandler(activity) {
+ @Override
+ public void handleMessage(Message message) {
+ // handle messages by standard KeychainIntentServiceHandler first
+ super.handleMessage(message);
+
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
+
+ // get returned data bundle
+ Bundle returnData = message.getData();
+ if (returnData == null) {
+ return;
+ }
+
+ final OperationResult result =
+ returnData.getParcelable(OperationResult.EXTRA_RESULT);
+
+ onHandleResult(result);
+ }
+ }
+
+ @Override
+ protected void onSetProgress(String msg, int progress, int max) {
+ // allow handling of progress in fragment, or delegate upwards
+ if ( ! mCallback.onCryptoSetProgress(msg, progress, max)) {
+ super.onSetProgress(msg, progress, max);
+ }
+ }
+ };
+
+ // Create a new Messenger for the communication back
+ Messenger messenger = new Messenger(saveHandler);
+ intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
+
+ if (showProgress) {
+ saveHandler.showProgressDialog(
+ activity.getString(mProgressMessageResource),
+ ProgressDialog.STYLE_HORIZONTAL, false);
+ }
+
+ activity.startService(intent);
+ }
+
+ public void cryptoOperation(CryptoInputParcel cryptoInputParcel) {
+ cryptoOperation(cryptoInputParcel, true);
+ }
+
+ public void cryptoOperation() {
+ cryptoOperation(new CryptoInputParcel());
+ }
+
+ protected void onCryptoOperationResult(S result) {
+ if (result.success()) {
+ mCallback.onCryptoOperationSuccess(result);
+ } else {
+ mCallback.onCryptoOperationError(result);
+ }
+ }
+
+ public void onHandleResult(OperationResult result) {
+ Log.d(Constants.TAG, "Handling result in OperationHelper success: " + result.success());
+
+ if (result instanceof InputPendingResult) {
+ InputPendingResult pendingResult = (InputPendingResult) result;
+ if (pendingResult.isPending()) {
+
+ RequiredInputParcel requiredInput = pendingResult.getRequiredInputParcel();
+ initiateInputActivity(requiredInput);
+ return;
+ }
+ }
+
+ dismissProgress();
+
+ try {
+ // noinspection unchecked, because type erasure :(
+ onCryptoOperationResult((S) result);
+ } catch (ClassCastException e) {
+ throw new AssertionError("bad return class ("
+ + result.getClass().getSimpleName() + "), this is a programming error!");
+ }
+
+ }
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddKeyserverDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java
index 2c1714b67..321242b2f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddKeyserverDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java
@@ -53,8 +53,11 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.TlsHelper;
-public class AddKeyserverDialogFragment extends DialogFragment implements OnEditorActionListener {
- private static final String ARG_MESSENGER = "messenger";
+public class AddEditKeyserverDialogFragment extends DialogFragment implements OnEditorActionListener {
+ private static final String ARG_MESSENGER = "arg_messenger";
+ private static final String ARG_ACTION = "arg_dialog_action";
+ private static final String ARG_POSITION = "arg_position";
+ private static final String ARG_KEYSERVER = "arg_keyserver";
public static final int MESSAGE_OKAY = 1;
public static final int MESSAGE_VERIFICATION_FAILED = 2;
@@ -62,20 +65,37 @@ public class AddKeyserverDialogFragment extends DialogFragment implements OnEdit
public static final String MESSAGE_KEYSERVER = "new_keyserver";
public static final String MESSAGE_VERIFIED = "verified";
public static final String MESSAGE_FAILURE_REASON = "failure_reason";
+ public static final String MESSAGE_KEYSERVER_DELETED = "keyserver_deleted";
+ public static final String MESSAGE_DIALOG_ACTION = "message_dialog_action";
+ public static final String MESSAGE_EDIT_POSITION = "keyserver_edited_position";
private Messenger mMessenger;
+ private DialogAction mDialogAction;
+ private int mPosition;
+
private EditText mKeyserverEditText;
private CheckBox mVerifyKeyserverCheckBox;
+ public enum DialogAction {
+ ADD,
+ EDIT
+ }
+
public enum FailureReason {
INVALID_URL,
CONNECTION_FAILED
}
- public static AddKeyserverDialogFragment newInstance(Messenger messenger) {
- AddKeyserverDialogFragment frag = new AddKeyserverDialogFragment();
+ public static AddEditKeyserverDialogFragment newInstance(Messenger messenger,
+ DialogAction action,
+ String keyserver,
+ int position) {
+ AddEditKeyserverDialogFragment frag = new AddEditKeyserverDialogFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_MESSENGER, messenger);
+ args.putSerializable(ARG_ACTION, action);
+ args.putString(ARG_KEYSERVER, keyserver);
+ args.putInt(ARG_POSITION, position);
frag.setArguments(args);
@@ -88,11 +108,11 @@ public class AddKeyserverDialogFragment extends DialogFragment implements OnEdit
final Activity activity = getActivity();
mMessenger = getArguments().getParcelable(ARG_MESSENGER);
+ mDialogAction = (DialogAction) getArguments().getSerializable(ARG_ACTION);
+ mPosition = getArguments().getInt(ARG_POSITION);
CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
- alert.setTitle(R.string.add_keyserver_dialog_title);
-
LayoutInflater inflater = activity.getLayoutInflater();
View view = inflater.inflate(R.layout.add_keyserver_dialog, null);
alert.setView(view);
@@ -100,14 +120,26 @@ public class AddKeyserverDialogFragment extends DialogFragment implements OnEdit
mKeyserverEditText = (EditText) view.findViewById(R.id.keyserver_url_edit_text);
mVerifyKeyserverCheckBox = (CheckBox) view.findViewById(R.id.verify_keyserver_checkbox);
- // we don't want dialog to be dismissed on click, thereby requiring the hack seen below
- // and in onStart
+ switch (mDialogAction) {
+ case ADD: {
+ alert.setTitle(R.string.add_keyserver_dialog_title);
+ break;
+ }
+ case EDIT: {
+ alert.setTitle(R.string.edit_keyserver_dialog_title);
+ mKeyserverEditText.setText(getArguments().getString(ARG_KEYSERVER));
+ break;
+ }
+ }
+
+ // we don't want dialog to be dismissed on click for keyserver addition or edit,
+ // thereby requiring the hack seen below and in onStart
alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
// we need to have an empty listener to prevent errors on some devices as mentioned
// at http://stackoverflow.com/q/13746412/3000919
- // actual listener set in onStart
+ // actual listener set in onStart for adding keyservers or editing them
}
});
@@ -119,6 +151,23 @@ public class AddKeyserverDialogFragment extends DialogFragment implements OnEdit
}
});
+ switch (mDialogAction) {
+ case EDIT: {
+ alert.setNeutralButton(R.string.label_keyserver_dialog_delete,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ deleteKeyserver(mPosition);
+ }
+ });
+ break;
+ }
+ case ADD: {
+ // do nothing
+ break;
+ }
+ }
+
// Hack to open keyboard.
// This is the only method that I found to work across all Android versions
// http://turbomanage.wordpress.com/2012/05/02/show-soft-keyboard-automatically-when-edittext-receives-focus/
@@ -155,25 +204,41 @@ public class AddKeyserverDialogFragment extends DialogFragment implements OnEdit
positiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
+ // behaviour same for edit and add
String keyserverUrl = mKeyserverEditText.getText().toString();
if (mVerifyKeyserverCheckBox.isChecked()) {
verifyConnection(keyserverUrl);
} else {
dismiss();
// return unverified keyserver back to activity
- addKeyserver(keyserverUrl, false);
+ keyserverEdited(keyserverUrl, false);
}
}
});
}
}
- public void addKeyserver(String keyserver, boolean verified) {
+ public void keyserverEdited(String keyserver, boolean verified) {
dismiss();
Bundle data = new Bundle();
+ data.putSerializable(MESSAGE_DIALOG_ACTION, mDialogAction);
data.putString(MESSAGE_KEYSERVER, keyserver);
data.putBoolean(MESSAGE_VERIFIED, verified);
+ if (mDialogAction == DialogAction.EDIT) {
+ data.putInt(MESSAGE_EDIT_POSITION, mPosition);
+ }
+
+ sendMessageToHandler(MESSAGE_OKAY, data);
+ }
+
+ public void deleteKeyserver(int position) {
+ dismiss();
+ Bundle data = new Bundle();
+ data.putSerializable(MESSAGE_DIALOG_ACTION, DialogAction.EDIT);
+ data.putInt(MESSAGE_EDIT_POSITION, position);
+ data.putBoolean(MESSAGE_KEYSERVER_DELETED, true);
+
sendMessageToHandler(MESSAGE_OKAY, data);
}
@@ -238,7 +303,7 @@ public class AddKeyserverDialogFragment extends DialogFragment implements OnEdit
protected void onPostExecute(FailureReason failureReason) {
mProgressDialog.dismiss();
if (failureReason == null) {
- addKeyserver(mKeyserver, true);
+ keyserverEdited(mKeyserver, true);
} else {
verificationFailed(failureReason);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java
index 076876b5b..7fc9da9ec 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java
@@ -18,7 +18,6 @@
package org.sufficientlysecure.keychain.ui.dialog;
import android.app.Dialog;
-import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
@@ -33,16 +32,20 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.operations.results.DeleteResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.service.KeychainService;
+import org.sufficientlysecure.keychain.service.DeleteKeyringParcel;
import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import org.sufficientlysecure.keychain.util.Log;
import java.util.HashMap;
-public class DeleteKeyDialogFragment extends DialogFragment {
+public class DeleteKeyDialogFragment extends DialogFragment
+ implements CryptoOperationHelper.Callback<DeleteKeyringParcel, DeleteResult> {
private static final String ARG_MESSENGER = "messenger";
private static final String ARG_DELETE_MASTER_KEY_IDS = "delete_master_key_ids";
@@ -52,6 +55,13 @@ public class DeleteKeyDialogFragment extends DialogFragment {
private TextView mMainMessage;
private View mInflateView;
+ private Messenger mMessenger;
+
+ // for CryptoOperationHelper.Callback
+ private long[] mMasterKeyIds;
+ private boolean mHasSecret;
+ private CryptoOperationHelper<DeleteKeyringParcel, DeleteResult> mDeleteOpHelper;
+
/**
* Creates new instance of this delete file dialog fragment
*/
@@ -68,9 +78,17 @@ public class DeleteKeyDialogFragment extends DialogFragment {
}
@Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mDeleteOpHelper != null) {
+ mDeleteOpHelper.handleActivityResult(requestCode, resultCode, data);
+ }
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+
+ @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final FragmentActivity activity = getActivity();
- final Messenger messenger = getArguments().getParcelable(ARG_MESSENGER);
+ mMessenger = getArguments().getParcelable(ARG_MESSENGER);
final long[] masterKeyIds = getArguments().getLongArray(ARG_DELETE_MASTER_KEY_IDS);
@@ -129,47 +147,16 @@ public class DeleteKeyDialogFragment extends DialogFragment {
@Override
public void onClick(DialogInterface dialog, int which) {
- // Send all information needed to service to import key in other thread
- Intent intent = new Intent(getActivity(), KeychainService.class);
-
- intent.setAction(KeychainService.ACTION_DELETE);
-
- // Message is received after importing is done in KeychainService
- ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) {
- @Override
- public void handleMessage(Message message) {
- super.handleMessage(message);
- // handle messages by standard KeychainIntentServiceHandler first
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- try {
- Message msg = Message.obtain();
- msg.copyFrom(message);
- messenger.send(msg);
- } catch (RemoteException e) {
- Log.e(Constants.TAG, "messenger error", e);
- }
- }
- }
- };
-
- // fill values for this action
- Bundle data = new Bundle();
- data.putLongArray(KeychainService.DELETE_KEY_LIST, masterKeyIds);
- data.putBoolean(KeychainService.DELETE_IS_SECRET, hasSecret);
- intent.putExtra(KeychainService.EXTRA_DATA, data);
+ mMasterKeyIds = masterKeyIds;
+ mHasSecret = hasSecret;
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
-
- // show progress dialog
- saveHandler.showProgressDialog(getString(R.string.progress_deleting),
- ProgressDialog.STYLE_HORIZONTAL, true);
-
- // start service with intent
- getActivity().startService(intent);
-
- dismiss();
+ mDeleteOpHelper = new CryptoOperationHelper<>
+ (DeleteKeyDialogFragment.this, DeleteKeyDialogFragment.this,
+ R.string.progress_deleting);
+ mDeleteOpHelper.cryptoOperation();
+ // do NOT dismiss here, it'll give
+ // OperationHelper a null fragmentManager
+ // dismiss();
}
});
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@@ -183,4 +170,42 @@ public class DeleteKeyDialogFragment extends DialogFragment {
return builder.show();
}
+ @Override
+ public DeleteKeyringParcel createOperationInput() {
+ return new DeleteKeyringParcel(mMasterKeyIds, mHasSecret);
+ }
+
+ @Override
+ public void onCryptoOperationSuccess(DeleteResult result) {
+ handleResult(result);
+ }
+
+ @Override
+ public void onCryptoOperationCancelled() {
+
+ }
+
+ @Override
+ public void onCryptoOperationError(DeleteResult result) {
+ handleResult(result);
+ }
+
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
+
+ public void handleResult(DeleteResult result) {
+ try {
+ Bundle data = new Bundle();
+ data.putParcelable(OperationResult.EXTRA_RESULT, result);
+ Message msg = Message.obtain();
+ msg.arg1 = ServiceProgressHandler.MessageStatus.OKAY.ordinal();
+ msg.setData(data);
+ mMessenger.send(msg);
+ } catch (RemoteException e) {
+ Log.e(Constants.TAG, "messenger error", e);
+ }
+ dismiss();
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/DividerItemDecoration.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/DividerItemDecoration.java
new file mode 100644
index 000000000..95199bcd5
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/DividerItemDecoration.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.sufficientlysecure.keychain.ui.util.recyclerview;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+public class DividerItemDecoration extends RecyclerView.ItemDecoration {
+
+ private static final int[] ATTRS = new int[]{
+ android.R.attr.listDivider
+ };
+
+ public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
+
+ public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
+
+ private Drawable mDivider;
+
+ private int mOrientation;
+
+ public DividerItemDecoration(Context context, int orientation) {
+ final TypedArray a = context.obtainStyledAttributes(ATTRS);
+ mDivider = a.getDrawable(0);
+ a.recycle();
+ setOrientation(orientation);
+ }
+
+ public void setOrientation(int orientation) {
+ if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
+ throw new IllegalArgumentException("invalid orientation");
+ }
+ mOrientation = orientation;
+ }
+
+ @Override
+ public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
+ if (mOrientation == VERTICAL_LIST) {
+ drawVertical(c, parent);
+ } else {
+ drawHorizontal(c, parent);
+ }
+ }
+
+ public void drawVertical(Canvas c, RecyclerView parent) {
+ final int left = parent.getPaddingLeft();
+ final int right = parent.getWidth() - parent.getPaddingRight();
+
+ final int childCount = parent.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = parent.getChildAt(i);
+ final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
+ .getLayoutParams();
+ final int top = child.getBottom() + params.bottomMargin;
+ final int bottom = top + mDivider.getIntrinsicHeight();
+ mDivider.setBounds(left, top, right, bottom);
+ mDivider.draw(c);
+ }
+ }
+
+ public void drawHorizontal(Canvas c, RecyclerView parent) {
+ final int top = parent.getPaddingTop();
+ final int bottom = parent.getHeight() - parent.getPaddingBottom();
+
+ final int childCount = parent.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = parent.getChildAt(i);
+ final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
+ .getLayoutParams();
+ final int left = child.getRight() + params.rightMargin;
+ final int right = left + mDivider.getIntrinsicHeight();
+ mDivider.setBounds(left, top, right, bottom);
+ mDivider.draw(c);
+ }
+ }
+
+ @Override
+ public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
+ RecyclerView.State state) {
+ if (mOrientation == VERTICAL_LIST) {
+ outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
+ } else {
+ outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
+ }
+ }
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperAdapter.java
new file mode 100644
index 000000000..c691182bf
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperAdapter.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2015 Paul Burke
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.sufficientlysecure.keychain.ui.util.recyclerview;
+
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+
+/**
+ * Interface to listen for a move or dismissal event from a {@link ItemTouchHelper.Callback}.
+ */
+public interface ItemTouchHelperAdapter {
+
+ /**
+ * Called when an item has been dragged far enough to trigger a move. This is called every time
+ * an item is shifted, and <strong>not</strong> at the end of a "drop" event.<br/>
+ * <br/>
+ * Implementations should call {@link RecyclerView.Adapter#notifyItemMoved(int, int)} after
+ * adjusting the underlying data to reflect this move.
+ *
+ * @param fromPosition The start position of the moved item.
+ * @param toPosition Then resolved position of the moved item.
+ * @see RecyclerView#getAdapterPositionFor(RecyclerView.ViewHolder)
+ * @see RecyclerView.ViewHolder#getAdapterPosition()
+ */
+ void onItemMove(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target,
+ int fromPosition, int toPosition);
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperDragCallback.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperDragCallback.java
new file mode 100644
index 000000000..0fd24581d
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperDragCallback.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2015 Paul Burke
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.sufficientlysecure.keychain.ui.util.recyclerview;
+
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+
+/**
+ * An implementation of {@link ItemTouchHelper.Callback} that enables basic drag & drop and
+ * swipe-to-dismiss. Drag events are automatically started by an item long-press.<br/>
+ * </br/>
+ * Expects the <code>RecyclerView.Adapter</code> to listen for {@link
+ * ItemTouchHelperAdapter} callbacks and the <code>RecyclerView.ViewHolder</code> to implement
+ * {@link ItemTouchHelperViewHolder}.
+ */
+public class ItemTouchHelperDragCallback extends ItemTouchHelper.Callback {
+
+ private final ItemTouchHelperAdapter mAdapter;
+
+ public ItemTouchHelperDragCallback(ItemTouchHelperAdapter adapter) {
+ mAdapter = adapter;
+ }
+
+ @Override
+ public boolean isLongPressDragEnabled() {
+ return false;
+ }
+
+ @Override
+ public boolean isItemViewSwipeEnabled() {
+ return false;
+ }
+
+ @Override
+ public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+ // Enable drag and swipe in both directions
+ final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
+ final int swipeFlags = 0;
+ return makeMovementFlags(dragFlags, swipeFlags);
+ }
+
+ @Override
+ public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source,
+ RecyclerView.ViewHolder target) {
+ if (source.getItemViewType() != target.getItemViewType()) {
+ return false;
+ }
+
+ // Notify the adapter of the move
+ mAdapter.onItemMove(source, target, source.getAdapterPosition(), target.getAdapterPosition());
+ return true;
+ }
+
+ @Override
+ public void onSwiped(RecyclerView.ViewHolder viewHolder, int i) {
+ // we don't support swipe
+ }
+
+ @Override
+ public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
+ if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
+ // Let the view holder know that this item is being moved or dragged
+ ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
+ itemViewHolder.onItemSelected();
+ }
+
+ super.onSelectedChanged(viewHolder, actionState);
+ }
+
+ @Override
+ public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+ super.clearView(recyclerView, viewHolder);
+
+ // Tell the view holder it's time to restore the idle state
+ ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
+ itemViewHolder.onItemClear();
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperViewHolder.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperViewHolder.java
new file mode 100644
index 000000000..97e70d71e
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperViewHolder.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 Paul Burke
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.sufficientlysecure.keychain.ui.util.recyclerview;
+
+import android.support.v7.widget.helper.ItemTouchHelper;
+
+/**
+ * Interface to notify an item ViewHolder of relevant callbacks from {@link
+ * android.support.v7.widget.helper.ItemTouchHelper.Callback}.
+ */
+public interface ItemTouchHelperViewHolder {
+
+ /**
+ * Called when the {@link ItemTouchHelper} first registers an item as being moved or swiped.
+ * Implementations should update the item view to indicate it's active state.
+ */
+ void onItemSelected();
+
+
+ /**
+ * Called when the {@link ItemTouchHelper} has completed the move or swipe, and the active item
+ * state should be cleared.
+ */
+ void onItemClear();
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/RecyclerItemClickListener.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/RecyclerItemClickListener.java
new file mode 100644
index 000000000..7efcbb30c
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/RecyclerItemClickListener.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2014 Jacob Tabak
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.sufficientlysecure.keychain.ui.util.recyclerview;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+
+/**
+ * based on http://stackoverflow.com/a/26196831/3000919
+ */
+public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
+ private OnItemClickListener mListener;
+ private boolean mIgnoreTouch = false;
+
+ public interface OnItemClickListener {
+ void onItemClick(View view, int position);
+ }
+
+ GestureDetector mGestureDetector;
+
+ public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
+ mListener = listener;
+ mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
+ @Override
+ public boolean onSingleTapUp(MotionEvent e) {
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
+ if (mIgnoreTouch) {
+ return false;
+ }
+ View childView = view.findChildViewUnder(e.getX(), e.getY());
+ if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
+ mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
+ // TODO: should we move mListener.onItemClick here
+ }
+
+ @Override
+ public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
+ mIgnoreTouch = disallowIntercept;
+ }
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/Editor.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/Editor.java
deleted file mode 100644
index ec91b9fe4..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/Editor.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2010-2014 Thialfihar <thi@thialfihar.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.sufficientlysecure.keychain.ui.widget;
-
-public interface Editor {
- public interface EditorListener {
- public void onDeleted(Editor editor, boolean wasNewItem);
- public void onEdited();
- }
-
- public void setEditorListener(EditorListener listener);
- public boolean needsSaving();
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyServerEditor.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyServerEditor.java
deleted file mode 100644
index 3fd01958a..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyServerEditor.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2010-2014 Thialfihar <thi@thialfihar.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.sufficientlysecure.keychain.ui.widget;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import org.sufficientlysecure.keychain.R;
-
-public class KeyServerEditor extends LinearLayout implements Editor, OnClickListener {
- private EditorListener mEditorListener = null;
-
- ImageButton mDeleteButton;
- TextView mServer;
-
- public KeyServerEditor(Context context) {
- super(context);
- }
-
- public KeyServerEditor(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- protected void onFinishInflate() {
- setDrawingCacheEnabled(true);
- setAlwaysDrawnWithCacheEnabled(true);
-
- mServer = (TextView) findViewById(R.id.server);
-
- mDeleteButton = (ImageButton) findViewById(R.id.delete);
- mDeleteButton.setOnClickListener(this);
-
- super.onFinishInflate();
- }
-
- public void setValue(String value) {
- mServer.setText(value);
- }
-
- public String getValue() {
- return mServer.getText().toString().trim();
- }
-
- public void onClick(View v) {
- final ViewGroup parent = (ViewGroup) getParent();
- if (v == mDeleteButton) {
- parent.removeView(this);
- if (mEditorListener != null) {
- mEditorListener.onDeleted(this, false);
- }
- }
- }
-
- @Override
- public boolean needsSaving() {
- return false;
- }
-
- public void setEditorListener(EditorListener listener) {
- mEditorListener = listener;
- }
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java
index bbc08a2aa..b814f72b2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java
@@ -18,15 +18,14 @@
package org.sufficientlysecure.keychain.util;
import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Messenger;
import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.keyimport.Keyserver;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
-import org.sufficientlysecure.keychain.service.KeychainService;
+import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
+import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import java.util.ArrayList;
import java.util.HashSet;
@@ -35,24 +34,35 @@ import java.util.Locale;
import java.util.Set;
public class EmailKeyHelper {
+ // to import keys, simply use CryptoOperationHelper with this callback
+ public abstract class ImportContactKeysCallback
+ implements CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult> {
- public static void importContacts(Context context, Messenger messenger) {
- importAll(context, messenger, ContactHelper.getContactMails(context));
- }
+ private ArrayList<ParcelableKeyRing> mKeyList;
+ private String mKeyserver;
- public static void importAll(Context context, Messenger messenger, List<String> mails) {
- // Collect all candidates as ImportKeysListEntry (set for deduplication)
- Set<ImportKeysListEntry> entries = new HashSet<>();
- for (String mail : mails) {
- entries.addAll(getEmailKeys(context, mail));
+ public ImportContactKeysCallback(Context context, String keyserver) {
+ this(context, ContactHelper.getContactMails(context), keyserver);
}
- // Put them in a list and import
- ArrayList<ParcelableKeyRing> keys = new ArrayList<>(entries.size());
- for (ImportKeysListEntry entry : entries) {
- keys.add(new ParcelableKeyRing(entry.getFingerprintHex(), entry.getKeyIdHex(), null));
+ public ImportContactKeysCallback(Context context, List<String> mails, String keyserver) {
+ Set<ImportKeysListEntry> entries = new HashSet<>();
+ for (String mail : mails) {
+ entries.addAll(getEmailKeys(context, mail));
+ }
+
+ // Put them in a list and import
+ ArrayList<ParcelableKeyRing> keys = new ArrayList<>(entries.size());
+ for (ImportKeysListEntry entry : entries) {
+ keys.add(new ParcelableKeyRing(entry.getFingerprintHex(), entry.getKeyIdHex(), null));
+ }
+ mKeyList = keys;
+ mKeyserver = keyserver;
+ }
+ @Override
+ public ImportKeyringParcel createOperationInput() {
+ return new ImportKeyringParcel(mKeyList, mKeyserver);
}
- importKeys(context, messenger, keys);
}
public static Set<ImportKeysListEntry> getEmailKeys(Context context, String mail) {
@@ -78,17 +88,6 @@ public class EmailKeyHelper {
return keys;
}
- private static void importKeys(Context context, Messenger messenger, ArrayList<ParcelableKeyRing> keys) {
- Intent importIntent = new Intent(context, KeychainService.class);
- importIntent.setAction(KeychainService.ACTION_IMPORT_KEYRING);
- Bundle importData = new Bundle();
- importData.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keys);
- importIntent.putExtra(KeychainService.EXTRA_DATA, importData);
- importIntent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
-
- context.startService(importIntent);
- }
-
public static List<ImportKeysListEntry> getEmailKeys(String mail, Keyserver keyServer) {
Set<ImportKeysListEntry> keys = new HashSet<>();
try {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java
index 2fd09dc79..9567fc9c0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java
@@ -17,26 +17,26 @@
package org.sufficientlysecure.keychain.util;
-import android.app.ProgressDialog;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
import android.support.v4.app.FragmentActivity;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.ExportResult;
-import org.sufficientlysecure.keychain.service.KeychainService;
-import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.service.ExportKeyringParcel;
+import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import java.io.File;
-public class ExportHelper {
+public class ExportHelper
+ implements CryptoOperationHelper.Callback <ExportKeyringParcel, ExportResult> {
protected File mExportFile;
FragmentActivity mActivity;
+ private CryptoOperationHelper<ExportKeyringParcel, ExportResult> mExportOpHelper;
+ private boolean mExportSecret;
+ private long[] mMasterKeyIds;
+
public ExportHelper(FragmentActivity activity) {
super();
this.mActivity = activity;
@@ -71,60 +71,43 @@ public class ExportHelper {
}, mActivity.getSupportFragmentManager() ,title, message, exportFile, checkMsg);
}
+ // TODO: If ExportHelper requires pending data (see CryptoOPerationHelper), activities using
+ // TODO: this class should be able to call mExportOpHelper.handleActivity
+
/**
* Export keys
*/
public void exportKeys(long[] masterKeyIds, boolean exportSecret) {
Log.d(Constants.TAG, "exportKeys started");
+ mExportSecret = exportSecret;
+ mMasterKeyIds = masterKeyIds; // if masterKeyIds is null it means export all
- // Send all information needed to service to export key in other thread
- final Intent intent = new Intent(mActivity, KeychainService.class);
-
- intent.setAction(KeychainService.ACTION_EXPORT_KEYRING);
-
- // fill values for this action
- Bundle data = new Bundle();
-
- data.putString(KeychainService.EXPORT_FILENAME, mExportFile.getAbsolutePath());
- data.putBoolean(KeychainService.EXPORT_SECRET, exportSecret);
-
- if (masterKeyIds == null) {
- data.putBoolean(KeychainService.EXPORT_ALL, true);
- } else {
- data.putLongArray(KeychainService.EXPORT_KEY_RING_MASTER_KEY_ID, masterKeyIds);
- }
-
- intent.putExtra(KeychainService.EXTRA_DATA, data);
-
- // Message is received after exporting is done in KeychainService
- ServiceProgressHandler exportHandler = new ServiceProgressHandler(mActivity) {
- @Override
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
+ mExportOpHelper = new CryptoOperationHelper(mActivity, this, R.string.progress_exporting);
+ mExportOpHelper.cryptoOperation();
+ }
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // get returned data bundle
- Bundle data = message.getData();
+ @Override
+ public ExportKeyringParcel createOperationInput() {
+ return new ExportKeyringParcel(mMasterKeyIds, mExportSecret, mExportFile.getAbsolutePath());
+ }
- ExportResult result = data.getParcelable(ExportResult.EXTRA_RESULT);
- result.createNotify(mActivity).show();
- }
- }
- };
+ @Override
+ public void onCryptoOperationSuccess(ExportResult result) {
+ result.createNotify(mActivity).show();
+ }
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(exportHandler);
- intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
+ @Override
+ public void onCryptoOperationCancelled() {
- // show progress dialog
- exportHandler.showProgressDialog(
- mActivity.getString(R.string.progress_exporting),
- ProgressDialog.STYLE_HORIZONTAL, false
- );
+ }
- // start service with intent
- mActivity.startService(intent);
+ @Override
+ public void onCryptoOperationError(ExportResult result) {
+ result.createNotify(mActivity).show();
}
+ @Override
+ public boolean onCryptoSetProgress(String msg, int progress, int max) {
+ return false;
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java
index a5b0088c0..713d5f5ea 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java
@@ -138,6 +138,9 @@ public class Preferences {
public String[] getKeyServers() {
String rawData = mSharedPreferences.getString(Constants.Pref.KEY_SERVERS,
Constants.Defaults.KEY_SERVERS);
+ if (rawData.equals("")) {
+ return new String[0];
+ }
Vector<String> servers = new Vector<>();
String chunks[] = rawData.split(",");
for (String c : chunks) {
@@ -150,7 +153,8 @@ public class Preferences {
}
public String getPreferredKeyserver() {
- return getKeyServers()[0];
+ String[] keyservers = getKeyServers();
+ return keyservers.length == 0 ? null : keyservers[0];
}
public void setKeyServers(String[] value) {
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_add_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_add_white_24dp.png
new file mode 100644
index 000000000..694179bd4
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_add_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_reorder_grey_500_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_reorder_grey_500_24dp.png
new file mode 100644
index 000000000..58fe2c52e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_reorder_grey_500_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_add_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_add_white_24dp.png
new file mode 100644
index 000000000..3856041d7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_add_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_reorder_grey_500_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_reorder_grey_500_24dp.png
new file mode 100644
index 000000000..d6abf0936
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_reorder_grey_500_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_add_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_add_white_24dp.png
new file mode 100644
index 000000000..67bb598e5
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_add_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_reorder_grey_500_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_reorder_grey_500_24dp.png
new file mode 100644
index 000000000..0af0cb76d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_reorder_grey_500_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png
new file mode 100644
index 000000000..0fdced8fc
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_reorder_grey_500_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_reorder_grey_500_24dp.png
new file mode 100644
index 000000000..1d9c88d10
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_reorder_grey_500_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png
new file mode 100644
index 000000000..d64c22e9e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/layout/create_yubi_key_blank_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_blank_fragment.xml
new file mode 100644
index 000000000..864e3aecf
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/create_yubi_key_blank_fragment.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fillViewport="true"
+ android:layout_above="@+id/create_key_buttons">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:layout_marginLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/first_time_blank_yubikey" />
+
+ </LinearLayout>
+ </ScrollView>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:background="@color/holo_gray_bright"
+ android:id="@+id/create_key_buttons">
+
+ <TextView
+ android:id="@+id/create_key_back_button"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/btn_back"
+ android:textAllCaps="true"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:drawableLeft="@drawable/ic_chevron_left_grey_24dp"
+ android:drawablePadding="8dp"
+ android:gravity="left|center_vertical"
+ android:clickable="true"
+ style="?android:attr/borderlessButtonStyle"
+ android:layout_gravity="center_vertical" />
+
+ <TextView
+ android:id="@+id/create_key_next_button"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/first_time_blank_yubikey_yes"
+ android:textAllCaps="true"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:drawableRight="@drawable/ic_chevron_right_grey_24dp"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical|right"
+ android:clickable="true"
+ style="?android:attr/borderlessButtonStyle"
+ android:layout_gravity="center_vertical" />
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/create_yubikey_import_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_import_fragment.xml
index e70188e49..e70188e49 100644
--- a/OpenKeychain/src/main/res/layout/create_yubikey_import_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/create_yubi_key_import_fragment.xml
diff --git a/OpenKeychain/src/main/res/layout/create_yubi_key_pin_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_pin_fragment.xml
new file mode 100644
index 000000000..b139a1d61
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/create_yubi_key_pin_fragment.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fillViewport="true"
+ android:layout_above="@+id/create_key_buttons">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:layout_marginLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/create_key_yubi_key_pin_text" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:layout_marginLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/create_key_yubi_key_pin" />
+
+ <TextView
+ android:id="@+id/create_yubi_key_pin"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:layout_marginLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ tools:text="123456" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:layout_marginLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/create_key_yubi_key_admin_pin" />
+
+ <TextView
+ android:id="@+id/create_yubi_key_admin_pin"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:layout_marginLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ tools:text="12345678" />
+
+ </LinearLayout>
+ </ScrollView>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:background="@color/holo_gray_bright"
+ android:id="@+id/create_key_buttons">
+
+ <TextView
+ android:id="@+id/create_key_back_button"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/btn_back"
+ android:textAllCaps="true"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:drawableLeft="@drawable/ic_chevron_left_grey_24dp"
+ android:drawablePadding="8dp"
+ android:gravity="left|center_vertical"
+ android:clickable="true"
+ style="?android:attr/borderlessButtonStyle" />
+
+ <TextView
+ android:id="@+id/create_key_next_button"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/btn_next"
+ android:textAllCaps="true"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:drawableRight="@drawable/ic_chevron_right_grey_24dp"
+ android:drawablePadding="8dp"
+ android:gravity="right|center_vertical"
+ android:clickable="true"
+ style="?android:attr/borderlessButtonStyle" />
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/create_yubi_key_pin_repeat_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_pin_repeat_fragment.xml
new file mode 100644
index 000000000..bd32130ad
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/create_yubi_key_pin_repeat_fragment.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_above="@+id/create_key_buttons"
+ android:fillViewport="true">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:layout_marginTop="16dp"
+ android:text="@string/create_key_yubi_key_pin_repeat_text"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:layout_marginTop="16dp"
+ android:text="@string/create_key_yubi_key_pin"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <EditText
+ android:id="@+id/create_yubi_key_pin_repeat"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginBottom="8dp"
+ android:ems="10"
+ android:hint="@string/create_key_yubi_key_pin_repeat"
+ android:inputType="numberPassword" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:layout_marginTop="16dp"
+ android:text="@string/create_key_yubi_key_admin_pin"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <EditText
+ android:id="@+id/create_yubi_key_admin_pin_repeat"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginBottom="8dp"
+ android:ems="10"
+ android:hint="@string/create_key_yubi_key_admin_pin_repeat"
+ android:inputType="numberPassword" />
+
+ </LinearLayout>
+ </ScrollView>
+
+ <LinearLayout
+ android:id="@+id/create_key_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:background="@color/holo_gray_bright"
+ android:orientation="horizontal">
+
+ <TextView
+ android:id="@+id/create_key_back_button"
+ style="?android:attr/borderlessButtonStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:clickable="true"
+ android:drawableLeft="@drawable/ic_chevron_left_grey_24dp"
+ android:drawablePadding="8dp"
+ android:gravity="left|center_vertical"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:text="@string/btn_back"
+ android:textAllCaps="true"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:id="@+id/create_key_next_button"
+ style="?android:attr/borderlessButtonStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:clickable="true"
+ android:drawablePadding="8dp"
+ android:drawableRight="@drawable/ic_chevron_right_grey_24dp"
+ android:gravity="right|center_vertical"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:text="@string/btn_next"
+ android:textAllCaps="true"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_wait_fragment.xml
index 4e4b53118..4e4b53118 100644
--- a/OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/create_yubi_key_wait_fragment.xml
diff --git a/OpenKeychain/src/main/res/layout/encrypt_text_fragment.xml b/OpenKeychain/src/main/res/layout/encrypt_text_fragment.xml
index 7645918f4..13b85dd88 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_text_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_text_fragment.xml
@@ -6,15 +6,16 @@
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:paddingTop="4dp"
+ android:paddingBottom="4dp"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
android:fillViewport="true">
<EditText
android:id="@+id/encrypt_text_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="4dp"
- android:layout_marginLeft="16dp"
- android:layout_marginRight="16dp"
android:gravity="top"
android:inputType="text|textCapSentences|textMultiLine|textLongMessage"
android:hint="@string/encrypt_content_edit_text_hint" />
diff --git a/OpenKeychain/src/main/res/layout/key_server_preference.xml b/OpenKeychain/src/main/res/layout/key_server_preference.xml
index 5319a3ec0..570d57d9b 100644
--- a/OpenKeychain/src/main/res/layout/key_server_preference.xml
+++ b/OpenKeychain/src/main/res/layout/key_server_preference.xml
@@ -1,94 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:orientation="vertical">
<include
android:id="@+id/toolbar_include"
layout="@layout/toolbar_standalone" />
- <LinearLayout
- android:layout_below="@id/toolbar_include"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical">
-
- <LinearLayout
- android:id="@+id/text_layout"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:orientation="horizontal">
-
- <LinearLayout
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_marginBottom="6sp"
- android:layout_marginLeft="16sp"
- android:layout_marginRight="6sp"
- android:layout_marginTop="6sp"
- android:layout_weight="1"
- android:background="@android:drawable/menuitem_background"
- android:orientation="vertical"
- android:focusable="true">
-
- <TextView
- android:id="@+id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:focusable="true"
- android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceLarge" />
-
- <TextView
- android:id="@+id/summary"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall" />
- </LinearLayout>
-
- <Button
- android:id="@+id/rotate"
- android:layout_width="wrap_content"
- android:layout_height="31dp"
- android:layout_gravity="center_vertical"
- android:layout_marginLeft="4dip"
- android:layout_marginRight="6dip"
- android:text="rotate"
- android:textColor="#ffffffff"
- android:textStyle="bold"
- android:background="@drawable/button_rounded_blue" />
-
- <ImageButton
- android:id="@+id/add"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_margin="10dp"
- android:src="@drawable/plus"
- android:background="@drawable/button_rounded_green" />
- </LinearLayout>
-
- <View
- android:id="@+id/separator"
- android:layout_width="fill_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
-
- <ScrollView
- android:layout_width="fill_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- android:orientation="vertical">
-
- <LinearLayout
- android:id="@+id/editors"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
- </ScrollView>
-
- </LinearLayout>
-
-</RelativeLayout> \ No newline at end of file
+ <TextView
+ android:layout_marginLeft="6sp"
+ android:layout_marginRight="6sp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:text="@string/label_keyservers_title"/>
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="6sp"
+ android:layout_marginRight="6sp"
+ android:layout_marginBottom="6sp"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:text="@string/label_keyserver_settings_hint"/>
+
+ <View
+ style="@style/Divider"/>
+
+ <FrameLayout
+ android:id="@+id/keyserver_settings_fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/preference_toolbar_activity.xml b/OpenKeychain/src/main/res/layout/preference_toolbar.xml
index f17bc30bc..2f54b954e 100644
--- a/OpenKeychain/src/main/res/layout/preference_toolbar_activity.xml
+++ b/OpenKeychain/src/main/res/layout/preference_toolbar.xml
@@ -1,7 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:orientation="vertical">
<include
android:id="@+id/toolbar_include"
diff --git a/OpenKeychain/src/main/res/layout/settings_keyserver_fragment.xml b/OpenKeychain/src/main/res/layout/settings_keyserver_fragment.xml
new file mode 100644
index 000000000..57c81a433
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/settings_keyserver_fragment.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<android.support.v7.widget.RecyclerView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/keyserver_recycler_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" /> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/settings_keyserver_item.xml b/OpenKeychain/src/main/res/layout/settings_keyserver_item.xml
new file mode 100644
index 000000000..338104bda
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/settings_keyserver_item.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/outer_layout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?listPreferredItemHeight">
+
+ <LinearLayout
+ android:id="@+id/keyserver_layout"
+ android:padding="6sp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_toLeftOf="@+id/drag_handle"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/selected_keyserver_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/label_selected_keyserver_title"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textStyle="bold"
+ android:visibility="gone"/>
+
+ <TextView
+ android:id="@+id/keyserver_tv"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/drag_handle"
+ android:layout_width="?listPreferredItemHeight"
+ android:layout_height="?listPreferredItemHeight"
+ android:scaleType="center"
+ android:layout_centerVertical="true"
+ android:layout_alignParentRight="true"
+ android:src="@drawable/ic_reorder_grey_500_24dp" />
+
+ <View
+ android:layout_alignParentBottom="true"
+ style="@style/Divider"/>
+
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/menu/decrypt_item_context_menu.xml b/OpenKeychain/src/main/res/menu/decrypt_item_context_menu.xml
index b825fa498..97bf65c0d 100644
--- a/OpenKeychain/src/main/res/menu/decrypt_item_context_menu.xml
+++ b/OpenKeychain/src/main/res/menu/decrypt_item_context_menu.xml
@@ -9,7 +9,7 @@
<item
android:id="@+id/decrypt_save"
- android:title="@string/btn_save"
+ android:title="@string/btn_save_file"
android:icon="@drawable/ic_action_encrypt_file_24dp"
/>
diff --git a/OpenKeychain/src/main/res/menu/keyserver_pref_menu.xml b/OpenKeychain/src/main/res/menu/keyserver_pref_menu.xml
new file mode 100644
index 000000000..c4002a682
--- /dev/null
+++ b/OpenKeychain/src/main/res/menu/keyserver_pref_menu.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+
+ <item
+ android:id="@+id/menu_add_keyserver"
+ android:title="@string/menu_search"
+ android:icon="@drawable/ic_add_white_24dp"
+ app:showAsAction="always" />
+</menu> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-ar/help_about.md b/OpenKeychain/src/main/res/raw-ar/help_about.md
new file mode 100644
index 000000000..e80a2c766
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ar/help_about.md
@@ -0,0 +1,65 @@
+[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+[http://www.openkeychain.org](http://www.openkeychain.org)
+
+[OpenKeychain](http://www.openkeychain.org) is an OpenPGP implementation for Android.
+
+License: GPLv3+
+
+## Main Developers
+ * Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
+ * Art O Cathain
+ * Ash Hughes
+ * Brian C. Barnes
+ * Bahtiar 'kalkin' Gadimov
+ * Daniel Albert
+ * Daniel Hammann
+ * Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
+ * Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
+ * 'mar-v-in'
+ * Markus Doits
+ * Miroojin Bakshi
+ * Morgan Gangwere
+ * Nikhil Peter Raj
+ * Paul Sarbinowski
+ * 'Senecaso'
+ * Signe Rüsch
+ * Sreeram Boyapati
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
+ * Tim Bray
+
+## Libraries
+ * [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
+ * [SafeSlinger Exchange library](https://github.com/SafeSlingerProject/exchange-android) (MIT License)
+ * [Android Support Libraries](http://developer.android.com/tools/support-library/index.html) (Apache License v2)
+ * [KeybaseLib](https://github.com/timbray/KeybaseLib) (Apache License v2)
+ * [TokenAutoComplete](https://github.com/splitwise/TokenAutoComplete) (Apache License v2)
+ * [MiniDNS](https://github.com/rtreffer/minidns) (Apache License v2)
+ * [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
+ * [ZXing](https://github.com/zxing/zxing) (Apache License v2)
+ * [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
+ * [Snackbar](https://github.com/nispok/snackbar) (MIT License)
+ * [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
+ * [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-ar/help_certification.md b/OpenKeychain/src/main/res/raw-ar/help_certification.md
new file mode 100644
index 000000000..3518adf73
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ar/help_certification.md
@@ -0,0 +1,28 @@
+[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## Key Confirmation
+Without confirmation, you cannot be sure if a key really corresponds to a specific person.
+The simplest way to confirm a key is by scanning the QR Code or exchanging it via NFC.
+To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
+
+## Key Status
+
+<img src="status_signature_verified_cutout_24dp"/>
+Confirmed: You have already confirmed this key, e.g., by scanning the QR Code.
+<img src="status_signature_unverified_cutout_24dp"/>
+Unconfirmed: This key has not been confirmed yet. You cannot be sure if the key really corresponds to a specific person.
+<img src="status_signature_expired_cutout_24dp"/>
+Expired: This key is no longer valid. Only the owner can extend its validity.
+<img src="status_signature_revoked_cutout_24dp"/>
+Revoked: This key is no longer valid. It has been revoked by its owner.
+
+## Advanced Information
+A "key confirmation" in OpenKeychain is implemented by creating a certification according to the OpenPGP standard.
+This certification is a ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) described in the standard by:
+"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
+
+Traditionally, certifications (also with higher certification levels, such as "positive certifications" (0x13)) are organized in OpenPGP's Web of Trust.
+Our model of key confirmation is a much simpler concept to avoid common usability problems related to this Web of Trust.
+We assume that keys are verified only to a certain degree that is still usable enough to be executed "on the go".
+We also do not implement (potentially transitive) trust signatures or an ownertrust database like in GnuPG.
+Furthermore, keys which contain at least one user ID certified by a trusted key will be marked as "confirmed" in the key listings. \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-ar/help_changelog.md b/OpenKeychain/src/main/res/raw-ar/help_changelog.md
new file mode 100644
index 000000000..d45ce636b
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ar/help_changelog.md
@@ -0,0 +1,278 @@
+[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
+## 3.2
+
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
+ * Material design
+ * Integration of QR Code Scanning (New permissions required)
+ * Improved key creation wizard
+ * Fix missing contacts after sync
+ * Requires Android 4
+ * Redesigned key screen
+ * Simplify crypto preferences, better selection of secure ciphers
+ * API: Detached signatures, free selection of signing key,...
+ * Fix: Some valid keys were shown revoked or expired
+ * Don't accept signatures by expired or revoked subkeys
+ * Keybase.io support in advanced view
+ * Method to update all keys at once
+
+
+## 3.1.2
+
+ * Fix key export to files (now for real)
+
+
+## 3.1.1
+
+ * Fix key export to files (they were written partially)
+ * Fix crash on Android 2.3
+
+
+## 3.1
+
+ * Fix crash on Android 5
+ * New certify screen
+ * Secure Exchange directly from key list (SafeSlinger library)
+ * New QR Code program flow
+ * Redesigned decrypt screen
+ * New icon usage and colors
+ * Fix import of secret keys from Symantec Encryption Desktop
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
+
+
+## 3.0.1
+
+ * Better handling of large key imports
+ * Improved subkey selection
+
+
+## 3.0
+
+ * Propose installable compatible apps in apps list
+ * New design for decryption screens
+ * Many fixes for key import, also fixes stripped keys
+ * Honor and display key authenticate flags
+ * User interface to generate custom keys
+ * Fixing user id revocation certificates
+ * New cloud search (searches over traditional keyservers and keybase.io)
+ * Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
+
+
+## 2.9.2
+
+ * Fix keys broken in 2.9.1
+ * Experimental YubiKey support: Decryption now working via API
+
+
+## 2.9.1
+
+ * Split encrypt screen into two
+ * Fix key flags handling (now supporting Mailvelope 0.7 keys)
+ * Improved passphrase handling
+ * Key sharing via SafeSlinger
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Fix usage of stripped keys
+ * SHA256 as default for compatibility
+ * Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
+ * OpenPGP API now handles revoked/expired keys and returns all user ids
+
+
+## 2.9
+
+ * Fixing crashes introduced in v2.8
+ * Experimental ECC support
+ * Experimental YubiKey support: Only signing with imported keys
+
+
+## 2.8
+
+ * So many bugs have been fixed in this release that we focus on the main new features
+ * Key edit: awesome new design, key revocation
+ * Key import: awesome new design, secure keyserver connections via hkps, keyserver resolving via DNS SRV records
+ * New first time screen
+ * New key creation screen: autocompletion of name and email based on your personal Android accounts
+ * File encryption: awesome new design, support for encrypting multiple files
+ * New icons to show status of key (by Brennan Novak)
+ * Important bug fix: Importing of large key collections from a file is now possible
+ * Notification showing cached passphrases
+ * Keys are connected to Android's contacts
+
+This release wouldn't be possible without the work of Vincent Breitmoser (GSoC 2014), mar-v-in (GSoC 2014), Daniel Albert, Art O Cathain, Daniel Haß, Tim Bray, Thialfihar
+
+## 2.7
+
+ * Purple! (Dominik, Vincent)
+ * New key view design (Dominik, Vincent)
+ * New flat Android buttons (Dominik, Vincent)
+ * API fixes (Dominik)
+ * Keybase.io import (Tim Bray)
+
+
+## 2.6.1
+
+ * Some fixes for regression bugs
+
+
+## 2.6
+
+ * Key certifications (thanks to Vincent Breitmoser)
+ * Support for GnuPG partial secret keys (thanks to Vincent Breitmoser)
+ * New design for signature verification
+ * Custom key length (thanks to Greg Witczak)
+ * Fix share-functionality from other apps
+
+
+## 2.5
+
+ * Fix decryption of symmetric OpenPGP messages/files
+ * Refactored key edit screen (thanks to Ash Hughes)
+ * New modern design for encrypt/decrypt screens
+ * OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)
+
+
+## 2.4
+Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
+Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):
+Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Paul Sarbinowski, Sreeram Boyapati, Vincent Breitmoser.
+
+ * New unified key list
+ * Colorized key fingerprint
+ * Support for keyserver ports
+ * Deactivate possibility to generate weak keys
+ * Much more internal work on the API
+ * Certify user ids
+ * Keyserver query based on machine-readable output
+ * Lock navigation drawer on tablets
+ * Suggestions for emails on creation of keys
+ * Search in public key lists
+ * And much more improvements and fixes…
+
+
+## 2.3.1
+
+ * Hotfix for crash when upgrading from old versions
+
+
+## 2.3
+
+ * Remove unnecessary export of public keys when exporting secret key (thanks to Ash Hughes)
+ * Fix setting expiry dates on keys (thanks to Ash Hughes)
+ * More internal fixes when editing keys (thanks to Ash Hughes)
+ * Querying keyservers directly from the import screen
+ * Fix layout and dialog style on Android 2.2-3.0
+ * Fix crash on keys with empty user ids
+ * Fix crash and empty lists when coming back from signing screen
+ * Bouncy Castle (cryptography library) updated from 1.47 to 1.50 and build from source
+ * Fix upload of key from signing screen
+
+
+## 2.2
+
+ * New design with navigation drawer
+ * New public key list design
+ * New public key view
+ * Bug fixes for importing of keys
+ * Key cross-certification (thanks to Ash Hughes)
+ * Handle UTF-8 passwords properly (thanks to Ash Hughes)
+ * First version with new languages (thanks to the contributors on Transifex)
+ * Sharing of keys via QR Codes fixed and improved
+ * Package signature verification for API
+
+
+## 2.1.1
+
+ * API Updates, preparation for K-9 Mail integration
+
+
+## 2.1
+
+ * Lots of bug fixes
+ * New API for developers
+ * PRNG bug fix by Google
+
+
+## 2.0
+
+ * Complete redesign
+ * Share public keys via QR codes, NFC beam
+ * Sign keys
+ * Upload keys to server
+ * Fixes import issues
+ * New AIDL API
+
+
+## 1.0.8
+
+ * Basic keyserver support
+ * App2sd
+ * More choices for passphrase cache: 1, 2, 4, 8, hours
+ * Translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)
+ * Bugfixes
+ * Optimizations
+
+
+## 1.0.7
+
+ * Fixed problem with signature verification of texts with trailing newline
+ * More options for passphrase cache time to live (20, 40, 60 mins)
+
+
+## 1.0.6
+
+ * Account adding crash on Froyo fixed
+ * Secure file deletion
+ * Option to delete key file after import
+ * Stream encryption/decryption (gallery, etc.)
+ * New options (language, force v3 signatures)
+ * Interface changes
+ * Bugfixes
+
+
+## 1.0.5
+
+ * German and Italian translation
+ * Much smaller package, due to reduced BC sources
+ * New preferences GUI
+ * Layout adjustment for localization
+ * Signature bugfix
+
+
+## 1.0.4
+
+ * Fixed another crash caused by some SDK bug with query builder
+
+
+## 1.0.3
+
+ * Fixed crashes during encryption/signing and possibly key export
+
+
+## 1.0.2
+
+ * Filterable key lists
+ * Smarter pre-selection of encryption keys
+ * New Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers
+ * Fixes and additional features (key preselection) for K-9 Mail, new beta build available
+
+
+## 1.0.1
+
+ * GMail account listing was broken in 1.0.0, fixed again
+
+
+## 1.0.0
+
+ * K-9 Mail integration, APG supporting beta build of K-9 Mail
+ * Support of more file managers (including ASTRO)
+ * Slovenian translation
+ * New database, much faster, less memory usage
+ * Defined Intents and content provider for other apps
+ * Bugfixes \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-ar/help_start.md b/OpenKeychain/src/main/res/raw-ar/help_start.md
new file mode 100644
index 000000000..4cc331942
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ar/help_start.md
@@ -0,0 +1,16 @@
+[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## How do I activate OpenKeychain in K-9 Mail?
+To use OpenKeychain with K-9 Mail, you want to follow these steps:
+ 1. Open K-9 Mail and long-tap on the account you want to use OpenKeychain with.
+ 2. Select "Account settings", scroll to the very bottom and click "Cryptography".
+ 3. Click on "OpenPGP Provider" and select OpenKeychain from the list.
+
+## I found a bug in OpenKeychain!
+Please report the bug using the [issue tracker of OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
+
+## Contribute
+If you want to help us developing OpenKeychain by contributing code [follow our small guide on Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
+
+## Translations
+Help translating OpenKeychain! Everybody can participate at [OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-bg/help_about.md b/OpenKeychain/src/main/res/raw-bg/help_about.md
index 9d635d9df..e80a2c766 100644
--- a/OpenKeychain/src/main/res/raw-bg/help_about.md
+++ b/OpenKeychain/src/main/res/raw-bg/help_about.md
@@ -6,8 +6,12 @@
License: GPLv3+
-## Developers
+## Main Developers
* Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
* Tim Bray
- * Vincent Breitmoser
## Libraries
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
@@ -38,9 +57,9 @@ License: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-bg/help_changelog.md b/OpenKeychain/src/main/res/raw-bg/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-bg/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-bg/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-cs/help_about.md b/OpenKeychain/src/main/res/raw-cs/help_about.md
index 9d635d9df..e80a2c766 100644
--- a/OpenKeychain/src/main/res/raw-cs/help_about.md
+++ b/OpenKeychain/src/main/res/raw-cs/help_about.md
@@ -6,8 +6,12 @@
License: GPLv3+
-## Developers
+## Main Developers
* Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
* Tim Bray
- * Vincent Breitmoser
## Libraries
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
@@ -38,9 +57,9 @@ License: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-cs/help_changelog.md b/OpenKeychain/src/main/res/raw-cs/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-cs/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-cs/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-de/help_about.md b/OpenKeychain/src/main/res/raw-de/help_about.md
index ec2501ee6..3932fa748 100644
--- a/OpenKeychain/src/main/res/raw-de/help_about.md
+++ b/OpenKeychain/src/main/res/raw-de/help_about.md
@@ -1,4 +1,4 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (Beachte: Bitte schreibe jeden Satz in eine eigene Zeile, Transifex wird jede Zeile in ein eigenes Übesetzungsfeld setzen!)
[http://www.openkeychain.org](http://www.openkeychain.org)
@@ -6,8 +6,12 @@
Lizenz: GPLv3+
-## Entwickler
+## Hauptentwickler
* Dominik Schürmann (Leitender Entwickler)
+ * Vincent Breitmoser
+
+## Beitragende
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ Lizenz: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG-Entwickler)
* Tim Bray
- * Vincent Breitmoser
## Bibliotheken
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11-Lizenz)
@@ -38,9 +57,9 @@ Lizenz: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache-Lizenz v2)
* [ZXing](https://github.com/zxing/zxing) (Apache-Lizenz v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache-Lizenz v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material-Design)</a> (Apache-Lizenz v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache-Lizenz v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache-Lizenz v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT-Lizenz)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache-Lizenz v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache-Lizenz v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache-Lizenz v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache-Lizenz v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-de/help_certification.md b/OpenKeychain/src/main/res/raw-de/help_certification.md
index 5089301f3..58cf9f6b3 100644
--- a/OpenKeychain/src/main/res/raw-de/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-de/help_certification.md
@@ -1,28 +1,28 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (Beachte: Bitte schreibe jeden Satz in eine eigene Zeile, Transifex wird jede Zeile in ein eigenes Übesetzungsfeld setzen!)
## Schlüsselbestätigung
-Without confirmation, you cannot be sure if a key really corresponds to a specific person.
-The simplest way to confirm a key is by scanning the QR Code or exchanging it via NFC.
-To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
+Ohne Bestätigung können sie nicht wissen, ob ein Schlüssel wirklich zu einer bestimmten Person gehört.
+Der einfachste Weg einen Schlüssel zu bestätigen ist den QR Code zu scannen oder ihn mit NFC auszutauschen.
+Um Schlüssel zwischen mehr als zwei Personen zu bestätigen empfehlen wir die Schlüsseltausch Methode zu benutzen, welche für ihren Schlüssel verfügbar ist.
## Schlüsselstatus
<img src="status_signature_verified_cutout_24dp"/>
-Confirmed: You have already confirmed this key, e.g., by scanning the QR Code.
+Bestätigt: Sie haben bereits den Schlüssel bestätigt, zum Beispiel durch das Scannen eines QR Codes.
<img src="status_signature_unverified_cutout_24dp"/>
-Unconfirmed: This key has not been confirmed yet. You cannot be sure if the key really corresponds to a specific person.
+Unbestätigt: Diese Key wurde noch nicht beglaubigt. Sie können nicht sicher sein, ob dieser Key wirklich zu einer bestimmten Person gehört.
<img src="status_signature_expired_cutout_24dp"/>
-Expired: This key is no longer valid. Only the owner can extend its validity.
+Abgelaufen: Der Key ist nicht mehr gültig. Nur der Besitzer kann die Gültigkeit des Schlüssels verlängern.
<img src="status_signature_revoked_cutout_24dp"/>
-Revoked: This key is no longer valid. It has been revoked by its owner.
+Widerrufen: Dieser Schlüssel ist nicht mehr gültig. Er wurde von dem Besitzer widerrufen.
## Erweiterte Informationen
-A "key confirmation" in OpenKeychain is implemented by creating a certification according to the OpenPGP standard.
-This certification is a ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) described in the standard by:
-"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
+Eine "Schlüsselbestätigung" in OpenKeychain ist implementiert mit dem Erstellen eines Zertifikats bei Beachtung von dem OpenPGP Standard.
+Diese Zertifizierung ist eine ["generische Zertifizierung (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1), im Standard beschrieben durch:
+"Der Ersteller dieser Zertifizierung macht keine Behauptungen darüber, wie gut der Zertifizierer geprüft hat, dass der Schlüsselinhaber tatsächlich die Person ist, die in der Benutzer-ID beschrieben wird."
-Traditionally, certifications (also with higher certification levels, such as "positive certifications" (0x13)) are organized in OpenPGP's Web of Trust.
-Our model of key confirmation is a much simpler concept to avoid common usability problems related to this Web of Trust.
-We assume that keys are verified only to a certain degree that is still usable enough to be executed "on the go".
-We also do not implement (potentially transitive) trust signatures or an ownertrust database like in GnuPG.
-Furthermore, keys which contain at least one user ID certified by a trusted key will be marked as "confirmed" in the key listings. \ No newline at end of file
+Normalerweise sind Zertifizierungen (auch höherer Zertifizierungsniveaus, wie z.B. "positive Zertifizierungen" (0x13)) im OpenPGP-Web of Trust organisiert.
+Unser Modell der Schlüsselbestätigung ist ein viel einfacheres Konzept, um allgemeine Nutzbarkeitsprobleme zu vermeiden, die mit diesem Web of Trust verknüpft sind.
+Wir nehmen an, dass Schlüssel nur bis zu einem gewissen Maß bestätigt werden, dass immer noch nutzbar genug ist, um es unterwegs benutzen zu können.
+Wir implementieren auch nicht (möglicherweise transitive) Vertrauenssignaturen oder eine Besitzervertrauensdatenbank wie in GnuPG.
+Weiter werden Schlüssel, die mindestens eine Benutzer-ID enthalten, die von einem vertrauten Schlüssel unterschrieben ist, in der Schlüsselliste als "bestätigt" markiert. \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-de/help_changelog.md b/OpenKeychain/src/main/res/raw-de/help_changelog.md
index 171c92403..8b845a6b2 100644
--- a/OpenKeychain/src/main/res/raw-de/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-de/help_changelog.md
@@ -1,28 +1,37 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * Erste Version mit kompletter YubiKey-Unterstützung in der Benutzeroberfläche: Schlüssel bearbeiten, YubiKey mit Schlüsseln verbinden,…
* Material-Design
* QR-Scanner-Integration (benötigt neue Berechtigungen)
* Schlüsselerzeugungsassistent verbessert
* Fehlende Kontakte nach Synchronisierung behoben
* Benötigt Android 4
- * Redesigned key screen
- * Simplify crypto preferences, better selection of secure ciphers
- * API: Detached signatures, free selection of signing key,...
- * Fix: Some valid keys were shown revoked or expired
- * Don't accept signatures by expired or revoked subkeys
- * Keybase.io support in advanced view
+ * Neuer Schlüsselbildschirm
+ * Krypto-Einstellungen vereinfacht, bessere Auswahl sicherer Verschlüsselungsverfahren
+ * API: abgetrennte Signaturen, freie Wahl des Signaturschlüssels,...
+ * Behoben: Einige gültige Schlüssel wurden als widerrufen oder abgelaufen angezeigt
+ * Akzeptiert keine Signaturen abgelaufener oder widerrufener Unterschlüssel
+ * Keybase.io-Unterstützung in der erweiterten Ansicht
+ * Möglichkeit, alle Schlüssel auf einmal zu aktualisieren
## 3.1.2
- * Fix key export to files (now for real)
+ * Behoben: Schlüsselexport zu Datei (jetzt wirklich)
## 3.1.1
- * Fix key export to files (they were written partially)
+ * Schlüsselexport zu Datei repariert (sie wurden nur teilweise geschrieben)
* Absturz unter Android 2.3 behoben
@@ -30,47 +39,47 @@
* Absturz unter Android 5 behoben
* Neuer Beglaubigungsbildschirm
- * Secure Exchange directly from key list (SafeSlinger library)
+ * Sicherer Austausch direkt aus der Schlüsselliste (SafeSlinger-Bibliothek)
* Neuer Programmablauf für QR-Codes
- * Redesigned decrypt screen
+ * Neugestalteter Entschlüsselungsbildschirm
* Verwendung neuer Symbole und Farben
- * Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Behoben: Import geheimer Schlüssel aus Symantec Encryption Desktop
+ * Experimentelle YubiKey-Unterstützung: Unterschlüssel-IDs werden jetzt richtig geprüft
## 3.0.1
- * Better handling of large key imports
- * Improved subkey selection
+ * Bessere Verarbeitung von großen Schlüsselimporten
+ * Verbesserte Unterschlüsselauswahl
## 3.0
- * Full support for Yubikey signature generation and decryption!
- * Propose installable compatible apps in apps list
- * New design for decryption screens
- * Many fixes for key import, also fixes stripped keys
- * Honor and display key authenticate flags
- * User interface to generate custom keys
- * Fixing user id revocation certificates
- * New cloud search (searches over traditional keyservers and keybase.io)
- * Support for stripping keys inside OpenKeychain
+ * Kompatible, installierbare Apps in der App-Liste vorschlagen
+ * Neues Design für Entschlüsselungsbildschirme
+ * Viele Fehler beim Schlüsselimport behoben, auch bei gekürzten Schlüsseln
+ * Schlüsselauthentifikations-Attribute berücksichtigen und anzeigen
+ * Benutzeroberfläche zum Erzeugen benutzerdefinierter Schlüssel
+ * Benutzer-ID-Widerrufszertifikate repariert
+ * Neue Cloud-Suche (sucht über traditionelle Schlüsselserver und über keybase.io)
+ * Unterstützung für das Kürzen von Schlüsseln innerhalb von OpenKeychain
+ * Experimentelle YubiKey-Unterstützung: Unterstützung für Signaturerzeugung und Entschlüsselung
## 2.9.2
- * Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Repariere Schlüssel, die in 2.9.1 beschädigt wurden
+ * Experimentelle YubiKey-Unterstützung: Entschlüsselung funktioniert nun via API
## 2.9.1
- * Split encrypt screen into two
- * Fix key flags handling (now supporting Mailvelope 0.7 keys)
- * Improved passphrase handling
- * Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
- * Fix usage of stripped keys
+ * Verschlüsselungsbildschirm in zwei Bildschirme aufgeteilt
+ * Behoben: Fehler bei Handhabung von Schlüsselattributen (unterstützt nun Schlüssel aus Mailvelope 0.7)
+ * Handhabung von Passwörtern verbessert
+ * Schlüsselaustausch mit SafeSlinger
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Nutzung gekürzter Schlüssel repariert
* Standardmäßig SHA256 aufgrund von Kompatibilität
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
* OpenPGP API now handles revoked/expired keys and returns all user ids
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimentelle ECC-Unterstützung
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
@@ -203,7 +212,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
## 1.0.8
* Grundlegende Schlüsselserverunterstützung
- * App2sd
+ * App2SD
* More choices for passphrase cache: 1, 2, 4, 8, hours
* Translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)
* Fehlerbehebungen
diff --git a/OpenKeychain/src/main/res/raw-de/help_start.md b/OpenKeychain/src/main/res/raw-de/help_start.md
index b51aebf62..768d62737 100644
--- a/OpenKeychain/src/main/res/raw-de/help_start.md
+++ b/OpenKeychain/src/main/res/raw-de/help_start.md
@@ -2,15 +2,15 @@
## Wie kann ich OpenKeychain in K-9 Mail nutzen?
Um OpenKeychain mit K-9 Mail zu nutzen, bitte folgenden Schritten folgen:
- 1. Open K-9 Mail and long-tap on the account you want to use OpenKeychain with.
- 2. Select "Account settings", scroll to the very bottom and click "Cryptography".
- 3. Klick auf "OpenPGP Provider" und OpenKeychain in der Liste auswählen.
+ 1. Öffne K-9 Mail und drücke lange auf den Account, mit dem du OpenKeychain nutzen willst.
+ 2. Wähle "Kontoeinstellungen", blättere ganz nach unten und klicke auf "Kryptographie".
+ 3. Drücke auf "OpenPGP-Provider" und OpenKeychain in der Liste auswählen.
## Ich habe einen Fehler in OpenKeychail gefunden!
-Please report the bug using the [issue tracker of OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
+Bitte melde den Fehler mithilfe des [Fehlertrackers von OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
## Unterstützen
-If you want to help us developing OpenKeychain by contributing code [follow our small guide on Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
+Wenn du uns bei der Entwicklung von OpenKeychain, z.B. durch das Beisteuern von Code, helfen willst, [schaue dir unsere kurze Anleitung auf GitHub an](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
## Übersetzungen
-Help translating OpenKeychain! Everybody can participate at [OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
+Hilf mit, OpenKeychain zu übersetzen! Jeder kann mitmachen, [besuche OpenKeychain auf Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-es/help_about.md b/OpenKeychain/src/main/res/raw-es/help_about.md
index bb925e6bd..de39a8146 100644
--- a/OpenKeychain/src/main/res/raw-es/help_about.md
+++ b/OpenKeychain/src/main/res/raw-es/help_about.md
@@ -6,8 +6,12 @@
Licencia: GPLv3+
-## Desarrolladores
+## Desarrolladores principales
* Dominik Schürmann (Mantenedor)
+ * Vincent Breitmoser
+
+## Contribuidores
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ Licencia: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (desarrollador APG)
* Tim Bray
- * Vincent Breitmoser
## Librerías
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (Licencia MIT X11)
@@ -38,9 +57,9 @@ Licencia: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Licencia Apache v2)
* [ZXing](https://github.com/zxing/zxing) (Licencia Apache v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Licencia Apache v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Diseño estilo Material)</a> (Licencia Apache v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Licencia Apache v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Licencia Apache v2)
* [Snackbar](https://github.com/nispok/snackbar) (Licencia MIT)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Licencia Apache v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Licencia Apache v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Licencia Apache v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Licencia Apache v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-es/help_changelog.md b/OpenKeychain/src/main/res/raw-es/help_changelog.md
index 4306f3f08..087392cdf 100644
--- a/OpenKeychain/src/main/res/raw-es/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-es/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTA: ¡Por favor ponga cada frase en su propia línea, Transifex pone cada línea en su propio campo de traducción!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * Primera versión con soporte para YubiKey completo disponible desde la interfaz de usuario: Editar claves, ligar YubiKey a claves...
* Material design (estilo)
- * Integración de QR Scanner (se requieren nuevos permisos)
+ * Integración de Escaneado de Código QR (se requieren nuevos permisos)
* Asistente de creación de clave mejorado
* Repara contactos perdidos después de la sincronización
* Requiere Android 4
@@ -13,6 +21,7 @@
* Reparación: Algunas claves válidas se mostraron revocadas o caducadas
* No acepte algo firmado por subclaves caducadas o revocadas
* Soporte para Keybase.io en la vista avanzada
+ * Método para actualizar todas las claves a la vez
## 3.1.2
@@ -35,7 +44,7 @@
* Pantalla de descifrado rediseñada
* Nuevo uso y colores del icono
* Repara la importación de claves secretas (privadas) desde Symantec Encryption Desktop
- * Las identificaciones de subclaves en Yubikeys ahora se comprueban correctamente
+ * Soporte experimental para YubiKey: Las identificaciones (IDs) de subclaves ahora se comprueban correctamente.
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * ¡Soporte completo para generación de firma y descifrado de Yubikey!
* Propone aplicaciones instalables compatibles en la lista de aplicaciones
* Nuevo diseño para pantallas de descifrado
* Muchas reparaciones para la importación de claves, también repara claves desnudas
@@ -55,12 +63,13 @@
* Repara certificados de revocación de identificación de usuario
* Nueva búsqueda en la nube (busca sobre servidores de claves tradicionales y keybase.io)
* Soporte para desvestir claves dentro de OpenKeychain
+ * Soporte experimental para YubiKey: Soporte para generación de firma y descifrado
## 2.9.2
* Repara claves rotas en la versión 2.9.1
- * El descifrado de Yubikey ahora funciona vía API
+ * Soporte experimental para YubiKey: El descifrado ahora funciona vía API
## 2.9.1
@@ -69,7 +78,7 @@
* Repara el manejo de los indicativos de claves (ahora soporta claves de Mailvelope 0.7)
* Manejo de frase-contraseña mejorado
* Compartición de claves vía SafeSlinger
- * Yubikey: Preferencia para permitir otros PINs, actualmente sólo funciona firmando mediante la API de OpenPGP, no dentro de OpenKeychain
+ * Soporte experimental para YubiKey: Preferencia para permitir otros PINs, actualmente sólo funciona firmando vía API OpenPGP, no desde dentro de OpenKeychain
* Repara el uso de claves desnudas
* SHA256 por defecto para compatibilidad
* La API de Intent ha cambiado, vea https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Repara caídas introducidas en la versión 2.8
* Soporte para ECC (criptografía de curva elíptica) experimental
- * Soporte experimental para Yubikey (sólo-firmante con claves importadas)
+ * Soporte experimental para YubiKey: Firmando sólo con claves importadas
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-et/help_about.md b/OpenKeychain/src/main/res/raw-et/help_about.md
index 9d635d9df..e80a2c766 100644
--- a/OpenKeychain/src/main/res/raw-et/help_about.md
+++ b/OpenKeychain/src/main/res/raw-et/help_about.md
@@ -6,8 +6,12 @@
License: GPLv3+
-## Developers
+## Main Developers
* Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
* Tim Bray
- * Vincent Breitmoser
## Libraries
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
@@ -38,9 +57,9 @@ License: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-et/help_changelog.md b/OpenKeychain/src/main/res/raw-et/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-et/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-et/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-eu/help_about.md b/OpenKeychain/src/main/res/raw-eu/help_about.md
index 9d635d9df..06f2e3fd1 100644
--- a/OpenKeychain/src/main/res/raw-eu/help_about.md
+++ b/OpenKeychain/src/main/res/raw-eu/help_about.md
@@ -1,13 +1,17 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (OHARRA: Meseez jarri esaldi bakoitza bere lerroan, Transifex-ek lerroak bere itzulpen eremuan jartzen ditu!)
[http://www.openkeychain.org](http://www.openkeychain.org)
-[OpenKeychain](http://www.openkeychain.org) is an OpenPGP implementation for Android.
+[OpenKeychain](http://www.openkeychain.org) Android-rako OpenPGP egokitzapen bat da.
-License: GPLv3+
+Baimena: GPLv3+
-## Developers
- * Dominik Schürmann (Maintainer)
+## Garatzaile Nagusiak
+ * Dominik Schürmann (Mantentzaileak)
+ * Vincent Breitmoser
+
+## Laguntzaileak
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,32 +19,47 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG garatzailea)
* Tim Bray
- * Vincent Breitmoser
-## Libraries
- * [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
- * [SafeSlinger Exchange library](https://github.com/SafeSlingerProject/exchange-android) (MIT License)
- * [Android Support Libraries](http://developer.android.com/tools/support-library/index.html) (Apache License v2)
- * [KeybaseLib](https://github.com/timbray/KeybaseLib) (Apache License v2)
- * [TokenAutoComplete](https://github.com/splitwise/TokenAutoComplete) (Apache License v2)
- * [MiniDNS](https://github.com/rtreffer/minidns) (Apache License v2)
- * [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
- * [ZXing](https://github.com/zxing/zxing) (Apache License v2)
- * [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
- * [Snackbar](https://github.com/nispok/snackbar) (MIT License)
- * [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
- * [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
+## Liburutegiak
+ * [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 Baimena)
+ * [SafeSlinger Exchange library](https://github.com/SafeSlingerProject/exchange-android) (MIT Baimena)
+ * [Android Support Libraries](http://developer.android.com/tools/support-library/index.html) (Apache Baimena v2)
+ * [KeybaseLib](https://github.com/timbray/KeybaseLib) (Apache Baimena v2)
+ * [TokenAutoComplete](https://github.com/splitwise/TokenAutoComplete) (Apache Baimena v2)
+ * [MiniDNS](https://github.com/rtreffer/minidns) (Apache Baimena v2)
+ * [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache Baimena v2)
+ * [ZXing](https://github.com/zxing/zxing) (Apache Baimena v2)
+ * [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache Baimena v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache Baimena v2)
+ * [Snackbar](https://github.com/nispok/snackbar) (MIT Baimena)
+ * [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache Baimena v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache Baimena v2)
+ * [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache Baimena v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-eu/help_certification.md b/OpenKeychain/src/main/res/raw-eu/help_certification.md
index 3518adf73..1b6eff123 100644
--- a/OpenKeychain/src/main/res/raw-eu/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-eu/help_certification.md
@@ -1,24 +1,24 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (OHARRA: Meseez jarri esaldi bakoitza bere lerroan, Transifex-ek lerroak bere itzulpen eremuan jartzen ditu!)
-## Key Confirmation
-Without confirmation, you cannot be sure if a key really corresponds to a specific person.
-The simplest way to confirm a key is by scanning the QR Code or exchanging it via NFC.
-To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
+## Giltza Baieztapena
+Baieztapenik gabe, ezin zara zihur egon giltza bat egitan norbanako zehatz batena den.
+Giltza bat baieztatzeko bide arruntena QR Kodea eskaneatzea edo hura NFC bidez trukatzea da.
+Giltzak bi norbanako baino gehiagoren artean baieztatzeko, zure giltzentzat eskuragarrai dagoen giltza trukea metodoa erabiltzea gomendatzen dugu.
-## Key Status
+## Giltza Egoera
<img src="status_signature_verified_cutout_24dp"/>
-Confirmed: You have already confirmed this key, e.g., by scanning the QR Code.
+Baieztatuta: Giltza hau jadanik baieztatuta duzu, adib. QR Kodea eskaneatuz.
<img src="status_signature_unverified_cutout_24dp"/>
-Unconfirmed: This key has not been confirmed yet. You cannot be sure if the key really corresponds to a specific person.
+Baieztatugabe: Giltza hau oraindik ez da baieztatu. Ezin zara zihur egon giltza egitan norbanako zehatz batena den.
<img src="status_signature_expired_cutout_24dp"/>
-Expired: This key is no longer valid. Only the owner can extend its validity.
+Iraungitua: Giltza hau aurrerantzean ez da baliozkoa. Jabeak bakarrik luzatu dezake bere baliozkotasuna.
<img src="status_signature_revoked_cutout_24dp"/>
-Revoked: This key is no longer valid. It has been revoked by its owner.
+Ukatua: Giltza hau aurrerantzean ez da baliozkoa. Bere jabeak ukatua izan da.
-## Advanced Information
-A "key confirmation" in OpenKeychain is implemented by creating a certification according to the OpenPGP standard.
-This certification is a ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) described in the standard by:
+## Argibide Aurreratuak
+OpenKeychain-en "giltza baieztapen" bat OpenPGP estandarraren araberako egiaztagiri bat sortuz egokitzen da.
+Egiaztapen hau da ["egiaztapen generikoa (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) estandarrean azaltzen duena honek:
"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
Traditionally, certifications (also with higher certification levels, such as "positive certifications" (0x13)) are organized in OpenPGP's Web of Trust.
diff --git a/OpenKeychain/src/main/res/raw-eu/help_changelog.md b/OpenKeychain/src/main/res/raw-eu/help_changelog.md
index ab7fa8773..04771c696 100644
--- a/OpenKeychain/src/main/res/raw-eu/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-eu/help_changelog.md
@@ -1,66 +1,75 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (OHARRA: Meseez jarri esaldi bakoitza bere lerroan, Transifex-ek lerroak bere itzulpen eremuan jartzen ditu!)
+
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
## 3.2
- * Material design
- * Integration of QR Scanner (New permissions required)
- * Improved key creation wizard
- * Fix missing contacts after sync
- * Requires Android 4
- * Redesigned key screen
- * Simplify crypto preferences, better selection of secure ciphers
- * API: Detached signatures, free selection of signing key,...
- * Fix: Some valid keys were shown revoked or expired
- * Don't accept signatures by expired or revoked subkeys
- * Keybase.io support in advanced view
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
+ Material diseinua
+ * QR Kode eskaneatzea baterapena (Baimen berriak beharrezkoak)
+ * Hobetuta giltza sortze laguntzailea
+ * Zuzenduta harreman galera aldiberetu ondoren
+ * Android 4 behar du
+ * Giltza ikusleihoaren berdiseinua
+ * Kripto hobespenen arruntzea, zifraketa seguruen hautaketa hobea
+ * API: Sinadurak deserantsita, giltza sinatuaren hautaketa askea,...
+ * Zuzenduta: Zenbait baliozko giltza ukatuta edo iraungituta erakusten dira
+ * Ez da sinadurarik onartzen iraungitutako edo ukatutako azpigiltzetatik
+ * Keybase.io sostengua ikuspegi aurreratuan
+ * Giltza guztiak batera eguneratzeko metodoa
## 3.1.2
- * Fix key export to files (now for real)
+ * Zuzenduta esportatu giltzak agirietara (orain egitan)
## 3.1.1
- * Fix key export to files (they were written partially)
- * Fix crash on Android 2.3
+ * Zuzenduta esportatu giltzak agirietara (partzialki idatzita)
+ * Zuzenduta kraskatzea Android 2.3-an
## 3.1
- * Fix crash on Android 5
- * New certify screen
- * Secure Exchange directly from key list (SafeSlinger library)
- * New QR Code program flow
- * Redesigned decrypt screen
- * New icon usage and colors
- * Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Zuzenduta kraskatzea Android 5-ean
+ * Egiaztagiri ikusleiho berria
+ * Trukaketa Segurua zuzenean giltza zerrendatik (SafeSlinger liburutegia)
+ * QR Kode programa berria
+ * Dekriptaketa ikusleihoaren berdiseinua
+ * Ikur berria eta margoak
+ * Zuzenduta inportatu giltza sekretua Symantec Enkriptaketa Mahaigainetik
+ * YubiKey sostengu esperimentala: Azpigiltza ID-ak orain zuzen egiaztatzen dira
## 3.0.1
- * Better handling of large key imports
- * Improved subkey selection
+ * Kudeaketa hobea giltza inportatze handietarako
+ * Hobetuta azpigiltza hautapena
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
- * New design for decryption screens
- * Many fixes for key import, also fixes stripped keys
+ * Diseinu berria dekriptaketa ikusleihoentzat
+ * Zuzenketa ugari giltza inportatzean, zuzenduta baita ere giltzen zuriketa
* Honor and display key authenticate flags
- * User interface to generate custom keys
- * Fixing user id revocation certificates
- * New cloud search (searches over traditional keyservers and keybase.io)
- * Support for stripping keys inside OpenKeychain
+ * Erabiltzaile interfazea norbere giltzak sortzeko
+ * Zuzenduta erabiltzaile id ukatze egiaztagiriak
+ * Hodei bilaketa berria (ohiko giltza-zerbitzari eta keybase.io gain bilatzen da)
+ * Sostengua giltza zuriketarako OpenKeychain barne
+ * YubiKey sostengu esperimentala: Sostengua sinadura sortze eta dekriptaketarako
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-eu/help_start.md b/OpenKeychain/src/main/res/raw-eu/help_start.md
index 4cc331942..86b6c22b4 100644
--- a/OpenKeychain/src/main/res/raw-eu/help_start.md
+++ b/OpenKeychain/src/main/res/raw-eu/help_start.md
@@ -1,16 +1,16 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (OHARRA: Meseez jarri esaldi bakoitza bere lerroan, Transifex-ek lerroak bere itzulpen eremuan jartzen ditu!)
-## How do I activate OpenKeychain in K-9 Mail?
-To use OpenKeychain with K-9 Mail, you want to follow these steps:
- 1. Open K-9 Mail and long-tap on the account you want to use OpenKeychain with.
- 2. Select "Account settings", scroll to the very bottom and click "Cryptography".
- 3. Click on "OpenPGP Provider" and select OpenKeychain from the list.
+## Nola gaitu dezaket OpenKeychain K-9 Mail-en?
+OpenKeychain K-9 Mail-ekin erabiltzeko, urrats hauek jarraitu behar dituzu:
+ 1. Ireki K-9 Mail eta egin ikutu-luzea OpenKeychain erabiltzea nahi duzun kontuan.
+ 2. Hautatu "Kontuaren ezarpenak", irristatu beheren eta klikatu "Kriptografia".
+ 3. Klikatu "OpenPGP Hornitzailea" eta hautatu OpenKeychain zerrendatik.
-## I found a bug in OpenKeychain!
-Please report the bug using the [issue tracker of OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
+## Akats bat aurkitu dut OpenKeychain-en!
+Mesedez jakinarazi akatsa erabiliz [OpenKeychain akats aztarnaria](https://github.com/openpgp-keychain/openpgp-keychain/issues).
-## Contribute
-If you want to help us developing OpenKeychain by contributing code [follow our small guide on Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
+## Lagundu
+OpenKeychain garatzen laguntzea nahi badiguzu kode ekarpenak eginez [jarraitu gure gida txikia Github-en](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
-## Translations
-Help translating OpenKeychain! Everybody can participate at [OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
+## Itzulpenak
+Lagundu OpenKeychain itzultzen! Edonork eskuhartu dezake hemen [OpenKeychain Transifex-en](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-fi/help_about.md b/OpenKeychain/src/main/res/raw-fi/help_about.md
index 9d635d9df..e80a2c766 100644
--- a/OpenKeychain/src/main/res/raw-fi/help_about.md
+++ b/OpenKeychain/src/main/res/raw-fi/help_about.md
@@ -6,8 +6,12 @@
License: GPLv3+
-## Developers
+## Main Developers
* Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
* Tim Bray
- * Vincent Breitmoser
## Libraries
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
@@ -38,9 +57,9 @@ License: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-fi/help_changelog.md b/OpenKeychain/src/main/res/raw-fi/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-fi/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-fi/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-fr/help_about.md b/OpenKeychain/src/main/res/raw-fr/help_about.md
index edf3dd78d..a93d250a5 100644
--- a/OpenKeychain/src/main/res/raw-fr/help_about.md
+++ b/OpenKeychain/src/main/res/raw-fr/help_about.md
@@ -6,8 +6,12 @@
Licence : GPLv3+
-## Développeurs
+## Développeurs principaux
* Dominik Schürmann (mainteneur)
+ * Vincent Breitmoser
+
+## Contributeurs
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ Licence : GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* « mar-v-in »
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* « Senecaso »
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (développeur APG)
* Tim Bray
- * Vincent Breitmoser
## Bibliothèques
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (Licence MIT X11)
@@ -38,9 +57,9 @@ Licence : GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Licence Apache v2)
* [ZXing](https://github.com/zxing/zxing) (Licence Apache v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Licence Apache v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Conception matérielle)</a> (Licence Apache v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Licence Apache v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Licence Apache v2)
* [Snackbar](https://github.com/nispok/snackbar) (Licence MIT)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Licence Apache v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Licence Apache v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Licence Apache v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Licence Apache v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-fr/help_certification.md b/OpenKeychain/src/main/res/raw-fr/help_certification.md
index 643756bcf..87473a2e7 100644
--- a/OpenKeychain/src/main/res/raw-fr/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-fr/help_certification.md
@@ -2,13 +2,13 @@
## Confirmation de clef
Sans confirmation, vous ne pouvez pas être certain que la clef appartient à une personne déterminée.
-La façon la plus simple de confirmer une clef est en balayant le code QR ou en l'échangeant par NFC.
+La façon la plus simple de confirmer une clef est en lisant le code QR ou en l'échangeant par NFC.
Pour confirmer des clefs entre plus de deux personnes, nous suggérons d'utiliser la méthode d'échange de clef proposée pour vos clefs.
## État de la clef
<img src="status_signature_verified_cutout_24dp"/>
-Confirmée : vous avez déjà confirmé cette clef, p. ex. en balayant le code QR.
+Confirmée : vous avez déjà confirmé cette clef, p. ex. en lisant le code QR.
<img src="status_signature_unverified_cutout_24dp"/>
Non confirmée : cette clef n'a pas encore été confirmée. Vous ne pouvez pas être certain que la clef appartient à une personne déterminée.
<img src="status_signature_expired_cutout_24dp"/>
diff --git a/OpenKeychain/src/main/res/raw-fr/help_changelog.md b/OpenKeychain/src/main/res/raw-fr/help_changelog.md
index b221eda6d..c6275e322 100644
--- a/OpenKeychain/src/main/res/raw-fr/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-fr/help_changelog.md
@@ -1,9 +1,17 @@
[//] : # (NOTE : veuillez mettre chaque phrase sur sa propre ligne. Transifex met chaque ligne dans son propre champ de traduction !)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * Première version avec prise en charge complète de la clef Yubi, proposée dans l'interface utilisateur : modifier les clefs, relier la clef Yubi au clefs...
* Conception matérielle
- * Intégration du lecteur QR (nouvelles permissions exigées)
+ * Intégration de la lecture de code QR (nouvelles permissions exigées)
* Amélioration de l'assistant de création de clef
* Correctif - Contacts manquants après la synchro
* Android 4 exigé
@@ -13,6 +21,7 @@
* Correctif - Certaines clefs valides apparaissaient comme révoquées ou expirées
* Ne pas accepter de signatures par des sous-clefs expirées ou révoquées
* Prise en charge de keybase.io dans la vue avancée
+ * Méthode pour mettre toutes les clefs à jour en même temps
## 3.1.2
@@ -35,7 +44,7 @@
* Écran de déchiffrement redessiné
* Nouveaux agencement et couleurs d'icônes
* Importation des clefs secrètes corrigée de Symantec Encryption Desktop
- * Les ID de sous-clefs des Yubikeys sont maintenant vérifiés correctement
+ * Prise en charge expérimentale des clefs Yubi : les ID de sous-clefs sont maintenant vérifiés correctement
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Prise en charge complète de la génération de signature par Yubikey et de leur déchiffrement !
* Des applis compatibles installables sont proposées dans la liste des applis
* Nouvelle conception pour les écrans de déchiffrement
* Nombreux correctifs d'importation des clefs, corrigent aussi les clefs dépouillées
@@ -55,12 +63,13 @@
* Corrigé - Certificats de révocation des ID utilisateurs
* Nouvelle recherche nuagique (dans les serveurs traditionnels et dans keybase.io)
* Prise en charge du dépouillement des clefs dans OpenKeychain
+ * Prise en charge expérimentale des clefs Yubi : prise en charge de la génération de signature et le déchiffrement
## 2.9.2
* Correctif - Clefs brisées dans 2.9.1
- * Le déchiffrement des Yukukeys par l'API fonctionne maintenant
+ * Prise en charge expérimentale des clefs Yubi : le déchiffrement fonctionne maintenant avec l'API
## 2.9.1
@@ -69,7 +78,7 @@
* Correctif - Gestion des drapeaux de clefs (prend maintenant en charge les clefs Mailvelope 0.7)
* Gestion des phrases de passe améliorée
* Partage de clefs par SafeSlinger
- * Yubikey : préférence pour permette d'autre NIP, seule la signature par l'API OpenPGP fonctionne présentement, mais pas à l'intérieur d'OpenKeychain
+ * Prise en charge expérimentale des clefs Yubi : préférence pour permettre d'autres NIP, seule la signature par l'API OpenPGP fonctionne actuellement, mais pas dans OpenKeychain
* Correctif - Utilisation de clefs dépouillées
* SHA256 par défaut pour la compatibilité
* L'API des intentions a changé, voir https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Correction des plantages présents dans v2.8
* Prise en charge expérimentale CCE
- * Prise en charge expérimentale de Yubikey (signature seulement avec les clefs importées)
+ * Prise en charge expérimentale des clefs Yubi : signature seulement avec les clefs importées
## 2.8
@@ -180,7 +189,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
## 2.1.1
- * Mise à jour de l'API, préparation à l'intégration à K-9 Mail
+ * Mise à jour de l'API, préparation à l'intégration à Courriel K-9 Mail
## 2.1
@@ -251,7 +260,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
* Listes de clefs filtrables
* Présélection plus intelligente des clefs de chiffrement
* Nouvelle gestion des intentions pour VIEW et SEND, permet le chiffrement/déchiffrement des fichiers du gestionnaires de fichiers
- * Correctifs et fonctions additionnelles (présélection des clefs) pour K-9-Mail, nouvelle version bêta proposée
+ * Correctifs et fonctions additionnelles (présélection des clefs) pour Courriel K-9-Mail, nouvelle version bêta proposée
## 1.0.1
@@ -261,7 +270,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
## 1.0.0
- * Intégration à K-9 Mail, APG prenant en charge la version bêta de K-9 Mail
+ * Intégration à K-9 Mail, APG prenant en charge la version bêta de Courriel K-9 Mail
* Prise en charge de plus de gestionnaires de fichiers (incluant ASTRO)
* Traduction slovène
* Nouvelle base de données, bien plus rapide, utilisation de la mémoire moindre
diff --git a/OpenKeychain/src/main/res/raw-fr/help_start.md b/OpenKeychain/src/main/res/raw-fr/help_start.md
index 7ac45cc88..9e712c220 100644
--- a/OpenKeychain/src/main/res/raw-fr/help_start.md
+++ b/OpenKeychain/src/main/res/raw-fr/help_start.md
@@ -1,8 +1,8 @@
[//] : # (NOTE : veuillez mettre chaque phrase dans sa propre ligne. Transifex met chaque ligne dans son propre champ de traduction !)
-## Comment puis-je activer OpenKeychain dans K-9 Mail ?
-Pour utiliser OpenKeychain avec K-9 Mail, vous devez suivre ces étapes :
- 1. Ouvrez K-9 Mail et appuyez longuement sur le compte avec lequel vous voulez utiliser OpenKeychain.
+## Comment puis-je activer OpenKeychain dans Courriel K-9 Mail ?
+Pour utiliser OpenKeychain avec Courriel K-9 Mail, vous devez suivre ces étapes :
+ 1. Ouvrez Courriel K-9 Mail et appuyez longuement sur le compte avec lequel vous voulez utiliser OpenKeychain.
2. Sélectionnez « Paramètres du compte », faite défiler vers le bas et cliquez sur « Cryptographie ».
3. Cliquez sur « Fournisseur OpenPGP » et sélectionnez OpenKeychain dans la liste.
diff --git a/OpenKeychain/src/main/res/raw-is/help_about.md b/OpenKeychain/src/main/res/raw-is/help_about.md
index 9d635d9df..e80a2c766 100644
--- a/OpenKeychain/src/main/res/raw-is/help_about.md
+++ b/OpenKeychain/src/main/res/raw-is/help_about.md
@@ -6,8 +6,12 @@
License: GPLv3+
-## Developers
+## Main Developers
* Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
* Tim Bray
- * Vincent Breitmoser
## Libraries
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
@@ -38,9 +57,9 @@ License: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-is/help_changelog.md b/OpenKeychain/src/main/res/raw-is/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-is/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-is/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-it/help_about.md b/OpenKeychain/src/main/res/raw-it/help_about.md
index 9d635d9df..844fb51ca 100644
--- a/OpenKeychain/src/main/res/raw-it/help_about.md
+++ b/OpenKeychain/src/main/res/raw-it/help_about.md
@@ -1,13 +1,17 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (NOTA: Si prega di mettere ogni frase in una propria linea, Transifex mette ogni riga nel proprio campo di traduzione!)
[http://www.openkeychain.org](http://www.openkeychain.org)
-[OpenKeychain](http://www.openkeychain.org) is an OpenPGP implementation for Android.
+[OpenKeychain](http://www.openkeychain.org) e un impelementazione OpenPGP per Android.
-License: GPLv3+
+Licenza: GPLv3+
-## Developers
- * Dominik Schürmann (Maintainer)
+## Sviluppatori principali
+ * Dominik Schürmann (Manutentore)
+ * Vincent Breitmoser
+
+## Collaboratori
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,20 +19,35 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (Sviluppatore APG)
* Tim Bray
- * Vincent Breitmoser
-## Libraries
+## Librerie
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
* [SafeSlinger Exchange library](https://github.com/SafeSlingerProject/exchange-android) (MIT License)
* [Android Support Libraries](http://developer.android.com/tools/support-library/index.html) (Apache License v2)
@@ -38,9 +57,9 @@ License: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-it/help_certification.md b/OpenKeychain/src/main/res/raw-it/help_certification.md
index 3518adf73..8b4d58955 100644
--- a/OpenKeychain/src/main/res/raw-it/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-it/help_certification.md
@@ -1,28 +1,28 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (NOTA: Si prega di mettere ogni frase in una propria linea, Transifex mette ogni riga nel proprio campo di traduzione!)
-## Key Confirmation
-Without confirmation, you cannot be sure if a key really corresponds to a specific person.
-The simplest way to confirm a key is by scanning the QR Code or exchanging it via NFC.
-To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
+## Conferma chiave
+Senza conferma, non puoi essere sicuro la chiave veramente corrisponde a una persona specifica.
+Il modo più semplice per confermare una chiave è la scansione del codice QR o scambiarla via NFC.
+Per confermare le chiavi tra più di due persone, si consiglia di utilizzare il metodo di scambio di chiavi a disposizione per le vostre chiavi.
-## Key Status
+## Stato chiave
<img src="status_signature_verified_cutout_24dp"/>
-Confirmed: You have already confirmed this key, e.g., by scanning the QR Code.
+Confermato: Hai già confermato questa chiave, ad esempio, attraverso la scansione del codice QR.
<img src="status_signature_unverified_cutout_24dp"/>
-Unconfirmed: This key has not been confirmed yet. You cannot be sure if the key really corresponds to a specific person.
+Non confermato: Questa chiave non è ancora stata confermata. Non si può essere sicuri se la chiave corrisponde davvero a una persona specifica.
<img src="status_signature_expired_cutout_24dp"/>
-Expired: This key is no longer valid. Only the owner can extend its validity.
+Scaduta: Questa chiave non è più valida. Solo il proprietario può estendere la sua validità.
<img src="status_signature_revoked_cutout_24dp"/>
-Revoked: This key is no longer valid. It has been revoked by its owner.
+Revoca: Questa chiave non è più valida. È stata revocata dal suo proprietario.
-## Advanced Information
-A "key confirmation" in OpenKeychain is implemented by creating a certification according to the OpenPGP standard.
-This certification is a ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) described in the standard by:
-"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
+## Informazioni avanzate
+Una "conferma chiave" in OpenKeychain è attuato mediante la creazione di una certificazione secondo lo standard OpenPGP.
+Questa certificazione è un ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) indicata nella norma per:
+"L'emittente di tale certificazione non va alcun particolare asserzione da quanto accurato il certificatore ha verificato che il proprietario della chiave è infatti la persona descritta dal ID utente."
-Traditionally, certifications (also with higher certification levels, such as "positive certifications" (0x13)) are organized in OpenPGP's Web of Trust.
-Our model of key confirmation is a much simpler concept to avoid common usability problems related to this Web of Trust.
-We assume that keys are verified only to a certain degree that is still usable enough to be executed "on the go".
-We also do not implement (potentially transitive) trust signatures or an ownertrust database like in GnuPG.
-Furthermore, keys which contain at least one user ID certified by a trusted key will be marked as "confirmed" in the key listings. \ No newline at end of file
+Tradizionalmente, certificazioni (anche con livelli di certificazione più elevati, come "certificazioni positivi" (0x13)) sono organizzate su OpenPGP nel web di confidenza ("Web of trust").
+Il nostro modello di conferma chiave è un concetto molto più semplice per evitare problemi di usabilità comuni relativi a questo Web of Trust.
+Assumiamo che le chiavi vengono verificati solo fino ad un certo grado che è ancora abbastanza utilizzabile da eseguire "in movimento".
+Inoltre, non implementiamo (potenzialmente transitive) firme fiduciarie o un database ownertrust come in GnuPG.
+Inoltre, chiavi che contengono almeno un ID utente certificata da una chiave di fiducia saranno contrassegnati come "confermato" negli elenchi principali. \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-it/help_changelog.md b/OpenKeychain/src/main/res/raw-it/help_changelog.md
index ab7fa8773..2cc690901 100644
--- a/OpenKeychain/src/main/res/raw-it/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-it/help_changelog.md
@@ -1,9 +1,17 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (NOTA: Si prega di mettere ogni frase in una propria linea, Transifex mette ogni riga nel proprio campo di traduzione!)
+
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-it/help_start.md b/OpenKeychain/src/main/res/raw-it/help_start.md
index 4cc331942..bac4542ab 100644
--- a/OpenKeychain/src/main/res/raw-it/help_start.md
+++ b/OpenKeychain/src/main/res/raw-it/help_start.md
@@ -1,16 +1,16 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (NOTA: Si prega di mettere ogni frase in una propria linea, Transifex mette ogni riga nel proprio campo di traduzione!)
-## How do I activate OpenKeychain in K-9 Mail?
-To use OpenKeychain with K-9 Mail, you want to follow these steps:
- 1. Open K-9 Mail and long-tap on the account you want to use OpenKeychain with.
- 2. Select "Account settings", scroll to the very bottom and click "Cryptography".
- 3. Click on "OpenPGP Provider" and select OpenKeychain from the list.
+## Come attivare OpenKeychain in K-9 Mail?
+Per usare OpenKeychain con K-9 Mail, vuoi segire questi passi:
+ 1. Avia K-9 Mail e premi lungo sul account che vuoi usare con OpenKeychain.
+ 2. Seleziona "Impostazioni account", scorri verso il basso e clicca "Crittografia".
+ 3. Clicca su "OpenPGP Provider" e seleziona OpenKeychain dalla lista.
-## I found a bug in OpenKeychain!
-Please report the bug using the [issue tracker of OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
+## Ho trovato un bug in OpenKeychain!
+Si prega di segnalare dei bug utilizzando [issue tracker di OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
-## Contribute
-If you want to help us developing OpenKeychain by contributing code [follow our small guide on Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
+## Contribuire
+Se vuoi aiutarci a sviluppare OpenKeychain contribuendo codice [segui la nostra piccola guida su Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
-## Translations
-Help translating OpenKeychain! Everybody can participate at [OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
+## Traduzioni
+Aiuta a tradurre OpenKeychain! Tutti possono partecipare su [OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-ja/help_about.md b/OpenKeychain/src/main/res/raw-ja/help_about.md
index f19a5f877..ea3fc701f 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_about.md
+++ b/OpenKeychain/src/main/res/raw-ja/help_about.md
@@ -6,8 +6,12 @@
ライセンス: GPLv3以降
-## Developers## 開発者
+## メイン開発者
* Dominik Schürmann (メンテナ)
+ * Vincent Breitmoser
+
+## 貢献者
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG 開発者)
* Tim Bray
- * Vincent Breitmoser
## ライブラリ
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
@@ -39,8 +58,8 @@
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
* [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-ja/help_certification.md b/OpenKeychain/src/main/res/raw-ja/help_certification.md
index 8b4364c09..8de3079cd 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-ja/help_certification.md
@@ -19,10 +19,10 @@
## 詳細情報
OpenKeychainでの"鍵の検証"はOpenPGP標準に準拠した証明を生成する実装がなされています。
この証明は ["汎用証明 (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) として標準に以下として記述されています:
-"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
+"この証明書の発行者は、認証者は、鍵の所有者が実際にユーザIDによって記述の人であることを確認したこの証明書のように、任意の特定の主張を行いません。"
歴史的に、証明(またより高いレベルの証明、"肯定的な証明" (0x13)) は OpenPGPによるWeb of Trustとして組織化されます。
われわれの鍵の証明モデルはとてもシンプルなコンセプトによって関連する一般的なユーザビリティの問題を回避する概念です。
-We assume that keys are verified only to a certain degree that is still usable enough to be executed "on the go".
-We also do not implement (potentially transitive) trust signatures or an ownertrust database like in GnuPG.
-Furthermore, keys which contain at least one user ID certified by a trusted key will be marked as "confirmed" in the key listings. \ No newline at end of file
+私たちは、鍵が唯一の "外出先で"まだ実行されるのに十分な使用可能なある程度検証されることを想定しています。
+しかし私達は(潜在的推移則での)信頼署名やGnuPG式の所有信頼データベースの実装はしません。
+さらに、信頼できるキーで証明された少なくとも1つのユーザIDが含まれるキーは、キーのリストに「確認」としてマークされます。 \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-ja/help_changelog.md b/OpenKeychain/src/main/res/raw-ja/help_changelog.md
index 181544767..c5ab2b2c1 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-ja/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * 完全なYubiKeyサポートがユーザーインタフェースから利用できる最初のバージョン: 鍵の編集、YubiKeyと鍵の紐付け、...
* マテリアルデザイン
- * QRスキャナの統合 (新しいパーミッションを必要とします)
+ * QRコードのスキャンの統合 (新しいパーミッションを必要とします)
* 鍵生成ウィザードの改善
* 同期後に連絡先を見失う問題の修正
* Android 4を必要とします
@@ -13,6 +21,7 @@
* 修正: いくつかの正しい鍵が破棄もしくは期限切れとして表示される
* 副鍵が期限切れもしくは破棄されている場合に署名を受け入れない
* 拡張ビューでのKeybase.ioのサポート
+ * すべての鍵を一度にアップデートするメソッド
## 3.1.2
@@ -35,7 +44,7 @@
* 復号化画面の再デザイン
* 新しいアイコン利用とカラー
* Symantec Encryption Desktopから秘密鍵をインポート時の問題修正
- * Yubikeyでの副鍵IDを正くチェックするようになりました
+ * 実験的なYubiKeyサポート: Yubikeyでの副鍵IDを正くチェックするようになりました
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Yubikeyでの署名生成と復号化のフルサポート
* インストールできるAPIの互換性のあるアプリをアプリ内リストで提示します
* 復号化画面を新しいデザインに
* 鍵のインポートで沢山の修正、また鍵のストリップでも修正
@@ -55,12 +63,13 @@
* ユーザーID破棄証明の修正
* 新しいクラウド検索 (古典的な keyserverと keybase.io から検索します)
* OpenKeychain内で鍵をストリップするのをサポートしました
+ * 実験的なYubiKeyサポート: Yubikeyでの署名生成と復号化のフルサポート
## 2.9.2
* 2.9.1での鍵破壊問題修正
- * API経由でYubikeyの復号処理が動くようになった
+ * 実験的なYubiKeyサポート: API経由でYubikeyの復号処理が動くようになった
## 2.9.1
@@ -69,7 +78,7 @@
* 鍵のフラグ管理を修正 (現在Mailvelope 0.7 鍵をサポート)
* パスフレーズの取り回しを改善
* SafeSlingerでの鍵の共有
- * Yubikey: 設定で他のPINを受け付け、現在OpenPGP API経由での署名しか動きません、OpenKeychainの内部ではないため
+ * 実験的なYubiKeyサポート: 設定で他のPINを受け付け、現在OpenPGP API経由での署名しか動きません、OpenKeychainの内部ではないため
* ストリップした鍵の利用法を修正
* 互換性のためデフォルトをSHA256に
* インテント API を変更しました、以下参照 https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* v2.8 から発生したクラッシュ問題をFix
* 実験的にECCをサポート
- * 実験的にYubikeyをサポート(インポート済みの鍵での署名のみ)
+ * 実験的なYubiKeyサポート: インポート済みの鍵での署名のみ
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-kn/help_about.md b/OpenKeychain/src/main/res/raw-kn/help_about.md
new file mode 100644
index 000000000..e80a2c766
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-kn/help_about.md
@@ -0,0 +1,65 @@
+[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+[http://www.openkeychain.org](http://www.openkeychain.org)
+
+[OpenKeychain](http://www.openkeychain.org) is an OpenPGP implementation for Android.
+
+License: GPLv3+
+
+## Main Developers
+ * Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
+ * Art O Cathain
+ * Ash Hughes
+ * Brian C. Barnes
+ * Bahtiar 'kalkin' Gadimov
+ * Daniel Albert
+ * Daniel Hammann
+ * Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
+ * Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
+ * 'mar-v-in'
+ * Markus Doits
+ * Miroojin Bakshi
+ * Morgan Gangwere
+ * Nikhil Peter Raj
+ * Paul Sarbinowski
+ * 'Senecaso'
+ * Signe Rüsch
+ * Sreeram Boyapati
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
+ * Tim Bray
+
+## Libraries
+ * [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
+ * [SafeSlinger Exchange library](https://github.com/SafeSlingerProject/exchange-android) (MIT License)
+ * [Android Support Libraries](http://developer.android.com/tools/support-library/index.html) (Apache License v2)
+ * [KeybaseLib](https://github.com/timbray/KeybaseLib) (Apache License v2)
+ * [TokenAutoComplete](https://github.com/splitwise/TokenAutoComplete) (Apache License v2)
+ * [MiniDNS](https://github.com/rtreffer/minidns) (Apache License v2)
+ * [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
+ * [ZXing](https://github.com/zxing/zxing) (Apache License v2)
+ * [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
+ * [Snackbar](https://github.com/nispok/snackbar) (MIT License)
+ * [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
+ * [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-kn/help_certification.md b/OpenKeychain/src/main/res/raw-kn/help_certification.md
new file mode 100644
index 000000000..3518adf73
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-kn/help_certification.md
@@ -0,0 +1,28 @@
+[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## Key Confirmation
+Without confirmation, you cannot be sure if a key really corresponds to a specific person.
+The simplest way to confirm a key is by scanning the QR Code or exchanging it via NFC.
+To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
+
+## Key Status
+
+<img src="status_signature_verified_cutout_24dp"/>
+Confirmed: You have already confirmed this key, e.g., by scanning the QR Code.
+<img src="status_signature_unverified_cutout_24dp"/>
+Unconfirmed: This key has not been confirmed yet. You cannot be sure if the key really corresponds to a specific person.
+<img src="status_signature_expired_cutout_24dp"/>
+Expired: This key is no longer valid. Only the owner can extend its validity.
+<img src="status_signature_revoked_cutout_24dp"/>
+Revoked: This key is no longer valid. It has been revoked by its owner.
+
+## Advanced Information
+A "key confirmation" in OpenKeychain is implemented by creating a certification according to the OpenPGP standard.
+This certification is a ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) described in the standard by:
+"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
+
+Traditionally, certifications (also with higher certification levels, such as "positive certifications" (0x13)) are organized in OpenPGP's Web of Trust.
+Our model of key confirmation is a much simpler concept to avoid common usability problems related to this Web of Trust.
+We assume that keys are verified only to a certain degree that is still usable enough to be executed "on the go".
+We also do not implement (potentially transitive) trust signatures or an ownertrust database like in GnuPG.
+Furthermore, keys which contain at least one user ID certified by a trusted key will be marked as "confirmed" in the key listings. \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-kn/help_changelog.md b/OpenKeychain/src/main/res/raw-kn/help_changelog.md
new file mode 100644
index 000000000..d45ce636b
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-kn/help_changelog.md
@@ -0,0 +1,278 @@
+[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
+## 3.2
+
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
+ * Material design
+ * Integration of QR Code Scanning (New permissions required)
+ * Improved key creation wizard
+ * Fix missing contacts after sync
+ * Requires Android 4
+ * Redesigned key screen
+ * Simplify crypto preferences, better selection of secure ciphers
+ * API: Detached signatures, free selection of signing key,...
+ * Fix: Some valid keys were shown revoked or expired
+ * Don't accept signatures by expired or revoked subkeys
+ * Keybase.io support in advanced view
+ * Method to update all keys at once
+
+
+## 3.1.2
+
+ * Fix key export to files (now for real)
+
+
+## 3.1.1
+
+ * Fix key export to files (they were written partially)
+ * Fix crash on Android 2.3
+
+
+## 3.1
+
+ * Fix crash on Android 5
+ * New certify screen
+ * Secure Exchange directly from key list (SafeSlinger library)
+ * New QR Code program flow
+ * Redesigned decrypt screen
+ * New icon usage and colors
+ * Fix import of secret keys from Symantec Encryption Desktop
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
+
+
+## 3.0.1
+
+ * Better handling of large key imports
+ * Improved subkey selection
+
+
+## 3.0
+
+ * Propose installable compatible apps in apps list
+ * New design for decryption screens
+ * Many fixes for key import, also fixes stripped keys
+ * Honor and display key authenticate flags
+ * User interface to generate custom keys
+ * Fixing user id revocation certificates
+ * New cloud search (searches over traditional keyservers and keybase.io)
+ * Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
+
+
+## 2.9.2
+
+ * Fix keys broken in 2.9.1
+ * Experimental YubiKey support: Decryption now working via API
+
+
+## 2.9.1
+
+ * Split encrypt screen into two
+ * Fix key flags handling (now supporting Mailvelope 0.7 keys)
+ * Improved passphrase handling
+ * Key sharing via SafeSlinger
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Fix usage of stripped keys
+ * SHA256 as default for compatibility
+ * Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
+ * OpenPGP API now handles revoked/expired keys and returns all user ids
+
+
+## 2.9
+
+ * Fixing crashes introduced in v2.8
+ * Experimental ECC support
+ * Experimental YubiKey support: Only signing with imported keys
+
+
+## 2.8
+
+ * So many bugs have been fixed in this release that we focus on the main new features
+ * Key edit: awesome new design, key revocation
+ * Key import: awesome new design, secure keyserver connections via hkps, keyserver resolving via DNS SRV records
+ * New first time screen
+ * New key creation screen: autocompletion of name and email based on your personal Android accounts
+ * File encryption: awesome new design, support for encrypting multiple files
+ * New icons to show status of key (by Brennan Novak)
+ * Important bug fix: Importing of large key collections from a file is now possible
+ * Notification showing cached passphrases
+ * Keys are connected to Android's contacts
+
+This release wouldn't be possible without the work of Vincent Breitmoser (GSoC 2014), mar-v-in (GSoC 2014), Daniel Albert, Art O Cathain, Daniel Haß, Tim Bray, Thialfihar
+
+## 2.7
+
+ * Purple! (Dominik, Vincent)
+ * New key view design (Dominik, Vincent)
+ * New flat Android buttons (Dominik, Vincent)
+ * API fixes (Dominik)
+ * Keybase.io import (Tim Bray)
+
+
+## 2.6.1
+
+ * Some fixes for regression bugs
+
+
+## 2.6
+
+ * Key certifications (thanks to Vincent Breitmoser)
+ * Support for GnuPG partial secret keys (thanks to Vincent Breitmoser)
+ * New design for signature verification
+ * Custom key length (thanks to Greg Witczak)
+ * Fix share-functionality from other apps
+
+
+## 2.5
+
+ * Fix decryption of symmetric OpenPGP messages/files
+ * Refactored key edit screen (thanks to Ash Hughes)
+ * New modern design for encrypt/decrypt screens
+ * OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)
+
+
+## 2.4
+Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
+Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):
+Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Paul Sarbinowski, Sreeram Boyapati, Vincent Breitmoser.
+
+ * New unified key list
+ * Colorized key fingerprint
+ * Support for keyserver ports
+ * Deactivate possibility to generate weak keys
+ * Much more internal work on the API
+ * Certify user ids
+ * Keyserver query based on machine-readable output
+ * Lock navigation drawer on tablets
+ * Suggestions for emails on creation of keys
+ * Search in public key lists
+ * And much more improvements and fixes…
+
+
+## 2.3.1
+
+ * Hotfix for crash when upgrading from old versions
+
+
+## 2.3
+
+ * Remove unnecessary export of public keys when exporting secret key (thanks to Ash Hughes)
+ * Fix setting expiry dates on keys (thanks to Ash Hughes)
+ * More internal fixes when editing keys (thanks to Ash Hughes)
+ * Querying keyservers directly from the import screen
+ * Fix layout and dialog style on Android 2.2-3.0
+ * Fix crash on keys with empty user ids
+ * Fix crash and empty lists when coming back from signing screen
+ * Bouncy Castle (cryptography library) updated from 1.47 to 1.50 and build from source
+ * Fix upload of key from signing screen
+
+
+## 2.2
+
+ * New design with navigation drawer
+ * New public key list design
+ * New public key view
+ * Bug fixes for importing of keys
+ * Key cross-certification (thanks to Ash Hughes)
+ * Handle UTF-8 passwords properly (thanks to Ash Hughes)
+ * First version with new languages (thanks to the contributors on Transifex)
+ * Sharing of keys via QR Codes fixed and improved
+ * Package signature verification for API
+
+
+## 2.1.1
+
+ * API Updates, preparation for K-9 Mail integration
+
+
+## 2.1
+
+ * Lots of bug fixes
+ * New API for developers
+ * PRNG bug fix by Google
+
+
+## 2.0
+
+ * Complete redesign
+ * Share public keys via QR codes, NFC beam
+ * Sign keys
+ * Upload keys to server
+ * Fixes import issues
+ * New AIDL API
+
+
+## 1.0.8
+
+ * Basic keyserver support
+ * App2sd
+ * More choices for passphrase cache: 1, 2, 4, 8, hours
+ * Translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)
+ * Bugfixes
+ * Optimizations
+
+
+## 1.0.7
+
+ * Fixed problem with signature verification of texts with trailing newline
+ * More options for passphrase cache time to live (20, 40, 60 mins)
+
+
+## 1.0.6
+
+ * Account adding crash on Froyo fixed
+ * Secure file deletion
+ * Option to delete key file after import
+ * Stream encryption/decryption (gallery, etc.)
+ * New options (language, force v3 signatures)
+ * Interface changes
+ * Bugfixes
+
+
+## 1.0.5
+
+ * German and Italian translation
+ * Much smaller package, due to reduced BC sources
+ * New preferences GUI
+ * Layout adjustment for localization
+ * Signature bugfix
+
+
+## 1.0.4
+
+ * Fixed another crash caused by some SDK bug with query builder
+
+
+## 1.0.3
+
+ * Fixed crashes during encryption/signing and possibly key export
+
+
+## 1.0.2
+
+ * Filterable key lists
+ * Smarter pre-selection of encryption keys
+ * New Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers
+ * Fixes and additional features (key preselection) for K-9 Mail, new beta build available
+
+
+## 1.0.1
+
+ * GMail account listing was broken in 1.0.0, fixed again
+
+
+## 1.0.0
+
+ * K-9 Mail integration, APG supporting beta build of K-9 Mail
+ * Support of more file managers (including ASTRO)
+ * Slovenian translation
+ * New database, much faster, less memory usage
+ * Defined Intents and content provider for other apps
+ * Bugfixes \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-kn/help_start.md b/OpenKeychain/src/main/res/raw-kn/help_start.md
new file mode 100644
index 000000000..4cc331942
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-kn/help_start.md
@@ -0,0 +1,16 @@
+[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## How do I activate OpenKeychain in K-9 Mail?
+To use OpenKeychain with K-9 Mail, you want to follow these steps:
+ 1. Open K-9 Mail and long-tap on the account you want to use OpenKeychain with.
+ 2. Select "Account settings", scroll to the very bottom and click "Cryptography".
+ 3. Click on "OpenPGP Provider" and select OpenKeychain from the list.
+
+## I found a bug in OpenKeychain!
+Please report the bug using the [issue tracker of OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
+
+## Contribute
+If you want to help us developing OpenKeychain by contributing code [follow our small guide on Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
+
+## Translations
+Help translating OpenKeychain! Everybody can participate at [OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-nl/help_about.md b/OpenKeychain/src/main/res/raw-nl/help_about.md
index 9d3693d33..6f64c0fd8 100644
--- a/OpenKeychain/src/main/res/raw-nl/help_about.md
+++ b/OpenKeychain/src/main/res/raw-nl/help_about.md
@@ -6,8 +6,12 @@
Licentie: GPLv3+
-## Ontwikkelaars
+## Hoofdontwikkelaars
* Dominik Schürmann (beheerder)
+ * Vincent Breitmoser
+
+## Medewerkers
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ Licentie: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (ontwikkelaar van APG)
* Tim Bray
- * Vincent Breitmoser
## Bibliotheken
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 licentie)
@@ -38,9 +57,9 @@ Licentie: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache licentie v2)
* [ZXing](https://github.com/zxing/zxing) (Apache licentie v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache licentie v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache licentie v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache licentie v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache licentie v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT licentie)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache licentie v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache licentie v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache licentie v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache licentie v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-nl/help_changelog.md b/OpenKeychain/src/main/res/raw-nl/help_changelog.md
index 28c008583..577ff26b0 100644
--- a/OpenKeychain/src/main/res/raw-nl/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-nl/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * Eerste versie waarin YubiKey volledig wordt ondersteund vanuit de gebruikersinterface: sleutels aanmaken, YubiKey binden aan sleutels, ...
* Material design
- * Integratie van QR-scanner (nieuwe machtigingen vereist)
+ * Integratie van QR-code scannen (nieuwe permissies vereist)
* Sleutelaanmaakwizard verbeterd
* Probleem met ontbrekende contacten na synchronisatie opgelost
* Vereist Android 4
@@ -13,6 +21,7 @@
* Oplossing voor probleem waarbij sommige geldige sleutels weergegeven werden als ingetrokken of verlopen
* Aanvaard geen ondertekeningen door verlopen of ingetrokken subsleutels
* Ondersteuning voor Keybase.io in geavanceerde modus
+ * Methode om alle sleutels tegelijk bij te werken
## 3.1.2
@@ -35,7 +44,7 @@
* Nieuw design voor ontcijferingsscherm
* Nieuw icoon en kleuren
* Oplossing voor importeren van geheime sleutels van Symantec Encryption Desktop
- * Subsleutel-ID's op Yubikeys worden nu currect gecontroleerd
+ * Experimentele ondersteuning voor YubiKey: subsleutel-ID's worden nu correct gecontroleerd
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Volledige ondersteuning voor Yubikey ondertekeningsgeneratie en ontcijfering!
* Stel installeerbare compatibele apps voor in apps-lijst
* Nieuw design voor ontcijferingsschermen
* Veel oplossingen voor sleutelimporteren, lost ook gestripte sleutels op
@@ -55,12 +63,13 @@
* Oplossing voor gebruikers-ID-intrekkingscertificaten
* Nieuwe cloud search (zoekt op traditionele sleutelservers en keybase.io)
* Ondersteuning voor strippen van sleutels in OpenKeychain
+ * Experimentele ondersteuning voor YubiKey: ondersteuning voor aanmaken en ontsleutelen van ondertekeningen
## 2.9.2
* Oplossing voor gebroken sleutels in 2.9.1
- * Yubikey-ontsleuteling werkt nu via API
+ * Experimentele ondersteuning voor YubiKey: ontsleuteling werkt nu via API
## 2.9.1
@@ -69,7 +78,7 @@
* Oplossing voor sleutelvlaggen (ondersteunt nu Mailvelope 0.7 sleutels)
* Verbeterde behandeling van wachtwoorden
* Sleutels delen via SafeSlinger
- * Yubikey: optie om andere PINs toe te staan, momenteel werkt enkel ondertekenen via de OpenPGP API, niet in OpenKeychain zelf
+ * Experimentele ondersteuning voor YubiKey: instelling om andere PIN's toe te laten, momenteel werkt ondertekenen enkel via de OpenPGP API, niet binnen OpenKeychain
* Oplossing voor gestripte sleutels
* SHA256 als standaard voor compatibiliteit
* Intent API is veranderd, zie https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Oplossing voor crashes geïntroduceerd in v2.8
* Experimentele ondersteuning voor ECC
- * Experimentele ondersteuning voor Yubikey (alleen ondertekenen met geïmporteerde sleutels)
+ * Experimentele ondersteuning voor YubiKey: enkel ondertekenen met geïmporteerde sleutels
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-pl/help_about.md b/OpenKeychain/src/main/res/raw-pl/help_about.md
index 9d635d9df..e80a2c766 100644
--- a/OpenKeychain/src/main/res/raw-pl/help_about.md
+++ b/OpenKeychain/src/main/res/raw-pl/help_about.md
@@ -6,8 +6,12 @@
License: GPLv3+
-## Developers
+## Main Developers
* Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
* Tim Bray
- * Vincent Breitmoser
## Libraries
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
@@ -38,9 +57,9 @@ License: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-pl/help_changelog.md b/OpenKeychain/src/main/res/raw-pl/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-pl/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-pl/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-pt/help_about.md b/OpenKeychain/src/main/res/raw-pt/help_about.md
index 9d635d9df..e80a2c766 100644
--- a/OpenKeychain/src/main/res/raw-pt/help_about.md
+++ b/OpenKeychain/src/main/res/raw-pt/help_about.md
@@ -6,8 +6,12 @@
License: GPLv3+
-## Developers
+## Main Developers
* Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
* Tim Bray
- * Vincent Breitmoser
## Libraries
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
@@ -38,9 +57,9 @@ License: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-pt/help_changelog.md b/OpenKeychain/src/main/res/raw-pt/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-pt/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-pt/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-ro/help_about.md b/OpenKeychain/src/main/res/raw-ro/help_about.md
index 9d635d9df..e80a2c766 100644
--- a/OpenKeychain/src/main/res/raw-ro/help_about.md
+++ b/OpenKeychain/src/main/res/raw-ro/help_about.md
@@ -6,8 +6,12 @@
License: GPLv3+
-## Developers
+## Main Developers
* Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
* Tim Bray
- * Vincent Breitmoser
## Libraries
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
@@ -38,9 +57,9 @@ License: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-ro/help_changelog.md b/OpenKeychain/src/main/res/raw-ro/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-ro/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-ro/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-ru/help_about.md b/OpenKeychain/src/main/res/raw-ru/help_about.md
index 9b2e6e78a..63978e0e0 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_about.md
+++ b/OpenKeychain/src/main/res/raw-ru/help_about.md
@@ -6,8 +6,12 @@
Лицензия: GPLv3+
-## Разработчики
+## Ведущие разработчики
* Dominik Schürmann (Ведущий разработчик)
+ * Vincent Breitmoser
+
+## Участники
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (разработчик APG)
* Tim Bray
- * Vincent Breitmoser
## Используемые библиотеки
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
@@ -38,9 +57,9 @@
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-ru/help_certification.md b/OpenKeychain/src/main/res/raw-ru/help_certification.md
index 61dfa67a5..06ef290f6 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-ru/help_certification.md
@@ -3,7 +3,7 @@
## Подтверждение ключей
Без подтверждения Вы не можете быть уверены, что ключ принадлежит определенному человеку.
Простейший способ подтвердить - отсканировать QR код или получить ключ через NFC.
-To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
+Для подтверждения ключей более чем двух человек, мы рекомендуем использовать один из доступных методов обмена ключами.
## Статус ключей
@@ -17,9 +17,9 @@ To confirm keys between more than two persons, we suggest to use the key exchang
Отозван: Этот ключ больше не действителен. Владелец ключа отозвал его.
## Подробная информация
-A "key confirmation" in OpenKeychain is implemented by creating a certification according to the OpenPGP standard.
-This certification is a ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) described in the standard by:
-"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
+"Подтверждение ключей" в OpenKeychain реализовано методом сертификации, согласно стандарту OpenPGP.
+Эта сертификация представляет собой ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) , описанной в стандарте:
+"Издатель такой подписи (поручитель) никак не оговаривает, что провёл какую-то проверку ключа и его связь с лицом, чьё имя указано в сертификате."
Traditionally, certifications (also with higher certification levels, such as "positive certifications" (0x13)) are organized in OpenPGP's Web of Trust.
Our model of key confirmation is a much simpler concept to avoid common usability problems related to this Web of Trust.
diff --git a/OpenKeychain/src/main/res/raw-ru/help_changelog.md b/OpenKeychain/src/main/res/raw-ru/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-ru/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-ru/help_start.md b/OpenKeychain/src/main/res/raw-ru/help_start.md
index 4cc331942..9f40e679c 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_start.md
+++ b/OpenKeychain/src/main/res/raw-ru/help_start.md
@@ -1,16 +1,16 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## How do I activate OpenKeychain in K-9 Mail?
-To use OpenKeychain with K-9 Mail, you want to follow these steps:
- 1. Open K-9 Mail and long-tap on the account you want to use OpenKeychain with.
- 2. Select "Account settings", scroll to the very bottom and click "Cryptography".
- 3. Click on "OpenPGP Provider" and select OpenKeychain from the list.
+## Как мне активировать OpenKeychain в K-9 Mail?
+Для использования OpenKeychain с K-9 Mail, необходимо выполнить следующие шаги:
+ 1. Открыть K-9 Mail и долгим нажатием выбрать учетную запись с которой будет использоваться OpenKeychain.
+ 2. Выбрать "Настойки учетной записи" и опуститься в самый конец меню до пункта "Шифрование".
+ 3. Нажать на "OpenPGP Provider" и выбрать OpenKeychain из списка.
-## I found a bug in OpenKeychain!
-Please report the bug using the [issue tracker of OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
+## Я нашел ошибку в OpenKeychain!
+Пожалуйста, сообщайте обо всех проблемах и ошибках в разделе [Решение проблем OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
-## Contribute
-If you want to help us developing OpenKeychain by contributing code [follow our small guide on Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
+## Вклад в развитие
+Если Вы хотите помочь в разработке OpenKeychain, обратитесь к [инструкции на Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
-## Translations
-Help translating OpenKeychain! Everybody can participate at [OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
+## Перевод
+Помогите переводить OpenKeychain! Каждый может принять участие в переводе [OpenKeychain на Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-sl/help_about.md b/OpenKeychain/src/main/res/raw-sl/help_about.md
index dc333ca2d..f3319c2dd 100644
--- a/OpenKeychain/src/main/res/raw-sl/help_about.md
+++ b/OpenKeychain/src/main/res/raw-sl/help_about.md
@@ -6,8 +6,12 @@
Licenca: GPLv3+
-## Razvijalci
+## Main Developers
* Dominik Schürmann (Skrbnik)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ Licenca: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
* Tim Bray
- * Vincent Breitmoser
## Knjižnice
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (Licenca MIT X11)
@@ -38,9 +57,9 @@ Licenca: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Licenca Apache v2)
* [ZXing](https://github.com/zxing/zxing) (Licenca Apache v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Licenca Apache v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Licenca Apache v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Licenca Apache v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (Licenca MIT)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Licenca Apache v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Licenca Apache v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Licenca Apache v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-sl/help_changelog.md b/OpenKeychain/src/main/res/raw-sl/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-sl/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-sl/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-sr/help_about.md b/OpenKeychain/src/main/res/raw-sr/help_about.md
index 77a4904e5..a6ba4ba2c 100644
--- a/OpenKeychain/src/main/res/raw-sr/help_about.md
+++ b/OpenKeychain/src/main/res/raw-sr/help_about.md
@@ -6,27 +6,46 @@
Лиценца: ГПЛв3+
-## Програмери
- * Dominik Schürmann (главни програмер)
- * Art O Cathain
- * Ash Hughes
- * Brian C. Barnes
- * Bahtiar „kalkin“ Gadimov
- * Daniel Albert
- * Daniel Hammann
- * Daniel Haß
- * Greg Witczak
+## Главни програмери
+ * Доминик Ширман (Dominik Schürmann, одржавалац)
+ * Винсент Брајтмозер (Vincent Breitmoser)
+
+## Доприносиоци
+ * Adithya Abraham Philip
+ * Арт Окатаин (Art O Cathain)
+ * Еш Хјуџис (Ash Hughes)
+ * Брајан Ц. Барнс (Brian C. Barnes)
+ * Бахтјар „kalkin“ Гадимов (Bahtiar Gadimov)
+ * Данијел Алберт (Daniel Albert)
+ * Данијел Хаман (Daniel Hammann)
+ * Данијел Хас (Daniel Haß)
+ * Данијел Нелц (Daniel Nelz)
+ * Данијел Рамос (Daniel Ramos)
+ * Грег Вичак (Greg Witczak)
+ * „iseki“
+ * Ишан Кана (Ishan Khanna)
+ * „jellysheep“
+ * „Jesperbk“
+ * „jkolo“
+ * Џои Кастиљо (Joey Castillo)
+ * Каи Ђианг (Kai Jiang)
+ * Картик Арора (Kartik Arora)
+ * „Kent“
+ * „ligi“
+ * Лукас Зорић (Lukas Zorich)
+ * Маноџ Кана (Manoj Khanna)
* „mar-v-in“
- * Markus Doits
- * Miroojin Bakshi
- * Nikhil Peter Raj
- * Paul Sarbinowski
+ * Маркус Доитс (Markus Doits)
+ * Мироџин Бакши (Miroojin Bakshi)
+ * Морган Гангвер (Morgan Gangwere)
+ * Никил Питер Раџ (Nikhil Peter Raj)
+ * Паул Сарбиновски (Paul Sarbinowski)
* „Senecaso“
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (АПГ 1.x)
+ * „steelman“
+ * „Thialfihar“ (АПГ програмер)
* Tim Bray
- * Vincent Breitmoser
## Библиотеке
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (МИТ Икс11 лиценца)
@@ -38,9 +57,9 @@
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Апачи лиценца в2)
* [ZXing](https://github.com/zxing/zxing) (Апачи лиценца в2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Апачи лиценца в2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Материјал дизајн)</a> (Апачи лиценца в2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Апачи лиценца в2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Апачи лиценца в2)
* [Snackbar](https://github.com/nispok/snackbar) (МИТ лиценца)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Апачи лиценца в2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Апачи лиценца в2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Апачи лиценца в2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Апачи лиценца в2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-sr/help_certification.md b/OpenKeychain/src/main/res/raw-sr/help_certification.md
index 20b68cf9b..2d5da8230 100644
--- a/OpenKeychain/src/main/res/raw-sr/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-sr/help_certification.md
@@ -18,7 +18,7 @@
## Напредни подаци
„Потврда кључа“ у Отвореном кључарнику се реализује прављењем сертификације по ОпенПГП стандарду.
-Ова сертификација је [„општа сертификација (0x10)“](http://tools.ietf.org/html/rfc4880#section-5.2.1) описана стандардом у:
+Ова сертификација је [„општа сертификација (0x10)“](http://tools.ietf.org/html/rfc4880#section-5.2.1) описана у стандарду:
"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
Traditionally, certifications (also with higher certification levels, such as "positive certifications" (0x13)) are organized in OpenPGP's Web of Trust.
diff --git a/OpenKeychain/src/main/res/raw-sr/help_changelog.md b/OpenKeychain/src/main/res/raw-sr/help_changelog.md
index e33c6b4e4..bb230ab96 100644
--- a/OpenKeychain/src/main/res/raw-sr/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-sr/help_changelog.md
@@ -1,7 +1,15 @@
[//]: #
-## 3.2beta2
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
+## 3.2
+
+ * Прво издање са пуном подршком за Јубикључ преко корисничког сучеља: уређивање кључева, повезивање Јубикључева на кључеве,...
* Материјал дизајн
* Интеграција читача бар-кôда (захтева нове дозволе)
* Побољшан чаробњак прављења кључа
@@ -11,8 +19,9 @@
* Поједностављење поставки криптографије, бољи избор безбедних шифрара
* АПИ: одвојени потписи, слободан избор кључа за потпис,...
* Поправка: неки од важећих кључева су били приказивани као опозвани или истекли
- * Не прихаћај потписе од истеклих или опозваних кључева
+ * Не прихатај потписе од истеклих или опозваних кључева
* Keybase.io подршка у напредном приказу
+ * метода ажурирања свих кључева одједном
## 3.1.2
@@ -35,7 +44,7 @@
* Редизајн екрана дешифровања
* Нова употреба икона и боја
* Поправка увоза тајних кључева са „Symantec Encryption Desktop“
- * ИД-ови поткључева на Јубикључу сада се исправно проверавају
+ * Експериментална подршка за Јубикључ: ИД-ови поткључа сада се исправно проверавају
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Пуна подршка за прављење и дешифровање Јубикључ потписа!
* Предлози за инсталабилне компатибилне апликације у списку апликација
* Нови дизајн за екране дешифровања
* Много поправки за увоз кључа, такође поправљени огољени кључеви
@@ -55,12 +63,13 @@
* Поправка корисничког ид-а сертификата опозива
* Нова клауд претрага (тражи преко традиционални сервера кључева и keybase.io)
* Подршка за огољивање кључева унутар Отвореног кључарника
+ * Експериментална подршка за Јубикључ: подршка за генерисање потписа и дешифровање
## 2.9.2
* Поправка кључева покварених у 2.9.1
- * Јубикључ дешифровање сада ради преко АПИ-ја
+ * Експериментална подршка за Јубикључ: дешифровање сада ради преко АПИ-ја
## 2.9.1
@@ -69,7 +78,7 @@
* Поправка руковања заставицама кључа (подршка за Mailvelope 0.7 кључеве)
* Побољшано руковање лозинкама
* Дељење кључа преко Сејфслингера (SafeSlinger)
- * Јубикључ: опција за дозволу осталих ПИН-ова, тренутно ради само потписивање преко ОпенПГП АПИ-ја, не унутар Отвореног кључарника
+ * Експериментална подршка за Јубикључ: поставка за дозволу осталих ПИНова, за сада само потписивање преко ОпенПГП АПИ-ја ради, не унутар Отвореног кључарника
* Поправка употребе огољених кључева
* СХА256 подразумевано због компатибилности
* Интент АПИ је измењен, погледајте https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Поправка рушења која су се појавила у в2.8
* Експериментална подршка за ЕЦЦ
- * Експериментална подршка за Јубикључ (Yubikey) (само пријава са увезеним кључевима)
+ * Експериментална подршка за Јубикључ: потписивање само увезеним кључевима
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-sv/help_about.md b/OpenKeychain/src/main/res/raw-sv/help_about.md
index 9d635d9df..32426e26e 100644
--- a/OpenKeychain/src/main/res/raw-sv/help_about.md
+++ b/OpenKeychain/src/main/res/raw-sv/help_about.md
@@ -1,13 +1,17 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (NOTERING: Var vänlig och sätt varje mening på sin egen rad, Transifex sätter varje rad i sitt eget fält för översättningar!)
[http://www.openkeychain.org](http://www.openkeychain.org)
-[OpenKeychain](http://www.openkeychain.org) is an OpenPGP implementation for Android.
+[OpenKeychain](http://www.openkeychain.org) är en OpenPGP-implementation till Android.
-License: GPLv3+
+Licens: GPLv3+
-## Developers
- * Dominik Schürmann (Maintainer)
+## Huvudsakliga utvecklare
+ * Dominik Schürmann (Projektledare)
+ * Vincent Breitmoser
+
+## Medarbetare
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,22 +19,37 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG-utvecklare)
* Tim Bray
- * Vincent Breitmoser
-## Libraries
- * [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
- * [SafeSlinger Exchange library](https://github.com/SafeSlingerProject/exchange-android) (MIT License)
+## Biblioteken
+ * [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11-licens)
+ * [SafeSlinger's bibliotek för utbyte](https://github.com/SafeSlingerProject/exchange-android) (MIT-licens)
* [Android Support Libraries](http://developer.android.com/tools/support-library/index.html) (Apache License v2)
* [KeybaseLib](https://github.com/timbray/KeybaseLib) (Apache License v2)
* [TokenAutoComplete](https://github.com/splitwise/TokenAutoComplete) (Apache License v2)
@@ -38,9 +57,9 @@ License: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-sv/help_certification.md b/OpenKeychain/src/main/res/raw-sv/help_certification.md
index 3518adf73..babb90ab0 100644
--- a/OpenKeychain/src/main/res/raw-sv/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-sv/help_certification.md
@@ -1,22 +1,22 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (NOTERING: Var vänlig och sätt varje mening på sin egen rad, Transifex sätter varje rad i sitt eget fält för översättningar!)
-## Key Confirmation
-Without confirmation, you cannot be sure if a key really corresponds to a specific person.
-The simplest way to confirm a key is by scanning the QR Code or exchanging it via NFC.
-To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
+## Nyckelbekräftelse
+Utan bekräftelse kan du inte vara säker på om en nyckel verkligen motsvarar en viss person.
+Det enklaste sättet att bekräfta en nyckel är genom att skanna QR-koden eller att byta ut den via NFC.
+För att bekräfta nycklar mellan fler än två personer så föreslår vi att du använder utbytesmetoden som är passande för dina nycklar.
-## Key Status
+## Status för nyckel
<img src="status_signature_verified_cutout_24dp"/>
-Confirmed: You have already confirmed this key, e.g., by scanning the QR Code.
+Bekräftat: Du har redan bekräftat den här nyckeln, t.ex genom att skanna QR-koden.
<img src="status_signature_unverified_cutout_24dp"/>
Unconfirmed: This key has not been confirmed yet. You cannot be sure if the key really corresponds to a specific person.
<img src="status_signature_expired_cutout_24dp"/>
-Expired: This key is no longer valid. Only the owner can extend its validity.
+Utgången: Den här nyckeln är inte längre giltig. Endast ägaren kan förlänga dess giltighet.
<img src="status_signature_revoked_cutout_24dp"/>
Revoked: This key is no longer valid. It has been revoked by its owner.
-## Advanced Information
+## Avancerad information
A "key confirmation" in OpenKeychain is implemented by creating a certification according to the OpenPGP standard.
This certification is a ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) described in the standard by:
"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
diff --git a/OpenKeychain/src/main/res/raw-sv/help_changelog.md b/OpenKeychain/src/main/res/raw-sv/help_changelog.md
index ab7fa8773..b80e08e6e 100644
--- a/OpenKeychain/src/main/res/raw-sv/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-sv/help_changelog.md
@@ -1,18 +1,27 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (NOTERING: Var vänlig och sätt varje mening på sin egen rad, Transifex sätter varje rad i sitt eget fält för översättningar!)
+
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
## 3.2
- * Material design
- * Integration of QR Scanner (New permissions required)
- * Improved key creation wizard
- * Fix missing contacts after sync
- * Requires Android 4
+ * Första versionen med fullt YubiKey-stöd tillgängligt från användargränssnittet: Redigera nycklar. binda YubiKey till nycklar,...
+ * Materialkonstruktion
+ * Integrering av skanning av QR-kod (Nya behörigheter krävs)
+ * Förbättrade guiden för skapande av nyckel
+ * Fixa kontakter som saknas efter synkronisering
+ * Kräver Android 4
* Redesigned key screen
* Simplify crypto preferences, better selection of secure ciphers
* API: Detached signatures, free selection of signing key,...
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
- * Keybase.io support in advanced view
+ * Keybase.io-stöd i avancerad vy
+ * Metod för att uppdatera alla nycklar på en gång
## 3.1.2
@@ -23,19 +32,19 @@
## 3.1.1
* Fix key export to files (they were written partially)
- * Fix crash on Android 2.3
+ * Fixa krasch i Android 2.3
## 3.1
- * Fix crash on Android 5
- * New certify screen
+ * Fixa krasch i Android 5
+ Ny certifieringsskärm
* Secure Exchange directly from key list (SafeSlinger library)
* New QR Code program flow
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
- * Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ Fixa trasiga nycklar i 2.9.1
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-sv/help_start.md b/OpenKeychain/src/main/res/raw-sv/help_start.md
index 4cc331942..be8cc64b5 100644
--- a/OpenKeychain/src/main/res/raw-sv/help_start.md
+++ b/OpenKeychain/src/main/res/raw-sv/help_start.md
@@ -1,16 +1,16 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (NOTERING: Var vänlig och sätt varje mening på sin egen rad, Transifex sätter varje rad i sitt eget fält för översättningar!)
-## How do I activate OpenKeychain in K-9 Mail?
-To use OpenKeychain with K-9 Mail, you want to follow these steps:
+## Hur aktiverar jag OpenKeychain i K-9 Mail?
+För att använda OpenKeychain med K-9 Mail så ska du följa dessa steg:
1. Open K-9 Mail and long-tap on the account you want to use OpenKeychain with.
- 2. Select "Account settings", scroll to the very bottom and click "Cryptography".
- 3. Click on "OpenPGP Provider" and select OpenKeychain from the list.
+ 2. Välj "Konto-inställningar", skrolla längst ner och klicka på "Kryptering".
+ 3. Klicka på "OpenPGP-leverantör" och välj OpenKeyChain från listan.
-## I found a bug in OpenKeychain!
-Please report the bug using the [issue tracker of OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
+## Jag hittade en bugg i OpenKeychain!
+Vänligen rapportera buggen genom att använda [problemspåraren för OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
-## Contribute
-If you want to help us developing OpenKeychain by contributing code [follow our small guide on Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
+## Bidra
+Om du vill hjälpa oss att utveckla OpenKeychain genom att bidra med kod [följ vår lilla guide på Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
-## Translations
+## Översättningar
Help translating OpenKeychain! Everybody can participate at [OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-tr/help_about.md b/OpenKeychain/src/main/res/raw-tr/help_about.md
index 9d635d9df..e80a2c766 100644
--- a/OpenKeychain/src/main/res/raw-tr/help_about.md
+++ b/OpenKeychain/src/main/res/raw-tr/help_about.md
@@ -6,8 +6,12 @@
License: GPLv3+
-## Developers
+## Main Developers
* Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
* Tim Bray
- * Vincent Breitmoser
## Libraries
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
@@ -38,9 +57,9 @@ License: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-tr/help_changelog.md b/OpenKeychain/src/main/res/raw-tr/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-tr/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-tr/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-uk/help_about.md b/OpenKeychain/src/main/res/raw-uk/help_about.md
index 9d635d9df..e80a2c766 100644
--- a/OpenKeychain/src/main/res/raw-uk/help_about.md
+++ b/OpenKeychain/src/main/res/raw-uk/help_about.md
@@ -6,8 +6,12 @@
License: GPLv3+
-## Developers
+## Main Developers
* Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,18 +19,33 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
* Tim Bray
- * Vincent Breitmoser
## Libraries
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
@@ -38,9 +57,9 @@ License: GPLv3+
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-uk/help_changelog.md b/OpenKeychain/src/main/res/raw-uk/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-uk/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-uk/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-vi/help_about.md b/OpenKeychain/src/main/res/raw-vi/help_about.md
new file mode 100644
index 000000000..e80a2c766
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-vi/help_about.md
@@ -0,0 +1,65 @@
+[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+[http://www.openkeychain.org](http://www.openkeychain.org)
+
+[OpenKeychain](http://www.openkeychain.org) is an OpenPGP implementation for Android.
+
+License: GPLv3+
+
+## Main Developers
+ * Dominik Schürmann (Maintainer)
+ * Vincent Breitmoser
+
+## Contributors
+ * Adithya Abraham Philip
+ * Art O Cathain
+ * Ash Hughes
+ * Brian C. Barnes
+ * Bahtiar 'kalkin' Gadimov
+ * Daniel Albert
+ * Daniel Hammann
+ * Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
+ * Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
+ * 'mar-v-in'
+ * Markus Doits
+ * Miroojin Bakshi
+ * Morgan Gangwere
+ * Nikhil Peter Raj
+ * Paul Sarbinowski
+ * 'Senecaso'
+ * Signe Rüsch
+ * Sreeram Boyapati
+ * 'steelman'
+ * 'Thialfihar' (APG developer)
+ * Tim Bray
+
+## Libraries
+ * [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
+ * [SafeSlinger Exchange library](https://github.com/SafeSlingerProject/exchange-android) (MIT License)
+ * [Android Support Libraries](http://developer.android.com/tools/support-library/index.html) (Apache License v2)
+ * [KeybaseLib](https://github.com/timbray/KeybaseLib) (Apache License v2)
+ * [TokenAutoComplete](https://github.com/splitwise/TokenAutoComplete) (Apache License v2)
+ * [MiniDNS](https://github.com/rtreffer/minidns) (Apache License v2)
+ * [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
+ * [ZXing](https://github.com/zxing/zxing) (Apache License v2)
+ * [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
+ * [Snackbar](https://github.com/nispok/snackbar) (MIT License)
+ * [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
+ * [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-vi/help_certification.md b/OpenKeychain/src/main/res/raw-vi/help_certification.md
new file mode 100644
index 000000000..3518adf73
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-vi/help_certification.md
@@ -0,0 +1,28 @@
+[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## Key Confirmation
+Without confirmation, you cannot be sure if a key really corresponds to a specific person.
+The simplest way to confirm a key is by scanning the QR Code or exchanging it via NFC.
+To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
+
+## Key Status
+
+<img src="status_signature_verified_cutout_24dp"/>
+Confirmed: You have already confirmed this key, e.g., by scanning the QR Code.
+<img src="status_signature_unverified_cutout_24dp"/>
+Unconfirmed: This key has not been confirmed yet. You cannot be sure if the key really corresponds to a specific person.
+<img src="status_signature_expired_cutout_24dp"/>
+Expired: This key is no longer valid. Only the owner can extend its validity.
+<img src="status_signature_revoked_cutout_24dp"/>
+Revoked: This key is no longer valid. It has been revoked by its owner.
+
+## Advanced Information
+A "key confirmation" in OpenKeychain is implemented by creating a certification according to the OpenPGP standard.
+This certification is a ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) described in the standard by:
+"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
+
+Traditionally, certifications (also with higher certification levels, such as "positive certifications" (0x13)) are organized in OpenPGP's Web of Trust.
+Our model of key confirmation is a much simpler concept to avoid common usability problems related to this Web of Trust.
+We assume that keys are verified only to a certain degree that is still usable enough to be executed "on the go".
+We also do not implement (potentially transitive) trust signatures or an ownertrust database like in GnuPG.
+Furthermore, keys which contain at least one user ID certified by a trusted key will be marked as "confirmed" in the key listings. \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-vi/help_changelog.md b/OpenKeychain/src/main/res/raw-vi/help_changelog.md
new file mode 100644
index 000000000..d45ce636b
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-vi/help_changelog.md
@@ -0,0 +1,278 @@
+[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
+## 3.2
+
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
+ * Material design
+ * Integration of QR Code Scanning (New permissions required)
+ * Improved key creation wizard
+ * Fix missing contacts after sync
+ * Requires Android 4
+ * Redesigned key screen
+ * Simplify crypto preferences, better selection of secure ciphers
+ * API: Detached signatures, free selection of signing key,...
+ * Fix: Some valid keys were shown revoked or expired
+ * Don't accept signatures by expired or revoked subkeys
+ * Keybase.io support in advanced view
+ * Method to update all keys at once
+
+
+## 3.1.2
+
+ * Fix key export to files (now for real)
+
+
+## 3.1.1
+
+ * Fix key export to files (they were written partially)
+ * Fix crash on Android 2.3
+
+
+## 3.1
+
+ * Fix crash on Android 5
+ * New certify screen
+ * Secure Exchange directly from key list (SafeSlinger library)
+ * New QR Code program flow
+ * Redesigned decrypt screen
+ * New icon usage and colors
+ * Fix import of secret keys from Symantec Encryption Desktop
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
+
+
+## 3.0.1
+
+ * Better handling of large key imports
+ * Improved subkey selection
+
+
+## 3.0
+
+ * Propose installable compatible apps in apps list
+ * New design for decryption screens
+ * Many fixes for key import, also fixes stripped keys
+ * Honor and display key authenticate flags
+ * User interface to generate custom keys
+ * Fixing user id revocation certificates
+ * New cloud search (searches over traditional keyservers and keybase.io)
+ * Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
+
+
+## 2.9.2
+
+ * Fix keys broken in 2.9.1
+ * Experimental YubiKey support: Decryption now working via API
+
+
+## 2.9.1
+
+ * Split encrypt screen into two
+ * Fix key flags handling (now supporting Mailvelope 0.7 keys)
+ * Improved passphrase handling
+ * Key sharing via SafeSlinger
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Fix usage of stripped keys
+ * SHA256 as default for compatibility
+ * Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
+ * OpenPGP API now handles revoked/expired keys and returns all user ids
+
+
+## 2.9
+
+ * Fixing crashes introduced in v2.8
+ * Experimental ECC support
+ * Experimental YubiKey support: Only signing with imported keys
+
+
+## 2.8
+
+ * So many bugs have been fixed in this release that we focus on the main new features
+ * Key edit: awesome new design, key revocation
+ * Key import: awesome new design, secure keyserver connections via hkps, keyserver resolving via DNS SRV records
+ * New first time screen
+ * New key creation screen: autocompletion of name and email based on your personal Android accounts
+ * File encryption: awesome new design, support for encrypting multiple files
+ * New icons to show status of key (by Brennan Novak)
+ * Important bug fix: Importing of large key collections from a file is now possible
+ * Notification showing cached passphrases
+ * Keys are connected to Android's contacts
+
+This release wouldn't be possible without the work of Vincent Breitmoser (GSoC 2014), mar-v-in (GSoC 2014), Daniel Albert, Art O Cathain, Daniel Haß, Tim Bray, Thialfihar
+
+## 2.7
+
+ * Purple! (Dominik, Vincent)
+ * New key view design (Dominik, Vincent)
+ * New flat Android buttons (Dominik, Vincent)
+ * API fixes (Dominik)
+ * Keybase.io import (Tim Bray)
+
+
+## 2.6.1
+
+ * Some fixes for regression bugs
+
+
+## 2.6
+
+ * Key certifications (thanks to Vincent Breitmoser)
+ * Support for GnuPG partial secret keys (thanks to Vincent Breitmoser)
+ * New design for signature verification
+ * Custom key length (thanks to Greg Witczak)
+ * Fix share-functionality from other apps
+
+
+## 2.5
+
+ * Fix decryption of symmetric OpenPGP messages/files
+ * Refactored key edit screen (thanks to Ash Hughes)
+ * New modern design for encrypt/decrypt screens
+ * OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)
+
+
+## 2.4
+Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
+Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):
+Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Paul Sarbinowski, Sreeram Boyapati, Vincent Breitmoser.
+
+ * New unified key list
+ * Colorized key fingerprint
+ * Support for keyserver ports
+ * Deactivate possibility to generate weak keys
+ * Much more internal work on the API
+ * Certify user ids
+ * Keyserver query based on machine-readable output
+ * Lock navigation drawer on tablets
+ * Suggestions for emails on creation of keys
+ * Search in public key lists
+ * And much more improvements and fixes…
+
+
+## 2.3.1
+
+ * Hotfix for crash when upgrading from old versions
+
+
+## 2.3
+
+ * Remove unnecessary export of public keys when exporting secret key (thanks to Ash Hughes)
+ * Fix setting expiry dates on keys (thanks to Ash Hughes)
+ * More internal fixes when editing keys (thanks to Ash Hughes)
+ * Querying keyservers directly from the import screen
+ * Fix layout and dialog style on Android 2.2-3.0
+ * Fix crash on keys with empty user ids
+ * Fix crash and empty lists when coming back from signing screen
+ * Bouncy Castle (cryptography library) updated from 1.47 to 1.50 and build from source
+ * Fix upload of key from signing screen
+
+
+## 2.2
+
+ * New design with navigation drawer
+ * New public key list design
+ * New public key view
+ * Bug fixes for importing of keys
+ * Key cross-certification (thanks to Ash Hughes)
+ * Handle UTF-8 passwords properly (thanks to Ash Hughes)
+ * First version with new languages (thanks to the contributors on Transifex)
+ * Sharing of keys via QR Codes fixed and improved
+ * Package signature verification for API
+
+
+## 2.1.1
+
+ * API Updates, preparation for K-9 Mail integration
+
+
+## 2.1
+
+ * Lots of bug fixes
+ * New API for developers
+ * PRNG bug fix by Google
+
+
+## 2.0
+
+ * Complete redesign
+ * Share public keys via QR codes, NFC beam
+ * Sign keys
+ * Upload keys to server
+ * Fixes import issues
+ * New AIDL API
+
+
+## 1.0.8
+
+ * Basic keyserver support
+ * App2sd
+ * More choices for passphrase cache: 1, 2, 4, 8, hours
+ * Translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)
+ * Bugfixes
+ * Optimizations
+
+
+## 1.0.7
+
+ * Fixed problem with signature verification of texts with trailing newline
+ * More options for passphrase cache time to live (20, 40, 60 mins)
+
+
+## 1.0.6
+
+ * Account adding crash on Froyo fixed
+ * Secure file deletion
+ * Option to delete key file after import
+ * Stream encryption/decryption (gallery, etc.)
+ * New options (language, force v3 signatures)
+ * Interface changes
+ * Bugfixes
+
+
+## 1.0.5
+
+ * German and Italian translation
+ * Much smaller package, due to reduced BC sources
+ * New preferences GUI
+ * Layout adjustment for localization
+ * Signature bugfix
+
+
+## 1.0.4
+
+ * Fixed another crash caused by some SDK bug with query builder
+
+
+## 1.0.3
+
+ * Fixed crashes during encryption/signing and possibly key export
+
+
+## 1.0.2
+
+ * Filterable key lists
+ * Smarter pre-selection of encryption keys
+ * New Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers
+ * Fixes and additional features (key preselection) for K-9 Mail, new beta build available
+
+
+## 1.0.1
+
+ * GMail account listing was broken in 1.0.0, fixed again
+
+
+## 1.0.0
+
+ * K-9 Mail integration, APG supporting beta build of K-9 Mail
+ * Support of more file managers (including ASTRO)
+ * Slovenian translation
+ * New database, much faster, less memory usage
+ * Defined Intents and content provider for other apps
+ * Bugfixes \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-vi/help_start.md b/OpenKeychain/src/main/res/raw-vi/help_start.md
new file mode 100644
index 000000000..4cc331942
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-vi/help_start.md
@@ -0,0 +1,16 @@
+[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## How do I activate OpenKeychain in K-9 Mail?
+To use OpenKeychain with K-9 Mail, you want to follow these steps:
+ 1. Open K-9 Mail and long-tap on the account you want to use OpenKeychain with.
+ 2. Select "Account settings", scroll to the very bottom and click "Cryptography".
+ 3. Click on "OpenPGP Provider" and select OpenKeychain from the list.
+
+## I found a bug in OpenKeychain!
+Please report the bug using the [issue tracker of OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
+
+## Contribute
+If you want to help us developing OpenKeychain by contributing code [follow our small guide on Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
+
+## Translations
+Help translating OpenKeychain! Everybody can participate at [OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-zh-rTW/help_about.md b/OpenKeychain/src/main/res/raw-zh-rTW/help_about.md
index 95fca0cec..4e3a03b4b 100644
--- a/OpenKeychain/src/main/res/raw-zh-rTW/help_about.md
+++ b/OpenKeychain/src/main/res/raw-zh-rTW/help_about.md
@@ -2,12 +2,16 @@
[http://www.openkeychain.org](http://www.openkeychain.org)
-<a href="http://www.openkeychain.org">OpenKeychain</a>是一個Android的OpenPGP應用。
+[OpenKeychain](http://www.openkeychain.org)是一個Android的OpenPGP應用。
-授權: GPLv3+
+授權:GPLv3+
-## Developers
- * Dominik Schürmann (Maintainer)
+##主要開發者
+ * Dominik Schürmann (維護人)
+ * Vincent Breitmoser
+
+##貢獻者
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,20 +19,35 @@
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG開發者)
* Tim Bray
- * Vincent Breitmoser
-## Libraries
+##函式庫
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
* [SafeSlinger Exchange library](https://github.com/SafeSlingerProject/exchange-android) (MIT License)
* [Android Support Libraries](http://developer.android.com/tools/support-library/index.html) (Apache License v2)
@@ -38,9 +57,9 @@
* [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
* [ZXing](https://github.com/zxing/zxing) (Apache License v2)
* [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache License v2)
* [Snackbar](https://github.com/nispok/snackbar) (MIT License)
* [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache License v2)
* [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-zh-rTW/help_certification.md b/OpenKeychain/src/main/res/raw-zh-rTW/help_certification.md
index a69349fa2..2055f2e36 100644
--- a/OpenKeychain/src/main/res/raw-zh-rTW/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-zh-rTW/help_certification.md
@@ -1,28 +1,28 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-金鑰認證
-這個身分識別尚未經過認證,你不能確認這個身分識別是否屬於真的某個人。
-最簡單確認金鑰的方式就是透過掃描QR code或是經由NFC交換。
-To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
+##金鑰確認
+在經過確認之前,你無法確定這個金鑰是否真實屬於某個人。
+確認金鑰的最簡單方式就是透過掃描QR code或是經由NFC交換。
+要在多於兩個人之間確認彼此的金鑰,我們建議使用金鑰交換方式。
## 金鑰狀態
<img src="status_signature_verified_cutout_24dp"/>
-已認證: 你已經認證了這個金鑰,例如透過掃描QR Code。
+已確認:你已經確認了這個金鑰,例如透過掃描QR Code。
<img src="status_signature_unverified_cutout_24dp"/>
-未確認:這個身分識別尚未經過認證,你不能確認這個身分識別是否屬於真的某個人。
+未確認:這個金鑰尚未經過確認,你無法確定這個金鑰是否真實屬於某個人。
<img src="status_signature_expired_cutout_24dp"/>
-已過期:這個金鑰因超過有效期限而失效。只有金鑰擁有者可以改變有效期限。
+已過期:這個金鑰不再有效。只有金鑰擁有者可以展延有效期限。
<img src="status_signature_revoked_cutout_24dp"/>
已撤銷:這個金鑰已經被擁有者撤銷而失效。
-## Advanced Information
-在OpenKeychain中,透過根據標準OpenPGP所建立的證書可以簡單的認證一個金鑰。
-This certification is a ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) described in the standard by:
-"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
+##進階資訊
+在OpenKeychain中,確認金鑰是透過根據OpenPGP標準簽發認證來達成。
+這是一個“[一般認證 (0x10)](http://tools.ietf.org/html/rfc4880#section-5.2.1)”,規範描述如下:
+“認證的發行者不就妥善檢查金鑰持有人與金鑰所示身份相符與否一事做出任何允諾。”
-Traditionally, certifications (also with higher certification levels, such as "positive certifications" (0x13)) are organized in OpenPGP's Web of Trust.
-Our model of key confirmation is a much simpler concept to avoid common usability problems related to this Web of Trust.
-We assume that keys are verified only to a certain degree that is still usable enough to be executed "on the go".
-We also do not implement (potentially transitive) trust signatures or an ownertrust database like in GnuPG.
-Furthermore, keys which contain at least one user ID certified by a trusted key will be marked as "confirmed" in the key listings. \ No newline at end of file
+傳統上,包含更高等級的(像是主動型認證(0x13))認證在內,認證是有組織的存在於OpenPGP信任網當中。
+我們的金鑰確認模型採用一套相對簡單的概念,以避開普遍存在的信任網相關可用性問題。
+我們假設金鑰只驗證到足以隨時隨地使用的程度。
+同時我們暫時也不打算導入像是GnuPG的信任簽章或主觀信任資料庫。
+此外,如果某金鑰含有至少一個被信任金鑰所認證的身分時,這把金鑰將被標記為已確認。 \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.md b/OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.md
index ab7fa8773..da95f2184 100644
--- a/OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.md
@@ -1,75 +1,84 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
- * Material design
- * Integration of QR Scanner (New permissions required)
- * Improved key creation wizard
- * Fix missing contacts after sync
- * Requires Android 4
- * Redesigned key screen
- * Simplify crypto preferences, better selection of secure ciphers
- * API: Detached signatures, free selection of signing key,...
- * Fix: Some valid keys were shown revoked or expired
- * Don't accept signatures by expired or revoked subkeys
- * Keybase.io support in advanced view
+ * 首次完整支援Yubikey:修改金鑰、連結Yubikey與金鑰、...
+ * 素材設計
+ * 整合QR條碼掃描 (需要新權限)
+ * 改進的金鑰建立精靈
+ * 修正同步後遺失聯絡人
+ * 最低要求 Android 4
+ * 重新設計的金鑰畫面
+ * 簡化的加密參數,更佳的安全加密算法選項
+ * API:分離的簽名、自由選擇用來簽名的金鑰、...
+ * 修正:部分有效的金鑰被顯示為已撤銷或過期
+ * 不接受來自已撤銷或過期子金鑰的簽名
+ * 進階檢視中的Keybase.io支援
+ * 可以一次更新所有的金鑰了
## 3.1.2
- * Fix key export to files (now for real)
+ * 修正匯出金鑰到檔案的功能(這次是真的了)
## 3.1.1
- * Fix key export to files (they were written partially)
- * Fix crash on Android 2.3
+ * 修正匯出金鑰到檔案功能(一部分)
+ * 修正在Android 2.3上的崩潰
## 3.1
- * Fix crash on Android 5
- * New certify screen
- * Secure Exchange directly from key list (SafeSlinger library)
- * New QR Code program flow
- * Redesigned decrypt screen
- * New icon usage and colors
- * Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * 修正在Android 5上的崩潰
+ * 新的認證畫面
+ * 直接在金鑰清單進行安全金鑰交換(使用SafeSlinger)
+ * 新的QR條碼作業流程
+ * 重新設計的解密畫面
+ * 新的圖示和配色
+ * 修正從Symantec Encryption Desktop匯入密鑰的問題
+ * 實驗性的YubiKey支援:子金鑰ID現在可以正確的檢查了
## 3.0.1
- * Better handling of large key imports
- * Improved subkey selection
+ * 更好的大型金鑰匯入處理
+ * 改良的子金鑰選取
## 3.0
- * Full support for Yubikey signature generation and decryption!
- * Propose installable compatible apps in apps list
- * New design for decryption screens
- * Many fixes for key import, also fixes stripped keys
+ * 在應用列表中建議相容的應用
+ * 新設計的解密畫面
+ * 許多匯入金鑰的修正,並修正剝離的金鑰
* Honor and display key authenticate flags
- * User interface to generate custom keys
- * Fixing user id revocation certificates
- * New cloud search (searches over traditional keyservers and keybase.io)
- * Support for stripping keys inside OpenKeychain
+ * 產生自訂金鑰的介面
+ * 修復使用者身分撤銷
+ * 新的雲端檢索功能(同時搜尋傳統的金鑰伺服器以及keybase.io資料庫)
+ * 現在OpenKeychain可以支援剝離的金鑰了
+ * 實驗性的YubiKey支援:支援簽名和解密
## 2.9.2
- * Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * 修正2.9.1導致金鑰破損的問題
+ * 實驗性的YubiKey支援:現在可以透過API進行解密
## 2.9.1
- * Split encrypt screen into two
+ * 加密畫面現在一分為二
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-zh-rTW/help_start.md b/OpenKeychain/src/main/res/raw-zh-rTW/help_start.md
index 4cc331942..a27d029ad 100644
--- a/OpenKeychain/src/main/res/raw-zh-rTW/help_start.md
+++ b/OpenKeychain/src/main/res/raw-zh-rTW/help_start.md
@@ -1,16 +1,16 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## How do I activate OpenKeychain in K-9 Mail?
-To use OpenKeychain with K-9 Mail, you want to follow these steps:
- 1. Open K-9 Mail and long-tap on the account you want to use OpenKeychain with.
- 2. Select "Account settings", scroll to the very bottom and click "Cryptography".
- 3. Click on "OpenPGP Provider" and select OpenKeychain from the list.
+##我要如何在K-9 Mail啟用OpenKeychain?
+要在K-9 Mail使用OpenKeychain,請依下列指示操作:
+ 1. 打開K-9 Mail,長按要設置OpenKeychain的帳號。
+ 2. 選擇“帳戶設定”,捲動至最下方並選擇“加密”。
+ 3. 選擇“OpenPGP提供者”,並從清單中選取OpenKeychain。
-## I found a bug in OpenKeychain!
-Please report the bug using the [issue tracker of OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
+##我在OpenKeychain發現問題!
+請通過[OpenKeychain問題追蹤](https://github.com/openpgp-keychain/openpgp-keychain/issues)回報問題。
-## Contribute
-If you want to help us developing OpenKeychain by contributing code [follow our small guide on Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
+##發佈
+如果你願意發佈原始碼協助我們開發,請參考我們Github上的[發佈指南](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code)。
-## Translations
-Help translating OpenKeychain! Everybody can participate at [OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
+##翻譯
+請協助翻譯OpenKeychain!每個人都可以在[OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/)貢獻一己之力。 \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-zh/help_about.md b/OpenKeychain/src/main/res/raw-zh/help_about.md
index 9d635d9df..d7f61d16c 100644
--- a/OpenKeychain/src/main/res/raw-zh/help_about.md
+++ b/OpenKeychain/src/main/res/raw-zh/help_about.md
@@ -1,13 +1,17 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (注意: 请把每个句子放在其本行中, Transifex把每一行放在它自己的位置!)
[http://www.openkeychain.org](http://www.openkeychain.org)
-[OpenKeychain](http://www.openkeychain.org) is an OpenPGP implementation for Android.
+[OpenKeychain](http://www.openkeychain.org) 是安卓上的一个 OpenPGP 协议实现。
-License: GPLv3+
+许可协议:GPLv3+
-## Developers
- * Dominik Schürmann (Maintainer)
+## 主要开发者
+ * Dominik Schürmann (维护者)
+ * Vincent Breitmoser
+
+## 贡献者
+ * Adithya Abraham Philip
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -15,32 +19,47 @@ License: GPLv3+
* Daniel Albert
* Daniel Hammann
* Daniel Haß
+ * Daniel Nelz
+ * Daniel Ramos
* Greg Witczak
+ * 'iseki'
+ * Ishan Khanna
+ * 'jellysheep'
+ * 'Jesperbk'
+ * 'jkolo'
+ * Joey Castillo
+ * Kai Jiang
+ * Kartik Arora
+ * 'Kent'
+ * 'ligi'
+ * Lukas Zorich
+ * Manoj Khanna
* 'mar-v-in'
* Markus Doits
* Miroojin Bakshi
+ * Morgan Gangwere
* Nikhil Peter Raj
* Paul Sarbinowski
* 'Senecaso'
* Signe Rüsch
* Sreeram Boyapati
- * Thialfihar (APG 1.x)
+ * 'steelman'
+ * 'Thialfihar' (APG 开发者)
* Tim Bray
- * Vincent Breitmoser
-## Libraries
- * [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
- * [SafeSlinger Exchange library](https://github.com/SafeSlingerProject/exchange-android) (MIT License)
- * [Android Support Libraries](http://developer.android.com/tools/support-library/index.html) (Apache License v2)
- * [KeybaseLib](https://github.com/timbray/KeybaseLib) (Apache License v2)
- * [TokenAutoComplete](https://github.com/splitwise/TokenAutoComplete) (Apache License v2)
- * [MiniDNS](https://github.com/rtreffer/minidns) (Apache License v2)
- * [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache License v2)
- * [ZXing](https://github.com/zxing/zxing) (Apache License v2)
- * [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache License v2)
- * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design)</a> (Apache License v2)
- * [MaterialNavigationDrawer](https://github.com/neokree/MaterialNavigationDrawer) (Apache License v2)
- * [Snackbar](https://github.com/nispok/snackbar) (MIT License)
- * [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache License v2)
- * [HtmlTextView](https://github.com/dschuermann/html-textview) (Apache License v2)
- * [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache License v2) \ No newline at end of file
+## 库
+ * [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 许可证)
+ * [SafeSlinger Exchange library](https://github.com/SafeSlingerProject/exchange-android) (MIT 许可证)
+ [Android Support Libraries](http://developer.android.com/tools/support-library/index.html) (Apache 许可证 v2)
+ * [KeybaseLib](https://github.com/timbray/KeybaseLib) (Apache 许可证 v2)
+ * [TokenAutoComplete](https://github.com/splitwise/TokenAutoComplete) (Apache 许可证 v2)
+ * [MiniDNS](https://github.com/rtreffer/minidns) (Apache 许可证 v2)
+ * [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders) (Apache 许可证 v2)
+ * [ZXing](https://github.com/zxing/zxing) (Apache 许可证 v2)
+ * [ZXing Android Minimal](https://github.com/journeyapps/zxing-android-embedded) (Apache 许可证 v2)
+ * [PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip) (Material Design) (Apache License v2)
+ * [MaterialDrawer](https://github.com/mikepenz/MaterialDrawer) (Apache 许可证 v2)
+ * [Snackbar](https://github.com/nispok/snackbar) (MIT 许可证)
+ * [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button) (Apache 许可证 v2)
+ * [HtmlTextView](https://github.com/sufficientlysecure/html-textview) (Apache 许可证 v2)
+ * [Markdown4J](https://github.com/jdcasey/markdown4j) (Apache 许可证 v2) \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-zh/help_certification.md b/OpenKeychain/src/main/res/raw-zh/help_certification.md
index 3518adf73..7e66b1dd7 100644
--- a/OpenKeychain/src/main/res/raw-zh/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-zh/help_certification.md
@@ -1,18 +1,18 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (注意: 请把每个句子放在其本行中, Transifex把每一行放在它自己的位置!)
-## Key Confirmation
-Without confirmation, you cannot be sure if a key really corresponds to a specific person.
-The simplest way to confirm a key is by scanning the QR Code or exchanging it via NFC.
-To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
+## 密钥确认
+在没有进行确认之前,你无法确保一个密钥与特定的人的密钥是相符的
+确认密钥相符的最简单方式是扫描二维码或者通过NFC交换
+为了确认多于2个人的密钥是相符的, 我们建议使用密钥交换的方法进行确认.
-## Key Status
+## 密钥状态
<img src="status_signature_verified_cutout_24dp"/>
-Confirmed: You have already confirmed this key, e.g., by scanning the QR Code.
+已确认: 你已经通过例如二维码扫描这种方式确认了这个密钥
<img src="status_signature_unverified_cutout_24dp"/>
-Unconfirmed: This key has not been confirmed yet. You cannot be sure if the key really corresponds to a specific person.
+未确认: 这个密钥尚未被确认. 你无法确保这个密钥与指定的人的密钥是相同的.
<img src="status_signature_expired_cutout_24dp"/>
-Expired: This key is no longer valid. Only the owner can extend its validity.
+已过期: 这个密钥不再有效. 只有它的拥有者能扩展它的正确性.
<img src="status_signature_revoked_cutout_24dp"/>
Revoked: This key is no longer valid. It has been revoked by its owner.
diff --git a/OpenKeychain/src/main/res/raw-zh/help_changelog.md b/OpenKeychain/src/main/res/raw-zh/help_changelog.md
index ab7fa8773..d45ce636b 100644
--- a/OpenKeychain/src/main/res/raw-zh/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-zh/help_changelog.md
@@ -1,9 +1,17 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
+ * First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
- * Integration of QR Scanner (New permissions required)
+ * Integration of QR Code Scanning (New permissions required)
* Improved key creation wizard
* Fix missing contacts after sync
* Requires Android 4
@@ -13,6 +21,7 @@
* Fix: Some valid keys were shown revoked or expired
* Don't accept signatures by expired or revoked subkeys
* Keybase.io support in advanced view
+ * Method to update all keys at once
## 3.1.2
@@ -35,7 +44,7 @@
* Redesigned decrypt screen
* New icon usage and colors
* Fix import of secret keys from Symantec Encryption Desktop
- * Subkey IDs on Yubikeys are now checked correctly
+ * Experimental YubiKey support: Subkey IDs are now checked correctly
## 3.0.1
@@ -46,7 +55,6 @@
## 3.0
- * Full support for Yubikey signature generation and decryption!
* Propose installable compatible apps in apps list
* New design for decryption screens
* Many fixes for key import, also fixes stripped keys
@@ -55,12 +63,13 @@
* Fixing user id revocation certificates
* New cloud search (searches over traditional keyservers and keybase.io)
* Support for stripping keys inside OpenKeychain
+ * Experimental YubiKey support: Support for signature generation and decryption
## 2.9.2
* Fix keys broken in 2.9.1
- * Yubikey decryption now working via API
+ * Experimental YubiKey support: Decryption now working via API
## 2.9.1
@@ -69,7 +78,7 @@
* Fix key flags handling (now supporting Mailvelope 0.7 keys)
* Improved passphrase handling
* Key sharing via SafeSlinger
- * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
+ * Experimental YubiKey support: Preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain
* Fix usage of stripped keys
* SHA256 as default for compatibility
* Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API
@@ -80,7 +89,7 @@
* Fixing crashes introduced in v2.8
* Experimental ECC support
- * Experimental Yubikey support (signing-only with imported keys)
+ * Experimental YubiKey support: Only signing with imported keys
## 2.8
diff --git a/OpenKeychain/src/main/res/raw-zh/help_start.md b/OpenKeychain/src/main/res/raw-zh/help_start.md
index 4cc331942..183c63150 100644
--- a/OpenKeychain/src/main/res/raw-zh/help_start.md
+++ b/OpenKeychain/src/main/res/raw-zh/help_start.md
@@ -1,16 +1,16 @@
-[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+[//]: # (注意: 请把每个句子放在其本行中, Transifex把每一行放在它自己的位置!)
-## How do I activate OpenKeychain in K-9 Mail?
-To use OpenKeychain with K-9 Mail, you want to follow these steps:
- 1. Open K-9 Mail and long-tap on the account you want to use OpenKeychain with.
- 2. Select "Account settings", scroll to the very bottom and click "Cryptography".
- 3. Click on "OpenPGP Provider" and select OpenKeychain from the list.
+## 我怎样才能在 K-9 Mail 中激活 OpenKeychain?
+在K-9 Mail中使用OpenKeychain,请遵循以下步骤:
+ 1.打开K-9 Mail并长按你想要使用OpenKeychain的账户。
+ 2.选择“账户设置”,滑到最下方,点击“加密”。
+ 3.点击“OpenPGP提供者”并在列表中选择OpenKeychain。
-## I found a bug in OpenKeychain!
-Please report the bug using the [issue tracker of OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
+## 我发现了OpenKeychain的问题!
+请使用 [OpenKeychain问题跟踪系统](https://github.com/openpgp-keychain/openpgp-keychain/issues)提交问题。
-## Contribute
-If you want to help us developing OpenKeychain by contributing code [follow our small guide on Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
+## 贡献
+如果你想要通过贡献代码来帮助开发OpenKeychain [请按照我们在Github上的一个小指引](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
-## Translations
-Help translating OpenKeychain! Everybody can participate at [OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
+## 翻译
+帮助翻译OpenKeychain!每个人都可以参与。[OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw/help_changelog.md b/OpenKeychain/src/main/res/raw/help_changelog.md
index 6f499d531..1c9d27629 100644
--- a/OpenKeychain/src/main/res/raw/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw/help_changelog.md
@@ -1,5 +1,12 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
+
+## 3.3
+
+ * New decryption screen
+ * Decryption of multiple files at once
+ * Better handling of YubiKey errors
+
## 3.2
* First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
diff --git a/OpenKeychain/src/main/res/values-ar/strings.xml b/OpenKeychain/src/main/res/values-ar/strings.xml
new file mode 100644
index 000000000..8f84af665
--- /dev/null
+++ b/OpenKeychain/src/main/res/values-ar/strings.xml
@@ -0,0 +1,72 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <!--GENERAL: Please put all strings inside quotes as described in example 1 on
+ http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
+ <!--title-->
+ <!--section-->
+ <!--button-->
+ <!--menu-->
+ <!--label-->
+ <!--choice-->
+ <!--key flags-->
+ <!--sentences-->
+ <!--errors
+ no punctuation, all lowercase,
+ they will be put after "error_message", e.g. "Error: file not found"-->
+ <!--errors without preceeding Error:-->
+ <!--results shown after decryption/verification-->
+ <!--Add keys-->
+ <!--progress dialogs, usually ending in '…'-->
+ <!--action strings-->
+ <!--key bit length selections-->
+ <!--elliptic curve names-->
+ <!--not in for now, see SaveKeyringParcel
+ <string name="key_curve_bp_p256">"Brainpool P-256"</string>
+ <string name="key_curve_bp_p384">"Brainpool P-384"</string>
+ <string name="key_curve_bp_p512">"Brainpool P-512"</string>-->
+ <!--compression-->
+ <!--Help-->
+ <!--Import-->
+ <!--Import from URL-->
+ <!--Generic result toast-->
+ <!--Import result toast-->
+ <!--Delete result toast-->
+ <!--Certify result toast-->
+ <!--Intent labels-->
+ <!--Remote API-->
+ <!--Share-->
+ <!--Key list-->
+ <!--Key view-->
+ <!--Key trust-->
+ <!--keybase proof stuff-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
+ <!--Add keyserver-->
+ <!--Navigation Drawer-->
+ <!--hints-->
+ <!--certs-->
+ <!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
+ <!--Import Public log entries-->
+ <!--Import Secret log entries-->
+ <!--Keyring Canonicalization log entries-->
+ <!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
+ <!--modifySecretKeyRing-->
+ <!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
+ <!--Other messages used in OperationLogs-->
+ <!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
+ <!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
+ <!--Messages for Export Log operation-->
+ <!--PassphraseCache-->
+ <!--First Time-->
+ <!--unsorted-->
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+</resources>
diff --git a/OpenKeychain/src/main/res/values-bg/strings.xml b/OpenKeychain/src/main/res/values-bg/strings.xml
index 518b80f47..8f84af665 100644
--- a/OpenKeychain/src/main/res/values-bg/strings.xml
+++ b/OpenKeychain/src/main/res/values-bg/strings.xml
@@ -27,6 +27,7 @@
<!--compression-->
<!--Help-->
<!--Import-->
+ <!--Import from URL-->
<!--Generic result toast-->
<!--Import result toast-->
<!--Delete result toast-->
@@ -41,6 +42,7 @@
<!--Edit key-->
<!--Create key-->
<!--View key-->
+ <!--Add keyserver-->
<!--Navigation Drawer-->
<!--hints-->
<!--certs-->
@@ -65,6 +67,6 @@
<!--unsorted-->
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-cs/strings.xml b/OpenKeychain/src/main/res/values-cs/strings.xml
index 4c18003a8..545778ff7 100644
--- a/OpenKeychain/src/main/res/values-cs/strings.xml
+++ b/OpenKeychain/src/main/res/values-cs/strings.xml
@@ -7,11 +7,11 @@
<string name="title_encrypt_text">Zašifrovat</string>
<string name="title_encrypt_files">Zašifrovat</string>
<string name="title_decrypt">Rozšifrovat</string>
- <string name="title_unlock">Odemknout klíč</string>
<string name="title_add_subkey">Přidat podklíč</string>
<string name="title_edit_key">Editovat klíč</string>
<string name="title_preferences">Nastavení</string>
<string name="title_api_registered_apps">Aplikace</string>
+ <string name="title_key_server_preference">OpenPGP keyservery</string>
<string name="title_change_passphrase">Změnit heslo</string>
<string name="title_share_fingerprint_with">Sdílet otisk s...</string>
<string name="title_share_key">Sdílet klíč s...</string>
@@ -29,33 +29,31 @@
<string name="title_help">Nápověda</string>
<string name="title_log_display">Log</string>
<string name="title_exchange_keys">Vyměnit klíče</string>
- <string name="title_advanced_key_info">Další informace ke klíči</string>
+ <string name="title_advanced_key_info">Pokročilé informace</string>
<string name="title_delete_secret_key">Smazat Váš klíč \'%s\'?</string>
<string name="title_export_log">Exportovat log</string>
<string name="title_manage_my_keys">Spravovat klíče</string>
<!--section-->
<string name="section_user_ids">Identity</string>
+ <string name="section_yubikey">YubiKey</string>
<string name="section_linked_system_contact">Propojený kontakt v systému</string>
<string name="section_should_you_trust">Důvěřujete tomuto klíči?</string>
<string name="section_proof_details">Doložit ověření</string>
<string name="section_cloud_evidence">Doložení z cloudu</string>
<string name="section_keys">Podklíče</string>
<string name="section_cloud_search">Vyhledávání v Cloud službě</string>
- <string name="section_passphrase_cache">Cache hesel</string>
<string name="section_certify">Potvrdit</string>
<string name="section_actions">Akce</string>
<string name="section_share_key">Klíč</string>
<string name="section_key_server">Keyserver</string>
<string name="section_fingerprint">Otisk</string>
<string name="section_encrypt">Zašifrovat</string>
- <string name="section_decrypt">Rozšifrovat</string>
<string name="section_current_expiry">Současná expirace</string>
<string name="section_new_expiry">Nová expirace</string>
<!--button-->
<string name="btn_decrypt_verify_file">Dešifrovat, ověřit a uložit soubor</string>
<string name="btn_encrypt_share_file">Zašifrovat a sdílet soubor</string>
<string name="btn_encrypt_save_file">Zašifrovat a uložit soubor</string>
- <string name="btn_save">Uložit</string>
<string name="btn_do_not_save">Zrušit</string>
<string name="btn_delete">Smazat</string>
<string name="btn_no_date">Žádná expirace</string>
@@ -70,13 +68,15 @@
<string name="btn_view_cert_key">Zobrazit klíč certifikátu</string>
<string name="btn_create_key">Vytvořit klíč</string>
<string name="btn_add_files">Přidat soubor(y)</string>
- <string name="btn_add_share_decrypted_text">Sdílet dešifrovaný text</string>
- <string name="btn_decrypt_clipboard">Dešifrovat text ze schránky</string>
- <string name="btn_decrypt_and_verify">a ověřit podpisy</string>
- <string name="btn_decrypt_files">Dešifrovat soubory</string>
+ <string name="btn_share_decrypted_text">Sdílet dešifrovaný text</string>
+ <string name="btn_copy_decrypted_text">Kopírovat dešifrovaný text</string>
<string name="btn_encrypt_files">Zašifrovat soubory</string>
<string name="btn_encrypt_text">Zašifrovat text</string>
<string name="btn_add_email">Přidat další emailové adresy</string>
+ <string name="btn_unlock">Odemknout</string>
+ <string name="btn_add_keyserver">Přidat</string>
+ <string name="btn_save_default">Uložit jako výchozí</string>
+ <string name="btn_saved">Uloženo!</string>
<!--menu-->
<string name="menu_preferences">Nastavení</string>
<string name="menu_help">Nápověda</string>
@@ -89,15 +89,20 @@
<string name="menu_encrypt_to">Zašifrovat do...</string>
<string name="menu_select_all">Vybrat vše</string>
<string name="menu_export_all_keys">Exportovat všechny klíče</string>
- <string name="menu_advanced">Zobrazit pokročilé info</string>
+ <string name="menu_update_all_keys">Aktualizovat všechny klíče</string>
+ <string name="menu_advanced">Pokročilá informace</string>
+ <string name="menu_certify_fingerprint">Potvrdit porovnáním otisků</string>
+ <string name="menu_export_log">Exportovat log</string>
<!--label-->
+ <string name="label_message">Text</string>
<string name="label_file">Soubor</string>
<string name="label_files">Soubor(y)</string>
<string name="label_file_colon">Soubor:</string>
- <string name="label_no_passphrase">Bez hesla</string>
+ <string name="label_no_passphrase">Žádné heslo</string>
<string name="label_passphrase">Heslo</string>
<string name="label_unlock">Odemykám...</string>
- <string name="label_passphrase_again">Opakovat heslo</string>
+ <string name="label_passphrase_again">Zopakovat heslo</string>
+ <string name="label_show_passphrase">Zobrazit heslo</string>
<string name="label_algorithm">Algoritmus</string>
<string name="label_ascii_armor">Soubor ASCII armor</string>
<string name="label_file_ascii_armor">Povolit ASCII armor</string>
@@ -108,15 +113,16 @@
<string name="label_label_use_default_yubikey_pin_summary">Používá základní PIN (123456) pro přístup k YubiKey přes NFC</string>
<string name="label_asymmetric_from">Podepsáno:</string>
<string name="label_to">Zašifrovat pro:</string>
+ <string name="label_delete_after_encryption">Smazat soubory po zašifrování</string>
<string name="label_delete_after_decryption">Smazat po rozšifrování</string>
<string name="label_encryption_algorithm">Šifrovací algoritmus</string>
<string name="label_hash_algorithm">Hashovací algoritmus</string>
<string name="label_symmetric">Zašifrovat heslem</string>
- <string name="label_passphrase_cache_ttl">Čas vypršení pro cache</string>
- <string name="label_passphrase_cache_subs">Pamatovat si heslo podle podklíče</string>
+ <string name="label_message_compression">Komprimovat text</string>
<string name="label_file_compression">Komprimovat soubor</string>
- <string name="label_keyservers">Keyservery</string>
+ <string name="label_keyservers">Vyberte OpenPGP keyservery</string>
<string name="label_key_id">ID klíče</string>
+ <string name="label_key_created">Klíč vytvořen %s</string>
<string name="label_creation">Vytvořeno</string>
<string name="label_expiry">Expirace</string>
<string name="label_usage">Použití</string>
@@ -131,6 +137,15 @@
<string name="expiry_date_dialog_title">Nastavit datum expirace</string>
<string name="label_first_keyserver_is_used">(Výchozí je první keyserver)</string>
<string name="label_preferred">upřednostněno</string>
+ <string name="label_enable_compression">Zapnout kompresi</string>
+ <string name="label_encrypt_filenames">Zašifrovat jména souborů</string>
+ <string name="label_hidden_recipients">Skrýt příjemce</string>
+ <string name="label_verify_keyserver">Ověřit keyserver</string>
+ <string name="label_enter_keyserver_url">Zadejte URL keyserveru</string>
+ <string name="pref_keyserver">OpenPGP keyserver</string>
+ <string name="pref_keyserver_summary">Vyhledat klíče na vybraném OpenPGP keyserveru (protokol HKP)</string>
+ <string name="pref_keybase">keybase.io</string>
+ <string name="pref_keybase_summary">Hledat klíče na keybase.io</string>
<string name="user_id_no_name">&lt;beze jména&gt;</string>
<string name="none">&lt;žádný&gt;</string>
<plurals name="n_keys">
@@ -172,20 +187,27 @@
<string name="flag_encrypt">Zašifrovat</string>
<string name="flag_authenticate">Authentikovat</string>
<!--sentences-->
- <string name="wrong_passphrase">Špatné heslo.</string>
+ <string name="wrong_passphrase">Chybné heslo.</string>
<string name="no_filemanager_installed">Není nainstalován žádný compatibilní správce souborů.</string>
- <string name="passphrases_do_not_match">Hesla se neshodují.</string>
- <string name="passphrase_must_not_be_empty">Prosím zadejte heslo.</string>
+ <string name="passphrases_do_not_match">Hesla se neschodují.</string>
+ <string name="passphrase_must_not_be_empty">Zadejte heslo.</string>
<string name="passphrase_for_symmetric_encryption">Symetrická šifra.</string>
<string name="passphrase_for">Zadejte heslo pro \'%s\'</string>
- <string name="pin_for">Zadat PIN pro \'%s\'</string>
+ <string name="pin_for">Zadejte PIN pro \'%s\'</string>
<string name="yubikey_pin_for">Zadejte PIN pro přístup k YubiKey pro \'%s\'</string>
<string name="nfc_text">Přidržte YubiKey u zadní strany vašeho přístroje.</string>
- <string name="no_file_selected">Nejprve vyberte soubor.</string>
+ <string name="file_delete_confirmation_title">Smazat původní soubory?</string>
+ <string name="file_delete_confirmation">Následjící soubory budou vymazány:%s</string>
+ <string name="file_delete_successful">%1$d z %2$d souborů bylo vymazáno.%3$s</string>
<string name="encrypt_sign_successful">Úspěšně podepsáno a/nebo zašifrováno.</string>
<string name="encrypt_sign_clipboard_successful">Úspěšně podepsání a/nebo zašifrováno do schránky.</string>
<string name="select_encryption_key">Vyberte alespoň jeden šifrovací klíč.</string>
- <string name="error_no_encryption_or_signature_key">Vyberte alespoň jeden šifrovací nebo podpisový klíč.</string>
+ <string name="specify_file_to_encrypt_to">Prosím specifikujte do kterého souboru zašifrovat.\nVAROVÁNÍ: Pokud soubor již existuje, bude přepsán.</string>
+ <string name="specify_file_to_decrypt_to">Prosím specifikujte do kterého souboru rozšifrovat.\nVAROVÁNÍ: Pokud soubor již existuje, bude přepsán.</string>
+ <string name="specify_file_to_export_to">Prosím specifikujte do kterého souboru exportovat.\nVAROVÁNÍ: Pokud soubor již existuje, bude přepsán.</string>
+ <string name="key_deletion_confirmation_multi">Opravdu chcete smazat všechny vybrané soubory?</string>
+ <string name="secret_key_deletion_confirmation">Po smazání již nebudete schopni přečíst zprávy zašifrované tímto klíčem a stratíte všechny potvrzení udělané tímto klíčem!</string>
+ <string name="public_key_deletetion_confirmation">Smazat klíč \'%s\'?</string>
<string name="also_export_secret_keys">Zárověň exportovat tajný klíč</string>
<string name="reinstall_openkeychain">Narazili jste na známou chybu v Androidu. Přeinstalujte prosím OpenKeychain pokud chcete své propojit kontakty s klíči.</string>
<string name="key_exported">Úspěšně exportován 1 klíč.</string>
@@ -193,45 +215,52 @@
<string name="no_keys_exported">Žádný kláč pro export.</string>
<string name="key_creation_el_gamal_info">Žádný: pouze podklíče podporují ElGamal.</string>
<string name="key_not_found">Nemohu najít klíč %08X.</string>
+ <string name="specify_file_to_export_log_to">Prosím specifikujte do kterého souboru exportovat.\nVAROVÁNÍ: Pokud soubor již existuje, bude přepsán.</string>
<string name="list_empty">Seznam je prázný!</string>
<string name="nfc_successful">Úspěšně odeslaný klíč pomocí NFC Beam!</string>
<string name="key_copied_to_clipboard">Klíč byl zkopírován do schránky!</string>
<string name="fingerprint_copied_to_clipboard">Fingerprint byl zkopírován do schránky!</string>
+ <string name="select_key_to_certify">Prosím vyberte klíč, který bude použit k potvrzení!</string>
<string name="key_too_big_for_sharing">Klíč je příliš velký aby byl sdílen pomocí této metody!</string>
<string name="text_copied_to_clipboard">Text byl zkopírován do schránky!</string>
<!--errors
no punctuation, all lowercase,
they will be put after "error_message", e.g. "Error: file not found"-->
+ <string name="error_file_delete_failed">nebyly smazány. Smažte je ručně!</string>
+ <string name="error_file_added_already">%s byl již přidán.</string>
<string name="error_file_not_found">soubor nenalezen</string>
<string name="error_no_secret_key_found">žádný vhodný tajný klíč nenalezen</string>
<string name="error_external_storage_not_ready">externí úložiště není připraveno</string>
<string name="error_key_size_minimum512bit">délka klíče musí být alespoň 512 bitů</string>
<string name="error_unknown_algorithm_choice">neznámý typ algoritmu</string>
- <string name="error_user_id_no_email">žádný email nenalezen</string>
<string name="error_key_needs_a_user_id">potřebuji alespoň jednu identitu</string>
- <string name="error_no_signature_passphrase">nebylo poskytnuto heslo</string>
<string name="error_no_signature_key">nebyl poskytnut podpisový klíč</string>
+ <string name="error_invalid_data">Žádný validní zašifrovaný nebo podepsaný OpenPGP obsah!</string>
<string name="error_integrity_check_failed">selhala kontrola integrity! Data byla pozměněna!</string>
- <string name="error_wrong_passphrase">špatné heslo</string>
+ <string name="error_wrong_passphrase">chybné heslo.</string>
<string name="error_could_not_extract_private_key">nebylo možné extrahovat privátní klíč</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Musíte mít Android 4.1 abyste mohli používat Androidí NFC Beam technologii!</string>
+ <string name="error_nfc_needed">NFC musí být zapnuté!</string>
+ <string name="error_beam_needed">Beam musí být zapnutý!</string>
<string name="error_nothing_import">Žádný klíč nenalezen!</string>
+ <string name="error_nothing_import_selected">Žádný klíč nebyl vybrán pro import!</string>
<string name="error_contacts_key_id_missing">Příjem ID klíče od kontatktu selhal!</string>
<string name="error_generic_report_bug">Nastala obecná chyba, prosím vytvořte nový bug report pro OpenKeychain.</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">Nepodepsáno</string>
<string name="decrypt_result_invalid_signature">Špatný podpis!</string>
- <string name="decrypt_result_signature_uncertified">Kým podepsáno (neověřen!)</string>
- <string name="decrypt_result_signature_certified">Podepsáno</string>
- <string name="decrypt_result_signature_expired_key">Klíč neplatný!</string>
- <string name="decrypt_result_signature_revoked_key">Klíč byl revokován!</string>
- <string name="decrypt_result_signature_missing_key">Neznámý veřejný klíč</string>
+ <string name="decrypt_result_signature_uncertified">Podepsáno <b>nepotvrzeným</b> klíčem</string>
+ <string name="decrypt_result_signature_secret">Podepsáno vaším klíčem</string>
+ <string name="decrypt_result_signature_certified">Podepsáno ověřeným klíčem</string>
+ <string name="decrypt_result_signature_expired_key">Podepsáno <b>vyexpirovaným</b> klíčem!</string>
+ <string name="decrypt_result_signature_revoked_key">Podepsáno <b>zneplatněným</b> klíčem!</string>
+ <string name="decrypt_result_signature_missing_key">Podepsáno <b>neznámým veřejným klíčem</b></string>
<string name="decrypt_result_encrypted">Zašifrováno</string>
<string name="decrypt_result_not_encrypted">Nezašifrováno</string>
<string name="decrypt_result_action_show">Zobrazit</string>
<string name="decrypt_result_action_Lookup">Vyhledat</string>
- <string name="decrypt_invalid_text">Podpis neplatný, platnost klíče vypršela nebo byl zrušen. Nemůžete si být jistí tím, kdo text napsal. Jste si jistí, že chcete i přesto zprávu zobrazit?</string>
+ <string name="decrypt_invalid_text">Buď je podpis neplatný nebo byl klíč zneplatněn. Není jisté, kdo napsal tento text. Chcete jej i presto zobrazit?</string>
<string name="decrypt_invalid_button">Beru na vědomí, zobraz to!</string>
<!--Add keys-->
<string name="add_keys_my_key">Můj klíč:</string>
@@ -241,6 +270,7 @@
<string name="progress_cancelling">ukončuji...</string>
<string name="progress_saving">ukládám...</string>
<string name="progress_importing">importuji...</string>
+ <string name="progress_updating">Aktualizuji klíče...</string>
<string name="progress_exporting">exportuji...</string>
<string name="progress_uploading">uloaduji...</string>
<string name="progress_building_key">vytvářím klíč...</string>
@@ -259,12 +289,13 @@
<string name="progress_modify_subkeychange">modifikuji podklíče...</string>
<string name="progress_modify_subkeyrevoke">revokuji podklíče...</string>
<string name="progress_modify_subkeyadd">přidávám podklíče...</string>
- <string name="progress_modify_passphrase">mněním heslo...</string>
+ <string name="progress_modify_passphrase">měním heslo...</string>
<plurals name="progress_exporting_key">
<item quantity="one">exportuji klíč...</item>
<item quantity="few">exportuji klíče...</item>
<item quantity="other">exportuji klíče...</item>
</plurals>
+ <string name="progress_start">připravuji operaci...</string>
<string name="progress_extracting_signature_key">extrahuji podpisový klíč...</string>
<string name="progress_extracting_key">extrahuji klíč...</string>
<string name="progress_preparing_streams">připravuji streamy...</string>
@@ -321,8 +352,8 @@
<string name="import_tab_qr_code">QR kód/NFC</string>
<string name="import_import">Importovat vybrané klíče</string>
<string name="import_qr_code_wrong">QR kód nerozpoznán! Zkuste to znovu prosím!</string>
- <string name="import_qr_code_too_short_fingerprint">Fingerprint je příliš krátký (&lt; 16 znaků)</string>
<string name="import_qr_code_button">Naskenovat QR kód</string>
+ <!--Import from URL-->
<!--Generic result toast-->
<!--Import result toast-->
<plurals name="import_keys_added_and_updated_1">
@@ -347,10 +378,6 @@
<string name="intent_send_encrypt">Zašifrovat pomocí OpenKeychain</string>
<string name="intent_send_decrypt">Dešifrovat pomocí OpenKeychain</string>
<!--Remote API-->
- <string name="api_settings_show_info">Zobrazit pokročilé informace</string>
- <string name="api_settings_hide_info">Schovat pokročilé informace</string>
- <string name="api_settings_show_advanced">Zobrazit pokročilá nastavení</string>
- <string name="api_settings_hide_advanced">Schovat pokročilá nastavení</string>
<string name="api_settings_no_key">Žádný klíč nebyl vybrán</string>
<string name="api_settings_select_key">Vybrat klíč</string>
<string name="api_settings_save">Uložit</string>
@@ -372,6 +399,8 @@
<string name="api_select_pub_keys_text">Zkontrolujte prosím seznam příjemců!</string>
<string name="api_select_pub_keys_text_no_user_ids">Vyberte prosím příjemce!</string>
<string name="api_error_wrong_signature">Selhala kontrola podpisu! Instalovali jste tuto aplikaci z jiného zdroje? Pokud jste si jistí, že toto není útok, zneplatněte registraci této aplikace v OpenKeychain a poté ji znovu zaregistrujte.</string>
+ <string name="api_select_sign_key_text">Prosím vyberte jeden z existujících klíčů nebo vytvořte novy.</string>
+ <string name="api_select_keys_text">Žádným z povolených klíčů se nedaří obsah rozšifrovat. Prosím vyberte povolené klíče.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Sdílet pomocí QR kódu</string>
<string name="share_nfc_dialog">Sdílet pomocí NFC</string>
@@ -388,6 +417,7 @@
<string name="key_view_action_edit">Editovat klíč</string>
<string name="key_view_action_encrypt">Zašifrovat text</string>
<string name="key_view_action_encrypt_files">soubory</string>
+ <string name="key_view_action_certify">Potvrdit klíč</string>
<string name="key_view_action_update">Aktualizuji z keyserveru</string>
<string name="key_view_action_share_with">Sdílet pomocí...</string>
<string name="key_view_action_share_nfc">Sdílet přes NFC</string>
@@ -396,6 +426,7 @@
<string name="key_view_tab_share">Sdílet</string>
<string name="key_view_tab_keys">Podklíče</string>
<string name="key_view_tab_certs">Certifikáty</string>
+ <string name="key_view_tab_keybase">Keybase.io</string>
<string name="user_id_info_revoked_title">Zneplatněno</string>
<string name="user_id_info_revoked_text">Tato identity byla zneplatněna vlastníkem klíče. Klíč již není platný.</string>
<string name="user_id_info_certified_title">Ověřeno</string>
@@ -405,7 +436,30 @@
<string name="user_id_info_invalid_title">Neplatná</string>
<string name="user_id_info_invalid_text">S touto identitou je něco v nepořádku!</string>
<!--Key trust-->
+ <string name="key_trust_already_verified">Již jste tento klíč potvrdili!</string>
+ <string name="key_trust_it_is_yours">Toto je jeden z vašich klíčů!</string>
+ <string name="key_trust_maybe">Tento klíč je buďto zneplatněný nebo vypršel\nNepotvrdili jste ho, ale můžete mu začít důvěřovat.</string>
+ <string name="key_trust_revoked">Klíč byl zneplatněn vlastníkem. Neměli byste mu důvěřovat.</string>
+ <string name="key_trust_expired">Tento klíč vypršel. Neměli byste mu důvěřovat.</string>
+ <string name="key_trust_old_keys">Rozšifrovat staré zprávy pocházející z doby kdy klíč byl ještě platný, může být v pořádku.</string>
+ <string name="key_trust_no_cloud_evidence">O důvěryhodnosti tohoto klíče není možné získat důkaz z cloudu.</string>
+ <string name="key_trust_start_cloud_search">Vyhledat</string>
+ <string name="key_trust_results_prefix">Keybase.io nabízí “důkazy” které tvrdí, že vlastníkem tohoto klíče je: </string>
+ <string name="key_trust_header_text">Poznámka: Keybase.io důkazy jsou experimentální fíčura OpenKeychainu. Doporučujeme vám navíc potvrdit je pomocí naskenování QR kódu nebo si vyměnit klíče pomocí NFC.</string>
<!--keybase proof stuff-->
+ <string name="keybase_narrative_twitter">Na Twitteru je znám jako</string>
+ <string name="keybase_narrative_github">Je znám na GitHubu jako</string>
+ <string name="keybase_narrative_dns">Spravuje doménové jméno (jména)</string>
+ <string name="keybase_narrative_web_site">Může přispívat na webovou stránku (webové stránky)</string>
+ <string name="keybase_narrative_reddit">Přispívá na Reddit jako</string>
+ <string name="keybase_narrative_coinbase">Je znám na Coinbase jako</string>
+ <string name="keybase_narrative_hackernews">Přispívá na Hacker News jako</string>
+ <string name="keybase_narrative_unknown">Neznámý typ důkazu</string>
+ <string name="keybase_a_post">Příspěvek</string>
+ <string name="keybase_twitter_proof">tweet</string>
+ <string name="keybase_web_site_proof">textový soubor</string>
+ <string name="keybase_reddit_proof">soubor JSON</string>
+ <string name="keybase_verify">Ověřit</string>
<!--Edit key-->
<string name="edit_key_action_change_passphrase">Změnit heslo</string>
<string name="edit_key_action_add_identity">Přidat identitu</string>
@@ -420,27 +474,43 @@
</string-array>
<string name="edit_key_edit_user_id_revoked">Tato identity byla zneplatněna. Toto není možné vzít zpět.</string>
<string name="edit_key_edit_subkey_title">Vyberte akci!</string>
- <string-array name="edit_key_edit_subkey">
- <item>Změnit expiraci</item>
- <item>Zneplatnit podklíč</item>
- <item>Strip podklíč</item>
- <item>"Move Subkey to Yubikey / Smart Card"</item>
- </string-array>
<string name="edit_key_new_subkey">nový podklíč</string>
<string name="edit_key_select_flag">Prosím vyberte alespoň jeden příznak!</string>
<string name="edit_key_error_add_identity">Přidejte alespoň jednu identitu!</string>
<string name="edit_key_error_add_subkey">Přidejte alespoň jeden podklíč!</string>
<!--Create key-->
+ <string name="create_key_upload">Synchronizovat s cloudem</string>
<string name="create_key_empty">Toto pole je vyžadováno</string>
- <string name="create_key_passphrases_not_equal">Heslo nesouhlasí</string>
+ <string name="create_key_passphrases_not_equal">Hesla se neschodují.</string>
<string name="create_key_final_text">Zadali jste následující identitu:</string>
<string name="create_key_final_robot_text">Vytvoření klíče může chvíli trvat, mezitím si dejte třeba šálek dobré kávy...</string>
<string name="create_key_rsa">(3 podklíče, RSA, 4096 bit)</string>
<string name="create_key_custom">(uživatelská konfigurace klíče)</string>
+ <string name="create_key_email_text">Zadejte hlavní emailovou adresu používanou pro zabezpečenou komunikaci.</string>
+ <string name="create_key_passphrase_text">Zvolte silné heslo. Chrání váš klíč pokud je zařízeno zcizeno.</string>
+ <string name="create_key_hint_full_name">Plné jméno nebo přezdívka</string>
<string name="create_key_edit">Změnit konfiguraci klíče</string>
+ <string name="create_key_add_email">Přidat emailovou adresu</string>
+ <string name="create_key_add_email_text">Další emailové adresy jsou přiřazeny k tomuto klíči a mohou být požity k zabezpečené komunikaci.</string>
+ <string name="create_key_email_already_exists_text">Emailová adresa již byla přidána.</string>
+ <string name="create_key_email_invalid_email">Formát emailové adresy není platný.</string>
<!--View key-->
+ <string name="view_key_revoked">Zneplatněn: Klíč nesmí být dále použit!</string>
+ <string name="view_key_expired">Vypršel: Kontakt musí rozšířit platnost klíče!</string>
+ <string name="view_key_expired_secret">Vypršel: Můžete rozšířit platnost klíče tím, že ho upravíte!</string>
+ <string name="view_key_my_key">Můj klíč</string>
+ <string name="view_key_verified">Potvrzený klíč</string>
+ <string name="view_key_unverified">Nepotvrzen: Naskenujte QR kód abyste ho potvrdili!</string>
+ <string name="view_key_fragment_no_system_contact">&lt;žádný&gt;</string>
+ <!--Add keyserver-->
+ <string name="add_keyserver_dialog_title">Přidat keyserver</string>
+ <string name="add_keyserver_verified">Keyserver ověřen!</string>
+ <string name="add_keyserver_without_verification">Keyserver přidán bez verifikace.</string>
+ <string name="add_keyserver_invalid_url">Neplatná URL!</string>
+ <string name="add_keyserver_connection_failed">Nepodařilo se připojit ke key severu. Prosím ověřte URL a vaše připojení k internetu.</string>
<!--Navigation Drawer-->
<string name="nav_keys">Klíče</string>
+ <string name="nav_encrypt_decrypt">Zašifrovat/Dešifrovat</string>
<string name="nav_apps">Aplikace</string>
<string name="drawer_open">Otevřít navigační panel</string>
<string name="drawer_close">Zavří navigační panel</string>
@@ -461,11 +531,113 @@
<string name="msg_internal_error">Vnitřní chyba!</string>
<string name="msg_cancelled">Operace zrušena.</string>
<!--Import Public log entries-->
+ <string name="msg_ip_apply_batch">Aplikuji vložení dávkovou operace.</string>
+ <string name="msg_ip_bad_type_secret">Pokusil jsem se importovat bezpečnou klíčenku jako veřejmý. Toto je bug, prosím vyplňte hlášení!</string>
+ <string name="msg_ip_delete_old_fail">Nebyl nalezen žádný starý klíč (vytvořit nový?)</string>
+ <string name="msg_ip_delete_old_ok">Z databáze byl smazán starý klíč</string>
<string name="msg_ip_encode_fail">Operace selhala kvůli chybě kódování</string>
+ <string name="msg_ip_error_io_exc">Operace selhala kůli i/o chybě</string>
+ <string name="msg_ip_error_op_exc">Operace selhala kůli chybě databáze</string>
+ <string name="msg_ip_error_remote_ex">Operace selhala kůli interní chybě</string>
<string name="msg_ip">Importuje se veřejná klíčenka %s</string>
+ <string name="msg_ip_insert_keyring">Kóduji data klíčenky</string>
+ <string name="msg_ip_insert_keys">Parsuji klíče</string>
+ <string name="msg_ip_prepare">Připravuji operaci databáze</string>
+ <string name="msg_ip_master">Zpracovávám hlavní klíč %s</string>
+ <string name="msg_ip_master_expired">Klíčenka vypršela %s</string>
+ <string name="msg_ip_master_expires">Klíčenka vyprší %s</string>
+ <string name="msg_ip_master_flags_unspecified">Hlavní příznaky: nespecifikované (předpokládat všechny)</string>
+ <string name="msg_ip_master_flags_cesa">Hlavní příznaky: ověřiení, zašifrování, podepsání, přihlášení</string>
+ <string name="msg_ip_master_flags_cesx">Hlavní příznaky: ověření, zašifrování, podepsání</string>
+ <string name="msg_ip_master_flags_cexa">Hlavní příznaky: ověření, zašifrování, přihlášení</string>
+ <string name="msg_ip_master_flags_cexx">Hlavní příznaky: ověření, zašifrování</string>
+ <string name="msg_ip_master_flags_cxsa">Hlavní přiznaky: ověření, podepsání, přihlášení</string>
+ <string name="msg_ip_master_flags_cxsx">Hlavní příznaky: ověření, podepsání</string>
+ <string name="msg_ip_master_flags_cxxa">Hlavní příznaky: ověření, přihlášení</string>
+ <string name="msg_ip_master_flags_cxxx">Hlavní příznaky: ověření</string>
+ <string name="msg_ip_master_flags_xesa">Hlavní příznaky: zašifrování, podepsání, přihlášení</string>
+ <string name="msg_ip_master_flags_xesx">Hlavní příznaky: zašifrování, podepsání</string>
+ <string name="msg_ip_master_flags_xexa">Hlavní příznaky: zašifrování, přihlášení</string>
+ <string name="msg_ip_master_flags_xexx">Hlavní příznaky: zašifrování</string>
+ <string name="msg_ip_master_flags_xxsa">Hlavní příznaky: podepsání, přihlášení</string>
+ <string name="msg_ip_master_flags_xxsx">Hlavní příznaky: podepsání</string>
+ <string name="msg_ip_master_flags_xxxa">Hlavní příznaky: přihlášení</string>
+ <string name="msg_ip_master_flags_xxxx">Hlavní příznaky: žádné</string>
+ <string name="msg_ip_merge_public">Slučuji importovaná data do existující veřejné klíčenky</string>
+ <string name="msg_ip_merge_secret">Slučuji importovaná data do existující veřejné klíčenky</string>
+ <string name="msg_ip_subkey">Zpracovávám podklíč %s</string>
+ <string name="msg_ip_subkey_expired">Podklíč vypršel %s</string>
+ <string name="msg_ip_subkey_expires">Podklíč vypršel %s</string>
+ <string name="msg_ip_subkey_flags_unspecified">Příznaky podklíče: nespecifikované (předpokládat všechny)</string>
+ <string name="msg_ip_subkey_flags_cesa">Příznaky podklíče: ověřiení, zašifrování, podepsání, přihlášení</string>
+ <string name="msg_ip_subkey_flags_cesx">Příznaky podklíče: ověření, zašifrování, podepsání</string>
+ <string name="msg_ip_subkey_flags_cexa">Příznaky podklíče: ověřiení, zašifrování, přihlášení</string>
+ <string name="msg_ip_subkey_flags_cexx">Příznaky podklíče: ověření, zašifrování</string>
+ <string name="msg_ip_subkey_flags_cxsa">Příznaky podklíče: ověření, podepsání, přihlášení</string>
+ <string name="msg_ip_subkey_flags_cxsx">Příznaky podklíče: ověření, podepsání</string>
+ <string name="msg_ip_subkey_flags_cxxa">Příznaky podklíče: ověření, přihlášení</string>
+ <string name="msg_ip_subkey_flags_cxxx">Příznaky podklíče: ověření</string>
+ <string name="msg_ip_subkey_flags_xesa">Příznaky podklíče: zašifrování, podepsání, přihlášení</string>
+ <string name="msg_ip_subkey_flags_xesx">Příznaky podklíče: zašifrování, podepsání</string>
+ <string name="msg_ip_subkey_flags_xexa">Příznaky podklíčey: zašifrování, přihlášení</string>
+ <string name="msg_ip_subkey_flags_xexx">Příznaky podklíče: zašifrování</string>
+ <string name="msg_ip_subkey_flags_xxsa">Příznaky podklíče: podepsání, přihlášení</string>
+ <string name="msg_ip_subkey_flags_xxsx">Příznaky podklíče: podepsání</string>
+ <string name="msg_ip_subkey_flags_xxxa">Příznaky podklíče: přihlášení</string>
+ <string name="msg_ip_subkey_flags_xxxx">Příznaky podklíče: žádné</string>
+ <string name="msg_ip_success">Veřejná klíčenka úspěšně importována</string>
+ <string name="msg_ip_success_identical">Klíčenka neobsahuje žádná data, není co provést</string>
+ <string name="msg_ip_reinsert_secret">Znovu vkládám tajný klíč</string>
+ <string name="msg_ip_uid_cert_bad">Špatný certifikát!</string>
+ <string name="msg_ip_uid_cert_error">Chyba zpracování certifikátu!</string>
+ <string name="msg_ip_uid_cert_nonrevoke">Již se jedná o nezneplatnitelný certifikát, přeskakuji.</string>
+ <string name="msg_ip_uid_cert_old">Certifikát je starší než předešlý, přeskakuji.</string>
+ <string name="msg_ip_uid_cert_new">Certifikát je novější, nahrazuji předchozí.</string>
+ <string name="msg_ip_uid_cert_good">Nalezen platný certifikát od %1$s</string>
+ <string name="msg_ip_uid_cert_good_revoke">Nalezena platné zneplatnění certifikátu od %1$s</string>
+ <string name="msg_ip_uid_reorder">Přeskládávám uživatelské jména</string>
+ <string name="msg_ip_uid_processing">Zpracovávám uživatelské jméno %s</string>
+ <string name="msg_ip_uid_revoked">Uživatelské jméno zneplatněno</string>
+ <string name="msg_ip_uat_processing_image">Zpracovávám uživatelský atribut typu obrázek</string>
+ <string name="msg_ip_uat_processing_unknown">Zpracovávám uživatelský atribut neznámého typu</string>
+ <string name="msg_ip_uat_cert_bad">Špatný certifikát!</string>
+ <string name="msg_ip_uat_cert_error">Chyba zpracování certifikátu!</string>
+ <string name="msg_ip_uat_cert_nonrevoke">Již se jedná o nezneplatnitelný certifikát, přeskakuji.</string>
+ <string name="msg_ip_uat_cert_old">Certifikát je starší než předešlý, přeskakuji.</string>
+ <string name="msg_ip_uat_cert_new">Certifikát je novější, nahrazuji předchozí.</string>
+ <string name="msg_ip_uat_cert_good">Nalezen platný certifikát od %1$s</string>
+ <string name="msg_ip_uat_cert_good_revoke">Nalezena platné zneplatnění certifikátu od %1$s</string>
+ <string name="msg_ip_uat_revoked">Atribut uživatele je zneplatněn</string>
+ <string name="msg_is_bad_type_public">Pokus o import veřejné klíčenky jako tajné. Toto je bug, prosím nahlašte ho!</string>
+ <string name="msg_is_bad_type_uncanon">Pokus o importování klíčenky bez kanonizace. Toto je bug, prosím vyplňte hlášení!</string>
<!--Import Secret log entries-->
+ <string name="msg_is">Importuji tajný klíč %s</string>
<string name="msg_is_db_exception">Chyba databáze!</string>
+ <string name="msg_is_importing_subkeys">Zpracovávám tajné podklíče</string>
+ <string name="msg_is_error_io_exc">Chyba kódování klíčenky</string>
+ <string name="msg_is_merge_public">Slučuji importovaná data do existující veřejné klíčenky</string>
+ <string name="msg_is_merge_secret">Slučuji importovaná data do existující veřejné klíčenky</string>
+ <string name="msg_is_pubring_generate">Vytvářím veřejnou klíčenku z tajné</string>
+ <string name="msg_is_subkey_nonexistent">Podklíč %s není k dispozici v tajném klíči</string>
+ <string name="msg_is_subkey_ok">Označen tajný podklíč %s jako že je k dispozici</string>
+ <string name="msg_is_subkey_empty">Označen tajný podklíč %s jako k dispozici s prázným heslem</string>
+ <string name="msg_is_subkey_pin">Označen tajný podklíč %s jako že je k dispozici s PINem</string>
+ <string name="msg_is_success_identical">Klíčenka neobsahuje žádná nová data, není co provést</string>
+ <string name="msg_is_success">Úspěšně importován tajný klíč</string>
<!--Keyring Canonicalization log entries-->
+ <string name="msg_kc_error_v3">Toto je klíč OpenPGP verze 3, který již naní podporován!</string>
+ <string name="msg_kc_error_no_uid">Klíčenka neobsahuje žádná platná uživatelská jména!</string>
+ <string name="msg_kc_error_master_algo">Hlavní klíč používá neznámý (%s) algoritmus!</string>
+ <string name="msg_kc_error_dup_key">Podklíč %s je obsažen v klíčence dvakrát. Klíčenka je poškozená, nelze importovat!</string>
+ <string name="msg_kc_master">Zpracovávám hlavní klíč</string>
+ <string name="msg_kc_master_bad_type">Odebírám hlavní klíč certifikátu neznámého typu (%s)</string>
+ <string name="msg_kc_master_bad_local">Odebírám hlavní klíč certifikátu s příznakem \'lokální\'</string>
+ <string name="msg_kc_master_bad_err">Odebírám vadný hlavní klíč certifikátu</string>
+ <string name="msg_kc_master_bad_time">Odebírám zneplatňovací certifikát klíčenky s časovou značkou v budoucnu</string>
+ <string name="msg_kc_master_bad_type_uid">Odebírám uživatelské jméno certifikátu se špatnou pozicí</string>
+ <string name="msg_kc_master_bad">Odebírám špatný hlavní klíč certifikátu</string>
+ <string name="msg_kc_master_local">Odebírám hlavní klíč certifikátu s příznakem \'lokální\'</string>
+ <string name="msg_kc_revoke_dup">Odebírám redundantní zneplatňovací certifikát klíčenky</string>
<!--Keyring merging log entries-->
<!--createSecretKeyRing-->
<string name="msg_cr">Generuji nový hlavní klíč</string>
@@ -486,9 +658,6 @@
<string name="msg_acc_saved">Účet uložen</string>
<!--Messages for Export Log operation-->
<!--PassphraseCache-->
- <string name="passp_cache_notif_click_to_clear">Kliknout pro vymazání načtených hesel</string>
- <string name="passp_cache_notif_clear">Smazat cache</string>
- <string name="passp_cache_notif_pwd">Heslo</string>
<!--First Time-->
<string name="first_time_text1">Převezměte opět kontrolu nad svým soukromím s OpenKeychain!</string>
<string name="first_time_skip">Přeskočit nastavení</string>
@@ -501,7 +670,6 @@
<string name="label_cert_type">Typ</string>
<string name="error_key_not_found">Klíč nenalezen!</string>
<string name="error_key_processing">Chyba zpracování klíče!</string>
- <string name="key_no_passphrase">bez hesla</string>
<string name="key_unavailable">nedostupný</string>
<string name="secret_cannot_multiple">Vaše vlastní klíče lze mazat pouze jednotlivě!</string>
<string name="title_view_cert">Zobrazit detaily certifikátu</string>
@@ -512,6 +680,6 @@
<string name="swipe_to_update">Potáhnout dolů pro aktualizaci z keyserveru</string>
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml
index d2f643e9f..b5990a82e 100644
--- a/OpenKeychain/src/main/res/values-de/strings.xml
+++ b/OpenKeychain/src/main/res/values-de/strings.xml
@@ -7,12 +7,11 @@
<string name="title_encrypt_text">Verschlüsseln</string>
<string name="title_encrypt_files">Verschlüsseln</string>
<string name="title_decrypt">Entschlüsseln</string>
- <string name="title_unlock">Schlüssel entsperren</string>
<string name="title_add_subkey">Unterschlüssel hinzufügen</string>
<string name="title_edit_key">Schlüssel bearbeiten</string>
<string name="title_preferences">Einstellungen</string>
<string name="title_api_registered_apps">Apps</string>
- <string name="title_key_server_preference">Schlüsselserver</string>
+ <string name="title_key_server_preference">OpenPGP-Schlüsselserver</string>
<string name="title_change_passphrase">Passwort ändern</string>
<string name="title_share_fingerprint_with">Teile Fingerabdruck über…</string>
<string name="title_share_key">Teile Schlüssel über...</string>
@@ -30,33 +29,31 @@
<string name="title_help">Hilfe</string>
<string name="title_log_display">Log</string>
<string name="title_exchange_keys">Schlüssel austauschen</string>
- <string name="title_advanced_key_info">Erweiterte Schlüsselinformation</string>
+ <string name="title_advanced_key_info">Erweiterte Informationen</string>
<string name="title_delete_secret_key">DEINEN Schlüssel \'%s\' löschen?</string>
<string name="title_export_log">Log exportieren</string>
<string name="title_manage_my_keys">Meine Schlüssel verwalten</string>
<!--section-->
<string name="section_user_ids">Identitäten</string>
+ <string name="section_yubikey">YubiKey</string>
<string name="section_linked_system_contact">Verknüpfter Systemkontakt</string>
<string name="section_should_you_trust">Sollte ich diesem Schlüssel vertrauen?</string>
<string name="section_proof_details">Nachweis überprüfen</string>
<string name="section_cloud_evidence">Nachweise aus der Cloud</string>
<string name="section_keys">Unterschlüssel</string>
<string name="section_cloud_search">Cloudsuche</string>
- <string name="section_passphrase_cache">Passwort Zwischenspeicher</string>
<string name="section_certify">Bestätigen</string>
<string name="section_actions">Aktionen</string>
<string name="section_share_key">Schlüssel</string>
<string name="section_key_server">Schlüsselserver</string>
<string name="section_fingerprint">Fingerabdruck</string>
<string name="section_encrypt">Verschlüsseln</string>
- <string name="section_decrypt">Entschlüsseln</string>
<string name="section_current_expiry">Aktuelles Ablaufdatum</string>
<string name="section_new_expiry">Neues Ablaufdatum</string>
<!--button-->
<string name="btn_decrypt_verify_file">Datei entschlüsseln, verifizieren und speichern</string>
<string name="btn_encrypt_share_file">Datei verschlüsseln und teilen</string>
<string name="btn_encrypt_save_file">Datei verschlüsseln und speichern</string>
- <string name="btn_save">Speichern</string>
<string name="btn_do_not_save">Abbrechen</string>
<string name="btn_delete">Löschen</string>
<string name="btn_no_date">Kein Ablaufdatum</string>
@@ -71,13 +68,15 @@
<string name="btn_view_cert_key">Beglaubigungsschlüssel anzeigen</string>
<string name="btn_create_key">Schlüssel erzeugen</string>
<string name="btn_add_files">Datei(en) hinzufügen</string>
- <string name="btn_add_share_decrypted_text">Entschlüsselten Text teilen</string>
- <string name="btn_decrypt_clipboard">Text aus Zwischenablage entschlüsseln</string>
- <string name="btn_decrypt_and_verify">und Signaturen überprüfen</string>
- <string name="btn_decrypt_files">Dateien entschlüsseln</string>
+ <string name="btn_share_decrypted_text">Entschlüsselten Text teilen</string>
+ <string name="btn_copy_decrypted_text">Entschlüsselten Text kopieren</string>
<string name="btn_encrypt_files">Dateien verschlüsseln</string>
<string name="btn_encrypt_text">Text verschlüsseln</string>
<string name="btn_add_email">Weitere E-Mail-Adresse hinzufügen</string>
+ <string name="btn_unlock">Entsperren</string>
+ <string name="btn_add_keyserver">Hinzufügen</string>
+ <string name="btn_save_default">Als Standard speichern</string>
+ <string name="btn_saved">Gespeichert!</string>
<!--menu-->
<string name="menu_preferences">Einstellungen</string>
<string name="menu_help">Hilfe</string>
@@ -91,7 +90,7 @@
<string name="menu_select_all">Alles auswählen</string>
<string name="menu_export_all_keys">Alle Schlüssel exportieren</string>
<string name="menu_update_all_keys">Alle Schlüssel aktualisieren</string>
- <string name="menu_advanced">Erweiterte Infos anzeigen</string>
+ <string name="menu_advanced">Erweiterte Informationen</string>
<string name="menu_certify_fingerprint">Über Fingerabdruckvergleich bestätigen</string>
<string name="menu_export_log">Log exportieren</string>
<!--label-->
@@ -119,12 +118,11 @@
<string name="label_encryption_algorithm">Verschlüsselungsalgorithmus</string>
<string name="label_hash_algorithm">Hash-Algorithmus</string>
<string name="label_symmetric">Mit Passwort verschlüsseln</string>
- <string name="label_passphrase_cache_ttl">Zwischenspeicherdauer</string>
- <string name="label_passphrase_cache_subs">Passwort pro Unterschlüssel zwischenspeichern</string>
<string name="label_message_compression">Nachrichtenkomprimierung</string>
<string name="label_file_compression">Datei Kompression</string>
- <string name="label_keyservers">Schlüsselserver</string>
+ <string name="label_keyservers">OpenPGP-Schlüsselserver auswählen</string>
<string name="label_key_id">Schlüssel-ID</string>
+ <string name="label_key_created">Schlüssel erstellt %s</string>
<string name="label_creation">Erstellungsdatum</string>
<string name="label_expiry">Ablaufdatum</string>
<string name="label_usage">Verwendungszweck</string>
@@ -142,10 +140,12 @@
<string name="label_enable_compression">Komprimierung aktivieren</string>
<string name="label_encrypt_filenames">Dateinamen verschlüsseln</string>
<string name="label_hidden_recipients">Empfänger verbergen</string>
- <string name="pref_keyserver">Schlüsselserver durchsuchen</string>
- <string name="pref_keyserver_summary">HKP-Schlüsselserver durchsuchen</string>
- <string name="pref_keybase">Keybase.io durchsuchen</string>
- <string name="pref_keybase_summary">Keybase.io-Index durchsuchen</string>
+ <string name="label_verify_keyserver">Schlüsselserver überprüfen</string>
+ <string name="label_enter_keyserver_url">Schlüsselserver-URL eingeben</string>
+ <string name="pref_keyserver">OpenPGP-Schlüsselserver</string>
+ <string name="pref_keyserver_summary">Schlüssel auf ausgewählten OpenPGP-Schlüsselservern suchen (HKP-Protokoll)</string>
+ <string name="pref_keybase">keybase.io</string>
+ <string name="pref_keybase_summary">Schlüssel auf keybase.io suchen</string>
<string name="user_id_no_name">&lt;kein Name&gt;</string>
<string name="none">&lt;keine&gt;</string>
<plurals name="n_keys">
@@ -188,7 +188,7 @@
<string name="wrong_passphrase">Falsches Passwort.</string>
<string name="no_filemanager_installed">Kein passender Dateimanager installiert.</string>
<string name="passphrases_do_not_match">Die Passwörter stimmten nicht überein.</string>
- <string name="passphrase_must_not_be_empty">Bitte ein Passwort eingeben.</string>
+ <string name="passphrase_must_not_be_empty">Bitte geben Sie ein Passwort ein.</string>
<string name="passphrase_for_symmetric_encryption">Symmetrische Verschlüsselung.</string>
<string name="passphrase_for">Passwort für \'%s\' eingeben</string>
<string name="pin_for">PIN für \'%s\' eingeben</string>
@@ -197,17 +197,15 @@
<string name="file_delete_confirmation_title">Originaldateien löschen?</string>
<string name="file_delete_confirmation">Die folgenden Dateien werden gelöscht: %s</string>
<string name="file_delete_successful">%1$d von %2$d Dateien wurden gelöscht.%3$s</string>
- <string name="no_file_selected">Zuerst eine Datei auswählen.</string>
<string name="encrypt_sign_successful">Erfolgreich signiert und/oder verschlüsselt.</string>
<string name="encrypt_sign_clipboard_successful">Erfolgreich in die Zwischenablage signiert und/oder verschlüsselt.</string>
<string name="select_encryption_key">Mindestens einen Schlüssel zum Verschlüsseln auswählen.</string>
- <string name="error_no_encryption_or_signature_key">Mindestens einen Schlüssel zum Verschlüsseln oder einen zum Signieren auswählen.</string>
<string name="specify_file_to_encrypt_to">Bitte angeben in welche Datei verschlüsselt werden soll.\nWARNUNG: Datei wird überschrieben, wenn sie bereits existiert.</string>
<string name="specify_file_to_decrypt_to">Bitte angeben in welche Datei entschlüsselt werden soll.\nWARNUNG: Datei wird überschrieben, wenn sie bereits existiert.</string>
<string name="specify_file_to_export_to">Bitte angeben in welche Datei exportiert werden soll.\nWARNUNG: Datei wird überschrieben, wenn sie bereits existiert.</string>
<string name="key_deletion_confirmation_multi">Möchtest du wirklich alle ausgewählten Schlüssel löschen?</string>
<string name="secret_key_deletion_confirmation">Nach dem Löschen wird es dir nicht mehr möglich sein mit diesem Schlüssel verschlüsselte Nachrichten zu lesen und zudem wirst du alle damit getätigten Bestätigungen verlieren!</string>
- <string name="public_key_deletetion_confirmation">Schlüssel löschen \'%s\'?</string>
+ <string name="public_key_deletetion_confirmation">Schlüssel \'%s\' löschen?</string>
<string name="also_export_secret_keys">Exportiere auch private Schlüssel</string>
<string name="reinstall_openkeychain">Du bist auf einen bekannten Fehler in Android gestoßen. Bitte installiere OpenKeychain erneut, wenn du deine Kontakte mit Schlüsseln verknüpfen willst.</string>
<string name="key_exported">1 Schlüssel erfolgreich exportiert.</string>
@@ -237,7 +235,7 @@
<string name="error_external_storage_not_ready">Externes Laufwerk ist nicht bereit</string>
<string name="error_key_size_minimum512bit">Schlüssel muss mindestens 512 Bit lang sein</string>
<string name="error_unknown_algorithm_choice">Unbekannte Auswahl für Algorithmus</string>
- <string name="error_user_id_no_email">keine E-Mail gefunden</string>
+ <string name="error_user_id_no_email">keine E-Mail-Adresse gefunden</string>
<string name="error_key_needs_a_user_id">Mindestens eine Identität wird benötigt</string>
<string name="error_no_signature_passphrase">kein Passwort angegeben</string>
<string name="error_no_signature_key">kein Signaturschlüssel angegeben</string>
@@ -250,21 +248,23 @@
<string name="error_nfc_needed">NFC muss aktiviert sein!</string>
<string name="error_beam_needed">Beam muss aktiviert sein!</string>
<string name="error_nothing_import">Keine Schlüssel gefunden!</string>
+ <string name="error_nothing_import_selected">Keine Schlüssel für den Import ausgewählt!</string>
<string name="error_contacts_key_id_missing">Abrufen der Schlüsselkennung von den Kontakten ist fehlgeschlagen!</string>
<string name="error_generic_report_bug">Ein allgemeiner Fehler trat auf, bitte reiche einen Fehlerbericht ein!</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">Nicht Signiert</string>
<string name="decrypt_result_invalid_signature">Ungültige Signatur!</string>
- <string name="decrypt_result_signature_uncertified">Signiert von (Nicht beglaubigt!)</string>
- <string name="decrypt_result_signature_certified">Signiert von</string>
- <string name="decrypt_result_signature_expired_key">Schlüssel ist abgelaufen!</string>
- <string name="decrypt_result_signature_revoked_key">Schlüssel wurde zurückgezogen!</string>
- <string name="decrypt_result_signature_missing_key">Unbekannter öffentlicher Schlüssel</string>
+ <string name="decrypt_result_signature_uncertified">Signiert von einem <b>unbestätigten</b> Schlüssel</string>
+ <string name="decrypt_result_signature_secret">Signiert von Ihrem Schlüssel</string>
+ <string name="decrypt_result_signature_certified">Signiert von einem bestätigten Schlüssel</string>
+ <string name="decrypt_result_signature_expired_key">Signiert von einem <b>abgelaufenem</b> Schlüssel!</string>
+ <string name="decrypt_result_signature_revoked_key">Signiert von einem <b>zurückgezogenem</b> Schlüssel!</string>
+ <string name="decrypt_result_signature_missing_key">Signiert von einem <b>unbekannten öffentlichen Schlüssel</b></string>
<string name="decrypt_result_encrypted">Verschlüsselt</string>
<string name="decrypt_result_not_encrypted">Nicht Verschlüsselt</string>
<string name="decrypt_result_action_show">Anzeigen</string>
<string name="decrypt_result_action_Lookup">Nachschlagen</string>
- <string name="decrypt_invalid_text">Der Schlüssel ist entweder ungültig oder wurde zurückgezogen/ist abgelaufen. Sie können den Verfasser der Nachricht nicht eindeutig identifizieren. Wollen Sie die Nachricht trotzdem anzeigen?</string>
+ <string name="decrypt_invalid_text">Entweder ist die Signatur ungültig oder der Schlüssel wurde widerrufen. Es ist nicht sicher, wer den Text geschrieben hat. Soll er trotzdem angezeigt werden?</string>
<string name="decrypt_invalid_button">Ich verstehe das Risiko, Nachricht anzeigen!</string>
<!--Add keys-->
<string name="add_keys_my_key">Mein Schlüssel:</string>
@@ -294,11 +294,12 @@
<string name="progress_modify_subkeyrevoke">Unterschlüssel wird widerrufen...</string>
<string name="progress_modify_subkeystrip">Kürze Unterschlüssel...</string>
<string name="progress_modify_subkeyadd">Unterschlüssel wird hinzugefügt...</string>
- <string name="progress_modify_passphrase">Passwort wird geändert...</string>
+ <string name="progress_modify_passphrase">Passwort wird geändert…</string>
<plurals name="progress_exporting_key">
<item quantity="one">Schlüssel wird exportiert…</item>
<item quantity="other">Schlüssel werden exportiert…</item>
</plurals>
+ <string name="progress_start">Vorgang wird vorbereitet…</string>
<string name="progress_extracting_signature_key">Signaturschlüssel wird extrahiert…</string>
<string name="progress_extracting_key">Schlüssel wird extrahiert…</string>
<string name="progress_preparing_streams">Datenstrom wird vorbereitet…</string>
@@ -318,6 +319,7 @@
<string name="progress_deleting">Lösche Schlüssel</string>
<string name="progress_con_saving">Zusammenführung: Im Cache speichern...</string>
<string name="progress_con_reimport">Zusammenführung: Neuimportierung...</string>
+ <string name="progress_verifying_keyserver_url">Schlüsselserver wird überprüft…</string>
<!--action strings-->
<string name="hint_cloud_search_hint">Via Name, E-Mail durchsuchen...</string>
<!--key bit length selections-->
@@ -359,11 +361,13 @@
<string name="import_tab_qr_code">QR-Code/NFC</string>
<string name="import_import">Ausgewählte Schlüssel importieren</string>
<string name="import_qr_code_wrong">Falsch formatierter QR-Code! Bitte erneut versuchen!</string>
- <string name="import_qr_code_too_short_fingerprint">Der Fingerabdruck ist zu kurz (&lt; 16 Zeichen)</string>
+ <string name="import_qr_code_fp">Fingerabdruck ist beschädigt oder zu kurz!</string>
+ <string name="import_qr_code_too_short_fingerprint">Fingerabdruck ist zu kurz!</string>
<string name="import_qr_code_button">QR-Code scannen</string>
<string name="import_qr_code_text">Halte deine Kamera über den QR-Code!</string>
+ <!--Import from URL-->
+ <string name="import_url_warn_no_search_parameter">Kein Suchbegriff angegeben. Sie können trotzdem manuell auf dem Keyserver suchen.</string>
<!--Generic result toast-->
- <string name="snackbar_details">Details</string>
<string name="with_warnings">, mit Warnungen</string>
<string name="with_cancelled">. bis abgebrochen wurde</string>
<!--Import result toast-->
@@ -464,6 +468,7 @@
<string name="api_select_pub_keys_text_no_user_ids">Bitte wählen sie einen Empfänger!</string>
<string name="api_error_wrong_signature">Signaturüberprüfung fehlgeschlagen! Haben Sie diese Anwendung aus einer anderen Quelle installiert? Wenn Sie eine Attacke ausschliessen können, sollten Sie die Registrierung der App in OpenKeychain widerrufen und die Anwendung erneut registrieren.</string>
<string name="api_select_sign_key_text">Bitte wähle einen deiner vorhandenen Schlüssel aus oder erzeuge einen neuen.</string>
+ <string name="api_select_keys_text">Keiner der zugelassenen Schlüssel kann den Inhalt entschlüsseln. Bitte wählen Sie die zugelassenen Schlüssel aus.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Über QR-Code teilen</string>
<string name="share_nfc_dialog">Über NFC teilen</string>
@@ -555,12 +560,15 @@
<item>Ablaufdatum ändern</item>
<item>Unterschlüssel widerrufen</item>
<item>Unterschlüssel kürzen</item>
- <item>"Move Subkey to Yubikey / Smart Card"</item>
+ <item>Unterschlüssel auf Yubikey/Smartcard verschieben</item>
</string-array>
<string name="edit_key_new_subkey">neuer Unterschlüssel</string>
<string name="edit_key_select_flag">Mindestens ein Attribut wählen!</string>
<string name="edit_key_error_add_identity">Füge mindestens eine Identität hinzu!</string>
<string name="edit_key_error_add_subkey">Fügen Sie mindestens einen Unterschlüssel hinzu!</string>
+ <string name="edit_key_error_bad_nfc_algo">Hash-Algorithmus wird von dieser Smartcard nicht unterstützt!</string>
+ <string name="edit_key_error_bad_nfc_size">Schlüssellänge wird von dieser Smartcard nicht unterstützt!</string>
+ <string name="edit_key_error_bad_nfc_stripped">Kann Schlüssel nicht auf Smartcard verschieben (entweder gekürzt oder \'auf Karte umleiten\')!</string>
<!--Create key-->
<string name="create_key_upload">Mit der Cloud synchronisieren</string>
<string name="create_key_empty">Dieses Feld wird benötigt</string>
@@ -571,12 +579,13 @@
<string name="create_key_custom">(Benutzerdefinierte Schlüsseleinstellung)</string>
<string name="create_key_name_text">Verknüpfe einen Namen mit diesem Schlüssel. Es kann ein voller Name, z.B. \"John Doe\", oder ein Spitzname, z.B. \"Johnny\", sein.</string>
<string name="create_key_email_text">Gib deine Haupt-E-Mail-Adresse ein, die du für sichere Kommunikation nutzen möchtest.</string>
- <string name="create_key_passphrase_text">Wähle ein starkes Passwort. Es schützt deinen Schlüssel, falls dein Gerät gestohlen wird.</string>
+ <string name="create_key_passphrase_text">Wählen Sie ein langes Passwort. Es schützt Ihre Schlüssel, wenn Ihr Gerät gestohlen werden sollte.</string>
<string name="create_key_hint_full_name">Vollständiger Name oder Spitzname</string>
<string name="create_key_edit">Schlüsselkonfiguration ändern</string>
<string name="create_key_add_email">E-Mail-Adresse hinzufügen</string>
<string name="create_key_add_email_text">Es sind zusätzliche E-Mail-Adressen mit diesem Schlüssel verknüpft, die zur sicheren Kommunikation verwendet werden können.</string>
- <string name="create_key_email_already_exists_text">E-Mail wurde bereits hinzugefügt</string>
+ <string name="create_key_email_already_exists_text">E-Mail-Adresse wurde bereits hinzugefügt</string>
+ <string name="create_key_email_invalid_email">E-Mail-Adressformat ist ungültig</string>
<!--View key-->
<string name="view_key_revoked">Widerrufen: Schlüssel darf nicht mehr genutzt werden!</string>
<string name="view_key_expired">Abgelaufen: Der Kontakt muss die Gültigkeit des Schlüssels verlängern!</string>
@@ -585,6 +594,12 @@
<string name="view_key_verified">Bestätigter Schlüssel</string>
<string name="view_key_unverified">Unbestätigt: QR-Code scannen, um den Schlüssel zu bestätigen!</string>
<string name="view_key_fragment_no_system_contact">&lt;keine&gt;</string>
+ <!--Add keyserver-->
+ <string name="add_keyserver_dialog_title">Schlüsselserver hinzufügen</string>
+ <string name="add_keyserver_verified">Schlüsselserver bestätigt!</string>
+ <string name="add_keyserver_without_verification">Schlüsselserver ohne Überprüfung hinzugefügt.</string>
+ <string name="add_keyserver_invalid_url">Ungültige URL!</string>
+ <string name="add_keyserver_connection_failed">Kann sich nicht mit Keyserver verbinden. Bitte überprüfen Sie die URL und Ihre Internetverbindung.</string>
<!--Navigation Drawer-->
<string name="nav_keys">Schlüssel</string>
<string name="nav_encrypt_decrypt">Verschlüsseln/Entschlüsseln</string>
@@ -712,10 +727,10 @@
<string name="msg_is_pubring_generate">Generiere öffentlichen Schlüsselbund aus geheimem Schlüsselbund</string>
<string name="msg_is_subkey_nonexistent">Unterschlüssel %s in privatem Schlüssel nicht verfügbar.</string>
<string name="msg_is_subkey_ok">Geheimen Unterschlüssel %s als verfügbar markiert</string>
- <string name="msg_is_subkey_empty">Geheimen Unterschlüssel %s als verfügbar markiert, ohne Passwort</string>
+ <string name="msg_is_subkey_empty">Geheimen Unterschlüssel %s als verfügbar markiert, mit leerem Passwort</string>
<string name="msg_is_subkey_pin">Geheimen Unterschlüssel %s als verfügbar markiert, mit PIN</string>
<string name="msg_is_subkey_stripped">Privater Unterschlüssel %s als gekürzt markiert</string>
- <string name="msg_is_subkey_divert">Privater Unterschlüssel %s als \'Umgeleitet zu Smartcard/NFC\' markiert</string>
+ <string name="msg_is_subkey_divert">Geheimen Unterschlüssel %s als \'Umgeleitet zu Smartcard/NFC\' markiert</string>
<string name="msg_is_success_identical">Schlüsselbund enthält keine neuen Daten, es gibt nichts zu tun</string>
<string name="msg_is_success">Geheimer Schlüsselbund erfolgreich importiert</string>
<!--Keyring Canonicalization log entries-->
@@ -742,8 +757,9 @@
<string name="msg_kc_sub_bad_local">Entferne Unterschlüssel-Zwischenbeglaubigung mit \"Lokal\"-Attribut</string>
<string name="msg_kc_sub_bad_keyid">Ungleiche Zwischenausstellerkennung beim Unterschlüssels</string>
<string name="msg_kc_sub_bad_time">Entferne Unterschlüssel-Zwischenbeglaubigung mit zukünftigem Zeitstempel</string>
+ <string name="msg_kc_sub_bad_time_early">Zwischenbeglaubigung des Unterschlüssels hat früheren Zeitstempel als sein Schlüssel!</string>
<string name="msg_kc_sub_bad_type">Unbekannte Unterschlüsselbeglaubigungart: %s</string>
- <string name="msg_kc_sub_dup">Entferne redundate Unterschlüssel-Zwischenbeglaubigung</string>
+ <string name="msg_kc_sub_dup">Entferne redundante Unterschlüssel-Zwischenbeglaubigung</string>
<string name="msg_kc_sub_primary_bad">Entferne Unterschlüssel-Zwischenbeglaubigung aufgrund ungültiger primärer Zwischenbeglaubigung</string>
<string name="msg_kc_sub_primary_bad_err">Entferne Unterschlüssel-Zwischenbeglaubigung aufgrund fehlerhafter primärer Zwischenbeglaubigung</string>
<string name="msg_kc_sub_primary_none">Entferne Unterschlüssel-Zwischenbeglaubigung aufgrund fehlender primärer Zwischenbeglaubigung</string>
@@ -776,7 +792,7 @@
<string name="msg_kc_uid_no_cert">Keine gültige Eigenbeglaubigung für User-ID \'%s\' gefunden, wird aus Schlüsselbund entfernt</string>
<string name="msg_kc_uid_remove">Ungültige User-ID \'%s\' wird entfernt</string>
<string name="msg_kc_uid_dup">Doppelte User-ID \'%s\' wird entfernt. Der Schlüsselbund enthielt zwei davon. Hieraus könnten fehlende Beglaubigungen resultieren!</string>
- <string name="msg_kc_uid_warn_encoding">User-ID nicht als UTF-8 bestätigt!</string>
+ <string name="msg_kc_uid_warn_encoding">Benutzerkennung nicht als UTF-8 bestätigt!</string>
<string name="msg_kc_uat_jpeg">Das Benutzerattribut JPEG wird verarbeitet</string>
<string name="msg_kc_uat_unknown">Ein unbekanntes Benutzerattribut wird verarbeitet</string>
<string name="msg_kc_uat_bad_err">Entferne fehlerhafte Eigenbeglaubigung für Benutzerattribut</string>
@@ -791,7 +807,7 @@
<string name="msg_kc_uat_revoke_old">Entferne abgelaufenes Widerrufszertifikat der Benutzerattribute</string>
<string name="msg_kc_uat_no_cert">Keine gültige Eigenbeglaubigung für das Benutzerattribut gefunden, wird aus Schlüsselbund entfernt</string>
<string name="msg_kc_uat_remove">Ungültiges Benutzerattribut wird entfernt</string>
- <string name="msg_kc_uat_warn_encoding">User-ID nicht als UTF-8 bestätigt!</string>
+ <string name="msg_kc_uat_warn_encoding">Benutzerkennung nicht als UTF-8 bestätigt!</string>
<!--Keyring merging log entries-->
<string name="msg_mg_error_secret_dummy">Neuer öffentlicher Unterschlüssel gefunden, aber Erstellung von geheimen Unterschlüsseldummys wird nicht unterstützt!</string>
<string name="msg_mg_error_heterogeneous">Versuch Schlüsselbünde mit unterschiedlichen Fingerabdrücken zusammenzuführen!</string>
@@ -819,7 +835,8 @@
<string name="msg_cr_error_flags_ecdh">Falsche Schlüsselattribute gewählt, ECDH kann nicht zum signieren verwendet werden!</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Verändere Schlüsselbund %s</string>
- <string name="msg_mf_error_divert_serial">Die Seriennummer eines \"Umgeleitet zu SmartCard/NFC\"-Schlüssels muss 16 Byte lang sein! Dies ist ein Progammierfehler, bitte reiche einen Fehlerbericht ein!</string>
+ <string name="msg_mf_divert">Werde für Verschlüsselungsoperationen auf Smartcard umleiten</string>
+ <string name="msg_mf_error_divert_serial">Die Seriennummer eines \'Auf Smartcard/NFC umleiten\'-Schlüssels muss 16 Byte lang sein! Dies ist ein Programmierfehler, bitte reiche einen Fehlerbericht ein!</string>
<string name="msg_mf_error_encode">Kodierungsfehler!</string>
<string name="msg_mf_error_fingerprint">Tatsächlicher Fingerabdruck des Schlüssels entspricht nicht dem Erwarteten!</string>
<string name="msg_mf_error_keyid">Keine Schlüssel-ID. Dies ist ein interner Fehler, bitte reiche einen Fehlerbericht ein!</string>
@@ -827,28 +844,34 @@
<string name="msg_mf_error_master_none">Keine Hauptbeglaubigung zum arbeiten gefunden! (Alle widerrufen?)</string>
<string name="msg_mf_error_noexist_primary">Falsche primäre User-ID festgelegt!</string>
<string name="msg_mf_error_noexist_revoke">Falsche User-ID für Widerruf festgelegt!</string>
- <string name="msg_mf_error_restricted">Es wurde versucht eine beschränkte Operation ohne Passwort auszuführen! Dies ist ein Programmierfehle, bitte reiche einen Fehlerbericht ein!</string>
<string name="msg_mf_error_revoked_primary">Widerrufene User-IDs können nicht primäre IDs sein!</string>
<string name="msg_mf_error_null_expiry">Ablaufdatum kann bei Unterschlüsselerstellung nicht \"identisch wie vorher\" sein. Dies ist ein Programmierfehler, bitte reiche einen Fehlerbericht ein!</string>
+ <string name="msg_mf_error_noop">Nichts zu machen!</string>
<string name="msg_mf_error_passphrase_master">Schwerer Fehler beim Entschlüsseln des Hauptschlüssels! Dies ist wahrscheinlich ein Programmierfehler, bitte reiche einen Fehlerbericht ein!</string>
<string name="msg_mf_error_pgp">Interner OpenPGP Fehler!</string>
<string name="msg_mf_error_sig">Signaturfehler!</string>
+ <string name="msg_mf_error_subkey_missing">Versuch mit fehlendem Unterschlüssel %s zu arbeiten!</string>
+ <string name="msg_mf_error_duplicate_keytocard_for_slot">Smartcard unterstützt nur einen Slot pro Schlüsseltyp.</string>
+ <string name="msg_mf_error_invalid_flags_for_keytocard">Unangebrachte Schlüsselattribute für Schlüssel auf Smartcard.</string>
<string name="msg_mf_master">Verändere Hauptbeglaubigungen</string>
<string name="msg_mf_notation_empty">Füge leeres Vermerk-Paket hinzu</string>
<string name="msg_mf_notation_pin">Füge PIN-Vermerk-Paket hinzu</string>
<string name="msg_mf_passphrase">Passwort für Schlüsselbund wird geändert</string>
<string name="msg_mf_passphrase_key">Erneute Verschlüsselung des Unterschlüssels %s mit neuem Passwort</string>
- <string name="msg_mf_passphrase_empty_retry">Setzen des neuen Passworts fehlgeschlagen, versuche es nochmal mit leerem altem Passwort</string>
- <string name="msg_mf_passphrase_fail">Passwort für Unterschlüssel konnte nicht geändert werden! (Hat er ein anderes als die anderen Schlüssel?)</string>
+ <string name="msg_mf_passphrase_empty_retry">Setzen eines neuen Passworts fehlgeschlagen, versuche erneut mit leerem altem Passwort</string>
+ <string name="msg_mf_passphrase_fail">Passwort für Unterschlüssel konnte nicht geändert werden! (Hat es ein anderes Passwort als die anderen Schlüssel?)</string>
<string name="msg_mf_primary_replace_old">Beglaubigung von vorheriger primärer User-ID wird ersetzt</string>
<string name="msg_mf_primary_new">Neue Beglaubigung für neue primäre User-ID wird erzeugt</string>
<string name="msg_mf_subkey_change">Unterschlüssel %s wird geändert</string>
- <string name="msg_mf_error_subkey_missing">Versuch mit fehlendem Unterschlüssel %s zu arbeiten!</string>
+ <string name="msg_mf_require_divert">Leite für Verschlüsselungsoperationen auf Smartcard um</string>
+ <string name="msg_mf_require_passphrase">Passwort für die Vorgänge erforderlich</string>
<string name="msg_mf_subkey_new">Füge neuen Unterschlüssel vom Typ %s hinzu</string>
<string name="msg_mf_subkey_new_id">Neue Unterschlüsselkennung: %s</string>
<string name="msg_mf_error_past_expiry">Ablaufdatum kann nicht in der Vergangenheit liegen!</string>
<string name="msg_mf_subkey_revoke">Widerrufe Unterschlüssel %s</string>
<string name="msg_mf_subkey_strip">Kürze Unterschlüssel %s</string>
+ <string name="msg_mf_keytocard_start">Verschiebe Unterschlüssel %s auf Smartcard</string>
+ <string name="msg_mf_keytocard_finish">%1$s auf Smartcard %2$s verschoben</string>
<string name="msg_mf_success">Schlüsselbund erfolgreich verändert</string>
<string name="msg_mf_uid_add">User-ID %s wird hinzugefügt</string>
<string name="msg_mf_uid_primary">Primäre User-ID wird geändert zu %s</string>
@@ -900,12 +923,11 @@
<string name="msg_ed_success">Schlüsselvorgang erfolgreich</string>
<!--Promote key-->
<string name="msg_pr">Befördere öffentlichen Schlüssel zum geheimen Schlüssel</string>
- <string name="msg_pr_error_already_secret">Der Schlüssel ist bereits ein geheimer Schlüssel!</string>
<string name="msg_pr_error_key_not_found">Schlüssel nicht gefunden!</string>
<string name="msg_pr_fetching">Zu ändernder Schlüssel wird abgerufen (%s)</string>
+ <string name="msg_pr_subkey_nomatch">Unterschlüssel nicht auf YubiKey: %s</string>
<string name="msg_pr_success">Schlüssel erfolgreich befördert</string>
<!--Other messages used in OperationLogs-->
- <string name="msg_ek_error_divert">Bearbeiten von NFC-Schlüsseln wird (noch) nicht unterstützt!</string>
<string name="msg_ek_error_dummy">Kann Schlüsselbund nicht mit gekürztem Hauptschlüssel bearbeiten!</string>
<string name="msg_ek_error_not_found">Schlüssel nicht gefunden!</string>
<!--Messages for DecryptVerify operation-->
@@ -922,15 +944,16 @@
<string name="msg_dc_clear_meta_time">Änderungszeit: %s</string>
<string name="msg_dc_clear_signature_bad">Signaturprüfung NICHT OK!</string>
<string name="msg_dc_error_unsupported_hash_algo">Nicht unterstützter und potentiell unsicherer Hash-Algorithmus!</string>
- <string name="msg_dc_clear_signature_check">Überprüfe Signaturdaten</string>
+ <string name="msg_dc_clear_signature_check">Signaturdaten werden überprüft</string>
<string name="msg_dc_clear_signature_ok">Signaturprüfung OK</string>
<string name="msg_dc_clear_signature">Speichere Signatur für später</string>
<string name="msg_dc_clear">Verarbeite Klartextdaten</string>
- <string name="msg_dc_error_bad_passphrase">Fehler bei Schlüsselentsperrung, falsches Passwort!</string>
+ <string name="msg_dc_error_bad_passphrase">Fehler beim Entsperren des Schlüssels, falsches Passwort!</string>
+ <string name="msg_dc_error_corrupt_data">Daten beschädigt!</string>
<string name="msg_dc_error_extract_key">Unbekannter Fehler bei Schlüsselentsperrung!</string>
<string name="msg_dc_error_integrity_check">Integritätsprüfungsfehler!</string>
<string name="msg_dc_error_integrity_missing">Fehlende Integritätsprüfung Dies kann passieren, wenn die Verschlüsselungsanwendung veraltet ist oder durch einen Downgrade-Angriff.</string>
- <string name="msg_dc_error_invalid_data">Keine gültigen Signaturdaten gefunden!</string>
+ <string name="msg_dc_error_invalid_data">Kein gültiger OpenPGP-verschlüsselter oder -signierter Inhalt!</string>
<string name="msg_dc_error_io">Ein-/Ausgabefehler während Vorgang aufgetreten!</string>
<string name="msg_dc_error_no_data">Keine verschlüsselten Daten in Datenstrom gefunden!</string>
<string name="msg_dc_error_no_key">Keine verschlüsselten Daten mit bekanntem geheimen Schlüssel in Datenstrom gefunden!</string>
@@ -938,9 +961,9 @@
<string name="msg_dc_integrity_check_ok">Integritätsprüfung OK!</string>
<string name="msg_dc_ok_meta_only">Es wurden nur Metadaten angefragt, überspringe Entschlüsselung</string>
<string name="msg_dc_ok">Entschlüsselung/Überprüfung abgeschlossen</string>
- <string name="msg_dc_pass_cached">Verwende Passwort aus Zwischenspeicher</string>
+ <string name="msg_dc_pass_cached">Passwort aus Zwischenspeicher verwenden</string>
<string name="msg_dc_pending_nfc">NFC-Token benötigt, verlange Benutzereingabe...</string>
- <string name="msg_dc_pending_passphrase">Passwort benötigt, verlange Benutezreingabe...</string>
+ <string name="msg_dc_pending_passphrase">Passwort erforderlich, Benutzereingabe wird angefordert…</string>
<string name="msg_dc_prep_streams">Bereite Datenkette </string>
<string name="msg_dc">Starte Entschlüsselungsvorgang...</string>
<string name="msg_dc_sym_skip">Symmetrische Daten nicht erlaubt, überspringe...</string>
@@ -959,7 +982,7 @@
<string name="msg_vl_clear_meta_mime">MIME-Typ: %s</string>
<string name="msg_vl_clear_meta_time">Änderungszeit: %s</string>
<string name="msg_vl_clear_meta_size">Dateigröße: %s</string>
- <string name="msg_vl_clear_signature_check">Überprüfe Signaturdaten</string>
+ <string name="msg_vl_clear_signature_check">Signaturdaten werden überprüft</string>
<string name="msg_vl_error_integrity_check">Integritätsprüfung fehlgeschlagen!</string>
<string name="msg_vl_ok">OK</string>
<!--Messages for SignEncrypt operation-->
@@ -970,7 +993,6 @@
<string name="msg_se_error_input_uri_not_found">Fehler beim öffnen der URI zum lesen!</string>
<string name="msg_se_error_output_uri_not_found">Fehler beim öffnen der URI zum schreiben!</string>
<string name="msg_se_error_too_many_inputs">Mehr Eingaben als Ausgaben angegeben! Dies ist vermutlich ein Programmierfehler, diesen bitte melden!</string>
- <string name="msg_se_warn_output_left">Es sind Ausgaben, aber keine Eingaben mehr übrig! Dies ist vermutlich ein Programmierfehler, diesen bitte melden!</string>
<string name="msg_se_success">Signier-/Verschlüsselungsvorgang erfolgreich!</string>
<!--Messages for PgpSignEncrypt operation-->
<string name="msg_pse_asymmetric">Bereite öffentliche Schlüssel für Verschlüsselung vor</string>
@@ -992,7 +1014,7 @@
<string name="msg_pse_key_warn">Falscher Schlüssel für Verschlüsselung: %s</string>
<string name="msg_pse_ok">Signierungs-/Verschlüsselungsvorgang erfolgreich!</string>
<string name="msg_pse_pending_nfc">NFC-Token benötigt, verlange Benutzereingabe...</string>
- <string name="msg_pse_pending_passphrase">Passwort benötigt, verlange Benutzereingabe...</string>
+ <string name="msg_pse_pending_passphrase">Passwort erforderlich, Benutzereingabe wird angefordert…</string>
<string name="msg_pse_signing">Signiere Daten (ohne Verschlüsselung)</string>
<string name="msg_pse_signing_cleartext">Erstelle Klartextsignatur</string>
<string name="msg_pse_signing_detached">Abgetrennte Signatur wird erstellt</string>
@@ -1012,9 +1034,9 @@
<string name="msg_crt_error_master_not_found">Hauptschlüssel nicht gefunden!</string>
<string name="msg_crt_error_nothing">Keine beglaubigten Schlüssel!</string>
<string name="msg_crt_error_unlock">Fehler beim Entsperren des Hauptschlüssels!</string>
- <string name="msg_crt_error_divert">Beglaubigung über NFC wird (noch) nicht unterstützt!</string>
<string name="msg_crt">Schlüsselbünde werden beglaubigt</string>
<string name="msg_crt_master_fetch">Beglaubigender Hauptschlüssel wird abgerfufen</string>
+ <string name="msg_crt_nfc_return">Kehre zu NFC-Bildschirm zurück</string>
<string name="msg_crt_save">Beglaubigter Schlüssel %s wird gespeichert</string>
<string name="msg_crt_saving">Schlüsselbünde werden gespeichert</string>
<string name="msg_crt_unlock">Hauptschlüssel wird entsperrt</string>
@@ -1030,13 +1052,14 @@
<string name="msg_import_fetch_error_decode">Fehler beim Dekodieren des abgerufenen Schlüsselbundes!</string>
<string name="msg_import_fetch_error">Schlüssel konnte nicht abgerufen werden! (Netzwerkprobleme?)</string>
<string name="msg_import_fetch_keybase">Empfange von keybase.io: %s</string>
- <string name="msg_import_fetch_keyserver_error">Konnte Schlüssel nicht von Keybase empfangen!</string>
+ <string name="msg_import_fetch_keyserver_error">Konnte Schlüssel nicht von Keyserver abrufen: %s</string>
<string name="msg_import_fetch_keyserver">Von einem Schlüsselserver abrufen: %s</string>
<string name="msg_import_fetch_keyserver_ok">Schlüsselabruf erfolgreich!</string>
<string name="msg_import_keyserver">Schlüsselserver %s wird verwendet</string>
<string name="msg_import_fingerprint_error">Fingerabdruck des abgerufenen Schlüssels entspricht nicht dem Erwarteten!</string>
<string name="msg_import_fingerprint_ok">Fingerabdrucktest in Ordnung</string>
<string name="msg_import_merge">Abgerufene Daten werden eingefügt</string>
+ <string name="msg_import_merge_error">Fehler beim Zusammenführen der abgerufenen Daten!</string>
<string name="msg_import_error">Importieren fehlgeschlagen!</string>
<string name="msg_import_error_io">Der Import ist aufgrund eines Eingabe/Ausgabe-Fehlers fehlgeschlagen!</string>
<string name="msg_import_partial">Importvorgang erfolgreich, mit Fehlern!</string>
@@ -1093,10 +1116,6 @@
<string name="msg_export_log_error_writing">Ein-/Ausgabefehler beim schreiben in die Datei!</string>
<string name="msg_export_log_success">Protokoll erfolgreich exportiert!</string>
<!--PassphraseCache-->
- <string name="passp_cache_notif_click_to_clear">Klicken um Passworte aus Zwischenspeicher zu löschen</string>
- <string name="passp_cache_notif_n_keys">OpenKeychain hat %d Passworte zwischengespeichert</string>
- <string name="passp_cache_notif_keys">Zwischengespeicherte Passworte:</string>
- <string name="passp_cache_notif_clear">Cache löschen</string>
<string name="passp_cache_notif_pwd">Passwort</string>
<!--First Time-->
<string name="first_time_text1">Hol dir deine Privatsphäre mit OpenKeychain zurück!</string>
@@ -1120,7 +1139,7 @@
<string name="error_key_not_found">Schlüssel nicht gefunden!</string>
<string name="error_key_processing">Fehler bei der Verarbeitung des Schlüssels!</string>
<string name="key_stripped">nicht verfügbar</string>
- <string name="key_divert">Umgeleitet zu SmartCard/NFC</string>
+ <string name="key_divert">Auf Smartcard umleiten</string>
<string name="key_no_passphrase">kein Passwort</string>
<string name="key_unavailable">nicht verfügbar</string>
<string name="secret_cannot_multiple">Deine eigenen Schlüssel können nur einzeln gelöscht werden!</string>
@@ -1132,7 +1151,7 @@
<string name="contact_show_key">Schlüssel anzeigen (%s)</string>
<string name="swipe_to_update">Nach unten wischen um von Schlüsselserver zu aktualisieren</string>
<string name="error_no_file_selected">Mindestens eine Datei zum Verschlüsseln auswählen!</string>
- <string name="error_multi_files">Das speichern von mehreren Dateien wird nicht unterstützt. Dies ist eine Einschränkung der aktuellen Android Version.</string>
+ <string name="error_empty_text">Zu verschlüsselnden Text eingeben</string>
<string name="key_colon">Schlüssel:</string>
<string name="exchange_description">Um einen Schlüsselaustausch zu starten wähle auf der rechten Seite die Teilnehmer aus, drücke dann den \"Austausch starten\"-Knopf.\n\nDu wirst zusätzlich zwei Fragen gestellt bekommen um sicherzustellen, dass nur die richtigen Teilnehmer am Austausch beteiligt sind und deren Fingerabdrücke korrekt sind.</string>
<string name="btn_start_exchange">Austausch starten</string>
@@ -1140,20 +1159,20 @@
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
<string name="title_unlock_method">Wähle eine Entsperrmethode</string>
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<string name="enter_passphrase">Passwort eingeben</string>
<string name="passphrase">Passwort</string>
<string name="noPassphrase">Kein Passwort</string>
- <string name="no_passphrase_set">Kein Passwort gesetzt</string>
- <string name="passphrases_match">Die Passwörter stimmten nicht überein</string>
+ <string name="no_passphrase_set">Kein Passwort festgelegt</string>
+ <string name="passphrases_match">Passwörter stimmen nicht überein</string>
<string name="passphrase_saved">Passwort gespeichert</string>
- <string name="passphrase_invalid">Falsches Passwort</string>
+ <string name="passphrase_invalid">Passwort ungültig</string>
<string name="missing_passphrase">Fehlendes Passwort</string>
<string name="passphrase_again">Wiederholen</string>
<string name="lockpattern">Entsperrcode</string>
<string name="lockpatternNFC">NFC + Entsperrcode</string>
<string name="unlock_method">Entsperrmethode</string>
- <string name="set_passphrase">Passwort setzen</string>
+ <string name="set_passphrase">Passwort festlegen</string>
<string name="draw_lockpattern">Zeichne Entsperrcode</string>
<string name="nfc_title">NFC</string>
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
@@ -1163,4 +1182,34 @@
<string name="nfc_write_succesful">Erfolgreich auf den NFC-Tag geschrieben</string>
<string name="unlocked">Entsperrt</string>
<string name="nfc_settings">Einstellungen</string>
+ <string name="snack_yubikey_view">Ansicht</string>
+ <string name="snack_yubikey_import">Import</string>
+ <string name="button_bind_key">Schlüssel verbinden</string>
+ <string name="yubikey_serno">Seriennummer: %s</string>
+ <string name="yubikey_key_holder">Schlüsselinhaber:</string>
+ <string name="yubikey_key_holder_not_set">Schlüsselnhaber: &lt;nicht gesetzt&gt;</string>
+ <string name="yubikey_status_bound">YubiKey stimmt überein und ist mit dem Schlüssel verbunden</string>
+ <string name="yubikey_status_unbound">YubiKey stimmt überein und kann mit dem Schlüssel verbunden werden</string>
+ <string name="yubikey_status_partly">YubiKey stimmt überein und ist teilweise mit dem Schlüssel verbunden</string>
+ <string name="yubikey_create">Halte YubiKey gegen die Rückseite Deines Geräts.</string>
+ <string name="btn_import">Import</string>
+ <string name="snack_yubi_other">Anderer Schlüssel auf YubiKey gespeichert!</string>
+ <string name="error_nfc">NFC-Fehler: %s</string>
+ <string name="error_pin">NFC: Falsche PIN, %d Versuche verbleibend</string>
+ <string name="error_nfc_wrong_length">NFC: Falsche Länge für gesendete/empfangene Daten</string>
+ <string name="error_nfc_security_not_satisfied">NFC: Sicherheitsstatus nicht zufriedenstellend</string>
+ <string name="error_nfc_authentication_blocked">NFC: PIN nach zu vielen Versuchen gesperrt</string>
+ <string name="error_nfc_data_not_found">NFC: Schlüssel oder Objekt nicht gefunden</string>
+ <string name="error_nfc_unknown">NFC: Unbekannter Fehler</string>
+ <string name="error_nfc_bad_data">NFC: Karte meldete ungültige Daten</string>
+ <string name="error_nfc_header">NFC: Karte meldete ungültige %s Byte</string>
+ <string name="error_pin_nodefault">Standard-PIN abgelehnt</string>
+ <string name="snack_encrypt_filenames_on">Dateinamen <b>sind</b> verschlüsselt.</string>
+ <string name="snack_encrypt_filenames_off">Dateinamen <b>sind nicht</b> verschlüsselt.</string>
+ <string name="snack_armor_on">Ausgabe als Text kodiert.</string>
+ <string name="snack_armor_off">Ausgabe als Binärdatei kodiert.</string>
+ <string name="snack_compression_on">Komprimierung <b>aktiviert</b>.</string>
+ <string name="snack_compression_off">Komprimierung <b>deaktiviert</b>.</string>
+ <string name="error_loading_keys">Fehler beim Laden der Schlüssel!</string>
+ <string name="error_empty_log">(Fehler, leeres Protokoll)</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml
index 8b20aeb04..f120f411d 100644
--- a/OpenKeychain/src/main/res/values-es/strings.xml
+++ b/OpenKeychain/src/main/res/values-es/strings.xml
@@ -7,13 +7,12 @@
<string name="title_encrypt_text">Encriptar</string>
<string name="title_encrypt_files">Encriptar</string>
<string name="title_decrypt">Descifrar</string>
- <string name="title_unlock">Desbloquear clave</string>
<string name="title_add_subkey">Añadir subclave</string>
<string name="title_edit_key"> Editar clave</string>
<string name="title_preferences">Configuración</string>
<string name="title_api_registered_apps">Aplicaciones</string>
- <string name="title_key_server_preference">Servidores de claves</string>
- <string name="title_change_passphrase">Cambiar frase de contraseña</string>
+ <string name="title_key_server_preference">Servidores de claves OpenPGP</string>
+ <string name="title_change_passphrase">Cambiar contraseña</string>
<string name="title_share_fingerprint_with">Compartir huella digital con...</string>
<string name="title_share_key">Compartir clave con...</string>
<string name="title_share_file">Compartir archivo con...</string>
@@ -30,33 +29,34 @@
<string name="title_help">Ayuda</string>
<string name="title_log_display">Registro (log)</string>
<string name="title_exchange_keys">Intercambiar claves</string>
- <string name="title_advanced_key_info">Información avanzada de clave</string>
+ <string name="title_advanced_key_info">Información extendida</string>
<string name="title_delete_secret_key">¿Borrar clave \'%s\'?</string>
<string name="title_export_log">Exportar registro (log)</string>
<string name="title_manage_my_keys">Administrar mis claves</string>
<!--section-->
<string name="section_user_ids">Identificaciones</string>
+ <string name="section_yubikey">YubiKey</string>
<string name="section_linked_system_contact">Contacto de sistema enlazado</string>
<string name="section_should_you_trust">¿Debe confiar en esta clave?</string>
<string name="section_proof_details">Comprobante de verificación</string>
<string name="section_cloud_evidence">Comprobantes desde la nube</string>
<string name="section_keys">Subclaves</string>
<string name="section_cloud_search">Búsqueda en la nube</string>
- <string name="section_passphrase_cache">Caché de frase-contraseña</string>
+ <string name="section_passphrase_cache">Manejo de contraseña/PIN</string>
<string name="section_certify">Confirmar</string>
<string name="section_actions">Acciones</string>
<string name="section_share_key">Clave</string>
<string name="section_key_server">Servidor de claves</string>
<string name="section_fingerprint">Huella digital</string>
<string name="section_encrypt">Encriptar</string>
- <string name="section_decrypt">Desencriptar</string>
+ <string name="section_decrypt">Descifrar / Verificar</string>
<string name="section_current_expiry">Caducidad actual</string>
<string name="section_new_expiry">Nueva caducidad</string>
<!--button-->
<string name="btn_decrypt_verify_file">Desencriptar, verificar, y guardar fichero</string>
<string name="btn_encrypt_share_file">Encriptar y compartir fichero</string>
<string name="btn_encrypt_save_file">Encriptar y guardar fichero</string>
- <string name="btn_save">Guardar</string>
+ <string name="btn_view_log">Ver registro (log)</string>
<string name="btn_do_not_save">Cancelar</string>
<string name="btn_delete">Eliminar</string>
<string name="btn_no_date">No caduca</string>
@@ -71,13 +71,17 @@
<string name="btn_view_cert_key">Ver clave de verificación</string>
<string name="btn_create_key">Crear clave</string>
<string name="btn_add_files">Añadir archivo(s)</string>
- <string name="btn_add_share_decrypted_text">Compartir texto desencriptado</string>
- <string name="btn_decrypt_clipboard">Descifrar texto desde el portapapeles</string>
- <string name="btn_decrypt_and_verify">y verificar firmas</string>
- <string name="btn_decrypt_files">Desencriptar ficheros</string>
+ <string name="btn_share_decrypted_text">Compartir texto descifrado</string>
+ <string name="btn_copy_decrypted_text">Copiar texto descifrado</string>
+ <string name="btn_decrypt_clipboard">Leer del portapapeles</string>
+ <string name="btn_decrypt_files">Seleccionar fichero de entrada</string>
<string name="btn_encrypt_files">Encriptar ficheros</string>
<string name="btn_encrypt_text">Encriptar texto</string>
<string name="btn_add_email">Añadir dirección de correo electrónico adicional</string>
+ <string name="btn_unlock">Desbloquear</string>
+ <string name="btn_add_keyserver">Añadir</string>
+ <string name="btn_save_default">Guardar como predeterminado</string>
+ <string name="btn_saved">¡Guardado!</string>
<!--menu-->
<string name="menu_preferences">Ajustes</string>
<string name="menu_help">Ayuda</string>
@@ -91,7 +95,7 @@
<string name="menu_select_all">Seleccionar todo</string>
<string name="menu_export_all_keys">Exportar todas las claves</string>
<string name="menu_update_all_keys">Actualizar todas las claves</string>
- <string name="menu_advanced">Mostrar información avanzada</string>
+ <string name="menu_advanced">Información extendida</string>
<string name="menu_certify_fingerprint">Confirmar mediante comparación de la huella digital</string>
<string name="menu_export_log">Exportar registro</string>
<!--label-->
@@ -99,11 +103,11 @@
<string name="label_file">Archivo</string>
<string name="label_files">Archivo(s)</string>
<string name="label_file_colon">Archivo:</string>
- <string name="label_no_passphrase">No hay frase de contraseña</string>
- <string name="label_passphrase">Frase de contraseña</string>
+ <string name="label_no_passphrase">Sin contraseña</string>
+ <string name="label_passphrase">Contraseña</string>
<string name="label_unlock">Desbloqueando...</string>
- <string name="label_passphrase_again">Repetir frase-contraseña</string>
- <string name="label_show_passphrase">Mostrar frase-contraseña</string>
+ <string name="label_passphrase_again">Repetir contraseña</string>
+ <string name="label_show_passphrase">Mostrar contraseña</string>
<string name="label_algorithm">Algoritmo</string>
<string name="label_ascii_armor">Armadura ASCII del fichero</string>
<string name="label_file_ascii_armor">Habilitar armadura ASCII</string>
@@ -118,13 +122,14 @@
<string name="label_delete_after_decryption">Eliminar fichero después del descifrado</string>
<string name="label_encryption_algorithm">Algoritmo de cifrado</string>
<string name="label_hash_algorithm">Algoritmo de identificación criptográfica (hash)</string>
- <string name="label_symmetric">Cifrar con frase-contraseña</string>
- <string name="label_passphrase_cache_ttl">Duración en caché</string>
- <string name="label_passphrase_cache_subs">Almacenar en caché frases-contraseña por subclave</string>
+ <string name="label_symmetric">Cifrar con contraseña</string>
+ <string name="label_passphrase_cache_ttl">Recordar hora</string>
+ <string name="label_passphrase_cache_subs">Recordar contraseñas por subclave</string>
<string name="label_message_compression">Compresión de texto</string>
<string name="label_file_compression">Compresión del fichero</string>
- <string name="label_keyservers">Servidores de claves</string>
+ <string name="label_keyservers">Seleccione servidores de claves OpenPGP</string>
<string name="label_key_id">ID de clave</string>
+ <string name="label_key_created">Clave creada el %s</string>
<string name="label_creation">Creación</string>
<string name="label_expiry">Caducidad</string>
<string name="label_usage">Uso</string>
@@ -142,10 +147,12 @@
<string name="label_enable_compression">Habilitar compresión</string>
<string name="label_encrypt_filenames">Cifrar nombres de ficheros</string>
<string name="label_hidden_recipients">Ocultar receptores</string>
- <string name="pref_keyserver">Buscar en servidor de claves</string>
- <string name="pref_keyserver_summary">Buscar en servidor de claves HKP</string>
- <string name="pref_keybase">Buscar en Keybase.io</string>
- <string name="pref_keybase_summary">Buscar en el índice de Keybase.io</string>
+ <string name="label_verify_keyserver">Verificar servidor de claves</string>
+ <string name="label_enter_keyserver_url">Introduzca URL de servidor de claves</string>
+ <string name="pref_keyserver">Servidores de claves OpenPGP</string>
+ <string name="pref_keyserver_summary">Busca claves en los servidores de claves OpenPGP seleccionados (protocolo HKP)</string>
+ <string name="pref_keybase">keybase.io</string>
+ <string name="pref_keybase_summary">Busca claves en keybase.io</string>
<string name="user_id_no_name">&lt;sin nombre&gt;</string>
<string name="none">&lt;ninguna&gt;</string>
<plurals name="n_keys">
@@ -185,23 +192,23 @@
<string name="flag_encrypt">Cifrar</string>
<string name="flag_authenticate">Autentificar</string>
<!--sentences-->
- <string name="wrong_passphrase">Frase de contraseña incorrecta.</string>
+ <string name="wrong_passphrase">Contraseña incorrecta.</string>
<string name="no_filemanager_installed">No hay un gestor de archivos compatible instalado.</string>
- <string name="passphrases_do_not_match">Las frases de contraseña no coinciden.</string>
- <string name="passphrase_must_not_be_empty">Por favor, introduce una frase de contraseña.</string>
+ <string name="passphrases_do_not_match">Las contraseñas no coincidieron.</string>
+ <string name="passphrase_must_not_be_empty">Introduzca una contraseña.</string>
<string name="passphrase_for_symmetric_encryption">Cifrado simétrico.</string>
- <string name="passphrase_for">Introducir la frase de contraseña para \'%s\'</string>
+ <string name="passphrase_for">Introduzca contraseña para \'%s\'</string>
<string name="pin_for">Introduzca el PIN para \'%s\'</string>
<string name="yubikey_pin_for">Introduzca el PIN para acceder a la YubiKey para \'%s\'</string>
<string name="nfc_text">Sostenga la YubiKey contra el reverso de su dispositivo.</string>
<string name="file_delete_confirmation_title">¿Borrar ficheros originales?</string>
<string name="file_delete_confirmation">Los siguientes ficheros se borrarán:%s</string>
<string name="file_delete_successful">%1$d de %2$d ficheros han sido borrados.%3$s</string>
- <string name="no_file_selected">Selecciona un archivo antes.</string>
+ <string name="no_file_selected">Ningún fichero seleccionado.</string>
<string name="encrypt_sign_successful">Firmado y/o cifrado con éxito.</string>
<string name="encrypt_sign_clipboard_successful">Firmado y/o cifrado del portapapeles con éxito.</string>
<string name="select_encryption_key">Selecciona al menos una clave de cifrado.</string>
- <string name="error_no_encryption_or_signature_key">Selecciona al menos una clave de cifrado o de firma.</string>
+ <string name="error_no_encryption_or_signature_key">Seleccionar al menos una clave de cifrado o una clave de firma.</string>
<string name="specify_file_to_encrypt_to">Por favor especifique hacia qué fichero cifrar.\nADVERTENCIA: ¡El fichero se sobreescribirá si existe!</string>
<string name="specify_file_to_decrypt_to">Por favor especifique hacia qué fichero descifrar.\nADVERTENCIA: ¡El fichero se sobreescribirá si existe!</string>
<string name="specify_file_to_export_to">Por favor especifique hacia qué fichero exportar.\nADVERTENCIA: ¡El fichero se sobreescribirá si existe!</string>
@@ -237,34 +244,36 @@
<string name="error_external_storage_not_ready">el almacenamiento externo no está preparado</string>
<string name="error_key_size_minimum512bit">el tamaño de clave debe ser de al menos 512bit</string>
<string name="error_unknown_algorithm_choice">elegido algoritmo desconocido</string>
- <string name="error_user_id_no_email">no se ha encontrado un email</string>
+ <string name="error_user_id_no_email">no se encontró ninguna dirección de correo</string>
<string name="error_key_needs_a_user_id">necesita al menos una identificación</string>
- <string name="error_no_signature_passphrase">no has proporcionado una frase de contraseña</string>
+ <string name="error_no_signature_passphrase">no se estableció contraseña.</string>
<string name="error_no_signature_key">no has proporcionado una clave de firma</string>
<string name="error_invalid_data">¡No es un contenido cifrado o firmado con OpenPGP válido!</string>
<string name="error_integrity_check_failed">¡ha fallado la comprobación de integridad! ¡Los datos han sido modificados!</string>
- <string name="error_wrong_passphrase">frase de contraseña incorrecta</string>
+ <string name="error_wrong_passphrase">contraseña incorrecta</string>
<string name="error_could_not_extract_private_key">no se puede extraer la clave privada</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">¡Necesita Android 4.1 para usar la característica NFC Beam (haz NFC) de Android!</string>
<string name="error_nfc_needed">¡NFC ha de estar habilitado!</string>
<string name="error_beam_needed">¡Beam ha de estar habilitado!</string>
<string name="error_nothing_import">¡No se encontraron claves!</string>
+ <string name="error_nothing_import_selected">¡No se seleccionaron claves a importar!</string>
<string name="error_contacts_key_id_missing">¡Fallo al obtener clave de identificación desde los contactos!</string>
<string name="error_generic_report_bug">Ha ocurrido un error genérico, por favor, informa de este bug a OpenKeychain</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">No firmado</string>
<string name="decrypt_result_invalid_signature">¡Firma no válida!</string>
- <string name="decrypt_result_signature_uncertified">Firmado por (¡no certificada!)</string>
- <string name="decrypt_result_signature_certified">Firmado por</string>
- <string name="decrypt_result_signature_expired_key">¡La clave ha caducado!</string>
- <string name="decrypt_result_signature_revoked_key">¡La clave ha sido revocada!</string>
- <string name="decrypt_result_signature_missing_key">Clave pública desconocida</string>
+ <string name="decrypt_result_signature_uncertified">Firmado por clave <b>no confirmada</b></string>
+ <string name="decrypt_result_signature_secret">Firmado por la clave de usted</string>
+ <string name="decrypt_result_signature_certified">Firmado por clave confirmada</string>
+ <string name="decrypt_result_signature_expired_key">¡Firmado por clave <b>caducada</b>!</string>
+ <string name="decrypt_result_signature_revoked_key">¡Firmado por clave <b>revocada</b>!</string>
+ <string name="decrypt_result_signature_missing_key">Firmado por <b>clave pública desconocida</b></string>
<string name="decrypt_result_encrypted">Cifrado</string>
<string name="decrypt_result_not_encrypted">No cifrado</string>
<string name="decrypt_result_action_show">Mostrar</string>
<string name="decrypt_result_action_Lookup">Buscar</string>
- <string name="decrypt_invalid_text">O bien la firma no es válida, o la clave ha sido revocada o ha caducado. No puede estar seguro de quién escribió el texto. ¿Aún quiere mostrarlo?</string>
+ <string name="decrypt_invalid_text">O bien la firma no es válida o la clave ha sido revocada. No puede estar seguro de quién escribió el texto. ¿Quiere aún mostrarlo?</string>
<string name="decrypt_invalid_button">Comprendo los riesgos, ¡muéstralo!</string>
<!--Add keys-->
<string name="add_keys_my_key">Mi clave:</string>
@@ -294,11 +303,12 @@
<string name="progress_modify_subkeyrevoke">revocando subclaves...</string>
<string name="progress_modify_subkeystrip">desnudando claves...</string>
<string name="progress_modify_subkeyadd">añadiendo subclaves...</string>
- <string name="progress_modify_passphrase">cambiando frase-contraseña...</string>
+ <string name="progress_modify_passphrase">cambiando contraseña...</string>
<plurals name="progress_exporting_key">
<item quantity="one">exportando clave...</item>
<item quantity="other">exportando claves...</item>
</plurals>
+ <string name="progress_start">preparando operación...</string>
<string name="progress_extracting_signature_key">extrayendo la clave de firma...</string>
<string name="progress_extracting_key">extrayendo la clave...</string>
<string name="progress_preparing_streams">preparando las transmisiones...</string>
@@ -318,6 +328,7 @@
<string name="progress_deleting">borrando claves...</string>
<string name="progress_con_saving">consolidación: guardando en caché...</string>
<string name="progress_con_reimport">consolidación: reimportando</string>
+ <string name="progress_verifying_keyserver_url">verificando servidor de claves...</string>
<!--action strings-->
<string name="hint_cloud_search_hint">Buscar mediante Nombre, Correo electrónico...</string>
<!--key bit length selections-->
@@ -359,9 +370,12 @@
<string name="import_tab_qr_code">Código QR/NFC</string>
<string name="import_import">Importar las claves seleccionadas</string>
<string name="import_qr_code_wrong">¡El código QR está deformado! ¡Por favor, prueba de nuevo!</string>
- <string name="import_qr_code_too_short_fingerprint">La huella de validación (fingerprint) de clave es demasiado corta (&lt; 16 caracteres)</string>
+ <string name="import_qr_code_fp">¡La huella de validación (fingerprint) está malformada o es demasiado corta!</string>
+ <string name="import_qr_code_too_short_fingerprint">¡La huella de validación (fingerprint) es demasiado corta!</string>
<string name="import_qr_code_button">Escanear código QR</string>
<string name="import_qr_code_text">¡Sitúe su cámara sobre el código QR!</string>
+ <!--Import from URL-->
+ <string name="import_url_warn_no_search_parameter">No se definió consulta de búsqueda. Aún puede buscar manualmente en este servidor de claves.</string>
<!--Generic result toast-->
<string name="snackbar_details">Detalles</string>
<string name="with_warnings">, con advertencias</string>
@@ -431,10 +445,10 @@
<string name="intent_send_encrypt">Cifrar con OpenKeychain</string>
<string name="intent_send_decrypt">Descifrar con OpenKeychain</string>
<!--Remote API-->
- <string name="api_settings_show_info">Mostrar información avanzada</string>
- <string name="api_settings_hide_info">Ocultar información avanzada</string>
- <string name="api_settings_show_advanced">Mostrar la configuración avanzada</string>
- <string name="api_settings_hide_advanced">Ocultar la configuración avanzada</string>
+ <string name="api_settings_show_info">Mostrar información extendida</string>
+ <string name="api_settings_hide_info">Ocultar información extendida</string>
+ <string name="api_settings_show_advanced">Mostrar configuración extendida</string>
+ <string name="api_settings_hide_advanced">Ocultar configuración extendida</string>
<string name="api_settings_no_key">No se ha seleccionado ninguna clave</string>
<string name="api_settings_select_key">Seleccionar clave</string>
<string name="api_settings_create_key">Crear nueva clave</string>
@@ -446,8 +460,8 @@
<string name="api_settings_delete_account">Borrar cuenta</string>
<string name="api_settings_package_name">Nombre de paquete</string>
<string name="api_settings_package_signature">SHA-256 de firma de paquete</string>
- <string name="api_settings_accounts">Cuentas (API desechada)</string>
- <string name="api_settings_advanced">Información avanzada</string>
+ <string name="api_settings_accounts">Cuentas (API antigua)</string>
+ <string name="api_settings_advanced">Información extendida</string>
<string name="api_settings_allowed_keys">Claves permitidas</string>
<string name="api_settings_settings">Configuración</string>
<string name="api_settings_key">Clave de la cuenta:</string>
@@ -464,6 +478,7 @@
<string name="api_select_pub_keys_text_no_user_ids">¡Por favor seleccione los receptores!</string>
<string name="api_error_wrong_signature">¡La comprobación de la firma ha fallado! ¿Has instalado esta app desde una fuente distinta? Si estás seguro de que esto no es un ataque, revoca el registro de esta app en OpenKeychain y regístrala de nuevo.</string>
<string name="api_select_sign_key_text">Por favor, seleccione una de sus claves existentes o cree una nueva.</string>
+ <string name="api_select_keys_text">Ninguna de las claves permitidas puede descifrar el contenido. Por favor, seleccione las claves permitidas.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Compartir con código QR</string>
<string name="share_nfc_dialog">Compartir con NFC</string>
@@ -538,7 +553,7 @@
<string name="keybase_reddit_attribution">atribuido por Reddit a</string>
<string name="keybase_verify">Verificar</string>
<!--Edit key-->
- <string name="edit_key_action_change_passphrase">Cambiar frase-contraseña</string>
+ <string name="edit_key_action_change_passphrase">Cambiar contraseña</string>
<string name="edit_key_action_add_identity">Añadir identificación</string>
<string name="edit_key_action_add_subkey">Añadir subclave</string>
<string name="edit_key_edit_user_id_title">¡Seleccione una acción!</string>
@@ -552,31 +567,35 @@
<string name="edit_key_edit_user_id_revoked">Esta identificación se ha revocado. Esto no puede deshacerse.</string>
<string name="edit_key_edit_subkey_title">¡Seleccione una acción!</string>
<string-array name="edit_key_edit_subkey">
- <item>Cambiar expiración</item>
+ <item>Cambiar caducidad</item>
<item>Revocar subclave</item>
<item>Desnudar subclave</item>
- <item>"Move Subkey to Yubikey / Smart Card"</item>
+ <item>Mover subclave a la Yubikey / Tarjeta inteligente</item>
</string-array>
<string name="edit_key_new_subkey">nueva subclave</string>
<string name="edit_key_select_flag">¡Por favor, seleccione al menos un indicador!</string>
<string name="edit_key_error_add_identity">¡Añadir al menos una identificación!</string>
<string name="edit_key_error_add_subkey">¡Añadir al menos una subclave!</string>
+ <string name="edit_key_error_bad_nfc_algo">¡Algoritmo no soportado por la tarjeta inteligente!</string>
+ <string name="edit_key_error_bad_nfc_size">¡El tamaño de la clave no está soportado por la tarjeta inteligente!</string>
+ <string name="edit_key_error_bad_nfc_stripped">¡No se puede mover la clave a la tarjeta inteligente (tanto desnuda como \'derivar-a-tarjeta\')!</string>
<!--Create key-->
<string name="create_key_upload">Sincronizar con la nube</string>
<string name="create_key_empty">Este campo es obligatorio</string>
- <string name="create_key_passphrases_not_equal">Las frases-contraseña no coinciden</string>
+ <string name="create_key_passphrases_not_equal">Las contraseñas no coinciden</string>
<string name="create_key_final_text">Ha introducido la siguiente identificación:</string>
<string name="create_key_final_robot_text">Crear una clave puede llevar un tiempo, tómese una taza de café entre tanto...</string>
<string name="create_key_rsa">(3 subclaves, RSA, 4096 bits)</string>
<string name="create_key_custom">(configuración de clave personalizada)</string>
<string name="create_key_name_text">Elija un nombre asociado con esta clave. Este puede ser un nombre completo, ej. \'Juan Nadie\', o un apodo, ej. \'Juanito\'.</string>
<string name="create_key_email_text">Introduzca su dirección principal de correo electrónico para comunicación segura.</string>
- <string name="create_key_passphrase_text">Elija una frase-contraseña robusta. Protege su clave cuando su dispositivo es robado.</string>
+ <string name="create_key_passphrase_text">Escoja una contraseña robusta. Protegerá su clave si su dispositivo es robado.</string>
<string name="create_key_hint_full_name">Nombre completo o apodo</string>
<string name="create_key_edit">Cambiar configuración de clave</string>
<string name="create_key_add_email">Añadir dirección de correo electrónico</string>
<string name="create_key_add_email_text">Las direcciones adicionales de correo electrónico también están asociadas a esta clave y pueden utilizarse para asegurar la comunicación.</string>
- <string name="create_key_email_already_exists_text">Ya se ha añadido el correo electrónico</string>
+ <string name="create_key_email_already_exists_text">Esta dirección de correo electrónico ya fue añadida</string>
+ <string name="create_key_email_invalid_email">El formato de la dirección de correo no es válido</string>
<!--View key-->
<string name="view_key_revoked">Revocada: ¡La clave no debe volver a ser usada!</string>
<string name="view_key_expired">Caducada: ¡El contacto necesita extender la vigencia de la clave!</string>
@@ -585,6 +604,12 @@
<string name="view_key_verified">Clave confirmada</string>
<string name="view_key_unverified">No confirmada: ¡Escanee el código QR para confirmar clave!</string>
<string name="view_key_fragment_no_system_contact">&lt;ninguno&gt;</string>
+ <!--Add keyserver-->
+ <string name="add_keyserver_dialog_title">Añadir servidor de claves</string>
+ <string name="add_keyserver_verified">¡Servidor de claves verificado!</string>
+ <string name="add_keyserver_without_verification">Servidor de claves añadido sin verificación</string>
+ <string name="add_keyserver_invalid_url">¡URL no válida!</string>
+ <string name="add_keyserver_connection_failed">Fallo al conectar al servidor de claves. Por favor, compuebe la URL y su conexión a Internet.</string>
<!--Navigation Drawer-->
<string name="nav_keys">Claves</string>
<string name="nav_encrypt_decrypt">Cifrar/Descifrar</string>
@@ -712,10 +737,10 @@
<string name="msg_is_pubring_generate">Generando un juego de claves públicas desde el juego de claves secretas (privadas)</string>
<string name="msg_is_subkey_nonexistent">La subclave %s no está disponible en la clave secreta (privada)</string>
<string name="msg_is_subkey_ok">Subclave secreta (privada) %s marcada como disponible</string>
- <string name="msg_is_subkey_empty">Subclave secreta (privada) %s marcada como disponible, con frase-contraseña vacía</string>
+ <string name="msg_is_subkey_empty">Subclave secreta %s marcada como disponible, con contraseña vacía</string>
<string name="msg_is_subkey_pin">Subclave secreta %s marcada como disponible, con PIN</string>
<string name="msg_is_subkey_stripped">Subclave secreta (privada) %s marcada como desnuda</string>
- <string name="msg_is_subkey_divert">Se marcó la subclave secreta (privada) %s como \'desviar a smartcard/NFC\'</string>
+ <string name="msg_is_subkey_divert">Se marcó la subclave sercreta (privada) %s como \'derivar-a-tarjeta\'</string>
<string name="msg_is_success_identical">El juego de claves no contiene nuevos datos, no hay nada que hacer</string>
<string name="msg_is_success">Juego de claves secretas (privadas) importado con éxito</string>
<!--Keyring Canonicalization log entries-->
@@ -742,6 +767,7 @@
<string name="msg_kc_sub_bad_local">Eliminando certificado de vinculación de subclave con distintivo \'local\'</string>
<string name="msg_kc_sub_bad_keyid">La identificación del publicante de la vinculación de subclave no coincide</string>
<string name="msg_kc_sub_bad_time">Eliminando certificado de vinculación de subclave, con marca de tiempo futura</string>
+ <string name="msg_kc_sub_bad_time_early">¡El certificado de acoplamiento de subclave tiene una marca de tiempo anterior a su clave!</string>
<string name="msg_kc_sub_bad_type">Tipo de certificado de subclave desconocido: %s</string>
<string name="msg_kc_sub_dup">Eliminando certificado redundante de vinculación de subclave</string>
<string name="msg_kc_sub_primary_bad">Eliminando certificado de vinculación de subclave debido a un certificado de vinculación principal no vigente</string>
@@ -818,7 +844,8 @@
<string name="msg_cr_error_flags_ecdh">¡Seleccionados indicativos de clave defectuosa, ECDH no puede usarse para firmado!</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Modificando el juego de claves %s</string>
- <string name="msg_mf_error_divert_serial">¡El número de serie de una clave con indicativo desviar-a-tarjeta debe ser de 16 bytes! ¡Esto es un error de programación, por favor consigne un informe de error!</string>
+ <string name="msg_mf_divert">Derivará a la tarjeta inteligente para operaciones de criptografía</string>
+ <string name="msg_mf_error_divert_serial">¡El número de serie de una clave \'derivar-a-tarjeta\' ha de tener 16 bytes! Esto es un error de programación, por favor, ¡consigne un infome de fallo!</string>
<string name="msg_mf_error_encode">¡Excepción en la codificación!</string>
<string name="msg_mf_error_fingerprint">¡La actual huella de validación de clave no coincide con la esperada!</string>
<string name="msg_mf_error_keyid">No hay identificación de clave. Esto es un error interno, por favor ¡consigne un informe de error!</string>
@@ -826,28 +853,37 @@
<string name="msg_mf_error_master_none">¡No se encontró certificado maestro sobre el que operar! (¿Todos revocados?)</string>
<string name="msg_mf_error_noexist_primary">¡Se especificó una identificación de usuario principal errónea!</string>
<string name="msg_mf_error_noexist_revoke">¡Se especificó una identificación de usuario errónea para revocación!</string>
- <string name="msg_mf_error_restricted">¡Se intentó efectuar una operación restringida sin frase-contraseña! ¡Este es un error de programación, por favor consigne un informe de error!</string>
+ <string name="msg_mf_error_restricted">¡Se intentó ejecutar una operación restringida sin contraseña! Este es un error de programación, por favor, ¡consigne un informe de fallo!</string>
<string name="msg_mf_error_revoked_primary">¡Las identificaciones de usuario revocadas no pueden ser las principales!</string>
<string name="msg_mf_error_null_expiry">El periodo hasta la expiración no puede ser \"el mismo que antes\" al crear subclave. Esto es un error de programación, por favor ¡rellene un informe de fallo!</string>
+ <string name="msg_mf_error_noop">¡No hay nada que hacer!</string>
<string name="msg_mf_error_passphrase_master">¡Error fatal descrifrando la clave maestra! Probablemente esto se daba a un error de programación, por favor ¡rellene un informe de fallo!</string>
<string name="msg_mf_error_pgp">¡Error OpenPGP interno!</string>
<string name="msg_mf_error_sig">¡Excepción con la firma!</string>
+ <string name="msg_mf_error_subkey_missing">¡Se intentó operar sobre una subclave desaparecida %s!</string>
+ <string name="msg_mf_error_conflicting_nfc_commands">No se puede mover la clave a la tarjeta inteligente en la misma operación que crea una firma en la tarjeta.</string>
+ <string name="msg_mf_error_duplicate_keytocard_for_slot">La tarjeta inteligente sólo soporta un lector por cada tipo de clave.</string>
+ <string name="msg_mf_error_invalid_flags_for_keytocard">Indicadores de clave inapropiados para la clave de la tarjeta inteligente.</string>
<string name="msg_mf_master">Modificando certificaciones maestras</string>
<string name="msg_mf_notation_empty">Añadiendo paquete de notación vacío</string>
<string name="msg_mf_notation_pin">Añadiendo paquete de notación de PIN</string>
- <string name="msg_mf_passphrase">Cambiando la frase-contraseña para el juego de claves</string>
- <string name="msg_mf_passphrase_key">Re-cifrando subclave %s con nueva frase-contraseña</string>
- <string name="msg_mf_passphrase_empty_retry">Fallo al establecer nueva frase-contraseña, intentándolo de nuevo con una antigua frase-contraseña vacía</string>
- <string name="msg_mf_passphrase_fail">¡La frase contraseña para la subclave no pudo cambiarse! (¿Tiene la subclave una diferente de la de las otras claves?)</string>
+ <string name="msg_mf_passphrase">Cambiando contraseña para el juego de claves</string>
+ <string name="msg_mf_passphrase_key">Re-cifrando subclave %s con la nueva contraseña</string>
+ <string name="msg_mf_passphrase_empty_retry">El establecimiento de la nueva contraseña falló, volviéndolo a intentar con una contraseña antigua vacía.</string>
+ <string name="msg_mf_passphrase_fail">¡La contraseña para la subclave no se pudo cambiar! (¿Tiene una contraseña diferente a la del resto de las claves?)</string>
<string name="msg_mf_primary_replace_old">Reemplazando certificado de la identificación de usuario principal anterior</string>
<string name="msg_mf_primary_new">Generando nuevo certificado para nueva identificación de usuario primaria</string>
+ <string name="msg_mf_restricted_mode">Cambiando al modo de operación restringido</string>
<string name="msg_mf_subkey_change">Modificando subclave %s</string>
- <string name="msg_mf_error_subkey_missing">¡Se intentó operar sobre una subclave desaparecida %s!</string>
+ <string name="msg_mf_require_divert">Derivando a la tarjeta inteligente para operaciones de criptografía</string>
+ <string name="msg_mf_require_passphrase">Contraseña requerida para operaciones</string>
<string name="msg_mf_subkey_new">Añadiendo nueva subclave de tipo %s</string>
<string name="msg_mf_subkey_new_id">Nueva identificación de subclave: %s</string>
<string name="msg_mf_error_past_expiry">¡La fecha de expiración no puede ser del pasado!</string>
<string name="msg_mf_subkey_revoke">Revocando subclave %s</string>
<string name="msg_mf_subkey_strip">Desnudando subclave %s</string>
+ <string name="msg_mf_keytocard_start">Moviendo subclave %s a la tarjeta inteligente</string>
+ <string name="msg_mf_keytocard_finish">Se movió %1$s a la tarjeta inteligente %2$s</string>
<string name="msg_mf_success">Juego de claves modificado con éxito</string>
<string name="msg_mf_uid_add">Añadiendo identificación de usuario %s</string>
<string name="msg_mf_uid_primary">Cambiando identificación de usuario primaria a %s</string>
@@ -892,19 +928,20 @@
<string name="msg_con_warn_delete_secret">Excepción al borrar fichero de caché de claves secretas (privadas)</string>
<!--Edit Key (higher level than modify)-->
<string name="msg_ed">Realizando operación en la clave</string>
- <string name="msg_ed_caching_new">Guardar en caché nueva frase-contraseña</string>
+ <string name="msg_ed_caching_new">Guardando en caché la nueva contraseña</string>
<string name="msg_ed_error_no_parcel">¡SaveKeyringParcel ausente! (esto es un fallo, por favor notifíquelo)</string>
<string name="msg_ed_error_key_not_found">¡Clave no encontrada!</string>
<string name="msg_ed_fetching">Descargando clave a modificar (%s)</string>
<string name="msg_ed_success">Operación en la clave completada</string>
<!--Promote key-->
- <string name="msg_pr">Promover clave pública a clave secreta (privada)</string>
- <string name="msg_pr_error_already_secret">¡La clave ya es una clave secreta (privada)!</string>
+ <string name="msg_pr">Promocionar clave pública a clave secreta (privada)</string>
+ <string name="msg_pr_all">Promocionando todas las subclaves</string>
<string name="msg_pr_error_key_not_found">¡Clave no encontrada!</string>
<string name="msg_pr_fetching">Descargar clave para modificar (%s)</string>
- <string name="msg_pr_success">La clave se promovió con éxito</string>
+ <string name="msg_pr_subkey_match">Promocionar la subclave: %s</string>
+ <string name="msg_pr_subkey_nomatch">La subclave no está en la Yubikey: %s</string>
+ <string name="msg_pr_success">La clave se promocionó con éxito</string>
<!--Other messages used in OperationLogs-->
- <string name="msg_ek_error_divert">¡La edición de claves NFC (aún) no está soportada!</string>
<string name="msg_ek_error_dummy">¡No se pudo editar el juego de claves (keyring) con la clave maestra desnuda!</string>
<string name="msg_ek_error_not_found">¡Clave no encontrada!</string>
<!--Messages for DecryptVerify operation-->
@@ -925,11 +962,12 @@
<string name="msg_dc_clear_signature_ok">Comprobación de firma CORRECTA</string>
<string name="msg_dc_clear_signature">Guardando datos de firma para más tarde</string>
<string name="msg_dc_clear">Procesando datos de texto no cifrado (`cleartext`)</string>
- <string name="msg_dc_error_bad_passphrase">Error al desbloquear clave, ¡frase-contraseña errónea!</string>
+ <string name="msg_dc_error_bad_passphrase">Error desbloqueando clave, ¡contraseña incorrecta!</string>
+ <string name="msg_dc_error_corrupt_data">¡Los datos están corruptos!</string>
<string name="msg_dc_error_extract_key">¡Error desconocido al desbloquear clave!</string>
<string name="msg_dc_error_integrity_check">¡Error de comprobación de integridad!</string>
<string name="msg_dc_error_integrity_missing">¡Verificación de integridad ausente! Esto puede ocurrir porque la aplicación de cifrado no está actualizada, o debido a un ataque desactualización.</string>
- <string name="msg_dc_error_invalid_data">¡No se encontraron datos de firma válidos!</string>
+ <string name="msg_dc_error_invalid_data">¡No se encontraron datos firmados o cifrados con OpenPGP válidos!</string>
<string name="msg_dc_error_io">¡Se encontró Excepción de E/S durante la operación!</string>
<string name="msg_dc_error_no_data">¡No se encontraron datos cifrados en el flujo de datos (`stream`)!</string>
<string name="msg_dc_error_no_key">¡No se encontraron datos cifrados con clave secreta (privada) conocida en el flujo de datos (`stream`)!</string>
@@ -937,9 +975,9 @@
<string name="msg_dc_integrity_check_ok">¡Comprobación de integridad CORRECTA!</string>
<string name="msg_dc_ok_meta_only">Sólo fueron solicitados los metadatos, omitiendo descifrado</string>
<string name="msg_dc_ok">Descifrado/Verificación finalizado</string>
- <string name="msg_dc_pass_cached">Usando frase-contraseña desde caché</string>
+ <string name="msg_dc_pass_cached">Usando contraseña desde la caché</string>
<string name="msg_dc_pending_nfc">Se requiere credencial NFC, solicitando su introducción por el usuario...</string>
- <string name="msg_dc_pending_passphrase">Se requiere frase-contraseña, solicitando su introducción por el usuario...</string>
+ <string name="msg_dc_pending_passphrase">Contraseña requerida, solicitando su introducción al usuario...</string>
<string name="msg_dc_prep_streams">Preparando flujos de datos (`streams`) para descifrado</string>
<string name="msg_dc">Comenzando la operación de descifrado...</string>
<string name="msg_dc_sym_skip">Datos simétricos no permitidos, omitiendo...</string>
@@ -969,20 +1007,19 @@
<string name="msg_se_error_input_uri_not_found">¡Error al abrir URI para lectura!</string>
<string name="msg_se_error_output_uri_not_found">¡Error al abrir URI para escritura!</string>
<string name="msg_se_error_too_many_inputs">¡Se especificaron más entradas que salidas! Probablemente esto es un error de programación, ¡por favor informe!</string>
- <string name="msg_se_warn_output_left">Se dejaron las salidas pero no las entradas. Probablemente esto es un error de programación, ¡por favor informe!</string>
<string name="msg_se_success">Operación de firmado/cifrado completada</string>
<!--Messages for PgpSignEncrypt operation-->
<string name="msg_pse_asymmetric">Preparando claves públicas para cifrado</string>
<string name="msg_pse_clearsign_only">¡El fimado de texto sin cifrar (cleartext) no está soportado!</string>
<string name="msg_pse_compressing">Preparando compresión</string>
<string name="msg_pse_encrypting">Cifrando datos</string>
- <string name="msg_pse_error_bad_passphrase">¡Frase-contraseña errónea!</string>
+ <string name="msg_pse_error_bad_passphrase">¡Contraseña incorrecta!</string>
<string name="msg_pse_error_hash_algo">¡El algoritmo de identificación criptográfica (hash) solicitado no está soportado por esta clave!</string>
<string name="msg_pse_error_io">¡Se encontró una excepción de E/S durante la operación!</string>
<string name="msg_pse_error_key_sign">¡La clave de firmado seleccionada no puede firmar datos!</string>
<string name="msg_pse_error_sign_key">¡Error al descargar clave de firmado!</string>
<string name="msg_pse_error_nfc">¡Error de datos NFC!</string>
- <string name="msg_pse_error_no_passphrase">¡No se proporcionó frase-contraseña!</string>
+ <string name="msg_pse_error_no_passphrase">¡No se proporcionó contraseña!</string>
<string name="msg_pse_error_pgp">¡Error interno de OpenPGP!</string>
<string name="msg_pse_error_sig">¡Se encontró una excepción de firma OpenPGP!</string>
<string name="msg_pse_error_unlock">¡Error desconocido al desbloquear clave!</string>
@@ -991,7 +1028,7 @@
<string name="msg_pse_key_warn">Clave para cifrado errónea: %s</string>
<string name="msg_pse_ok">¡Operación de firmado/cifrado completada!</string>
<string name="msg_pse_pending_nfc">Se requiere credencial NFC, solicitando su introducción al usuario...</string>
- <string name="msg_pse_pending_passphrase">Se requiere frase-contraseña, solicitando su introducción al usuario.</string>
+ <string name="msg_pse_pending_passphrase">Contraseña requerida, solicitando su introducción al usuario...</string>
<string name="msg_pse_signing">Firmando datos (sin cifrado)</string>
<string name="msg_pse_signing_cleartext">Creando firma de texto sin cifrar (cleartext)</string>
<string name="msg_pse_signing_detached">Creando firma desacoplada</string>
@@ -1011,9 +1048,9 @@
<string name="msg_crt_error_master_not_found">¡Clave maestra no encontrada!</string>
<string name="msg_crt_error_nothing">¡No se certificaron claves!</string>
<string name="msg_crt_error_unlock">¡Error desbloqueando clave maestra!</string>
- <string name="msg_crt_error_divert">¡La certificación con NFC no está soportada (aún)!</string>
<string name="msg_crt">Certificando juegos de claves</string>
<string name="msg_crt_master_fetch">Descargando clave maestra certificante</string>
+ <string name="msg_crt_nfc_return">Volviendo a la pantalla NFC</string>
<string name="msg_crt_save">Guardando clave certificada %s</string>
<string name="msg_crt_saving">Guardando juegos de claves</string>
<string name="msg_crt_unlock">Desbloqueando clave maestra</string>
@@ -1029,13 +1066,14 @@
<string name="msg_import_fetch_error_decode">¡Error al descifrar juego de claves descargado!</string>
<string name="msg_import_fetch_error">¡La clave no se pudo descargar! (¿problemas con la red?)</string>
<string name="msg_import_fetch_keybase">Descargando desde keybase.io: %s</string>
- <string name="msg_import_fetch_keyserver_error">¡No se pudo descargar la clave desde keybase!</string>
+ <string name="msg_import_fetch_keyserver_error">No se pudo obtener clave de los servidores de claves: %s</string>
<string name="msg_import_fetch_keyserver">Descargando desde el servidor de claves: %s</string>
<string name="msg_import_fetch_keyserver_ok">La clave se descargó con éxito</string>
<string name="msg_import_keyserver">Usando el servidor de claves %s</string>
<string name="msg_import_fingerprint_error">¡La huella de validación de la clave descargada no coincidió con la esperada!</string>
<string name="msg_import_fingerprint_ok">Comprobación de la huella de validación correcta</string>
<string name="msg_import_merge">Incorporando datos descargados</string>
+ <string name="msg_import_merge_error">¡Error al fusionar datos descargados!</string>
<string name="msg_import_error">¡La operación de importación falló!</string>
<string name="msg_import_error_io">¡Fallo en la operación de importación debido a un error de e/s!</string>
<string name="msg_import_partial">¡Operación de importado completada, con errores!</string>
@@ -1092,11 +1130,14 @@
<string name="msg_export_log_error_writing">¡Error de E/S al escribir al fichero!</string>
<string name="msg_export_log_success">¡Registro (log) exportado con éxito!</string>
<!--PassphraseCache-->
- <string name="passp_cache_notif_click_to_clear">Haga clic para eliminar las frases-contraseña almacenadas en caché</string>
- <string name="passp_cache_notif_n_keys">OpenKeychain ha almacenado en caché %d frases-contraseña</string>
- <string name="passp_cache_notif_keys">Frases-contraseña almacenadas en caché:</string>
- <string name="passp_cache_notif_clear">Limpiar caché</string>
- <string name="passp_cache_notif_pwd">Frase-contraseña</string>
+ <string name="passp_cache_notif_click_to_clear">Pulsar para limpiar contraseñas.</string>
+ <plurals name="passp_cache_notif_n_keys">
+ <item quantity="one">%d contraseña recordada</item>
+ <item quantity="other">%d contraseñas recordadas</item>
+ </plurals>
+ <string name="passp_cache_notif_keys">Contraseñas recordadas</string>
+ <string name="passp_cache_notif_clear">Limpiar contraseñas</string>
+ <string name="passp_cache_notif_pwd">Contraseña</string>
<!--First Time-->
<string name="first_time_text1">¡Recupere su privacidad con OpenKeychain!</string>
<string name="first_time_create_key">Crear mi clave</string>
@@ -1119,8 +1160,8 @@
<string name="error_key_not_found">¡Clave no encontrada!</string>
<string name="error_key_processing">¡Error procesando clave!</string>
<string name="key_stripped">desnuda, sin clave</string>
- <string name="key_divert">desviar a tarjeta-inteligente/NFC</string>
- <string name="key_no_passphrase">sin frase-contraseña</string>
+ <string name="key_divert">derivar a tarjeta inteligente</string>
+ <string name="key_no_passphrase">sin contraseña</string>
<string name="key_unavailable">no disponible</string>
<string name="secret_cannot_multiple">¡Sus claves propias sólo pueden ser borradas individualmente!</string>
<string name="title_view_cert">Ver detalles del certificado</string>
@@ -1131,7 +1172,10 @@
<string name="contact_show_key">Mostrar clave (%s)</string>
<string name="swipe_to_update">Gesto de barrido hacia abajo para actualizar desde el servidor de claves</string>
<string name="error_no_file_selected">¡Seleccione al menos un fichero a cifrar!</string>
- <string name="error_multi_files">El guardado de múltiples ficheros no está soportado. Esto es una limitación de su Android actual.</string>
+ <string name="error_multi_files">El guardado de múltiples ficheros no está soportado. Esta es una limitación del actual Android.</string>
+ <string name="error_multi_clipboard">El cifrado de múltiples ficheros hacia el portapapeles no está soportado.</string>
+ <string name="error_detached_signature">La operación de sólo-firmado de ficheros binarios no está soportada, seleccione al menos una clave de cifrado.</string>
+ <string name="error_empty_text">¡Escriba algún texto a cifrar!</string>
<string name="key_colon">Clave:</string>
<string name="exchange_description">Para iniciar un intercambio de claves, en el lado derecho elija el número de participantes, y luego pulse el botón \"Iniciar intercambio\".\n\nSe le formularán dos preguntas más para asegurar que sólo están en el intercambio los participantes debidos, y que sus huellas de validación son correctas.</string>
<string name="btn_start_exchange">Comenzar intercambio</string>
@@ -1139,20 +1183,20 @@
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
<string name="title_unlock_method">Escoja un método de desbloqueo</string>
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
- <string name="enter_passphrase">Introduzca frase-contraseña</string>
- <string name="passphrase">Frase-contraseña</string>
- <string name="noPassphrase">Sin frase-contraseña</string>
- <string name="no_passphrase_set">No se estableció frase-contraseña</string>
- <string name="passphrases_match">Las frases-contraseña no coinciden</string>
- <string name="passphrase_saved">Frase-contraseña guardada</string>
- <string name="passphrase_invalid">Frase-contraseña no válida</string>
- <string name="missing_passphrase">Frase-contraseña ausente</string>
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
+ <string name="enter_passphrase">Introduzca contraseña</string>
+ <string name="passphrase">Contraseña</string>
+ <string name="noPassphrase">Sin contraseña</string>
+ <string name="no_passphrase_set">No se estableció contraseña</string>
+ <string name="passphrases_match">Las contraseñas coinciden</string>
+ <string name="passphrase_saved">Contraseña guardada</string>
+ <string name="passphrase_invalid">Contraseña no válida</string>
+ <string name="missing_passphrase">Contraseña desaparecida</string>
<string name="passphrase_again">De nuevo</string>
<string name="lockpattern">Patrón de bloqueo</string>
<string name="lockpatternNFC">NFC + patrón de bloqueo</string>
<string name="unlock_method">Método de desbloqueo</string>
- <string name="set_passphrase">Establecer frase-contraseña</string>
+ <string name="set_passphrase">Establecer contraseña</string>
<string name="draw_lockpattern">Dibujar patrón de bloqueo</string>
<string name="nfc_title">NFC</string>
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
@@ -1162,4 +1206,51 @@
<string name="nfc_write_succesful">Se escribió con éxito en la etiqueta NFC</string>
<string name="unlocked">Desbloqueado</string>
<string name="nfc_settings">Configuración</string>
+ <string name="snack_yubikey_view">Ver</string>
+ <string name="snack_yubikey_import">Importar</string>
+ <string name="button_bind_key">Ligar clave</string>
+ <string name="yubikey_serno">Nº de serie: %s</string>
+ <string name="yubikey_key_holder">Titular de la clave:</string>
+ <string name="yubikey_key_holder_not_set">Titular de la clave: &lt;no establecido&gt;</string>
+ <string name="yubikey_status_bound">La YubiKey coincide y está ligada a la clave</string>
+ <string name="yubikey_status_unbound">La YubiKey coincide, puede ligarse a la clave</string>
+ <string name="yubikey_status_partly">La YubiKey coincide, parcialmente ligada a la clave</string>
+ <string name="yubikey_create">Sostenga la YubiKey contra el reverso de su dispositivo.</string>
+ <string name="btn_import">Importar</string>
+ <string name="snack_yubi_other">¡Clave almacenada en YubiKey distinta!</string>
+ <string name="error_nfc">Error de NFC: %s</string>
+ <string name="error_pin">NFC: PIN incorrecto; %d intentos restantes.</string>
+ <string name="error_nfc_terminated">NFC: Tarjeta inteligente caducada</string>
+ <string name="error_nfc_wrong_length">NFC: Distancia incorrecta para envío / recepción de datos</string>
+ <string name="error_nfc_conditions_not_satisfied">NFC: Condiciones de uso no satisfechas</string>
+ <string name="error_nfc_security_not_satisfied">NFC: Estado de seguridad no satisfecho</string>
+ <string name="error_nfc_authentication_blocked">NFC: PIN bloqueado tras demasiados intentos</string>
+ <string name="error_nfc_data_not_found">NFC: Clave u objeto no encontrado</string>
+ <string name="error_nfc_unknown">NFC: Error desconocido</string>
+ <string name="error_nfc_bad_data">NFC: La tarjeta informó de datos no válidos</string>
+ <string name="error_nfc_chaining_error">NFC: La tarjeta esperaba el último comando en una cadena</string>
+ <string name="error_nfc_header">NFC: La tarjeta informó de byte %s no válido</string>
+ <string name="error_pin_nodefault">¡El PIN por defecto fue rechazado!</string>
+ <string name="btn_delete_original">Borrar fichero original</string>
+ <string name="snack_encrypt_filenames_on">Los nombres de fichero <b>están</b> cifrados.</string>
+ <string name="snack_encrypt_filenames_off">Los nombres de fichero <b>no están</b> cifrados.</string>
+ <string name="snack_armor_on">Salida codificada como Texto.</string>
+ <string name="snack_armor_off">Salida codificada como Binario.</string>
+ <string name="snack_compression_on">Compresión <b>habilitada</b>.</string>
+ <string name="snack_compression_off">Compresión <b>deshabilitada</b>.</string>
+ <string name="error_loading_keys">¡Error al cargar claves!</string>
+ <string name="error_empty_log">(error, registro (log) vacío)</string>
+ <string name="error_reading_text">¡No se pudo leer entrada a descifrar!</string>
+ <string name="filename_unknown">&lt;sin nombre de fichero&gt;</string>
+ <string name="filename_unknown_text">&lt;datos en texto sin cifrar&gt;</string>
+ <string name="intent_show">Mostrar contenido firmado/cifrado</string>
+ <string name="view_internal">Ver en OpenKeychain</string>
+ <string name="error_preparing_data">¡Error al preparar datos!</string>
+ <string name="label_clip_title">Datos cifrados</string>
+ <string name="progress_processing">Procesando...</string>
+ <string name="error_saving_file">¡Error al guardar fichero!</string>
+ <string name="file_saved">¡Fichero guardado!</string>
+ <string name="file_delete_ok">Fichero original borrado.</string>
+ <string name="file_delete_none">¡No se borró ningún fichero! (¿ya se había borrado?)</string>
+ <string name="file_delete_exception">¡No se pudo borrar el fichero original!</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-et/strings.xml b/OpenKeychain/src/main/res/values-et/strings.xml
index cc9061149..01f98c8e7 100644
--- a/OpenKeychain/src/main/res/values-et/strings.xml
+++ b/OpenKeychain/src/main/res/values-et/strings.xml
@@ -13,7 +13,6 @@
<string name="title_help">Abi</string>
<!--section-->
<!--button-->
- <string name="btn_save">Salvesta</string>
<string name="btn_do_not_save">Katkesta</string>
<string name="btn_delete">Kustuta</string>
<string name="btn_export_to_server">Saada võtmeserverisse</string>
@@ -25,8 +24,6 @@
<string name="menu_search">Otsi</string>
<!--label-->
<string name="label_file">Fail</string>
- <string name="label_no_passphrase">Salasõnet pole</string>
- <string name="label_passphrase">Salasõne</string>
<string name="label_algorithm">Algoritm</string>
<string name="label_creation">Loodud</string>
<string name="label_expiry">Aegub</string>
@@ -56,8 +53,6 @@
<string name="error_message">Viga: %s</string>
<!--key flags-->
<!--sentences-->
- <string name="wrong_passphrase">Vale salasõne</string>
- <string name="passphrases_do_not_match">Salasõned ei ühti.</string>
<string name="passphrase_for_symmetric_encryption">Sümmeetriline krüpteering</string>
<!--errors
no punctuation, all lowercase,
@@ -76,6 +71,7 @@
<!--compression-->
<!--Help-->
<!--Import-->
+ <!--Import from URL-->
<!--Generic result toast-->
<!--Import result toast-->
<!--Delete result toast-->
@@ -90,6 +86,7 @@
<!--Edit key-->
<!--Create key-->
<!--View key-->
+ <!--Add keyserver-->
<!--Navigation Drawer-->
<!--hints-->
<!--certs-->
@@ -114,6 +111,6 @@
<!--unsorted-->
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-eu/strings.xml b/OpenKeychain/src/main/res/values-eu/strings.xml
index a0b206f93..e58a81911 100644
--- a/OpenKeychain/src/main/res/values-eu/strings.xml
+++ b/OpenKeychain/src/main/res/values-eu/strings.xml
@@ -7,13 +7,13 @@
<string name="title_encrypt_text">Enkriptatu</string>
<string name="title_encrypt_files">Enkriptatu</string>
<string name="title_decrypt">Dekriptatu</string>
- <string name="title_unlock">Desblokeatu Giltza</string>
<string name="title_add_subkey">Gehitu azpigiltza</string>
<string name="title_edit_key">Editatu Giltza</string>
<string name="title_preferences">Ezarpenak</string>
<string name="title_api_registered_apps">Aplikazioak</string>
- <string name="title_key_server_preference">Giltza-zerbitzariak</string>
- <string name="title_change_passphrase">Aldatu Sar-esaldia</string>
+ <string name="title_key_server_preference">OpenPGP giltza-zerbitzariak</string>
+ <string name="title_change_passphrase">Aldatu Sarhitza</string>
+ <string name="title_share_fingerprint_with">Elkarbanatu hatz-aztarna honekin...</string>
<string name="title_share_key">Elkarbanatu giltza honekin...</string>
<string name="title_share_file">Elkarbanatu agiria honekin...</string>
<string name="title_share_message">Elkarbanatu idazkia honekin...</string>
@@ -29,29 +29,31 @@
<string name="title_help">Laguntza</string>
<string name="title_log_display">Oharra</string>
<string name="title_exchange_keys">Trukatu Giltzak</string>
- <string name="title_advanced_key_info">Giltza Argibide Aurreratuak</string>
+ <string name="title_advanced_key_info">Argibide Hedatuak</string>
+ <string name="title_delete_secret_key">Ezabatu ZURE \'%s\' giltza?</string>
<string name="title_export_log">Esportatu Oharra</string>
<string name="title_manage_my_keys">Kudeatu nire giltzak</string>
<!--section-->
<string name="section_user_ids">Nortasunak</string>
+ <string name="section_yubikey">YubiKey</string>
<string name="section_linked_system_contact">Loturatutako Sistema Harremana</string>
<string name="section_should_you_trust">Fildatu behar zara giltza honetaz?</string>
+ <string name="section_proof_details">Probatu egiaztapena</string>
+ <string name="section_cloud_evidence">Hodeiko probak</string>
<string name="section_keys">Azpigiltzak</string>
<string name="section_cloud_search">Hodei bilaketa</string>
- <string name="section_passphrase_cache">Sar-esaldi Katxea</string>
<string name="section_certify">Baieztatu</string>
<string name="section_actions">Ekintzak</string>
<string name="section_share_key">Giltza</string>
<string name="section_key_server">Giltza-zerbitzaria</string>
+ <string name="section_fingerprint">Hatz-aztarna</string>
<string name="section_encrypt">Enkriptatu</string>
- <string name="section_decrypt">Dekriptatu</string>
<string name="section_current_expiry">Oraingo epemuga</string>
<string name="section_new_expiry">Epemuga berria</string>
<!--button-->
<string name="btn_decrypt_verify_file">Dekriptatu, egiaztatu eta gorde agiria</string>
<string name="btn_encrypt_share_file">Enkriptatu eta elkarbanatu agiria</string>
<string name="btn_encrypt_save_file">Enkriptatu eta gorde agiria</string>
- <string name="btn_save">Gorde</string>
<string name="btn_do_not_save">Ezeztatu</string>
<string name="btn_delete">Ezabatu</string>
<string name="btn_no_date">Epemuga gabe</string>
@@ -60,18 +62,21 @@
<string name="btn_next">Hurrengoa</string>
<string name="btn_back">Atzera</string>
<string name="btn_no">Ez</string>
+ <string name="btn_match">Hatz-aztarnak bat datoz</string>
<string name="btn_share_encrypted_signed">Enkriptatu eta elkarbanatu idazkia</string>
<string name="btn_copy_encrypted_signed">Enkriptatu eta kopiatu idazkia</string>
<string name="btn_view_cert_key">Ikusi egiaztagiri giltza</string>
<string name="btn_create_key">Sortu giltza</string>
<string name="btn_add_files">Gehitu agiria(k)</string>
- <string name="btn_add_share_decrypted_text">Elkarbanatu dekriptaturiko idazkia</string>
- <string name="btn_decrypt_clipboard">Dekriptatu idazkia gakotik</string>
- <string name="btn_decrypt_and_verify">eta egiaztatu sinadurak</string>
- <string name="btn_decrypt_files">Dekriptatu agiriak</string>
+ <string name="btn_share_decrypted_text">Elkarbanatu dekriptaturiko idazkia</string>
+ <string name="btn_copy_decrypted_text">Kopiatu dekriptaturiko idazkia</string>
<string name="btn_encrypt_files">Enkriptatu agiriak</string>
<string name="btn_encrypt_text">Enkriptatu idazkia</string>
<string name="btn_add_email">Gehitu post@ helbide gehigarriak</string>
+ <string name="btn_unlock">Desblokeatu</string>
+ <string name="btn_add_keyserver">Gehitu</string>
+ <string name="btn_save_default">Gorde berezkoa bezala</string>
+ <string name="btn_saved">Gordeta!</string>
<!--menu-->
<string name="menu_preferences">Ezarpenak</string>
<string name="menu_help">Laguntza</string>
@@ -84,33 +89,39 @@
<string name="menu_encrypt_to">Enkriptatu hona...</string>
<string name="menu_select_all">Hautatu denak</string>
<string name="menu_export_all_keys">Esportatu giltza guztiak</string>
- <string name="menu_advanced">Erakutsi argibide aurreratuak</string>
+ <string name="menu_update_all_keys">Eguneratu giltza guztiak</string>
+ <string name="menu_advanced">Argibide Hedatuak</string>
+ <string name="menu_certify_fingerprint">Baieztatu hatz-aztarna alderaketa bidez</string>
<string name="menu_export_log">Esportatu Oharra</string>
<!--label-->
<string name="label_message">Idazkia</string>
<string name="label_file">Agiria</string>
<string name="label_files">Agiria(k)</string>
<string name="label_file_colon">Agiria:</string>
- <string name="label_no_passphrase">Sar-esaldirik ez</string>
- <string name="label_passphrase">Sar-esaldia</string>
+ <string name="label_no_passphrase">Sarhitzik gabe</string>
+ <string name="label_passphrase">Sarhitza</string>
<string name="label_unlock">Desblokeatzen...</string>
- <string name="label_passphrase_again">Berregin Sar-esaldia</string>
- <string name="label_show_passphrase">Erakutsi Sar-esaldia</string>
+ <string name="label_passphrase_again">Berridatzi Sarhitza</string>
+ <string name="label_show_passphrase">Erakutsi Sarhitza</string>
<string name="label_algorithm">Algoritmoa</string>
<string name="label_ascii_armor">ASCII Armor agiria</string>
<string name="label_file_ascii_armor">Gaitu ASCII Armor</string>
+ <string name="label_write_version_header">Jakinarazi besteei OpenKeychain erabiltzen ari zarela</string>
<string name="label_use_default_yubikey_pin">Erabili berezko YubiKey PIN-a</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">Erabili zenbaki teklatua YubiKey PIN-erako</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Berezko PIN (123456) erabiltzen du NFC bidezko YubiKeys sarbiderako </string>
<string name="label_asymmetric_from">Sinatzailea:</string>
<string name="label_to">Enkriptatu hona:</string>
+ <string name="label_delete_after_encryption">Ezabatu agiriak enkriptatu ondoren</string>
<string name="label_delete_after_decryption">Ezabatu dekriptatu ondoren</string>
<string name="label_encryption_algorithm">Enkriptaketa algoritmoa</string>
<string name="label_hash_algorithm">Hash algoritmoa</string>
- <string name="label_symmetric">Enkriptatu sar-esaldiarekin</string>
- <string name="label_passphrase_cache_ttl">Katxe denbora</string>
+ <string name="label_symmetric">Enkriptatu sarhitzarekin</string>
<string name="label_message_compression">Idazki konpresioa</string>
<string name="label_file_compression">Agiri konpresioa</string>
- <string name="label_keyservers">Giltza-zerbitzariak</string>
+ <string name="label_keyservers">Hautatu OpenPGP giltza-zerbitzariak</string>
<string name="label_key_id">Giltza ID-a</string>
+ <string name="label_key_created">Giltza sortuta %s</string>
<string name="label_creation">Sortzea</string>
<string name="label_expiry">Epemuga</string>
<string name="label_usage">Erabilpena</string>
@@ -121,11 +132,25 @@
<string name="label_comment">Aipamena</string>
<string name="label_email">Post@</string>
<string name="label_send_key">Aldiberetu hodeiarekin</string>
+ <string name="label_fingerprint">Hatz-aztarna</string>
<string name="expiry_date_dialog_title">Ezarri epemuga eguna</string>
+ <string name="label_first_keyserver_is_used">(Zerrendako lehen giltza-zerbitzaria da hobetsia)</string>
<string name="label_preferred">hobetsia</string>
<string name="label_enable_compression">Gaitu konpresioa</string>
<string name="label_encrypt_filenames">Enkriptatu agirizenak</string>
<string name="label_hidden_recipients">Ezkutatu jasotzaileak</string>
+ <string name="label_verify_keyserver">Egiaztatu giltza-zerbitzaria</string>
+ <string name="label_enter_keyserver_url">Sartu giltza-zerbitzariaren URL-a</string>
+ <string name="pref_keyserver">OpenPGP giltza-zerbitzariak</string>
+ <string name="pref_keyserver_summary">Bilatu giltzak hautaturiko OpenPGP giltza-zerbitzarietan (HKP protokoloa)</string>
+ <string name="pref_keybase">keybase.io</string>
+ <string name="pref_keybase_summary">Bilatu giltzak keybase.io-an</string>
+ <string name="user_id_no_name">&lt;izen gabe&gt;</string>
+ <string name="none">&lt;ezer ez&gt;</string>
+ <plurals name="n_keys">
+ <item quantity="one">1 giltza</item>
+ <item quantity="other">%d giltza</item>
+ </plurals>
<plurals name="n_keyservers">
<item quantity="one">%d giltza-zerbitzari</item>
<item quantity="other">%d giltza-zerbitzari</item>
@@ -159,21 +184,26 @@
<string name="flag_encrypt">Enkriptatu</string>
<string name="flag_authenticate">Egiaztatu</string>
<!--sentences-->
- <string name="wrong_passphrase">Sar-esaldi okerra.</string>
+ <string name="wrong_passphrase">Sarhitz okerra.</string>
<string name="no_filemanager_installed">Ez dago agiri kudeatzaile bateragarririk ezarrita.</string>
- <string name="passphrases_do_not_match">Sar-esaldiak ez datoz bat.</string>
- <string name="passphrase_must_not_be_empty">Mesedez sartu sar-esaldi bat.</string>
+ <string name="passphrases_do_not_match">Sarhitzak ez datoz bat.</string>
+ <string name="passphrase_must_not_be_empty">Mesedez sartu sarhitz bat.</string>
<string name="passphrase_for_symmetric_encryption">Enkriptaketa simetrikoa.</string>
- <string name="passphrase_for">Sartu sar-esaldia \'%s\'-rako</string>
+ <string name="passphrase_for">Sartu \'%s\'-rako sarhitza</string>
<string name="pin_for">Sartu PIN-a \'%s\'-rako</string>
+ <string name="yubikey_pin_for">Sartu PIN-a YubKey-ra sartzeko \'%s\'-rentzat</string>
+ <string name="nfc_text">Jarri YubiKey zure gailuaren atzealdean.</string>
<string name="file_delete_confirmation_title">Ezabatu jatorrizko agiriak?</string>
<string name="file_delete_confirmation">Hurrengo agiriak ezabatu egingo dira: %s</string>
- <string name="no_file_selected">Hautatu agiri bat lehenik.</string>
+ <string name="file_delete_successful">%1$d -&gt; %2$d-tik agiri ezbatu dira.%3$s</string>
<string name="encrypt_sign_successful">Ongi sinatu eta/edo enkriptatu da.</string>
<string name="encrypt_sign_clipboard_successful">Ongi sinatu eta/edo enkriptatu da gakora.</string>
<string name="select_encryption_key">Hautatu enkriptaketa giltza bat gutxienez.</string>
- <string name="error_no_encryption_or_signature_key">Hautatu enkriptaketa giltza bat edo sinadura giltza bat gutxienez.</string>
+ <string name="specify_file_to_encrypt_to">Mesedez adierazi zein agirira enkriptatu.\nKONTUZ: Agiria gainidatzi egingo da egonez gero!</string>
+ <string name="specify_file_to_decrypt_to">Mesedez adierazi zein agirira dekriptatu.\nKONTUZ: Agiria gainidatzi egingo da egonez gero!</string>
+ <string name="specify_file_to_export_to">Mesedez adierazi zein agirira esportatu.\nKONTUZ: Agiria gainidatzi egingo da egonez gero!</string>
<string name="key_deletion_confirmation_multi">Egitan nahi duzu hautaturiko giltzak ezabatzea?</string>
+ <string name="secret_key_deletion_confirmation">Ezabatu ondoren ezingo dituzu giltza honekin enkriptatutako mezuak irakurri eta berarekin egindako giltza baieztapen guztiak galduko dira!</string>
<string name="public_key_deletetion_confirmation">Ezabatu \'%s\' giltza?</string>
<string name="also_export_secret_keys">Esportatu giltza sekretuak ere</string>
<string name="key_exported">Ongi esportatu da 1 giltza</string>
@@ -181,9 +211,11 @@
<string name="no_keys_exported">Ez da giltzarik esportatu.</string>
<string name="key_creation_el_gamal_info">Oharra: azpigiltzek bakarrik sostengatzen dute EIGamal.</string>
<string name="key_not_found">Ezin da %08X giltza aurkitu.</string>
+ <string name="specify_file_to_export_log_to">Mesedez adierazi zein agirira esportatu. \nKONTUZ: Agiria gainidatzi egingo da egonez gero.</string>
<string name="list_empty">Zerrenda hau hutsik dago!</string>
<string name="nfc_successful">Giltza ongi bidali da NFC Beam-rekin!</string>
<string name="key_copied_to_clipboard">Giltz gakora kopiatu da!</string>
+ <string name="fingerprint_copied_to_clipboard">Hatz-aztarna gakora kopiatu da!</string>
<string name="select_key_to_certify">Mesedez hautatu baiztapenerako erabiltzeko giltza!</string>
<string name="key_too_big_for_sharing">Giltza handiegia da modu honetan elkarbanatzeko!</string>
<string name="text_copied_to_clipboard">Idazkia gakora kopiatu da!</string>
@@ -197,28 +229,35 @@
<string name="error_external_storage_not_ready">kanpoko biltegia ez dago gertu</string>
<string name="error_key_size_minimum512bit">giltzaren neurria gutxienez 512bitekoa izan behar da</string>
<string name="error_unknown_algorithm_choice">algoritmo ezezagun hautapena</string>
- <string name="error_user_id_no_email">ez da post@rik aurkitu</string>
+ <string name="error_user_id_no_email">ez da post@ helbiderik aurkitu</string>
<string name="error_key_needs_a_user_id">gutxienez nortasun bat behar da</string>
- <string name="error_no_signature_passphrase">ez da sar-esaldirik behar</string>
+ <string name="error_no_signature_passphrase">ez da sarhitzik eman</string>
<string name="error_no_signature_key">ez da sinadura giltzarik eman</string>
+ <string name="error_invalid_data">OpenPGP eduki enkriptatu edo sinatu baliogabea!</string>
<string name="error_integrity_check_failed">osotasun egiaztapen hutsigitea! Datuak aldatuak izan dira!</string>
- <string name="error_wrong_passphrase">sar-esaldi okerra</string>
+ <string name="error_wrong_passphrase">sarhitz okerra</string>
<string name="error_could_not_extract_private_key">ezin da giltza pribatua atera</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Android 4.1 behar duzu Android-ren NFC Beam ezaugarria erabiltzeko!</string>
<string name="error_nfc_needed">NFC gaitua izan behar da!</string>
<string name="error_beam_needed">Beam gaitua izan behar da!</string>
<string name="error_nothing_import">Ez da giltzarik aurkitu!</string>
+ <string name="error_nothing_import_selected">Ez da giltzarik hautatu inportatzeko!</string>
+ <string name="error_contacts_key_id_missing">Hutsegitea giltza ID-a harremanetatik berreskuratzean!</string>
+ <string name="error_generic_report_bug">Akats generiko bat gertatu da, mesedez sortu akats jakinarazpen berri bat OpenKeychain-erako.</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">Sinatu Gabe</string>
<string name="decrypt_result_invalid_signature">Sinadura baliogabea!</string>
- <string name="decrypt_result_signature_uncertified">Sinatzailea (egiaztatu gabea!)</string>
- <string name="decrypt_result_signature_certified">Sinatzailea</string>
- <string name="decrypt_result_signature_expired_key">Giltzaren epemuga gaindituta!</string>
- <string name="decrypt_result_signature_missing_key">Giltza publiko ezezaguna</string>
+ <string name="decrypt_result_signature_uncertified"><b>baieztatugabeko</b> giltzak sinatua</string>
+ <string name="decrypt_result_signature_secret">Zure giltzak sinatuta</string>
+ <string name="decrypt_result_signature_certified">Baieztatutako giltzak sinatuta</string>
+ <string name="decrypt_result_signature_expired_key"><b>iraungitutako</b> giltzak sinatua!</string>
+ <string name="decrypt_result_signature_revoked_key"><b>ukatutako</b> giltzak sinatua!</string>
+ <string name="decrypt_result_signature_missing_key"><b>giltza publiko ezezagunak</b> sinatuta</string>
<string name="decrypt_result_encrypted">Enkriptatuta</string>
<string name="decrypt_result_not_encrypted">Enkriptatu Gabea</string>
<string name="decrypt_result_action_show">Erakutsi</string>
+ <string name="decrypt_invalid_button">Ulertzen ditut arriskuak, erakutsi!</string>
<!--Add keys-->
<string name="add_keys_my_key">Nire giltza:</string>
<!--progress dialogs, usually ending in '…'-->
@@ -227,24 +266,31 @@
<string name="progress_cancelling">ezeztatzen...</string>
<string name="progress_saving">gordetzen...</string>
<string name="progress_importing">inportatzen...</string>
+ <string name="progress_updating">Giltzak eguneratzen...</string>
<string name="progress_exporting">esportatzen...</string>
<string name="progress_uploading">igotzen...</string>
<string name="progress_building_key">giltza eraikitzen...</string>
+ <string name="progress_building_master_key">Maisu eraztuna eraikitzen...</string>
<string name="progress_generating_rsa">RSA giltza berria sortzen...</string>
<string name="progress_generating_dsa">DSA giltza berria sortzen...</string>
<string name="progress_generating_elgamal">EIGamal giltza berria sortzen...</string>
<string name="progress_generating_ecdsa">ECDSA giltza berria sortzen...</string>
<string name="progress_generating_ecdh">ECDH giltza berria sortzen...</string>
+ <string name="progress_modify">giltza-uztaia aldatzen...</string>
+ <string name="progress_modify_unlock">giltza-uztaia desblokeatzen...</string>
<string name="progress_modify_adduid">erabiltzaile ID-ak gehitzen...</string>
<string name="progress_modify_adduat">erabiltzaile ezaugarriak gehitzen...</string>
+ <string name="progress_modify_revokeuid">erabiltzaile ID-ak ukatzen...</string>
<string name="progress_modify_primaryuid">lehen erabiltzaile ID-a aldatzen...</string>
<string name="progress_modify_subkeychange">azpigiltzak aldatzen...</string>
+ <string name="progress_modify_subkeyrevoke">azpigiltzak ukatzen...</string>
<string name="progress_modify_subkeyadd">azpigiltzak gehitzen...</string>
- <string name="progress_modify_passphrase">sar-esaldia aldatzen...</string>
+ <string name="progress_modify_passphrase">sarhitza aldatzen...</string>
<plurals name="progress_exporting_key">
<item quantity="one">giltza esportatzen</item>
<item quantity="other">giltzak esportatzen</item>
</plurals>
+ <string name="progress_start">eragiketa gertatzen...</string>
<string name="progress_extracting_signature_key">sinadura giltza ateratzen...</string>
<string name="progress_extracting_key">giltza ateratzen...</string>
<string name="progress_preparing_streams">jarioak gertatzen...</string>
@@ -262,6 +308,9 @@
<string name="progress_verifying_integrity">osotasuna egiaztatzen...</string>
<string name="progress_deleting_securely">\'%s\' segurtasunez ezabatzen...</string>
<string name="progress_deleting">giltzak ezabatzen...</string>
+ <string name="progress_con_saving">sendotu: katxean gordetzen...</string>
+ <string name="progress_con_reimport">sendotu: berrinportatzen...</string>
+ <string name="progress_verifying_keyserver_url">giltza-zerbitzaria egiaztatzen...</string>
<!--action strings-->
<string name="hint_cloud_search_hint">Bilatu Izena, Post@... bidez</string>
<!--key bit length selections-->
@@ -275,6 +324,8 @@
<string name="key_size_8192">8192</string>
<string name="key_size_custom">Norbere giltza neurria</string>
<string name="key_size_custom_info">Idatzi norbere giltza luzera (bitetan):</string>
+ <string name="key_size_custom_info_rsa">RSA giltzaren luzera 1024 baino handiagoa eta gehienez 16384-ko izan behar da. Baita ere 8-ren biderkaria izan behar da.</string>
+ <string name="key_size_custom_info_dsa">DSA giltzaren luzera gutxienez 512-koa eta gehienez 1024-koa izan behar da. Baita ere 64-ren biderkaria izan behar da.</string>
<!--elliptic curve names-->
<string name="key_curve_nist_p256">NIST P-256</string>
<string name="key_curve_nist_p384">NIST P-384</string>
@@ -301,15 +352,46 @@
<string name="import_tab_qr_code">QR Kodea/NFC</string>
<string name="import_import">Inportatu hautaturiko giltzak</string>
<string name="import_qr_code_wrong">QR Kodea gaizki-eratua! Mesedez saiatu berriro!</string>
+ <string name="import_qr_code_fp">Hatz-aztarna gaizkiegina edo laburregia da!</string>
+ <string name="import_qr_code_too_short_fingerprint">Hatz-aztarna laburregia da!</string>
<string name="import_qr_code_button">Eskaneatu QR Kodea</string>
<string name="import_qr_code_text">Jarri zure kamera QR Kodearen gainean!</string>
+ <!--Import from URL-->
+ <string name="import_url_warn_no_search_parameter">Ez da bilaketa eskaerarik zehaztu. Oraindik eskuz bilatu dezakezu giltza-zerbitzari honetan.</string>
<!--Generic result toast-->
- <string name="snackbar_details">Xehetasunak</string>
<string name="with_warnings">, kontuz oharrekin</string>
<!--Import result toast-->
+ <plurals name="import_keys_added_and_updated_1">
+ <item quantity="one">Ongi inportatuta 1 giltza</item>
+ <item quantity="other">Ongi inportatuta %1$d giltza</item>
+ </plurals>
+ <plurals name="import_keys_added_and_updated_2">
+ <item quantity="one">eta eguneratuta giltza%2$s.</item>
+ <item quantity="other">eta eguneratuta %1$d giltza%2$s.</item>
+ </plurals>
+ <plurals name="import_keys_added">
+ <item quantity="one">Ongi inportatuta giltza%2$s.</item>
+ <item quantity="other">Ongi inportatuta %1$d giltza%2$s.</item>
+ </plurals>
+ <plurals name="import_keys_updated">
+ <item quantity="one">Ongi eguneratuta giltza%2$s.</item>
+ <item quantity="other">Ongi eguneratuta %1$d giltza%2$s.</item>
+ </plurals>
+ <plurals name="import_keys_with_errors">
+ <item quantity="one">Inportatze hutsegitea 1 giltzarentzat!</item>
+ <item quantity="other">Inportatze hutsegitea %d giltzentzat!</item>
+ </plurals>
<string name="import_error_nothing">Ez dago ezer inportatzeko.</string>
<string name="import_error_nothing_cancelled">Inportazioa ezeztatuta.</string>
<!--Delete result toast-->
+ <plurals name="delete_ok_but_fail_1">
+ <item quantity="one">Ongi ezabatu da bat giltza</item>
+ <item quantity="other">Ongi ezabatu dira %1$d giltza</item>
+ </plurals>
+ <plurals name="delete_ok">
+ <item quantity="one">Ongi ezabatu da giltza%2$s.</item>
+ <item quantity="other">Ongi ezabatu dira %1$d giltza%2$s.</item>
+ </plurals>
<plurals name="delete_fail">
<item quantity="one">Akatsa %2$s giltza ezabatzerakoan.</item>
<item quantity="other">Akatsa %1$d giltza ezabatzerakoan.</item>
@@ -323,12 +405,13 @@
<string name="intent_send_encrypt">Enkriptatu OpenKeychain-rekin</string>
<string name="intent_send_decrypt">Dekriptatu OpenKeychain-rekin</string>
<!--Remote API-->
- <string name="api_settings_show_info">Erakutsi argibide aurreratuak</string>
- <string name="api_settings_hide_info">Ezkutatu argibide aurreratuak</string>
- <string name="api_settings_show_advanced">Erakutsi ezarpen aurreratuak</string>
- <string name="api_settings_hide_advanced">Ezkutatu ezarpen aurreratuak</string>
+ <string name="api_settings_show_info">Erakutsi argibide hedatuak</string>
+ <string name="api_settings_hide_info">Ezkutatu argibide hedatuak</string>
+ <string name="api_settings_show_advanced">Erakutsi ezarpen hedatuak</string>
+ <string name="api_settings_hide_advanced">Ezkutatu ezarpen hedatuak</string>
<string name="api_settings_no_key">Ez da giltzarik hautatu</string>
<string name="api_settings_select_key">Hautatu giltza</string>
+ <string name="api_settings_create_key">Sortu giltza berria</string>
<string name="api_settings_save">Gorde</string>
<string name="api_settings_save_msg">Kontua gorde da</string>
<string name="api_settings_cancel">Ezeztatu</string>
@@ -336,17 +419,24 @@
<string name="api_settings_start">Abiarazi aplikazioa</string>
<string name="api_settings_delete_account">Ezabatu kontua</string>
<string name="api_settings_package_name">Pakete Izena</string>
- <string name="api_settings_advanced">Argibide Aurreratuak</string>
+ <string name="api_settings_package_signature">Sinadura Paketearen SHA-256</string>
+ <string name="api_settings_accounts">Kontuak (API zaharra)</string>
+ <string name="api_settings_advanced">Argibide Hedatuak</string>
<string name="api_settings_allowed_keys">Ahalbidetutako Giltzak</string>
<string name="api_settings_settings">Ezarpenak</string>
<string name="api_settings_key">Kontuaren giltza:</string>
<string name="api_settings_accounts_empty">Ez dago konturik app honi erantsita.</string>
+ <string name="api_create_account_text">Ez dago giltzarik itxuratuta kontu honentzat. Mesedez hautatu dauden giltzetako bat edo sortu berri bat.\nAplikazioek hemen hautaturiko giltzekin bakarrik dekriptatu/sinatu dezakete.</string>
+ <string name="api_update_account_text">Kontu honetarako gordetako giltza ezabatua izan da. Mesedez hautatu beste bat!\nApliazioek hemen hautaturiko giltzekin bakarrik dekriptatu/sinatu dezakete!</string>
<string name="api_register_allow">Ahalbidetu sarbidea</string>
<string name="api_register_disallow">Ez ahalbidetu sarbidea</string>
<string name="api_register_error_select_key">Mesedez hautatu giltza bat!</string>
+ <string name="api_select_pub_keys_missing_text">Ez da giltzarik aurkitu nortasun hauentzat:</string>
<string name="api_select_pub_keys_dublicates_text">Giltza bat baino gehiago dago nortasun hauentzat:</string>
<string name="api_select_pub_keys_text">Mesedz berrikusi jasotzaile zerrenda!</string>
<string name="api_select_pub_keys_text_no_user_ids">Mesedez hautatu jasotzaileak!</string>
+ <string name="api_select_sign_key_text">Mesedez hautatu zure giltzetako bat edo sortu berri bat.</string>
+ <string name="api_select_keys_text">Ahalbidetutako giltza batek ere ezin du edukia dekriptatu. Mesedez hautatu ahalbidetutako giltzak.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Elkarbanatu QR Kodearekin</string>
<string name="share_nfc_dialog">Elkarbanatu NFC-rekin</string>
@@ -373,51 +463,106 @@
<string name="key_view_tab_certs">Egiaztagiriak</string>
<string name="key_view_tab_keybase">Keybase.io</string>
<string name="user_id_info_revoked_title">Ukatuta</string>
+ <string name="user_id_info_revoked_text">Nortasun hau ukatua izan da giltzaren jabeagaitik. Aurrerantzean ez da baliozkoa.</string>
<string name="user_id_info_certified_title">Egiaztuta</string>
<string name="user_id_info_certified_text">Nortasun hau zeuk egiaztatua da.</string>
<string name="user_id_info_uncertified_title">Egiaztatu gabea</string>
+ <string name="user_id_info_uncertified_text">Nortasun hau ez da egiaztagiritua izan oraindik. Ezin zara zihur egon nortasuna egitan dagokion adierazitako norbanakoari.</string>
<string name="user_id_info_invalid_title">Baliogabea</string>
<string name="user_id_info_invalid_text">Zerbait oker dago nortasun honekin!</string>
<!--Key trust-->
- <string name="key_trust_already_verified">Jadanik baduzu giltza hau baieztatuta!</string>
+ <string name="key_trust_already_verified">Giltza hau jadanik baieztatuta duzu!</string>
<string name="key_trust_it_is_yours">Hau zure giltzetako bat da!</string>
+ <string name="key_trust_maybe">Giltza hau ukatua edo iraungitua dago.\nEzin duzu baieztatuta, baina fidatzea hautatu dezakezu.</string>
+ <string name="key_trust_revoked">Nortasun hau ukatua izan da giltzaren jabeagaitik. Ez zara berataz fidatu behar.</string>
<string name="key_trust_expired">Giltza hau iraungituta dago. Ez zara berataz fidatu behar.</string>
+ <string name="key_trust_old_keys">Ongi egon daiteke hau erabiltzea giltza hau baliozkoa zen garaiko mezu zahar bat dekriptatzeko.</string>
+ <string name="key_trust_no_cloud_evidence">Ez dago hodeiko probarik giltza honen fidagarritasunerako.</string>
<string name="key_trust_start_cloud_search">Hasi bilaketa</string>
+ <string name="key_trust_results_prefix">Keybase.io \"probak\" eskaintzen ditu giltza honen jabea baieztatzeko:</string>
+ <string name="key_trust_header_text">Oharra: Keybase.io egiaztapenak OpenKeychain-en ezaugarri esperimental bat da. QR kodeak eskaneatzea edo giltzak NFC bidez aldatzea gomendatzen dizugu hauek baieztatu ahal izateko.</string>
<!--keybase proof stuff-->
<string name="keybase_narrative_twitter">Argitaratu Twitter-en honela</string>
<string name="keybase_narrative_github">GitHub-en honela ezagutzen da</string>
<string name="keybase_narrative_dns">Domeinu izena(k) kontrolatzen ditu</string>
+ <string name="keybase_narrative_web_site">Ezin da Web gune(et)an aurkeztu</string>
<string name="keybase_narrative_reddit">Argitaratu Reddit-en honela</string>
<string name="keybase_narrative_coinbase">Coinbasen honela ezagutzen da</string>
<string name="keybase_narrative_hackernews">Argitaratu Hacker News-en honela</string>
+ <string name="keybase_narrative_unknown">Proba mota ezezaguna</string>
+ <string name="keybase_proof_failure">Zorigaitzez proba hau ezin da egiaztatu.</string>
+ <string name="keybase_unknown_proof_failure">Arazo ezezaguna proba egiaztatzailearekin</string>
+ <string name="keybase_problem_fetching_evidence">Arazoa probarekin</string>
+ <string name="keybase_key_mismatch">Giltzaren hatz-aztarna ez dator bat proban aurkeztutakoarekin</string>
+ <string name="keybase_dns_query_failure">DNS TXT Grabaketa berreskurapen hutsegitea</string>
+ <string name="keybase_no_prover_found">Ez da proba egiaztatzailerik aurkitu honentzat:</string>
+ <string name="keybase_message_payload_mismatch">Dekriptatutako proba ez dator bat itxarondako balioarekin</string>
+ <string name="keybase_message_fetching_data">Proba lortzen</string>
+ <string name="keybase_proof_succeeded">Proba hau egiaztatua izan da!</string>
<string name="keybase_for_the_domain">domeinurako</string>
+ <string name="keybase_contained_signature">giltza honen jabeak bakarrik sortu ahal izan duen mezu bat du.</string>
<string name="keybase_twitter_proof">Txio bat</string>
<string name="keybase_dns_proof">DNS TXT grabaketa bat</string>
<string name="keybase_web_site_proof">Idazki agiri bat</string>
<string name="keybase_reddit_proof">JSON agiri bat</string>
<string name="keybase_verify">Egiaztatu</string>
<!--Edit key-->
- <string name="edit_key_action_change_passphrase">Aldatu Sar-esaldia</string>
+ <string name="edit_key_action_change_passphrase">Aldatu Sarhitza</string>
<string name="edit_key_action_add_identity">Gehitu Nortasuna</string>
<string name="edit_key_action_add_subkey">Gehitu Azpigiltza</string>
<string name="edit_key_edit_user_id_title">Hautatu ekintza bat!</string>
+ <string-array name="edit_key_edit_user_id">
+ <item>Aldatu Lehen Nortasuna</item>
+ <item>Ukatu Nortasuna</item>
+ </string-array>
+ <string-array name="edit_key_edit_user_id_revert_revocation">
+ <item>Leheneratu ukapena</item>
+ </string-array>
+ <string name="edit_key_edit_user_id_revoked">Nortasun hau ukatua izan da. Hau ezin da desegin.</string>
<string name="edit_key_edit_subkey_title">Hautatu ekintza bat!</string>
+ <string-array name="edit_key_edit_subkey">
+ <item>Aldatu Iraungitzea</item>
+ <item>Ukatu Azpigiltza</item>
+ <item>Ezeztatu Azpigiltza</item>
+ <item>Mugitu Azpigiltza YubiKey / Txartel Adimentsura</item>
+ </string-array>
<string name="edit_key_new_subkey">azpigiltza berria</string>
+ <string name="edit_key_select_flag">Mesedez hautatu gutxienez ikur bat!</string>
<string name="edit_key_error_add_identity">Gehitu nortasun bat gutxienez!</string>
<string name="edit_key_error_add_subkey">Gehitu azpigiltza bat gutxienez!</string>
+ <string name="edit_key_error_bad_nfc_algo">Txartel adimentsuak ez du algoritmoa sostengatzen!</string>
+ <string name="edit_key_error_bad_nfc_size">Txartel adimentsuak ez du giltzaren neurria sostengatzen!</string>
<!--Create key-->
<string name="create_key_upload">Aldiberetu hodeiarekin</string>
<string name="create_key_empty">Eremu hau beharrezkoa da</string>
- <string name="create_key_passphrases_not_equal">Sar-esaldiak ez datoz bat</string>
+ <string name="create_key_passphrases_not_equal">Sarhitzak ez datoz bat</string>
<string name="create_key_final_text">Hurrengo nortasuna sartu duzu:</string>
+ <string name="create_key_final_robot_text">Giltza sortzeak denbora apur bat hartu dezake, hartu kafe bat bitartean...</string>
+ <string name="create_key_rsa">(3 azpigiltza, RSA, 4096 bit)</string>
<string name="create_key_custom">(norbere giltza itxurapena)</string>
+ <string name="create_key_name_text">Hautatu giltza honekin lotutako izen bat. Izan daiteke izen oso bat, adib., \'Mikel Etxeberria\', edo goitizen bat, adib., \'Xabi\'.</string>
+ <string name="create_key_email_text">Sartu harreman segururako erabiltzeko zure post@ helbide nagusia.</string>
+ <string name="create_key_passphrase_text">Hautatu sarhitz gogor bat. Honek zure giltza babesten du zure gailua lapurtzen dutenean.</string>
<string name="create_key_hint_full_name">Izen Osoa edo Ezizena</string>
<string name="create_key_edit">Aldatu giltza itxurapena</string>
<string name="create_key_add_email">Gehitu post@ helbidea</string>
+ <string name="create_key_add_email_text">Post@ helbide gehigarriak ere giltza honekin elkartzen dira eta komunikazio segururako erabili daitezke.</string>
+ <string name="create_key_email_already_exists_text">Post@ helbidea jadanik gehituta dago</string>
+ <string name="create_key_email_invalid_email">Post@ heuskarria baliogabea da</string>
<!--View key-->
+ <string name="view_key_revoked">Ukatuta: Giltza ezin da gehiago erabili!</string>
+ <string name="view_key_expired">Iraungitua: Harremanak giltzaren baliotasuna luzatu behar du!</string>
+ <string name="view_key_expired_secret">Iraungitua: Giltzen baliotasuna luzatu dezakezu hauek editatuz!</string>
<string name="view_key_my_key">Nire Giltza</string>
- <string name="view_key_verified">Baieztatu Giltza</string>
+ <string name="view_key_verified">Baieztatutako Giltza</string>
<string name="view_key_unverified">Baieztatugabe: Eskaneatu QR Kodea giltza baieztatzeko!</string>
+ <string name="view_key_fragment_no_system_contact">&lt;ezer ez&gt;</string>
+ <!--Add keyserver-->
+ <string name="add_keyserver_dialog_title">Gehitu giltza-zerbitzaria</string>
+ <string name="add_keyserver_verified">Giltza-zerbitzaria egiaztatuta!</string>
+ <string name="add_keyserver_without_verification">Giltza-zerbitzaria gehituta egiaztapen gabe.</string>
+ <string name="add_keyserver_invalid_url">URL baliogabea!</string>
+ <string name="add_keyserver_connection_failed">Hutsegitea giltza-zerbitzariarekin elkartzerakoan. Mesedez egiaztatu URL-a eta zure internet elkarketa.</string>
<!--Navigation Drawer-->
<string name="nav_keys">Giltzak</string>
<string name="nav_encrypt_decrypt">Enkriptatu/Dekriptatu</string>
@@ -430,6 +575,8 @@
<!--certs-->
<string name="cert_default">berezkoa</string>
<string name="cert_none">ezer ez</string>
+ <string name="cert_positive">positiboa</string>
+ <string name="cert_revoke">ukatuta</string>
<string name="cert_verify_ok">Ongi</string>
<string name="cert_verify_failed">hutsegitea!</string>
<string name="cert_verify_error">akatsa!</string>
@@ -438,49 +585,189 @@
<string name="msg_internal_error">Barneko akatsa!</string>
<string name="msg_cancelled">Eragiketa ezeztaturik.</string>
<!--Import Public log entries-->
+ <string name="msg_ip_bad_type_secret">Giltza-uztai sekretua publiko bezala inportatzeko saiakera. Hau akats bat da, mesedez agiritu jakinarazpen bat!</string>
+ <string name="msg_ip_delete_old_fail">Ez da giltza zaharreik ezabatu (berri bat sortzen?)</string>
<string name="msg_ip_delete_old_ok">Giltza zaharra datubasetik ezabatu da</string>
<string name="msg_ip_encode_fail">Eragiketa hutsegitea kodeaketa akats bategaitik</string>
<string name="msg_ip_error_io_exc">Eragiketa hutsegitea s/i akats bategaitik</string>
<string name="msg_ip_error_op_exc">Eragiketa hutsegitea datubase akats bategaitik</string>
<string name="msg_ip_error_remote_ex">Eragiketa hutsegitea barneko akats bategaitik</string>
+ <string name="msg_ip">%s giltza-uztai publikoa inportatzen</string>
+ <string name="msg_ip_insert_keyring">Giltza-uztai dautak kodeatzen</string>
<string name="msg_ip_insert_keys">Giltzak aztertzen</string>
<string name="msg_ip_prepare">Datubase eragiketak gertatzen</string>
+ <string name="msg_ip_master">%s maisu giltza prozesatzen</string>
+ <string name="msg_ip_master_expired">Giltza-uztaia iraungituta: %s</string>
+ <string name="msg_ip_master_expires">Giltza-uztaia iraungitzen da: %s</string>
+ <string name="msg_ip_master_flags_unspecified">Maisu ikurra: adierazi gabe (guztiak onartzen)</string>
+ <string name="msg_ip_master_flags_cesa">Maisu ikurrak: egiaztagiritu, enkriptatu, sinatu, egiaztatu</string>
+ <string name="msg_ip_master_flags_cesx">Maisu ikurrak: egiaztagiritu, enkriptatu, sinatu</string>
+ <string name="msg_ip_master_flags_cexa">Maisu ikurrak: egiaztagiritu, enkriptatu, egiaztatu</string>
+ <string name="msg_ip_master_flags_cexx">Maisu ikurrak: egiaztagiritu, enkriptatu</string>
+ <string name="msg_ip_master_flags_cxsa">Maisu ikurrak: egiaztagiritu, sinatu, egiaztatu</string>
+ <string name="msg_ip_master_flags_cxsx">Maisu ikurrak: egiaztagiritu, sinatu</string>
+ <string name="msg_ip_master_flags_cxxa">Maisu ikurrak: egiaztagiritu, egiaztatu</string>
+ <string name="msg_ip_master_flags_cxxx">Maisu ikurrak: egiaztagiritu</string>
+ <string name="msg_ip_master_flags_xesa">Maisu ikurrak: enkriptatu, sinatu, egiaztatu</string>
+ <string name="msg_ip_master_flags_xesx">Maisu ikurrak: enkriptatu, sinatu</string>
+ <string name="msg_ip_master_flags_xexa">Maisu ikurrak: enkriptatu, egiaztatu</string>
+ <string name="msg_ip_master_flags_xexx">Maisu ikurrak: enkriptatu</string>
+ <string name="msg_ip_master_flags_xxsa">Maisu ikurrak: sinatu, egiaztatu</string>
+ <string name="msg_ip_master_flags_xxsx">Maisu ikurrak: sinatu</string>
+ <string name="msg_ip_master_flags_xxxa">Maisu ikurrak: egiaztatu</string>
+ <string name="msg_ip_master_flags_xxxx">Maisu ikurrak: ezer ez</string>
+ <string name="msg_ip_merge_public">Inportatutako datuak dagoen giltza-uztai publikoan batzen</string>
+ <string name="msg_ip_merge_secret">Inportatutako datuak dagoen giltza-uztai publikoan batzen</string>
+ <string name="msg_ip_subkey">%s azpigiltza prozesatzen</string>
+ <string name="msg_ip_subkey_expired">Azpigiltza iraungipena: %s</string>
+ <string name="msg_ip_subkey_expires">Azpigiltza iraungipena: %s</string>
+ <string name="msg_ip_subkey_flags_unspecified">Azpigiltza ikurra: adierazi gabe (guztiak onartzen)</string>
+ <string name="msg_ip_subkey_flags_cesa">Azpigiltza ikurrak: egiaztagiritu, enkriptatu, sinatu, egiaztatu</string>
+ <string name="msg_ip_subkey_flags_cesx">Azpigiltza ikurrak: egiaztagiritu, enkriptatu, sinatu</string>
+ <string name="msg_ip_subkey_flags_cexa">Azpigiltza ikurrak: egiaztagiritu, enkriptatu, egiaztatu</string>
+ <string name="msg_ip_subkey_flags_cexx">Azpigiltza ikurrak: egiaztagiritu, enkriptatu</string>
+ <string name="msg_ip_subkey_flags_cxsa">Azpigiltza ikurrak: egiaztagiritu, sinatu, egiaztatu</string>
+ <string name="msg_ip_subkey_flags_cxsx">Azpigiltza ikurrak: egiaztagiritu, sinatu</string>
+ <string name="msg_ip_subkey_flags_cxxa">Azpigiltza ikurrak: egiaztagiritu, egiaztatu</string>
+ <string name="msg_ip_subkey_flags_cxxx">Azpigiltza ikurrak: egiaztagiritu</string>
+ <string name="msg_ip_subkey_flags_xesa">Azpigiltza ikurrak: enkriptatu, sinatu, egiaztatu</string>
+ <string name="msg_ip_subkey_flags_xesx">Azpigiltza ikurrak: enkriptatu, sinatu</string>
+ <string name="msg_ip_subkey_flags_xexa">Azpigiltza ikurrak: enkriptatu, egiaztatu</string>
+ <string name="msg_ip_subkey_flags_xexx">Azpigiltza ikurrak: enkriptatu</string>
+ <string name="msg_ip_subkey_flags_xxsa">Azpigiltza ikurrak: sinatu, egiaztatu</string>
+ <string name="msg_ip_subkey_flags_xxsx">Azpigiltza ikurrak: sinatu</string>
+ <string name="msg_ip_subkey_flags_xxxa">Azpigiltza ikurrak: egiaztatu</string>
+ <string name="msg_ip_subkey_flags_xxxx">Azpigiltza ikurrak: ezer ez</string>
+ <string name="msg_ip_success">Giltza-uztai publikoa ongi iinportatu da</string>
+ <string name="msg_ip_success_identical">Giltza-uztaiak ez du datu berririk, ezer ez egiteko</string>
+ <string name="msg_ip_reinsert_secret">Giltza sekretua bir-txertatzen</string>
+ <string name="msg_ip_uid_cert_bad">Egiaztagiri gaitza aurkitu da!</string>
+ <string name="msg_ip_uid_cert_error">Akatsa egiaztagiria prozesatzerakoan!</string>
+ <string name="msg_ip_uid_cert_nonrevoke">Jadanik badu ez-ukatu egiaztagiri bat, jauzi egiten.</string>
+ <string name="msg_ip_uid_cert_old">Egiaztagiria aurrekoa baino zaharragoa da, jauzi egiten.</string>
+ <string name="msg_ip_uid_cert_new">Egiaztagiria berriagoa da, aurrekoa ordezten.</string>
+ <string name="msg_ip_uid_cert_good">Egiaztagiri ona aurkitu da %1$s-rako</string>
+ <string name="msg_ip_uid_reorder">Erabiltzaile ID-ak ber-antolatzen</string>
+ <string name="msg_ip_uid_processing">Erabiltzaile ID-a %s prozesatzen</string>
+ <string name="msg_ip_uid_revoked">Erabiltzaile ID-a ukatua dago</string>
<string name="msg_ip_uat_cert_bad">Egiaztagiri gaitza aurkitu da!</string>
<string name="msg_ip_uat_cert_error">Akatsa egiaztagiria prozesatzerakoan!</string>
+ <string name="msg_ip_uat_cert_old">Egiaztagiria aurrekoa baino zaharragoa da, jauzi egiten.</string>
<string name="msg_ip_uat_cert_new">Egiaztagiria berriagoa da, aurrekoa ordezten.</string>
<string name="msg_ip_uat_cert_good">Egiaztagiri ona aurkitu da %1$s-rako</string>
+ <string name="msg_ip_uat_classifying">Erabiltzaile ezaugarriak sailkatzen</string>
+ <string name="msg_ip_uat_revoked">Erabiltzaile ezaugarria ukatua dago</string>
<!--Import Secret log entries-->
+ <string name="msg_is">%s giltza sekretua inportazen</string>
<string name="msg_is_db_exception">Datubase akatsa!</string>
+ <string name="msg_is_importing_subkeys">Azpigiltza sekretuak prozesatzen</string>
+ <string name="msg_is_error_io_exc">Akatsa giltza-uztaia kodeatzerakoan</string>
+ <string name="msg_is_merge_public">Inportatutako datuak dagoen giltza-uztai publikoan batzen</string>
+ <string name="msg_is_merge_secret">Inportatutako datuak dagoen giltza-uztai publikoan batzen</string>
+ <string name="msg_is_pubring_generate">Giltza-uztai publikoa sortzen giltza-uztai sekreturako</string>
+ <string name="msg_is_subkey_nonexistent">%s azpigailtza eskuraezina da giltza sekretuan</string>
+ <string name="msg_is_subkey_ok">%s azpigiltza eskuragarria bezala markatuta</string>
+ <string name="msg_is_success_identical">Giltza-uztaiak ez du datu berririk, ezer ez egiteko</string>
+ <string name="msg_is_success">Giltza-uztai sekretua ongi inportatu da</string>
<!--Keyring Canonicalization log entries-->
+ <string name="msg_kc_error_no_uid">Giltza-uztaiak ez du baliozko erabiltzaile ID-rik!</string>
+ <string name="msg_kc_error_master_algo">Giltza maisuak algoritmo ezezagun bat erabiltzen du (%s)!</string>
+ <string name="msg_kc_master">Maisu giltza prozesatzen</string>
+ <string name="msg_kc_master_bad_type">Mota ezezaguneko (%s) maisu giltza egiaztagiria kentzen</string>
+ <string name="msg_kc_master_bad_err">Maisu giltza egiaztagiri gaitza kentzen</string>
+ <string name="msg_kc_master_bad">Maisu giltza egiaztagiri gaitza kentzen</string>
+ <string name="msg_kc_sub">%s azpigiltza prozesatzen</string>
+ <string name="msg_kc_sub_bad_type">Azpigiltza egiaztagiri mota ezezaguna: %s</string>
+ <string name="msg_kc_sub_no_cert">Ez da baliozko egiaztagiririk aurkitu %s-rentzat, eraztunetik kentzen</string>
+ <string name="msg_kc_uid_bad_local">\'local\' ikurra duen erabiltzaile ID egiaztagiria kentzen</string>
+ <string name="msg_kc_uid_remove">Erabiltzaile ID \'%s\' baliogabea kentzen</string>
+ <string name="msg_kc_uid_warn_encoding">Erabiltzaile ID-a ez da UTF-8 bezala egiaztatu!</string>
+ <string name="msg_kc_uat_unknown">Mota ezezaguneko erabiltzaile ezaugarria prozesatzen</string>
<string name="msg_kc_uat_remove">Erabiltzaile ezaugarri baliogabea kentzen</string>
+ <string name="msg_kc_uat_warn_encoding">Erabiltzaile ID-a ez da UTF-8 bezala egiaztatu!</string>
<!--Keyring merging log entries-->
+ <string name="msg_mg_error_secret_dummy">Azpigiltza publiko berria aurkitu da, baina irudizko azpigiltza sekretua sortzea ez dago sostengatuta!</string>
+ <string name="msg_mg_error_heterogeneous">Hatz-aztarna ezberdina duten giltza-uztaiak batzen saiatzen!</string>
+ <string name="msg_mg_error_encode">Akats larria sinadura kodeatzerakoan!</string>
+ <string name="msg_mg_public">%s giltza-uztai publikoan batzen</string>
+ <string name="msg_mg_secret">%s giltza-uztai sekretuan batzen</string>
+ <string name="msg_mg_new_subkey">%s azpigiltza berria gehitzen</string>
+ <string name="msg_mg_found_new">%s egiaztagiri berri aurkitu dira giltzuztaian</string>
<string name="msg_mg_unchanged">Ez dago ezer batzeko</string>
<!--createSecretKeyRing-->
<string name="msg_cr">Giltza maisu berria sortzen</string>
<string name="msg_cr_error_no_master">Ez da maisu giltza aukerarik adierazi!</string>
+ <string name="msg_cr_error_no_user_id">Giltza-uztaiak gutxienez erabiltzaile ID batekin sortu behar dira!</string>
+ <string name="msg_cr_error_no_certify">Maisu giltzk egiaztagiri ikurra izan behar du!</string>
+ <string name="msg_cr_error_keysize_512">Giltza neurria 512 edo handiagoa izan behar da!</string>
+ <string name="msg_cr_error_no_curve">Ez da giltzaren neurria adierazi! Hau programazio akats bat da, mesedez agiritu akats jakinarazpen bat!</string>
<string name="msg_cr_error_internal_pgp">Barneko OpenPGP akatsa!</string>
+ <string name="msg_cr_error_unknown_algo">Algoritmo ezezaguna hautatu da! Hau programazio akats bat da, mesedez agiritu akats jakinarazpen bat!</string>
<!--modifySecretKeyRing-->
+ <string name="msg_mr">%s giltza-uztaia aldatzen</string>
<string name="msg_mf_error_encode">Kodeaketa salbuespena!</string>
+ <string name="msg_mf_error_integrity">Barneko akatsa, osotasun egiaztapen hutsegitea!</string>
+ <string name="msg_mf_error_noexist_primary">Lehen erabiltzaile ID gaitza adierazi da!</string>
+ <string name="msg_mf_error_revoked_primary">Ukatutako erabiltzaile ID-ak ezin dira lehena izan!</string>
+ <string name="msg_mf_error_noop">Ez dago ezer egiteko!</string>
<string name="msg_mf_error_pgp">Barneko OpenPGP akatsa!</string>
<string name="msg_mf_error_sig">Sinadura salbuespena!</string>
+ <string name="msg_mf_error_invalid_flags_for_keytocard">Giltza ikur ezegokiak txartel adimentsu giltzarako.</string>
<string name="msg_mf_master">Maisu egiaztagiriak aldatzen</string>
+ <string name="msg_mf_notation_pin">PIN jakinarazpen paketea gehitzen</string>
+ <string name="msg_mf_passphrase">Giltza-uztaiaren sarhitza aldatzen</string>
+ <string name="msg_mf_passphrase_key">%s azpigiltza ber-enkriptatzen sarhitz berriarekin</string>
+ <string name="msg_mf_passphrase_empty_retry">Hutsegitea sarhitz berria ezartzerakoan, berriro saiatzen sarhitz zahar huts batekin</string>
+ <string name="msg_mf_restricted_mode">Eragiketa modu murriztura aldatzen</string>
+ <string name="msg_mf_subkey_change">%s azpigiltza aldatzen</string>
+ <string name="msg_mf_require_passphrase">Sarhitza behar da eragiketetarako</string>
+ <string name="msg_mf_subkey_new_id">Azpigiltza berriaren ID-a: %s</string>
+ <string name="msg_mf_error_past_expiry">Iraungitze eguna ezin da iraganean izan!</string>
+ <string name="msg_mf_subkey_revoke">%s azpigiltza ukatzen</string>
+ <string name="msg_mf_keytocard_start">%s azpigiltza txartel adimentsura mugitzen</string>
+ <string name="msg_mf_success">Giltza-uztaia ongi aldatu da</string>
+ <string name="msg_mf_uid_primary">Lehen erabiltzaile ID-a %s-ra aldatzen</string>
+ <string name="msg_mf_uid_error_empty">Erabiltzaile ID-a ezin da hutsik egon!</string>
+ <string name="msg_mf_uat_error_empty">Erabiltzaile ezaugarria ezin da hutsik egon!</string>
+ <string name="msg_mf_unlock_error">Akatsa giltza-uztaia desblokeatzerakoan!</string>
+ <string name="msg_mf_unlock">Giltza-uztaia desblokeatzerakoan</string>
<!--Consolidate-->
+ <string name="msg_con">Datubasea sendotzen</string>
+ <string name="msg_con_error_concurrent">Sendotzea utzita, jadanik beste hari batean ekinean!</string>
+ <string name="msg_con_save_secret">Giltza-uztai sekretuak gordetzen</string>
+ <string name="msg_con_save_public">Giltza-uztai publikoak gordetzen</string>
<string name="msg_con_db_clear">Datubasea garbitzen</string>
<string name="msg_con_success">Datubasea ongi trinkotu da</string>
+ <string name="msg_con_delete_public">Giltza-uztai publikoaren katxe agiria ezabatzen</string>
+ <string name="msg_con_delete_secret">Giltza-uztai sekretuaren katxe agiria ezabatzen</string>
<string name="msg_con_error_db">Akatsa datubasea irekitzerakoan!</string>
<string name="msg_con_error_io_public">S/I akatsa giltza publikoak katxera idazterakoan!</string>
<string name="msg_con_error_io_secret">S/I akatsa giltza sekretuak katxera idazterakoan!</string>
<string name="msg_con_error_public">Akatsa giltza publikoak ber-inportatzerakoan!</string>
<string name="msg_con_error_secret">Akatsa giltza sekretuak ber-inportatzerakoan!</string>
<string name="msg_con_recover">Trinkotze aurrerabidea berrekiten</string>
+ <plurals name="msg_con_reimport_public">
+ <item quantity="one">Giltza publiko bat berrinportatzen</item>
+ <item quantity="other">%d giltza publiko berrinportatzen</item>
+ </plurals>
+ <string name="msg_con_reimport_public_skip">Ez dago giltza publikorik berrinportatzeko, jauzi egiten...</string>
+ <string name="msg_con_reimport_secret_skip">Ez dago giltza sekreturik berrinportatzeko, jauzi egiten...</string>
+ <string name="msg_con_warn_delete_public">Salbuespena katxe publikoaren agiria ezabatzerakoan</string>
<!--Edit Key (higher level than modify)-->
- <string name="msg_ed_caching_new">Sar-esaldi berria katxeatzen</string>
+ <string name="msg_ed">Giltza eragiketa burutzen</string>
+ <string name="msg_ed_caching_new">Sarhitz berria katxeatzen</string>
<string name="msg_ed_error_key_not_found">Giltza ez da aurkitu!</string>
+ <string name="msg_ed_success">Giltza eragiketa ongi burutu da</string>
<!--Promote key-->
+ <string name="msg_pr">Giltza publikoa giltza sekretura bultzatzen</string>
+ <string name="msg_pr_all">Azpigiltza guztiak sustatzen</string>
<string name="msg_pr_error_key_not_found">Giltza ez da aurkitu!</string>
+ <string name="msg_pr_subkey_match">Azpigiltza sustatzen: %s</string>
+ <string name="msg_pr_success">Giltza ongi sustatu da</string>
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_not_found">Giltza ez da aurkitu!</string>
<!--Messages for DecryptVerify operation-->
+ <string name="msg_dc_clear_decompress">Konprimitutako datuak despaketatzen</string>
<string name="msg_dc_clear_meta_file">Agirizena: %s</string>
<string name="msg_dc_clear_meta_mime">MIME mota: %s</string>
<string name="msg_dc_clear_meta_size">Agiri neurria: %s</string>
@@ -491,13 +778,29 @@
<string name="msg_dc_clear_signature_check">Sinadura datuak egiaztatzen</string>
<string name="msg_dc_clear_signature_ok">Sinadura egiaztapena ONGI</string>
<string name="msg_dc_clear_signature">Sinadura datuak gerorako gordetzen</string>
+ <string name="msg_dc_clear">Cleartext datuak prozesatzen</string>
+ <string name="msg_dc_error_bad_passphrase">Akatsa giltza desblokeatzerakoan, sarhitz gaitza!</string>
+ <string name="msg_dc_error_corrupt_data">Datuak hondatuta daude!</string>
+ <string name="msg_dc_error_extract_key">Akats ezezaguna giltza desblokeatzerakoan!</string>
<string name="msg_dc_error_integrity_check">Osotasun egiaztapen akatsa!</string>
+ <string name="msg_dc_error_invalid_data">OpenPGP eduki enkriptatu edo sinatu baliogabea!</string>
+ <string name="msg_dc_error_io">SI Salbuespen bat aurkitu da eragiketan zehar!</string>
+ <string name="msg_dc_error_no_data">Ez da datu enkriptaturik aurkitu jarioan!</string>
+ <string name="msg_dc_error_no_key">Ez da enkriptatutako daturik giltza sekretu ezagunarekin aurkitu jarioan!</string>
+ <string name="msg_dc_error_pgp_exception">OpenPGP Salbuespen bat aurkitu da eragiketan zehar!</string>
<string name="msg_dc_integrity_check_ok">Osotasun egiaztapena ONGI!</string>
- <string name="msg_dc_pass_cached">Sar-esaldia erabiltzen katxetik</string>
+ <string name="msg_dc_ok_meta_only">Metadatuak bakarrik eskatu dira, dekriptaketa jauzi egiten</string>
+ <string name="msg_dc_ok">Dekriptaketa/Egiaztapena amaituta</string>
+ <string name="msg_dc_pass_cached">Sarhitza katxetik erabiltzen</string>
+ <string name="msg_dc_pending_nfc">NFC ezagutarazlea beharrezkoa, erabiltzaile sarrera eskatzen...</string>
+ <string name="msg_dc_pending_passphrase">Sarhitza beharrezkoa, erabiltzaile sarrera eskatzen...</string>
+ <string name="msg_dc_prep_streams">Jarioak dekriptatzeko gertatzen</string>
<string name="msg_dc">Dekriptaketa eragiketa abiatzen...</string>
<string name="msg_dc_sym_skip">Datu simetrikoak ez daude ahalbidetuta, jauzi egiten...</string>
<string name="msg_dc_unlocking">Giltza sekretua desblokeatzen</string>
<!--Messages for VerifySignedLiteralData operation-->
+ <string name="msg_vl">Sinadura egiaztapena abiatzen</string>
+ <string name="msg_vl_error_wrong_key">Mezua ez dago giltza zuzenarekin sinatuta</string>
<string name="msg_vl_clear_meta_file">Agirizena: %s</string>
<string name="msg_vl_clear_meta_mime">MIME mota: %s</string>
<string name="msg_vl_clear_meta_time">Aldaketa ordua: %s</string>
@@ -507,6 +810,7 @@
<string name="msg_vl_ok">Ongi</string>
<!--Messages for SignEncrypt operation-->
<string name="msg_se">Sinadura/enkriptaketa eragiketa abiatzen</string>
+ <string name="msg_se_input_uri">Sarrera URI-tik prozesatzen</string>
<string name="msg_se_error_no_input">Ez da sarrerarik eman!</string>
<string name="msg_se_error_input_uri_not_found">Akatsa URI-a irakurtzeko irekitzerakoan!</string>
<string name="msg_se_error_output_uri_not_found">Akatsa URI-a idazteko irekitzerakoan!</string>
@@ -515,12 +819,20 @@
<string name="msg_pse_asymmetric">Giltza publikoak gertatzen enkriptaketarako</string>
<string name="msg_pse_compressing">Konpresioa gertatzen</string>
<string name="msg_pse_encrypting">Datuak enkriptatzen</string>
- <string name="msg_pse_error_bad_passphrase">Sar-esaldi gaitza!</string>
+ <string name="msg_pse_error_bad_passphrase">Sarhitz gaitza!</string>
+ <string name="msg_pse_error_sign_key">Akatsa giltza sinatua lortzerakoan!</string>
<string name="msg_pse_error_nfc">NFC datu akatsa!</string>
- <string name="msg_pse_error_no_passphrase">Ez da sar-esaldirik eman!</string>
+ <string name="msg_pse_error_no_passphrase">Ez da sarhitzik eman!</string>
<string name="msg_pse_error_pgp">Barneko OpenPGP akatsa!</string>
<string name="msg_pse_error_sig">OpenPGP sinadura salbuespena aurkitu da!</string>
<string name="msg_pse_error_unlock">Akats ezezaguna giltza desblokeatzerakoan!</string>
+ <string name="msg_pse_key_warn">Giltza gaitza enkriptaketarako: %s</string>
+ <string name="msg_pse_ok">Sinadura/enkriptaketa eragiketa ongi</string>
+ <string name="msg_pse_pending_nfc">NFC ezagutarazlea beharrezkoa, erabiltzaile sarrera eskatzen...</string>
+ <string name="msg_pse_pending_passphrase">Sarhitza beharrezkoa, erabiltzaile sarrera eskatzen...</string>
+ <string name="msg_pse_signing">Datuak sinatzen (enkriptaketa gabe)</string>
+ <string name="msg_pse_signing_cleartext">Cleartext sinadura sortzen</string>
+ <string name="msg_pse_signing_detached">Sinadura deserntsia sortzen</string>
<string name="msg_pse_sigcrypting">Datuak sinadurarekin enkriptatzen</string>
<string name="msg_pse">Sinadura eta/edo enkriptaketa eragiketa abiatzen</string>
<string name="msg_pse_symmetric">Enkriptaketa simetrikoa gertatzen</string>
@@ -528,13 +840,30 @@
<string name="msg_crt_error_master_not_found">Maisu giltza ez da aurkitu!</string>
<string name="msg_crt_error_nothing">Ez da giltzarik egiaztagiritu!</string>
<string name="msg_crt_error_unlock">Akatsa maisu giltza desblokeatzerakoan!</string>
+ <string name="msg_crt">Giltza-uztaiak egiaztagiritzen</string>
+ <string name="msg_crt_master_fetch">Maisu giltza egiaztagiritua lortzen</string>
+ <string name="msg_crt_nfc_return">NFC ikusleihora itzultzen</string>
+ <string name="msg_crt_saving">Giltza-uztaiak gordetzen</string>
+ <string name="msg_crt_unlock">Maisu giltza desblokeatzen</string>
<string name="msg_crt_success">Nortasunak ongi egiaztagiritu dira</string>
<string name="msg_crt_warn_not_found">Giltza ez da aurkitu!</string>
<string name="msg_crt_warn_cert_failed">Egiaztagiri sortze hutsegitea!</string>
<string name="msg_crt_warn_save_failed">Gordetze eragiketa hutsegitea!</string>
<string name="msg_crt_upload_success">Giltza ongi igo da zerbitzarira</string>
+ <string name="msg_import_fetch_error_decode">Akatsa berreskuratutako giltza-uztai dekodeatzerakoan!</string>
+ <string name="msg_import_fetch_keyserver">Giltza-zerbitzaritik berreskuratzen: %s</string>
+ <string name="msg_import_fetch_keyserver_ok">Giltza ongi berreskuratu da</string>
+ <string name="msg_import_keyserver">%s giltza-zerbitzaria erabiltzen</string>
+ <string name="msg_import_fingerprint_error">Lortutako giltzaren hatz-aztarna ez dator bat itxarondakoarekin!</string>
+ <string name="msg_import_fingerprint_ok">Hatz-aztarna egiaztapena ONGI</string>
+ <string name="msg_import_merge">Berreskuratutako datuak batzen</string>
+ <string name="msg_import_merge_error">Akatsa berreskuratutako datuak batzerakoan!</string>
+ <string name="msg_import_error">Inportatze eragiketa ongi hutsegitea!</string>
+ <string name="msg_import_error_io">Eragiketa hutsegitea s/i akats bategaitik!</string>
+ <string name="msg_import_partial">Inportatze eragiketa ongi burutu da, akatsekin!</string>
<string name="msg_import_success">Inportatze eragiketa ongi burutu da!</string>
<string name="msg_export_all">Giltza guztiak esportatzen</string>
+ <string name="msg_export_public">Giltza publikoa esportatzen %s</string>
<string name="msg_export_error_no_file">Ez da agirizenik adierazi!</string>
<string name="msg_export_error_fopen">Akatsa agiria irekitzen!</string>
<string name="msg_export_error_no_uri">Ez da URI-rik adierazi!</string>
@@ -546,9 +875,17 @@
<string name="msg_export_success">Esportatze eragiketa ongi burutu da!</string>
<string name="msg_del_error_empty">Ez dago ezer ezabatzeko!</string>
<string name="msg_del_error_multi_secret">Giltza sekretuak banaka bakarrik ezabatu daitezke!</string>
+ <string name="msg_del_key">%s giltza ezabatzen</string>
+ <string name="msg_del_key_fail">Hutsegitea %s giltza ezabatzerakoan</string>
+ <string name="msg_del_consolidate">Datubasea sendotzen giltza sekretua ezabatu ondoren</string>
+ <plurals name="msg_del_ok">
+ <item quantity="one">Ongi ezabatuta giltza</item>
+ <item quantity="other">Ongi ezabatuta %d giltza</item>
+ </plurals>
<string name="msg_acc_saved">Kontua gordeta</string>
<string name="msg_download_success">Ongi jeitsi da!</string>
<string name="msg_download_no_valid_keys">Ez da baliozko giltzarik aurkitu agiri/gakoan!</string>
+ <string name="msg_download_query_failed">Akats bat gertatu da giltzak bilatzerakoan.</string>
<!--Messages for Export Log operation-->
<string name="msg_export_log_start">Esportatze oharra</string>
<string name="msg_export_log_error_fopen">Akatsa agiria irekitzerakoan</string>
@@ -556,11 +893,10 @@
<string name="msg_export_log_error_writing">S/I akatsa agirira idazterakoan!</string>
<string name="msg_export_log_success">Oharra ongi esportatu da!</string>
<!--PassphraseCache-->
- <string name="passp_cache_notif_click_to_clear">Klikatu katxeatutako sar-esaldiak garbitzeko</string>
- <string name="passp_cache_notif_keys">Katxeatutako Sar-esaldiak:</string>
- <string name="passp_cache_notif_clear">Garibut Katxea</string>
- <string name="passp_cache_notif_pwd">Sar-esaldia</string>
+ <string name="passp_cache_notif_pwd">Sarhitza</string>
<!--First Time-->
+ <string name="first_time_text1">Berreskuratu zure pribatutasuna OpenKeychain-ekin!</string>
+ <string name="first_time_create_key">Sortu nire giltza</string>
<string name="first_time_import_key">Inportatu giltza agiritik</string>
<string name="first_time_yubikey">Erabili YubiKey NEO</string>
<string name="first_time_skip">Jauzi Ezarpena</string>
@@ -569,31 +905,73 @@
<string name="section_cert">Egiaztagiriaren Xehetasunak</string>
<string name="label_user_id">Nortasuna</string>
<string name="empty_certs">Ez dago egiaztagiririk giltza honentzat</string>
+ <string name="label_revocation">Ukatze Zergaitia</string>
<string name="label_cert_type">Mota</string>
<string name="error_key_not_found">Giltza ez da aurkitu!</string>
<string name="error_key_processing">Akatsa giltza prozesatzerakoan!</string>
+ <string name="key_no_passphrase">sarhitzik gabe</string>
+ <string name="key_unavailable">eskuraezina</string>
+ <string name="secret_cannot_multiple">Zure jabetzako giltzak banaka bakarrik ezabatu daitezke!</string>
+ <string name="title_view_cert">Ikusi Egiaztagiriaren Xehetasunak</string>
<string name="unknown_algorithm">ezezaguna</string>
<string name="can_sign_not">ezin da sinatu</string>
<string name="error_no_encrypt_subkey">Ez dago enkriptaketa azpigiltzarik eskuragarri!</string>
<string name="contact_show_key">Erakutsi (%s) giltza</string>
+ <string name="swipe_to_update">Irristatu behera giltza-zerbitzaritik eguneratzeko</string>
+ <string name="error_no_file_selected">Hautatu agiri bat gutxienez enkriptatzeko!</string>
+ <string name="error_empty_text">Idatzi idazkiren bat enkriptatzeko!</string>
<string name="key_colon">Giltza:</string>
+ <string name="exchange_description">Giltza trukatzea bat hasteko, hautatu eskuinaldean kide zenbatekoa, orduan sakatu \"Hasi trukatzea\" botoia.\n\nBeste bi galdera egingo zaizkizu kide zuzenek besterik ez dutela eskuhartzen eta beren hatz-aztarnak zuzenak direla zihurtatzeko.</string>
+ <string name="btn_start_exchange">Hasi trukatzea</string>
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
<string name="title_unlock_method">Hautatu desblokeatze metodo bat</string>
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
- <string name="enter_passphrase">Sartu sar-esaldia</string>
- <string name="passphrase">Sar-esaldia</string>
- <string name="noPassphrase">Ez dago sar-esaldirik</string>
- <string name="no_passphrase_set">Ez da sar-esaldirik ezarri</string>
- <string name="passphrases_match">Sar-esaldia ez dator bat</string>
- <string name="passphrase_saved">Sar-esaldia gordeta</string>
- <string name="passphrase_invalid">Sar-esaldi baliogabea</string>
- <string name="missing_passphrase">Sar-esaldia ez dago</string>
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
+ <string name="enter_passphrase">Idatzi sarhitza</string>
+ <string name="passphrase">Sarhitza</string>
+ <string name="noPassphrase">Sarhitzik gabe</string>
+ <string name="no_passphrase_set">Ez da sarhitzik ezarri</string>
+ <string name="passphrases_match">Sarhitzak ez datoz bat</string>
+ <string name="passphrase_saved">Sarhitza gordeta</string>
+ <string name="passphrase_invalid">Sarhitz baliogabea</string>
+ <string name="missing_passphrase">Sarhitz ez dago</string>
<string name="passphrase_again">Berriro</string>
+ <string name="lockpattern">Blokeatze-eredua</string>
+ <string name="lockpatternNFC">NFC + Blokeo-eredua</string>
<string name="unlock_method">Desblokeatze metodoa</string>
- <string name="set_passphrase">Ezarri sar-esaldia</string>
+ <string name="set_passphrase">Ezarri sarhitza</string>
<string name="nfc_title">NFC</string>
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+ <string name="nfc_wrong_tag">Etiketa Okerra. Mesedez saiatu berriro.</string>
+ <string name="enable_nfc">Mesedez gaitu NFC zure ezarpenetan</string>
+ <string name="no_nfc_support">Gailu honek ez du NFC sostengatzen</string>
+ <string name="nfc_write_succesful">Ongi idatzi da NFC etiketan</string>
<string name="unlocked">Desblokeatuta</string>
<string name="nfc_settings">Ezarpenak</string>
+ <string name="snack_yubikey_view">Ikusi</string>
+ <string name="snack_yubikey_import">Inportatu</string>
+ <string name="yubikey_serno">Serie Zbk: %s</string>
+ <string name="yubikey_create">Jarri YubiKey zure gailuaren atzealdean.</string>
+ <string name="btn_import">Inportatu</string>
+ <string name="error_nfc">NFC Akatsa: %s</string>
+ <string name="error_pin">NFC: PIN okerra; %d saiakera gelditzen dira.</string>
+ <string name="error_nfc_terminated">NFC: Txartel adimentsua amaiera egoeran</string>
+ <string name="error_nfc_wrong_length">NFC: Luzer okerra datuak bidaltzeko / jasotzeko</string>
+ <string name="error_nfc_conditions_not_satisfied">NFC: Ez dira erabilpen baldaintzak betetzen</string>
+ <string name="error_nfc_security_not_satisfied">NFC: Ez da segurtasun egoera betetzen</string>
+ <string name="error_nfc_authentication_blocked">NFC: PIN-a blokeatuta saiakera gehiegiren ondoren</string>
+ <string name="error_nfc_data_not_found">NFC: Gailtza edo objetua ez da aurkitu</string>
+ <string name="error_nfc_unknown">NFC: Akats Ezezaguna</string>
+ <string name="error_nfc_bad_data">NFC: Txartelak datu baliogabeak jakinarazi ditu</string>
+ <string name="error_nfc_chaining_error">NFC: Txartelak itxaroten azken agindua kate batean</string>
+ <string name="error_nfc_header">NFC: Txartelak %s byte baliogabea jakinarazi du</string>
+ <string name="error_pin_nodefault">Berezko PIN-a baztertua izan da!</string>
+ <string name="snack_encrypt_filenames_on">Agirizenak enkriptatuta <b>daude</b>.</string>
+ <string name="snack_encrypt_filenames_off">Agirizenak <b>ez daude</b> enkriptatuta.</string>
+ <string name="snack_armor_on">Irteera kodeaketa Idazki bezala.</string>
+ <string name="snack_armor_off">Irteera kodeaketa Bitar bezala.</string>
+ <string name="snack_compression_on">Konpresioa <b>gaituta</b>.</string>
+ <string name="snack_compression_off">Konpresioa <b>ezgaituta</b>.</string>
+ <string name="error_loading_keys">Akatsa giltzak gertatzerakoan!</string>
+ <string name="error_empty_log">(akatsa, oharra hutsik)</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-fi/strings.xml b/OpenKeychain/src/main/res/values-fi/strings.xml
index 6cbc2b1fc..6b0d7bfb8 100644
--- a/OpenKeychain/src/main/res/values-fi/strings.xml
+++ b/OpenKeychain/src/main/res/values-fi/strings.xml
@@ -4,12 +4,10 @@
http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
<!--title-->
<string name="title_decrypt">Pura Salaus</string>
- <string name="title_unlock">Avaa Avain</string>
<string name="title_add_subkey">Lisää aliavain</string>
<string name="title_edit_key">Muokkaa avainta</string>
<string name="title_preferences">Asetukset</string>
<string name="title_api_registered_apps">Sovellukset</string>
- <string name="title_change_passphrase">Vaihda Salasana</string>
<string name="title_share_fingerprint_with">Jaa sormenjälki...</string>
<string name="title_share_key">Jaa avain...</string>
<string name="title_share_file">Jaa tiedosto...</string>
@@ -24,12 +22,10 @@
<string name="title_help">Apua</string>
<string name="title_log_display">Loki</string>
<string name="title_exchange_keys">Vaihda Avaimia</string>
- <string name="title_advanced_key_info">Lisätietoa Avaimesta</string>
<!--section-->
<string name="section_user_ids">Identiteetit</string>
<string name="section_keys">Aliavaimet</string>
<string name="section_cloud_search">Pilvihaku</string>
- <string name="section_passphrase_cache">Salasanavälimuisti</string>
<string name="section_actions">Toiminteet</string>
<string name="section_share_key">Avain</string>
<string name="section_key_server">Avainpalvelin</string>
@@ -37,7 +33,6 @@
<!--button-->
<string name="btn_decrypt_verify_file">Pura, todenna ja tallenna tiedosto</string>
<string name="btn_encrypt_share_file">Salaa ja jaa tiedosto</string>
- <string name="btn_save">Tallenna</string>
<string name="btn_do_not_save">Peruuta</string>
<string name="btn_delete">Poista</string>
<string name="btn_no_date">Ei umpeutumisaikaa</string>
@@ -48,9 +43,6 @@
<string name="btn_view_cert_key">Näytä varmennusavain</string>
<string name="btn_create_key">Luo avain</string>
<string name="btn_add_files">Lisää tiedosto(ja)</string>
- <string name="btn_add_share_decrypted_text">Jaa purettu teksti</string>
- <string name="btn_decrypt_and_verify">ja varmenna allekirjoitukset</string>
- <string name="btn_decrypt_files">Pura tiedostoja</string>
<!--menu-->
<string name="menu_preferences">Asetukset</string>
<string name="menu_help">Apua</string>
@@ -61,15 +53,11 @@
<string name="menu_encrypt_to">Salaa...</string>
<string name="menu_select_all">Valitse kaikki</string>
<string name="menu_export_all_keys">Vie kaikki avaimet</string>
- <string name="menu_advanced">Näytä lisäinformaatio</string>
<!--label-->
<string name="label_file">Tiedosto</string>
<string name="label_files">Tiedosto(t)</string>
<string name="label_file_colon">Tiedosto:</string>
- <string name="label_no_passphrase">Ei salasanaa</string>
- <string name="label_passphrase">Salasana</string>
<string name="label_unlock">Avataan...</string>
- <string name="label_passphrase_again">Toista salasana</string>
<string name="label_algorithm">Algoritmi</string>
<string name="label_ascii_armor">Tiedosto ASCII Armor</string>
<string name="label_file_ascii_armor">Käytä ASCII Armoria</string>
@@ -83,11 +71,7 @@
<string name="label_delete_after_decryption">Poista salauksen purkamisen jälkeen</string>
<string name="label_encryption_algorithm">Salausalgoritmi</string>
<string name="label_hash_algorithm">Tiivistealgoritmi</string>
- <string name="label_symmetric">Salaa salasanalla</string>
- <string name="label_passphrase_cache_ttl">Välimuistiaika</string>
- <string name="label_passphrase_cache_subs">Väliaikaistalleta salasanat aliavaimen mukaan</string>
<string name="label_file_compression">Tiedoston pakkaus</string>
- <string name="label_keyservers">Avainpalvelimet</string>
<string name="label_key_id">Avaimen ID</string>
<string name="label_creation">Luontiaika</string>
<string name="label_expiry">Umpeutumisaika</string>
@@ -142,12 +126,8 @@
<string name="flag_encrypt">Salaa</string>
<string name="flag_authenticate">Autentikoi</string>
<!--sentences-->
- <string name="wrong_passphrase">Väärä salasana.</string>
<string name="no_filemanager_installed">Yhteensopivaa tiedostonhallintaa ei ole asennettu.</string>
- <string name="passphrases_do_not_match">Salasanat eivät vastaa toisiaan.</string>
- <string name="passphrase_must_not_be_empty">Syötä salasana.</string>
<string name="passphrase_for_symmetric_encryption">Symmetrinen salaus.</string>
- <string name="passphrase_for">Syötä salasana \'%s\':lle</string>
<string name="pin_for">Syötä PIN \'%s\':lle</string>
<!--errors
no punctuation, all lowercase,
@@ -166,6 +146,7 @@
<!--compression-->
<!--Help-->
<!--Import-->
+ <!--Import from URL-->
<!--Generic result toast-->
<!--Import result toast-->
<!--Delete result toast-->
@@ -180,6 +161,7 @@
<!--Edit key-->
<!--Create key-->
<!--View key-->
+ <!--Add keyserver-->
<!--Navigation Drawer-->
<!--hints-->
<!--certs-->
@@ -204,6 +186,6 @@
<!--unsorted-->
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml
index 7f408f603..d5210379e 100644
--- a/OpenKeychain/src/main/res/values-fr/strings.xml
+++ b/OpenKeychain/src/main/res/values-fr/strings.xml
@@ -7,13 +7,12 @@
<string name="title_encrypt_text">Chiffrer</string>
<string name="title_encrypt_files">Chiffrer</string>
<string name="title_decrypt">Déchiffrer</string>
- <string name="title_unlock">Déverrouiller la clef</string>
<string name="title_add_subkey">Ajouter une sous-clef</string>
<string name="title_edit_key">Modifier une clef</string>
<string name="title_preferences">Paramètres</string>
<string name="title_api_registered_apps">Applis</string>
- <string name="title_key_server_preference">Serveurs de clefs</string>
- <string name="title_change_passphrase">Modifier la phrase de passe</string>
+ <string name="title_key_server_preference">Serveurs de clefs OpenPGP</string>
+ <string name="title_change_passphrase">Changer le mot de passe</string>
<string name="title_share_fingerprint_with">Partager l\'empreinte avec...</string>
<string name="title_share_key">Partager la clef avec...</string>
<string name="title_share_file">Partager le fichier avec...</string>
@@ -30,33 +29,34 @@
<string name="title_help">Aide</string>
<string name="title_log_display">Journal</string>
<string name="title_exchange_keys">Échanger des clefs</string>
- <string name="title_advanced_key_info">Infos avancées sur les clefs</string>
+ <string name="title_advanced_key_info">Informations détaillées</string>
<string name="title_delete_secret_key">Supprimer VOTRE clef « %s » ?</string>
<string name="title_export_log">Exporter le journal</string>
<string name="title_manage_my_keys">Gérer mes clefs</string>
<!--section-->
<string name="section_user_ids">identités</string>
+ <string name="section_yubikey">Clef Yubi</string>
<string name="section_linked_system_contact">Contact système relié</string>
<string name="section_should_you_trust">Devriez-vous faire confiance à cette clef ?</string>
<string name="section_proof_details">Vérification de preuve</string>
<string name="section_cloud_evidence">Preuves provenant du nuage</string>
<string name="section_keys">Sous-clefs</string>
<string name="section_cloud_search">Recherche nuagique</string>
- <string name="section_passphrase_cache">Cache de la phrase de passe</string>
+ <string name="section_passphrase_cache">Gestion des mots de passe/NIP</string>
<string name="section_certify">Confirmer</string>
<string name="section_actions">Actions</string>
<string name="section_share_key">Clef</string>
<string name="section_key_server">Serveur de clefs</string>
<string name="section_fingerprint">Empreinte</string>
<string name="section_encrypt">Chiffrer</string>
- <string name="section_decrypt">Déchiffrer</string>
+ <string name="section_decrypt">Déchiffrer / Vérifier</string>
<string name="section_current_expiry">Expiration actuelle</string>
<string name="section_new_expiry">Nouvelle expiration</string>
<!--button-->
<string name="btn_decrypt_verify_file">Déchiffrer, vérifier et enregistrer le fichier</string>
<string name="btn_encrypt_share_file">Chiffrer et partager le fichier</string>
<string name="btn_encrypt_save_file">Chiffrer et enregistrer un fichier</string>
- <string name="btn_save">Enregistrer</string>
+ <string name="btn_view_log">Visualiser le journal</string>
<string name="btn_do_not_save">Annuler</string>
<string name="btn_delete">Supprimer</string>
<string name="btn_no_date">Pas d\'expiration</string>
@@ -71,13 +71,17 @@
<string name="btn_view_cert_key">Voir la clef de certification</string>
<string name="btn_create_key">Créer la clef</string>
<string name="btn_add_files">Ajouter un/des fichier(s)</string>
- <string name="btn_add_share_decrypted_text">Partager le texte déchiffrer</string>
- <string name="btn_decrypt_clipboard">Déchiffrer du texte à partir du presse-papiers</string>
- <string name="btn_decrypt_and_verify">et vérifier les signatures</string>
- <string name="btn_decrypt_files">Déchiffrer les fichiers</string>
+ <string name="btn_share_decrypted_text">Partager le texte déchiffré</string>
+ <string name="btn_copy_decrypted_text">Copier le texte déchiffré</string>
+ <string name="btn_decrypt_clipboard">Lire du presse-papiers</string>
+ <string name="btn_decrypt_files">Choisir le fichier d\'entrée</string>
<string name="btn_encrypt_files">Chiffrer des fichiers</string>
<string name="btn_encrypt_text">Chiffrer du texte</string>
<string name="btn_add_email">Ajouter une adresse courriel supplémentaire</string>
+ <string name="btn_unlock">Déverrouiller</string>
+ <string name="btn_add_keyserver">Ajouter</string>
+ <string name="btn_save_default">Enregistrer comme valeur par défaut</string>
+ <string name="btn_saved">Enregistré !</string>
<!--menu-->
<string name="menu_preferences">Paramètres</string>
<string name="menu_help">Aide</string>
@@ -91,7 +95,7 @@
<string name="menu_select_all">Tout sélectionner</string>
<string name="menu_export_all_keys">Exporter toutes les clefs</string>
<string name="menu_update_all_keys">Mettre toutes les clefs à jour</string>
- <string name="menu_advanced">Afficher les infos avancées</string>
+ <string name="menu_advanced">Informations détaillées</string>
<string name="menu_certify_fingerprint">Confirmer par une comparaison d\'empreinte</string>
<string name="menu_export_log">Exporter le journal</string>
<!--label-->
@@ -99,32 +103,33 @@
<string name="label_file">Fichier</string>
<string name="label_files">Fichier(s)</string>
<string name="label_file_colon">Fichier :</string>
- <string name="label_no_passphrase">Aucune phrase de passe</string>
- <string name="label_passphrase">Phrase de passe</string>
+ <string name="label_no_passphrase">Aucun mot de passe</string>
+ <string name="label_passphrase">Mot de passe</string>
<string name="label_unlock">Déverrouillage...</string>
- <string name="label_passphrase_again">Répéter la phrase de passe</string>
- <string name="label_show_passphrase">Montrer la phrase de passe</string>
+ <string name="label_passphrase_again">Répéter le mot de passe</string>
+ <string name="label_show_passphrase">Montrer le mot de passe</string>
<string name="label_algorithm">Algorithme</string>
<string name="label_ascii_armor">Fichier ASCII Armor</string>
- <string name="label_file_ascii_armor">Activer l\'Armure ASCII</string>
+ <string name="label_file_ascii_armor">Activer l\'armure ASCII</string>
<string name="label_write_version_header">Faire savoir aux autres que vous utilisez OpenKeychain</string>
<string name="label_write_version_header_summary">Ajoute « OpenKeychain v2.7 » aux signatures OpenPGP, aux cryptogrammes et aux clefs exportées</string>
- <string name="label_use_default_yubikey_pin">Utiliser le NIP par défaut de la Yubikey</string>
- <string name="label_use_num_keypad_for_yubikey_pin">Utiliser le pavé numérique pour le NIP Yubikey</string>
- <string name="label_label_use_default_yubikey_pin_summary">Utilise le NIP par défaut (123456) pour accéder aux Yubikeys par la NFC</string>
+ <string name="label_use_default_yubikey_pin">Utiliser le NIP par défaut de la clef Yubi</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">Utiliser le pavé numérique pour le NIP de la clef Yubi</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Utilise le NIP par défaut (123456) pour accéder aux clefs Yubi par la NFC</string>
<string name="label_asymmetric_from">Signé par :</string>
<string name="label_to">Chiffrer pour :</string>
<string name="label_delete_after_encryption">Supprimer les fichiers après chiffrement</string>
<string name="label_delete_after_decryption">Supprimer le fichier après le déchiffrement</string>
<string name="label_encryption_algorithm">Algorithme de chiffrement</string>
<string name="label_hash_algorithm">Algorithme de hachage</string>
- <string name="label_symmetric">Chiffrer avec une phrase de passe</string>
- <string name="label_passphrase_cache_ttl">Durée du cache</string>
- <string name="label_passphrase_cache_subs">Mettre en cache une phrase de passe par sous-clef</string>
+ <string name="label_symmetric">Chiffrer avec un mot de passe</string>
+ <string name="label_passphrase_cache_ttl">Délai de mémorisation</string>
+ <string name="label_passphrase_cache_subs">Mémoriser les mots de passe par sous-clefs</string>
<string name="label_message_compression">Compression de texte</string>
<string name="label_file_compression">Compression des fichiers</string>
- <string name="label_keyservers">Serveurs de clefs</string>
+ <string name="label_keyservers">Choisir les serveurs de clefs OpenPGP</string>
<string name="label_key_id">ID de clef</string>
+ <string name="label_key_created">Clef créée %s</string>
<string name="label_creation">Création</string>
<string name="label_expiry">Expiration</string>
<string name="label_usage">Utilisation</string>
@@ -142,10 +147,12 @@
<string name="label_enable_compression">Activer la compression</string>
<string name="label_encrypt_filenames">Chiffrer les nom de fichier</string>
<string name="label_hidden_recipients">Cacher les destinataires</string>
- <string name="pref_keyserver">Rechercher dans le serveur de clef</string>
- <string name="pref_keyserver_summary">Rechercher dans le serveur de clef HKP</string>
- <string name="pref_keybase">Rechercher dans Keybase.io</string>
- <string name="pref_keybase_summary">Rechercher dans l\'index de Keybase.io</string>
+ <string name="label_verify_keyserver">Vérifier le serveur de clefs</string>
+ <string name="label_enter_keyserver_url">Saisir l\'URL du serveur de clefs</string>
+ <string name="pref_keyserver">Serveurs de clefs OpenPGP</string>
+ <string name="pref_keyserver_summary">Rechercher les clefs dans les serveurs de clefs OpenPGP choisis (protocole HKP)</string>
+ <string name="pref_keybase">keybase.io</string>
+ <string name="pref_keybase_summary">Rechercher les clefs sur keybase.io</string>
<string name="user_id_no_name">&lt;aucun nom&gt;</string>
<string name="none">&lt;aucune&gt;</string>
<plurals name="n_keys">
@@ -185,23 +192,23 @@
<string name="flag_encrypt">Chiffrer</string>
<string name="flag_authenticate">Authentifier</string>
<!--sentences-->
- <string name="wrong_passphrase">Phrase de passe erronée</string>
+ <string name="wrong_passphrase">Mot de passe erroné.</string>
<string name="no_filemanager_installed">Aucun gestionnaire de fichiers compatible installé.</string>
- <string name="passphrases_do_not_match">Les phrases de passe ne correspondent pas.</string>
- <string name="passphrase_must_not_be_empty">Veuillez saisir une phrase de passe</string>
+ <string name="passphrases_do_not_match">Les mots de passe ne correspondent pas.</string>
+ <string name="passphrase_must_not_be_empty">Veuillez saisir un mot de passe.</string>
<string name="passphrase_for_symmetric_encryption">Chriffrement symétrique.</string>
- <string name="passphrase_for">Saisir une phrase de passe pour « %s »</string>
+ <string name="passphrase_for">Saisir le mot de passe pour « %s »</string>
<string name="pin_for">Saisir le NIP pour « %s »</string>
- <string name="yubikey_pin_for">Saisir le NIP pour accéder à la Yubikey pour « %s »</string>
- <string name="nfc_text">Tenez la YubiKey contre le dos de votre appareil.</string>
+ <string name="yubikey_pin_for">Saisir le NIP pour accéder à la clef Yubi pour « %s »</string>
+ <string name="nfc_text">Tenez la clef Yubi contre le dos de votre appareil.</string>
<string name="file_delete_confirmation_title">Supprimer les fichiers originaux ?</string>
<string name="file_delete_confirmation">Les fichiers suivants seront détruits : %s</string>
<string name="file_delete_successful">%1$d fichiers sur %2$d ont déjà été supprimés. %3$s</string>
- <string name="no_file_selected">Choisir d\'abord un fichier.</string>
+ <string name="no_file_selected">Aucun fichier choisi.</string>
<string name="encrypt_sign_successful">Signé et/ou chiffré avec succès.</string>
<string name="encrypt_sign_clipboard_successful">Signé et/ou chiffré vers le presse-papiers avec succès.</string>
<string name="select_encryption_key">Choisir au moins une clef de chiffrement.</string>
- <string name="error_no_encryption_or_signature_key">Choisir au moins une clef de chiffrement ou de signature.</string>
+ <string name="error_no_encryption_or_signature_key">Choisir au moins une clef de chiffrement ou une clef de signature.</string>
<string name="specify_file_to_encrypt_to">Veuillez spécifier vers quel fichier chiffrer.\nAVERTISSEMENT : le fichier sera écrasé s\'il existe !</string>
<string name="specify_file_to_decrypt_to">Veuillez spécifier vers quel fichier déchiffrer.\nAVERTISSEMENT : le fichier sera écrasé s\'il existe !</string>
<string name="specify_file_to_export_to">Veuillez spécifier vers quel fichier exporter.\nAVERTISSEMENT : le fichier sera écrasé s\'il existe !</string>
@@ -237,34 +244,36 @@
<string name="error_external_storage_not_ready">le stockage externe n\'est pas prêt</string>
<string name="error_key_size_minimum512bit">la taille de la clef doit être d\'au moins 512 bits</string>
<string name="error_unknown_algorithm_choice">choix d\'algorhitme inconnu</string>
- <string name="error_user_id_no_email">aucun courriel trouvé</string>
+ <string name="error_user_id_no_email">aucune adresse courriel trouvée</string>
<string name="error_key_needs_a_user_id">au moins une identité est nécessaire</string>
- <string name="error_no_signature_passphrase">aucune phrase de passe n\'a été donnée</string>
+ <string name="error_no_signature_passphrase">aucun mot de passé n\'a été donné</string>
<string name="error_no_signature_key">aucune clef de signature n\'a été donnée</string>
<string name="error_invalid_data">Aucun contenu OpenPGP valide chiffré ou signé !</string>
<string name="error_integrity_check_failed">la vérification de l\'intégrité a échoué ! Les données ont été modifiées !</string>
- <string name="error_wrong_passphrase">phrase de passe erronnée</string>
+ <string name="error_wrong_passphrase">mot de passe erroné</string>
<string name="error_could_not_extract_private_key">impossible d\'extraire la clef privée</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Il vous faut Android 4.1 pour utiliser la fonction Beam NFC d\'Android !</string>
<string name="error_nfc_needed">La NFC doit être activée !</string>
<string name="error_beam_needed">Beam doit être activé !</string>
<string name="error_nothing_import">Aucune clef trouvée !</string>
+ <string name="error_nothing_import_selected">Aucune clef sélectionnée pour l\'importation !</string>
<string name="error_contacts_key_id_missing">Échec lors de la récupération de l\'ID de clef à partir des contacts !</string>
<string name="error_generic_report_bug">Une erreur générique est survenue, veuillez créer un nouveau rapport de bogue pour OpenKeychain.</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">Non signé</string>
<string name="decrypt_result_invalid_signature">Signature invalide !</string>
- <string name="decrypt_result_signature_uncertified">Signé par (non certifié)</string>
- <string name="decrypt_result_signature_certified">Signé par</string>
- <string name="decrypt_result_signature_expired_key">La clef est expirée !</string>
- <string name="decrypt_result_signature_revoked_key">La clef a été révoquée !</string>
- <string name="decrypt_result_signature_missing_key">Clef publique inconnue</string>
+ <string name="decrypt_result_signature_uncertified">Signé par un clef <b>non confirmée</b></string>
+ <string name="decrypt_result_signature_secret">Signé par votre clef</string>
+ <string name="decrypt_result_signature_certified">Signé par une clef confirmée</string>
+ <string name="decrypt_result_signature_expired_key">Signé par une clef <b>expirée</b> !</string>
+ <string name="decrypt_result_signature_revoked_key">Signé par une clef <b>révoquée</b> !</string>
+ <string name="decrypt_result_signature_missing_key">Signé par une <b>clef publique inconnue</b></string>
<string name="decrypt_result_encrypted">Chiffré</string>
<string name="decrypt_result_not_encrypted">Non chiffré</string>
<string name="decrypt_result_action_show">Montrer</string>
<string name="decrypt_result_action_Lookup">Rechercher</string>
- <string name="decrypt_invalid_text">Soit la signature est invalide, soit la clef a été révoquée/est expirée. Vous ne pouvez pas être sûr de qui a écrit le texte. Voulez-vous quand même l\'afficher ?</string>
+ <string name="decrypt_invalid_text">Soit la signature est invalide, soit la clef a été révoquée. Vous ne pouvez pas être certain de l\'identité du rédacteur du texte. Voulez-vous quand même l\'afficher ?</string>
<string name="decrypt_invalid_button">Je comprends les risques, affichez-le !</string>
<!--Add keys-->
<string name="add_keys_my_key">Ma clef :</string>
@@ -294,11 +303,12 @@
<string name="progress_modify_subkeyrevoke">révocation des sous-clefs...</string>
<string name="progress_modify_subkeystrip">dépouillement des sous-clefs...</string>
<string name="progress_modify_subkeyadd">ajout des sous-clefs...</string>
- <string name="progress_modify_passphrase">changement de la phrase de passe...</string>
+ <string name="progress_modify_passphrase">modification du mot passe...</string>
<plurals name="progress_exporting_key">
<item quantity="one">exportation de la clef...</item>
<item quantity="other">exportation des clefs...</item>
</plurals>
+ <string name="progress_start">préparation de l\'opération...</string>
<string name="progress_extracting_signature_key">extraction de la clef de signature...</string>
<string name="progress_extracting_key">extraction de la clef...</string>
<string name="progress_preparing_streams">préparation des flux...</string>
@@ -318,6 +328,7 @@
<string name="progress_deleting">suppression des clefs...</string>
<string name="progress_con_saving">consolider : enregistrement dans le cache...</string>
<string name="progress_con_reimport">consolider : réimportation...</string>
+ <string name="progress_verifying_keyserver_url">vérification du serveur de clefs...</string>
<!--action strings-->
<string name="hint_cloud_search_hint">Chercher par nom, adresse courriel...</string>
<!--key bit length selections-->
@@ -359,9 +370,12 @@
<string name="import_tab_qr_code">Code QR/NFC</string>
<string name="import_import">Importer les clefs choisies</string>
<string name="import_qr_code_wrong">Code QR incorrecte ! Veuillez réessayer !</string>
- <string name="import_qr_code_too_short_fingerprint">L\'empreinte est trop courte (&lt; 16 caractères)</string>
- <string name="import_qr_code_button">Balayer le code QR</string>
+ <string name="import_qr_code_fp">L\'empreinte est malformée ou trop courte !</string>
+ <string name="import_qr_code_too_short_fingerprint">L\'empreinte est trop courte !</string>
+ <string name="import_qr_code_button">Lire le code QR</string>
<string name="import_qr_code_text">Placez votre appareil photo au-dessus du code QR !</string>
+ <!--Import from URL-->
+ <string name="import_url_warn_no_search_parameter">Aucune demande de recherche n\'a été définie. Vous pouvez quand même effectuer une recherche manuelle sur le serveur de clefs.</string>
<!--Generic result toast-->
<string name="snackbar_details">Détails</string>
<string name="with_warnings">, avec des avertissements</string>
@@ -431,10 +445,10 @@
<string name="intent_send_encrypt">Chiffrer avec OpenKeychain</string>
<string name="intent_send_decrypt">Déchiffrer avec OpenKeychain</string>
<!--Remote API-->
- <string name="api_settings_show_info">Afficher les informations avancées</string>
- <string name="api_settings_hide_info">Masquer les informations avancées</string>
- <string name="api_settings_show_advanced">Afficher les paramètres avancés</string>
- <string name="api_settings_hide_advanced">Masquer les paramètres avancés</string>
+ <string name="api_settings_show_info">Montrer les informations détaillées</string>
+ <string name="api_settings_hide_info">Cacher les informations détaillées</string>
+ <string name="api_settings_show_advanced">Montrer les paramètres avancés</string>
+ <string name="api_settings_hide_advanced">Cacher les paramètres avancés</string>
<string name="api_settings_no_key">Aucune clef choisie</string>
<string name="api_settings_select_key">Choisir une clef</string>
<string name="api_settings_create_key">Créer une nouvelle clef</string>
@@ -446,8 +460,8 @@
<string name="api_settings_delete_account">Supprimer le compte</string>
<string name="api_settings_package_name">Nom du paquet</string>
<string name="api_settings_package_signature">SHA-256 de la signature du paquet</string>
- <string name="api_settings_accounts">Comptes (API dépréciée)</string>
- <string name="api_settings_advanced">Informations avancées</string>
+ <string name="api_settings_accounts">Comptes (ancienne API)</string>
+ <string name="api_settings_advanced">Informations détaillées</string>
<string name="api_settings_allowed_keys">Clefs autorisées</string>
<string name="api_settings_settings">Paramètres</string>
<string name="api_settings_key">Clef du compte :</string>
@@ -464,6 +478,7 @@
<string name="api_select_pub_keys_text_no_user_ids">Veuillez choisir les destinataires !</string>
<string name="api_error_wrong_signature">La vérification de la signature a échoué ! Avez-vous installé cette appli à partir d\'une source différente ? Si vous êtes sûr que ce n\'est pas une attaque, révoquez l\'enregistrement de cette appli dans OpenKeychain et enregistrez-la à nouveau.</string>
<string name="api_select_sign_key_text">Veuillez choisir une de vos clefs existantes ou en créer une nouvelle.</string>
+ <string name="api_select_keys_text">Aucune clef autorisée n\'est capable de déchiffrer le contenu. Veuillez choisir les clefs autorisées.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Partager par un code QR</string>
<string name="share_nfc_dialog">Partager par la NFC</string>
@@ -507,7 +522,7 @@
<string name="key_trust_no_cloud_evidence">Aucune preuve de fiabilité provenant du nuage pour cette clef.</string>
<string name="key_trust_start_cloud_search">Lancer la recherche</string>
<string name="key_trust_results_prefix">Keybase.io offre des « preuves » affirmant que le propriétaire de cette clef : </string>
- <string name="key_trust_header_text">Note : les preuves de keybase.io sont une fonction expérimentales d\'OpenKeychain. Nous vous encourageons à balayer des codes QR ou à échanger des clefs via NFC en plus de les confirmer.</string>
+ <string name="key_trust_header_text">Note : les preuves de keybase.io sont une fonction expérimentales d\'OpenKeychain. Nous vous encourageons à lire des codes QR ou à échanger des clefs via NFC en plus de les confirmer.</string>
<!--keybase proof stuff-->
<string name="keybase_narrative_twitter">Publie vers Twitter en tant que</string>
<string name="keybase_narrative_github">Est connu sur GitHub en tant que</string>
@@ -538,7 +553,7 @@
<string name="keybase_reddit_attribution">attribué par Reddit à</string>
<string name="keybase_verify">Vérifier</string>
<!--Edit key-->
- <string name="edit_key_action_change_passphrase">Changer la phrase de passe</string>
+ <string name="edit_key_action_change_passphrase">Changer le mot de passe</string>
<string name="edit_key_action_add_identity">Ajouter une identité</string>
<string name="edit_key_action_add_subkey">Ajouter une sous-clef</string>
<string name="edit_key_edit_user_id_title">Choisir une action !</string>
@@ -555,36 +570,46 @@
<item>Changer l\'expiration</item>
<item>Révoquer la sous-clef</item>
<item>Dépouiller la sous-clef</item>
- <item>"Move Subkey to Yubikey / Smart Card"</item>
+ <item>Déplacer la sous-clef vers la clef Yubi / carte à puce</item>
</string-array>
<string name="edit_key_new_subkey">nouvelle sous-clef</string>
<string name="edit_key_select_flag">Veuillez sélectionner au moins un drapeau !</string>
<string name="edit_key_error_add_identity">Ajouter au moins une identité !</string>
<string name="edit_key_error_add_subkey">Ajouter au moins une sous-clef !</string>
+ <string name="edit_key_error_bad_nfc_algo">L’algorithme n\'est pas pris en charge par cette carte à puce ! </string>
+ <string name="edit_key_error_bad_nfc_size">La taille de clef n\'est pas prise en charge par la carte à puce !</string>
+ <string name="edit_key_error_bad_nfc_stripped">Impossible de déplacer la clef vers la carte à puce (soit dépouillée, soit « dévier-vers-la-carte ») !</string>
<!--Create key-->
<string name="create_key_upload">Synchroniser avec le nuage</string>
<string name="create_key_empty">Ce champ est exigé</string>
- <string name="create_key_passphrases_not_equal">Les phrases de passe ne correspondent pas</string>
+ <string name="create_key_passphrases_not_equal">Les mots de passe ne correspondent pas</string>
<string name="create_key_final_text">Vous avez saisie l\'identité suivante :</string>
<string name="create_key_final_robot_text">Créer une clef peut prendre du temps, prenez donc un café en attendant...</string>
<string name="create_key_rsa">(3 sous-clefs, RSA, 4096 bits)</string>
<string name="create_key_custom">(configuration personnalisée de la clef)</string>
<string name="create_key_name_text">Choisissez un nom associé à cette clef. Ce peut être un nom complet, p. ex. « Maxime Tremblay », ou un pseudo, p. ex. « Maxou ».</string>
<string name="create_key_email_text">Saisissez votre adresse courriel principale utilisée pour les communications sécurisées.</string>
- <string name="create_key_passphrase_text">Choisissez une phrase de passe forte. Elle protège votre clef en cas de vol de votre appareil.</string>
+ <string name="create_key_passphrase_text">Choisissez un mot de passe fort. Il protège votre clef en cas de vol de votre appareil.</string>
<string name="create_key_hint_full_name">Nom complet ou pseudo</string>
<string name="create_key_edit">Changer la configuration de la clef</string>
<string name="create_key_add_email">Ajouter une adresse courriel</string>
<string name="create_key_add_email_text">Des adresses courriel supplémentaires sont aussi associées à cette clef et peuvent être utilisées pour des communications sécurisées.</string>
- <string name="create_key_email_already_exists_text">Le courriel a déjà été ajouté</string>
+ <string name="create_key_email_already_exists_text">L\'adresse courriel a déjà été ajoutée</string>
+ <string name="create_key_email_invalid_email">Le format de l\'adresse courriel est invalide</string>
<!--View key-->
<string name="view_key_revoked">Révoquée : la clef ne doit plus être utilisée !</string>
<string name="view_key_expired">Expirée : le contact doit prolonger la validité de la clef !</string>
<string name="view_key_expired_secret">Expirée : vous pouvez prolonger la validité de la clef en la modifiant !</string>
<string name="view_key_my_key">Ma clef</string>
<string name="view_key_verified">Clef confirmée</string>
- <string name="view_key_unverified">Non confirmée : balayez le code QR pour confirmer la clef !</string>
+ <string name="view_key_unverified">Non confirmée : lisez le code QR pour confirmer la clef !</string>
<string name="view_key_fragment_no_system_contact">&lt;aucun&gt;</string>
+ <!--Add keyserver-->
+ <string name="add_keyserver_dialog_title">Ajouter un serveur de clefs</string>
+ <string name="add_keyserver_verified">Le serveur de clefs a été vérifié !</string>
+ <string name="add_keyserver_without_verification">Le serveur de clefs a été ajouté sans vérification.</string>
+ <string name="add_keyserver_invalid_url">URL invalide !</string>
+ <string name="add_keyserver_connection_failed">Échec de connexion au serveur de clefs. Veuillez vérifier l\'URL et votre connexion Internet.</string>
<!--Navigation Drawer-->
<string name="nav_keys">Clefs</string>
<string name="nav_encrypt_decrypt">Chiffrer/déchiffrer</string>
@@ -601,8 +626,8 @@
<string name="cert_positive">positif</string>
<string name="cert_revoke">révoqué</string>
<string name="cert_verify_ok">OK</string>
- <string name="cert_verify_failed">échec!</string>
- <string name="cert_verify_error">erreur!</string>
+ <string name="cert_verify_failed">échec !</string>
+ <string name="cert_verify_error">erreur !</string>
<string name="cert_verify_unavailable">clef non disponible</string>
<!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
<string name="msg_internal_error">Erreur interne !</string>
@@ -666,7 +691,7 @@
<string name="msg_ip_success_identical">Le trousseau ne contient pas de nouvelle donnée, rien à faire</string>
<string name="msg_ip_reinsert_secret">Réinsertion de la clef secrète</string>
<string name="msg_ip_uid_cert_bad">Un mauvais certificat a été rencontré !</string>
- <string name="msg_ip_uid_cert_error">Erreur lors du traitement du certificat !</string>
+ <string name="msg_ip_uid_cert_error">Erreur de traitement du certificat !</string>
<string name="msg_ip_uid_cert_nonrevoke">Il y a déjà un certificat non-révocable, étape ignorée.</string>
<string name="msg_ip_uid_cert_old">Le certificat est plus ancien que le précédent, étape ignorée.</string>
<string name="msg_ip_uid_cert_new">Le certificat est plus récent, remplacement du précédent.</string>
@@ -703,7 +728,7 @@
<string name="msg_is_bad_type_uncanon">Tentative d\'importer un trousseau sans canonicalisation. Ceci est un bogue, veuillez remplir un rapport !</string>
<!--Import Secret log entries-->
<string name="msg_is">Importation de la clef secrète %s</string>
- <string name="msg_is_db_exception">Erreur de base de données!</string>
+ <string name="msg_is_db_exception">Erreur de base de données !</string>
<string name="msg_is_importing_subkeys">Traitement des sous-clefs secrètes</string>
<string name="msg_is_error_io_exc">Erreur d\'encodage du trousseau</string>
<string name="msg_is_merge_public">Fusion des données importées dans le trousseau public existant</string>
@@ -712,10 +737,10 @@
<string name="msg_is_pubring_generate">Génération du trousseau public à partir du trousseau secret</string>
<string name="msg_is_subkey_nonexistent">La sous-clef %s n\'est pas disponible dans la clef secrète</string>
<string name="msg_is_subkey_ok">Marquer la sous-clef secrète %s comme disponible</string>
- <string name="msg_is_subkey_empty">Marquer la sous-clef secrète %s comme disponible, avec une phrase de passe vide</string>
+ <string name="msg_is_subkey_empty">La sous-clef secrète %s a été marquée comme disponible, sans mot de passe</string>
<string name="msg_is_subkey_pin">La sous-clef secrète %s a été marquée comme disponible, avec un NIP</string>
<string name="msg_is_subkey_stripped">Marquer la sous-clef secrète %s comme dépouillée</string>
- <string name="msg_is_subkey_divert">Marquer la sous-clef secrète %s comme « dévier vers la carte intelligente/la NFC »</string>
+ <string name="msg_is_subkey_divert">Marquer la sous-clef secrète %s comme « dévier-vers-la-carte »</string>
<string name="msg_is_success_identical">Le trousseau ne contient pas de nouvelle donnée, rien à faire</string>
<string name="msg_is_success">Importation du trousseau secret réussie</string>
<!--Keyring Canonicalization log entries-->
@@ -742,6 +767,7 @@
<string name="msg_kc_sub_bad_local">Suppression du certificat de liaison de la sous-clef ayant le drapeau « local »</string>
<string name="msg_kc_sub_bad_keyid">L\'ID de l\'émetteur de la liaison de la sous-clef ne correspond pas</string>
<string name="msg_kc_sub_bad_time">Suppression du certificat de liaison de la sous-clef ayant une estampille temporelle dans le futur</string>
+ <string name="msg_kc_sub_bad_time_early">L\'estampille temporelle du certificat de liaison de la sous-clef est antérieur à celui de la clef !</string>
<string name="msg_kc_sub_bad_type">Type de certificat de sous-clef inconnu : %s</string>
<string name="msg_kc_sub_dup">Suppression du certificat redondant de liaison de sous-clef</string>
<string name="msg_kc_sub_primary_bad">Suppression du certificat de liaison de la sous-clef à cause d\'un certificat de liaison principal invalide</string>
@@ -818,7 +844,8 @@
<string name="msg_cr_error_flags_ecdh">Les drapeaux de clef choisis sont incorrects, ECDH ne peut pas être utilisé pour le chiffrement ! </string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Modification du trousseau %s</string>
- <string name="msg_mf_error_divert_serial">Le numéro de série d\'une clef diriger-vers-la-carte doit avoir 16 bytes ! Ceci est une erreur de programmation, veuillez remplir un rapport de bogue !</string>
+ <string name="msg_mf_divert">Déviera vers la carte à puce pour les opérations de chiffrement</string>
+ <string name="msg_mf_error_divert_serial">Le numéro de série d\'une clef « dévier-vers-la-carte » doit avoir 16 bytes ! Ceci est une erreur de programmation, veuillez remplir un rapport de bogue !</string>
<string name="msg_mf_error_encode">Exception d\'encodage !</string>
<string name="msg_mf_error_fingerprint">L\'empreinte de clef effective ne correspond pas à celle attendue !</string>
<string name="msg_mf_error_keyid">Aucune ID de clef. Ceci est une erreur interne, veuillez remplir un rapport de bogue !</string>
@@ -826,28 +853,37 @@
<string name="msg_mf_error_master_none">Aucun certificat maître sur lequel se basé n\'a été trouvé ! (Tous révoqués ?)</string>
<string name="msg_mf_error_noexist_primary">Mauvais ID utilisateur principal spécifié !</string>
<string name="msg_mf_error_noexist_revoke">Mauvais ID utilisateur spécifié pour la révocation !</string>
- <string name="msg_mf_error_restricted">Tentative d\'exécution d\'une opération restreinte sans phrase de passe ! Ceci est une erreur de programmation, veuillez remplir un rapport de bogue !</string>
+ <string name="msg_mf_error_restricted">Tentative d\'exécution d\'une opération restreinte sans mot de passe ! Ceci est une erreur de programmation, veuillez remplir un rapport de bogue !</string>
<string name="msg_mf_error_revoked_primary">Les ID utilisateurs révoqués ne peuvent pas être principaux !</string>
<string name="msg_mf_error_null_expiry">L\'expiration ne peut pas être « pareille qu\'avant » lors de la création de sous-clefs. Ceci est une erreur de programmation, veuillez remplir un rapport de bogue !</string>
- <string name="msg_mf_error_passphrase_master">Erreur fatale lors du déchiffrement de la clef maîtresse ! Ceci est probablement une erreur de programmation, veuillez remplir un rapport de bogue !</string>
+ <string name="msg_mf_error_noop">Rien à faire !</string>
+ <string name="msg_mf_error_passphrase_master">Erreur fatale de déchiffrement de la clef maîtresse ! Ceci est probablement une erreur de programmation, veuillez remplir un rapport de bogue !</string>
<string name="msg_mf_error_pgp">Erreur interne OpenPGP !</string>
<string name="msg_mf_error_sig">Exception de signature !</string>
+ <string name="msg_mf_error_subkey_missing">Une action a été tentée sur la sous-clef manquante %s !</string>
+ <string name="msg_mf_error_conflicting_nfc_commands">Impossible de déplacer la clef vers la carte à puce dans une même opération créant une signature sur la carte.</string>
+ <string name="msg_mf_error_duplicate_keytocard_for_slot">La carte à puce ne prend en charge qu\'un emplacement par type de clef.</string>
+ <string name="msg_mf_error_invalid_flags_for_keytocard">Drapeaux de clef inadéquats pour la clef de carte à puce.</string>
<string name="msg_mf_master">Modification des certifications maîtresses</string>
<string name="msg_mf_notation_empty">Ajout d\'un paquet de notation vide</string>
<string name="msg_mf_notation_pin">Ajout d\'un paquet de notation NIP</string>
- <string name="msg_mf_passphrase">Changement de la phrase de passe pour le trousseau</string>
- <string name="msg_mf_passphrase_key">Rechiffrement de la sous-clef %s avec la nouvelle phrase de passe</string>
- <string name="msg_mf_passphrase_empty_retry">Échec lors de la définition de la nouvelle phrase de passe, nouvel essai avec une ancienne phrase de passe vide</string>
- <string name="msg_mf_passphrase_fail">La phrase de passe de la sous-clef n\'a pas pu être changée ! (Est-elle différente des autres clefs ?)</string>
+ <string name="msg_mf_passphrase">Changement de mot de passe pour le trousseau</string>
+ <string name="msg_mf_passphrase_key">Rechiffrement de la sous-clef %s avec un nouveau mot de passe</string>
+ <string name="msg_mf_passphrase_empty_retry">Échec lors de la définition du nouveau mot de passe, nouvel essai avec un ancien mot de passe vide</string>
+ <string name="msg_mf_passphrase_fail">Le mot de passe de la sous-clef n\'a pas pu être changé ! (Est-il différent des autres clefs ?)</string>
<string name="msg_mf_primary_replace_old">Remplacement du certificat de l\'ID utilisateur principal précédent</string>
<string name="msg_mf_primary_new">Génération d\'un nouveau certificat pour le nouvel ID utilisateur principal</string>
+ <string name="msg_mf_restricted_mode">Changement vers le mode opérationnel restreint</string>
<string name="msg_mf_subkey_change">Modification de la sous-clef %s</string>
- <string name="msg_mf_error_subkey_missing">Une action a été tentée sur la sous-clef manquante %s !</string>
+ <string name="msg_mf_require_divert">Déviation vers la carte à puce pour les opérations de chiffrement</string>
+ <string name="msg_mf_require_passphrase">Mot de passe exigé pour les opérations</string>
<string name="msg_mf_subkey_new">Ajout d\'une nouvelle sous-clef de type %s</string>
<string name="msg_mf_subkey_new_id">Nouvelle ID de sous-clef : %s</string>
<string name="msg_mf_error_past_expiry">La date d\'expiration ne peut pas être dans le passé !</string>
<string name="msg_mf_subkey_revoke">Révocation de la sous-clef %s</string>
<string name="msg_mf_subkey_strip">Dépouillement de la sous-clef %s</string>
+ <string name="msg_mf_keytocard_start">Déplacement de la sous-clef %s vers la carte à puce</string>
+ <string name="msg_mf_keytocard_finish">%1$s déplacé vers la carte à puce %2$s</string>
<string name="msg_mf_success">Trousseau modifié avec succès</string>
<string name="msg_mf_uid_add">Ajout de l\'ID utilisateur %s</string>
<string name="msg_mf_uid_primary">Changement de l\'ID utilisateur principal en %s</string>
@@ -892,19 +928,20 @@
<string name="msg_con_warn_delete_secret">Une exception a eu lieu lors de la suppression du fichier de cache secret</string>
<!--Edit Key (higher level than modify)-->
<string name="msg_ed">Exécution de l\'opération sur la clef</string>
- <string name="msg_ed_caching_new">Mise en cache de la nouvelle phrase de passe</string>
+ <string name="msg_ed_caching_new">Mise en cache du nouveau mot de passe</string>
<string name="msg_ed_error_no_parcel">SaveKeyringParcel absent ! (Ceci est un bogue, veuillez le rapporter)</string>
<string name="msg_ed_error_key_not_found">Clef introuvable !</string>
<string name="msg_ed_fetching">Obtention de la clef à modifier (%s)</string>
<string name="msg_ed_success">Opération sur la clef réussie</string>
<!--Promote key-->
<string name="msg_pr">Promotion de la clef publique en clef secrète</string>
- <string name="msg_pr_error_already_secret">La clef est déjà une clef secrète !</string>
+ <string name="msg_pr_all">Promotion de toutes les sous-clefs</string>
<string name="msg_pr_error_key_not_found">Clef introuvable !</string>
<string name="msg_pr_fetching">Obtention de la clef à modifier (%s)</string>
+ <string name="msg_pr_subkey_match">Promotion de la sous-clef : %s</string>
+ <string name="msg_pr_subkey_nomatch">La sous-clef n\'est pas sur la clef Yubi : %s</string>
<string name="msg_pr_success">Clef promue avec succès</string>
<!--Other messages used in OperationLogs-->
- <string name="msg_ek_error_divert">La modification des clefs NFC n\'est pas (encore) prise en charge !</string>
<string name="msg_ek_error_dummy">Impossible de modifier un trousseau avec une clef maîtresse dépouillée !</string>
<string name="msg_ek_error_not_found">Clef introuvable !</string>
<!--Messages for DecryptVerify operation-->
@@ -925,11 +962,12 @@
<string name="msg_dc_clear_signature_ok">La vérification de la signature OK</string>
<string name="msg_dc_clear_signature">Enregistrement des données de signature pour plus tard</string>
<string name="msg_dc_clear">Traitement des données de texte en clair</string>
- <string name="msg_dc_error_bad_passphrase">Erreur de déverrouillage de la clef, phrase de passe erronée !</string>
+ <string name="msg_dc_error_bad_passphrase">Erreur de déverrouillage de la clef, mot de passe erroné !</string>
+ <string name="msg_dc_error_corrupt_data"> Les données sont corrompues !</string>
<string name="msg_dc_error_extract_key">Erreur inconnue de déverrouillage de la clef !</string>
<string name="msg_dc_error_integrity_check">Erreur de vérification de l\'intégrité !</string>
<string name="msg_dc_error_integrity_missing">Vérification de l\'intégrité absente ! Ceci peut arriver car l\'application n\'est pas à jour, ou à cause d\'une attaque par mise à niveau inférieur.</string>
- <string name="msg_dc_error_invalid_data">Aucune donnée de signature valide trouvée !</string>
+ <string name="msg_dc_error_invalid_data">Aucune donnée OpenPGP valide chiffrée ou signée n\'a été trouvée !</string>
<string name="msg_dc_error_io">Une exception E/S a été rencontrée durant l\'opération !</string>
<string name="msg_dc_error_no_data">Aucune donnée chiffrée n\'a été trouvée dans le flux !</string>
<string name="msg_dc_error_no_key">Aucune donnée chiffrée avec une clef secrète connue n\'a été trouvée dans le flux !</string>
@@ -937,9 +975,9 @@
<string name="msg_dc_integrity_check_ok">Vérification de l\'intégrité OK !</string>
<string name="msg_dc_ok_meta_only">Seules les métadonnées ont été demandées, déchiffrement ignoré</string>
<string name="msg_dc_ok">Déchiffrement/Vérification terminé</string>
- <string name="msg_dc_pass_cached">Utilisation de la phrase de passe du cache</string>
+ <string name="msg_dc_pass_cached">Utilisation du mot de passe du cache</string>
<string name="msg_dc_pending_nfc">Jeton NFC exigé, demande de saisie à l\'utilisateur...</string>
- <string name="msg_dc_pending_passphrase">Phrase de passe exigée, demande de saisie à l\'utilisateur...</string>
+ <string name="msg_dc_pending_passphrase">Mot de passe exigé, demande de saisie à l\'utilisateur...</string>
<string name="msg_dc_prep_streams">Préparation des flux pour le déchiffrement</string>
<string name="msg_dc">Début de l\'opération de déchiffrement...</string>
<string name="msg_dc_sym_skip">Données symétriques non autorisées, étape ignorée...</string>
@@ -969,20 +1007,19 @@
<string name="msg_se_error_input_uri_not_found">Erreur d\'ouverture de l\'URI en lecture !</string>
<string name="msg_se_error_output_uri_not_found">Erreur d\'ouverture de l\'URI en écriture !</string>
<string name="msg_se_error_too_many_inputs">Plus d\'entrées spécifiées que de sorties ! Ceci est probablement une erreur de programmation, veuillez remplir un rapport de bogue !</string>
- <string name="msg_se_warn_output_left">Il reste des sorties mais pas d\'entrée. Ceci est probablement une erreur de programmation, veuillez remplir un rapport de bogue !</string>
<string name="msg_se_success">Opération de signature/chiffrement réussie</string>
<!--Messages for PgpSignEncrypt operation-->
<string name="msg_pse_asymmetric">Préparation des clefs publiques pour le chiffrement</string>
<string name="msg_pse_clearsign_only">La signature de texte en clair n\'est pas prise en charge !</string>
<string name="msg_pse_compressing">Préparation de la compression</string>
<string name="msg_pse_encrypting">Chiffrement des données</string>
- <string name="msg_pse_error_bad_passphrase">Phrase de passe erronée !</string>
+ <string name="msg_pse_error_bad_passphrase">Mot de passe erroné !</string>
<string name="msg_pse_error_hash_algo">L’algorithme de hachage demandé n\'est pas pris en charge par cette clef ! </string>
<string name="msg_pse_error_io">Une exception E/S a été rencontrée durant l\'opération !</string>
<string name="msg_pse_error_key_sign">La clef de signature choisie ne peut pas signer les données !</string>
<string name="msg_pse_error_sign_key">Erreur de récupération de la clef de signature !</string>
<string name="msg_pse_error_nfc">Erreur de données NFC !</string>
- <string name="msg_pse_error_no_passphrase">Aucune phrase de passe fournie !</string>
+ <string name="msg_pse_error_no_passphrase">Aucun mot de passe fourni !</string>
<string name="msg_pse_error_pgp">Erreur interne OpenPGP !</string>
<string name="msg_pse_error_sig">Une exception de signature OpenPGP a été rencontrée !</string>
<string name="msg_pse_error_unlock">Erreur inconnue de déverrouillage de la clef !</string>
@@ -991,7 +1028,7 @@
<string name="msg_pse_key_warn">Clef erronée pour le chiffrement : %s</string>
<string name="msg_pse_ok">Opération de signature/chiffrement réussie !</string>
<string name="msg_pse_pending_nfc">Jeton NFC exigé, demande de saisie à l\'utilisateur...</string>
- <string name="msg_pse_pending_passphrase">Phrase de passe exigée, demande de saisie à l\'utilisateur...</string>
+ <string name="msg_pse_pending_passphrase">Mot de passe exigé, demande de saisie à l\'utilisateur...</string>
<string name="msg_pse_signing">Signature des données (sans chiffrement)</string>
<string name="msg_pse_signing_cleartext">Création d\'une signature de texte en clair</string>
<string name="msg_pse_signing_detached">Création d\'une signature détachée</string>
@@ -1011,9 +1048,9 @@
<string name="msg_crt_error_master_not_found">Clef maîtresse introuvable !</string>
<string name="msg_crt_error_nothing">Aucune clef certifiée !</string>
<string name="msg_crt_error_unlock">Erreur de déverrouillage de la clef maîtresse !</string>
- <string name="msg_crt_error_divert">La certification par la NFC n\'est pas (encore) prise en charge !</string>
<string name="msg_crt">Certification des trousseaux</string>
<string name="msg_crt_master_fetch">Récupération de la clef maîtresse de certification</string>
+ <string name="msg_crt_nfc_return">Retour vers l\'écran NFC</string>
<string name="msg_crt_save">Enregistrement de la clef certifiée %s</string>
<string name="msg_crt_saving">Enregistrement des trousseaux</string>
<string name="msg_crt_unlock">Déverrouillage de la clef maîtresse</string>
@@ -1029,13 +1066,14 @@
<string name="msg_import_fetch_error_decode">Erreur de décodage du trousseau récupéré !</string>
<string name="msg_import_fetch_error">La clef n\'a pas pu être récupérée ! (problèmes réseau ?)</string>
<string name="msg_import_fetch_keybase">Récupération en provenance du keybase.io : %s</string>
- <string name="msg_import_fetch_keyserver_error">Impossible de récupérer la clef à partir de la base de clefs !</string>
+ <string name="msg_import_fetch_keyserver_error">Impossible de récupérer la clef sur les serveurs de clefs : %s</string>
<string name="msg_import_fetch_keyserver">Récupération en provenance du serveur de clefs : %s</string>
<string name="msg_import_fetch_keyserver_ok">Récupération de la clef est réussie !</string>
<string name="msg_import_keyserver">Utilisation du serveur de clefs %s</string>
<string name="msg_import_fingerprint_error">L\'empreinte de clef récupérée ne correspond pas à celle attendu !</string>
<string name="msg_import_fingerprint_ok">Vérification de l\'empreinte OK !</string>
<string name="msg_import_merge">Fusion des données récupérées</string>
+ <string name="msg_import_merge_error">Erreur de fusion des données récupérées !</string>
<string name="msg_import_error">Échec lors de l\'opération d\'importation !</string>
<string name="msg_import_error_io">Échec de l\'opération causé par une erreur d\'E/S !</string>
<string name="msg_import_partial">Opération d\'importation réussie, avec des erreurs !</string>
@@ -1076,7 +1114,7 @@
<string name="msg_acc_saved">Compte enregistré</string>
<string name="msg_download_success">Téléchargement réussi !</string>
<string name="msg_download_no_valid_keys">Aucune clef valide n\'a été trouvée dans le fichier/presse-papiers |</string>
- <string name="msg_download_no_pgp_parts">À FAIRE : pluriels !</string>
+ <string name="msg_download_no_pgp_parts">À FAIRE : les pluriels !</string>
<plurals name="error_import_non_pgp_part">
<item quantity="one">une partie du fichier chargé est un objet OpenPGP valide mais pas une clef OpenPGP</item>
<item quantity="other">certaines parties du fichier chargé sont des objets OpenPGP valides mais pas des clefs OpenPGP</item>
@@ -1092,16 +1130,19 @@
<string name="msg_export_log_error_writing">Erreur E/S d\'écriture vers le fichier !</string>
<string name="msg_export_log_success">Journal exporté avec succès !</string>
<!--PassphraseCache-->
- <string name="passp_cache_notif_click_to_clear">Cliquer ici pour effacer les phrases de passe mises en cache</string>
- <string name="passp_cache_notif_n_keys">OpenKeychain a mis en cache %d phrases de passe</string>
- <string name="passp_cache_notif_keys">Phrases de passe mises en cache :</string>
- <string name="passp_cache_notif_clear">Effacer le cache</string>
- <string name="passp_cache_notif_pwd">Phrase de passe</string>
+ <string name="passp_cache_notif_click_to_clear">Toucher pour effacer les mots de passe.</string>
+ <plurals name="passp_cache_notif_n_keys">
+ <item quantity="one">%d mot de passe mémorisé</item>
+ <item quantity="other">%d mots de passe mémorisés</item>
+ </plurals>
+ <string name="passp_cache_notif_keys">Mots de passe mémorisés</string>
+ <string name="passp_cache_notif_clear">Effacer les mots de passe</string>
+ <string name="passp_cache_notif_pwd">Mot de passe</string>
<!--First Time-->
<string name="first_time_text1">Reprenez le contrôle de votre vie privée avec OpenKeychain |</string>
<string name="first_time_create_key">Créer ma clef</string>
<string name="first_time_import_key">Importer la clef d\'un fichier</string>
- <string name="first_time_yubikey">Utiliser YubiKey NEO</string>
+ <string name="first_time_yubikey">Utiliser le NEO de la clef Yubi</string>
<string name="first_time_skip">Ignorer le paramétrage</string>
<!--unsorted-->
<string name="section_certifier_id">Certificateur</string>
@@ -1119,8 +1160,8 @@
<string name="error_key_not_found">Clef introuvable !</string>
<string name="error_key_processing">Erreur de traitement de la clef !</string>
<string name="key_stripped">dépouillée</string>
- <string name="key_divert">dévier vers la carte intelligente/la NFC</string>
- <string name="key_no_passphrase">aucune phrase de passe</string>
+ <string name="key_divert">dévier vers la carte à puce</string>
+ <string name="key_no_passphrase">aucun mot de passe</string>
<string name="key_unavailable">non disponible</string>
<string name="secret_cannot_multiple">Vos propres clefs ne peuvent être supprimées qu\'individuellement !</string>
<string name="title_view_cert">Voir les détails du certificat</string>
@@ -1131,7 +1172,10 @@
<string name="contact_show_key">Montrer la clef (%s)</string>
<string name="swipe_to_update">Glisser vers le bas pour mettre à jour à partir du serveur de clefs</string>
<string name="error_no_file_selected">Choisir au moins un fichier à chiffrer !</string>
- <string name="error_multi_files">L\'enregistrement des fichiers multiples n\'est pas pris en charge. Ceci est actuellement une limitation d\'Android.</string>
+ <string name="error_multi_files">L\'enregistrement de fichiers multiples n\'est pas pris en charge. C\'est une restriction actuelle d\'Android.</string>
+ <string name="error_multi_clipboard">Le chiffrement de fichiers multiples vers le presse-papiers n\'est pas pris en charge.</string>
+ <string name="error_detached_signature">Les opérations de signature seule des fichiers binaires ne sont pas prises en charge. Choisissez au moins une clef de chiffrement.</string>
+ <string name="error_empty_text">Taper un texte à chiffrer !</string>
<string name="key_colon">Clef :</string>
<string name="exchange_description">Pour démarrer un échange de clef, choisir le nombre de participants du côté droit, puis cliquer sur le bouton « Démarrer l\'échange ».\n\Deux questions de plus seront posées pour s\'assurer que seuls les bons participants sont dans l\'échange et que les empreintes sont correctes.</string>
<string name="btn_start_exchange">Démarrer l\'échange</string>
@@ -1139,20 +1183,20 @@
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
<string name="title_unlock_method">Choisir une méthode de déverrouillage</string>
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
- <string name="enter_passphrase">Saisir la phrase de passe</string>
- <string name="passphrase">Phrase de passe</string>
- <string name="noPassphrase">Aucune phrase de passe</string>
- <string name="no_passphrase_set">Aucune phrase de passe définie</string>
- <string name="passphrases_match">Les phrases de passe ne correspondent pas</string>
- <string name="passphrase_saved">Phrase de passe enregistrée</string>
- <string name="passphrase_invalid">Phrase de passe invalide</string>
- <string name="missing_passphrase">Phrase de passe manquante</string>
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
+ <string name="enter_passphrase">Saisir le mot de passe</string>
+ <string name="passphrase">Mot de passe</string>
+ <string name="noPassphrase">Aucun mot de passe</string>
+ <string name="no_passphrase_set">Aucun mot de passe défini</string>
+ <string name="passphrases_match">Les mots de passe ne correspondent pas</string>
+ <string name="passphrase_saved">Mot de passe enregistré</string>
+ <string name="passphrase_invalid">Mot de passe invalide</string>
+ <string name="missing_passphrase">Mot de passe manquant</string>
<string name="passphrase_again">De nouveau</string>
<string name="lockpattern">Schéma de verrouillage</string>
<string name="lockpatternNFC">NFC + schéma de verrouillage</string>
<string name="unlock_method">Méthode de déverrouillage</string>
- <string name="set_passphrase">Définir la phrase de passe</string>
+ <string name="set_passphrase">Définir le mot de passe</string>
<string name="draw_lockpattern">Dessiner le schéma de verrouillage</string>
<string name="nfc_title">NFC</string>
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
@@ -1162,4 +1206,51 @@
<string name="nfc_write_succesful">Écrit avec succès sur la balise NFC</string>
<string name="unlocked">Déverrouillé</string>
<string name="nfc_settings">Paramètres</string>
+ <string name="snack_yubikey_view">Visualiser</string>
+ <string name="snack_yubikey_import">Importer</string>
+ <string name="button_bind_key">Relier la clef</string>
+ <string name="yubikey_serno">No de série : %s</string>
+ <string name="yubikey_key_holder">Détenteur de la clef :</string>
+ <string name="yubikey_key_holder_not_set">Détenteur de la clef : &lt;not set&gt;</string>
+ <string name="yubikey_status_bound">La clef Yubi correspond et est reliée à la clef</string>
+ <string name="yubikey_status_unbound">La clef Yubi correspond et peut être reliée à la clef</string>
+ <string name="yubikey_status_partly">La clef Yubi correspond et est partiellement reliée à la clef</string>
+ <string name="yubikey_create">Tenez la clef Yubi contre le dos de votre appareil.</string>
+ <string name="btn_import">Importer</string>
+ <string name="snack_yubi_other">Une clef différente est stockée sur la clef Yubi !</string>
+ <string name="error_nfc">Erreur NFC ; %s</string>
+ <string name="error_pin">NFC : NIP erroné ; il reste %d essais.</string>
+ <string name="error_nfc_terminated">NFC : carte à puce en état de fin d\'opération</string>
+ <string name="error_nfc_wrong_length">NFC : longueur erronée de données envoyées / reçues</string>
+ <string name="error_nfc_conditions_not_satisfied">NFC : les conditions d\'utilisation ne sont pas satisfaites</string>
+ <string name="error_nfc_security_not_satisfied">NFC : l\'état de sécurité n\'est pas satisfait</string>
+ <string name="error_nfc_authentication_blocked">NFC : NIP bloqué après trop d\'essais</string>
+ <string name="error_nfc_data_not_found">NFC : clef ou objet introuvable</string>
+ <string name="error_nfc_unknown">NFC : erreur inconnue</string>
+ <string name="error_nfc_bad_data">NFC : la carte a signalé des données invalides</string>
+ <string name="error_nfc_chaining_error">NFC : la carte attendait la dernière commande dans une chaîne</string>
+ <string name="error_nfc_header">NFC : la carte a signalé %s bytes invalides</string>
+ <string name="error_pin_nodefault">Le NIP par défaut a été rejeté !</string>
+ <string name="btn_delete_original">Supprimer le fichier original</string>
+ <string name="snack_encrypt_filenames_on">Les noms de fichiers <b>sont</b> chiffrés.</string>
+ <string name="snack_encrypt_filenames_off">Les noms de fichiers <b>ne sont pas</b> chiffrés.</string>
+ <string name="snack_armor_on">Sortie encodée comme texte.</string>
+ <string name="snack_armor_off">Sortie encodée comme exécutable.</string>
+ <string name="snack_compression_on">Compression <b>activée</b>.</string>
+ <string name="snack_compression_off">Compression <b>désactivée</b>.</string>
+ <string name="error_loading_keys">Erreur de chargement des clefs !</string>
+ <string name="error_empty_log">(erreur, journal vide)</string>
+ <string name="error_reading_text">Impossible de lire l\'entrée à déchiffrer !</string>
+ <string name="filename_unknown">&lt;aucun nom de fichier&gt;</string>
+ <string name="filename_unknown_text">&lt;données texte en clair &gt;</string>
+ <string name="intent_show">Montrer le contenu signé/chiffré</string>
+ <string name="view_internal">Visualiser dans OpenKeychain</string>
+ <string name="error_preparing_data">Erreur de préparation des données !</string>
+ <string name="label_clip_title">Données chiffrées</string>
+ <string name="progress_processing">Traitement...</string>
+ <string name="error_saving_file">Erreur d\'enregistrement du fichier !</string>
+ <string name="file_saved">Fichier enregistré !</string>
+ <string name="file_delete_ok">Fichier original supprimé.</string>
+ <string name="file_delete_none">Aucun fichier supprimé (déjà supprimé ?)</string>
+ <string name="file_delete_exception">Impossible de supprimer le fichier original !</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-is/strings.xml b/OpenKeychain/src/main/res/values-is/strings.xml
index 518b80f47..8f84af665 100644
--- a/OpenKeychain/src/main/res/values-is/strings.xml
+++ b/OpenKeychain/src/main/res/values-is/strings.xml
@@ -27,6 +27,7 @@
<!--compression-->
<!--Help-->
<!--Import-->
+ <!--Import from URL-->
<!--Generic result toast-->
<!--Import result toast-->
<!--Delete result toast-->
@@ -41,6 +42,7 @@
<!--Edit key-->
<!--Create key-->
<!--View key-->
+ <!--Add keyserver-->
<!--Navigation Drawer-->
<!--hints-->
<!--certs-->
@@ -65,6 +67,6 @@
<!--unsorted-->
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-it/strings.xml b/OpenKeychain/src/main/res/values-it/strings.xml
index 6ee4fad47..3e05ffe2c 100644
--- a/OpenKeychain/src/main/res/values-it/strings.xml
+++ b/OpenKeychain/src/main/res/values-it/strings.xml
@@ -4,14 +4,19 @@
http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
<string name="app_name">OpenKeychain</string>
<!--title-->
+ <string name="title_encrypt_text">Codifica</string>
+ <string name="title_encrypt_files">Codifica</string>
<string name="title_decrypt">Decodifica</string>
<string name="title_add_subkey">Aggiungi Sottochiave</string>
<string name="title_edit_key">Modifica Chiave</string>
+ <string name="title_preferences">Impostazioni</string>
<string name="title_api_registered_apps">Apps</string>
- <string name="title_change_passphrase">Cambia Frase Di Accesso</string>
+ <string name="title_key_server_preference">Server chiavi OpenPGP</string>
+ <string name="title_change_passphrase">Cambia la password</string>
<string name="title_share_fingerprint_with">Condivi impronta con...</string>
<string name="title_share_key">Condividi chiave con...</string>
<string name="title_share_file">Condividi file con...</string>
+ <string name="title_share_message">Condividi testo con...</string>
<string name="title_encrypt_to_file">Codifica File</string>
<string name="title_decrypt_to_file">Decodifica File</string>
<string name="title_import_keys">Importa Chiavi</string>
@@ -19,24 +24,36 @@
<string name="title_export_keys">Esporta Chiavi</string>
<string name="title_key_not_found">Chiave Non Trovata</string>
<string name="title_send_key">Carica sul Server delle Chiavi</string>
+ <string name="title_certify_key">Conferma chiave</string>
<string name="title_key_details">Dettagli Chiave</string>
<string name="title_help">Aiuto</string>
<string name="title_log_display">Registro</string>
<string name="title_exchange_keys">Scambia le chiavi</string>
- <string name="title_advanced_key_info">Informazioni avanzate sulla chiave</string>
+ <string name="title_advanced_key_info">Informazioni avanzate</string>
+ <string name="title_delete_secret_key">Cancellare la TUA chiave \'%s\'?</string>
+ <string name="title_export_log">Esporta log</string>
+ <string name="title_manage_my_keys">Gestisci le mie chiavi</string>
<!--section-->
<string name="section_user_ids">Identità</string>
+ <string name="section_yubikey">YubiKey</string>
+ <string name="section_should_you_trust">Ci si potrà fidare di questa chiave?</string>
<string name="section_keys">Sottochiavi</string>
<string name="section_cloud_search">Ricerca</string>
- <string name="section_passphrase_cache">Cache Frase di Accesso</string>
+ <string name="section_passphrase_cache">Trattamento Password/PIN</string>
+ <string name="section_certify">Conferma</string>
<string name="section_actions">Azioni</string>
<string name="section_share_key">Chiave</string>
<string name="section_key_server">Server delle Chiavi</string>
<string name="section_fingerprint">Impronta</string>
+ <string name="section_encrypt">Codifica</string>
+ <string name="section_decrypt">Decodifica / verifica</string>
+ <string name="section_current_expiry">Scadenza attuale</string>
+ <string name="section_new_expiry">Nuova scadenza</string>
<!--button-->
<string name="btn_decrypt_verify_file">Decodifica, verifica e salva su file</string>
<string name="btn_encrypt_share_file">Codifica e condividi file</string>
- <string name="btn_save">Salva</string>
+ <string name="btn_encrypt_save_file">Codifica e salva file</string>
+ <string name="btn_view_log">Mostra log</string>
<string name="btn_do_not_save">Annulla</string>
<string name="btn_delete">Elimina</string>
<string name="btn_no_date">Nessuna Scadenza</string>
@@ -44,31 +61,50 @@
<string name="btn_export_to_server">Carica sul Server delle Chiavi</string>
<string name="btn_next">Prossimo</string>
<string name="btn_back">Precedente</string>
+ <string name="btn_no">No</string>
+ <string name="btn_match">Impronte digitali ugali</string>
+ <string name="btn_share_encrypted_signed">Codifica e condividi testo</string>
+ <string name="btn_copy_encrypted_signed">Codifica e copia testo</string>
<string name="btn_view_cert_key">Mostra chiave di certificazione</string>
<string name="btn_create_key">Crea chiave</string>
<string name="btn_add_files">Aggiungi file(s)</string>
- <string name="btn_add_share_decrypted_text">Condividi testo decifrato</string>
- <string name="btn_decrypt_and_verify">e verifica le firme</string>
- <string name="btn_decrypt_files">Decifra files</string>
+ <string name="btn_share_decrypted_text">Condividi testo decifrato</string>
+ <string name="btn_copy_decrypted_text">Copia testo decifrato</string>
+ <string name="btn_decrypt_clipboard">Leggi dagli appunti</string>
+ <string name="btn_decrypt_files">Seleziona input file</string>
+ <string name="btn_encrypt_files">Codifica file</string>
+ <string name="btn_encrypt_text">Codifica testo</string>
+ <string name="btn_add_email">Aggiungi indirizzo e-mail aggiuntivo</string>
+ <string name="btn_unlock">Sblocca</string>
+ <string name="btn_add_keyserver">Aggiungi</string>
+ <string name="btn_save_default">Salva come predefinito</string>
+ <string name="btn_saved">Salvato!</string>
<!--menu-->
<string name="menu_preferences">Impostazioni</string>
<string name="menu_help">Aiuto</string>
<string name="menu_export_key">Esporta su un file</string>
<string name="menu_delete_key">Cancella chiave</string>
+ <string name="menu_manage_keys">Gestisci mie chiavi</string>
<string name="menu_search">Cerca</string>
+ <string name="menu_nfc_preferences">Impostazioni NFC</string>
<string name="menu_beam_preferences">Impostazioni Beam</string>
<string name="menu_encrypt_to">Codifica su...</string>
<string name="menu_select_all">Seleziona tutto</string>
<string name="menu_export_all_keys">Esporta tutte le chiavi</string>
- <string name="menu_advanced">Mostra informazioni avanzate</string>
+ <string name="menu_update_all_keys">Aggiorna tutte le chiavi</string>
+ <string name="menu_advanced">Informazioni avanzate</string>
+ <string name="menu_certify_fingerprint">Confermare tramite il confronto delle impronte digitali</string>
+ <string name="menu_export_log">Esporta log</string>
<!--label-->
+ <string name="label_message">Testo</string>
<string name="label_file">File</string>
<string name="label_files">File(s)</string>
<string name="label_file_colon">File:</string>
- <string name="label_no_passphrase">Nessuna Frase di Accesso</string>
- <string name="label_passphrase">Frase di Accesso</string>
+ <string name="label_no_passphrase">Nessuna password</string>
+ <string name="label_passphrase">Password</string>
<string name="label_unlock">Sbloccando...</string>
- <string name="label_passphrase_again">Ripeti Frase di Accesso</string>
+ <string name="label_passphrase_again">Ripeti password</string>
+ <string name="label_show_passphrase">Mostra password</string>
<string name="label_algorithm">Algortimo</string>
<string name="label_ascii_armor">Documenti con Armatura ASCII</string>
<string name="label_file_ascii_armor">Abilita Armatura ASCII</string>
@@ -76,16 +112,21 @@
<string name="label_write_version_header_summary">Scrive \'OpenKeychain v2.7\' nelle firme OpenPGP, testi cifrati e chiavi esportate</string>
<string name="label_use_default_yubikey_pin">Utilizza il PIN predefinito di YubiKey</string>
<string name="label_use_num_keypad_for_yubikey_pin">Utilizza la tastiera numerica per il PIN di YubiKey</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Usa PIN predefinito (123456) per accedere YubiKeys tramite NFC</string>
<string name="label_asymmetric_from">Firmato da:</string>
<string name="label_to">Codifica per:</string>
+ <string name="label_delete_after_encryption">Elimina file dopo la codifica</string>
<string name="label_delete_after_decryption">Elimina dopo la decodifica</string>
<string name="label_encryption_algorithm">Algoritmo di codifica</string>
<string name="label_hash_algorithm">Algoritmo Hash</string>
- <string name="label_symmetric">Cifra con password</string>
- <string name="label_passphrase_cache_subs">Memorizza password tramite sottochiave</string>
+ <string name="label_symmetric">Codifica con password</string>
+ <string name="label_passphrase_cache_ttl">Tempo da ricordare</string>
+ <string name="label_passphrase_cache_subs">Ricorda le password di sottochiave</string>
+ <string name="label_message_compression">Compressione testo</string>
<string name="label_file_compression">Compressione file</string>
- <string name="label_keyservers">Server Chiavi</string>
+ <string name="label_keyservers">Seleziona server chiavi OpenPGP</string>
<string name="label_key_id">ID Chiave</string>
+ <string name="label_key_created">Chiave creata %s</string>
<string name="label_creation">Creazione</string>
<string name="label_expiry">Scadenza</string>
<string name="label_usage">Utilizzo</string>
@@ -100,6 +141,13 @@
<string name="expiry_date_dialog_title">Impostare la data di scadenza</string>
<string name="label_first_keyserver_is_used">(Primo server delle chiavi elencato è il preferito)</string>
<string name="label_preferred">preferiti</string>
+ <string name="label_enable_compression">Abilitare compressione</string>
+ <string name="label_encrypt_filenames">Codifica nome dei file</string>
+ <string name="label_hidden_recipients">Nascondi destinatari</string>
+ <string name="label_verify_keyserver">Verificare server chiavi</string>
+ <string name="label_enter_keyserver_url">Inserisci URL server chiavi</string>
+ <string name="pref_keyserver">Server chiavi OpenPGP</string>
+ <string name="pref_keyserver_summary">Cerca chiavi su server chiavi OpenPGP selezionati (protocollo HKP)</string>
<string name="user_id_no_name">&lt;nessun nome&gt;</string>
<string name="none">&lt;nessuno&gt;</string>
<plurals name="n_keys">
@@ -139,17 +187,11 @@
<string name="flag_encrypt">Codifica</string>
<string name="flag_authenticate">Convalida</string>
<!--sentences-->
- <string name="wrong_passphrase">Frase di Accesso errata</string>
<string name="no_filemanager_installed">Nessun gestore file compatibile installato.</string>
- <string name="passphrases_do_not_match">Le frasi di accesso non corrispondono.</string>
- <string name="passphrase_must_not_be_empty">Si prega di inserire una frase di accesso.</string>
<string name="passphrase_for_symmetric_encryption">Codifica Simmetrica.</string>
- <string name="passphrase_for">Inserisci la frase di accesso per \'%s\'</string>
- <string name="no_file_selected">Seleziona un file prima.</string>
<string name="encrypt_sign_successful">Firmato e/o codificato con successo.</string>
<string name="encrypt_sign_clipboard_successful">Firmato e/o codificato con successo negli appunti.</string>
<string name="select_encryption_key">Seleziona almeno una chiave di codifica.</string>
- <string name="error_no_encryption_or_signature_key">Seleziona almeno una chiave di codifica o di firma.</string>
<string name="also_export_secret_keys">Esporta anche chiave segreta</string>
<string name="reinstall_openkeychain">Hai riscontrato un bug noto con Android. Si prega di reinstallare OpenKeychain se vuoi collegare i tuoi contatti con le chiavi.</string>
<string name="key_exported">1 chiave esportata correttamente.</string>
@@ -175,13 +217,10 @@
<string name="error_external_storage_not_ready">memoria esterna non pronta</string>
<string name="error_key_size_minimum512bit">La grandezza della chiave deve essere almeno di 512bit</string>
<string name="error_unknown_algorithm_choice">opzione algoritmo sconosciuta</string>
- <string name="error_user_id_no_email">Nessuna email trovata</string>
<string name="error_key_needs_a_user_id">neccessaria almeno una identità</string>
- <string name="error_no_signature_passphrase">nessuna frase di accesso inserita</string>
<string name="error_no_signature_key">nessuna chiave di firma inserita</string>
<string name="error_invalid_data">Contenuti OpenPGP firmati o codificati non validi!</string>
<string name="error_integrity_check_failed">Controllo di integrita\' fallito! I dati sono stati modificati!</string>
- <string name="error_wrong_passphrase">frase di accesso errata</string>
<string name="error_could_not_extract_private_key">impossibile estrarre la chiave privata</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Devi avere Android 4.1 per usare Android NFC Beam!</string>
@@ -191,11 +230,6 @@
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">Non Firmato</string>
<string name="decrypt_result_invalid_signature">Firma non valida!</string>
- <string name="decrypt_result_signature_uncertified">Firmato da (non certificato!)</string>
- <string name="decrypt_result_signature_certified">Firmato da</string>
- <string name="decrypt_result_signature_expired_key">Chiave scaduta!</string>
- <string name="decrypt_result_signature_revoked_key">Chiave revocata!</string>
- <string name="decrypt_result_signature_missing_key">Chiave pubblica sconosciuta</string>
<string name="decrypt_result_encrypted">Codificato</string>
<string name="decrypt_result_not_encrypted">Non Codificato</string>
<string name="decrypt_result_action_show">Mostra</string>
@@ -225,7 +259,6 @@
<string name="progress_modify_subkeyrevoke">Revoca sottochiave...</string>
<string name="progress_modify_subkeystrip">pulizia sottochiavi...</string>
<string name="progress_modify_subkeyadd">Aggiunta sottochiave...</string>
- <string name="progress_modify_passphrase">Cambio frase di accesso...</string>
<plurals name="progress_exporting_key">
<item quantity="one">esportazione chiave...</item>
<item quantity="other">esportazione chiavi...</item>
@@ -288,7 +321,7 @@
<string name="import_tab_qr_code">Codice QR/NFC</string>
<string name="import_import">Importa chiavi selezionate</string>
<string name="import_qr_code_wrong">Codica QR deformato! Prova di nuovo!</string>
- <string name="import_qr_code_too_short_fingerprint">Impronta troppo corta (&lt; 16 caratteri)</string>
+ <!--Import from URL-->
<!--Generic result toast-->
<string name="with_warnings">, con avvisi</string>
<string name="with_cancelled">, fino all\'annullamento</string>
@@ -329,10 +362,6 @@
<string name="intent_send_encrypt">Codifica con OpenKeychain</string>
<string name="intent_send_decrypt">Decodifica con OpenKeychain</string>
<!--Remote API-->
- <string name="api_settings_show_info">Mostra informazioni dettagliate</string>
- <string name="api_settings_hide_info">Nascondi informazioni dettagliate</string>
- <string name="api_settings_show_advanced">Mostra impostazioni avanzate</string>
- <string name="api_settings_hide_advanced">Nascondi impostazioni avanzate</string>
<string name="api_settings_no_key">Nessuna chiave selezionata</string>
<string name="api_settings_select_key">Seleziona chiave</string>
<string name="api_settings_save">Salva</string>
@@ -392,7 +421,6 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<!--Key trust-->
<!--keybase proof stuff-->
<!--Edit key-->
- <string name="edit_key_action_change_passphrase">Cambia Frase Di Accesso</string>
<string name="edit_key_action_add_identity">Aggiungi Identità</string>
<string name="edit_key_action_add_subkey">Aggiungi Sottochiave</string>
<string name="edit_key_edit_user_id_title">Seleziona un azione!</string>
@@ -405,25 +433,19 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
</string-array>
<string name="edit_key_edit_user_id_revoked">Questa identità è stata revocata. Ciò non può essere annullato.</string>
<string name="edit_key_edit_subkey_title">Seleziona un azione!</string>
- <string-array name="edit_key_edit_subkey">
- <item>Cambia Scadenza</item>
- <item>Revoca Sottochiave</item>
- <item>Pulisci Sottochiave</item>
- <item>"Move Subkey to Yubikey / Smart Card"</item>
- </string-array>
<string name="edit_key_new_subkey">nuova sottochiave</string>
<string name="edit_key_select_flag">Per favore seleziona almeno una spunta!</string>
<string name="edit_key_error_add_identity">Aggiungi almeno una identità</string>
<string name="edit_key_error_add_subkey">Aggiungi almeno una sottochiave!</string>
<!--Create key-->
<string name="create_key_empty">Questo campo è necessario</string>
- <string name="create_key_passphrases_not_equal">Le frasi di accesso non coincidono.</string>
<string name="create_key_final_text">Hai inserito la seguente identità:</string>
<string name="create_key_final_robot_text">La creazione di una chiave richiede un po\' di tempo, prendi un caffè nel frattempo...</string>
<string name="create_key_rsa">(3 sottochiavi, RSA, 4096 bit)</string>
<string name="create_key_custom">(personalizza la configurazione della chiave)</string>
<string name="create_key_edit">Cambia configurazione della chiave</string>
<!--View key-->
+ <!--Add keyserver-->
<!--Navigation Drawer-->
<string name="nav_keys">Chiavi</string>
<string name="nav_apps">Apps</string>
@@ -522,7 +544,6 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="msg_is_pubring_generate">Generazione portachiavi pubblico da portachiavi privato</string>
<string name="msg_is_subkey_nonexistent">Sottochiave %s non disponibile nella chiave segreta</string>
<string name="msg_is_subkey_ok">Sottochiave segreta %s marcata come disponibile</string>
- <string name="msg_is_subkey_empty">Sottochiave segreta %s marcata come disponibile, con frase di accesso vuota</string>
<string name="msg_is_subkey_stripped">Sottochiave segreta %s marcata come ripulita</string>
<string name="msg_is_success_identical">Il portachiavi non contiene nuovi dati, nulla da eseguire</string>
<string name="msg_is_success">Portachiavi segreto importato con successo</string>
@@ -581,12 +602,9 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="msg_mf_error_null_expiry">La data di scadenza non può essere \"come prima\" sulla creazione di sottochiavi. Questo è un errore di programmazione, si prega di inviare una segnalazione di bug!</string>
<string name="msg_mf_error_passphrase_master">Errore irreversibile nella decodifica della chiave principale! Questo è probabilmente un errore di programmazione, si prega di inviare una segnalazione di bug!</string>
<string name="msg_mf_error_sig">Eccezione di firma!</string>
+ <string name="msg_mf_error_subkey_missing">Tentativo di operare su sottochiave %s mancante!</string>
<string name="msg_mf_master">Modifica delle certificazioni principali</string>
- <string name="msg_mf_passphrase_key">Ri-codifica sottochiave %s con nuova frase di accesso</string>
- <string name="msg_mf_passphrase_empty_retry">Impostazione nuova frase di accesso fallita, provo di nuovo con frase precedente di accesso vuota</string>
- <string name="msg_mf_passphrase_fail">La frase di accesso per la sottochiave non può essere modificata! (Ne ha una diversa dalle altre chiavi?)</string>
<string name="msg_mf_subkey_change">Modifica sottochiave %s</string>
- <string name="msg_mf_error_subkey_missing">Tentativo di operare su sottochiave %s mancante!</string>
<string name="msg_mf_subkey_new_id">Nuovo ID sottochiave: %s</string>
<string name="msg_mf_error_past_expiry">La data di scadenza non può essere nel passato!</string>
<string name="msg_mf_subkey_revoke">Revoca sottochiave %s</string>
@@ -627,7 +645,6 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<!--Edit Key (higher level than modify)-->
<!--Promote key-->
<!--Other messages used in OperationLogs-->
- <string name="msg_ek_error_divert">La Modifica delle chiavi NFC non è (ancora) supportata!</string>
<string name="msg_ek_error_not_found">Chiave non trovata!</string>
<!--Messages for DecryptVerify operation-->
<string name="msg_dc_clear_meta_file">Nome file: %s</string>
@@ -638,7 +655,6 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="msg_dc_clear_signature_ok">Controllo firma OK</string>
<string name="msg_dc_error_integrity_check">Errore di controllo di integrità!</string>
<string name="msg_dc_integrity_check_ok">Controllo integrità OK!</string>
- <string name="msg_dc_pass_cached">Uso della frase di accesso dalla cache</string>
<string name="msg_dc">Inizio operazione di decodifica...</string>
<string name="msg_dc_sym_skip">Dati simmetrici non permessi, proseguo...</string>
<string name="msg_dc_unlocking">Sblocco chiave segreta</string>
@@ -657,11 +673,6 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
</plurals>
<!--Messages for Export Log operation-->
<!--PassphraseCache-->
- <string name="passp_cache_notif_click_to_clear">Clicca per rimuovere la frase di accesso nella cache</string>
- <string name="passp_cache_notif_n_keys">OpenKeychain ha memorizzato nella cache %d frasi di accesso</string>
- <string name="passp_cache_notif_keys">Frasi di accesso memorizzate:</string>
- <string name="passp_cache_notif_clear">Pulisci Cache</string>
- <string name="passp_cache_notif_pwd">Frase di Accesso</string>
<!--First Time-->
<string name="first_time_text1">Riappropriati della tua privacy con OpenKeychain!</string>
<string name="first_time_skip">Salta Installazione</string>
@@ -676,7 +687,6 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="error_key_not_found">Chiave non trovata!</string>
<string name="error_key_processing">Errore di elaborazione chiave!</string>
<string name="key_stripped">ripulito</string>
- <string name="key_no_passphrase">Nessuna Frase di Accesso</string>
<string name="key_unavailable">non disponibile</string>
<string name="secret_cannot_multiple">Le vostre chiavi possono essere eliminate solo singolarmente!</string>
<string name="title_view_cert">Visualizza Dettagli Certificati</string>
@@ -686,10 +696,9 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="info_no_manual_account_creation">Non creare account OpenKeychain manualmente.\nPer ulteriori informazioni, vedere la Guida.</string>
<string name="contact_show_key">Mostra chiave (%s)</string>
<string name="error_no_file_selected">Seleziona almeno un file da codificare!</string>
- <string name="error_multi_files">Il salvataggio di più file non è supportato. Questa è una limitazione corrente di Android.</string>
<string name="key_colon">Chiave:</string>
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-kn/strings.xml b/OpenKeychain/src/main/res/values-kn/strings.xml
new file mode 100644
index 000000000..8f84af665
--- /dev/null
+++ b/OpenKeychain/src/main/res/values-kn/strings.xml
@@ -0,0 +1,72 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <!--GENERAL: Please put all strings inside quotes as described in example 1 on
+ http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
+ <!--title-->
+ <!--section-->
+ <!--button-->
+ <!--menu-->
+ <!--label-->
+ <!--choice-->
+ <!--key flags-->
+ <!--sentences-->
+ <!--errors
+ no punctuation, all lowercase,
+ they will be put after "error_message", e.g. "Error: file not found"-->
+ <!--errors without preceeding Error:-->
+ <!--results shown after decryption/verification-->
+ <!--Add keys-->
+ <!--progress dialogs, usually ending in '…'-->
+ <!--action strings-->
+ <!--key bit length selections-->
+ <!--elliptic curve names-->
+ <!--not in for now, see SaveKeyringParcel
+ <string name="key_curve_bp_p256">"Brainpool P-256"</string>
+ <string name="key_curve_bp_p384">"Brainpool P-384"</string>
+ <string name="key_curve_bp_p512">"Brainpool P-512"</string>-->
+ <!--compression-->
+ <!--Help-->
+ <!--Import-->
+ <!--Import from URL-->
+ <!--Generic result toast-->
+ <!--Import result toast-->
+ <!--Delete result toast-->
+ <!--Certify result toast-->
+ <!--Intent labels-->
+ <!--Remote API-->
+ <!--Share-->
+ <!--Key list-->
+ <!--Key view-->
+ <!--Key trust-->
+ <!--keybase proof stuff-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
+ <!--Add keyserver-->
+ <!--Navigation Drawer-->
+ <!--hints-->
+ <!--certs-->
+ <!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
+ <!--Import Public log entries-->
+ <!--Import Secret log entries-->
+ <!--Keyring Canonicalization log entries-->
+ <!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
+ <!--modifySecretKeyRing-->
+ <!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
+ <!--Other messages used in OperationLogs-->
+ <!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
+ <!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
+ <!--Messages for Export Log operation-->
+ <!--PassphraseCache-->
+ <!--First Time-->
+ <!--unsorted-->
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+</resources>
diff --git a/OpenKeychain/src/main/res/values-nl/strings.xml b/OpenKeychain/src/main/res/values-nl/strings.xml
index e69208dbb..a9fbcae7f 100644
--- a/OpenKeychain/src/main/res/values-nl/strings.xml
+++ b/OpenKeychain/src/main/res/values-nl/strings.xml
@@ -7,12 +7,11 @@
<string name="title_encrypt_text">Versleutelen</string>
<string name="title_encrypt_files">Versleutelen</string>
<string name="title_decrypt">Ontsleutelen</string>
- <string name="title_unlock">Ontgrendel sleutel</string>
<string name="title_add_subkey">Voeg subsleutel toe</string>
<string name="title_edit_key">Sleutel bewerken</string>
<string name="title_preferences">Instellingen</string>
<string name="title_api_registered_apps">Apps</string>
- <string name="title_key_server_preference">Sleutelservers</string>
+ <string name="title_key_server_preference">OpenPGP-sleutelservers</string>
<string name="title_change_passphrase">Wachtwoord wijzigen</string>
<string name="title_share_fingerprint_with">Vingerafdruk delen met…</string>
<string name="title_share_key">Sleutel delen met…</string>
@@ -30,33 +29,34 @@
<string name="title_help">Help</string>
<string name="title_log_display">Log</string>
<string name="title_exchange_keys">Sleutels uitwisselen</string>
- <string name="title_advanced_key_info">Geavanceerde sleutelinfo</string>
+ <string name="title_advanced_key_info">Uitgebreide informatie</string>
<string name="title_delete_secret_key">JOUW sleutel \'%s\' verwijderen?</string>
<string name="title_export_log">Log exporteren</string>
<string name="title_manage_my_keys">Beheer mijn sleutels</string>
<!--section-->
<string name="section_user_ids">Identiteiten</string>
+ <string name="section_yubikey">YubiKey</string>
<string name="section_linked_system_contact">Verbonden systeemcontact</string>
<string name="section_should_you_trust">Zou je deze sleutel vertrouwen?</string>
<string name="section_proof_details">Bewijs van verificatie</string>
<string name="section_cloud_evidence">Bewijzen van de cloud</string>
<string name="section_keys">Subsleutels</string>
<string name="section_cloud_search">Cloud zoeken</string>
- <string name="section_passphrase_cache">Wachtwoordcache</string>
+ <string name="section_passphrase_cache">Verwerken van wachtwoorden/PINs</string>
<string name="section_certify">Bevestigen</string>
<string name="section_actions">Acties</string>
<string name="section_share_key">Sleutel</string>
<string name="section_key_server">Sleutelserver</string>
<string name="section_fingerprint">Vingerafdruk</string>
<string name="section_encrypt">Versleutelen</string>
- <string name="section_decrypt">Ontsleutelen</string>
+ <string name="section_decrypt">Ontsleutelen / verifiëren</string>
<string name="section_current_expiry">Huidige verloopdatum</string>
<string name="section_new_expiry">Nieuwe verloopdatum</string>
<!--button-->
- <string name="btn_decrypt_verify_file">Decodeer, verifiëer en sla bestand op</string>
+ <string name="btn_decrypt_verify_file">Ontsleutel, verifieer en sla bestand op</string>
<string name="btn_encrypt_share_file">Bestand versleutelen en delen</string>
<string name="btn_encrypt_save_file">Bestand versleutelen en opslaan</string>
- <string name="btn_save">Opslaan</string>
+ <string name="btn_view_log">Bekijk log</string>
<string name="btn_do_not_save">Annuleren</string>
<string name="btn_delete">Verwijderen</string>
<string name="btn_no_date">Geen einddatum</string>
@@ -71,13 +71,17 @@
<string name="btn_view_cert_key">Toon certificatiesleutel</string>
<string name="btn_create_key">Sleutel aanmaken</string>
<string name="btn_add_files">Bestand(en) toevoegen</string>
- <string name="btn_add_share_decrypted_text">Ontcijferde tekst delen</string>
- <string name="btn_decrypt_clipboard">Tekst van klembord ontsleutelen</string>
- <string name="btn_decrypt_and_verify">en ondertekeningen verifiëren</string>
- <string name="btn_decrypt_files">Bestanden ontcijferen</string>
+ <string name="btn_share_decrypted_text">Ontsleutelde tekst delen</string>
+ <string name="btn_copy_decrypted_text">Ontsleutelde tekst kopiëren</string>
+ <string name="btn_decrypt_clipboard">Lezen van klembord</string>
+ <string name="btn_decrypt_files">Kies invoerbestand</string>
<string name="btn_encrypt_files">Bestanden versleutelen</string>
<string name="btn_encrypt_text">Tekst versleutelen</string>
<string name="btn_add_email">Bijkomstig e-mailadres toevoegen</string>
+ <string name="btn_unlock">Ontgrendelen</string>
+ <string name="btn_add_keyserver">Toevoegen</string>
+ <string name="btn_save_default">Opslaan als standaard</string>
+ <string name="btn_saved">Opgeslagen!</string>
<!--menu-->
<string name="menu_preferences">Instellingen</string>
<string name="menu_help">Help</string>
@@ -91,7 +95,7 @@
<string name="menu_select_all">Alles selecteren</string>
<string name="menu_export_all_keys">Alle sleutels exporteren</string>
<string name="menu_update_all_keys">Alle sleutels bijwerken</string>
- <string name="menu_advanced">Geavanceerde info tonen</string>
+ <string name="menu_advanced">Uitgebreide informatie</string>
<string name="menu_certify_fingerprint">Bevestigen door vingerafdrukken te vergelijken</string>
<string name="menu_export_log">Log exporteren</string>
<!--label-->
@@ -115,16 +119,17 @@
<string name="label_asymmetric_from">Ondertekend door:</string>
<string name="label_to">Versleutelen naar:</string>
<string name="label_delete_after_encryption">Verwijder bestanden na versleuteling</string>
- <string name="label_delete_after_decryption">Verwijder na ontcijfering</string>
+ <string name="label_delete_after_decryption">Verwijderen na ontsleuteling</string>
<string name="label_encryption_algorithm">Versleutelingsalgoritme</string>
<string name="label_hash_algorithm">Hashalgoritme</string>
<string name="label_symmetric">Versleutelen met wachtwoord</string>
- <string name="label_passphrase_cache_ttl">Cachetijd</string>
- <string name="label_passphrase_cache_subs">Cache wachtwoorden per subsleutel</string>
+ <string name="label_passphrase_cache_ttl">Onthou tijd</string>
+ <string name="label_passphrase_cache_subs">Onthou wachtwoorden per subsleutel</string>
<string name="label_message_compression">Tekstcompressie</string>
<string name="label_file_compression">Bestandscompressie</string>
- <string name="label_keyservers">Sleutelservers</string>
+ <string name="label_keyservers">Kies OpenPGP-sleutelservers</string>
<string name="label_key_id">Sleutel-id</string>
+ <string name="label_key_created">Sleutel aangemaakt %s</string>
<string name="label_creation">Aanmaak</string>
<string name="label_expiry">Verlopen</string>
<string name="label_usage">Gebruik</string>
@@ -142,10 +147,12 @@
<string name="label_enable_compression">Compressie aanzetten</string>
<string name="label_encrypt_filenames">Versleutel bestandsnamen</string>
<string name="label_hidden_recipients">Verberg ontvangers</string>
- <string name="pref_keyserver">Zoeken op sleutelserver</string>
- <string name="pref_keyserver_summary">Zoeken op HKP sleutelserver</string>
- <string name="pref_keybase">Zoeken op Keybase.io</string>
- <string name="pref_keybase_summary">Zoeken in Keybase.io-index</string>
+ <string name="label_verify_keyserver">Sleutelserver verifiëren</string>
+ <string name="label_enter_keyserver_url">Voer sleutelserver-URL in</string>
+ <string name="pref_keyserver">OpenPGP-sleutelservers</string>
+ <string name="pref_keyserver_summary">Zoek sleutels op geselecteerde OpenPGP-sleutelservers (HKP-protocol)</string>
+ <string name="pref_keybase">keybase.io</string>
+ <string name="pref_keybase_summary">Zoek sleutels op keybase.io</string>
<string name="user_id_no_name">&lt;no naam&gt;</string>
<string name="none">&lt;geen&gt;</string>
<plurals name="n_keys">
@@ -188,7 +195,7 @@
<string name="wrong_passphrase">Wachtwoord verkeerd.</string>
<string name="no_filemanager_installed">Geen compatibele bestandsbeheerder geïnstalleerd.</string>
<string name="passphrases_do_not_match">De wachtwoorden komen niet overeen.</string>
- <string name="passphrase_must_not_be_empty">Vul een wachtwoord in.</string>
+ <string name="passphrase_must_not_be_empty">Geef een wachtwoord in.</string>
<string name="passphrase_for_symmetric_encryption">Symmetrische versleuteling.</string>
<string name="passphrase_for">Voer het wachtwoord in voor \'%s\'</string>
<string name="pin_for">Voer PIN in voor \'%s\'</string>
@@ -197,13 +204,13 @@
<string name="file_delete_confirmation_title">Oorspronkelijke bestanden verwijderen?</string>
<string name="file_delete_confirmation">De volgende bestanden zullen worden verwijderd:%s</string>
<string name="file_delete_successful">%1$d van %2$d bestanden zijn verwijderd.%3$s</string>
- <string name="no_file_selected">Selecteer eerst een bestand.</string>
+ <string name="no_file_selected">Geen bestand geselecteerd.</string>
<string name="encrypt_sign_successful">Succesvol gesigneerd en/of gecodeerd.</string>
<string name="encrypt_sign_clipboard_successful">Succesvol gesigneerd en/of gecodeerd naar klembord.</string>
<string name="select_encryption_key">Selecteer ten minste één versleutelingssleutel.</string>
- <string name="error_no_encryption_or_signature_key">Selecter ten minste één versleutelings-/ondertekeningssleutel.</string>
+ <string name="error_no_encryption_or_signature_key">Kies ten minste één versleutelingssleutel of een ondertekeningssleutel.</string>
<string name="specify_file_to_encrypt_to">Gelieve aan te geven naar welk bestand versleuteld moet worden.\nWAARSCHUWING: Als het bestand al bestaat, zal het overschreven worden!</string>
- <string name="specify_file_to_decrypt_to">Gelieve aan te geven naar welk bestand ontcijferd moet worden.\nWAARSCHUWING: Als het bestand al bestaat, zal het overschreven worden!</string>
+ <string name="specify_file_to_decrypt_to">Gelieve aan te geven naar welk bestand ontsleuteld moet worden.\nWAARSCHUWING: Als het bestand al bestaat, zal het overschreven worden!</string>
<string name="specify_file_to_export_to">Gelieve aan te geven naar welk bestand geëxporteerd moet worden.\nWAARSCHUWING: Als het bestand al bestaat, zal het overschreven worden!</string>
<string name="key_deletion_confirmation_multi">Ben je zeker dat je alle geselecteerde sleutels wil verwijderen?</string>
<string name="secret_key_deletion_confirmation">Na verwijderen zal je niet langer berichten versleuteld met deze sleutel kunnen lezen, en alle sleutelbevestigingen die ermee gedaan zijn verliezen!</string>
@@ -237,7 +244,7 @@
<string name="error_external_storage_not_ready">externe opslag niet gereed</string>
<string name="error_key_size_minimum512bit">sleutelgrootte moet minstens 512-bits zijn</string>
<string name="error_unknown_algorithm_choice">onbekende algoritmekeuze</string>
- <string name="error_user_id_no_email">geen e-mail gevonden</string>
+ <string name="error_user_id_no_email">geen e-mailadres gevonden</string>
<string name="error_key_needs_a_user_id">minstens een identiteit vereist</string>
<string name="error_no_signature_passphrase">geen wachtwoord opgegeven</string>
<string name="error_no_signature_key">geen ondertekeningssleutel opgegeven</string>
@@ -250,16 +257,18 @@
<string name="error_nfc_needed">NFC moet aangezet zijn!</string>
<string name="error_beam_needed">Beam moet aangezet zijn!</string>
<string name="error_nothing_import">Geen sleutels gevonden!</string>
+ <string name="error_nothing_import_selected">Geen sleutels geselecteerd voor importeren!</string>
<string name="error_contacts_key_id_missing">Sleutel-ID van contacten ophalen mislukt!</string>
<string name="error_generic_report_bug">Een algemene fout is opgetreden, gelieve een nieuw bug-verslag te maken voor OpenKeychain.</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">Niet ondertekend</string>
<string name="decrypt_result_invalid_signature">Ongeldige handtekening!</string>
- <string name="decrypt_result_signature_uncertified">Ondertekend door (niet gecertificeerd!)</string>
- <string name="decrypt_result_signature_certified">Ondertekend door</string>
- <string name="decrypt_result_signature_expired_key">Sleutel is verlopen!</string>
- <string name="decrypt_result_signature_revoked_key">Sleutel is ingetrokken!</string>
- <string name="decrypt_result_signature_missing_key">Onbekende publieke sleutel</string>
+ <string name="decrypt_result_signature_uncertified">Ondertekend door <b>niet bevestigde</b> sleutel</string>
+ <string name="decrypt_result_signature_secret">Ondertekend door jouw sleutel</string>
+ <string name="decrypt_result_signature_certified">Ondertekend door bevestigde sleutel</string>
+ <string name="decrypt_result_signature_expired_key">Ondertekend door <b>verlopen</b> sleutel!</string>
+ <string name="decrypt_result_signature_revoked_key">Ondertekend door <b>ingetrokken</b> sleutel!</string>
+ <string name="decrypt_result_signature_missing_key">Ondertekend door <b>onbekende publieke sleutel</b></string>
<string name="decrypt_result_encrypted">Versleuteld</string>
<string name="decrypt_result_not_encrypted">Niet versleuteld</string>
<string name="decrypt_result_action_show">Toon</string>
@@ -299,6 +308,7 @@
<item quantity="one">sleutel exporteren…</item>
<item quantity="other">sleutels exporteren…</item>
</plurals>
+ <string name="progress_start">bewerking voorbereiden…</string>
<string name="progress_extracting_signature_key">ondertekeningssleutel uitpakken…</string>
<string name="progress_extracting_key">sleutel uitpakken…</string>
<string name="progress_preparing_streams">streams voorbereiden…</string>
@@ -318,6 +328,7 @@
<string name="progress_deleting">bezig met verwijderen van sleutels…</string>
<string name="progress_con_saving">consolidatie: bezig met opslaan naar cache…</string>
<string name="progress_con_reimport">consolidatie: bezig met opnieuw importeren…</string>
+ <string name="progress_verifying_keyserver_url">bezig met verifiëren van sleutelserver…</string>
<!--action strings-->
<string name="hint_cloud_search_hint">Zoeken via naam, e-mail, ...</string>
<!--key bit length selections-->
@@ -359,9 +370,12 @@
<string name="import_tab_qr_code">QR code/NFC</string>
<string name="import_import">Geselecteerde sleutels importeren</string>
<string name="import_qr_code_wrong">QR-code ongeldig. Probeer het opnieuw</string>
- <string name="import_qr_code_too_short_fingerprint">Vingerafdruk is te kort (&lt; 16 tekens)</string>
+ <string name="import_qr_code_fp">Vingerafdruk is verkeerd of te kort!</string>
+ <string name="import_qr_code_too_short_fingerprint">Vingerafdruk is te kort!</string>
<string name="import_qr_code_button">QR code scannen</string>
<string name="import_qr_code_text">Plaats je camera voor de QR-code!</string>
+ <!--Import from URL-->
+ <string name="import_url_warn_no_search_parameter">Geen zoekopdracht gedefinieerd. Je kan de sleutelserver handmatig doorzoeken.</string>
<!--Generic result toast-->
<string name="snackbar_details">Details</string>
<string name="with_warnings">, met waarschuwingen</string>
@@ -426,15 +440,15 @@
<item quantity="other">Certificatie van %d sleutels mislukt!</item>
</plurals>
<!--Intent labels-->
- <string name="intent_decrypt_file">Decodeer bestand met OpenKeychain</string>
+ <string name="intent_decrypt_file">Bestand ontsleutelen met OpenKeychain</string>
<string name="intent_import_key">Importeer Sleutel met OpenKeychain</string>
<string name="intent_send_encrypt">Codeer met OpenKeychain</string>
- <string name="intent_send_decrypt">Decodeer met OpenKeychain</string>
+ <string name="intent_send_decrypt">Ontsleutelen met OpenKeychain</string>
<!--Remote API-->
- <string name="api_settings_show_info">Toon geavanceerde informatie</string>
- <string name="api_settings_hide_info">Verberg geavanceerde informatie</string>
- <string name="api_settings_show_advanced">Toon geavanceerde instellingen</string>
- <string name="api_settings_hide_advanced">Verberg geavanceerde instellingen</string>
+ <string name="api_settings_show_info">Uitgebreide informatie weergeven</string>
+ <string name="api_settings_hide_info">Uitgebreide informatie verbergen</string>
+ <string name="api_settings_show_advanced">Uitgebreide instellingen weergeven</string>
+ <string name="api_settings_hide_advanced">Uitgebreide instellingen verbergen</string>
<string name="api_settings_no_key">Geen sleutel geselecteerd</string>
<string name="api_settings_select_key">Sleutel selecteren</string>
<string name="api_settings_create_key">Nieuwe sleutel aanmaken</string>
@@ -446,15 +460,15 @@
<string name="api_settings_delete_account">Verwijder account</string>
<string name="api_settings_package_name">Pakketnaam</string>
<string name="api_settings_package_signature">SHA-256 van Pakkethandtekening</string>
- <string name="api_settings_accounts">Accounts (verouderde API)</string>
- <string name="api_settings_advanced">Geavanceerde informatie</string>
+ <string name="api_settings_accounts">Accounts (oude API)</string>
+ <string name="api_settings_advanced">Uitgebreide informatie</string>
<string name="api_settings_allowed_keys">Toegestane sleutels</string>
<string name="api_settings_settings">Instellingen</string>
<string name="api_settings_key">Accountsleutel:</string>
<string name="api_settings_accounts_empty">Geen accounts verbonden aan deze app.</string>
- <string name="api_create_account_text">Geen sleutel ingesteld voor deze account. Gelieve een van je bestaande sleutels te selecteren, of een nieuwe sleutel aan te maken.\nApps kunnen enkel ontcijferen/ondertekenen met de sleutels die je hier selecteert!</string>
- <string name="api_update_account_text">De sleutel opgeslaan voor deze account is verwijderd. Gelieve een andere te selecteren!\nApps kunnen enkel ontcijferen/ondertekenen met de sleutels die je hier selecteert!</string>
- <string name="api_register_text">De weergegeven app will berichten versleutelen/ontcijferen en ze in jouw naam ondertekenen.\nToegang toestaan?\n\nWAARSCHUWING: als je niet weet waarom dit scherm verscheen, sta dan geen toegang toe! Je kan later toegang weghalen via het \'Apps\' scherm.</string>
+ <string name="api_create_account_text">Geen sleutel ingesteld voor deze account. Gelieve een van je bestaande sleutels te selecteren, of een nieuwe sleutel aan te maken.\nApps kunnen enkel ontsleutelen/ondertekenen met de sleutels die je hier selecteert!</string>
+ <string name="api_update_account_text">De sleutel opgeslaan voor deze account is verwijderd. Gelieve een andere te selecteren!\nApps kunnen enkel ontsleutelen/ondertekenen met de sleutels die je hier selecteert!</string>
+ <string name="api_register_text">De weergegeven app will berichten versleutelen/ontsleutelen en ze in jouw naam ondertekenen.\nToegang toestaan?\n\nWAARSCHUWING: als je niet weet waarom dit scherm verscheen, sta dan geen toegang toe! Je kan later toegang weghalen via het \'Apps\' scherm.</string>
<string name="api_register_allow">Toegang toestaan</string>
<string name="api_register_disallow">Toegang weigeren</string>
<string name="api_register_error_select_key">Selecteert u a.u.b. een sleutel</string>
@@ -464,6 +478,7 @@
<string name="api_select_pub_keys_text_no_user_ids">Gelieve de ontvangers te selecteren!</string>
<string name="api_error_wrong_signature">Handtekening check mislukt! Hebt u deze app van een andere bron geïnstalleerd? Als u zeker weet dat dit geen aanval is, haal dan de registratie van deze app in OpenKeychain weg en registreer de app opnieuw.</string>
<string name="api_select_sign_key_text">Gelieve een van je bestaande sleutels te selecteren of een nieuwe aan te maken.</string>
+ <string name="api_select_keys_text">Geen van de toegestane sleutels kan de inhoud ontsleutelen. Gelieve de toegestane sleutels te selecteren.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Delen met QR-code</string>
<string name="share_nfc_dialog">Deel met NFC</string>
@@ -555,12 +570,15 @@
<item>Vervaldatum veranderen</item>
<item>Subsleutel intrekken</item>
<item>Subsleutel strippen</item>
- <item>"Move Subkey to Yubikey / Smart Card"</item>
+ <item>Subsleutel verplaatsen naar YubiKey / smartcard</item>
</string-array>
<string name="edit_key_new_subkey">nieuwe subsleutel</string>
<string name="edit_key_select_flag">Gelieve minstens een vlag te selecteren!</string>
<string name="edit_key_error_add_identity">Voeg minstens een identiteit toe!</string>
<string name="edit_key_error_add_subkey">Voeg minstens een subsleutel toe!</string>
+ <string name="edit_key_error_bad_nfc_algo">Algoritme wordt niet ondersteund door smartcard!</string>
+ <string name="edit_key_error_bad_nfc_size">Sleutelgrootte wordt niet ondersteund door smartcard!</string>
+ <string name="edit_key_error_bad_nfc_stripped">Kan sleutel niet verplaatsen naar smartcard (ofwel gestript ofwel \'doorschakelen-naar-kaart\')!</string>
<!--Create key-->
<string name="create_key_upload">Synchroniseren met de cloud</string>
<string name="create_key_empty">Dit veld moet ingevuld worden</string>
@@ -576,7 +594,8 @@
<string name="create_key_edit">Sleutelconfiguratie wijzigen</string>
<string name="create_key_add_email">E-mailadres toevoegen</string>
<string name="create_key_add_email_text">Bijkomstige e-mailadressen zijn ook verbonden met deze sleutel en kunnen gebruikt worden voor veilige communicatie.</string>
- <string name="create_key_email_already_exists_text">E-mail is al toegevoegd</string>
+ <string name="create_key_email_already_exists_text">E-mailadres is al toegevoegd</string>
+ <string name="create_key_email_invalid_email">E-mailadresformaat is ongeldig</string>
<!--View key-->
<string name="view_key_revoked">Ingetrokken: sleutel mag niet meer gebruikt worden!</string>
<string name="view_key_expired">Verlopen: het contact moet de geldigheid van de sleutel verlengen!</string>
@@ -585,6 +604,12 @@
<string name="view_key_verified">Bevestigde sleutel</string>
<string name="view_key_unverified">Niet bevestigd: scan QR-code om de sleutel te bevestigen!</string>
<string name="view_key_fragment_no_system_contact">&lt;geen&gt;</string>
+ <!--Add keyserver-->
+ <string name="add_keyserver_dialog_title">Sleutelserver toevoegen</string>
+ <string name="add_keyserver_verified">Sleutelserver geverifieerd!</string>
+ <string name="add_keyserver_without_verification">Sleutelserver toegevoegd zonder verificatie.</string>
+ <string name="add_keyserver_invalid_url">Ongeldige URL!</string>
+ <string name="add_keyserver_connection_failed">Kon niet verbinden met sleutelserver. Controleer de URL en je internetverbinding.</string>
<!--Navigation Drawer-->
<string name="nav_keys">Sleutels</string>
<string name="nav_encrypt_decrypt">Versleutelen/Ontsleutelen</string>
@@ -715,7 +740,7 @@
<string name="msg_is_subkey_empty">Geheime subsleutel %s gemarkeerd als beschikbaar, met leeg wachtwoord</string>
<string name="msg_is_subkey_pin">Geheime subsleutel %s gemarkeerd als beschikbaar, met PIN</string>
<string name="msg_is_subkey_stripped">Geheime subsleutel %s gemarkeerd als gestript</string>
- <string name="msg_is_subkey_divert">Geheime subsleutel %s gemarkeerd als \'doorschakelen naar smartcard/NFC\'</string>
+ <string name="msg_is_subkey_divert">Geheime subsleutel %s gemarkeerd als \'doorschakelen-naar-kaart\'</string>
<string name="msg_is_success_identical">Sleutelbos bevat geen nieuwe gegevens, niets te doen</string>
<string name="msg_is_success">Geheime sleutelbos succesvol geïmporteerd</string>
<!--Keyring Canonicalization log entries-->
@@ -742,6 +767,7 @@
<string name="msg_kc_sub_bad_local">Bezig met verwijderen van subsleutelbindend certificaat met vlag \'lokaal\'</string>
<string name="msg_kc_sub_bad_keyid">Subsleutelbindende uitgevers-ID komt niet overeen</string>
<string name="msg_kc_sub_bad_time">Bezig met verwijderen van subsleutelbindend certificaat met toekomstige tijdstempel</string>
+ <string name="msg_kc_sub_bad_time_early">Subsleutelbindend certificaat heeft vroegere tijdstempel dan sleutel!</string>
<string name="msg_kc_sub_bad_type">Onbekend subsleutelcertificaattype: %s</string>
<string name="msg_kc_sub_dup">Bezig met verwijderen van overbodig subsleutelbindend certificaat</string>
<string name="msg_kc_sub_primary_bad">Bezig met verwijderen van subsleutelbindend certificaat wegens ongeldig primair bindend certificaat</string>
@@ -818,7 +844,8 @@
<string name="msg_cr_error_flags_ecdh">Slechte sleutelvlaggen geselecteerd, ECDH kan niet gebruikt worden voor versleuteling!</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Bezig met wijzigen van sleutelbos %s</string>
- <string name="msg_mf_error_divert_serial">Het serienummer van een doorschakelen-naar-kaart sleutel moet 16 bytes zijn! Dit is een programmeerfout, gelieve een verslag in te dienen!</string>
+ <string name="msg_mf_divert">Zal doorschakelen naar smartcard voor versleutelingsbewerkingen</string>
+ <string name="msg_mf_error_divert_serial">Het serienummer van een \'doorschakelen-naar-kaart\'-sleutel moet 16 bytes zijn! Dit is een programmeerfout, gelieve een verslag in te dienen!</string>
<string name="msg_mf_error_encode">Codeeruitzondering!</string>
<string name="msg_mf_error_fingerprint">Eigenlijke vingerafdruk van sleutel komt niet overeen met verwachte vingerafdruk!</string>
<string name="msg_mf_error_keyid">Geen sleutel-ID. Dit is een bug, gelieve een verslag in te dienen!</string>
@@ -829,9 +856,14 @@
<string name="msg_mf_error_restricted">Geprobeerd een beperkte bewerking uit te voeren zonder wachtwoord! Dit is een programmeerfout, gelieve een verslag in te dienen!</string>
<string name="msg_mf_error_revoked_primary">Ingetrokken gebruikers-ID\'s kunnen niet primair zijn!</string>
<string name="msg_mf_error_null_expiry">Verloopdatum kan niet hetzelfde als voordien zijn bij aanmaken van een subsleutel. Dit is een bug, gelieve een verslag in te dienen!</string>
- <string name="msg_mf_error_passphrase_master">Fatale fout bij ontcijferen van hoofdsleutel. Dit is waarschijnlijk een bug, gelieve een verslag in te dienen!</string>
+ <string name="msg_mf_error_noop">Niets om te doen!</string>
+ <string name="msg_mf_error_passphrase_master">Fatale fout bij ontsleutelen van hoofdsleutel. Dit is waarschijnlijk een bug, gelieve een verslag in te dienen!</string>
<string name="msg_mf_error_pgp">Interne OpenPGP-fout!</string>
<string name="msg_mf_error_sig">Ondertekeningsuitzondering!</string>
+ <string name="msg_mf_error_subkey_missing">Geprobeerd om bewerking uit te voeren op ontbrekende subsleutel %s!</string>
+ <string name="msg_mf_error_conflicting_nfc_commands">Kan sleutel niet tegelijk verplaatsen naar smartcard en een on-card-ondertekening aanmaken.</string>
+ <string name="msg_mf_error_duplicate_keytocard_for_slot">Smartcard ondersteunt slechts een slot per sleuteltype</string>
+ <string name="msg_mf_error_invalid_flags_for_keytocard">Ongeldige sleutelvlaggen voor smartcardsleutel</string>
<string name="msg_mf_master">Bezig met wijzigen van hoofdcertificaten</string>
<string name="msg_mf_notation_empty">Bezig met toevoegen van leeg notatiepakket</string>
<string name="msg_mf_notation_pin">Bezig met toevoegen van PIN-notatiepakket</string>
@@ -841,13 +873,17 @@
<string name="msg_mf_passphrase_fail">Wachtwoord voor subsleutel kon niet gewijzigd worden! (Heeft het een ander wachtwoord dan de andere sleutels?)</string>
<string name="msg_mf_primary_replace_old">Bezig met vervangen van certificaat van vorige primaire gebruikers-ID</string>
<string name="msg_mf_primary_new">Bezig met aanmaken van nieuw certificaat voor nieuwe primaire gebruikers-ID</string>
+ <string name="msg_mf_restricted_mode">Veranderen naar beperkte bewerkingsmodus</string>
<string name="msg_mf_subkey_change">Bezig met wijzigen van subsleutel %s</string>
- <string name="msg_mf_error_subkey_missing">Geprobeerd om bewerking uit te voeren op ontbrekende subsleutel %s!</string>
+ <string name="msg_mf_require_divert">Doorschakelen naar smartcard voor versleutelingsbewerkingen</string>
+ <string name="msg_mf_require_passphrase">Wachtwoord vereist voor bewerkingen</string>
<string name="msg_mf_subkey_new">Bezig met toevoegen van nieuwe subsleutel of type %s</string>
<string name="msg_mf_subkey_new_id">Nieuwe subsleutel-ID: %s</string>
<string name="msg_mf_error_past_expiry">Verloopdatum kan niet in het verleden zijn!</string>
<string name="msg_mf_subkey_revoke">Bezig met intrekken van subsleutel %s</string>
<string name="msg_mf_subkey_strip">Bezig met strippen van subsleutel %s</string>
+ <string name="msg_mf_keytocard_start">Subsleutel %s wordt verplaatst naar smartcard</string>
+ <string name="msg_mf_keytocard_finish">%1$s verplaatst naar smartcard %2$s</string>
<string name="msg_mf_success">Sleutelbos succesvol gewijzigd</string>
<string name="msg_mf_uid_add">Bezig met toevoegen van gebruikers-ID %s</string>
<string name="msg_mf_uid_primary">Bezig met wijzigen van primaire gebruikers-ID naar %s</string>
@@ -899,12 +935,13 @@
<string name="msg_ed_success">Sleutelbewerking geslaagd</string>
<!--Promote key-->
<string name="msg_pr">Bezig met promoveren van publieke sleutel naar geheime sleutel</string>
- <string name="msg_pr_error_already_secret">Sleutel is al een geheime sleutel!</string>
+ <string name="msg_pr_all">Bezig met promoveren van alle subsleutels</string>
<string name="msg_pr_error_key_not_found">Sleutel niet gevonden!</string>
<string name="msg_pr_fetching">Bezig met ophalen van de te wijzigen sleutel (%s)</string>
+ <string name="msg_pr_subkey_match">Bezig met promoveren van subsleutel: %s</string>
+ <string name="msg_pr_subkey_nomatch">Subsleutel niet op YubiKey: %s</string>
<string name="msg_pr_success">Sleutel succesvol gepromoveerd!</string>
<!--Other messages used in OperationLogs-->
- <string name="msg_ek_error_divert">Bewerken van NFC-sleutels wordt (nog) niet ondersteund!</string>
<string name="msg_ek_error_dummy">Kan sleutelbos niet bewerken met gestripte hoofdsleutel!</string>
<string name="msg_ek_error_not_found">Sleutel niet gevonden!</string>
<!--Messages for DecryptVerify operation-->
@@ -925,23 +962,24 @@
<string name="msg_dc_clear_signature_ok">Ondertekeningscontrole OKÉ</string>
<string name="msg_dc_clear_signature">Bezig met opslaan van ondertekeningsgegevens voor later</string>
<string name="msg_dc_clear">Bezig met verwerken van platte tekst-gegevens</string>
- <string name="msg_dc_error_bad_passphrase">Fout bij ontcijferen van sleutel, slecht wachtwoord!</string>
+ <string name="msg_dc_error_bad_passphrase">Fout bij ontgrendelen van sleutel, verkeerd wachtwoord!</string>
+ <string name="msg_dc_error_corrupt_data">Gegevens zijn corrupt!</string>
<string name="msg_dc_error_extract_key">Onbekende fout bij ontgrendelen van sleutel!</string>
<string name="msg_dc_error_integrity_check">Fout bij integriteitscontrole!</string>
<string name="msg_dc_error_integrity_missing">Integriteitscheck ontbreekt! Dit kan gebeuren omdat de versleutelingsapplicatie verouderd is, of door een downgrade-aanval.</string>
- <string name="msg_dc_error_invalid_data">Geen geldige ondertekeningsgegevens gevonden!</string>
+ <string name="msg_dc_error_invalid_data">Geen geldige OpenPGP-versleutelde of ondertekende inhoud gevonden!</string>
<string name="msg_dc_error_io">I/O-uitzondering tegengekomen tijdens bewerking!</string>
<string name="msg_dc_error_no_data">Geen versleutelde gegevens gevonden!</string>
<string name="msg_dc_error_no_key">Geen versleutelde gegevens met bekende geheime sleutel gevonden!</string>
<string name="msg_dc_error_pgp_exception">OpenPGP-uitzondering tegengekomen tijdens bewerking!</string>
<string name="msg_dc_integrity_check_ok">Integriteitscontrole OKÉ!</string>
- <string name="msg_dc_ok_meta_only">Enkel metadata opgevraagd, ontcijferen wordt overgeslaan</string>
+ <string name="msg_dc_ok_meta_only">Enkel metadata opgevraagd, ontsleutelen wordt overgeslagen</string>
<string name="msg_dc_ok">Ontsleuteling/verificatie voltooid</string>
<string name="msg_dc_pass_cached">Wachtwoord wordt uit cache gebruikt</string>
<string name="msg_dc_pending_nfc">NFC token vereist, gebruikersinput wordt gevraagd…</string>
<string name="msg_dc_pending_passphrase">Wachtwoord vereist, gebruikersinput wordt gevraagd…</string>
- <string name="msg_dc_prep_streams">Bezig met voorbereiden van streams voor ontcijfering</string>
- <string name="msg_dc">Ontcijfering wordt gestart…</string>
+ <string name="msg_dc_prep_streams">Bezig met voorbereiden van streams voor ontsleuteling</string>
+ <string name="msg_dc">Ontsleuteling wordt gestart…</string>
<string name="msg_dc_sym_skip">Symmetrische gegevens niet toegestaan, bewerking wordt overgeslaan…</string>
<string name="msg_dc_sym">Blok met symmetrisch versleutelde gegevens gevonden</string>
<string name="msg_dc_trail_asym">Achterlopende, asymmetrisch versleutelde gegevens tegengekomen voor sleutel %s</string>
@@ -969,20 +1007,19 @@
<string name="msg_se_error_input_uri_not_found">Fout bij openen van URI voor lezen!</string>
<string name="msg_se_error_output_uri_not_found">Fout bij openen van URI voor schrijven!</string>
<string name="msg_se_error_too_many_inputs">Meer inputs dan outputs opgegeven! Dit is waarschijnlijk een programmeerfout, gelieve dit te melden!</string>
- <string name="msg_se_warn_output_left">Er blijven outputs over maar geen inputs. Dit is waarschijnlijk een programmeerfout, gelieve dit te melden!</string>
<string name="msg_se_success">Ondertekening/versleuteling geslaagd</string>
<!--Messages for PgpSignEncrypt operation-->
<string name="msg_pse_asymmetric">Bezig met publieke sleutels voorbereiden voor versleuteling</string>
<string name="msg_pse_clearsign_only">Ondertekenen van platte tekst-input wordt niet ondersteund!</string>
<string name="msg_pse_compressing">Bezig met voorbereiden van comprimeren</string>
<string name="msg_pse_encrypting">Bezig met versleutelen van gegevens</string>
- <string name="msg_pse_error_bad_passphrase">Slecht wachtwoord!</string>
+ <string name="msg_pse_error_bad_passphrase">Wachtwoord verkeerd!</string>
<string name="msg_pse_error_hash_algo">Het gevraagde hashing-algoritme wordt niet ondersteund door deze sleutel!</string>
<string name="msg_pse_error_io">I/O-uitzondering tegengekomen tijdens bewerking!</string>
<string name="msg_pse_error_key_sign">Geselecteerde sleutel kan geen gegevens ondertekenen!</string>
<string name="msg_pse_error_sign_key">Fout bij ophalen van ondertekeningssleutel!</string>
<string name="msg_pse_error_nfc">NFC-gegevensfout!</string>
- <string name="msg_pse_error_no_passphrase">Geen wachtwoord gegeven!</string>
+ <string name="msg_pse_error_no_passphrase">Geen wachtwoord opgegeven!</string>
<string name="msg_pse_error_pgp">Interne OpenPGP-fout!</string>
<string name="msg_pse_error_sig">OpenPGP-ondertekeningsuitzondering tegengekomen!</string>
<string name="msg_pse_error_unlock">Onbekende fout bij ontgrendelen van sleutel!</string>
@@ -991,7 +1028,7 @@
<string name="msg_pse_key_warn">Slechte sleutel voor versleuteling: %s</string>
<string name="msg_pse_ok">Ondertekening/versleuteling geslaagd!</string>
<string name="msg_pse_pending_nfc">NFC token vereist, gebruikersinput gevraagd…</string>
- <string name="msg_pse_pending_passphrase">Wachtwoord vereist, gebruikersinput gevraagd…</string>
+ <string name="msg_pse_pending_passphrase">Wachtwoord vereist, gebruikersinput wordt gevraagd…</string>
<string name="msg_pse_signing">Bezig met ondertekenen van gegevens (zonder versleuteling)</string>
<string name="msg_pse_signing_cleartext">Bezig met aanmaken van platte tekst-ondertekening</string>
<string name="msg_pse_signing_detached">Bezig met aanmaken van vrijstaande ondertekening</string>
@@ -1011,9 +1048,9 @@
<string name="msg_crt_error_master_not_found">Hoofdsleutel niet gevonden!</string>
<string name="msg_crt_error_nothing">Geen sleutels gecertificeerd!</string>
<string name="msg_crt_error_unlock">Fout bij ontgrendelen van hoofdsleutel!</string>
- <string name="msg_crt_error_divert">Certificatie met NFC wordt (nog) niet ondersteund!</string>
<string name="msg_crt">Bezig met certificeren van sleutelbossen</string>
<string name="msg_crt_master_fetch">Bezig met ophalen van gecertificeerde hoofdsleutel</string>
+ <string name="msg_crt_nfc_return">Terugkeren naar NFC-scherm</string>
<string name="msg_crt_save">Bezig met opslaan van gecertificeerde sleutel %s</string>
<string name="msg_crt_saving">Bezig met opslaan van sleutelbossen</string>
<string name="msg_crt_unlock">Bezig met ontgrendelen van hoofdsleutel</string>
@@ -1029,13 +1066,14 @@
<string name="msg_import_fetch_error_decode">Fout bij decoderen van opgehaalde sleutelbos!</string>
<string name="msg_import_fetch_error">Sleutel kon niet opgehaald worden! (Netwerkproblemen?)</string>
<string name="msg_import_fetch_keybase">Bezig met ophalen van keybase.io: %s</string>
- <string name="msg_import_fetch_keyserver_error">Kon sleutel niet ophalen!</string>
+ <string name="msg_import_fetch_keyserver_error">Kon sleutel niet ophalen van sleutelservers: %s</string>
<string name="msg_import_fetch_keyserver">Bezig met ophalen van sleutelserver: %s</string>
<string name="msg_import_fetch_keyserver_ok">Ophalen van sleutel geslaagd!</string>
<string name="msg_import_keyserver">Sleutelserver %s wordt gebruikt</string>
<string name="msg_import_fingerprint_error">Vingerafdruk van opgehaalde sleutel komt niet overeen met verwachte vingerafdruk!</string>
<string name="msg_import_fingerprint_ok">Vingerafdrukcontrole OKÉ</string>
<string name="msg_import_merge">Bezig met samenvoegen van opgehaalde gegevens</string>
+ <string name="msg_import_merge_error">Fout bij samenvoegen van opgehaalde gegevens!</string>
<string name="msg_import_error">Importeren mislukt!</string>
<string name="msg_import_error_io">Importeren mislukt door i/o-fout!</string>
<string name="msg_import_partial">Importeren geslaagd, met fouten!</string>
@@ -1092,10 +1130,13 @@
<string name="msg_export_log_error_writing">I/O-fout bij schrijven naar bestand!</string>
<string name="msg_export_log_success">Log succesvol geëxporteerd!</string>
<!--PassphraseCache-->
- <string name="passp_cache_notif_click_to_clear">Klik om de gecachete wachtwoorden te wissen</string>
- <string name="passp_cache_notif_n_keys">OpenKeychain heeft %d wachtwoorden gecachet</string>
- <string name="passp_cache_notif_keys">Gecachete wachtwoorden:</string>
- <string name="passp_cache_notif_clear">Wis cache</string>
+ <string name="passp_cache_notif_click_to_clear">Tik om wachtwoorden te wissen.</string>
+ <plurals name="passp_cache_notif_n_keys">
+ <item quantity="one">%d wachtwoord onthouden</item>
+ <item quantity="other">%d wachtwoorden onthouden</item>
+ </plurals>
+ <string name="passp_cache_notif_keys">Onthouden wachtwoorden</string>
+ <string name="passp_cache_notif_clear">Wachtwoorden wissen</string>
<string name="passp_cache_notif_pwd">Wachtwoord</string>
<!--First Time-->
<string name="first_time_text1">Neem je privacy terug met OpenKeychain!</string>
@@ -1119,7 +1160,7 @@
<string name="error_key_not_found">Sleutel niet gevonden!</string>
<string name="error_key_processing">Fout bij verwerken sleutel!</string>
<string name="key_stripped">gestript</string>
- <string name="key_divert">doorschakelen naar smartcard/NFC</string>
+ <string name="key_divert">doorschakelen naar smartcard</string>
<string name="key_no_passphrase">geen wachtwoord</string>
<string name="key_unavailable">niet beschikbaar</string>
<string name="secret_cannot_multiple">Je eigen sleutels kunnen enkel individueel verwijderd worden!</string>
@@ -1132,6 +1173,9 @@
<string name="swipe_to_update">Veeg naar beneden om van sleutelserver te updaten</string>
<string name="error_no_file_selected">Selecteer minstens een bestand om te versleutelen!</string>
<string name="error_multi_files">Opslaan van meerdere bestanden wordt niet ondersteund. Dit is een beperking van Android.</string>
+ <string name="error_multi_clipboard">Versleuteling van meerdere bestanden naar klembord wordt niet ondersteund.</string>
+ <string name="error_detached_signature">Alleen-ondertekenen-bewerking van binaire bestanden wordt niet ondersteund, kies ten minste één versleutelingssleutel.</string>
+ <string name="error_empty_text">Voer tekst in om ze te versleutelen!</string>
<string name="key_colon">Sleutel:</string>
<string name="exchange_description">Selecteer om een sleuteluitwisseling te starten het aantal deelnemers aan de rechterkant, en klik vervolgens op de knop \'Start uitwisseling\'.\n\nJe zal twee vragne gesteld worden om zeker te zijn dat enkel de juiste deelnemers zich in de uitwisseling bevinden en dat hun vingerafdrukken correct zijn.</string>
<string name="btn_start_exchange">Uitwisseling starten</string>
@@ -1139,15 +1183,15 @@
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
<string name="title_unlock_method">Kies een ontgrendelingsmethode</string>
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<string name="enter_passphrase">Voer wachtwoord in</string>
<string name="passphrase">Wachtwoord</string>
<string name="noPassphrase">Geen wachtwoord</string>
<string name="no_passphrase_set">Geen wachtwoord ingesteld</string>
- <string name="passphrases_match">Wachtwoorden komen niet overeen</string>
+ <string name="passphrases_match">Wachtwoorden komen overeen</string>
<string name="passphrase_saved">Wachtwoord opgeslagen</string>
<string name="passphrase_invalid">Wachtwoord ongeldig</string>
- <string name="missing_passphrase">Ontbrekend wachtwoord</string>
+ <string name="missing_passphrase">Wachtwoord ontbreekt</string>
<string name="passphrase_again">Opnieuw</string>
<string name="lockpattern">Vergrendelingspatroon</string>
<string name="lockpatternNFC">NFC + vergrendelingspatroon</string>
@@ -1162,4 +1206,51 @@
<string name="nfc_write_succesful">Succesvol geschreven op NFC-tag</string>
<string name="unlocked">Ontgrendeld</string>
<string name="nfc_settings">Instellingen</string>
+ <string name="snack_yubikey_view">Bekijken</string>
+ <string name="snack_yubikey_import">Importeren</string>
+ <string name="button_bind_key">Sleutel binden</string>
+ <string name="yubikey_serno">Serienummer: %s</string>
+ <string name="yubikey_key_holder">Sleutelhouder:</string>
+ <string name="yubikey_key_holder_not_set">Sleutelhouder: &lt;niet ingesteld&gt;</string>
+ <string name="yubikey_status_bound">YubiKey komt overeen en is gebonden aan sleutel</string>
+ <string name="yubikey_status_unbound">YubiKey komt overeen en kan worden gebonden aan sleutel</string>
+ <string name="yubikey_status_partly">YubiKey komt overeen en is gedeeltelijk gebonden aan sleutel</string>
+ <string name="yubikey_create">Hou de YubiKey tegen de achterkant van je toestel.</string>
+ <string name="btn_import">Importeren</string>
+ <string name="snack_yubi_other">Andere sleutel opgeslagen op YubiKey!</string>
+ <string name="error_nfc">NFC-fout: %s</string>
+ <string name="error_pin">NFC: ongeldige PIN; %d resterende pogingen.</string>
+ <string name="error_nfc_terminated">NFC: smartcard in beëindigingsstaat</string>
+ <string name="error_nfc_wrong_length">NFC: verkeerde lengte voor verzonden / ontvangen gegevens</string>
+ <string name="error_nfc_conditions_not_satisfied">NFC: gebruiksvoorwaarden niet voldaan</string>
+ <string name="error_nfc_security_not_satisfied">NFC: veiligheidsstatus niet voldaan</string>
+ <string name="error_nfc_authentication_blocked">NFC: PIN geblokkeerd na te veel pogingen</string>
+ <string name="error_nfc_data_not_found">NFC: sleutel of object niet gevonden</string>
+ <string name="error_nfc_unknown">NFC: onbekende fout</string>
+ <string name="error_nfc_bad_data">NFC: kaart gaf ongeldige gegevens weer</string>
+ <string name="error_nfc_chaining_error">NFC: kaart verwachtte laatste commando in een reeks</string>
+ <string name="error_nfc_header">NFC: kaart gaf ongeldige %s byte weer</string>
+ <string name="error_pin_nodefault">Standaard-PIN geweigerd!</string>
+ <string name="btn_delete_original">Oorspronkelijk bestand verwijderen</string>
+ <string name="snack_encrypt_filenames_on">Bestandsnamen <b>zijn</b> versleuteld.</string>
+ <string name="snack_encrypt_filenames_off">Bestandsnamen <b>zijn niet</b> versleuteld.</string>
+ <string name="snack_armor_on">Uitvoer geëncodeerd als tekst.</string>
+ <string name="snack_armor_off">Uitvoer geëncodeerd als binair.</string>
+ <string name="snack_compression_on">Compressie <b>ingeschakeld</b>.</string>
+ <string name="snack_compression_off">Compressie <b>uitgeschakeld</b>.</string>
+ <string name="error_loading_keys">Fout bij laden van sleutels!</string>
+ <string name="error_empty_log">(fout, leeg log)</string>
+ <string name="error_reading_text">Kon invoer niet lezen om te ontsleutelen!</string>
+ <string name="filename_unknown">&lt;geen bestandsnaam&gt;</string>
+ <string name="filename_unknown_text">&lt;platte tekstgegevens&gt;</string>
+ <string name="intent_show">Toon ondertekende/versleutelde inhoud</string>
+ <string name="view_internal">Bekijken in OpenKeychain</string>
+ <string name="error_preparing_data">Fout bij voorbereiden van gegevens!</string>
+ <string name="label_clip_title">Versleutelde gegevens</string>
+ <string name="progress_processing">Bezig met verwerken…</string>
+ <string name="error_saving_file">Fout bij opslaan van bestand!</string>
+ <string name="file_saved">Bestand opgeslagen!</string>
+ <string name="file_delete_ok">Oorspronkelijk bestand verwijderd.</string>
+ <string name="file_delete_none">Geen bestand verwijderd! (Misschien was het al verwijderd?)</string>
+ <string name="file_delete_exception">Oorspronkelijk bestand kon niet worden verwijderd!</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-pl/strings.xml b/OpenKeychain/src/main/res/values-pl/strings.xml
index caa9092e5..1cf1c9958 100644
--- a/OpenKeychain/src/main/res/values-pl/strings.xml
+++ b/OpenKeychain/src/main/res/values-pl/strings.xml
@@ -4,17 +4,19 @@
http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
<string name="app_name">OpenKeychain</string>
<!--title-->
+ <string name="title_encrypt_text">Szyfruj</string>
+ <string name="title_encrypt_files">Szyfruj</string>
<string name="title_decrypt">Odszyfruj</string>
- <string name="title_unlock">Odblokuj klucz</string>
<string name="title_add_subkey">Dodaj pod-klucz</string>
<string name="title_edit_key">Edytuj klucz</string>
<string name="title_preferences">Ustawienia</string>
<string name="title_api_registered_apps">Aplikacje</string>
- <string name="title_key_server_preference">Serwery kluczy</string>
+ <string name="title_key_server_preference">Serwery kluczy OpenPGP</string>
<string name="title_change_passphrase">Zmień hasło</string>
- <string name="title_share_fingerprint_with">Podziel się odciskiem klucza przez...</string>
- <string name="title_share_key">Podziel się kluczem przez...</string>
- <string name="title_share_file">Podziel się plikiem przez...</string>
+ <string name="title_share_fingerprint_with">Wyślij odcisk klucza przez...</string>
+ <string name="title_share_key">Wyślij klucz przez...</string>
+ <string name="title_share_file">Wyślij plik przez...</string>
+ <string name="title_share_message">Wyślij tekst przez...</string>
<string name="title_encrypt_to_file">Zaszyfruj do pliku</string>
<string name="title_decrypt_to_file">Odszyfruj do pliku</string>
<string name="title_import_keys">Importuj klucze</string>
@@ -26,22 +28,20 @@
<string name="title_help">Pomoc</string>
<string name="title_log_display">Logi</string>
<string name="title_exchange_keys">Wymień się kluczami</string>
- <string name="title_advanced_key_info">Zaawansowane informacje o kluczu</string>
+ <string name="title_manage_my_keys">Zarządzaj kluczami</string>
<!--section-->
<string name="section_user_ids">Tożsamości</string>
<string name="section_keys">Pod-klucze</string>
<string name="section_cloud_search">Szukanie w Chmurze</string>
- <string name="section_passphrase_cache">Pamięć cache hasła</string>
+ <string name="section_certify">Zatwierdź</string>
<string name="section_actions">Działania</string>
<string name="section_share_key">Klucz</string>
<string name="section_key_server">Serwer kluczy</string>
<string name="section_fingerprint">Odcisk klucza</string>
<string name="section_encrypt">Zaszyfruj</string>
- <string name="section_decrypt">Odszyfruj</string>
<!--button-->
<string name="btn_decrypt_verify_file">Odszyfruj, weryfikuj i zapisz plik</string>
<string name="btn_encrypt_share_file">Szyfruj i podziel się plikiem</string>
- <string name="btn_save">Zapisz</string>
<string name="btn_do_not_save">Anuluj</string>
<string name="btn_delete">Usuń</string>
<string name="btn_no_date">Bez wygaśnięcia</string>
@@ -52,10 +52,6 @@
<string name="btn_view_cert_key">Wyświetl klucz certyfikacji</string>
<string name="btn_create_key">Utwórz klucz</string>
<string name="btn_add_files">Dodaj plik(i)</string>
- <string name="btn_add_share_decrypted_text">Podziel się odszyfrowanym tekstem</string>
- <string name="btn_decrypt_clipboard">Odszyfruj ze schowka</string>
- <string name="btn_decrypt_and_verify">oraz zweryfikuj podpisy</string>
- <string name="btn_decrypt_files">Odszyfruj pliki</string>
<string name="btn_encrypt_files">Zaszyfruj pliki</string>
<string name="btn_encrypt_text">Zaszyfruj tekst</string>
<!--menu-->
@@ -68,15 +64,11 @@
<string name="menu_encrypt_to">Zaszyfruj do...</string>
<string name="menu_select_all">Wybierz wszystko</string>
<string name="menu_export_all_keys">Eksportuj wszystkie klucze</string>
- <string name="menu_advanced">Pokaż zaawansowane informacje</string>
<!--label-->
<string name="label_file">Plik</string>
<string name="label_files">Plik(i)</string>
<string name="label_file_colon">Plik:</string>
- <string name="label_no_passphrase">Brak hasła</string>
- <string name="label_passphrase">Hasło</string>
<string name="label_unlock">Odblokowywanie...</string>
- <string name="label_passphrase_again">Powtórz hasło</string>
<string name="label_algorithm">Algorytm</string>
<string name="label_ascii_armor">Plik ASCII Armor</string>
<string name="label_file_ascii_armor">Włącz ASCII Armor</string>
@@ -90,11 +82,7 @@
<string name="label_delete_after_decryption">Usuń po odszyfrowaniu</string>
<string name="label_encryption_algorithm">Algorytm szyfrowania</string>
<string name="label_hash_algorithm">Funkcja skrótu</string>
- <string name="label_symmetric">Szyfruj z hasłem</string>
- <string name="label_passphrase_cache_ttl">Czas pamięci cache</string>
- <string name="label_passphrase_cache_subs">Pamiętaj hasła względem pod-klucza:</string>
<string name="label_file_compression">Kompresja pliku</string>
- <string name="label_keyservers">Serwery kluczy</string>
<string name="label_key_id">Identyfikator klucza</string>
<string name="label_creation">Utworzenia</string>
<string name="label_expiry">Wygaśnięcia</string>
@@ -151,19 +139,13 @@
<string name="flag_encrypt">Szyfruj</string>
<string name="flag_authenticate">Uwierzytelniaj</string>
<!--sentences-->
- <string name="wrong_passphrase">Nieprawidłowe hasło.</string>
<string name="no_filemanager_installed">Nie zainstalowano żadnego kompatybilnego menadżera plików.</string>
- <string name="passphrases_do_not_match">Hasła nie pasują do siebie</string>
- <string name="passphrase_must_not_be_empty">Podaj hasło.</string>
<string name="passphrase_for_symmetric_encryption">Szyfrowanie symetryczne.</string>
- <string name="passphrase_for">Podaj hasło dla \'%s\'</string>
<string name="pin_for">Wpisz PIN dla \'%s\'</string>
<string name="nfc_text">Trzymaj YubiKey z tyłu Twojego urządzenia.</string>
- <string name="no_file_selected">Najpierw wskaż plik.</string>
<string name="encrypt_sign_successful">Pomyślnie podpisano i/lub zaszyfrowano.</string>
<string name="encrypt_sign_clipboard_successful">Pomyslnie podpisano i/lub zaszyfrowano do schowka.</string>
<string name="select_encryption_key">Wybierz co najmniej jeden klucz szyfrujący.</string>
- <string name="error_no_encryption_or_signature_key">Wybierz co najmniej jeden klucz szyfrujący lub klucz podpisujący.</string>
<string name="also_export_secret_keys">Także eksportuj tajne klucze</string>
<string name="reinstall_openkeychain">Napotkałeś się na znany błąd w Androidzie. Proszę ponownie zainstalować OpenKeychain jeśli chcesz połączyć kontakty z kluczami.</string>
<string name="key_exported">Pomyślnie wyeksportowano 1 klucz.</string>
@@ -190,13 +172,10 @@
<string name="error_external_storage_not_ready">zewnętrzne urządzenie jest niegotowe</string>
<string name="error_key_size_minimum512bit">klucz musi mieć rozmiar co najmniej 512 bitów</string>
<string name="error_unknown_algorithm_choice">wybrano nieznany algorytm</string>
- <string name="error_user_id_no_email">nie znaleziono adresu email</string>
<string name="error_key_needs_a_user_id">potrzeba przynajmniej jeden tożsamości</string>
- <string name="error_no_signature_passphrase">nie podano hasła</string>
<string name="error_no_signature_key">nie podano klucza podpisu</string>
<string name="error_invalid_data">Brak treści szyfrowanej lub podpisanej OpenPGP!</string>
<string name="error_integrity_check_failed">Sprawdzanie spójności zakończone niepowodzeniem! Dane były modyfikowane!</string>
- <string name="error_wrong_passphrase">nieprawidłowe hasło</string>
<string name="error_could_not_extract_private_key">nie można wyodrębnić klucza prywatnego</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Potrzebujesz Androida 4.1 aby korzystać z Android NFC Beam</string>
@@ -206,11 +185,6 @@
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">Nie podpisane</string>
<string name="decrypt_result_invalid_signature">Nieprawidłowy podpis!</string>
- <string name="decrypt_result_signature_uncertified">Podpisane przez (bez certyfikacji)</string>
- <string name="decrypt_result_signature_certified">Podpisany przez</string>
- <string name="decrypt_result_signature_expired_key">Klucz już wygasł!</string>
- <string name="decrypt_result_signature_revoked_key">Klucz został unieważniony!</string>
- <string name="decrypt_result_signature_missing_key">Nieznany klucz publiczny</string>
<string name="decrypt_result_encrypted">Szyfrowane</string>
<string name="decrypt_result_not_encrypted">Nie szyfrowane</string>
<string name="decrypt_result_action_show">Pokaż</string>
@@ -242,7 +216,6 @@
<string name="progress_modify_subkeyrevoke">unieważnianie pod-kluczy...</string>
<string name="progress_modify_subkeystrip">usuwanie podkluczy...</string>
<string name="progress_modify_subkeyadd">dodawanie pod-kluczy...</string>
- <string name="progress_modify_passphrase">zmienianie hasła...</string>
<plurals name="progress_exporting_key">
<item quantity="one">eksportowanie klucza...</item>
<item quantity="few">eksportowanie kluczy...</item>
@@ -304,11 +277,10 @@
<string name="import_tab_qr_code">Kod QR/NFC</string>
<string name="import_import">Zaimportuj wybrane klucze</string>
<string name="import_qr_code_wrong">Kod QR zniekształcony! Spróbuj jeszcze raz!</string>
- <string name="import_qr_code_too_short_fingerprint">Odcisk klucza jest za krótki (&lt; 16 znaków)</string>
<string name="import_qr_code_button">Skanuj kod QR</string>
<string name="import_qr_code_text">Umieść kod QR przed kamerą!</string>
+ <!--Import from URL-->
<!--Generic result toast-->
- <string name="snackbar_details">Szczegóły</string>
<string name="with_warnings">, z ostrzeżeniami</string>
<string name="with_cancelled">, aż anulowano</string>
<!--Import result toast-->
@@ -389,10 +361,6 @@
<string name="intent_send_encrypt">Zaszyfruj korzystając z OpenKeychain</string>
<string name="intent_send_decrypt">Deszyfruj korzystając z OpenKeychain</string>
<!--Remote API-->
- <string name="api_settings_show_info">Pokaż zaawansowane informacje</string>
- <string name="api_settings_hide_info">Ukryj zaawansowane informacje</string>
- <string name="api_settings_show_advanced">Pokaż zaawanowane ustawienia</string>
- <string name="api_settings_hide_advanced">Ukryj zaawansowane ustawienia</string>
<string name="api_settings_no_key">Nie wybrano klucza</string>
<string name="api_settings_select_key">Wybierz klucz</string>
<string name="api_settings_save">Zapisz</string>
@@ -403,7 +371,6 @@
<string name="api_settings_delete_account">Usuń konto</string>
<string name="api_settings_package_name">Nazwa paczki</string>
<string name="api_settings_package_signature">Skrót SHA-256 podpisu paczki</string>
- <string name="api_settings_accounts">Konta (przestarzłe API)</string>
<string name="api_settings_settings">Ustawienia</string>
<string name="api_settings_key">Klucz konta:</string>
<string name="api_settings_accounts_empty">Brak kont połączonych z tą aplikacją.</string>
@@ -455,7 +422,6 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<!--Key trust-->
<!--keybase proof stuff-->
<!--Edit key-->
- <string name="edit_key_action_change_passphrase">Zmień hasło</string>
<string name="edit_key_action_add_identity">Dodaj tożsamość</string>
<string name="edit_key_action_add_subkey">Dodaj pod-klucz</string>
<string name="edit_key_edit_user_id_title">Wybierz zadanie!</string>
@@ -468,25 +434,24 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
</string-array>
<string name="edit_key_edit_user_id_revoked">Ta tożsamość została unieważniona. Tego już nie można cofnąć.</string>
<string name="edit_key_edit_subkey_title">Wybierz zadanie!</string>
- <string-array name="edit_key_edit_subkey">
- <item>Zmień wygaśnięcie</item>
- <item>Unieważnij Pod-klucz</item>
- <item>Usuń Pod-klucz</item>
- <item>"Move Subkey to Yubikey / Smart Card"</item>
- </string-array>
<string name="edit_key_new_subkey">nowy pod-klucz</string>
<string name="edit_key_select_flag">Prosimy o wybranie przynajmniej jeden flagi!</string>
<string name="edit_key_error_add_identity">Dodaj przynajmniej jedną tożsamość!</string>
<string name="edit_key_error_add_subkey">Dodaj przynajmniej jeden pod-klucz!</string>
<!--Create key-->
+ <string name="create_key_upload">Synchronizuj z chmurą</string>
<string name="create_key_empty">Dane pole jest wymagane</string>
- <string name="create_key_passphrases_not_equal">Hasła nie zgadzają się</string>
<string name="create_key_final_text">Wpisałeś następującą tożsamość:</string>
<string name="create_key_final_robot_text">Tworzenie klucza może zająć trochę czasu... w międzyczasie idź się napij kawy.</string>
<string name="create_key_rsa">(3 pod-klucze, RSA, 4096 bit)</string>
<string name="create_key_custom">(niestandardowa konfiguracja kluczy)</string>
- <string name="create_key_edit">Zmień klucz konfiguracji</string>
+ <string name="create_key_name_text">Wybierz imię powiązane z tym kluczem. Może to być imię i nazwisko, np: \'Jan Kowalski\', lub nick, np: \'Jaś\'.</string>
+ <string name="create_key_email_text">Wpisz twój główny adres email używany do bezpiecznej komunikacji.</string>
+ <string name="create_key_passphrase_text">Utwórz mocne hasło. W przypadku kradzieży urządzenia będzie chronić twój klucz.</string>
+ <string name="create_key_hint_full_name">Pełne imię lub przezwisko</string>
+ <string name="create_key_edit">Zmień ustawienia klucza</string>
<!--View key-->
+ <!--Add keyserver-->
<!--Navigation Drawer-->
<string name="nav_keys">Klucze</string>
<string name="nav_encrypt_decrypt">Zaszyfruj/Odszyfruj</string>
@@ -528,7 +493,6 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<string name="msg_cr_error_internal_pgp">Błąd wewnętrzny PGP!</string>
<!--modifySecretKeyRing-->
<string name="msg_mf_error_pgp">Błąd wewnętrzny PGP!</string>
- <string name="msg_mf_passphrase">Zmiana hasła dla pęku kluczy</string>
<string name="msg_mf_error_past_expiry">Data ważności nie może być przeszła!</string>
<string name="msg_mf_subkey_revoke">Unieważnianie pod-klucza %s</string>
<string name="msg_mf_uid_error_empty">ID użytkownika nie może być pusty!</string>
@@ -550,8 +514,6 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<string name="msg_dc_clear_signature_check">Weryfikowanie danych podpisu...</string>
<string name="msg_dc_clear_signature_ok">Sprawdzanie podpisu jest OK</string>
<string name="msg_dc_ok_meta_only">Tylko metadane były wymagane, pomijanie odszyfrowania</string>
- <string name="msg_dc_pass_cached">Użycie hasła z pamięci cache</string>
- <string name="msg_dc_pending_passphrase">Hasło wymagane, wymagana reakcja użytkownika...</string>
<string name="msg_dc">Rozpoczynanie operacji odszyfrowania...</string>
<!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
@@ -600,11 +562,6 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
</plurals>
<!--Messages for Export Log operation-->
<!--PassphraseCache-->
- <string name="passp_cache_notif_click_to_clear">Kliknij, aby wyczyścić zapamiętane hasła</string>
- <string name="passp_cache_notif_n_keys">OpenKeychain zapamiętał %d haseł</string>
- <string name="passp_cache_notif_keys">Zapamiętane hasła:</string>
- <string name="passp_cache_notif_clear">Wyczyść pamięć cache</string>
- <string name="passp_cache_notif_pwd">Hasło</string>
<!--First Time-->
<string name="first_time_text1">Weź prywatność w swoje ręce używając OpenKeychain!</string>
<string name="first_time_skip">Pomiń ustawienia</string>
@@ -620,7 +577,6 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<string name="error_key_not_found">Nie znaleziono klucza!</string>
<string name="error_key_processing">Błąd przy przetwarzaniu klucza!</string>
<string name="key_stripped">zredukowany</string>
- <string name="key_no_passphrase">brak hasła</string>
<string name="key_unavailable">niedostepne</string>
<string name="secret_cannot_multiple">Twoje klucze mogą być usuwane tylko pojedynczo!</string>
<string name="title_view_cert">Zweryfikuj szczegóły certyfikatu</string>
@@ -634,6 +590,6 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<string name="btn_start_exchange">Rozpocznij wymianę</string>
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-pt/strings.xml b/OpenKeychain/src/main/res/values-pt/strings.xml
index 518b80f47..8f84af665 100644
--- a/OpenKeychain/src/main/res/values-pt/strings.xml
+++ b/OpenKeychain/src/main/res/values-pt/strings.xml
@@ -27,6 +27,7 @@
<!--compression-->
<!--Help-->
<!--Import-->
+ <!--Import from URL-->
<!--Generic result toast-->
<!--Import result toast-->
<!--Delete result toast-->
@@ -41,6 +42,7 @@
<!--Edit key-->
<!--Create key-->
<!--View key-->
+ <!--Add keyserver-->
<!--Navigation Drawer-->
<!--hints-->
<!--certs-->
@@ -65,6 +67,6 @@
<!--unsorted-->
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-ro/strings.xml b/OpenKeychain/src/main/res/values-ro/strings.xml
index 518b80f47..8f84af665 100644
--- a/OpenKeychain/src/main/res/values-ro/strings.xml
+++ b/OpenKeychain/src/main/res/values-ro/strings.xml
@@ -27,6 +27,7 @@
<!--compression-->
<!--Help-->
<!--Import-->
+ <!--Import from URL-->
<!--Generic result toast-->
<!--Import result toast-->
<!--Delete result toast-->
@@ -41,6 +42,7 @@
<!--Edit key-->
<!--Create key-->
<!--View key-->
+ <!--Add keyserver-->
<!--Navigation Drawer-->
<!--hints-->
<!--certs-->
@@ -65,6 +67,6 @@
<!--unsorted-->
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-sl/strings.xml b/OpenKeychain/src/main/res/values-sl/strings.xml
index 21c528820..4498cccb3 100644
--- a/OpenKeychain/src/main/res/values-sl/strings.xml
+++ b/OpenKeychain/src/main/res/values-sl/strings.xml
@@ -7,13 +7,10 @@
<string name="title_encrypt_text">Šifriraj</string>
<string name="title_encrypt_files">Šifriraj</string>
<string name="title_decrypt">Dešifriraj</string>
- <string name="title_unlock">Odkleni ključ</string>
<string name="title_add_subkey">Dodaj podključ</string>
<string name="title_edit_key">Uredi ključ</string>
<string name="title_preferences">Nastavitve</string>
<string name="title_api_registered_apps">Aplikacije</string>
- <string name="title_key_server_preference">Strežniki javnih ključev</string>
- <string name="title_change_passphrase">Spremeni geslo</string>
<string name="title_share_fingerprint_with">Deli prstni odtis z...</string>
<string name="title_share_key">Deli ključ z...</string>
<string name="title_share_file">Deli datoteko z...</string>
@@ -30,7 +27,6 @@
<string name="title_help">Pomoč</string>
<string name="title_log_display">Dnevnik</string>
<string name="title_exchange_keys">Izmenjava ključev</string>
- <string name="title_advanced_key_info">Napredne informacije o ključu</string>
<string name="title_delete_secret_key">Izbrišem VAŠ ključ \'%s\'?</string>
<string name="title_export_log">Izvozi sistemsko zabeležbo</string>
<string name="title_manage_my_keys">Upravljanje mojih ključev</string>
@@ -42,21 +38,18 @@
<string name="section_cloud_evidence">Dokazila iz oblaka</string>
<string name="section_keys">Podključi</string>
<string name="section_cloud_search">Iskanje v oblaku</string>
- <string name="section_passphrase_cache">Hranjenje gesla v spominu</string>
<string name="section_certify">Potrdi</string>
<string name="section_actions">Ravnanja</string>
<string name="section_share_key">Ključ</string>
<string name="section_key_server">Strežnik</string>
<string name="section_fingerprint">Prstni odtis</string>
<string name="section_encrypt">Šifriraj</string>
- <string name="section_decrypt">Dešifriraj</string>
<string name="section_current_expiry">Trenuten datum poteka</string>
<string name="section_new_expiry">Nov datum poteka</string>
<!--button-->
<string name="btn_decrypt_verify_file">Dešifriraj, preveri in shrani</string>
<string name="btn_encrypt_share_file">Šifriraj in deli datoteko</string>
<string name="btn_encrypt_save_file">Šifriraj in shrani datoteko</string>
- <string name="btn_save">Shrani</string>
<string name="btn_do_not_save">Prekliči</string>
<string name="btn_delete">Izbriši</string>
<string name="btn_no_date">Ne preteče</string>
@@ -71,10 +64,6 @@
<string name="btn_view_cert_key">Poglej ključ za overjanje</string>
<string name="btn_create_key">Ustvari ključ</string>
<string name="btn_add_files">Dodaj datoteko</string>
- <string name="btn_add_share_decrypted_text">Deli dešifrirano besedilo</string>
- <string name="btn_decrypt_clipboard">Dešifriraj besedilo iz odložišča</string>
- <string name="btn_decrypt_and_verify">in preveri podpise</string>
- <string name="btn_decrypt_files">Dešifriraj datoteke</string>
<string name="btn_encrypt_files">Šifriraj datoteke</string>
<string name="btn_encrypt_text">Šifriraj besedilo</string>
<string name="btn_add_email">Dodaj elektronske naslove</string>
@@ -91,7 +80,6 @@
<string name="menu_select_all">Izberi vse</string>
<string name="menu_export_all_keys">Izvozi vse ključe</string>
<string name="menu_update_all_keys">Posodobi vse ključe</string>
- <string name="menu_advanced">Prikaži dodatne informacije</string>
<string name="menu_certify_fingerprint">Potrdi s primerjavo prstnih odtisov</string>
<string name="menu_export_log">Izvozi sistemsko zabeležbo</string>
<!--label-->
@@ -99,11 +87,7 @@
<string name="label_file">Datoteka</string>
<string name="label_files">Datoteke</string>
<string name="label_file_colon">Datoteka:</string>
- <string name="label_no_passphrase">Brez gesla</string>
- <string name="label_passphrase">Geslo</string>
<string name="label_unlock">Odklepanje...</string>
- <string name="label_passphrase_again">Ponovi geslo</string>
- <string name="label_show_passphrase">Prikaži geslo</string>
<string name="label_algorithm">Algoritem</string>
<string name="label_ascii_armor">ASCII oklep datotek</string>
<string name="label_file_ascii_armor">Omogoči ASCII ovoj</string>
@@ -118,12 +102,8 @@
<string name="label_delete_after_decryption">Izbriši po dešifriranju</string>
<string name="label_encryption_algorithm">Šifrirni algoritem</string>
<string name="label_hash_algorithm">Zgostitveni algoritem</string>
- <string name="label_symmetric">Šifriranje z geslom</string>
- <string name="label_passphrase_cache_ttl">Čas pomnjenja</string>
- <string name="label_passphrase_cache_subs">Pomni gesla glede na podključ</string>
<string name="label_message_compression">Kompresija besedila</string>
<string name="label_file_compression">Stiskanje datotek</string>
- <string name="label_keyservers">Strežniki</string>
<string name="label_key_id">ID ključa</string>
<string name="label_creation">Ustvarjanje</string>
<string name="label_expiry">Pretek</string>
@@ -142,10 +122,6 @@
<string name="label_enable_compression">Omogoči kompresijo</string>
<string name="label_encrypt_filenames">Šifriraj imena datotek</string>
<string name="label_hidden_recipients">Skrij prejemnike</string>
- <string name="pref_keyserver">Preišči strežnik s ključi</string>
- <string name="pref_keyserver_summary">Preišči strežnik HKP</string>
- <string name="pref_keybase">Preišči strežnik Keybase.io</string>
- <string name="pref_keybase_summary">Preišči seznam Keybase.io</string>
<string name="user_id_no_name">&lt;brez imena&gt;</string>
<string name="none">&lt;nič&gt;</string>
<plurals name="n_keys">
@@ -189,23 +165,17 @@
<string name="flag_encrypt">Šifriraj</string>
<string name="flag_authenticate">Preveri avtentičnost</string>
<!--sentences-->
- <string name="wrong_passphrase">Napačno geslo.</string>
<string name="no_filemanager_installed">Nimate nameščenega združljivega upravljalnika datotek.</string>
- <string name="passphrases_do_not_match">Gesli se ne ujemata.</string>
- <string name="passphrase_must_not_be_empty">Vnesite geslo.</string>
<string name="passphrase_for_symmetric_encryption">Simetrično šifriranje.</string>
- <string name="passphrase_for">Vnesite geslo za \'%s\'</string>
<string name="pin_for">Vnesite PIN kodo za \'%s\'</string>
<string name="yubikey_pin_for">Vnesite PIN kodo za dostop YubiKey za \'%s\'</string>
<string name="nfc_text">Prislonite YubiKey k hrbtišču mobilne naprave.</string>
<string name="file_delete_confirmation_title">Izbrišem izvirne datoteke?</string>
<string name="file_delete_confirmation">Izbrisane bodo naslednje datoteke:%s</string>
<string name="file_delete_successful">Izbrisanih je bilo %1$d od %2$d datotek.%3$s</string>
- <string name="no_file_selected">Najprej izberite datoteko.</string>
<string name="encrypt_sign_successful">Uspešno podpisano in/ali šifrirano.</string>
<string name="encrypt_sign_clipboard_successful">Uspešno podpisano in/ali šifrirano ter poslano v odložišče.</string>
<string name="select_encryption_key">Izberite vsaj en šifrirni ključ.</string>
- <string name="error_no_encryption_or_signature_key">Vnesite vsaj en šifrirni ključ ali ključ za podpisovanje.</string>
<string name="specify_file_to_encrypt_to">Določite datoteko, v katero želite šifrirati vsebino.\nPOZOR: če datoteka že obstaja, bo prepisana.</string>
<string name="specify_file_to_decrypt_to">Določite datoteko, v katero želite dešifrirati vsebino.\nPOZOR: če datoteka že obstaja, bo prepisana.</string>
<string name="specify_file_to_export_to">Določite datoteko, v katero želite izvoziti vsebino.\nPOZOR: če datoteka že obstaja, bo prepisana.</string>
@@ -243,13 +213,10 @@
<string name="error_external_storage_not_ready">zunanja shramba ni na voljo</string>
<string name="error_key_size_minimum512bit">velikost ključa mora biti najmanj 512bit</string>
<string name="error_unknown_algorithm_choice">neznana izbira algoritma</string>
- <string name="error_user_id_no_email">najti ni nobene e-pošte</string>
<string name="error_key_needs_a_user_id">potrebujete vsaj eno identiteto</string>
- <string name="error_no_signature_passphrase">dano ni bilo nobeno geslo</string>
<string name="error_no_signature_key">dan ni bil noben podpisni ključ</string>
<string name="error_invalid_data">Ne najdem nobene vsebine šifrirane ali podpisane z OpenPGP!</string>
<string name="error_integrity_check_failed">Preverba neokrnjenosti ni bila uspešna! Podatki so bili spremenjeni!</string>
- <string name="error_wrong_passphrase">napačno geslo</string>
<string name="error_could_not_extract_private_key">ne morem izvleči zasebnega ključa</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Za uporabo storitve NFC Beam potrebujete najmanj Android 4.1!</string>
@@ -261,16 +228,10 @@
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">Ni podpisano</string>
<string name="decrypt_result_invalid_signature">Neveljaven podpis!</string>
- <string name="decrypt_result_signature_uncertified">Podpisal (ne overjen!)</string>
- <string name="decrypt_result_signature_certified">Podpisal</string>
- <string name="decrypt_result_signature_expired_key">Ključ je pretekel!</string>
- <string name="decrypt_result_signature_revoked_key">Ključ je bil preklican!</string>
- <string name="decrypt_result_signature_missing_key">Neznan javni ključ</string>
<string name="decrypt_result_encrypted">Šifrirano</string>
<string name="decrypt_result_not_encrypted">Nešifrirano</string>
<string name="decrypt_result_action_show">Prikaži</string>
<string name="decrypt_result_action_Lookup">Poišči</string>
- <string name="decrypt_invalid_text">Nekaj ni v redu: ali je neveljaven podpis ali pa je ključ potekel oz. bil preklican. Zato se ne da reči, kdo je v resnici napisal besedilo. Naj ga vseeno prikažem?</string>
<string name="decrypt_invalid_button">Seznanjen sem s tveganji, prikaži!</string>
<!--Add keys-->
<string name="add_keys_my_key">Moj ključ:</string>
@@ -300,7 +261,6 @@
<string name="progress_modify_subkeyrevoke">preklicevanje podključev...</string>
<string name="progress_modify_subkeystrip">razstavljam podključe...</string>
<string name="progress_modify_subkeyadd">dodajanje podključev...</string>
- <string name="progress_modify_passphrase">menjava gesla...</string>
<plurals name="progress_exporting_key">
<item quantity="one">izvažam ključ...</item>
<item quantity="two">izvažam ključa...</item>
@@ -367,11 +327,10 @@
<string name="import_tab_qr_code">Koda QR/NFC</string>
<string name="import_import">Uvozi izbrane ključe</string>
<string name="import_qr_code_wrong">Koda QR je deformirana! Poskusite znova!</string>
- <string name="import_qr_code_too_short_fingerprint">Prstni odtis je prekratek (&lt; 16 znakov)</string>
<string name="import_qr_code_button">Skeniraj kodo QR</string>
<string name="import_qr_code_text">Zajamite kodo QR s kamero!</string>
+ <!--Import from URL-->
<!--Generic result toast-->
- <string name="snackbar_details">Podrobnosti</string>
<string name="with_warnings">, z opozorili</string>
<string name="with_cancelled">, do preklica</string>
<!--Import result toast-->
@@ -465,10 +424,6 @@
<string name="intent_send_encrypt">Šifriraj z OpenKeychain</string>
<string name="intent_send_decrypt">Dešifriraj z OpenKeychain</string>
<!--Remote API-->
- <string name="api_settings_show_info">Pokaži dodatne informacije</string>
- <string name="api_settings_hide_info">Skrij dodatne informacije</string>
- <string name="api_settings_show_advanced">Pokaži napredne nastavitve</string>
- <string name="api_settings_hide_advanced">Skrij napredne nastavitve</string>
<string name="api_settings_no_key">Izbran ni bil noben ključ</string>
<string name="api_settings_select_key">Izberite ključ</string>
<string name="api_settings_create_key">Ustvari nov ključ</string>
@@ -480,8 +435,6 @@
<string name="api_settings_delete_account">Izbriši račun</string>
<string name="api_settings_package_name">Ime paketa</string>
<string name="api_settings_package_signature">SHA-256 podpisa paketa</string>
- <string name="api_settings_accounts">Računi (opuščen API)</string>
- <string name="api_settings_advanced">Dodatne informacije</string>
<string name="api_settings_allowed_keys">Dovoljeni ključi</string>
<string name="api_settings_settings">Nastavitve</string>
<string name="api_settings_key">Ključ računa:</string>
@@ -570,7 +523,6 @@
<string name="keybase_reddit_proof">Datoteka JSON</string>
<string name="keybase_verify">Overi</string>
<!--Edit key-->
- <string name="edit_key_action_change_passphrase">Zamenjaj geslo</string>
<string name="edit_key_action_add_identity">Dodaj identiteto</string>
<string name="edit_key_action_add_subkey">Dodaj podključ</string>
<string name="edit_key_edit_user_id_title">Izberite dejanje!</string>
@@ -583,12 +535,6 @@
</string-array>
<string name="edit_key_edit_user_id_revoked">Identiteta je bila preklicana. Ta poteza ne more biti razveljavljena.</string>
<string name="edit_key_edit_subkey_title">Izberite dejanje!</string>
- <string-array name="edit_key_edit_subkey">
- <item>Spremeni datum poteka</item>
- <item>Prekliči podključ</item>
- <item>Razstavi podključ</item>
- <item>"Move Subkey to Yubikey / Smart Card"</item>
- </string-array>
<string name="edit_key_new_subkey">nov podključ</string>
<string name="edit_key_select_flag">Izberite vsaj eno oznako!</string>
<string name="edit_key_error_add_identity">Dodajte vsaj eno identiteto!</string>
@@ -596,19 +542,16 @@
<!--Create key-->
<string name="create_key_upload">Sinhroniziraj z oblakom</string>
<string name="create_key_empty">To polje je obvezno</string>
- <string name="create_key_passphrases_not_equal">Gesli se ne ujemata</string>
<string name="create_key_final_text">Vnesli ste identiteto:</string>
<string name="create_key_final_robot_text">Ustvarjanje ključa zna potrajati. Privoščite si kavo...</string>
<string name="create_key_rsa">(3 podključi, RSA, 4096 bit)</string>
<string name="create_key_custom">(konfiguracija po meri)</string>
<string name="create_key_name_text">Izberite ime povezano s tem ključem. Lahko je polno ime, npr. \'Marjan Novak\', ali nadimek, npr. \'Mare\'.</string>
<string name="create_key_email_text">Vnesite svoj glavni e-poštni naslov za varno komunikacijo.</string>
- <string name="create_key_passphrase_text">Izberite močno geslo. To bo varovalo vaš ključ v primeru odtujitve naprave.</string>
<string name="create_key_hint_full_name">Polno ime ali nadimek</string>
<string name="create_key_edit">Spremeni konfiguracijo ključa.</string>
<string name="create_key_add_email">Dodaj naslov e-pošte</string>
<string name="create_key_add_email_text">Dodatni e-poštni naslovi so prav tako povezani s tem ključem in so na voljo za varno komunikacijo.</string>
- <string name="create_key_email_already_exists_text">E-poštni naslov je že bil dodan</string>
<!--View key-->
<string name="view_key_revoked">Ključ je preklican: ne smete ga več uporabljati!</string>
<string name="view_key_expired">Ključ je potekel: stvaritelj mora podaljšati njegovo veljavo!</string>
@@ -617,6 +560,7 @@
<string name="view_key_verified">Potrjen ključ</string>
<string name="view_key_unverified">Ključ ni potrjen: za potrditev skenirajte kodo QR!</string>
<string name="view_key_fragment_no_system_contact">&lt;brez&gt;</string>
+ <!--Add keyserver-->
<!--Navigation Drawer-->
<string name="nav_keys">Ključi</string>
<string name="nav_encrypt_decrypt">Šifriraj/Dešifriraj</string>
@@ -745,10 +689,8 @@
<string name="msg_is_pubring_generate">Generiram javno zbirko ključev iz zasebne</string>
<string name="msg_is_subkey_nonexistent">Podključ %s ni na voljo v zasebnem ključu</string>
<string name="msg_is_subkey_ok">Zasebni podključ %s označen kot razpoložljiv</string>
- <string name="msg_is_subkey_empty">Zasebni podključ %s označen kot razpoložljiv, s praznim geslom</string>
<string name="msg_is_subkey_pin">Zasebni podključ %s označen kot razpoložljiv, s PIN kodo</string>
<string name="msg_is_subkey_stripped">Zasebni podključ %s označen kot razstavljen</string>
- <string name="msg_is_subkey_divert">Zasebni podključ %s označen kot \'preusmerjen na pamtno kartico/NFC\'</string>
<string name="msg_is_success_identical">Zbirka ključev ne vsebuje nobenih novih podatkov. Nič za storiti.</string>
<string name="msg_is_success">Zasebna zbirka ključev uspešno uvožena</string>
<!--Keyring Canonicalization log entries-->
@@ -873,10 +815,6 @@
</plurals>
<!--Messages for Export Log operation-->
<!--PassphraseCache-->
- <string name="passp_cache_notif_click_to_clear">Kliknite za izbris zapomnjenih gesel</string>
- <string name="passp_cache_notif_n_keys">OpenKeychain pomni gesla: %d</string>
- <string name="passp_cache_notif_keys">Zapomnjena gesla:</string>
- <string name="passp_cache_notif_pwd">Geslo</string>
<!--First Time-->
<string name="first_time_text1">Vzemite si svojo zasebnost nazaj v svoje roke z OpenKeychain!</string>
<string name="first_time_skip">Preskoči nastavitev</string>
@@ -892,8 +830,6 @@
<string name="error_key_not_found">Ključ ni bil najden!</string>
<string name="error_key_processing">Napaka pri obdelavi ključa!</string>
<string name="key_stripped">slečen</string>
- <string name="key_divert">preusmeri na pametno kartico/NFC</string>
- <string name="key_no_passphrase">brez gesla</string>
<string name="key_unavailable">ni na voljo</string>
<string name="title_view_cert">Preglej podrobosti potrdila</string>
<string name="unknown_algorithm">neznan</string>
@@ -903,6 +839,6 @@
<string name="key_colon">Ključ:</string>
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-sv/strings.xml b/OpenKeychain/src/main/res/values-sv/strings.xml
index 94f4fbe31..8c9735d8f 100644
--- a/OpenKeychain/src/main/res/values-sv/strings.xml
+++ b/OpenKeychain/src/main/res/values-sv/strings.xml
@@ -7,13 +7,12 @@
<string name="title_encrypt_text">Kryptera</string>
<string name="title_encrypt_files">Kryptera</string>
<string name="title_decrypt">Dekryptera</string>
- <string name="title_unlock">Lås upp nyckel</string>
<string name="title_add_subkey">Lägg till undernyckel</string>
<string name="title_edit_key">Redigera nyckel</string>
<string name="title_preferences">Inställningar</string>
<string name="title_api_registered_apps">Appar</string>
- <string name="title_key_server_preference">Nyckelservrar</string>
- <string name="title_change_passphrase">Ändra lösenordsfras</string>
+ <string name="title_key_server_preference">OpenPGP-nyckelservrar</string>
+ <string name="title_change_passphrase">Ändra lösenord</string>
<string name="title_share_fingerprint_with">Dela fingeravtryck med…</string>
<string name="title_share_key">Dela nyckel med…</string>
<string name="title_share_file">Dela fil med…</string>
@@ -30,31 +29,31 @@
<string name="title_help">Hjälp</string>
<string name="title_log_display">Logg</string>
<string name="title_exchange_keys">Utbyt nycklar</string>
- <string name="title_advanced_key_info">Avancerad nyckelinfo</string>
+ <string name="title_advanced_key_info">Förlängd information</string>
<string name="title_delete_secret_key">Radera DIN nyckel \'%s\'?</string>
<string name="title_export_log">Exportera logg</string>
+ <string name="title_manage_my_keys">Hantera mina nycklar</string>
<!--section-->
<string name="section_user_ids">Identiteter</string>
+ <string name="section_yubikey">YubiKey</string>
+ <string name="section_linked_system_contact">Länkade systemkontakten</string>
<string name="section_should_you_trust">Skulle du lita på denna nyckel?</string>
<string name="section_proof_details">Bevisverifiering</string>
<string name="section_cloud_evidence">Bevis från molnet</string>
<string name="section_keys">Undernycklar</string>
<string name="section_cloud_search">Molnsökning</string>
- <string name="section_passphrase_cache">Cache för lösenordsfras</string>
<string name="section_certify">Bekräfta</string>
<string name="section_actions">Åtgärder</string>
<string name="section_share_key">Nyckel</string>
<string name="section_key_server">Nyckelserver</string>
<string name="section_fingerprint">Fingeravtryck</string>
<string name="section_encrypt">Kryptera</string>
- <string name="section_decrypt">Dekryptera</string>
<string name="section_current_expiry">Aktuellt utgångsdatum</string>
<string name="section_new_expiry">Nytt utgångsdaum</string>
<!--button-->
<string name="btn_decrypt_verify_file">Dekryptera, verifiera och spara fil</string>
<string name="btn_encrypt_share_file">Kryptera och dela fil</string>
<string name="btn_encrypt_save_file">Kryptera och spara fil</string>
- <string name="btn_save">Spara</string>
<string name="btn_do_not_save">Avbryt</string>
<string name="btn_delete">Radera</string>
<string name="btn_no_date">Inget utgångsdatum</string>
@@ -69,25 +68,29 @@
<string name="btn_view_cert_key">Visa nyckel för certifiering</string>
<string name="btn_create_key">Skapa nyckel</string>
<string name="btn_add_files">Lägg till fil(er)</string>
- <string name="btn_add_share_decrypted_text">Dela dekrypterad text</string>
- <string name="btn_decrypt_clipboard">Dekryptera text från urklipp</string>
- <string name="btn_decrypt_and_verify">och verifiera signaturer</string>
- <string name="btn_decrypt_files">Dekryptera filer</string>
+ <string name="btn_share_decrypted_text">Dela dekrypterad text</string>
+ <string name="btn_copy_decrypted_text">Kopiera dekrypterad text</string>
<string name="btn_encrypt_files">Kryptera filer</string>
<string name="btn_encrypt_text">Kryptera text</string>
<string name="btn_add_email">Lägg till extra e-postadress</string>
+ <string name="btn_unlock">Lås upp</string>
+ <string name="btn_add_keyserver">Lägg till</string>
+ <string name="btn_save_default">Spara som standard</string>
+ <string name="btn_saved">Sparad!</string>
<!--menu-->
<string name="menu_preferences">Inställningar</string>
<string name="menu_help">Hjälp</string>
<string name="menu_export_key">Exportera till fil</string>
<string name="menu_delete_key">Radera nyckel</string>
+ <string name="menu_manage_keys">Hantera mina nycklar</string>
<string name="menu_search">Sök</string>
<string name="menu_nfc_preferences">NFC-inställningar</string>
<string name="menu_beam_preferences">Beam-inställningar</string>
<string name="menu_encrypt_to">Kryptera till…</string>
<string name="menu_select_all">Markera alla</string>
<string name="menu_export_all_keys">Exportera alla nycklar</string>
- <string name="menu_advanced">Visa avancerad information</string>
+ <string name="menu_update_all_keys">Uppdatera alla nycklar</string>
+ <string name="menu_advanced">Utökad information</string>
<string name="menu_certify_fingerprint">Bekräfta via fingeravtrycksjämförelse</string>
<string name="menu_export_log">Exportera logg</string>
<!--label-->
@@ -95,11 +98,11 @@
<string name="label_file">Fil</string>
<string name="label_files">Fil(er)</string>
<string name="label_file_colon">Fil:</string>
- <string name="label_no_passphrase">Ingen lösenordsfras</string>
- <string name="label_passphrase">Lösenordsfras</string>
+ <string name="label_no_passphrase">Inget lösenord</string>
+ <string name="label_passphrase">Lösenord</string>
<string name="label_unlock">Låser upp…</string>
- <string name="label_passphrase_again">Upprepa lösenordsfras</string>
- <string name="label_show_passphrase">Visa lösenordsfras</string>
+ <string name="label_passphrase_again">Upprepa lösenord</string>
+ <string name="label_show_passphrase">Visa lösenord</string>
<string name="label_algorithm">Algoritm</string>
<string name="label_ascii_armor">Fil i ASCII-format</string>
<string name="label_file_ascii_armor">Aktivera ASCII-format</string>
@@ -114,13 +117,13 @@
<string name="label_delete_after_decryption">Radera efter dekryptering</string>
<string name="label_encryption_algorithm">Krypteringsalgoritm</string>
<string name="label_hash_algorithm">Hash-algoritm</string>
- <string name="label_symmetric">Kryptera med lösenordsfras</string>
- <string name="label_passphrase_cache_ttl">Tid i cache</string>
- <string name="label_passphrase_cache_subs">Cacha lösenordsfraser efter undernyckel</string>
+ <string name="label_symmetric">Kryptera med lösenord</string>
<string name="label_message_compression">Textkompression</string>
<string name="label_file_compression">Filkompression</string>
- <string name="label_keyservers">Nyckelservrar</string>
+ <string name="label_keyservers">Välj OpenPGP-nyckelservrar</string>
<string name="label_key_id">Nyckel-ID</string>
+ <string name="label_key_created">Nyckel skapad %s</string>
+ <string name="label_creation">Skapande</string>
<string name="label_expiry">Går ut</string>
<string name="label_usage">Användning</string>
<string name="label_key_size">Nyckelstorlek</string>
@@ -137,6 +140,12 @@
<string name="label_enable_compression">Aktivera kompression</string>
<string name="label_encrypt_filenames">Kryptera filnamn</string>
<string name="label_hidden_recipients">Dölj mottagare</string>
+ <string name="label_verify_keyserver">Verifiera nyckelserver</string>
+ <string name="label_enter_keyserver_url">Ange nyckelserver-URL</string>
+ <string name="pref_keyserver">OpenPGP nyckelservrar</string>
+ <string name="pref_keyserver_summary">Sök nycklar på valda OpenPGP nyckelservrar (HKP-protokollet)</string>
+ <string name="pref_keybase">keybase.io</string>
+ <string name="pref_keybase_summary">Sök nycklar på keybase.io</string>
<string name="user_id_no_name">&lt;inget namn&gt;</string>
<string name="none">&lt;ingen&gt;</string>
<plurals name="n_keys">
@@ -176,23 +185,24 @@
<string name="flag_encrypt">Kryptera</string>
<string name="flag_authenticate">Autentisera</string>
<!--sentences-->
- <string name="wrong_passphrase">Fel lösenordsfras.</string>
+ <string name="wrong_passphrase">Fel lösenord.</string>
<string name="no_filemanager_installed">Ingen kompatibel filhanterare är installerad.</string>
- <string name="passphrases_do_not_match">Lösenordsfraserna stämde inte överens.</string>
- <string name="passphrase_must_not_be_empty">Ange en lösenordsfras.</string>
+ <string name="passphrases_do_not_match">Lösenorden stämde inte överens.</string>
+ <string name="passphrase_must_not_be_empty">Var god ange ett lösenord.</string>
<string name="passphrase_for_symmetric_encryption">Symmetrisk kryptering.</string>
- <string name="passphrase_for">Ange lösenordsfras för \'%s\'</string>
+ <string name="passphrase_for">Ange lösenord för \'%s\'</string>
<string name="pin_for">Ange PIN för \'%s\'</string>
<string name="yubikey_pin_for">Ange PIN för att få åtkomst till YubiKey för \'%s\'</string>
<string name="nfc_text">Håll YubiKey mot baksidan av din enhet.</string>
<string name="file_delete_confirmation_title">Radera orginalfiler?</string>
<string name="file_delete_confirmation">Följande filer kommer raderas:%s</string>
<string name="file_delete_successful">%1$d av %2$d filer har raderats.%3$s</string>
- <string name="no_file_selected">Välj en fil först.</string>
<string name="encrypt_sign_successful">Signerades och/eller krypterades.</string>
<string name="encrypt_sign_clipboard_successful">Signerades och/eller krypterades till urklipp.</string>
<string name="select_encryption_key">Välj åtminstone en krypteringsnyckel.</string>
- <string name="error_no_encryption_or_signature_key">Välj åtminstone en krypterings- eller signeringsnyckel.</string>
+ <string name="specify_file_to_encrypt_to">Ange vilken fil du vill kryptera till.\nVARNING: Om filen redan finns kommer den att skrivas över!</string>
+ <string name="specify_file_to_decrypt_to">Ange vilken fil du vill kryptera till.\nVARNING: Om filen redan finns kommer den att skrivas över!</string>
+ <string name="specify_file_to_export_to">Ange vilken fil du vill exportera till.\nVARNING: Om filen redan finns kommer den att skrivas över!</string>
<string name="key_deletion_confirmation_multi">Vill du verkligen radera alla markerade nycklar?</string>
<string name="secret_key_deletion_confirmation">Efter radering kommer du inte kunna läsa meddelande krypterade med den här nyckeln samt förlora alla nyckelbekräftningar som gjorts med den!</string>
<string name="public_key_deletetion_confirmation">Radera nyckel \'%s\'?</string>
@@ -225,34 +235,31 @@
<string name="error_external_storage_not_ready">extern lagring inte redo</string>
<string name="error_key_size_minimum512bit">nyckelstorlek måste vara åtminstone 512bit</string>
<string name="error_unknown_algorithm_choice">okänt val av algoritm</string>
- <string name="error_user_id_no_email">ingen e-post hittades</string>
+ <string name="error_user_id_no_email">ingen e-postadress hittades</string>
<string name="error_key_needs_a_user_id">behöver åtminstone en identitet</string>
- <string name="error_no_signature_passphrase">ingen lösenordsfras angiven</string>
+ <string name="error_no_signature_passphrase">inget lösenord angett</string>
<string name="error_no_signature_key">ingen signaturnyckel angiven</string>
<string name="error_invalid_data">Inget giltigt krypterat eller signerat OpenPGP-innehåll!</string>
<string name="error_integrity_check_failed">integritetskontroll misslyckades! Data har modifierats!</string>
- <string name="error_wrong_passphrase">fel lösenordsfras</string>
+ <string name="error_wrong_passphrase">fel lösenord</string>
<string name="error_could_not_extract_private_key">kunde inte extrahera privat nyckel</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Du behöver Android 4.1 för att använda Androids NFC Beam-funktion!</string>
<string name="error_nfc_needed">NFC måste vara aktiverat!</string>
<string name="error_beam_needed">Beam måste vara aktiverat!</string>
<string name="error_nothing_import">Inga nycklar hittades!</string>
+ <string name="error_nothing_import_selected">Inga nycklar valda för import!</string>
<string name="error_contacts_key_id_missing">Det gick inte att hämta nyckel-ID:t från kontakter!</string>
<string name="error_generic_report_bug">Ett generiskt fel inträffade, skapa en ny buggrapport för OpenKeychain.</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">Inte signerat</string>
<string name="decrypt_result_invalid_signature">Ogiltig signatur!</string>
- <string name="decrypt_result_signature_uncertified">Signerat av (inte certifierad!)</string>
- <string name="decrypt_result_signature_certified">Signerat av</string>
- <string name="decrypt_result_signature_expired_key">Nyckeln har gått ut!</string>
- <string name="decrypt_result_signature_revoked_key">Nyckeln har återkallats!</string>
- <string name="decrypt_result_signature_missing_key">Okänd publik nyckel</string>
+ <string name="decrypt_result_signature_secret">Signerat av din nyckel</string>
+ <string name="decrypt_result_signature_certified">Signerat av bekräftad nyckel</string>
<string name="decrypt_result_encrypted">Krypterat</string>
<string name="decrypt_result_not_encrypted">Inte krypterat</string>
<string name="decrypt_result_action_show">Visa</string>
<string name="decrypt_result_action_Lookup">Sök efter</string>
- <string name="decrypt_invalid_text">Antingen är signaturen ogiltig eller så har nyckeln återkallats/gått ut. Du kan inte vara säker på vem som skrev texten. Vill du fortfarande visa den?</string>
<string name="decrypt_invalid_button">Jag förstår riskerna, visa den!</string>
<!--Add keys-->
<string name="add_keys_my_key">Min nyckel:</string>
@@ -262,6 +269,7 @@
<string name="progress_cancelling">avbryter…</string>
<string name="progress_saving">sparar…</string>
<string name="progress_importing">importerar…</string>
+ <string name="progress_updating">Uppdaterar nycklar...</string>
<string name="progress_exporting">exporterar…</string>
<string name="progress_uploading">laddar upp…</string>
<string name="progress_building_key">bygger nyckel…</string>
@@ -281,11 +289,12 @@
<string name="progress_modify_subkeyrevoke">återkallar undernycklar…</string>
<string name="progress_modify_subkeystrip">rensar undernycklar…</string>
<string name="progress_modify_subkeyadd">lägger till undernycklar…</string>
- <string name="progress_modify_passphrase">ändrar lösenordsfras…</string>
+ <string name="progress_modify_passphrase">byter lösenord...</string>
<plurals name="progress_exporting_key">
<item quantity="one">exporterar nyckel…</item>
<item quantity="other">exporterar nycklar…</item>
</plurals>
+ <string name="progress_start">förbereder operation...</string>
<string name="progress_extracting_signature_key">extraherar signaturnyckel…</string>
<string name="progress_extracting_key">extraherar nyckel…</string>
<string name="progress_preparing_streams">förbereder strömmar…</string>
@@ -305,6 +314,7 @@
<string name="progress_deleting">raderar nycklar…</string>
<string name="progress_con_saving">konsolidera: sparar till cache…</string>
<string name="progress_con_reimport">konsolidera: återimporterar…</string>
+ <string name="progress_verifying_keyserver_url">verifierar nyckelserver...</string>
<!--action strings-->
<string name="hint_cloud_search_hint">Söker via Namn, E-post...</string>
<!--key bit length selections-->
@@ -346,11 +356,11 @@
<string name="import_tab_qr_code">QR-kod/NFC</string>
<string name="import_import">Importera markerade nycklar</string>
<string name="import_qr_code_wrong">Något är fel med QR-koden! Försök igen!</string>
- <string name="import_qr_code_too_short_fingerprint">Fingeravtryck är för kort (&lt; 16 tecken)</string>
+ <string name="import_qr_code_too_short_fingerprint">Fingeravtrycket är för kort!</string>
<string name="import_qr_code_button">Skanna QR-kod</string>
<string name="import_qr_code_text">Håll din kamera över QR-koden!</string>
+ <!--Import from URL-->
<!--Generic result toast-->
- <string name="snackbar_details">Detaljer</string>
<string name="with_warnings">, med varningar</string>
<string name="with_cancelled">, tills det avbryts</string>
<!--Import result toast-->
@@ -418,10 +428,10 @@
<string name="intent_send_encrypt">Kryptera med OpenKeychain</string>
<string name="intent_send_decrypt">Dekryptera med OpenKeychain</string>
<!--Remote API-->
- <string name="api_settings_show_info">Visa avancerad information</string>
- <string name="api_settings_hide_info">Göm avancerad information</string>
- <string name="api_settings_show_advanced">Visa avancerade inställningar</string>
- <string name="api_settings_hide_advanced">Göm avancerade inställningar</string>
+ <string name="api_settings_show_info">Visa utökad information</string>
+ <string name="api_settings_hide_info">Dölj utökad information</string>
+ <string name="api_settings_show_advanced">Visa utökade inställningar</string>
+ <string name="api_settings_hide_advanced">Dölj utökade inställningar</string>
<string name="api_settings_no_key">Ingen nyckel vald</string>
<string name="api_settings_select_key">Välj nyckel</string>
<string name="api_settings_create_key">Skapa ny nyckel</string>
@@ -433,8 +443,8 @@
<string name="api_settings_delete_account">Radera konto</string>
<string name="api_settings_package_name">Paketnamn</string>
<string name="api_settings_package_signature">SHA-256 för paketsignatur</string>
- <string name="api_settings_accounts">Konton (övergivet API)</string>
- <string name="api_settings_advanced">Avancerad information</string>
+ <string name="api_settings_accounts">Konton (gamla API:t)</string>
+ <string name="api_settings_advanced">Utökad information</string>
<string name="api_settings_allowed_keys">Tillåtna nycklar</string>
<string name="api_settings_settings">Inställningar</string>
<string name="api_settings_key">Kontonyckel:</string>
@@ -451,6 +461,7 @@
<string name="api_select_pub_keys_text_no_user_ids">Välj mottagare!</string>
<string name="api_error_wrong_signature">Signaturkontroll misslyckades! Har du installerat appen från en annan källa? Om du är säker på att det här inte är en attack, återkalla den här appens registrering i OpenKeychain och registrera sen om appen igen.</string>
<string name="api_select_sign_key_text">Välj en av dina existerande nycklar eller skapa en ny.</string>
+ <string name="api_select_keys_text">Ingen av de tillåtna nycklarna lyckas dekryptera innehållet. Var god välj de rätta nycklarna.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Dela med QR-kod</string>
<string name="share_nfc_dialog">Dela med NFC</string>
@@ -493,6 +504,8 @@
<string name="key_trust_old_keys">Det kan vara okej att använda den här för att avkryptera ett gammalt medelande från tiden när den här nyckeln var giltig.</string>
<string name="key_trust_no_cloud_evidence">Inget bevis från molnet angående den här nyckelns trovärdighet.</string>
<string name="key_trust_start_cloud_search">Påbörja sökning</string>
+ <string name="key_trust_results_prefix">Keybase.io erbjuder \"bevis\" som hävdar att ägaren av den här nyckeln:</string>
+ <string name="key_trust_header_text">Observera: Keybase.io bevis är en experimentell funktion i OpenKeychain. Vi uppmanar dig att skanna QR-koder eller utbyta nycklar via NFC utöver att bekräfta dem.</string>
<!--keybase proof stuff-->
<string name="keybase_narrative_twitter">Postar på Twitter som</string>
<string name="keybase_narrative_github">Är känd på GitHub som</string>
@@ -502,8 +515,19 @@
<string name="keybase_narrative_hackernews">Postar på Hacker News som</string>
<string name="keybase_narrative_unknown">Okänd bevistyp</string>
<string name="keybase_proof_failure">Tyvärr kan detta bevis inte verifieras.</string>
+ <string name="keybase_problem_fetching_evidence">Problem med bevis</string>
+ <string name="keybase_dns_query_failure">Hämtning av DNS TXT-post misslyckades</string>
+ <string name="keybase_message_fetching_data">Hämtar bevis</string>
+ <string name="keybase_proof_succeeded">Detta bevis har verifierats!</string>
+ <string name="keybase_for_the_domain">för domänen</string>
+ <string name="keybase_contained_signature">innehåller ett meddelande som bara kan ha skapats av ägaren av den här nyckeln.</string>
+ <string name="keybase_twitter_proof">En tweet</string>
+ <string name="keybase_dns_proof">En DNS TXT-post</string>
+ <string name="keybase_web_site_proof">En textfil</string>
+ <string name="keybase_reddit_proof">En JSON-fil</string>
+ <string name="keybase_verify">Verifiera</string>
<!--Edit key-->
- <string name="edit_key_action_change_passphrase">Ändra lösenordsfras</string>
+ <string name="edit_key_action_change_passphrase">Byt lösenord</string>
<string name="edit_key_action_add_identity">Lägg till identitet</string>
<string name="edit_key_action_add_subkey">Lägg till undernyckel</string>
<string name="edit_key_edit_user_id_title">Välj en åtgärd!</string>
@@ -520,18 +544,41 @@
<string name="edit_key_select_flag">Välj åtminstone en flagga!</string>
<string name="edit_key_error_add_identity">Lägg till åtminstone en identitet!</string>
<string name="edit_key_error_add_subkey">Lägg till åtminstone en undernyckel!</string>
+ <string name="edit_key_error_bad_nfc_algo">Algoritmen stöds inte av smartcard!</string>
+ <string name="edit_key_error_bad_nfc_size">Nyckelstorleken stöds inte av smartcard!</string>
<!--Create key-->
+ <string name="create_key_upload">Synkronisera med molnet</string>
<string name="create_key_empty">Detta fält krävs</string>
- <string name="create_key_passphrases_not_equal">Lösenordsfraser stämmer inte överens</string>
+ <string name="create_key_passphrases_not_equal">Lösenorden stämmer inte överens</string>
<string name="create_key_final_text">Du angav följande identitet:</string>
<string name="create_key_final_robot_text">Att skapa en nyckel kan ta ett tag, drick en kopp kaffe under tiden…</string>
<string name="create_key_rsa">(3 undernycklar, RSA, 4096 bit)</string>
<string name="create_key_custom">(anpassad nyckelkonfiguration)</string>
+ <string name="create_key_name_text">Välj ett namn som hör till den här nyckeln. Det kan vara ett fullständigt namn, t.ex. \"John Doe\", eller ett smeknamn, t.ex. \"Johnny\".</string>
+ <string name="create_key_email_text">Ange din huvudsakliga e-postadress som används för säker kommunikation.</string>
+ <string name="create_key_passphrase_text">Välj ett starkt lösenord. Det skyddar din nyckel när din enhet tappas bort eller blir stulen.</string>
+ <string name="create_key_hint_full_name">Fullständigt namn eller smeknamn</string>
<string name="create_key_edit">Ändra nyckelkonfiguration</string>
+ <string name="create_key_add_email">Lägg till e-postadress</string>
+ <string name="create_key_email_already_exists_text">E-postadress har redan lagts till</string>
+ <string name="create_key_email_invalid_email">Formatet på e-postadressen är ogiltigt</string>
<!--View key-->
+ <string name="view_key_revoked">Återkallad: Nyckeln bör inte användas längre!</string>
+ <string name="view_key_expired">Utgånget: Kontakten behöver utöka nyckelns giltighetstid!</string>
+ <string name="view_key_expired_secret">Utgånget: Du kan förlänga nyckelns giltighetstid genom att editera den!</string>
+ <string name="view_key_my_key">Min nyckel</string>
+ <string name="view_key_verified">Bekräftad nyckel</string>
+ <string name="view_key_unverified">Obekräftad: Skanna QR-kod för att bekräfta nyckeln!</string>
+ <string name="view_key_fragment_no_system_contact">&lt;ingen&gt;</string>
+ <!--Add keyserver-->
+ <string name="add_keyserver_dialog_title">Lägg till nyckelserver</string>
+ <string name="add_keyserver_verified">Nyckelserver verifierad!</string>
+ <string name="add_keyserver_without_verification">Nyckelserver tillagd utan verifiering.</string>
+ <string name="add_keyserver_invalid_url">Ogiltig URL!</string>
+ <string name="add_keyserver_connection_failed">Misslyckades med att ansluta till nyckelserver. Kontrollera URL:en och din internetanslutning.</string>
<!--Navigation Drawer-->
<string name="nav_keys">Nycklar</string>
- <string name="nav_encrypt_decrypt">Kryptera/Dekryptera</string>
+ <string name="nav_encrypt_decrypt">Kryptera/dekryptera</string>
<string name="nav_apps">Appar</string>
<string name="my_keys">Mina nycklar</string>
<!--hints-->
@@ -701,9 +748,6 @@
<string name="msg_mf_error_noexist_primary">Dåligt primärt användar-ID angivet!</string>
<string name="msg_mf_error_revoked_primary">Återkallade användar-ID:n kan inte vara primära!</string>
<string name="msg_mf_error_pgp">Internt OpenPGP-fel!</string>
- <string name="msg_mf_passphrase">Ändrar lösenordsfras för nyckelring</string>
- <string name="msg_mf_passphrase_key">Krypterar undernyckel %s på nytt med ny lösenordsfras</string>
- <string name="msg_mf_passphrase_empty_retry">Det gick inte att ställa in ny lösenordsfras, försök igen med en tom gammal lösenordsfras</string>
<string name="msg_mf_primary_replace_old">Ersätter certifikat för tidigare primärt användar-ID</string>
<string name="msg_mf_primary_new">Genererar nytt certifikat för nytt primärt användar-ID</string>
<string name="msg_mf_subkey_change">Modifierar undernyckel %s</string>
@@ -741,14 +785,11 @@
<string name="msg_con_reimport_secret_skip">Inga privata nycklar att återimportera, hoppar över…</string>
<!--Edit Key (higher level than modify)-->
<string name="msg_ed">Utför nyckeloperation</string>
- <string name="msg_ed_caching_new">Cachar ny lösenordsfras</string>
<string name="msg_ed_error_key_not_found">Nyckel hittades inte!</string>
<string name="msg_ed_success">Nyckeloperation lyckades</string>
<!--Promote key-->
- <string name="msg_pr_error_already_secret">Nyckeln är redan en privat nyckel!</string>
<string name="msg_pr_error_key_not_found">Nyckel hittades inte!</string>
<!--Other messages used in OperationLogs-->
- <string name="msg_ek_error_divert">Det finns (ännu) inte stöd för att redigera NFC-nycklar!</string>
<string name="msg_ek_error_dummy">Kan inte redigera nyckelring med en rensad huvudnyckel!</string>
<string name="msg_ek_error_not_found">Nyckel hittades inte!</string>
<!--Messages for DecryptVerify operation-->
@@ -766,7 +807,6 @@
<string name="msg_dc_error_extract_key">Okänt fel vid upplåsning av nyckel</string>
<string name="msg_dc_error_integrity_check">Fel vid integritetskontroll!</string>
<string name="msg_dc_ok_meta_only">Endast metadata krävdes, hoppar över dekryptering</string>
- <string name="msg_dc_pass_cached">Använder lösenordsfras från cache</string>
<string name="msg_dc_prep_streams">Förbereder strömmar för dekryptering</string>
<string name="msg_dc">Startar dekrypteringsoperation…</string>
<string name="msg_dc_sym_skip">Symmetrisk data inte tillåten, hoppar över…</string>
@@ -779,9 +819,7 @@
<string name="msg_pse_asymmetric">Förbereder publika nycklar för kryptering</string>
<string name="msg_pse_compressing">Förbereder komprimering</string>
<string name="msg_pse_encrypting">Krypterar data</string>
- <string name="msg_pse_error_bad_passphrase">Dålig lösenordsfras!</string>
<string name="msg_pse_error_nfc">NFC datafel!</string>
- <string name="msg_pse_error_no_passphrase">Ingen lösenordsfras angiven!</string>
<string name="msg_pse_error_pgp">Internt OpenPGP-fel!</string>
<string name="msg_pse_signing_cleartext">Skapar signatur i klartext</string>
<string name="msg_pse_sigcrypting">Krypterar data med signatur</string>
@@ -843,13 +881,11 @@
</plurals>
<!--Messages for Export Log operation-->
<!--PassphraseCache-->
- <string name="passp_cache_notif_click_to_clear">Klicka för att rensa cachade lösenordsfraser</string>
- <string name="passp_cache_notif_n_keys">OpenKeychain har cachat %d lösenordsfraser</string>
- <string name="passp_cache_notif_keys">Cachade lösenordsfraser:</string>
- <string name="passp_cache_notif_clear">Rensa cache</string>
- <string name="passp_cache_notif_pwd">Lösenordsfras</string>
<!--First Time-->
<string name="first_time_text1">Ta tillbaka din integritet med OpenKeychain!</string>
+ <string name="first_time_create_key">Skapa min nyckel</string>
+ <string name="first_time_import_key">Importera nyckel från fil</string>
+ <string name="first_time_yubikey">Använd YubiKey NEO</string>
<string name="first_time_skip">Hoppa över inställning</string>
<!--unsorted-->
<string name="section_cert">Certifikatinformation</string>
@@ -862,7 +898,6 @@
<string name="error_key_not_found">Nyckel hittades inte!</string>
<string name="error_key_processing">Fel vid bearbetning av nyckel!</string>
<string name="key_stripped">rensad</string>
- <string name="key_no_passphrase">ingen lösenordsfras</string>
<string name="key_unavailable">otillgänglig</string>
<string name="secret_cannot_multiple">Dina egna nycklar kan bara raderas var för sig!</string>
<string name="title_view_cert">Visa certifikatinformation</string>
@@ -873,24 +908,15 @@
<string name="contact_show_key">Visa nyckel (%s)</string>
<string name="swipe_to_update">Dra nedåt för att uppdatera från nyckelserver</string>
<string name="error_no_file_selected">Välj åtminstone en fil att kryptera!</string>
- <string name="error_multi_files">Att spara flera filer stöds ej. Detta är en begränsning i nuvarande Android.</string>
<string name="key_colon">Nyckel:</string>
<string name="user_id_none"><![CDATA[<none>]]></string>
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
- <string name="enter_passphrase">Ange lösenordsfras</string>
- <string name="passphrase">Lösenordsfras</string>
- <string name="noPassphrase">Ingen lösenordsfras</string>
- <string name="passphrases_match">Lösenordsfraser stämmer överens</string>
- <string name="passphrase_saved">Lösenordsfras sparad</string>
- <string name="passphrase_invalid">Lösenordsfras ogiltig</string>
- <string name="missing_passphrase">Lösenordsfras saknas</string>
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<string name="passphrase_again">Igen</string>
<string name="lockpattern">Låsmönster</string>
<string name="lockpatternNFC">NFC + Låsmönster</string>
<string name="unlock_method">Upplåsningmetod</string>
- <string name="set_passphrase">Sätt lösenordsfras</string>
<string name="draw_lockpattern">Dra låsmönster</string>
<string name="nfc_title">NFC</string>
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
diff --git a/OpenKeychain/src/main/res/values-tr/strings.xml b/OpenKeychain/src/main/res/values-tr/strings.xml
index 09d39dcc9..77c5e1118 100644
--- a/OpenKeychain/src/main/res/values-tr/strings.xml
+++ b/OpenKeychain/src/main/res/values-tr/strings.xml
@@ -8,7 +8,6 @@
<string name="title_add_subkey">Alt anahtar ekle</string>
<string name="title_edit_key">Anahtarı düzenle</string>
<string name="title_api_registered_apps">Uygulamalar</string>
- <string name="title_change_passphrase">Parolayı Değiştir</string>
<string name="title_share_fingerprint_with">Parmak izini paylaş...</string>
<string name="title_share_key">Anahtarı paylaş...</string>
<string name="title_share_file">Dosyayı paylaş...</string>
@@ -23,12 +22,10 @@
<string name="title_help">Yardım</string>
<string name="title_log_display">Günlük</string>
<string name="title_exchange_keys">Anahtarları Değiş Tokuş Et</string>
- <string name="title_advanced_key_info">Gelişmiş Anahtar Bilgisi</string>
<!--section-->
<string name="section_user_ids">Kimlikler</string>
<string name="section_keys">Alt anahtarlar</string>
<string name="section_cloud_search">Bulut araması</string>
- <string name="section_passphrase_cache">Parola Önbelleği</string>
<string name="section_actions">Eylemler</string>
<string name="section_share_key">Anahtar</string>
<string name="section_key_server">Anahtar Sunucusu</string>
@@ -36,7 +33,6 @@
<!--button-->
<string name="btn_decrypt_verify_file">Şifreyi çöz, doğrula ve dosyayı kaydet</string>
<string name="btn_encrypt_share_file">Şifrele ve dosyayı paylaş</string>
- <string name="btn_save">Kaydet</string>
<string name="btn_do_not_save">İptal</string>
<string name="btn_delete">Sil</string>
<string name="btn_no_date">Zaman Aşımı Yok</string>
@@ -47,9 +43,6 @@
<string name="btn_view_cert_key">Tasdikleme anahtarını görüntüle</string>
<string name="btn_create_key">Anahtar oluştur</string>
<string name="btn_add_files">Dosya(lar) ekle</string>
- <string name="btn_add_share_decrypted_text">Şifresi çözülmüş metni paylaş</string>
- <string name="btn_decrypt_and_verify">ve imzaları doğrula</string>
- <string name="btn_decrypt_files">Dosyaların şifresini çöz</string>
<!--menu-->
<string name="menu_preferences">Ayarlar</string>
<string name="menu_help">Yardım</string>
@@ -60,15 +53,11 @@
<string name="menu_encrypt_to">Şuna şifrele...</string>
<string name="menu_select_all">Hepsini seç</string>
<string name="menu_export_all_keys">Tüm anahtarları ver</string>
- <string name="menu_advanced">Gelişmiş bilgiyi göster</string>
<!--label-->
<string name="label_file">Dosya</string>
<string name="label_files">Dosya(lar)</string>
<string name="label_file_colon">Dosya:</string>
- <string name="label_no_passphrase">Parola Yok</string>
- <string name="label_passphrase">Parola</string>
<string name="label_unlock">Kilit açılıyor...</string>
- <string name="label_passphrase_again">Parolayı Tekrarla</string>
<string name="label_algorithm">Algoritma</string>
<string name="label_ascii_armor">ASCII formatında dosyalar</string>
<string name="label_file_ascii_armor">ASCII formatında çıktıları etkinleştir</string>
@@ -82,11 +71,7 @@
<string name="label_delete_after_decryption">Şifre çözme sonrasında sil</string>
<string name="label_encryption_algorithm">Şifreleme algoritması</string>
<string name="label_hash_algorithm">Özet algoritması</string>
- <string name="label_symmetric">Parolayla şifrele</string>
- <string name="label_passphrase_cache_ttl">Önbellek zamanı</string>
- <string name="label_passphrase_cache_subs">Parolaları altanahtarlara göre önbellekle</string>
<string name="label_file_compression">Dosya sıkıştırma</string>
- <string name="label_keyservers">Anahtar Sunucuları</string>
<string name="label_key_id">Anahtar ID</string>
<string name="label_creation">Oluşturma</string>
<string name="label_expiry">Bitiş</string>
@@ -141,18 +126,12 @@
<string name="flag_encrypt">Şifreleme</string>
<string name="flag_authenticate">Kimlik kanıtlama</string>
<!--sentences-->
- <string name="wrong_passphrase">Yanlış parola.</string>
<string name="no_filemanager_installed">Uyumlu dosya yöneticisi yüklenmedi.</string>
- <string name="passphrases_do_not_match">Parolalar eşleşmedi.</string>
- <string name="passphrase_must_not_be_empty">Lütfen bir parola girin.</string>
<string name="passphrase_for_symmetric_encryption">Simetrik şifreleme.</string>
- <string name="passphrase_for">\'%s\' için bir parola girin</string>
<string name="nfc_text">YubiKey\'inizi cihazınızın arkasında tutun.</string>
- <string name="no_file_selected">Önce bir dosya seçin.</string>
<string name="encrypt_sign_successful">Başarıyla imzalandı ve/veya şifrelendi.</string>
<string name="encrypt_sign_clipboard_successful">Kopyalama önbelleğine başarıyla imzalandı ve/veya şifrelendi.</string>
<string name="select_encryption_key">En az bir şifreleme anahtarı seçiniz.</string>
- <string name="error_no_encryption_or_signature_key">En az bir şifreleme anahtarı veya imza anahtarı seçiniz.</string>
<string name="also_export_secret_keys">Özel anahtarları da dışa aktar</string>
<string name="reinstall_openkeychain">Android için bilinen bir hataya denk geldiniz. Eğer kişilerinizi anahtarlarla eşlemek istiyorsanız, lütfen OpenKeychain uygulamasını yeniden yükleyin.</string>
<string name="key_exported">1 anahtar başarıyla dışa aktarıldı.</string>
@@ -178,13 +157,10 @@
<string name="error_external_storage_not_ready">harici depolama hazır değil</string>
<string name="error_key_size_minimum512bit">anahtar boyutu en az 512bit olmalı</string>
<string name="error_unknown_algorithm_choice">bilinmeyen algoritma seçimi</string>
- <string name="error_user_id_no_email">herhangi bir eposta bulunamadı</string>
<string name="error_key_needs_a_user_id">en az bir kimlik gerekli</string>
- <string name="error_no_signature_passphrase">parola verilmedi</string>
<string name="error_no_signature_key">imza anahtarı verilmedi</string>
<string name="error_invalid_data">Geçerli olan şifrelenmiş ya da imzalanmış OpenPGP içeriği yok!</string>
<string name="error_integrity_check_failed">Bütünlük kontrolü başarısız! Veri değiştirilmiş!</string>
- <string name="error_wrong_passphrase">yanlış parola</string>
<string name="error_could_not_extract_private_key">özel anahtar çıkarılamadı</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Android\'in NFC Beam özelliğini kullanabilmek için Android 4.1 kullanmalısınız!</string>
@@ -194,16 +170,10 @@
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">İmzalanmadı</string>
<string name="decrypt_result_invalid_signature">Geçersiz imza!</string>
- <string name="decrypt_result_signature_uncertified">İmzalayan (tasdik edilmemiş!):</string>
- <string name="decrypt_result_signature_certified">İmzalayan:</string>
- <string name="decrypt_result_signature_expired_key">Anahtar zaman aşımına uğramış!</string>
- <string name="decrypt_result_signature_revoked_key">Anahtar yürürlükten kaldırılmış!</string>
- <string name="decrypt_result_signature_missing_key">Bilinmeyen açık anahtar</string>
<string name="decrypt_result_encrypted">Şifrelendi</string>
<string name="decrypt_result_not_encrypted">Şifrelenmedi</string>
<string name="decrypt_result_action_show">Göster</string>
<string name="decrypt_result_action_Lookup">Araştır</string>
- <string name="decrypt_invalid_text">Ya imza geçersiz ya da anahtar yürürlükten kaldırılmış/zaman aşımına uğramış. Metni kimin yazdığından emin olamazsınız. Yine de görüntülemek istiyor musunuz?</string>
<string name="decrypt_invalid_button">Tehlikelerin farkındayım, görüntüle!</string>
<!--Add keys-->
<string name="add_keys_my_key">Anahtarım:</string>
@@ -231,7 +201,6 @@
<string name="progress_modify_subkeyrevoke">altanahtarlar yürürlükten kaldırılıyor...</string>
<string name="progress_modify_subkeystrip">altanahtarlar çıkarılıyor...</string>
<string name="progress_modify_subkeyadd">altanahtarlar ekleniyor...</string>
- <string name="progress_modify_passphrase">parola değiştiriliyor...</string>
<plurals name="progress_exporting_key">
<item quantity="one">anahtar dışa aktarılıyor...</item>
<item quantity="other">anahtarlar dışa aktarılıyor...</item>
@@ -294,8 +263,8 @@
<string name="import_tab_qr_code">QR Kodu/NFC</string>
<string name="import_import">Seçili anahtarları içe aktar</string>
<string name="import_qr_code_wrong">QR Kodu hatalı! Lütfen tekrar deneyin!</string>
- <string name="import_qr_code_too_short_fingerprint">Parmak izi çok kısa (&lt; 16 karakter)</string>
<string name="import_qr_code_button">QR Kodu Tara</string>
+ <!--Import from URL-->
<!--Generic result toast-->
<string name="with_warnings">, uyarılarla</string>
<string name="with_cancelled">, iptal edilene kadar</string>
@@ -320,10 +289,6 @@
<string name="intent_send_encrypt">OpenKeychain ile Şifrele</string>
<string name="intent_send_decrypt">OpenKeychain ile Çözümle</string>
<!--Remote API-->
- <string name="api_settings_show_info">Gelişmiş bilgiyi göster</string>
- <string name="api_settings_hide_info">Gelişmiş bilgiyi gizle</string>
- <string name="api_settings_show_advanced">Gelişmiş ayarları göster</string>
- <string name="api_settings_hide_advanced">Gelişmiş ayarları gizle</string>
<string name="api_settings_no_key">Anahtar seçilmedi</string>
<string name="api_settings_select_key">Anahtar seç</string>
<string name="api_settings_save">Kaydet</string>
@@ -374,7 +339,6 @@
<!--Key trust-->
<!--keybase proof stuff-->
<!--Edit key-->
- <string name="edit_key_action_change_passphrase">Parolayı Değiştir</string>
<string name="edit_key_action_add_identity">Kimlik Ekle</string>
<string name="edit_key_action_add_subkey">Alt anahtar Ekle</string>
<string name="edit_key_edit_user_id_title">Bir eylem seç!</string>
@@ -389,13 +353,13 @@
<string name="edit_key_error_add_subkey">En az bir alt anahtar ekleyin!</string>
<!--Create key-->
<string name="create_key_empty">Bu alan zorunludur</string>
- <string name="create_key_passphrases_not_equal">Parolalar eşleşmedi</string>
<string name="create_key_final_text">Şu kimliği girdiniz:</string>
<string name="create_key_final_robot_text">Anahtar oluşturma biraz zaman alabilir, bu sırada bir çay için...</string>
<string name="create_key_rsa">(3 alt anahtar, RSA, 4096 bit)</string>
<string name="create_key_custom">(özel anahtar yapılandırması)</string>
<string name="create_key_edit">Anahtar yapılandırmasını değiştir.</string>
<!--View key-->
+ <!--Add keyserver-->
<!--Navigation Drawer-->
<string name="nav_keys">Anahtarlar</string>
<string name="nav_apps">Uygulamalar</string>
@@ -453,8 +417,6 @@
<string name="msg_download_success">Başarıyla indirildi!</string>
<!--Messages for Export Log operation-->
<!--PassphraseCache-->
- <string name="passp_cache_notif_clear">Önbelleği Temizle</string>
- <string name="passp_cache_notif_pwd">Parola</string>
<!--First Time-->
<string name="first_time_text1">Gizliliğinizi OpenKeychain ile geri alın!</string>
<string name="first_time_skip">Kurulumu Atla</string>
@@ -468,8 +430,6 @@
<string name="error_key_not_found">Anahtar bulunamadı!</string>
<string name="error_key_processing">Anahtar işlenirken hata!</string>
<string name="key_stripped">çıkartıldı</string>
- <string name="key_divert">AkıllıKart/NFC için yönlendir</string>
- <string name="key_no_passphrase">parola yok</string>
<string name="key_unavailable">mevcut değil</string>
<string name="secret_cannot_multiple">Kendi anahtarlarınız yalnızca teker teker silinebilir!</string>
<string name="title_view_cert">Sertifika Ayrıntılarını Görüntüle</string>
@@ -480,11 +440,10 @@
<string name="contact_show_key">Anahtarı göster (%s)</string>
<string name="swipe_to_update">Anahtar sunucudan güncelleme almak için parmağınızı aşağıya doğru kaydırın</string>
<string name="error_no_file_selected">Şifrelemek için en az bir dosya seçin!</string>
- <string name="error_multi_files">Birden çok dosyanın kaydedilmesi desteklenmiyor. Bu şu anki Android\'in bir kısıtlamasıdır.</string>
<string name="key_colon">Anahtar:</string>
<string name="exchange_description">Anahtar değiş tokuşu başlatmak için sağ taraftan katılımcıların sayısını seçin ve \"Değiş tokuşu başlat\" tuşuna tıklayın.\n\nSadece istenilen katılımcıların değişim işleminde olduğundan ve parmak izlerinin doğruluğundan emin olmak için size iki soru daha sorulacak.</string>
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-uk/strings.xml b/OpenKeychain/src/main/res/values-uk/strings.xml
index 626ea6c80..bcda5026f 100644
--- a/OpenKeychain/src/main/res/values-uk/strings.xml
+++ b/OpenKeychain/src/main/res/values-uk/strings.xml
@@ -8,7 +8,6 @@
<string name="title_add_subkey">Додати підключ</string>
<string name="title_edit_key">Редагувати ключ</string>
<string name="title_api_registered_apps">Програми</string>
- <string name="title_change_passphrase">Змінити парольну фразу</string>
<string name="title_share_fingerprint_with">Поділитися відбитком із…</string>
<string name="title_share_key">Поділитися ключем з…</string>
<string name="title_share_file">Поширити файл з…</string>
@@ -23,12 +22,10 @@
<string name="title_help">Довідка</string>
<string name="title_log_display">Журнал</string>
<string name="title_exchange_keys">Обміняти ключі</string>
- <string name="title_advanced_key_info">Додаткова інформація про ключ</string>
<!--section-->
<string name="section_user_ids">Сутності</string>
<string name="section_keys">Підключі</string>
<string name="section_cloud_search">Хмарний пошук</string>
- <string name="section_passphrase_cache">Кеш парольної фрази</string>
<string name="section_actions">Дії</string>
<string name="section_share_key">Ключ</string>
<string name="section_key_server">Сервер ключів</string>
@@ -36,7 +33,6 @@
<!--button-->
<string name="btn_decrypt_verify_file">Розшифрувати, перевірити та зберегти файл</string>
<string name="btn_encrypt_share_file">Зашифрувати та поширити файл</string>
- <string name="btn_save">Зберегти</string>
<string name="btn_do_not_save">Скасувати</string>
<string name="btn_delete">Вилучити</string>
<string name="btn_no_date">Необмежено</string>
@@ -47,9 +43,6 @@
<string name="btn_view_cert_key">Переглянути ключ сертифікації</string>
<string name="btn_create_key">Створити ключ</string>
<string name="btn_add_files">Додати файл(и)</string>
- <string name="btn_add_share_decrypted_text">Поширити розшифрований текст</string>
- <string name="btn_decrypt_and_verify">і перевірити підписи</string>
- <string name="btn_decrypt_files">Розшифрувати файли</string>
<!--menu-->
<string name="menu_preferences">Параметри</string>
<string name="menu_help">Довідка</string>
@@ -60,15 +53,11 @@
<string name="menu_encrypt_to">Зашифрувати…</string>
<string name="menu_select_all">Вибрати усе</string>
<string name="menu_export_all_keys">Експортувати усі ключі</string>
- <string name="menu_advanced">Показати додаткову інформацію</string>
<!--label-->
<string name="label_file">Файл</string>
<string name="label_files">Файл(и)</string>
<string name="label_file_colon">Файл:</string>
- <string name="label_no_passphrase">Без парольної фрази</string>
- <string name="label_passphrase">Парольна фраза</string>
<string name="label_unlock">Розблоковується…</string>
- <string name="label_passphrase_again">Повторити пароль</string>
<string name="label_algorithm">Алгоритм</string>
<string name="label_ascii_armor">Файл ASCII Armor</string>
<string name="label_file_ascii_armor">Увімкнути ASCII Armor</string>
@@ -82,11 +71,7 @@
<string name="label_delete_after_decryption">Вилучити після розшифрування</string>
<string name="label_encryption_algorithm">Алгоритм шифрування</string>
<string name="label_hash_algorithm">Хеш алгоритм</string>
- <string name="label_symmetric">Зашифрувати з парольною фразою</string>
- <string name="label_passphrase_cache_ttl">Кешувати час</string>
- <string name="label_passphrase_cache_subs">Кешувати парольні фрази за підключем</string>
<string name="label_file_compression">Стиснення файлу</string>
- <string name="label_keyservers">Сервери ключів</string>
<string name="label_key_id">ІД ключа</string>
<string name="label_creation">Створення</string>
<string name="label_expiry">Закінчення</string>
@@ -143,17 +128,11 @@
<string name="flag_encrypt">Зашифрувати</string>
<string name="flag_authenticate">Перевірити справжність</string>
<!--sentences-->
- <string name="wrong_passphrase">Невірна парольна фраза.</string>
<string name="no_filemanager_installed">Нема встановленого сумісного менеджера файлів.</string>
- <string name="passphrases_do_not_match">Парольні фрази не збігаються.</string>
- <string name="passphrase_must_not_be_empty">Будь ласка, введіть парольну фразу.</string>
<string name="passphrase_for_symmetric_encryption">Симетричне шифрування.</string>
- <string name="passphrase_for">Введіть парольну фразу для \'%s\'</string>
- <string name="no_file_selected">Виберіть спершу файл.</string>
<string name="encrypt_sign_successful">Успішно підписано та/або перевірено.</string>
<string name="encrypt_sign_clipboard_successful">Успішно підписано та/або зашифровано до буфера обміну.</string>
<string name="select_encryption_key">Виберіть принаймні один ключ шифрування.</string>
- <string name="error_no_encryption_or_signature_key">Виберіть принаймні один ключ шифрування або ключ підпису.</string>
<string name="also_export_secret_keys">Також експортувати секретні ключі</string>
<string name="key_exported">Успішно експортовано 1 ключ.</string>
<string name="keys_exported">Успішно експортовано %d ключів.</string>
@@ -182,12 +161,9 @@
<string name="error_external_storage_not_ready">зовнішній носій не готовий</string>
<string name="error_key_size_minimum512bit">ключ має мати хоча б 512 біт</string>
<string name="error_unknown_algorithm_choice">вибір невідомого алгоритму</string>
- <string name="error_user_id_no_email">жодного листа не знайдено</string>
<string name="error_key_needs_a_user_id">хоча б одна сутність</string>
- <string name="error_no_signature_passphrase">не подано парольної фрази</string>
<string name="error_no_signature_key">не подано ключ підпису</string>
<string name="error_integrity_check_failed">Невдала перевірка цілісності! Дані вже змінено!</string>
- <string name="error_wrong_passphrase">помилкова парольна фраза</string>
<string name="error_could_not_extract_private_key">не можна витягти секретний ключ</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Вам потрібний Android 4.1 для використання функції Androids NFC промінь!</string>
@@ -196,10 +172,6 @@
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">Не підписано</string>
<string name="decrypt_result_invalid_signature">Невірний підпис!</string>
- <string name="decrypt_result_signature_uncertified">Підписано (не сертифіковано)</string>
- <string name="decrypt_result_signature_expired_key">Термін дії ключа минув!</string>
- <string name="decrypt_result_signature_revoked_key">Ключ вже відкликано!</string>
- <string name="decrypt_result_signature_missing_key">Невідомий відкритий ключ</string>
<string name="decrypt_result_encrypted">Зашифровано</string>
<string name="decrypt_result_not_encrypted">Незашифровано</string>
<string name="decrypt_result_action_show">Показати</string>
@@ -228,7 +200,6 @@
<string name="progress_modify_subkeychange">змінюються підключі…</string>
<string name="progress_modify_subkeyrevoke">відхилення підключів…</string>
<string name="progress_modify_subkeyadd">додаються підключі…</string>
- <string name="progress_modify_passphrase">змінюється пароль…</string>
<plurals name="progress_exporting_key">
<item quantity="one">експортується ключ…</item>
<item quantity="few">експортуються ключі…</item>
@@ -291,7 +262,7 @@
<string name="import_tab_qr_code">Код QR/NFC</string>
<string name="import_import">Імпортувати вибрані ключі</string>
<string name="import_qr_code_wrong">Невірний штрих-код! Спробуйте знову!</string>
- <string name="import_qr_code_too_short_fingerprint">Відбиток надто короткий (&lt; 16 символів)</string>
+ <!--Import from URL-->
<!--Generic result toast-->
<!--Import result toast-->
<plurals name="import_keys_added_and_updated_1">
@@ -326,10 +297,6 @@
<string name="intent_send_encrypt">Зашифрувати з OpenKeychain</string>
<string name="intent_send_decrypt">Розшифрувати з OpenKeychain</string>
<!--Remote API-->
- <string name="api_settings_show_info">Показати додаткову інформацію</string>
- <string name="api_settings_hide_info">Приховати додаткову інформацію</string>
- <string name="api_settings_show_advanced">Показати додаткові налаштування</string>
- <string name="api_settings_hide_advanced">Приховати додаткові налаштування</string>
<string name="api_settings_no_key">Не вибрано ключа</string>
<string name="api_settings_select_key">Вибрати ключ</string>
<string name="api_settings_save">Зберегти</string>
@@ -381,7 +348,6 @@
<!--Key trust-->
<!--keybase proof stuff-->
<!--Edit key-->
- <string name="edit_key_action_change_passphrase">Змінити пароль</string>
<string name="edit_key_action_add_identity">Додати сутність</string>
<string name="edit_key_action_add_subkey">Додати підключ</string>
<string name="edit_key_edit_user_id_title">Виберіть дію!</string>
@@ -393,9 +359,9 @@
<string name="edit_key_error_add_subkey">Додати хоча б один підключ!</string>
<!--Create key-->
<string name="create_key_empty">Це поле - обов\'язкове</string>
- <string name="create_key_passphrases_not_equal">Паролі фрази не збігаються</string>
<string name="create_key_final_text">Ви ввели наступну сутність:</string>
<!--View key-->
+ <!--Add keyserver-->
<!--Navigation Drawer-->
<string name="nav_keys">Ключі</string>
<string name="nav_apps">Програми</string>
@@ -498,11 +464,11 @@
<string name="msg_mf_error_noexist_revoke">Вказаний поганий ІД первинного користувача!</string>
<string name="msg_mf_error_revoked_primary">ІД відхилених користувачів не може бути первинним!</string>
<string name="msg_mf_error_sig">Виняток підпису!</string>
+ <string name="msg_mf_error_subkey_missing">Спробували працювати із втраченим підключем %s!</string>
<string name="msg_mf_master">Змінюються основі сертифікації</string>
<string name="msg_mf_primary_replace_old">Замінюється сертифікат ІД попереднього первинного користувача</string>
<string name="msg_mf_primary_new">Генерується новий сертифікат для ІД нового первинного користувача</string>
<string name="msg_mf_subkey_change">Змінюється підключ %s</string>
- <string name="msg_mf_error_subkey_missing">Спробували працювати із втраченим підключем %s!</string>
<string name="msg_mf_subkey_new">Додається новий підключ типу %s</string>
<string name="msg_mf_subkey_new_id">Новий ід підключа: %s</string>
<string name="msg_mf_error_past_expiry">Дата завершення дії не може бути у минулому!</string>
@@ -540,10 +506,6 @@
</plurals>
<!--Messages for Export Log operation-->
<!--PassphraseCache-->
- <string name="passp_cache_notif_click_to_clear">Клацніть для очищення кешованих парольних фраз</string>
- <string name="passp_cache_notif_n_keys">OpenKeychain має %d кешованих парольних фраз</string>
- <string name="passp_cache_notif_keys">Кешовані парольні фрази:</string>
- <string name="passp_cache_notif_clear">Очистити кеш</string>
<!--First Time-->
<string name="first_time_text1">Заберіть вашу приватність із OpenKeychain!</string>
<string name="first_time_skip">Пропустити установку</string>
@@ -566,6 +528,6 @@
<string name="contact_show_key">Показати ключ (%s)</string>
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-vi/strings.xml b/OpenKeychain/src/main/res/values-vi/strings.xml
new file mode 100644
index 000000000..8f84af665
--- /dev/null
+++ b/OpenKeychain/src/main/res/values-vi/strings.xml
@@ -0,0 +1,72 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <!--GENERAL: Please put all strings inside quotes as described in example 1 on
+ http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
+ <!--title-->
+ <!--section-->
+ <!--button-->
+ <!--menu-->
+ <!--label-->
+ <!--choice-->
+ <!--key flags-->
+ <!--sentences-->
+ <!--errors
+ no punctuation, all lowercase,
+ they will be put after "error_message", e.g. "Error: file not found"-->
+ <!--errors without preceeding Error:-->
+ <!--results shown after decryption/verification-->
+ <!--Add keys-->
+ <!--progress dialogs, usually ending in '…'-->
+ <!--action strings-->
+ <!--key bit length selections-->
+ <!--elliptic curve names-->
+ <!--not in for now, see SaveKeyringParcel
+ <string name="key_curve_bp_p256">"Brainpool P-256"</string>
+ <string name="key_curve_bp_p384">"Brainpool P-384"</string>
+ <string name="key_curve_bp_p512">"Brainpool P-512"</string>-->
+ <!--compression-->
+ <!--Help-->
+ <!--Import-->
+ <!--Import from URL-->
+ <!--Generic result toast-->
+ <!--Import result toast-->
+ <!--Delete result toast-->
+ <!--Certify result toast-->
+ <!--Intent labels-->
+ <!--Remote API-->
+ <!--Share-->
+ <!--Key list-->
+ <!--Key view-->
+ <!--Key trust-->
+ <!--keybase proof stuff-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
+ <!--Add keyserver-->
+ <!--Navigation Drawer-->
+ <!--hints-->
+ <!--certs-->
+ <!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
+ <!--Import Public log entries-->
+ <!--Import Secret log entries-->
+ <!--Keyring Canonicalization log entries-->
+ <!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
+ <!--modifySecretKeyRing-->
+ <!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
+ <!--Other messages used in OperationLogs-->
+ <!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
+ <!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
+ <!--Messages for Export Log operation-->
+ <!--PassphraseCache-->
+ <!--First Time-->
+ <!--unsorted-->
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+</resources>
diff --git a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml
index 53cc26aeb..f316ea65d 100644
--- a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml
+++ b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml
@@ -7,13 +7,11 @@
<string name="title_encrypt_text">加密</string>
<string name="title_encrypt_files">加密</string>
<string name="title_decrypt">解密</string>
- <string name="title_unlock">解鎖金鑰</string>
<string name="title_add_subkey">新增子金鑰</string>
<string name="title_edit_key">編輯金鑰</string>
<string name="title_preferences">設定</string>
<string name="title_api_registered_apps">應用程式</string>
- <string name="title_key_server_preference">金鑰伺服器</string>
- <string name="title_change_passphrase">變更口令</string>
+ <string name="title_change_passphrase">修改密碼</string>
<string name="title_share_fingerprint_with">分享指紋…</string>
<string name="title_share_key">分享金鑰…</string>
<string name="title_share_file">分享檔案…</string>
@@ -30,28 +28,27 @@
<string name="title_help">說明</string>
<string name="title_log_display">紀錄</string>
<string name="title_exchange_keys">交換金鑰</string>
- <string name="title_advanced_key_info">進階資訊</string>
+ <string name="title_advanced_key_info">延伸資訊</string>
<string name="title_delete_secret_key">刪除您的金鑰 \'%s\'?</string>
<string name="title_export_log">匯出記錄</string>
<string name="title_manage_my_keys">管理我的金鑰</string>
<!--section-->
<string name="section_user_ids">身份</string>
+ <string name="section_yubikey">YubiKey</string>
+ <string name="section_linked_system_contact">已關聯帳戶</string>
<string name="section_should_you_trust">您信任這把金鑰嗎?</string>
<string name="section_keys">子金鑰</string>
<string name="section_cloud_search">雲端查詢</string>
- <string name="section_passphrase_cache">口令快取</string>
<string name="section_certify">確認</string>
<string name="section_actions">操作</string>
<string name="section_share_key">金鑰</string>
<string name="section_key_server">金鑰伺服器</string>
<string name="section_fingerprint">指紋</string>
<string name="section_encrypt">加密</string>
- <string name="section_decrypt">解密</string>
<!--button-->
<string name="btn_decrypt_verify_file">解密並驗證檔案</string>
<string name="btn_encrypt_share_file">加密並分享檔案</string>
<string name="btn_encrypt_save_file">加密並儲存檔案</string>
- <string name="btn_save">儲存</string>
<string name="btn_do_not_save">取消</string>
<string name="btn_delete">刪除</string>
<string name="btn_no_date">永不過期</string>
@@ -66,10 +63,6 @@
<string name="btn_view_cert_key">檢視簽署的金鑰</string>
<string name="btn_create_key">建立金鑰</string>
<string name="btn_add_files">加入檔案</string>
- <string name="btn_add_share_decrypted_text">解密並分享訊息</string>
- <string name="btn_decrypt_clipboard">解密剪貼簿裏的文字</string>
- <string name="btn_decrypt_and_verify">並且驗證簽名</string>
- <string name="btn_decrypt_files">解密檔案</string>
<string name="btn_encrypt_files">加密檔案</string>
<string name="btn_encrypt_text">加密文字</string>
<string name="btn_add_email">增加額外的電子郵件信箱</string>
@@ -86,7 +79,6 @@
<string name="menu_select_all">全選</string>
<string name="menu_export_all_keys">匯出所有金鑰</string>
<string name="menu_update_all_keys">上傳所有金鑰</string>
- <string name="menu_advanced">顯示進階資訊</string>
<string name="menu_certify_fingerprint">藉由指紋比對來認證</string>
<string name="menu_export_log">匯出記錄</string>
<!--label-->
@@ -94,11 +86,11 @@
<string name="label_file">檔案</string>
<string name="label_files">檔案</string>
<string name="label_file_colon">檔案:</string>
- <string name="label_no_passphrase">沒有口令</string>
- <string name="label_passphrase">口令</string>
+ <string name="label_no_passphrase">沒有密碼</string>
+ <string name="label_passphrase">密碼</string>
<string name="label_unlock">解鎖中...</string>
- <string name="label_passphrase_again">再次輸入口令</string>
- <string name="label_show_passphrase">顯示口令</string>
+ <string name="label_passphrase_again">再次輸入密碼</string>
+ <string name="label_show_passphrase">顯示密碼</string>
<string name="label_algorithm">演算法</string>
<string name="label_write_version_header">讓別人知道我在使用OpenKeychain</string>
<string name="label_write_version_header_summary">在簽名、密文與匯出的金鑰裡寫入\'OpenKeychain v2.7\'</string>
@@ -111,11 +103,8 @@
<string name="label_delete_after_decryption">解密後刪除檔案</string>
<string name="label_encryption_algorithm">加密演算法</string>
<string name="label_hash_algorithm">雜湊演算法</string>
- <string name="label_symmetric">使用口令加密</string>
- <string name="label_passphrase_cache_ttl">快取時間</string>
<string name="label_message_compression">文字壓縮</string>
<string name="label_file_compression">檔案壓縮</string>
- <string name="label_keyservers">金鑰伺服器</string>
<string name="label_key_id">金鑰ID</string>
<string name="label_creation">建立</string>
<string name="label_expiry">效期</string>
@@ -134,10 +123,6 @@
<string name="label_enable_compression">啓用壓縮</string>
<string name="label_encrypt_filenames">加密檔名</string>
<string name="label_hidden_recipients">隱藏收件人</string>
- <string name="pref_keyserver">搜尋金鑰伺服器</string>
- <string name="pref_keyserver_summary">搜尋 HKP 金鑰伺服器</string>
- <string name="pref_keybase">搜尋 Keybase.io</string>
- <string name="pref_keybase_summary">搜尋 Keybase.io 索引</string>
<string name="user_id_no_name">&lt;無名&gt;</string>
<string name="none">&lt;無&gt;</string>
<plurals name="n_keys">
@@ -175,28 +160,22 @@
<string name="flag_encrypt">加密</string>
<string name="flag_authenticate">驗證</string>
<!--sentences-->
- <string name="wrong_passphrase">口令錯誤。</string>
<string name="no_filemanager_installed">找不到相容的檔案管理員。</string>
- <string name="passphrases_do_not_match">口令不相符。</string>
- <string name="passphrase_must_not_be_empty">請輸入口令。</string>
<string name="passphrase_for_symmetric_encryption">對稱加密。</string>
- <string name="passphrase_for">輸入 \'%s\' 的口令</string>
<string name="pin_for">輸入 \'%s\' 的 PIN</string>
<string name="yubikey_pin_for">輸入 PIN 來存取 \'%s\' 的 YubiKey</string>
<string name="file_delete_confirmation_title">刪除原始檔案?</string>
<string name="file_delete_confirmation">下列的檔案將會被刪除:%s</string>
<string name="file_delete_successful">%1$d 之 %2$d 的檔案已經被刪除。%3$s</string>
- <string name="no_file_selected">請先選擇檔案。</string>
<string name="encrypt_sign_successful">成功簽名並/或加密。</string>
<string name="encrypt_sign_clipboard_successful">成功簽名並/或加密到剪貼簿。</string>
<string name="select_encryption_key">選擇至少一把加密金鑰。</string>
- <string name="error_no_encryption_or_signature_key">選擇至少一把加密或簽名金鑰。</string>
<string name="specify_file_to_encrypt_to">請指定欲加密的檔案。\n警告:已經存在的檔案將被覆蓋。</string>
<string name="specify_file_to_decrypt_to">請指定欲解密的檔案。\n警告:已經存在的檔案將被覆蓋。</string>
<string name="specify_file_to_export_to">請指定欲輸出的檔案。\n警告:已經存在的檔案將被覆蓋。</string>
<string name="key_deletion_confirmation_multi">您真的想要刪除所有已選金鑰嗎?</string>
<string name="secret_key_deletion_confirmation">刪除之後您將無法閱讀以這把金鑰加密的訊息,而且所有用這把金鑰做的認證都會失效!</string>
- <string name="public_key_deletetion_confirmation">刪除金鑰 \'%s\' ?</string>
+ <string name="public_key_deletetion_confirmation">刪除金鑰 \'%s\' ?</string>
<string name="also_export_secret_keys">一併匯出私鑰</string>
<string name="reinstall_openkeychain">您遇到了一個已知的 Android 錯誤。如果您想要鏈接聯絡人和金鑰,請重新安裝 OpenKeychain。</string>
<string name="key_exported">成功匯出 1 把金鑰。</string>
@@ -225,13 +204,10 @@
<string name="error_external_storage_not_ready">外部儲存空間尚未就緒</string>
<string name="error_key_size_minimum512bit">金鑰長度必須大於512位元</string>
<string name="error_unknown_algorithm_choice">不明的演算法選擇</string>
- <string name="error_user_id_no_email">沒有找到電子郵件</string>
<string name="error_key_needs_a_user_id">需要至少一個身分識別</string>
- <string name="error_no_signature_passphrase">沒有提供口令</string>
<string name="error_no_signature_key">找不到簽名金鑰</string>
<string name="error_invalid_data">沒有有效的 OpenPGP 加密或簽署內容 !</string>
<string name="error_integrity_check_failed">完整性檢查失敗!資料已被修改!</string>
- <string name="error_wrong_passphrase">口令錯誤</string>
<string name="error_could_not_extract_private_key">無法抽取私鑰</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">需要Android 4.1以上才能使用NFC Beam功能!</string>
@@ -243,16 +219,16 @@
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">尚未簽名</string>
<string name="decrypt_result_invalid_signature">無效的簽章!</string>
- <string name="decrypt_result_signature_uncertified">簽署自 (未認證 !)</string>
- <string name="decrypt_result_signature_certified">簽署自</string>
- <string name="decrypt_result_signature_expired_key">金鑰已過期!</string>
- <string name="decrypt_result_signature_revoked_key">金鑰已被撤銷!</string>
- <string name="decrypt_result_signature_missing_key">未知的公鑰</string>
+ <string name="decrypt_result_signature_uncertified">由<b>未確認</b>的金鑰所簽署</string>
+ <string name="decrypt_result_signature_secret">由你的金鑰所簽署</string>
+ <string name="decrypt_result_signature_certified">由已確認的金鑰所簽署</string>
+ <string name="decrypt_result_signature_expired_key">由<b>已過期</b>的金鑰所簽署!</string>
+ <string name="decrypt_result_signature_revoked_key">由<b>已撤銷</b>的金鑰所簽署!</string>
+ <string name="decrypt_result_signature_missing_key">由<b>未知的金鑰</b>所簽署</string>
<string name="decrypt_result_encrypted">已加密</string>
<string name="decrypt_result_not_encrypted">未加密</string>
<string name="decrypt_result_action_show">顯示</string>
<string name="decrypt_result_action_Lookup">查詢</string>
- <string name="decrypt_invalid_text">簽名無效或是金鑰已經過期/被撤銷,無法確認訊息內容的作者。是否繼續顯示?</string>
<string name="decrypt_invalid_button">我明白這樣做的風險,顯示它!</string>
<!--Add keys-->
<string name="add_keys_my_key">我的金鑰:</string>
@@ -280,9 +256,8 @@
<string name="progress_modify_primaryuid">正在變更主要使用者身份…</string>
<string name="progress_modify_subkeychange">正在變更子金鑰…</string>
<string name="progress_modify_subkeyrevoke">正在撤銷子金鑰…</string>
- <string name="progress_modify_subkeystrip">正在卸下子金鑰...</string>
+ <string name="progress_modify_subkeystrip">正在卸除子金鑰...</string>
<string name="progress_modify_subkeyadd">正在新增子金鑰…</string>
- <string name="progress_modify_passphrase">正在變更口令…</string>
<plurals name="progress_exporting_key">
<item quantity="other">正在匯出金鑰…</item>
</plurals>
@@ -344,11 +319,10 @@
<string name="import_tab_qr_code">二維條碼/NFC</string>
<string name="import_import">匯入選擇的金鑰</string>
<string name="import_qr_code_wrong">QR Code 異常 ! 請再試一次 !</string>
- <string name="import_qr_code_too_short_fingerprint">指紋過短 (&lt; 16 個字元)</string>
<string name="import_qr_code_button">掃描二維條碼</string>
<string name="import_qr_code_text">將您的相機對準 QR Code !</string>
+ <!--Import from URL-->
<!--Generic result toast-->
- <string name="snackbar_details">詳細</string>
<string name="with_warnings">,包含警告</string>
<string name="with_cancelled">,直到被取消</string>
<!--Import result toast-->
@@ -403,10 +377,10 @@
<string name="intent_send_encrypt">使用OpenKeychain加密</string>
<string name="intent_send_decrypt">使用OpenKeychain解密</string>
<!--Remote API-->
- <string name="api_settings_show_info">顯示進階資訊</string>
- <string name="api_settings_hide_info">隱藏進階資訊</string>
- <string name="api_settings_show_advanced">顯示進階設定</string>
- <string name="api_settings_hide_advanced">隱藏進階設定</string>
+ <string name="api_settings_show_info">顯示延伸資訊</string>
+ <string name="api_settings_hide_info">隱藏延伸資訊</string>
+ <string name="api_settings_show_advanced">顯示延伸設定</string>
+ <string name="api_settings_hide_advanced">隱藏延伸設定</string>
<string name="api_settings_no_key">沒有選擇金鑰</string>
<string name="api_settings_select_key">選擇金鑰</string>
<string name="api_settings_create_key">建立新金鑰</string>
@@ -418,6 +392,9 @@
<string name="api_settings_delete_account">移除帳戶</string>
<string name="api_settings_package_name">打包名稱</string>
<string name="api_settings_package_signature">SHA-256 所打包的簽章</string>
+ <string name="api_settings_accounts">帳戶(舊版API)</string>
+ <string name="api_settings_advanced">延伸資訊</string>
+ <string name="api_settings_allowed_keys">允許的金鑰</string>
<string name="api_settings_settings">設定</string>
<string name="api_settings_key">帳戶金鑰:</string>
<string name="api_settings_accounts_empty">沒有帳戶被指派給這個應用程式。</string>
@@ -442,6 +419,7 @@
<string name="key_view_tab_main">摘要</string>
<string name="key_view_tab_share">分享</string>
<string name="key_view_tab_keys">子金鑰</string>
+ <string name="key_view_tab_keybase">Keybase.io</string>
<string name="user_id_info_revoked_title">已撤銷</string>
<string name="user_id_info_revoked_text">這個身分識別被金鑰持有人撤銷,已不再有效。</string>
<string name="user_id_info_certified_title">已認證</string>
@@ -450,9 +428,36 @@
<string name="user_id_info_uncertified_text">這個身分識別尚未經過認證,你不能確認這個身分識別是否屬於真的某個人。</string>
<string name="user_id_info_invalid_title">無效</string>
<!--Key trust-->
+ <string name="key_trust_maybe">這把金鑰未被撤銷且尚未過期。\n金鑰尚未進行確認,但你可以選擇信任它。</string>
+ <string name="key_trust_revoked">這把金鑰已被持有者撤銷。你不應該信任它。</string>
+ <string name="key_trust_expired">這把金鑰已經過期。你不應該信任它。</string>
+ <string name="key_trust_old_keys">用來解密在金鑰失效前加密的訊息還勉強可以接受。</string>
+ <string name="key_trust_no_cloud_evidence">雲端上沒有證據能證明這把金鑰可信度。</string>
+ <string name="key_trust_start_cloud_search">開始搜尋</string>
+ <string name="key_trust_results_prefix">Keybase.io提供“證據”證明這把金鑰的持有人:</string>
+ <string name="key_trust_header_text">注意:Keybase.io證據是個OpenKeychain實驗性功能。我們推薦你另外以QR條碼或是NFC交換金鑰進行確認。</string>
<!--keybase proof stuff-->
+ <string name="keybase_narrative_twitter">用下列身分在Twitter發布訊息:</string>
+ <string name="keybase_narrative_github">用下列身分在GitHub活動:</string>
+ <string name="keybase_narrative_dns">掌控這些域名:</string>
+ <string name="keybase_narrative_web_site">能在這些網站張貼文章:</string>
+ <string name="keybase_narrative_reddit">用下列身分在Reddit參與討論:</string>
+ <string name="keybase_narrative_coinbase">擁有這些Coinbase帳戶:</string>
+ <string name="keybase_narrative_hackernews">用下列身分在Hacker News發表文章:</string>
+ <string name="keybase_narrative_unknown">未知的證據型態</string>
+ <string name="keybase_proof_failure">很不幸地我們沒法驗證這些證據。</string>
+ <string name="keybase_unknown_proof_failure">檢查證據的過程遇到無法辨識的問題</string>
+ <string name="keybase_message_fetching_data">取得證據中</string>
+ <string name="keybase_proof_succeeded">這項證據已通過驗證!</string>
+ <string name="keybase_a_post">一則文章</string>
+ <string name="keybase_fetched_from">取得自</string>
+ <string name="keybase_for_the_domain">從域名</string>
+ <string name="keybase_contained_signature">包含一則只有金鑰持有人才能建立的訊息。</string>
+ <string name="keybase_twitter_proof">一則推文</string>
+ <string name="keybase_dns_proof">一筆DNS TXT記錄</string>
+ <string name="keybase_web_site_proof">一個文字檔案</string>
+ <string name="keybase_reddit_proof">一個JSON檔案</string>
<!--Edit key-->
- <string name="edit_key_action_change_passphrase">變更口令</string>
<string name="edit_key_action_add_identity">新增身分識別</string>
<string name="edit_key_action_add_subkey">新增子金鑰</string>
<string-array name="edit_key_edit_user_id">
@@ -462,24 +467,40 @@
<string name="edit_key_edit_user_id_revoked">這個身分識別已被撤銷。此動作無法還原。</string>
<string name="edit_key_edit_subkey_title">選擇操作動作!</string>
<string-array name="edit_key_edit_subkey">
- <item>變更到期日</item>
+ <item>變更效期</item>
<item>撤銷子金鑰</item>
- <item>Strip Subkey</item>
- <item>"Move Subkey to Yubikey / Smart Card"</item>
+ <item>卸除子金鑰</item>
+ <item>移動子金鑰至YubiKey / 智慧卡</item>
</string-array>
<string name="edit_key_new_subkey">新增子金鑰</string>
<string name="edit_key_error_add_identity">新增至少一組身分識別!</string>
<string name="edit_key_error_add_subkey">新增至少一組子金鑰!</string>
+ <string name="edit_key_error_bad_nfc_algo">智慧卡不支援該算法!</string>
+ <string name="edit_key_error_bad_nfc_size">智慧卡不支援該金鑰長度!</string>
+ <string name="edit_key_error_bad_nfc_stripped">無法移動金鑰至智慧卡(已移動或被卸除)!</string>
<!--Create key-->
+ <string name="create_key_upload">與雲端同步</string>
<string name="create_key_empty">必填欄位</string>
- <string name="create_key_passphrases_not_equal">口令不相符</string>
+ <string name="create_key_passphrases_not_equal">密碼不相符</string>
<string name="create_key_final_robot_text">建立金鑰可能需要一點時間,來杯咖啡吧…</string>
+ <string name="create_key_rsa">(3把子金鑰,RSA,4096位元)</string>
+ <string name="create_key_custom">(自定義金鑰組合)</string>
<string name="create_key_name_text">選擇一個名字有關這個金鑰。 這可以是全名John Doe或是暱稱Johnny。</string>
- <string name="create_key_passphrase_text">選擇一個安全性較佳的口令,當手機遺失或遭竊時可以保護你的金鑰。</string>
<string name="create_key_hint_full_name">全名或暱稱</string>
+ <string name="create_key_edit">變更金鑰設置</string>
<string name="create_key_add_email">新增電子郵件</string>
+ <string name="create_key_email_already_exists_text">電子郵件地址已經存在</string>
+ <string name="create_key_email_invalid_email">電子郵件地址無效</string>
<!--View key-->
+ <string name="view_key_revoked">已撤銷:不該再使用此金鑰!</string>
+ <string name="view_key_expired">已過期:聯絡人需要去展延金鑰的效期!</string>
+ <string name="view_key_expired_secret">已過期:你可以從編輯畫面展延金鑰效期!</string>
<string name="view_key_my_key">我的金鑰:</string>
+ <string name="view_key_verified">已確認金鑰</string>
+ <string name="view_key_unverified">未確認:掃描QR條碼來確認該金鑰!</string>
+ <string name="view_key_fragment_no_system_contact">&lt;無&gt;</string>
+ <!--Add keyserver-->
+ <string name="add_keyserver_invalid_url">URL無效!</string>
<!--Navigation Drawer-->
<string name="nav_keys">金鑰</string>
<string name="nav_encrypt_decrypt">加密/解密</string>
@@ -489,11 +510,62 @@
<!--certs-->
<string name="cert_default">預設</string>
<string name="cert_none">無</string>
+ <string name="cert_casual">隨意的</string>
+ <string name="cert_positive">積極的</string>
<string name="cert_verify_ok">OK</string>
<string name="cert_verify_failed">失敗!</string>
<string name="cert_verify_error">錯誤!</string>
<!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
+ <string name="msg_internal_error">內部錯誤!</string>
+ <string name="msg_cancelled">操作已取消。</string>
<!--Import Public log entries-->
+ <string name="msg_ip_bad_type_secret">嘗試將密鑰匯入公鑰鑰匙圈。這不正常,麻煩回報問題!</string>
+ <string name="msg_ip_encode_fail">操作失敗,因為編碼錯誤</string>
+ <string name="msg_ip_error_io_exc">操作失敗,因為I/O錯誤</string>
+ <string name="msg_ip_error_op_exc">操作失敗,因為資料庫錯誤</string>
+ <string name="msg_ip_error_remote_ex">操作失敗,因為內部錯誤</string>
+ <string name="msg_ip_master_flags_unspecified">主要標記:未指定(全用途)</string>
+ <string name="msg_ip_master_flags_cesa">主要標記:認證、加密、簽署、驗證</string>
+ <string name="msg_ip_master_flags_cesx">主要標記:認證、加密、簽署</string>
+ <string name="msg_ip_master_flags_cexa">主要標記:認證、加密、驗證</string>
+ <string name="msg_ip_master_flags_cexx">主要標記:認證、加密</string>
+ <string name="msg_ip_master_flags_cxsa">主要標記:認證、簽署、驗證</string>
+ <string name="msg_ip_master_flags_cxsx">主要標記:認證、簽署</string>
+ <string name="msg_ip_master_flags_cxxa">主要標記:認證、驗證</string>
+ <string name="msg_ip_master_flags_cxxx">主要標記:認證</string>
+ <string name="msg_ip_master_flags_xesa">主要標記:加密、簽署、驗證</string>
+ <string name="msg_ip_master_flags_xesx">主要標記:加密、簽署</string>
+ <string name="msg_ip_master_flags_xexa">主要標記:加密、驗證</string>
+ <string name="msg_ip_master_flags_xexx">主要標記:加密</string>
+ <string name="msg_ip_master_flags_xxsa">主要標記:簽署、驗證</string>
+ <string name="msg_ip_master_flags_xxsx">主要標記:簽署</string>
+ <string name="msg_ip_master_flags_xxxa">主要標記:驗證</string>
+ <string name="msg_ip_master_flags_xxxx">主要標記:無</string>
+ <string name="msg_ip_merge_public">將匯入的資料合併至公鑰鑰匙圈</string>
+ <string name="msg_ip_merge_secret">將匯入的資料合併至密鑰鑰匙圈</string>
+ <string name="msg_ip_subkey">正在處理子金鑰%s</string>
+ <string name="msg_ip_subkey_expired">子金鑰已於%s過期</string>
+ <string name="msg_ip_subkey_expires">子金鑰將於%s過期</string>
+ <string name="msg_ip_subkey_flags_unspecified">子金鑰標記:未指定(全用途)</string>
+ <string name="msg_ip_subkey_flags_cesa">子金鑰標記:認證、加密、簽署、驗證</string>
+ <string name="msg_ip_subkey_flags_cesx">子金鑰標記:認證、加密、簽署</string>
+ <string name="msg_ip_subkey_flags_cexa">子金鑰標記:認證、加密、驗證</string>
+ <string name="msg_ip_subkey_flags_cexx">子金鑰標記:認證、加密</string>
+ <string name="msg_ip_subkey_flags_cxsa">子金鑰標記:認證、簽署、驗證</string>
+ <string name="msg_ip_subkey_flags_cxsx">子金鑰標記:認證、簽署</string>
+ <string name="msg_ip_subkey_flags_cxxa">子金鑰標記:認證、驗證</string>
+ <string name="msg_ip_subkey_flags_cxxx">子金鑰標記:認證</string>
+ <string name="msg_ip_subkey_flags_xesa">子金鑰標記:加密、簽署、驗證</string>
+ <string name="msg_ip_subkey_flags_xesx">子金鑰標記:加密、簽署</string>
+ <string name="msg_ip_subkey_flags_xexa">子金鑰標記:加密、驗證</string>
+ <string name="msg_ip_subkey_flags_xexx">子金鑰標記:加密</string>
+ <string name="msg_ip_subkey_flags_xxsa">子金鑰標記:簽署、驗證</string>
+ <string name="msg_ip_subkey_flags_xxsx">子金鑰標記:簽署</string>
+ <string name="msg_ip_subkey_flags_xxxa">子金鑰標記:驗證</string>
+ <string name="msg_ip_subkey_flags_xxxx">子金鑰標記:無</string>
+ <string name="msg_ip_success">成功匯入公鑰鑰匙圈</string>
+ <string name="msg_ip_success_identical">鑰匙圈沒有新資料,不必進行操作</string>
+ <string name="msg_ip_reinsert_secret">重新插入密鑰</string>
<!--Import Secret log entries-->
<string name="msg_is_db_exception">資料庫錯誤!</string>
<string name="msg_is_merge_public">將匯入的資料合併至公鑰鑰匙圈</string>
@@ -505,13 +577,14 @@
<!--Keyring merging log entries-->
<!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <string name="msg_mf_subkey_strip">正在卸除子金鑰%s</string>
<!--Consolidate-->
<!--Edit Key (higher level than modify)-->
<!--Promote key-->
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_not_found">找不到金鑰!</string>
<!--Messages for DecryptVerify operation-->
- <string name="msg_dc_error_invalid_data">找不到有效的簽名資訊!</string>
+ <string name="msg_dc_error_invalid_data">沒有找到有效的OpenPGP加密或簽署內容!</string>
<string name="msg_dc">開始解密…</string>
<!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
@@ -522,7 +595,6 @@
<string name="msg_crt_upload_success">成功上傳金鑰到伺服器</string>
<string name="msg_import_fetch_error">無法取得金鑰!(網路問題?)</string>
<string name="msg_import_fetch_keybase">從keybase.io取回:%s</string>
- <string name="msg_import_fetch_keyserver_error">無法從keybase取得金鑰!</string>
<string name="msg_import_fetch_keyserver">從金鑰伺服器取回:%s</string>
<string name="msg_import_fetch_keyserver_ok">成功取得金鑰</string>
<string name="msg_import_keyserver">使用金鑰伺服器%s</string>
@@ -539,17 +611,17 @@
<string name="msg_download_query_failed">查詢金鑰的時候發生錯誤。</string>
<!--Messages for Export Log operation-->
<!--PassphraseCache-->
- <string name="passp_cache_notif_n_keys">OpenKeychain快取了%d個口令</string>
- <string name="passp_cache_notif_keys">已快取的口令:</string>
- <string name="passp_cache_notif_clear">清除快取</string>
- <string name="passp_cache_notif_pwd">口令</string>
<!--First Time-->
+ <string name="first_time_create_key">建立金鑰</string>
+ <string name="first_time_import_key">從檔案匯入金鑰</string>
+ <string name="first_time_yubikey">使用YubiKey NEO</string>
+ <string name="first_time_skip">跳過設置</string>
<!--unsorted-->
+ <string name="unknown_uid">&lt;未知&gt;</string>
<string name="empty_certs">這把金鑰未經過認證</string>
<string name="certs_text">只有有效的自簽署認證以及經由你的金鑰簽署的有效認證會被顯示在這。</string>
<string name="label_revocation">撤銷原因</string>
<string name="error_key_not_found">找不到金鑰!</string>
- <string name="key_no_passphrase">沒有口令</string>
<string name="key_unavailable">無法使用</string>
<string name="title_view_cert">查看認證內容</string>
<string name="unknown_algorithm">未知</string>
@@ -559,10 +631,9 @@
<string name="btn_start_exchange">開始交換</string>
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<string name="passphrase_again">再一次</string>
<string name="unlock_method">解鎖方法</string>
- <string name="set_passphrase">設定口令</string>
<string name="nfc_title">NFC</string>
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
<string name="nfc_wrong_tag">錯誤的標籤。請再試一次。</string>
diff --git a/OpenKeychain/src/main/res/values-zh/strings.xml b/OpenKeychain/src/main/res/values-zh/strings.xml
index 4488a6020..069e3f0bd 100644
--- a/OpenKeychain/src/main/res/values-zh/strings.xml
+++ b/OpenKeychain/src/main/res/values-zh/strings.xml
@@ -4,12 +4,14 @@
http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
<string name="app_name">OpenKeychain</string>
<!--title-->
+ <string name="title_encrypt_text">加密</string>
+ <string name="title_encrypt_files">加密</string>
<string name="title_decrypt">解密</string>
<string name="title_add_subkey">添加子密钥</string>
<string name="title_edit_key">编辑密钥</string>
<string name="title_preferences">设置</string>
<string name="title_api_registered_apps">已注册应用</string>
- <string name="title_key_server_preference">密钥服务器</string>
+ <string name="title_key_server_preference">OenPGP 密钥服务器</string>
<string name="title_change_passphrase">变更密码</string>
<string name="title_share_fingerprint_with">分享签名</string>
<string name="title_share_key">分享密钥</string>
@@ -26,21 +28,23 @@
<string name="title_key_details">密钥详情</string>
<string name="title_help">帮助</string>
<string name="title_log_display">日志</string>
- <string name="title_advanced_key_info">更多密钥详情</string>
+ <string name="title_exchange_keys">交换密钥</string>
<string name="title_export_log">导出日志</string>
+ <string name="title_manage_my_keys">管理我的密钥</string>
<!--section-->
<string name="section_user_ids">用户名</string>
+ <string name="section_yubikey">YubiKey</string>
<string name="section_should_you_trust">应该相信此密钥?</string>
<string name="section_keys">子密钥</string>
<string name="section_cloud_search">在线搜索</string>
- <string name="section_passphrase_cache">密语缓存</string>
<string name="section_certify">确认</string>
+ <string name="section_actions">动作</string>
<string name="section_key_server">密钥服务器</string>
<string name="section_fingerprint">签名</string>
+ <string name="section_encrypt">加密</string>
<!--button-->
<string name="btn_decrypt_verify_file">解密并验证文件</string>
<string name="btn_encrypt_share_file">加密并分享文件</string>
- <string name="btn_save">保存</string>
<string name="btn_do_not_save">取消</string>
<string name="btn_delete">删除</string>
<string name="btn_no_date">没有日期</string>
@@ -48,31 +52,54 @@
<string name="btn_export_to_server">导出到服务器</string>
<string name="btn_next">下一步</string>
<string name="btn_back">返回</string>
+ <string name="btn_share_encrypted_signed">加密并分享</string>
+ <string name="btn_copy_encrypted_signed">加密并复制</string>
<string name="btn_view_cert_key">显示密钥</string>
<string name="btn_create_key">创建密钥</string>
<string name="btn_add_files">添加密钥</string>
- <string name="btn_add_share_decrypted_text">添加并分享加密后的文本</string>
- <string name="btn_decrypt_and_verify">解密并验证</string>
- <string name="btn_decrypt_files">解密文件</string>
+ <string name="btn_share_decrypted_text">分享解密文本</string>
+ <string name="btn_copy_decrypted_text">复制解密文本</string>
+ <string name="btn_encrypt_files">加密文件</string>
+ <string name="btn_encrypt_text">加密文本</string>
+ <string name="btn_add_email">添加额外的邮件地址</string>
+ <string name="btn_unlock">解锁</string>
+ <string name="btn_add_keyserver">添加</string>
+ <string name="btn_saved">已保存</string>
<!--menu-->
<string name="menu_preferences">参数设置</string>
<string name="menu_help">帮助</string>
<string name="menu_export_key">导出密钥</string>
<string name="menu_delete_key">删除密钥</string>
+ <string name="menu_manage_keys">管理我的密钥</string>
<string name="menu_search">搜索</string>
+ <string name="menu_nfc_preferences">NFC设置</string>
<string name="menu_beam_preferences">参数</string>
<string name="menu_encrypt_to">加密到...</string>
<string name="menu_select_all">选择全部</string>
<string name="menu_export_all_keys">导出全部密钥</string>
- <string name="menu_advanced">高级</string>
+ <string name="menu_update_all_keys">更新所有密钥</string>
+ <string name="menu_advanced">更多信息</string>
+ <string name="menu_export_log">导出日志</string>
<!--label-->
<string name="label_file">文件</string>
<string name="label_files">多个文件</string>
<string name="label_no_passphrase">没有密码</string>
<string name="label_passphrase">密码</string>
- <string name="label_passphrase_again">确认密码</string>
+ <string name="label_unlock">解锁中...</string>
+ <string name="label_passphrase_again">重复密码</string>
+ <string name="label_show_passphrase">显示密码</string>
<string name="label_algorithm">算法</string>
+ <string name="label_ascii_armor">文件ASCII文本化</string>
+ <string name="label_file_ascii_armor">启用ASCII文本化</string>
<string name="label_write_version_header">写入文件头信息</string>
+ <string name="label_use_default_yubikey_pin">使用默认YubiKey PIN</string>
+ <string name="label_message_compression">文本压缩</string>
+ <string name="label_file_compression">文件压缩</string>
+ <string name="label_keyservers">选择OpenPGP 密钥服务器</string>
+ <string name="label_key_id">密钥ID</string>
+ <string name="label_expiry">过期时间</string>
+ <string name="label_usage">用途</string>
+ <string name="label_key_size">密钥大小</string>
<string name="label_main_user_id">用户名</string>
<string name="label_name">姓名</string>
<string name="label_comment">注解</string>
@@ -80,6 +107,8 @@
<string name="label_fingerprint">指纹</string>
<string name="expiry_date_dialog_title">有效期</string>
<string name="label_first_keyserver_is_used">首选服务器</string>
+ <string name="label_encrypt_filenames">加密文件名</string>
+ <string name="pref_keyserver">OpenPGP 密钥服务器</string>
<plurals name="n_keys">
<item quantity="other">其他</item>
</plurals>
@@ -101,21 +130,27 @@
<string name="choice_4hours">4小时</string>
<string name="choice_8hours">8小时</string>
<string name="choice_forever">永远</string>
+ <string name="dsa">DSA</string>
+ <string name="elgamal">ElGamal</string>
+ <string name="rsa">RSA</string>
+ <string name="ecdh">ECDH</string>
+ <string name="ecdsa">ECDSA</string>
<string name="filemanager_title_open">打开...</string>
<string name="error">错误</string>
+ <string name="error_message">错误:%s</string>
<!--key flags-->
+ <string name="flag_certify">验证</string>
+ <string name="flag_sign">签名</string>
+ <string name="flag_encrypt">加密</string>
<!--sentences-->
<string name="wrong_passphrase">密码错误</string>
<string name="no_filemanager_installed">安装了不匹配的文件管理器</string>
<string name="passphrases_do_not_match">密码不匹配</string>
- <string name="passphrase_must_not_be_empty">密码不能为空</string>
+ <string name="passphrase_must_not_be_empty">请输入一个密码</string>
<string name="passphrase_for_symmetric_encryption">对称加密</string>
- <string name="passphrase_for">密码</string>
- <string name="no_file_selected">先选择一个文件</string>
<string name="encrypt_sign_successful">加密并签名成功</string>
<string name="encrypt_sign_clipboard_successful">加密签名并复制到剪贴板成功</string>
<string name="select_encryption_key">选择至少一个加密密钥</string>
- <string name="error_no_encryption_or_signature_key">选择至少一个加密密钥或者签名密钥</string>
<string name="also_export_secret_keys">同时导出密钥</string>
<string name="key_exported">成功地导出了1个密钥</string>
<string name="keys_exported">成功导出多个密钥</string>
@@ -125,24 +160,24 @@
<item quantity="other">其他</item>
</plurals>
<string name="list_empty">这个列表是空的!</string>
- <string name="nfc_successful">NFC成功</string>
+ <string name="nfc_successful">成功通过NFC发送密钥</string>
<string name="key_copied_to_clipboard">复制密钥到剪贴板</string>
<string name="fingerprint_copied_to_clipboard">复制签名到剪贴板</string>
+ <string name="select_key_to_certify">选择验证密钥</string>
<string name="key_too_big_for_sharing">密钥太长</string>
<string name="text_copied_to_clipboard">复制文本到剪贴板</string>
<!--errors
no punctuation, all lowercase,
they will be put after "error_message", e.g. "Error: file not found"-->
+ <string name="error_file_delete_failed">还未被删除. 手动删除它们!</string>
+ <string name="error_file_added_already">%s 已经被添加了</string>
<string name="error_file_not_found">没有找到文件</string>
<string name="error_no_secret_key_found">没有找到私钥</string>
<string name="error_external_storage_not_ready">外置存储没有准备好</string>
<string name="error_key_size_minimum512bit">密钥的大小必须至少512位</string>
<string name="error_unknown_algorithm_choice">位置的算法选择</string>
- <string name="error_user_id_no_email">缺少电子邮件</string>
- <string name="error_no_signature_passphrase">没有提供密码</string>
<string name="error_no_signature_key">没有提供签名密钥</string>
<string name="error_integrity_check_failed">检查失败</string>
- <string name="error_wrong_passphrase">错误的密语</string>
<!--errors without preceeding Error:-->
<!--results shown after decryption/verification-->
<!--Add keys-->
@@ -175,14 +210,13 @@
<string name="help_tab_about">关于</string>
<string name="help_about_version">版本:</string>
<!--Import-->
+ <!--Import from URL-->
<!--Generic result toast-->
<!--Import result toast-->
<!--Delete result toast-->
<!--Certify result toast-->
<!--Intent labels-->
<!--Remote API-->
- <string name="api_settings_show_advanced">显示高级设置</string>
- <string name="api_settings_hide_advanced">隐藏高级设置</string>
<string name="api_settings_select_key">选择密钥</string>
<string name="api_settings_save">保存</string>
<string name="api_settings_cancel">取消</string>
@@ -200,6 +234,7 @@
<!--Edit key-->
<!--Create key-->
<!--View key-->
+ <!--Add keyserver-->
<!--Navigation Drawer-->
<!--hints-->
<!--certs-->
@@ -224,6 +259,6 @@
<!--unsorted-->
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
- <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="enter_passphrase_twice">Enter password twice</string>-->
<!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 6b6e3f5bf..c216cd869 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -63,7 +63,8 @@
<string name="btn_decrypt_verify_file">"Decrypt, verify, and save file"</string>
<string name="btn_encrypt_share_file">"Encrypt and share file"</string>
<string name="btn_encrypt_save_file">"Encrypt and save file"</string>
- <string name="btn_save">"Save file"</string>
+ <string name="btn_save_file">"Save file"</string>
+ <string name="btn_save">"Save"</string>
<string name="btn_view_log">"View log"</string>
<string name="btn_do_not_save">"Cancel"</string>
<string name="btn_delete">"Delete"</string>
@@ -108,6 +109,8 @@
<string name="menu_certify_fingerprint">"Confirm via fingerprint comparison"</string>
<string name="menu_export_log">"Export Log"</string>
+ <string name="menu_keyserver_add">"Add"</string>
+
<!-- label -->
<string name="label_message">"Text"</string>
<string name="label_file">"File"</string>
@@ -152,13 +155,17 @@
<string name="label_send_key">"Synchronize with the cloud"</string>
<string name="label_fingerprint">"Fingerprint"</string>
<string name="expiry_date_dialog_title">"Set expiry date"</string>
- <string name="label_first_keyserver_is_used">"(First keyserver listed is preferred)"</string>
+ <string name="label_keyservers_title">"Keyservers"</string>
+ <string name="label_keyserver_settings_hint">"Drag to change order, tap to edit/delete"</string>
+ <string name="label_selected_keyserver_title">"Selected keyserver"</string>
<string name="label_preferred">"preferred"</string>
<string name="label_enable_compression">"Enable compression"</string>
<string name="label_encrypt_filenames">"Encrypt filenames"</string>
<string name="label_hidden_recipients">"Hide recipients"</string>
+
<string name="label_verify_keyserver">"Verify keyserver"</string>
<string name="label_enter_keyserver_url">"Enter keyserver URL"</string>
+ <string name="label_keyserver_dialog_delete">"Delete keyserver"</string>
<string name="pref_keyserver">"OpenPGP keyservers"</string>
<string name="pref_keyserver_summary">"Search keys on selected OpenPGP keyservers (HKP protocol)"</string>
@@ -653,6 +660,13 @@
<string name="create_key_add_email_text">"Additional email addresses are also associated to this key and can be used for secure communication."</string>
<string name="create_key_email_already_exists_text">"Email address has already been added"</string>
<string name="create_key_email_invalid_email">"Email address format is invalid"</string>
+ <string name="create_key_yubi_key_pin_text">"Please remember these PINs. They are required to use your YubiKey later. If possible write down the Admin PIN and store it in a safe place."</string>
+ <string name="create_key_yubi_key_pin">"PIN"</string>
+ <string name="create_key_yubi_key_admin_pin">"Admin PIN"</string>
+ <string name="create_key_yubi_key_pin_repeat_text">"Please enter the PIN and Admin PIN to proceed."</string>
+ <string name="create_key_yubi_key_pin_repeat">"Repeat PIN"</string>
+ <string name="create_key_yubi_key_admin_pin_repeat">"Repeat Admin PIN"</string>
+ <string name="create_key_yubi_key_pin_not_correct">"PIN is not correct!"</string>
<!-- View key -->
<string name="view_key_revoked">"Revoked: Key must not be used anymore!"</string>
@@ -664,12 +678,15 @@
<string name="view_key_fragment_no_system_contact">"&lt;none&gt;"</string>
- <!-- Add keyserver -->
+ <!-- Add/Edit keyserver -->
<string name="add_keyserver_dialog_title">"Add keyserver"</string>
+ <string name="edit_keyserver_dialog_title">"Edit keyserver"</string>
<string name="add_keyserver_verified">"Keyserver verified!"</string>
<string name="add_keyserver_without_verification">"Keyserver added without verification."</string>
<string name="add_keyserver_invalid_url">"Invalid URL!"</string>
<string name="add_keyserver_connection_failed">"Failed to connect to keyserver. Please check the URL and your internet connection."</string>
+ <string name="keyserver_preference_deleted">"%s deleted"</string>
+ <string name="keyserver_preference_cannot_delete_last">"Cannot delete last keyserver. At least one is required!"</string>
<!-- Navigation Drawer -->
<string name="nav_keys">"Keys"</string>
@@ -1213,6 +1230,15 @@
<string name="msg_download_query_failed">"An error occurred when searching for keys."</string>
+ <!-- Messages for Keybase Verification operation -->
+ <string name="msg_keybase_verification">"Attempting keybase verification for %s"</string>
+ <string name="msg_keybase_error_no_prover">"No proof checker found for %s"</string>
+ <string name="msg_keybase_error_fetching_evidence">"Problem with fetching proof"</string>
+ <string name="msg_keybase_error_key_mismatch">"Key fingerprint doesn’t match that in proof post"</string>
+ <string name="msg_keybase_error_dns_fail">"DNS TXT Record retrieval failed"</string>
+ <string name="msg_keybase_error_specific">"%s"</string>
+ <string name="msg_keybase_error_msg_payload_mismatch">"Decrypted proof post does not match expected value"</string>
+
<!-- Messages for Export Log operation -->
<string name="msg_export_log_start">"Exporting log"</string>
<string name="msg_export_log_error_fopen">"Error opening file"</string>
@@ -1236,8 +1262,8 @@
<string name="first_time_import_key">"Import key from file"</string>
<string name="first_time_yubikey">"Use YubiKey NEO"</string>
<string name="first_time_skip">"Skip Setup"</string>
- <string name="first_time_blank_smartcard_title">"Blank smart card / YubiKey detected"</string>
- <string name="first_time_blank_smartcard_message">"Would you like to generate a smart card compatible key?"</string>
+ <string name="first_time_blank_yubikey">"Would you like to use this blank YubiKey NEO with OpenKeychain?\n\nPlease take away the YubiKey now, you will be prompted when it is needed again!"</string>
+ <string name="first_time_blank_yubikey_yes">"Use this YubiKey"</string>
<!-- unsorted -->
<string name="section_certifier_id">"Certifier"</string>
@@ -1351,5 +1377,6 @@
<string name="file_delete_ok">"Original file deleted."</string>
<string name="file_delete_none">"No file deleted! (Already deleted?)"</string>
<string name="file_delete_exception">"Original file could not be deleted!"</string>
+ <string name="error_clipboard_empty">"Clipboard is empty!"</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values/styles.xml b/OpenKeychain/src/main/res/values/styles.xml
index 9ac60c397..c7b326b7a 100644
--- a/OpenKeychain/src/main/res/values/styles.xml
+++ b/OpenKeychain/src/main/res/values/styles.xml
@@ -26,4 +26,12 @@
<item name="android:textColor">@color/white</item>
</style>
+ <!-- This style is for use with our drag and drop RecyclerView since ItemDecoration did not
+ move with the drag -->
+ <style name="Divider">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">2dp</item>
+ <item name="android:background">?android:attr/listDivider</item>
+ </style>
+
</resources> \ No newline at end of file
diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/ExportTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/ExportTest.java
index fa1288e08..a659dc7da 100644
--- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/ExportTest.java
+++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/ExportTest.java
@@ -30,7 +30,6 @@ import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLog;
import org.spongycastle.bcpg.sig.KeyFlags;
import org.spongycastle.jce.provider.BouncyCastleProvider;
-import org.sufficientlysecure.keychain.BuildConfig;
import org.sufficientlysecure.keychain.WorkaroundBuildConfig;
import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult;
import org.sufficientlysecure.keychain.operations.results.ExportResult;
@@ -127,7 +126,7 @@ public class ExportTest {
@Test
public void testExportAll() throws Exception {
- ImportExportOperation op = new ImportExportOperation(RuntimeEnvironment.application,
+ ExportOperation op = new ExportOperation(RuntimeEnvironment.application,
new ProviderHelper(RuntimeEnvironment.application), null);
// make sure there is a local cert (so the later checks that there are none are meaningful)
diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperationTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperationTest.java
index d92e90d6a..fcb458fbe 100644
--- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperationTest.java
+++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperationTest.java
@@ -41,7 +41,6 @@ import org.spongycastle.bcpg.UserIDPacket;
import org.spongycastle.bcpg.sig.KeyFlags;
import org.spongycastle.jce.provider.BouncyCastleProvider;
import org.spongycastle.openpgp.PGPSignature;
-import org.sufficientlysecure.keychain.BuildConfig;
import org.sufficientlysecure.keychain.WorkaroundBuildConfig;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
@@ -847,7 +846,7 @@ public class PgpKeyOperationTest {
parcel, cryptoInput, LogType.MSG_MF_ERROR_BAD_NFC_ALGO);
}
- { // keytocard should return a pending NFC_KEYTOCARD result when presented with the RSA-2048
+ { // keytocard should return a pending NFC_MOVE_KEY_TO_CARD result when presented with the RSA-2048
// key, and then make key divert-to-card when it gets a serial in the cryptoInputParcel.
long keyId = KeyringTestingHelper.getSubkeyId(ring, 2);
parcel.reset();
@@ -858,8 +857,8 @@ public class PgpKeyOperationTest {
PgpKeyOperation op = new PgpKeyOperation(null);
PgpEditKeyResult result = op.modifySecretKeyRing(secretRing, cryptoInput, parcel);
Assert.assertTrue("keytocard operation should be pending", result.isPending());
- Assert.assertEquals("required input should be RequiredInputType.NFC_KEYTOCARD",
- result.getRequiredInputParcel().mType, RequiredInputType.NFC_KEYTOCARD);
+ Assert.assertEquals("required input should be RequiredInputType.NFC_MOVE_KEY_TO_CARD",
+ result.getRequiredInputParcel().mType, RequiredInputType.NFC_MOVE_KEY_TO_CARD);
// Create a cryptoInputParcel that matches what the NFCOperationActivity would return.
byte[] keyIdBytes = new byte[8];