Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
\n
Google Mobile Services (/com/google/android/gms): NonFreeDep
\n
Google API Client Libraries (/com/google/api/client): NonFreeNet
\n
Google Drive API (/com/google/api/services/drive): NonFreeDep,NonFreeNet
\n
Microsoft Authentication Library (/com/microsoft/identity): NonFreeNet
\n
pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
\n
\n7 offender(s). Full report available here.\n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":""},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":""},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":""},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":""},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":""},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":""},{"id":"/androidx/browser","name":"Browser","typ":"Utility","anti":""},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":""},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":""},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":""},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":""},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":""},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":""},{"id":"/androidx/fragment/app","name":"Androidx Fragment","typ":"Development Aid","anti":""},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":""},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":""},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":""},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":""},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":""},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":""},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":""},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":""},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":""},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":""},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":""},{"id":"/com/azure","name":"Azure SDK for Java","typ":"Development Framework","anti":"NonFreeNet"},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":""},{"id":"/com/ctc/wstx","name":"Woodstox","typ":"Utility","anti":""},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":""},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/fasterxml","name":"Fasterxml","typ":"Utility","anti":""},{"id":"/com/google/android/gms","name":"Google Mobile Services","typ":"Development Framework","anti":"NonFreeDep"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":""},{"id":"/com/google/api/client","name":"Google API Client Libraries","typ":"Development Framework","anti":"NonFreeNet"},{"id":"/com/google/api/services/drive","name":"Google Drive API","typ":"Utility","anti":"NonFreeDep,NonFreeNet"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":""},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":""},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":""},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":""},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":""},{"id":"/com/microsoft/aad/adal","name":"Microsoft Azure Active Directory Authentication Library","typ":"Utility","anti":""},{"id":"/com/microsoft/device/dualscreen","name":"Surface Duo SDK","typ":"Utility","anti":""},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":""},{"id":"/com/microsoft/identity","name":"Microsoft Authentication Library","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/nimbusds/jose","name":"Nimbus JOSE+JWT","typ":"Utility","anti":""},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":""},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":""},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":""},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":""},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":""},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":""},{"id":"/io/minio","name":"MinIO Client SDK for Java","typ":"Utility","anti":""},{"id":"/io/netty","name":"Netty Project","typ":"Development Framework","anti":""},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":""},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":""},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":""},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":""},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":""},{"id":"/net/jcip/annotations","name":"JCIP Annotations","typ":"Utility","anti":""},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":""},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":""},{"id":"/org/apache/http","name":"Apache Http","typ":"Utility","anti":""},{"id":"/org/bouncycastle","name":"Bouncy Castle","typ":"Utility","anti":""},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":""},{"id":"/org/codehaus/stax2","name":"Stax2 API","typ":"Utility","anti":""},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":""},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":""},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":""},{"id":"/org/simpleframework","name":"Simple","typ":"Utility","anti":""},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":""},{"id":"/reactor/core","name":"Reactor Core","typ":"Utility","anti":""},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":""}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2793 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 44689 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 73 libraries, 7 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}}
\ No newline at end of file
diff --git a/fastlane/metadata/android/de-DE/changelogs/default.txt b/fastlane/metadata/android/de-DE/changelogs/default.txt
index 65c197145..7e9ce8c07 100644
--- a/fastlane/metadata/android/de-DE/changelogs/default.txt
+++ b/fastlane/metadata/android/de-DE/changelogs/default.txt
@@ -1,2 +1,6 @@
-- Zeige Dialog und Benachrichtigung an, wenn die Berechtigung "Dateien" widerrufen wird, erforderlich für den automatischen Upload
-- Das Abmelden von einer Cloud löscht nun auch die Anmeldeinformationen einer aktiven Verbindung zu ihr
\ No newline at end of file
+- Unterstützung für mehrere OneDrive-Konten hinzugefügt
+- Zugriff auf Tresore, die sich in "Shared with Me", "My Computer" und "My Drive" von Google Drive befinden, wurde mit Hilfe von Shortcuts hinzugefügt
+- Viele Übersetzungen hinzugefügt
+- Verbesserte Suchfunktion, nun wird eine "enthält"-Suche anstelle von "beginnt mit" verwendet
+- Absturz auf einigen Geräten während des Entsperrens aufgrund einer Keystore-Ausnahme behoben
+- Problem beim Löschen einer Cloud behoben
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/default.txt b/fastlane/metadata/android/en-US/changelogs/default.txt
index 553889a42..5a29c08bb 100644
--- a/fastlane/metadata/android/en-US/changelogs/default.txt
+++ b/fastlane/metadata/android/en-US/changelogs/default.txt
@@ -1,2 +1,6 @@
-- Show information when "Storage" permission revoked, required for auto upload
-- Logging out of a cloud now also clears the credentials of an active connection to it
\ No newline at end of file
+- Added support for multiple OneDrive accounts
+- Added access to vaults located in "Shared with Me", "My Computer" and "My Drive" of Google Drive using shortcuts
+- Added a lot of translations
+- Improved search functionality, now a "contains" search is used instead of "starts with"
+- Fixed crash on some devices during unlock due to keystore exception
+- Fixed problem during deletion of a cloud
\ No newline at end of file
diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt
index 4bfd34cb3..a16658322 100644
--- a/fastlane/metadata/android/fr-FR/full_description.txt
+++ b/fastlane/metadata/android/fr-FR/full_description.txt
@@ -1,8 +1,8 @@
-Cryptomator rend votre stockage dans le cloud beaucoup plus sûr. L'application chiffre les fichiers sur votre appareil mobile avant qu'ils ne soient envoyés dans votre cloud. Même si une tierce partie obtient un accès non autorisé à vos fichiers (par exemple, une attaque de pirates informatiques), vos fichiers sont à l'abri des regards indiscrets.
+Avec Cryptomator, la clé de vos données est dans vos mains. Cryptomator chiffre vos données rapidement et facilement. Vous les envoyez sur votre service cloud favori.
-SIMPLICITÉ
+SIMPLE D'UTILISATION
-Cryptomator a été développé en mettant l'accent sur la convivialité.
+Cryptomator est un outil d'auto-défense numérique. Il vous permet de protéger vos données stockées sur le cloud vous-même et en indépendance.
• Il suffit de créer un coffre-fort et d'y attribuer un mot de passe
• Aucun compte ou configuration supplémentaire n'est nécessaire
@@ -10,30 +10,30 @@ Cryptomator a été développé en mettant l'accent sur la convivialité.
* à partir d'Android 6.0 et sur smartphones avec capteur biométrique d'empreintes digitales
-COMPATIBILITÉ
+COMPATIBLE
Cryptomator est compatible avec les systèmes de stockage dans le cloud les plus couramment utilisés et disponible pour tous les principaux systèmes d'exploitation.
-• Compatible avec Dropbox, Google Drive, OneDrive et les services de stockage dans le nuage basés sur WebDAV
-• Créer des coffres-forts dans le stockage local d'Android (par exemple, fonctionne avec des applications de synchronisation tierces)
+• Compatible avec Dropbox, Google Drive, OneDrive et les services de stockage dans le cloud basés sur WebDAV
+• Créer des coffres-forts sur le stockage local d'Android (fonctionne donc avec des applications de synchronisation tierces)
• Accédez à vos coffres-forts sur tous vos appareils mobiles et ordinateurs
-SÉCURITÉ
+SÉCURISÉ
-Cryptomator pour Android est basé sur le projet open-source de Cryptomator pour Ordinateur de bureau.
+Vous n'avez pas à aveuglément accorder votre confiance à Cryptomator, car c'est un logiciel open-source. Pour vous utilisateur, cela signifie que n'importe qui peut voir le code.
• Chiffrement du contenu et des noms de fichiers via AES et une longueur de clé de 256 bits
-• Le mot de passe du coffre-fort est sécurisé par cryptage pour une meilleure résistance aux attaque par force brut
-• Les coffre-forts sont automatiquement verrouillées après la mise en arrière-plan de l'application
-• La mise en œuvre de Crypto est basée sur la bibliothèque open-source CryptoLib et est documentée publiquement
+• Le mot de passe du coffre-fort est sécurisé par cryptage pour une meilleure résistance aux attaques par force brute
+• Les coffre-forts sont automatiquement verrouillés après la mise en arrière-plan de l'application
+• La mise en œuvre de Crypto est documentée publiquement
-UNE GÉNIALITUDE GÉNÉRAL
+LAURÉAT
-Cryptomator a reçu le prix de l'innovation CeBIT 2016 pour la sécurité pratique et la confidentialité. Nous sommes fiers d'assurer la sécurité et la confidentialité des centaines de milliers d'utilisateurs du Cryptomator.
+Cryptomator a reçu le prix de l'innovation CeBIT 2016 pour la sécurité pratique et la confidentialité. Nous sommes fiers d'assurer la sécurité et la confidentialité des centaines de milliers d'utilisateurs de Cryptomator.
LA COMMUNAUTÉ CRYPTOMATOR
Rejoignez la communauté de Cryptomator et participez aux conversations avec les autres utilisateurs de Cryptomator: https://community.cryptomator.org
-- Suivez-nous sur Twitter @Cryptomator
-- Comme nous sur Facebook/Cryptomator
\ No newline at end of file
+- Suivez-nous sur Twitter @Cryptomator
+- Likez-nous sur Facebook /Cryptomator
diff --git a/fastlane/metadata/android/fr-FR/short_description.txt b/fastlane/metadata/android/fr-FR/short_description.txt
index 0a4252a1b..1410c4b97 100644
--- a/fastlane/metadata/android/fr-FR/short_description.txt
+++ b/fastlane/metadata/android/fr-FR/short_description.txt
@@ -1 +1 @@
-Verrouillé votre cloud: Prenez en mains la sécurité de vos données
\ No newline at end of file
+Verrouillez votre cloud: Prenez en main la sécurité de vos données
diff --git a/fastlane/release-notes.html b/fastlane/release-notes.html
index f9ebcce60..2a6b198a1 100644
--- a/fastlane/release-notes.html
+++ b/fastlane/release-notes.html
@@ -1,4 +1,8 @@
-
Show information when "Storage" permission revoked, required for auto upload
-
Logging out of a cloud now also clears the credentials of an active connection to it
+
Added support for multiple OneDrive accounts
+
Added access to vaults located in "Shared with Me", "My Computer" and "My Drive" of Google Drive using shortcuts
+
Added a lot of translations
+
Improved search functionality, now a "contains" search is used instead of "starts with"
+
Fixed crash on some devices during unlock due to keystore exception
+
Fixed problem during deletion of a cloud
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 0f80bbf51..ffed3a254 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/lib/google-http-client-1.40.1.jar b/lib/google-http-client-1.40.1.jar
deleted file mode 100644
index 175ee6fcf..000000000
Binary files a/lib/google-http-client-1.40.1.jar and /dev/null differ
diff --git a/lib/google-http-client-1.41.4.jar b/lib/google-http-client-1.41.4.jar
new file mode 100644
index 000000000..5f98cfce4
Binary files /dev/null and b/lib/google-http-client-1.41.4.jar differ
diff --git a/lib/google-http-client-android-1.40.1.jar b/lib/google-http-client-android-1.40.1.jar
deleted file mode 100644
index 5ce9a8e1b..000000000
Binary files a/lib/google-http-client-android-1.40.1.jar and /dev/null differ
diff --git a/lib/google-http-client-android-1.41.4.jar b/lib/google-http-client-android-1.41.4.jar
new file mode 100644
index 000000000..48c511b46
Binary files /dev/null and b/lib/google-http-client-android-1.41.4.jar differ
diff --git a/lib/msa-auth-for-android b/lib/msa-auth-for-android
deleted file mode 160000
index 3b48a4973..000000000
--- a/lib/msa-auth-for-android
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 3b48a4973fddaec258edfb702fc242261d81cd1c
diff --git a/lib/pcloud-sdk-java b/lib/pcloud-sdk-java
index b2db89269..dc4d0897f 160000
--- a/lib/pcloud-sdk-java
+++ b/lib/pcloud-sdk-java
@@ -1 +1 @@
-Subproject commit b2db89269e8e4059a7415e0364e427e71682700d
+Subproject commit dc4d0897f7917f026376d35f9a6eaf6edbc7115d
diff --git a/presentation/build.gradle b/presentation/build.gradle
index 90e807f55..c3bef3757 100644
--- a/presentation/build.gradle
+++ b/presentation/build.gradle
@@ -3,6 +3,7 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'de.mannodermaus.android-junit5'
+apply from: 'prebuild.gradle'
android {
signingConfigs {
@@ -38,11 +39,6 @@ android {
coreLibraryDesugaringEnabled true
}
- lintOptions {
- quiet true
- abortOnError false
- ignoreWarnings true
- }
buildTypes {
release {
@@ -51,9 +47,10 @@ android {
shrinkResources false
buildConfigField "String", "DROPBOX_API_KEY", "\"" + getApiKey('DROPBOX_API_KEY') + "\""
- manifestPlaceholders = [DROPBOX_API_KEY: getApiKey('DROPBOX_API_KEY')]
buildConfigField "String", "PCLOUD_CLIENT_ID", "\"" + getApiKey('PCLOUD_CLIENT_ID') + "\""
+ manifestPlaceholders = [DROPBOX_API_KEY: getApiKey('DROPBOX_API_KEY'), ONEDRIVE_API_KEY_DECODED: getOnedriveApiKey()]
+
resValue "string", "app_id", androidApplicationId
}
@@ -66,9 +63,10 @@ android {
testCoverageEnabled false
buildConfigField "String", "DROPBOX_API_KEY", "\"" + getApiKey('DROPBOX_API_KEY_DEBUG') + "\""
- manifestPlaceholders = [DROPBOX_API_KEY: getApiKey('DROPBOX_API_KEY_DEBUG')]
buildConfigField "String", "PCLOUD_CLIENT_ID", "\"" + getApiKey('PCLOUD_CLIENT_ID_DEBUG') + "\""
+ manifestPlaceholders = [DROPBOX_API_KEY: getApiKey('DROPBOX_API_KEY_DEBUG'), ONEDRIVE_API_KEY_DECODED: getOnedriveApiKey()]
+
applicationIdSuffix ".debug"
versionNameSuffix '-DEBUG'
@@ -105,10 +103,16 @@ android {
java.srcDirs = ['src/main/java', 'src/main/java/', 'src/foss/java', 'src/foss/java/']
}
}
-
packagingOptions {
- exclude 'META-INF/jersey-module-version'
- exclude 'META-INF/DEPENDENCIES'
+ resources {
+ excludes += ['META-INF/jersey-module-version', 'META-INF/NOTICE.md', 'META-INF/DEPENDENCIES', 'META-INF/INDEX.LIST']
+ }
+ }
+
+ lint {
+ abortOnError false
+ ignoreWarnings true
+ quiet true
}
}
@@ -145,6 +149,7 @@ dependencies {
// cloud
implementation dependencies.dropbox
implementation dependencies.msgraph
+ implementation dependencies.msgraphAuth
playstoreImplementation(dependencies.googleApiServicesDrive) {
exclude module: 'guava-jdk5'
@@ -248,6 +253,13 @@ static def getApiKey(key) {
return System.getenv().getOrDefault(key, "")
}
+static def getOnedriveApiKey() {
+ String onedrivePath = "" + getApiKey('ONEDRIVE_API_REDIRCT_URI')
+ String idStr = onedrivePath.substring(onedrivePath.lastIndexOf('/') + 1)
+ URI uri = new URI(idStr)
+ return uri.path
+}
+
tasks.withType(Test) {
testLogging {
events "failed"
diff --git a/presentation/prebuild.gradle b/presentation/prebuild.gradle
new file mode 100644
index 000000000..b7a5e16ca
--- /dev/null
+++ b/presentation/prebuild.gradle
@@ -0,0 +1,36 @@
+import groovy.json.JsonOutput
+import groovy.json.JsonSlurper
+
+task generateAppConfigurationFile() {
+ def jsonSlurper = new JsonSlurper()
+
+ def apiKey = "" + getApiKey('ONEDRIVE_API_KEY')
+ def redirectUri = "" + getApiKey('ONEDRIVE_API_REDIRCT_URI')
+
+ def jsonString = """
+ {
+ "client_id" : "${apiKey}",
+ "authorization_user_agent" : "DEFAULT",
+ "redirect_uri" : "${redirectUri}",
+ "broker_redirect_uri_registered": true,
+ "shared_device_mode_supported": true,
+ "authorities" : [
+ {
+ "type": "AAD",
+ "audience": {
+ "type": "AzureADandPersonalMicrosoftAccount",
+ "tenant_id": "common"
+ }
+ }
+ ]
+ }"""
+
+ def config_file = new File('presentation/src/main/res/raw/auth_config_onedrive.json')
+ config_file.write(JsonOutput.prettyPrint(JsonOutput.toJson(jsonSlurper.parseText(jsonString))))
+}
+
+static def getApiKey(key) {
+ return System.getenv().getOrDefault(key, "")
+}
+
+build.dependsOn generateAppConfigurationFile
diff --git a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt
index eac080bf4..a7871af46 100644
--- a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt
+++ b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt
@@ -6,9 +6,16 @@ import android.content.Intent.ACTION_OPEN_DOCUMENT_TREE
import android.provider.DocumentsContract
import android.widget.Toast
import com.dropbox.core.android.Auth
-import org.cryptomator.data.cloud.onedrive.OnedriveClientFactory
-import org.cryptomator.data.cloud.onedrive.graph.ClientException
-import org.cryptomator.data.cloud.onedrive.graph.ICallback
+import com.microsoft.identity.client.AuthenticationCallback
+import com.microsoft.identity.client.IAccount
+import com.microsoft.identity.client.IAuthenticationResult
+import com.microsoft.identity.client.IMultipleAccountPublicClientApplication
+import com.microsoft.identity.client.IPublicClientApplication
+import com.microsoft.identity.client.PublicClientApplication
+import com.microsoft.identity.client.exception.MsalClientException
+import com.microsoft.identity.client.exception.MsalException
+import com.microsoft.identity.client.exception.MsalServiceException
+import com.microsoft.identity.client.exception.MsalUiRequiredException
import org.cryptomator.data.util.X509CertificateHelper
import org.cryptomator.domain.Cloud
import org.cryptomator.domain.CloudType
@@ -225,29 +232,108 @@ class AuthenticateCloudPresenter @Inject constructor( //
private fun startAuthentication(cloud: CloudModel) {
authenticationStarted = true
- val authenticationAdapter = OnedriveClientFactory.getAuthAdapter(context(), (cloud.toCloud() as OnedriveCloud).accessToken())
- authenticationAdapter.login(activity(), object : ICallback {
- override fun success(accessToken: String?) {
- if (accessToken == null) {
- Timber.tag("AuthicateCloudPrester").e("Onedrive access token is empty")
+
+ Toast.makeText(context(), R.string.notification_authenticating, Toast.LENGTH_SHORT).show()
+
+ PublicClientApplication.createMultipleAccountPublicClientApplication(
+ context(),
+ R.raw.auth_config_onedrive,
+ object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener {
+ override fun onCreated(application: IMultipleAccountPublicClientApplication) {
+ application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback {
+ override fun onTaskCompleted(accounts: List) {
+ if (accounts.isEmpty()) {
+ application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud))
+ } else {
+ accounts.find { account -> account.username == cloud.username() }?.let {
+ application.acquireTokenSilentAsync(
+ onedriveScopes(),
+ it,
+ "https://login.microsoftonline.com/common",
+ getAuthSilentCallback(cloud, application)
+ )
+ } ?: application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud))
+ }
+ }
+
+ override fun onError(e: MsalException) {
+ Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts")
+ failAuthentication(cloud.name())
+ }
+ })
+ }
+
+ override fun onError(e: MsalException) {
+ Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration")
failAuthentication(cloud.name())
- } else {
- showProgress(ProgressModel(ProgressStateModel.AUTHENTICATION))
- handleAuthenticationResult(cloud, accessToken)
}
+ })
+ }
+
+ private fun getAuthSilentCallback(cloud: CloudModel, application: IMultipleAccountPublicClientApplication): AuthenticationCallback {
+ return object : AuthenticationCallback {
+
+ override fun onSuccess(authenticationResult: IAuthenticationResult) {
+ Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated")
+ handleAuthenticationResult(cloud, authenticationResult.accessToken)
}
- override fun failure(ex: ClientException) {
- Timber.tag("AuthicateCloudPrester").e(ex)
+ override fun onError(e: MsalException) {
+ Timber.tag("AuthenticateCloudPresenter").e(e, "Failed to acquireToken")
+ when (e) {
+ is MsalClientException -> {
+ /* Exception inside MSAL, more info inside MsalError.java */
+ failAuthentication(cloud.name())
+ }
+ is MsalServiceException -> {
+ /* Exception when communicating with the STS, likely config issue */
+ failAuthentication(cloud.name())
+ }
+ is MsalUiRequiredException -> {
+ /* Tokens expired or no session, retry with interactive */
+ application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud))
+ }
+ }
+ }
+
+ override fun onCancel() {
+ Timber.tag("AuthenticateCloudPresenter").i("User cancelled login")
+ }
+ }
+ }
+
+ private fun getAuthInteractiveCallback(cloud: CloudModel): AuthenticationCallback {
+ return object : AuthenticationCallback {
+
+ override fun onSuccess(authenticationResult: IAuthenticationResult) {
+ Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated")
+ handleAuthenticationResult(cloud, authenticationResult.accessToken, authenticationResult.account.username)
+ }
+
+ override fun onError(e: MsalException) {
+ Timber.tag("AuthenticateCloudPresenter").e(e, "Successfully authenticated")
failAuthentication(cloud.name())
}
- })
+
+ override fun onCancel() {
+ Timber.tag("AuthenticateCloudPresenter").i("User cancelled login")
+ }
+ }
}
private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String) {
getUsernameAndSuceedAuthentication( //
OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) //
- .withAccessToken(accessToken) //
+ .withAccessToken(encrypt(accessToken)) //
+ .build()
+ )
+ }
+
+ private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String, username: String) {
+ getUsernameAndSuceedAuthentication( //
+ OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) //
+ .withAccessToken(encrypt(accessToken)) //
+ .withUsername(username)
.build()
)
}
@@ -512,6 +598,10 @@ class AuthenticateCloudPresenter @Inject constructor( //
companion object {
const val WEBDAV_ACCEPTED_UNTRUSTED_CERTIFICATE = "acceptedUntrustedCertificate"
+
+ fun onedriveScopes(): Array {
+ return arrayOf("User.Read", "Files.ReadWrite")
+ }
}
init {
diff --git a/presentation/src/main/AndroidManifest.xml b/presentation/src/main/AndroidManifest.xml
index 5852673c5..9c449d8b0 100644
--- a/presentation/src/main/AndroidManifest.xml
+++ b/presentation/src/main/AndroidManifest.xml
@@ -159,6 +159,17 @@
+
+
+
+
+
+
+
+
private lateinit var downloadFiles: MutableList
+ private var resumedAfterAuthentication = false
+
@InjectIntent
lateinit var intent: BrowseFilesIntent
@@ -203,6 +210,7 @@ class BrowseFilesPresenter @Inject constructor( //
view?.showLoading(false)
when {
authenticationExceptionHandler.handleAuthenticationException(this@BrowseFilesPresenter, e, ActivityResultCallbacks.getCloudListAfterAuthentication(cloudFolderModel)) -> {
+ resumedAfterAuthentication = true
return
}
e is EmptyDirFileException -> {
@@ -222,14 +230,45 @@ class BrowseFilesPresenter @Inject constructor( //
})
}
- @Callback
+ @Callback(dispatchResultOkOnly = false)
fun getCloudListAfterAuthentication(result: ActivityResult, cloudFolderModel: CloudFolderModel) {
- val cloudModel = result.getSingleResult(CloudModel::class.java)
- cloudFolderModel.toCloudNode().withCloud(cloudModel.toCloud())?.let {
- getCloudList(cloudFolderModelMapper.toModel(it))
+ if(result.isResultOk) {
+ val cloudModel = result.getSingleResult(CloudModel::class.java) // FIXME update other vaults using this cloud as well
+ val cloudNode = cloudFolderModel.toCloudNode()
+ if (cloudNode is CryptoFolder) {
+ updatedDecryptedCloudFor(Vault.aCopyOf(cloudFolderModel.vault()!!.toVault()).withCloud(cloudModel.toCloud()).build(), cloudFolderModel)
+ } else {
+ updatePlaintextCloud(cloudFolderModel, cloudModel)
+ }
+ } else {
+ Timber.tag("BrowseFilesPresenter").e("Authentication failed")
+ }
+ }
+
+ private fun updatePlaintextCloud(cloudFolderModel: CloudFolderModel, updatedCloud: CloudModel) {
+ cloudFolderModel.toCloudNode().withCloud(updatedCloud.toCloud())?.let {
+ val folder = cloudFolderModelMapper.toModel(it)
+ view?.updateActiveFolderDueToAuthenticationProblem(folder)
+ getCloudList(folder)
+ resumedAfterAuthentication = false
} ?: throw FatalBackendException("cloudFolderModel with updated Cloud shouldn't be null")
}
+ private fun updatedDecryptedCloudFor(vault: Vault, cloudFolderModel: CloudFolderModel) {
+ getDecryptedCloudForVaultUseCase //
+ .withVault(vault) //
+ .run(object : DefaultResultHandler() {
+ override fun onSuccess(cloud: Cloud) {
+ val folder = cloudFolderModelMapper.toModel(cloudFolderModel.toCloudNode().withCloud(cloud)!!)
+ view?.updateActiveFolderDueToAuthenticationProblem(folder)
+ getCloudList(folder)
+ }
+ override fun onFinished() {
+ resumedAfterAuthentication = false
+ }
+ })
+ }
+
fun onCreateFolderPressed(cloudFolder: CloudFolderModel, folderName: String?) {
createFolderUseCase //
.withParent(cloudFolder.toCloudNode()) //
@@ -245,16 +284,16 @@ class BrowseFilesPresenter @Inject constructor( //
private fun copyFile(downloadFiles: List) {
downloadFiles.forEach { downloadFile ->
try {
- val source = FileInputStream(fileUtil.fileFor(cloudFileModelMapper.toModel(downloadFile.downloadFile)))
-
- copyDataUseCase //
- .withSource(source) //
- .andTarget(downloadFile.dataSink) //
- .run(object : DefaultResultHandler() {
- override fun onFinished() {
- view?.showMessage(R.string.screen_file_browser_msg_file_exported)
- }
- })
+ FileInputStream(fileUtil.fileFor(cloudFileModelMapper.toModel(downloadFile.downloadFile))).use {
+ copyDataUseCase //
+ .withSource(it) //
+ .andTarget(downloadFile.dataSink) //
+ .run(object : DefaultResultHandler() {
+ override fun onFinished() {
+ view?.showMessage(R.string.screen_file_browser_msg_file_exported)
+ }
+ })
+ }
} catch (e: FileNotFoundException) {
showError(e)
}
@@ -1115,7 +1154,9 @@ class BrowseFilesPresenter @Inject constructor( //
}
fun onFolderReloadContent(folder: CloudFolderModel) {
- getCloudList(folder)
+ if(!resumedAfterAuthentication) {
+ getCloudList(folder)
+ }
}
fun onExportFolderClicked(cloudFolder: CloudFolderModel, exportTriggeredByUser: ExportOperation) {
@@ -1249,6 +1290,7 @@ class BrowseFilesPresenter @Inject constructor( //
companion object {
const val OPEN_FILE_FINISHED = 12
+
val EXPORT_AFTER_APP_CHOOSER: ExportOperation = object : ExportOperation {
override fun export(presenter: BrowseFilesPresenter, downloadFiles: List) {
presenter.copyFile(downloadFiles)
@@ -1272,7 +1314,8 @@ class BrowseFilesPresenter @Inject constructor( //
renameFolderUseCase, //
copyDataUseCase, //
moveFilesUseCase, //
- moveFoldersUseCase
+ moveFoldersUseCase, //
+ getDecryptedCloudForVaultUseCase
)
this.authenticationExceptionHandler = authenticationExceptionHandler
}
diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt
index 0a5bbc51c..bc7c5df81 100644
--- a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt
+++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt
@@ -4,8 +4,16 @@ import android.content.ActivityNotFoundException
import android.content.Intent
import android.net.Uri
import android.widget.Toast
+import com.microsoft.identity.client.AuthenticationCallback
+import com.microsoft.identity.client.IAccount
+import com.microsoft.identity.client.IAuthenticationResult
+import com.microsoft.identity.client.IMultipleAccountPublicClientApplication
+import com.microsoft.identity.client.IPublicClientApplication
+import com.microsoft.identity.client.PublicClientApplication
+import com.microsoft.identity.client.exception.MsalException
import org.cryptomator.domain.Cloud
import org.cryptomator.domain.LocalStorageCloud
+import org.cryptomator.domain.OnedriveCloud
import org.cryptomator.domain.PCloud
import org.cryptomator.domain.Vault
import org.cryptomator.domain.di.PerView
@@ -13,7 +21,7 @@ import org.cryptomator.domain.usecases.cloud.AddOrChangeCloudConnectionUseCase
import org.cryptomator.domain.usecases.cloud.GetCloudsUseCase
import org.cryptomator.domain.usecases.cloud.GetUsernameUseCase
import org.cryptomator.domain.usecases.cloud.RemoveCloudUseCase
-import org.cryptomator.domain.usecases.vault.DeleteVaultUseCase
+import org.cryptomator.domain.usecases.vault.DeleteVaultsUseCase
import org.cryptomator.domain.usecases.vault.GetVaultListUseCase
import org.cryptomator.generator.Callback
import org.cryptomator.presentation.R
@@ -40,7 +48,7 @@ class CloudConnectionListPresenter @Inject constructor( //
private val removeCloudUseCase: RemoveCloudUseCase, //
private val addOrChangeCloudConnectionUseCase: AddOrChangeCloudConnectionUseCase, //
private val getVaultListUseCase: GetVaultListUseCase, //
- private val deleteVaultUseCase: DeleteVaultUseCase, //
+ private val deleteVaultsUseCase: DeleteVaultsUseCase, //
private val cloudModelMapper: CloudModelMapper, //
exceptionMappings: ExceptionHandlers
) : Presenter(exceptionMappings) {
@@ -85,18 +93,25 @@ class CloudConnectionListPresenter @Inject constructor( //
}
private fun vaultsFor(cloudModel: CloudModel, allVaults: List): ArrayList {
- return allVaults.filterTo(ArrayList()) { it.cloud.type() == cloudModel.toCloud().type() }
+ return allVaults.filterTo(ArrayList()) { it.cloud.id() == cloudModel.toCloud().id() }
}
fun onDeleteCloudConnectionAndVaults(cloudModel: CloudModel, vaultsOfCloud: ArrayList) {
- vaultsOfCloud.forEach { vault ->
- deleteVault(vault)
- }
- deleteCloud(cloudModel)
- }
+ if (vaultsOfCloud.isEmpty()) {
+ deleteCloud(cloudModel)
+ } else {
+ deleteVaultsUseCase
+ .withVaults(vaultsOfCloud)
+ .run(object : DefaultResultHandler>() {
+ override fun onFinished() {
+ deleteCloud(cloudModel)
+ }
- private fun deleteVault(vault: Vault) {
- deleteVaultUseCase.withVault(vault).run(DefaultResultHandler())
+ override fun onError(e: Throwable) {
+ Timber.tag("CloudConnectionListPresenter").e(e, "Failed to remove all vaults")
+ }
+ })
+ }
}
private fun deleteCloud(cloudModel: CloudModel) {
@@ -124,38 +139,90 @@ class CloudConnectionListPresenter @Inject constructor( //
fun onAddConnectionClicked() {
when (selectedCloudType.get()) {
- CloudTypeModel.WEBDAV -> requestActivityResult(
- ActivityResultCallbacks.addChangeMultiCloud(), //
- Intents.webDavAddOrChangeIntent()
- )
- CloudTypeModel.PCLOUD -> {
- requestActivityResult(
- ActivityResultCallbacks.pCloudAuthenticationFinished(), //
- Intents.authenticatePCloudIntent()
- )
- }
- CloudTypeModel.S3 -> requestActivityResult(
- ActivityResultCallbacks.addChangeMultiCloud(), //
- Intents.s3AddOrChangeIntent()
- )
+ CloudTypeModel.ONEDRIVE -> addOnedriveCloud()
+ CloudTypeModel.WEBDAV -> requestActivityResult(ActivityResultCallbacks.addChangeMultiCloud(), Intents.webDavAddOrChangeIntent())
+ CloudTypeModel.PCLOUD -> requestActivityResult(ActivityResultCallbacks.pCloudAuthenticationFinished(), Intents.authenticatePCloudIntent())
+ CloudTypeModel.S3 -> requestActivityResult(ActivityResultCallbacks.addChangeMultiCloud(), Intents.s3AddOrChangeIntent())
CloudTypeModel.LOCAL -> openDocumentTree()
}
}
+ private fun addOnedriveCloud() {
+ PublicClientApplication.createMultipleAccountPublicClientApplication(
+ context(),
+ R.raw.auth_config_onedrive,
+ object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener {
+ override fun onCreated(application: IMultipleAccountPublicClientApplication) {
+ application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback {
+ override fun onTaskCompleted(accounts: List) {
+ application.acquireToken(activity(), AuthenticateCloudPresenter.onedriveScopes(), getAuthInteractiveCallback())
+ }
+
+ override fun onError(e: MsalException) {
+ Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts")
+ showError(e);
+ }
+ })
+ }
+
+ override fun onError(e: MsalException) {
+ Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration")
+ showError(e);
+ }
+ })
+ }
+
+ private fun getAuthInteractiveCallback(): AuthenticationCallback {
+ return object : AuthenticationCallback {
+
+ override fun onSuccess(authenticationResult: IAuthenticationResult) {
+ Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated")
+ val accessToken = CredentialCryptor.getInstance(context()).encrypt(authenticationResult.accessToken)
+ val onedriveSkeleton = OnedriveCloud.aOnedriveCloud().withAccessToken(accessToken).withUsername(authenticationResult.account.username).build()
+ saveOnedriveCloud(onedriveSkeleton)
+ }
+
+ override fun onError(e: MsalException) {
+ Timber.tag("AuthenticateCloudPresenter").e(e, "Successfully authenticated")
+ showError(e);
+ }
+
+ override fun onCancel() {
+ Timber.tag("AuthenticateCloudPresenter").i("User cancelled login")
+ }
+ }
+ }
+
+ private fun saveOnedriveCloud(onedriveSkeleton: OnedriveCloud) {
+ getUsernameUseCase //
+ .withCloud(onedriveSkeleton) //
+ .run(object : DefaultResultHandler() {
+ override fun onSuccess(username: String) {
+ prepareForSavingOnedriveCloud(OnedriveCloud.aCopyOf(onedriveSkeleton).withUsername(username).build())
+ }
+ })
+ }
+
+ fun prepareForSavingOnedriveCloud(cloud: OnedriveCloud) {
+ getCloudsUseCase //
+ .withCloudType(CloudTypeModel.valueOf(selectedCloudType.get())) //
+ .run(object : DefaultResultHandler>() {
+ override fun onSuccess(clouds: List) {
+ clouds.firstOrNull {
+ (it as OnedriveCloud).username() == cloud.username()
+ }?.let {
+ saveCloud(OnedriveCloud.aCopyOf(it as OnedriveCloud).withAccessToken(cloud.accessToken()).build())
+ Timber.tag("CloudConnListPresenter").i("OneDrive access token updated")
+ } ?: saveCloud(cloud)
+ }
+ })
+ }
+
private fun openDocumentTree() {
try {
- requestActivityResult( //
- ActivityResultCallbacks.pickedLocalStorageLocation(), //
- Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
- )
+ requestActivityResult(ActivityResultCallbacks.pickedLocalStorageLocation(), Intent(Intent.ACTION_OPEN_DOCUMENT_TREE))
} catch (exception: ActivityNotFoundException) {
- Toast //
- .makeText( //
- activity().applicationContext, //
- context().getText(R.string.screen_cloud_local_error_no_content_provider), //
- Toast.LENGTH_SHORT
- ) //
- .show()
+ Toast.makeText(activity().applicationContext, context().getText(R.string.screen_cloud_local_error_no_content_provider), Toast.LENGTH_SHORT).show()
Timber.tag("CloudConnListPresenter").e(exception, "No ContentProvider on system")
}
}
@@ -198,14 +265,8 @@ class CloudConnectionListPresenter @Inject constructor( //
if (!code.isNullOrEmpty() && !hostname.isNullOrEmpty()) {
Timber.tag("CloudConnectionListPresenter").i("PCloud OAuth code successfully retrieved")
-
- val accessToken = CredentialCryptor //
- .getInstance(this.context()) //
- .encrypt(code)
- val pCloudSkeleton = PCloud.aPCloud() //
- .withAccessToken(accessToken)
- .withUrl(hostname)
- .build();
+ val accessToken = CredentialCryptor.getInstance(this.context()).encrypt(code)
+ val pCloudSkeleton = PCloud.aPCloud().withAccessToken(accessToken).withUrl(hostname).build();
getUsernameUseCase //
.withCloud(pCloudSkeleton) //
.run(object : DefaultResultHandler() {
@@ -226,19 +287,14 @@ class CloudConnectionListPresenter @Inject constructor( //
clouds.firstOrNull {
(it as PCloud).username() == cloud.username()
}?.let {
- saveCloud(
- PCloud.aCopyOf(it as PCloud) //
- .withUrl(cloud.url())
- .withAccessToken(cloud.accessToken())
- .build()
- )
+ saveCloud(PCloud.aCopyOf(it as PCloud).withUrl(cloud.url()).withAccessToken(cloud.accessToken()).build())
view?.showDialog(PCloudCredentialsUpdatedDialog.newInstance(it.username()))
} ?: saveCloud(cloud)
}
})
}
- fun saveCloud(cloud: PCloud) {
+ fun saveCloud(cloud: Cloud) {
addOrChangeCloudConnectionUseCase //
.withCloud(cloud) //
.run(object : DefaultResultHandler() {
@@ -252,15 +308,13 @@ class CloudConnectionListPresenter @Inject constructor( //
fun pickedLocalStorageLocation(result: ActivityResult) {
val rootTreeUriOfLocalStorage = result.intent().data
persistUriPermission(rootTreeUriOfLocalStorage)
- addOrChangeCloudConnectionUseCase.withCloud(
- LocalStorageCloud.aLocalStorage() //
- .withRootUri(rootTreeUriOfLocalStorage.toString()) //
- .build()
- ).run(object : DefaultResultHandler() {
- override fun onSuccess(void: Void?) {
- loadCloudList()
- }
- })
+ addOrChangeCloudConnectionUseCase
+ .withCloud(LocalStorageCloud.aLocalStorage().withRootUri(rootTreeUriOfLocalStorage.toString()).build())
+ .run(object : DefaultResultHandler() {
+ override fun onSuccess(void: Void?) {
+ loadCloudList()
+ }
+ })
}
private fun persistUriPermission(rootTreeUriOfLocalStorage: Uri?) {
@@ -298,6 +352,6 @@ class CloudConnectionListPresenter @Inject constructor( //
}
init {
- unsubscribeOnDestroy(getCloudsUseCase, removeCloudUseCase, addOrChangeCloudConnectionUseCase, getVaultListUseCase, deleteVaultUseCase)
+ unsubscribeOnDestroy(getCloudsUseCase, removeCloudUseCase, addOrChangeCloudConnectionUseCase, getVaultListUseCase, deleteVaultsUseCase)
}
}
diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudSettingsPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudSettingsPresenter.kt
index 9117574b0..79ca7a355 100644
--- a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudSettingsPresenter.kt
+++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudSettingsPresenter.kt
@@ -2,6 +2,7 @@ package org.cryptomator.presentation.presenter
import org.cryptomator.domain.Cloud
import org.cryptomator.domain.LocalStorageCloud
+import org.cryptomator.domain.OnedriveCloud
import org.cryptomator.domain.PCloud
import org.cryptomator.domain.S3Cloud
import org.cryptomator.domain.WebDavCloud
@@ -18,6 +19,7 @@ import org.cryptomator.presentation.intent.Intents
import org.cryptomator.presentation.model.CloudModel
import org.cryptomator.presentation.model.CloudTypeModel
import org.cryptomator.presentation.model.LocalStorageModel
+import org.cryptomator.presentation.model.OnedriveCloudModel
import org.cryptomator.presentation.model.PCloudModel
import org.cryptomator.presentation.model.S3CloudModel
import org.cryptomator.presentation.model.WebDavCloudModel
@@ -39,6 +41,7 @@ class CloudSettingsPresenter @Inject constructor( //
private val nonSingleLoginClouds: Set = EnumSet.of( //
CloudTypeModel.CRYPTO, //
CloudTypeModel.LOCAL, //
+ CloudTypeModel.ONEDRIVE, //
CloudTypeModel.PCLOUD, //
CloudTypeModel.S3, //
CloudTypeModel.WEBDAV
@@ -95,6 +98,7 @@ class CloudSettingsPresenter @Inject constructor( //
private fun effectiveTitle(cloudTypeModel: CloudTypeModel): String {
when (cloudTypeModel) {
+ CloudTypeModel.ONEDRIVE -> return context().getString(R.string.screen_cloud_settings_onedrive_connections)
CloudTypeModel.PCLOUD -> return context().getString(R.string.screen_cloud_settings_pcloud_connections)
CloudTypeModel.WEBDAV -> return context().getString(R.string.screen_cloud_settings_webdav_connections)
CloudTypeModel.S3 -> return context().getString(R.string.screen_cloud_settings_s3_connections)
@@ -130,6 +134,7 @@ class CloudSettingsPresenter @Inject constructor( //
.filter { cloud -> !(BuildConfig.FLAVOR == "fdroid" && cloud.cloudType() == CloudTypeModel.GOOGLE_DRIVE) } //
.toMutableList() //
.also {
+ it.add(aOnedriveCloud())
it.add(aPCloud())
it.add(aWebdavCloud())
it.add(aS3Cloud())
@@ -138,6 +143,10 @@ class CloudSettingsPresenter @Inject constructor( //
view?.render(cloudModel)
}
+ private fun aOnedriveCloud(): OnedriveCloudModel {
+ return OnedriveCloudModel(OnedriveCloud.aOnedriveCloud().build())
+ }
+
private fun aPCloud(): PCloudModel {
return PCloudModel(PCloud.aPCloud().build())
}
diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt
index 4b19ef9de..521083a28 100644
--- a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt
+++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt
@@ -32,6 +32,7 @@ import org.cryptomator.domain.usecases.vault.LockVaultUseCase
import org.cryptomator.domain.usecases.vault.MoveVaultPositionUseCase
import org.cryptomator.domain.usecases.vault.RenameVaultUseCase
import org.cryptomator.domain.usecases.vault.SaveVaultUseCase
+import org.cryptomator.domain.usecases.vault.UpdateVaultParameterIfChangedRemotelyUseCase
import org.cryptomator.generator.Callback
import org.cryptomator.presentation.BuildConfig
import org.cryptomator.presentation.CryptomatorApp
@@ -78,6 +79,7 @@ class VaultListPresenter @Inject constructor( //
private val licenseCheckUseCase: DoLicenseCheckUseCase, //
private val updateCheckUseCase: DoUpdateCheckUseCase, //
private val updateUseCase: DoUpdateUseCase, //
+ private val updateVaultParameterIfChangedRemotelyUseCase: UpdateVaultParameterIfChangedRemotelyUseCase, //
private val networkConnectionCheck: NetworkConnectionCheck, //
private val fileUtil: FileUtil, //
private val authenticationExceptionHandler: AuthenticationExceptionHandler, //
@@ -115,7 +117,7 @@ class VaultListPresenter @Inject constructor( //
checkLicense()
- if(sharedPreferencesHandler.usePhotoUpload()) {
+ if (sharedPreferencesHandler.usePhotoUpload()) {
checkLocalStoragePermissionRegardingAutoUpload()
}
}
@@ -399,16 +401,25 @@ class VaultListPresenter @Inject constructor( //
@Callback
fun vaultUnlockedVaultList(result: ActivityResult) {
val cloud = result.intent().getSerializableExtra(SINGLE_RESULT) as Cloud
- navigateToVaultContent(cloud)
+ getRootFolderOf(cloud)
}
- private fun navigateToVaultContent(cloud: Cloud) {
+ private fun getRootFolderOf(cloud: Cloud) {
getRootFolderUseCase //
.withCloud(cloud) //
.run(object : DefaultResultHandler() {
override fun onSuccess(folder: CloudFolder) {
- val cryptoCloud = (folder.cloud as CryptoCloud)
- val vault = cryptoCloud.vault
+ navigateToVaultContent(folder)
+ }
+ })
+ }
+
+ private fun navigateToVaultContent(folder: CloudFolder) {
+ val cryptoCloud = (folder.cloud as CryptoCloud)
+ updateVaultParameterIfChangedRemotelyUseCase //
+ .withVault(cryptoCloud.vault) //
+ .run(object : DefaultResultHandler() {
+ override fun onSuccess(vault: Vault) {
view?.addOrUpdateVault(VaultModel(vault))
navigateToVaultContent(vault, folder)
view?.showProgress(ProgressModel.COMPLETED)
@@ -530,7 +541,8 @@ class VaultListPresenter @Inject constructor( //
moveVaultPositionUseCase, //
licenseCheckUseCase, //
updateCheckUseCase, //
- updateUseCase
+ updateUseCase, //
+ updateVaultParameterIfChangedRemotelyUseCase
)
}
}
diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BrowseFilesActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BrowseFilesActivity.kt
index 29c8e9496..6ebb9189d 100644
--- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BrowseFilesActivity.kt
+++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BrowseFilesActivity.kt
@@ -50,7 +50,6 @@ import org.cryptomator.presentation.ui.dialog.ReplaceDialog
import org.cryptomator.presentation.ui.dialog.SymLinkDialog
import org.cryptomator.presentation.ui.dialog.UploadCloudFileDialog
import org.cryptomator.presentation.ui.fragment.BrowseFilesFragment
-import java.util.ArrayList
import java.util.regex.Pattern
import javax.inject.Inject
import kotlinx.android.synthetic.main.toolbar_layout.toolbar
@@ -125,11 +124,7 @@ class BrowseFilesActivity : BaseActivity(), //
override fun onReceive(context: Context, intent: Intent) {
finish()
}
- }
-
- finishActivityDueToScreenLockEventReceiver?.let {
- LocalBroadcastManager.getInstance(this).registerReceiver(it, IntentFilter(CryptorsService.SCREEN_AND_VAULT_LOCKED))
- }
+ }.also { LocalBroadcastManager.getInstance(this).registerReceiver(it, IntentFilter(CryptorsService.SCREEN_AND_VAULT_LOCKED)) }
}
override fun onBackPressed() {
@@ -615,6 +610,10 @@ class BrowseFilesActivity : BaseActivity(), //
showDialog(NoDirFileDialog.newInstance(cryptoFolderName, cloudFolderPath))
}
+ override fun updateActiveFolderDueToAuthenticationProblem(folder: CloudFolderModel) {
+ browseFilesFragment().folder = folder
+ }
+
override fun navigateFolderBackBecauseSymlink() {
onBackPressed()
}
diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/BrowseFilesView.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/BrowseFilesView.kt
index 3adac8502..11beedce3 100644
--- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/BrowseFilesView.kt
+++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/BrowseFilesView.kt
@@ -35,5 +35,6 @@ interface BrowseFilesView : View {
fun disableSelectionMode()
fun showSymLinkDialog()
fun showNoDirFileDialog(cryptoFolderName: String, cloudFolderPath: String)
+ fun updateActiveFolderDueToAuthenticationProblem(folder: CloudFolderModel)
}
diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/BrowseFilesAdapter.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/BrowseFilesAdapter.kt
index 4079d8889..30edadbdc 100644
--- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/BrowseFilesAdapter.kt
+++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/BrowseFilesAdapter.kt
@@ -117,7 +117,7 @@ constructor(
if (sharedPreferencesHandler.useGlobSearch()) {
nodes?.filter { cloudNode -> PatternMatcher(filterText, PatternMatcher.PATTERN_SIMPLE_GLOB).match(cloudNode.name) }
} else {
- nodes?.filter { cloudNode -> cloudNode.name.lowercase().startsWith(filterText.lowercase()) }
+ nodes?.filter { cloudNode -> cloudNode.name.contains(filterText, true) }
}
} else {
nodes
diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudConnectionListAdapter.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudConnectionListAdapter.kt
index f2cedc793..ea6c6f706 100644
--- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudConnectionListAdapter.kt
+++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudConnectionListAdapter.kt
@@ -7,6 +7,7 @@ import org.cryptomator.domain.exception.FatalBackendException
import org.cryptomator.presentation.R
import org.cryptomator.presentation.model.CloudModel
import org.cryptomator.presentation.model.LocalStorageModel
+import org.cryptomator.presentation.model.OnedriveCloudModel
import org.cryptomator.presentation.model.PCloudModel
import org.cryptomator.presentation.model.S3CloudModel
import org.cryptomator.presentation.model.WebDavCloudModel
@@ -55,6 +56,9 @@ internal constructor(context: Context) : RecyclerViewBaseAdapter {
+ bindOnedriveCloudModel(cloudModel)
+ }
is WebDavCloudModel -> {
bindWebDavCloudModel(cloudModel)
}
@@ -70,6 +74,12 @@ internal constructor(context: Context) : RecyclerViewBaseAdapter itemView.cloudName.text = context.getString(R.string.screen_cloud_settings_onedrive_connections)
CloudTypeModel.PCLOUD -> itemView.cloudName.text = context.getString(R.string.screen_cloud_settings_pcloud_connections)
CloudTypeModel.S3 -> itemView.cloudName.text = context.getString(R.string.screen_cloud_settings_s3_connections)
CloudTypeModel.WEBDAV -> itemView.cloudName.text = context.getString(R.string.screen_cloud_settings_webdav_connections)
diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/bottomsheet/CloudConnectionSettingsBottomSheet.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/bottomsheet/CloudConnectionSettingsBottomSheet.kt
index 6d967b513..ffdc61674 100644
--- a/presentation/src/main/java/org/cryptomator/presentation/ui/bottomsheet/CloudConnectionSettingsBottomSheet.kt
+++ b/presentation/src/main/java/org/cryptomator/presentation/ui/bottomsheet/CloudConnectionSettingsBottomSheet.kt
@@ -7,6 +7,7 @@ import org.cryptomator.presentation.R
import org.cryptomator.presentation.model.CloudModel
import org.cryptomator.presentation.model.CloudTypeModel
import org.cryptomator.presentation.model.LocalStorageModel
+import org.cryptomator.presentation.model.OnedriveCloudModel
import org.cryptomator.presentation.model.PCloudModel
import org.cryptomator.presentation.model.S3CloudModel
import org.cryptomator.presentation.model.WebDavCloudModel
@@ -29,6 +30,7 @@ class CloudConnectionSettingsBottomSheet : BaseBottomSheet bindViewForOnedrive(cloudModel as OnedriveCloudModel)
CloudTypeModel.WEBDAV -> bindViewForWebDAV(cloudModel as WebDavCloudModel)
CloudTypeModel.PCLOUD -> bindViewForPCloud(cloudModel as PCloudModel)
CloudTypeModel.S3 -> bindViewForS3(cloudModel as S3CloudModel)
@@ -57,6 +59,11 @@ class CloudConnectionSettingsBottomSheet : BaseBottomSheetتشفيرحدث خطأ ما
- المصادقة فشلت
+ فشلت المصادقةفشلت عملية المصادقة، الرجاء تسجيل الدخول باستخدام %1$sلا يوجد اتصال بالشبكة
- كلمة المرور غير صحيحة
+ كلمة المرور خاطئةالمجلد أو الملف موجود مسبقاُ.
- نوع المخزن غير مدعوم. تم إنشاء هذا المخزن باستخدام نسخة أخري من Cryptomator.
+ نوع المخزن غير مدعوم. تم إنشاء هذا المخزن باستخدام إصدار آخر من Cryptomator.المخزن موجود مسبقاً.ملف غير موجود.تم قفل المخزن.موفر الخدمة السحابية موجود مسبقاً.الرجاء تحميل تطبيق يمكنه فتح هذا الملف.
- لم يتم العثور على الخادم.
- فشل التصدير. حاول إزالة الأحرف الخاصة من أسماء الملفات وتصديرها مرة أخرى.
- لا يمكن أن يحتوي علي رموز خاصة.
- اسم الملف لا يمكن أن يحتوي علي رموز خاصة.
- اسم المخزن لا يمكن أن يحتوي علي رموز خاصة.
+ لم يتم العثور على المخدم.
+ الرجاء فتح إعدادات جهازك وتعيين قفل الشاشة يدوياً
+ فشل التصدير. حاول إزالة المحارف الخاصة من أسماء الملفات وتصديرها مرة أخرى.
+ لا يمكن أن يحتوي على محارف خاصة.
+ اسم الملف لا يمكن أن يحتوي على محارف خاصة.
+ اسم المخزن لا يمكن أن يحتوي على محارف خاصة.فشل التحقق من التحديث. حدث خطأ عام.فشل التحقق من التحديث. التجزئة المحسوبة لا تتطابق مع الملف المرفوعفشل التحقق من التحديث. لا يوجد اتصال بالإنترنت.
+ فشل فك تشفير كلمة المرور WebDAV، الرجاء إضافتها في الإعدادات
+ خدمات متجر Google غير مثبتة!تم إلغاء استخدام البصمة في عملية التوثيق
+ الإصدار المحدد في %1$s يختلف عن %2$s
+ %1$s لا يتطابق مع هذا %2$sخطأ عام أثناء تحميل إعدادات المخزنبعد إعادة التبديل الي Cryptomator لم يعد الملف المحلي موجود. لايمكن نشر التعديلات الي موفر الخدمة السحابية.
+ لا يوجد مخزن بهذه المعلومات في S3موقع المفتاح الرئيسي غير مدعوم بعد
@@ -35,6 +41,7 @@
Cryptomator يحتاج صلاحية الوصول الي التخزين لكي يستطيع تصدير الملفاتCryptomator يحتاج صلاحية الوصول الي التخزين لكي يستطيع رفع الملفاتCryptomator يحتاج صلاحية الوصول الي التخزين لكي تستطيع مشاركة الملفات
+ لقد فقد Cryptomator الإذن للوصول إلى هذا الموقع. الرجاء تحديد هذا المجلد مرة أخرى لاستعادة الإذن.الإعداداتبحثالسابق
@@ -119,11 +126,13 @@
الاسم المعروضمفتاح الوصولالمفتاح السري
+ مخزن موجود مسبقاًنقطة الوصولالمنطقةإسم العرض لا يمكن أن يكون فارغاًمفتاح الوصول لا يمكن أن يكون فارغاًالمفتاح السري لا يمكن أن يكون فارغاً
+ المخزن لايمكن ان يكون فارغاًنقطة الوصول أو المنطقة لا يمكن أن تكون فارغةإسم المخزن لايمكن ان يكون فارغاً.
@@ -146,11 +155,15 @@
إستخدام البصمةتنشيط توثيق البصمةتأكيد فتح الوجه (إذا كان متوفراً)
+ حظر التطبيق عندما يحجب
+ حظر اعتراض الإدخال وعرض واجهة مستخدم خاطئةحظر لقطات الشاشةحظر لقطات الشاشة في قائمة التطبيقات الحديثة وداخل التطبيقبحثبحث مباشرتحديث نتائج البحث أثناء إدخال الإستعلام
+ البحث باستخدام نمط المطابقة glob
+ استخدام نمط المطابقة glob مثل alice.*.jpgقفل تلقائيأقفال بعدعند تعطيل الشاشة
@@ -174,6 +187,7 @@
وضع التصحيحارسال ملفات السجلفشل الإرسال
+ تلميحات الأمانالإصدارةإعدادات متقدمةتسريع فتح القفل
@@ -212,6 +226,7 @@
إستبدالالملف \'%1$s\' موجود مسبقاً. هل تريد استبداله؟الملفات موجودة مسبقاً. هل تريد استبدالها؟
+ %1$d ملفات موجودة مسبقاً. هل تريد استبدالها؟استبدال الملف؟استبدال الملفات؟غير قادر علي مشاركة الملفات
@@ -266,6 +281,7 @@
انتباهتعطيلالتطبيق غامض
+ يقوم تطبيق آخر بعرض شيء فوق Cryptomator (على سبيل المثال فلتر الضوء الأزرق أو تطبيق الوضع الليلي). تم تعطيل Cryptomator لأسباب أمنية.\n\nكيفية تمكين Cryptomatorإغلاقهذا الإعداد هو ميزة أمنية ويمنع التطبيقات الأخرى من خداع المستخدمين لفعل أشياء لا يريدون القيام بها.\n\nبتعطيليها, أنت تؤكد أنك على علم بالمخاطر.هل ترغب حقّا بحذف هذا الإتصال الخاص بمقدم الخدمة السحابية؟
@@ -328,6 +344,7 @@
حدث خطأ عام أثناء الرفع.المجلد المحدد للرفع لم يعد متوفرًا. اذهب إلى الإعدادات واختيار واحد جديدتم قفل المخزن اثناء الرفع، الرجاء قم بفتحه لمتابعة الرفع
+ المخزن المحدد للتحميل التلقائي لم يعد موجودا.فتح ملف قابل للكتابةسوف يبقى المخزن مفتوحاً حتي يتم التعديلتم تثبيت آخر إصدارة
diff --git a/presentation/src/main/res/values-bn-rBD/strings.xml b/presentation/src/main/res/values-bn-rBD/strings.xml
new file mode 100644
index 000000000..0a49197f1
--- /dev/null
+++ b/presentation/src/main/res/values-bn-rBD/strings.xml
@@ -0,0 +1,219 @@
+
+
+
+ এনক্রিপ্ট করুন
+
+ একটি ত্রুটি ঘটেছে
+ সনাক্তকরণ ব্যর্থ হয়েছে
+ সনাক্তকরণ ব্যর্থ হয়েছে, অনুগ্রহ করে %1$s ব্যবহার করে লগইন করুন
+ কোনো নেটওয়ার্ক সংযোগ নেই
+ ভুল পাসওয়ার্ড
+ একটি ফাইল অথবা ফোল্ডার ইতিমধ্যে রয়েছে।
+ অসমর্থিত ভোল্ট। এই ভোল্টটি ক্রিপ্টোমেটরের অন্য একটি ভার্সন দিয়ে তৈরি হয়েছিল।
+ ভোল্টটি ইতিমধ্যে রয়েছে।
+ ফাইলটি নেই।
+ ভোল্টটি লক করা হয়েছে।
+ ফাইলটি খুলতে পারে এমন একটি আ্যপ ডাউনলোড করুন।
+ সার্ভার খুজে পাওয়া যায়নি।
+ অনুগ্রহ করে ডিভাইস সেটিংস খুলে নিজে স্ক্রিন লক লাগিয়ে নিন।
+ এক্সপোর্ট ব্যর্থ হয়েছে। ফাইলের নাম থেকে বিশেষ অক্ষরগুলো সরিয়ে আবার এক্সপোর্ট করুন।
+ বিশেষ অক্ষর থাকা যাবে।
+ ফাইলের নামে বিশেষ অক্ষর থাকা যাবে না।
+ ভোল্ট নামে বিশেষ অক্ষর থাকা যাবে না।
+ সাধারণ ত্রুটি, হালনাগাদ পরীক্ষায় ব্যর্থ হয়েছে।
+ হালনাগাদ পরীক্ষায় ব্যর্থ হয়েছে। গণনা করা হ্যাশ আপলোড করা ফাইলের সাথে মেলে না
+ ইন্টারনেট সংযোগ নেই। হালনাগাদ পরীক্ষায় ব্যর্থ হয়েছে।
+ WebDev পাসওয়ার্ড ডিক্রিপশন ব্যর্থ হয়েছে, অনুগ্রহ করে সেটিংসে পুনরায় যোগ করুন
+ গুগল প্লে সার্ভিস ইন্সটল করা নয়।
+ বায়োমেট্রিক সনাক্তকরণ ব্যর্থ হয়েছে
+ %1$s এ ভার্সনটি %2$s এর ভার্সন থেকে ভিন্ন
+ %1$s এই %2$s এর সাথে মেলে না
+ ভোল্ট কোনফিগারেশন লোডিংএ সাধারণ ত্রুটি দেখা দিয়েছে
+ ক্রিপ্টোমেটরে ফিরে যাওয়ার পর লোকাল ফাইলটি বিদ্যমান নয়। তাই সম্ভাব্য পরিবর্তনগুলো আবার ক্লাউডে স্থানান্তর করা হবে না।
+
+
+ সিস্টেম স্টোরেজ
+
+
+ সেটিংস
+ খুঁজুন
+ পিছনে
+ পরবর্তী
+ সাজান
+ A - Z
+ Z - A
+ নতুন থেকে
+ পুরনো থেকে
+ বড় আকারের থেকে
+ ছোট আকারের থেকে
+
+
+ ক্রিপ্টোমেটরে যুক্ত করুন
+ নতুন ভোল্ট তৈরি করুন
+ বিদ্যমান কোনো ভোল্ট যুক্ত করুন
+ বাতিল
+ নতুন ভোল্ট তৈরি করতে এখানে ক্লিক করুন
+ পাসওয়ার্ড সফলভাবে পরিবর্তিত হয়েছে
+
+ ভোল্ট
+ মাস্টার কী ফাইলটি নির্বাচন করুন
+ এখানে রাখুন
+ ভোল্টের নাম: %1$s
+
+ %1$s স্থানান্তর করুন
+ %2$d আইটেম স্থানান্তর করুন
+
+ স্থানান্তর করুন
+ খালি ফোল্ডার
+ %1$s আগে পরিবর্তিত হয়েছে
+ শেয়ার করুন
+ একটি গন্তব্য নির্বাচন করুন
+ বাছুন
+ শেয়ার করার মত কিছু নেই
+ %1$s এ যুক্ত করুন
+ ফোল্ডার তৈরি করুন
+ টেক্সট ফাইল তৈরি করুন
+ ফাইল আপলোড করুন
+ ফাইল
+ ফাইল এক্সপোর্ট হয়েছে
+ ফাইলগুলো এক্সপোর্ট হয়েছে
+ এক্সপোর্ট করার মত কিছু নেই
+ ডাউনলোড ডিরেক্টরি তৈরিতে ব্যর্থ হয়েছে
+ শেয়ার
+ নাম পরিবর্তন করুন
+ এডিট
+ এক্সপোর্ট
+ মুছুন
+ খোলা হক…
+ আইটেম বাছুন
+ %1$dটি নির্বাচিত
+ নির্বাচন করুন
+ সবগুলো নির্বাচন করুন
+ রিফ্রেশ
+ কোনো সংযোগ নেই
+ পুনরায় চেষ্টা করুন
+
+ সফলভাবে সংরক্ষিত হয়েছে
+
+ %1$s … তে সংরক্ষণ করুন
+ টেক্সট
+ ফাইল
+ ফাইল
+ ফাইলের নাম অনন্য হতে হবে, অনুগ্রহ করে একই নাম পরিবর্তন করুন।
+ সংরক্ষণের ঠিকানা
+ সংরক্ষণ করুন
+ এনক্রিপশন সম্পন্ন হয়েছে
+
+ ক্লাউড পরিষেবা
+
+ একটি ঠিকানা বাছাই করুন
+ ঠিকানা যোগ করতে এখানে ক্লিক করুন
+
+ ইউআরএল
+ ব্যবহারকারীর নাম
+ পাসওয়ার্ড
+ কানেক্ট
+ URL খালি রাখা যাবে না।
+ URL টি ভুল।
+ ব্যবহারকারীর নাম খালি রাখা যাবে না।
+ পাসওয়ার্ড খালি থাকতে পারবে না।
+
+ নাম প্রদর্শন করুন
+ বিদ্যমান বাকেট
+ এন্ডপয়েন্ট
+ অঞ্চল
+ নাম খালি হতে পারব না
+
+ ভোল্ট এর নাম
+ তৈরি করুন
+
+ পাসওয়ার্ড সেট করুন
+ পাসওয়ার্ড মেলেনা, আবার লিখুন।
+ সম্পন্ন হয়েছে
+ সতর্কতা: আপনি যদি আপনার পাসওয়ার্ড ভুলে যান, তাহলে পাসওয়ার্ডটি পুনরুদ্ধার করার কোনো উপায় থাকবে না।
+ পুনরায় পাসওয়ার্ডটি লিখুন
+ ভোল্টটি তৈরির জন্য পাসওয়ার্ডটি অত্যন্ত দুর্বল
+ দুর্বল
+ ভালো
+ শক্তিশালী
+ খুবই শক্তিশালী
+
+ সাধারণ বিষয়াদি
+ ক্লাউড পরিষেবাসমূহ
+ বায়োমেট্রিক সনাক্তকরণ
+ বায়োমেট্রিক সনাক্তকরণ সক্রিয় করুন
+ ফেইস আনলক নিশ্চিত করুন (যদি থাকে)
+ অন্যান্য আ্যপকে ক্রিপ্টোমেটর ব্যবহারে বাধা দিন
+ স্ক্রিনশট নিতে বাধা দিন
+ খুঁজুন
+ যখন স্ক্রিন বন্ধ থাকে
+ স্বয়ংক্রিয় ছবি আপলোড
+ আপলোডের জন্য ভোল্ট নির্বাচন করুন
+ সক্রিয় করুন
+ ব্যাকগ্রাউন্ডে ছবি তুলুন এবং যখন নির্বাচিত ভোল্টটি আনলক করা হবে, আপলোড করুন
+ ভোল্ট আনলোক থাকলে সরাসরি আপলোড করুন
+ শুধু WiFi ব্যবহার করে আপলোড করুন
+ ভিডিও আপলোড করুন
+ … তে অটো আপলোড ফাইলগুলি সংরক্ষণ করুন
+ ক্রিপ্টোমেটরের ওয়েবসাইট
+ টুইটারে আমাদের অনুসরণ করুন
+ ফেসবুকে আমাদের লাইক দিন
+ আইনি
+ লাইসেন্স
+ লাইসেন্স এর শর্তাবলি
+ সহায়তা
+ সাহায্য জিজ্ঞাসা
+ ডিবাগ মোড
+ লগ ফাইলটি পাঠান
+ পাঠাতে ব্যর্থ হয়েছে
+ সংস্করণ
+ অ্যাডভান্স সেটিংস
+ আনলক রাখুন
+ ফাইল সম্পাদনার সময় ভোল্ট আনলক রাখুন
+
+ OneDrive সংযোগ
+ WebDAV সংযোগ
+ pCloud সংযোগ
+ S3 সংযোগ
+ লোকাল স্টোরেজ এর ঠিকানা
+ লগ ইন
+ সাইন আউট
+
+
+
+
+ বাতিল করুন
+ আনলক করুন
+ পুরাতন পাসওয়ার্ড
+ নতুন পাসওয়ার্ড
+ পাসওয়ার্ড পরিবর্তন করুন
+ পুরনো পাসওয়ার্ড অংশ খালি থাকতে পারবে না।
+ নতুন পাসওয়ার্ড অংশ খালি থাকতে পারবে না।
+ নতুন পাসওয়ার্ডটি পুনরায় টাইপ করা পাসওয়ার্ডের সাথে মেলে না।
+
+ %1$s ভোল্টটি পাওয়া যায়নি
+ ভোল্টটির হয়তো নাম পরিবর্তন, স্থানান্তর বা মুছে ফেলা হয়েছে। তালিকা থেকে ভোল্টটি সরান এবং চালিয়ে যেতে পুনরায় যোগ করুন। ভোল্টটি সরাবেন?
+ বাতিল
+ ফাইলটি ইতিমধ্যে রয়েছে
+ প্রতিস্থাপন করুন
+ %1$s নামে একটি ফাইল ইতিমধ্যে রয়েছে.
+ বিদ্যমান ফাইলটি এড়িয়ে যান
+ সবগুলো প্রতিস্থাপন করুন
+ বিদ্যমানটি প্রতিস্থাপন করুন
+ প্রতিস্থাপন করুন
+ %1$s নামে একটি ফাইল ইতিমধ্যে রয়েছে। আপনি কি এটা প্রতিস্থাপন করতে চান?
+ সব ফাইলগুলি ইতিমধ্যে রয়েছে। আপনি কি তাদের প্রতিস্থাপন করতে চান?
+ লক করুন
+ বন্ধ করুন
+ পিছনে
+
+
+
+
+
+
+
+
+
+
+
diff --git a/presentation/src/main/res/values-cs-rCZ/strings.xml b/presentation/src/main/res/values-cs-rCZ/strings.xml
index 0e14cf7b7..2b25ada53 100644
--- a/presentation/src/main/res/values-cs-rCZ/strings.xml
+++ b/presentation/src/main/res/values-cs-rCZ/strings.xml
@@ -16,6 +16,7 @@
Cloud již existuje.Stáhněte si prosím aplikaci, která umí otevřít tento soubor.Server nenalezen.
+ Otevřete prosím nastavení zařízení a nastavte zámek obrazovky ručněExport se nezdařil. Zkuste odstranit speciální znaky z názvů souborů a znovu exportovat.Nesmí obsahovat speciální znaky.Názvy souborů nesmí obsahovat speciální znaky.
@@ -23,8 +24,11 @@
Kontrola aktualizací se nezdařila. Došlo k obecné chybě.Kontrola aktualizace se nezdařila. Hash neodpovídá nahranému souboruKontrola aktualizací se nezdařila. Žádné připojení k internetu.
+ Dešifrování WebDAV hesla se nezdařilo, přidejte jej prosím znovu do nastaveníObchod Google Play není nainstalovánOvěření pomocí otisků prstů selhalo
+ Verze zadaná v %1$s se liší od verze %2$s
+ %1$s se neshoduje s %2$sObecná chyba při načítání konfigurace trezoruMístní soubor již není přítomen po přepnutí zpět na Cryptomator. Možné změny nelze promítnout zpět do cloudu.Bucket neexistuje
@@ -37,6 +41,7 @@
Cryptomator potřebuje přístup k úložišti pro export souborůCryptomator potřebuje přístup k úložišti pro nahrávání souborůCryptomator potřebuje přístup k úložišti pro sdílení souborů
+ Cryptomator ztratil oprávnění pro přístup k tomuto umístění. Prosím vyberte tuto složku znovu pro obnovení oprávnění.NastaveníVyhledatPředchozí
@@ -196,6 +201,7 @@
Ponechat odemčenéPonechat trezory odemčené při úpravách souborů
+ Spojení OneDrivePřipojení WebDAVpCloud připojeníS3 připojení
@@ -218,6 +224,7 @@
Hesla se neshodují.Trezor %1$s nebyl nalezen
+ Trezor byl přejmenován, přesunut nebo odstraněn. Odstraňte tento trezor ze seznamu a znovu jej přidejte pro pokračování. Odstranit nyní?OdstranitSoubor již existujeNahradit
@@ -286,6 +293,9 @@
Jiná aplikace zobrazuje něco nad Cryptomatorem (např. filtr modrého světla nebo aplikace pro noční režim). Z bezpečnostních důvodů je Cryptomator zakázán.\n\nJak povolit CryptomatorZavřítProsím znovu přidejte trezory pro %1s cloud
+ Při migraci na tuto verzi aplikace musíme z aplikace odstranit následující trezory:\n%2s \n\nTyto trezory nejsou odebrány z cloudu, ale pouze z této aplikace. Omlouváme se za nepříjemnosti a znovu přidejte tyto trezory, abyste s nimi mohli dále pracovat.
+ Trezor je kořenovou složkou cloudového připojení
+ Vytvořte nové připojení do cloudu, kde jako kořenový adresář zvolíte alespoň nadřazenou složku tohoto trezoru.Toto nastavení je bezpečnostní funkce a brání ostatním aplikacím v tom, aby oklamaly uživatele dělat věci, se kterými nesouhlasí.\n\nZakázáním potvrzujete, že jste si vědomi rizik.Opravdu chcete odstranit toto cloudové připojení?Tato akce odstraní cloudové připojení a všechny trezory tohoto cloudu.
@@ -365,6 +375,7 @@
Otevřít zapisovatelný souborTrezor zůstane odemknutý dokud nejsou dokončené úpravyNainstalována aktuální verze
+ Ověřování…MezipaměťUložit nedávno otevřené soubory šifrovaně do lokální mezipaměti pro pozdější použitíVelikost mezipaměti
diff --git a/presentation/src/main/res/values-de-rDE/strings.xml b/presentation/src/main/res/values-de-rDE/strings.xml
index 36da0782f..160e309a1 100644
--- a/presentation/src/main/res/values-de-rDE/strings.xml
+++ b/presentation/src/main/res/values-de-rDE/strings.xml
@@ -28,7 +28,7 @@
Die Google Play Services sind nicht installiertBiometrischer Login abgebrochenDie in %1$s angegebene Version ist nicht identisch mit der Version in %2$s
- %1$s-Datei stimmt nicht mit der %2$s-Datei überein
+ %1$s stimmt nicht mit %2$s übereinAllgemeiner Fehler beim Laden der TresorkonfigurationLokale Datei ist nach dem Zurückwechseln zu Cryptomator nicht mehr vorhanden. Mögliche Änderungen können nicht in die Cloud übertragen werden.Bucket existiert nicht
@@ -199,6 +199,7 @@
Entsperrt bleibenHalte Tresore geöffnet während dem Editieren einer Datei
+ OneDrive VerbindungenWebDAV-VerbindungenpCloud-VerbindungenS3-Verbindungen
@@ -236,15 +237,15 @@
Datei ersetzen?Dateien ersetzen?Teilen nicht möglich
- Sie haben keinen Tresor eingerichtet. Bitte legen Sie zuerst einen Tresor mit der Cryptomator-App an.
+ Du hast keinen Tresor eingerichtet. Bitte lege zuerst einen Tresor mit der Cryptomator-App an.OKTresor erstellen%1$s kann nicht geöffnet werden
- Bitte installieren Sie eine App, die diese Datei öffnen kann. Möchten Sie die Datei stattdessen auf dem Gerät speichern?
+ Bitte installiere eine App, die diese Datei öffnen kann. Möchtest du die Datei stattdessen auf dem Gerät speichern?Tresor umbenennenOrdner umbenennenDatei umbenennen
- Sie haben ungespeicherte Änderungen
+ Du hast nicht gespeicherte ÄnderungenMöchtest du wirklich beenden, ohne zu speichern?Verwerfentext.txt
@@ -301,7 +302,7 @@
Möchtest du dieses Element wirklich löschen?Dieser Vorgang wird den gesamten Ordnerinhalt löschen. Bist du sicher, dass du diesen Ordner löschen möchtest?Biometrischer Login deaktiviert
- Da der Schlüssel nicht mehr zur Verfügung steht, wurde der Biometrischer Login deaktiviert. Zur Reaktivierung öffnen Sie die Cryptomator-Einstellungen.
+ Da der Schlüssel nicht mehr zur Verfügung steht, wurde der Biometrischer Login deaktiviert. Zur Reaktivierung öffne die Cryptomator-Einstellungen.APK-Store LizenzCryptomator wurde nicht über den Google Play Store installiert; gib daher eine gültige Lizenz ein. Diese kann auf https://cryptomator.org/android/ erworben werden.Die eingegebene Lizenz ist ungültig. Stelle sicher, dass sie korrekt eingegeben wurde.
@@ -317,7 +318,7 @@
Download in AusführungLade die aktuelle Version von Cryptomator herunterDieser Ordner ist ein symbolischer Link
- Sie können nicht in diesen symbolischen Link navigieren
+ Du kannst nicht in diesen symbolischen Link navigierenZurückVerzeichnisinhalt kann nicht geladen werdenDer Ordner \'%1$s\' in der Cloud hat keine gültige Verzeichnis-Datei. Es könnte sein, dass der Ordner auf einem anderen Gerät erstellt und noch nicht vollständig mit der Cloud synchronisiert wurde. Bitte überprüfe, ob die folgende Datei in der Cloud existiert und nicht leer ist:\n%2$s
@@ -372,6 +373,7 @@
Datei mit Schreibrechten geöffnetTresor bleibt entsperrt bis die Datei nicht mehr editiert wirdNeueste Version installiert
+ Melde an…ZwischenspeicherSpeichere kürzlich geöffnete Dateien lokal und verschlüsselt auf dem Gerät für eine spätere Wiederverwendung beim erneuten öffnenZwischenspeichergröße insgesamt
diff --git a/presentation/src/main/res/values-el-rGR/strings.xml b/presentation/src/main/res/values-el-rGR/strings.xml
index b964817b0..001cc4555 100644
--- a/presentation/src/main/res/values-el-rGR/strings.xml
+++ b/presentation/src/main/res/values-el-rGR/strings.xml
@@ -199,6 +199,7 @@
Κρατήστε ξεκλείδωτοΚρατήστε τις κρύπτες ξεκλειδωμένες κατά την επεξεργασία αρχείων
+ Συνδέσεις OneDriveΣυνδέσεις WebDAVΣυνδέσεις pCloudΣυνδέσεις S3
@@ -372,6 +373,7 @@
Άνοιγμα εγγράψιμου αρχείουΗ κρύπτη παραμένει ξεκλείδωτη μέχρι να τελειώσει η επεξεργασίαΤελευταία έκδοση εγκατεστημένη
+ Ταυτοποίηση…Προσωρινή μνήμηΗ προσωρινή μνήμη απέκτησε πρόσφατα πρόσβαση σε αρχεία που έχουν κρυπτογραφηθεί τοπικά στη συσκευή για μελλοντική επαναχρησιμοποίηση όταν ανοίξουν ξανάΣυνολικό μέγεθος προσωρινής μνήμης
diff --git a/presentation/src/main/res/values-es-rES/strings.xml b/presentation/src/main/res/values-es-rES/strings.xml
index a63fe476e..570fb2789 100644
--- a/presentation/src/main/res/values-es-rES/strings.xml
+++ b/presentation/src/main/res/values-es-rES/strings.xml
@@ -5,16 +5,16 @@
Se ha producido un errorHa fallado la autenticación
- Autenticación fallida. Por favor, inicie sesión usando %1$s
+ Error de autenticación. Por favor, inicie sesión usando %1$sNo hay conexión de redContraseña incorrectaYa existe un archivo o carpeta.
- Caja fuerte no soportada. Se ha creado con otra versión de Cryptomator.
- La caja fuerte ya existe.
+ Bóveda no soportada. Se ha creado con otra versión de Cryptomator.
+ La bóveda ya existe.El archivo no existe.
- Se ha bloqueado la caja fuerte.
+ Se ha bloqueado la bóveda.La nube ya existe.
- Por favor, descarga una aplicación que pueda abrir este archivo.
+ Descargue una aplicación que pueda abrir este archivo.Servidor no encontrado.Abra los ajustes de su dispositivo y establezca el bloqueo de pantalla manualmenteExportación fallida. Intente eliminar los caracteres especiales de los nombres de archivo y vuelva a exportar.
@@ -38,9 +38,9 @@
Almacenamiento local
- Cryptomator necesita acceso al almacenamiento para exportar archivos.
- Cryptomator necesita acceso al almacenamiento para subir archivos.
- Cryptomator necesita acceso al almacenamiento para compartir archivos.
+ Cryptomator necesita acceso al almacenamiento para exportar archivos
+ Cryptomator necesita acceso al almacenamiento para subir archivos
+ Cryptomator necesita acceso al almacenamiento para compartir archivosCryptomator ha perdido permiso para acceder a esta ubicación. Seleccione esta carpeta de nuevo para restaurar el permiso.ConfiguraciónBuscar
@@ -56,16 +56,16 @@
Añadir a Cryptomator
- Crear nueva caja fuerte
- Añadir caja fuerte existente
+ Crear bóveda nueva
+ Añadir bóveda existenteEliminar
- Haz clic aquí para crear una caja fuerte
+ Haga clic aquí para crear una bóvedaContraseña cambiada con éxito
- Caja fuerte
+ BóvedaSeleccionar archivo masterkeyDejar aquí
- Nombre de caja fuerte: %1$s
+ Nombre de la bóveda: %1$sMover %1$s aMover %2$d elementos a
@@ -106,7 +106,7 @@
textoarchivoarchivos
- Los nombres de archivo deben ser únicos. Renombra los duplicados.
+ Los nombres de archivo deben ser únicos. Renombre los duplicados.Guardar ubicaciónGuardarCifrado completado
@@ -114,7 +114,7 @@
Servicio de nubeElegir ubicación
- Haz clic aquí para añadir ubicaciones
+ Haga clic aquí para añadir ubicacionesEl servidor no parece ser compatible con WebDAVNo hay ubicaciones extra disponibles.
@@ -124,7 +124,7 @@
ConectarLa URL no puede estar vacía.La URL no es válida.
- El nombre de usuario no puede estar vacio.
+ El nombre de usuario no puede estar vacío.La contraseña no puede estar vacía.Nombre para mostrar
@@ -139,15 +139,15 @@
La cubeta no puede estar vacíaEl punto final o la región no puede estar vacío
- El nombre de la caja fuerte no puede estar vacío.
- Nombre de la caja fuerte
+ El nombre de la bóveda no puede estar vacío.
+ Nombre de la bóvedaCrearEstablecer contraseñaLas contraseñas no coinciden.CompletadoIMPORTANTE: si olvida su contraseña no habrá manera de recuperar los datos.
- Reescriba la contraseña
+ Repita la contraseñaDemasiado débil para crear una bóvedaDébilAceptable
@@ -181,15 +181,15 @@
Cargar videosGuardar archivos de carga automática en…Web de Cryptomator
- Síguenos en Twitter
- Danos me gusta en Facebook
+ Síganos en Twitter
+ Denos me gusta en FacebookLegalLicenciasTérminos de la licenciaSoporteSolicitar ayudaModo de depuración
- Enviar archivo de trazas
+ Enviar archivo de registroError en el envíoConsejos de seguridadVersión
@@ -199,6 +199,7 @@
Mantener desbloqueadoMantener las bóvedas desbloqueadas durante la edición de archivos
+ Conexiones de OneDriveConexiones de WebDAVConexiones de pCloudConexiones S3
@@ -213,12 +214,12 @@
CancelarDesbloquear
- Antigua contraseña
- Nueva contraseña
+ Contraseña anterior
+ Contraseña nuevaCambiar contraseña
- La antigua contraseña no puede estar vacía.
- La nueva contraseña no puede estar vacía.
- Las nuevas contraseñas no coinciden.
+ La contraseña anterior no puede estar vacía.
+ La contraseña nueva no puede estar vacía.
+ Las contraseñas nuevas no coinciden.Bóveda %1$s no encontradaLa bóveda ha sido renombrada, movida o eliminada. Eliminar esta bóveda de la lista y añadirla de nuevo para continuar. ¿Eliminar ahora?
@@ -230,53 +231,53 @@
Reemplazar todosReemplazar existentesReemplazar
- Ya existe un archivo llamado %1$s. ¿Quieres reemplazarlo?
- Todos los archivos existen ya. ¿Quieres reemplazarlos?
- %1$d archivos existen ya. ¿Quieres reemplazarlos?
- \"¿Reemplazar archivo?
- \"¿Reemplazar archivos?
+ Ya existe un archivo llamado %1$s. ¿Desea reemplazarlo?
+ Todos los archivos ya existen. ¿Desea reemplazarlos?
+ %1$d archivos ya existen. ¿Desea reemplazarlos?
+ ¿Reemplazar archivo?
+ ¿Reemplazar archivos?No se puede compartir archivos
- No ha configurado ninguna caja fuerte. Cree antes una nueva caja fuerte con la aplicación Cryptomator.
+ No ha configurado ninguna bóveda. Cree primero una bóveda nueva con la aplicación Cryptomator.Aceptar
- Crear caja fuerte
+ Crear bóvedaNo se puede abrir %1$s
- Descarga una aplicación que pueda abrir el archivo o, ¿quieres guardarlo en el dispositivo?
- Renombrar caja fuerte
+ Descargue una aplicación que pueda abrir el archivo o ¿desea guardarlo en el dispositivo?
+ Renombrar bóvedaRenombrar carpetaRenombrar archivo
- Tienes cambios sin guardar
- \"¿De verdad quieres salir sin guardar?
+ Tiene cambios sin guardar
+ ¿Realmente desea salir sin guardar?Descartartexto.txt
- \"¿Estás seguro de que quieres eliminar esta caja fuerte?
- Esta acción solo eliminará la caja fuerte de esta lista y no la borrará físicamente.
- Sube…
+ ¿Está seguro que desea eliminar esta bóveda?
+ Esta acción solo borrará la bóveda de esta lista y no la eliminará físicamente.
+ Subiendo…Archivo %1$d de %2$dExportando (%1$d/%2$d)
- Espera, por favor…
+ Por favor espere…Creando carpeta…Creando archivo de texto…Autenticación…Renombrando…
- Borrando…
- Desbloqueando caja fuerte…
+ Eliminando…
+ Desbloqueando bóveda…Cambiando contraseña…
- Creando caja fuerte…
+ Creando bóveda…Subiendo…Descargando…Cifrando…Descifrando…Moviendo…Bloquear
- Invalidar certificado SSL
- El certificado SSL no es válido. ¿Quiere confiar en él de todas formas?
+ Certificado SSL inválido
+ El certificado SSL es inválido. ¿Desea confiar en él de todas formas?DetallesEsto podría ser un riesgo para la seguridad. Sé lo que estoy haciendo.El uso de HTTP no es seguro. Recomendamos usar HTTPS en su lugar. Si conoce los riesgos puede seguir usando HTTP.Cambiar a HTTPS\"¿Usar HTPPS?
- No se ha establecido el bloqueo de pantalla. Para almacenar las credenciales de forma segura, establece con Aceptar un patrón o contraseña.
- \"¿Establecer bloqueo de pantalla?
+ No se ha establecido el bloqueo de pantalla. Para almacenar las credenciales de forma segura, defina con OK un patrón o contraseña.
+ ¿Establecer bloqueo de pantalla?Establecer bloqueo de pantallaNo hay autenticación básica configurada en el sistemaRegistre al menos un dedo/rostro para usar este servicio.
@@ -294,12 +295,12 @@
La bóveda es la carpeta raíz de la conexión a la nubeCrear una conexión nueva en la nube donde seleccione al menos la carpeta padre de esta carpeta de bóveda como directorio raíz para añadir esta bóveda.Esta opción es una función de seguridad y evita que otras aplicaciones engañen a los usuarios para que hagan cosas que no quieren hacer.\n\nAl desactivar, confirma que es consciente de los riesgos.
- \"¿Estás seguro de que quieres eliminar esta conexión de nube?
- Esta acción eliminará la conexión de nube y todas las cajas fuertes de esta nube.
+ \"¿Está seguro que desea eliminar esta conexión a la nube?
+ Esta acción eliminará la conexión a la nube y todas las bóvedas de esta nube.¿Eliminar %1$d elementos?¿Está seguro que desea eliminar estos elementos?
- \"¿Estás seguro de que quieres borrar este archivo?
- Esto borrará todo el contenido de la carpeta. ¿Estás seguro de que quiere borrar esta carpeta?
+ ¿Está seguro que desea eliminar este archivo?
+ Esto borrará todo el contenido de la carpeta. ¿Está seguro que desea eliminar esta carpeta?Función de autenticación biométrica desactivadaDebido a que la clave ha sido invalidada, la función de autenticación biométrica ha sido desactivada. Para reactivarla, abra los ajustes de Cryptomator.Proporcione una licencia válida
@@ -356,8 +357,8 @@
Usar contraseña de la bóvedaNo se pueden cargar archivos automáticamente
- Cajas fuertes desbloqueadas: %1$d
- Autobloqueo en %1$s
+ Bóvedas desbloqueadas: %1$d
+ Autobloquear en %1$sBloquear todasCancelar cargaCarga automática de fotos en ejecución
@@ -372,13 +373,14 @@
Abrir archivo escribibleLa bóveda permanece desbloqueada hasta finalizar la ediciónÚltima versión instalada
+ Autenticando…CachéAlmacene en caché los archivos a los que se accedió recientemente cifrados localmente en el dispositivo para su posterior reutilización cuando se vuelva a abrirTamaño total de la cachéVaciar la cachéLos cambios se aplicarán en el próximo reinicio de la aplicaciónRegistrado para
- \"%1$s
+ %1$sActualizar intervalo de verificaciónComprobar atualizacionesÚltima ejecución %1$s
diff --git a/presentation/src/main/res/values-fr-rFR/strings.xml b/presentation/src/main/res/values-fr-rFR/strings.xml
index 4f5663abc..a32fd77a1 100644
--- a/presentation/src/main/res/values-fr-rFR/strings.xml
+++ b/presentation/src/main/res/values-fr-rFR/strings.xml
@@ -199,6 +199,7 @@
Maintenir deverouilléGardez les coffres forts déverrouillées pendant l\'édition des fichiers
+ Connexions OneDriveConnexions WebDAVConnexions pCloudConnexions S3
@@ -372,6 +373,7 @@
Ouvrir un fichier accessible en écritureLe coffre-fort reste déverrouillé jusqu\'à la fin des modificationsDernière version installée
+ Authentification en cours…CacheMettre en cache les fichiers récemment consultés chiffrés localement sur l\'appareil pour une réutilisation lors d\'une réouverture ultérieureTaille totale du cache
diff --git a/presentation/src/main/res/values-hi-rIN/strings.xml b/presentation/src/main/res/values-hi-rIN/strings.xml
index 6c5b4ef43..65cdd4c70 100644
--- a/presentation/src/main/res/values-hi-rIN/strings.xml
+++ b/presentation/src/main/res/values-hi-rIN/strings.xml
@@ -10,7 +10,10 @@
गलत कूटशब्द!दस्तावेज आथ्वा फ़ोल्डर उपलब्ध नहीं हैदस्तावेज उपलब्ध नहीं है
+ कृपया एक ऐप डाउनलोड करें जो इस फाइल को खोल सकता है।सर्वर नहीं मिला।
+ फ़ाइल नामों में विशेष वर्ण नहीं हो सकते हैं।
+ गुप्त तिजोरी के नाम में विशेष वर्ण नहीं हो सकते हैं।
@@ -19,14 +22,19 @@
खोज करेंपिछलाअगला
+ सबसे नया पहले
+ सबसे पुराना पहलेक्रिप्टोमेटर में जोड़ेंहटाएँगुप्त तिजोरी
+ मूव करेंचुनें
+ फोल्डर बनाएंनया दस्तावेज बनाए
+ फ़ाइल अपलोड करेंदस्तावेजदस्तावेज निर्यात हुआदस्तावेज निर्यात हुए
@@ -62,6 +70,8 @@
क्षेत्र
+ गुप्त तिजोरी का नाम
+ बनाएंहो गयाकमजोर
@@ -79,6 +89,7 @@
अनलॉक करेंहटाएँ
+ गुप्त तिजोरी बनाएंलॉक करेंबंद करेंपीछे जाएं
diff --git a/presentation/src/main/res/values-in-rID/strings.xml b/presentation/src/main/res/values-in-rID/strings.xml
index 06b766c5b..f6baeb881 100644
--- a/presentation/src/main/res/values-in-rID/strings.xml
+++ b/presentation/src/main/res/values-in-rID/strings.xml
@@ -4,15 +4,15 @@
EnkripsiKesalahan terjadi
- Otentikasi gagal
- Otentikasi gagal, mohon masuk menggunakan %1$s
+ Autentikasi gagal
+ Autentikasi gagal, mohon masuk menggunakan %1$sTidak ada koneksi jaringanKata sandi salahBerkas atau folder sudah ada.Vault tidak didukung. Vault ini telah dibuat dengan Cryptomator versi lain.Vault sudah ada.Berkas tidak ada.
- Vaukt telah terkunci.
+ Vault telah dikunci.Cloud sudah ada.Silakan unduh aplikasi yang dapat membuka file ini.Server tidak ditemukan.
@@ -26,11 +26,11 @@
Pemeriksaan pembaruan gagal. Tidak ada koneksi internet.Gagal mendekripsi kata sandi WebDAV, harap tambahkan kembali di pengaturanGoogle Play Services belum terpasang
- Otentikasi biometrik gagal
+ Autentikasi biometrik dibatalkanVersi yang ditentukan di %1$s berbeda dengan %2$s%1$s tidak cocok dengan %2$s iniTerjadi kesalahan saat memuat konfigurasi vault
- File lokal tidak ada lagi setelah beralih kembali ke Cryptomator. Kemungkinan perubahan tidak dapat disebarkan kembali ke cloud.
+ File lokal sudah tidak tersedia setelah beralih kembali ke Cryptomator. Perubahan yang ada tidak dapat disimpan kembali ke cloud.Bucket tidak adaLokasi Masterkey khusus belum didukung
@@ -57,9 +57,9 @@
Tambah ke CryptomatorBuat vault baru
- Tambahkan vault yang ada
+ Tambahkan vault yang sudah adaHapus
- Klik disini untuk membuat vault baru
+ Ketuk disini untuk membuat vault baruKasa Sandi berhasil diubahVault
@@ -70,7 +70,7 @@
Pindah %2$d item kePindah
- Filder kosong
+ Folder kosongdimodifikasi %1$s laluBagikan denganPilih tujuan
@@ -113,7 +113,7 @@
Layanan CloudPilih lokasi
- Klik disini untuk menambahkan lokasi
+ Ketuk disini untuk menambahkan lokasiServer tampaknya tidak kompatibel dengan WebDAVTidak ada lokasi tambahan yang tersedia.
@@ -155,11 +155,11 @@
UmumLayanan cloud
- Otentikasi biometrik
- Aktifkan otentikas biometrik
+ Autentikasi biometrik
+ Aktifkan autentikasi biometrikKonfirmasi face unlock (jika tersedia)
- Blokir aplikasi saat disamarkan
- Blokir mencegat input dan menampilkan antarmuka pengguna yang salah
+ Blokir aplikasi ketika dihalangi
+ Memblokir pembajakan input serta tampilan antarmuka pengguna yang menyesatkanBlokir screenshotBlokir screenshot di daftar terbaru dan di dalam aplikasiCari
@@ -173,7 +173,7 @@
Unggah foto otomatisPilih vault untuk unggahAktifkan
- Ambil gambar di background dan setelah vault yang dipilih dibuka, mulai mengunggah
+ Ambil gambar di background, kemudian mulai proses unggah setelah vault terpilih dibukaUnggah instanUnggah langsung jika vault tidak terkunciHanya unggah melalui WIFI
@@ -198,11 +198,12 @@
Biarkan tidak terkunciBiarkan vault tidak terkunci saat mengedit file
+ Koneksi OneDriveKoneksi WebDAVkoneksi pCloudKoneksi S3Lokasi penyimpanan lokal
- Masuk ke
+ Login keKeluar dari
@@ -211,7 +212,7 @@
Batalkan
- Buka Gembok
+ Buka KunciKata sandi lamaKata sandi baruUbah kata sandi
@@ -235,7 +236,7 @@
Menimpa file?Menimpa file?Tidak dapat membagikan file
- Anda belum menyiapkan vault apa pun. Silakan buat vault baru dengan aplikasi Cryptomator terlebih dahulu.
+ Anda belum menyiapkan vault sama sekali. Silahkan buat vault baru terlebih dahulu melalui aplikasi Cryptomator.OKBuat vaultTidak dapat membuka %1$s
@@ -255,7 +256,7 @@
Mohon tunggu…Membuat folder…Membuat file teks…
- Otentikasi…
+ Autentikasi…Mengganti nama…Menghapus…Membuka vault…
@@ -266,7 +267,7 @@
Mengenkripsi…Mendekripsi…Memnindahkan…
- Gembok
+ KunciSertifikat SSL tidak validSertifikat SSL tidak valid. Apakah Anda ingin mempercayainya?Rincian
@@ -277,16 +278,16 @@
Tidak ada kunci layar yang disetel. Untuk menyimpan kredensial Anda dengan cara yang aman, atur dengan OK pola atau kata sandi.Atur kunci layar?Atur kunci layar
- Tidak ada otentikasi dasar yang diatur dalam sistem
+ Tidak ada autentikasi dasar yang disetel dalam sistemDaftarkan setidaknya satu jari/wajah untuk menggunakan layanan ini.
- Dalam mode ini, data sensitif dapat ditulis ke file log di perangkat Anda (misalnya, nama file dan jalur). Kata sandi, cookie, dll. secara eksplisit dikecualikan.\n\nIngat untuk menonaktifkan mode debug sesegera mungkin.
+ Dalam mode ini, data sensitif dapat ditulis ke file log di perangkat Anda (misalnya, nama dan lokasi file). Kata sandi, cookie, dll secara eksplisit dikecualikan.\n\nJangan lupa untuk menonaktifkan mode debug sesegera mungkin.Perhatian
- Aktif
- Setelan ini adalah fitur keamanan dan mencegah aplikasi lain menipu pengguna agar melakukan hal-hal yang tidak ingin mereka lakukan.\n\nDengan menonaktifkan, Anda mengonfirmasi bahwa Anda sadar akan risiko.
+ Aktifkan
+ Setelan ini adalah fitur keamanan yang dapat mencegah aplikasi lain menipu pengguna agar melakukan hal-hal yang tidak ingin mereka lakukan.\n\nDengan menonaktifkan, artinya mengonfirmasi bahwa Anda paham dengan resikonya.PerhatianMatikan
- Aplikasi tidak jelas
- Aplikasi lain menampilkan sesuatu di atas Cryptomator (misal, Filter cahaya biru atau aplikasi mode malam). Untuk alasan keamanan, Cryptomator dinonaktifkan.\n\nCara mengaktifkan Cryptomator
+ Aplikasi terhalang
+ Aplikasi lain menampilkan sesuatu di atas tampilan Cryptomator (misal, Filter cahaya biru atau aplikasi mode malam). Untuk alasan keamanan, Cryptomator dinonaktifkan.\n\nCara mengaktifkan CryptomatorTutupHarap tambahkan kembali vault untuk cloud %1sSaat bermigrasi ke versi aplikasi ini, kita perlu menghapus vault berikut dari aplikasi:\n%2s \n\nVault tersebut tidak dihapus dari cloud, tetapi hanya dari aplikasi ini. Maaf atas ketidaknyamanan ini dan harap tambahkan kembali vault ini untuk terus bekerja dengannya.
@@ -299,8 +300,8 @@
Anda yakin ingin menghapus item ini?Anda yakin ingin menghapus berkas ini?Ini akan menghapus semua isi folder. Anda yakin ingin menghapus folder ini?
- Fitur otentikasi biometrik dinonaktifkan
- Karena kunci telah dibatalkan, fitur otentikasi biometrik telah dinonaktifkan. Untuk mengaktifkan kembali, buka pengaturan Cryptomator.
+ Fitur autentikasi biometrik dinonaktifkan
+ Karena kunci telah dibatalkan, fitur autentikasi biometrik telah dinonaktifkan. Untuk mengaktifkan kembali, buka pengaturan Cryptomator.Berikan lisensi yang validKami mendeteksi bahwa Anda menginstal Cryptomator tanpa menggunakan Google Play Store. Berikan lisensi yang valid, yang dapat dibeli di https://cryptomator.org/android/Lisensi yang diberikan tidak valid. Pastikan Anda memasukkannya dengan benar.
@@ -322,7 +323,7 @@
Folder cloud \'%1$s\' tidak memiliki file direktori yang valid. Bisa jadi folder tersebut dibuat di perangkat lain dan belum sepenuhnya tersinkronisasi ke cloud. Harap periksa di cloud Anda jika file berikut ada dan tidak kosong:\n%2$sTidak ada lagi gambar untuk ditampilkan…Kredensial \'%1$s\' diperbarui
- Jika Anda ingin menambahkan akun pCloud baru, klik url ini www.pcloud.com, keluar dari akun saat ini dan klik lagi \'+\' di aplikasi ini untuk membuat koneksi cloud baru.
+ Jika Anda ingin menambahkan akun pCloud baru, ketuk url berikut www.pcloud.com, keluar dari akun saat ini kemudian ketuk tombol \'+\' lagi di aplikasi ini untuk membuat koneksi cloud baru.Cryptomator membutuhkan akses penyimpanan untuk menggunakan vault lokalCryptomator membutuhkan akses penyimpanan untuk menggunakan unggahan foto otomatis
@@ -350,10 +351,10 @@
tahuntahun
- Masuk dengan biometrik
+ Login dengan biometrikBuka kunci dengan kredensial biometrikGunakan kata sandi vault
- Tidak dapat mengunggah file
+ Tidak dapat mengunggah file secara otomatisVaults tidak terkunci: %1$dOtomatis terkunci dalam %1$s
@@ -371,8 +372,9 @@
Buka file yang dapat ditulisVault tetap tidak terkunci sampai selesai mengeditVersi terbaru sudah terpasang
+ Mengautentikasi…Cache
- Cache file yang baru saja diakses yang dienkripsi secara lokal di perangkat untuk digunakan kembali nanti saat dibuka kembali
+ Gunakan cache yang terenkripsi di perangkat lokal untuk file yang baru-baru ini diakses agar bisa digunakan lagi ketika dibuka kembaliTotal ukuran cacheBersihkan CachePerubahan akan diterapkan pada saat aplikasi dibuka kembali
diff --git a/presentation/src/main/res/values-iw-rIL/strings.xml b/presentation/src/main/res/values-iw-rIL/strings.xml
index bef634e19..ecce94b77 100644
--- a/presentation/src/main/res/values-iw-rIL/strings.xml
+++ b/presentation/src/main/res/values-iw-rIL/strings.xml
@@ -1,45 +1,362 @@
+ הצפן
+ ארעה שגיאה
+ האימות נכשל
+ האימות נכשל, אנא התחבר באמצעות %1$s
+ אין חיבור לרשת
+ סיסמה שגויה
+ כבר קיימים תיקייה או קובץ בשם זה.
+ הכספת לא נתמכת. כספת זו נוצרה בגרסה אחרת של Cryptomator.
+ כספת כבר קיימת.
+ הקובץ לא קיים.
+ הכספת ננעלה.
+ אחסון ענן זה כבר בשימוש.
+ אנא הורד אפליקציה שתומכת בפתיחה של קובץ זה.
+ שרת לא נמצא.
+ אנא הפעל מסך נעילה בהגדרות המכשיר
+ הייצוא נכשל. מחק תווים מיוחדים משמות הקבצים ונסה שוב.
+ הקלט לא יכול להכיל תווים מיוחדים.
+ שם קובץ לא יכול להכיל תווים מיוחדים.
+ שם הכספת לא יכול להכיל תווים מיוחדים.
+ עדכון גרסה נכשל. התרחשה שגיאה כללית.
+ עדכון גרסה נכשל. אין תאימות בין הקובץ שהועלה לערך ה hash שחושב
+ עדכון גרסה נכשל. אין חיבור לאינטרנט.
+ פענוח סיסמת WebDAV נכשל, וודא בהגדרות האפליקצייה שהסיסמה שהוכנסה נכונה
+ שירותי Google Play אינם מותקנים
+ אימות ביומטרי הופסק
+ הגרסה ב %1$s שונה מזו שב %2$s
+ %1$s ו %2$s אינם תואמים
+ שגיאה כללית בזמן טעינת הגדרות הכספת
+ דלי לא נמצא
+ שינוי מיקום ה Masterkey עדיין לא נתמך
+ אחסון מקומי
+ Cryptomator זקוק להרשאת גישה לזיכרון המכשיר כדי לייצא קבצים
+ Cryptomator זקוק להרשאת גישה לזיכרון המכשיר כדי להעלות קבצים
+ Cryptomator זקוק להרשאת גישה לזיכרון המכשיר כדי לשתף קבצים
+ Cryptomator איבד את הרשאות הגישה לתיקייה זו. אנא בחר תיקייה זו בשנית כדי להחזיר את הרשאה.
+ הגדרות
+ חיפוש
+ הקודםהמשך
+ מיון
+ א - ת
+ ת - א
+ החדש ביותר
+ הישן ביותר
+ הכבד ביותר
+ הקל ביותר
+ הוסף ל-Cryptomator
+ צור כספת חדשה
+ הוסף כספת קיימת
+ מחק
+ ליצירת כספת חדשה לחץ כאן
+ הסיסמה שונתה בהצלחהכספת
+ בחר קובץ masterkey
+ מקם כאן
+ שם כספת: %1$s
+ שנה מיקום
+ תיקיה ריקה
+ שונה לפני %1$s
+ שתף באמצעות
+ בחר מיקום חדש
+ בחר
+ אין מה לשתף
+ הוסף ל %1$s
+ צור תיקייה
+ צור קובץ טקסט
+ העלה קובצים
+ קבצים
+ הקובץ יוצא
+ הקבצים יוצאו
+ אין מה לייצא
+ יצירת תיקייה להורדות נכשלה
+ שתף
+ שנה שם
+ ערוך
+ ייצא
+ מחק
+ פתח באמצעות…
+ בחר פריטים
+ %1$d נבחר
+ בחר
+ בחר הכל
+ רענן
+ אין חיבור לרשת
+ נסה שוב
+ נשמר בהצלחה
+ שמור את %1$s…
+ טקסט
+ קובץ
+ קבצים
+ שם קובץ חייב להיות ייחודי. אנא שנה שמות קבצים בעלי שם זהה.
+ מיקום שמירה
+ שמור
+ הצפנה הושלמה
+ שירותי אחסון בענן
+ בחר מיקום
+ להוספת מיקומים, לחץ כאן
+ נראה שהשרת אינו תומך ב WebDAV
+ כתובת URL
+ שם משתמש
+ סיסמה
+ התחבר
+ יש להזין כתובת URL.
+ כתובת ה-URL אינה חוקית.
+ יש להזין שם משתמש.
+ יש להזין סיסמה.
+ שם תצוגה
+ מפתח גישה
+ מפתח סודי
+ דלי קיים
+ נקודת גישה
+ אזור
+ יש להזין שם תצוגה
+ יש להזין מפתח גישה
+ יש להזין מפתח סודי
+ יש להזין דלי
+ יש להזין מפתח גישה
+ יש להזין שם כספת.
+ שם כספת
+ צור
+ הגדר סיסמה
+ סיסמת האימות אינה תואמת לסיסמה שהוזנה.סיום
+ שים לב שאינך שוכח את סיסמתך! לא ניתן לשחזר את המידע שלך בחזרה מבלי הסיסמה.
+ חזור על הסיסמה
+ סיסמה חלשה מידי ליצירת כספת
+ חלשה
+ סבירה
+ חזקה
+ חזקה מאוד
+ כללי
+ שירותי אחסון בענן
+ אימות ביומטרי
+ הפעל אימות ביומטרי
+ אפשר פתיחה באמצעות זיהוי פנים (במידה שזמין)
+ חסום צילומי מסך
+ חסום צילומי מסך באפליקציה וברשימת היישומים שנפתחו לאחרונה
+ חיפוש
+ חפש באמצעות תבניות Glob
+ השתמש בתבניות Glob כדי לבצע חיפוש כדוגמת alice.*.jpg
+ נעילה אוטומטית
+ נעל לאחר
+ כאשר מסך המכשיר נכבה
+ העלאה אוטומטית של תמונות
+ בחר כספת להעלאת תמונות
+ הפעל
+ העלאה מיידית
+ העלה רק כאשר המכשיר מחובר ל WiFi
+ העלה סרטוני וידאו
+ שמור קבצים מועלים אוטומטית ל…
+ לאתר Cryptomator
+ עקבו אחרינו ב-Twitter
+ תנו לנו לייק ב-Facebook
+ היבטים משפטיים
+ רישיונות
+ תנאי שימוש
+ תמיכה
+ בקש תמיכה
+ מצב ניפוי תקלות
+ שלח יומן אירועים
+ השליחה נכשלה
+ גרסה
+ הגדרות מתקדמות
+ חיבורי OneDrive
+ חיבורי WebDAV
+ חיבורי pCloud
+ חיבורי S3
+ מקומות אחסון במכשיר
+ התחבר אל
+ התנתק מ
+ האימות אל \'%1$s\' נכשל.
+ עדכן את פרטי ההתחברות אל pCloudביטולבטל נעילה
+ סיסמה ישנה
+ סיסמה חדשה
+ שנה סיסמה
+ יש להזין סיסמה ישנה.
+ יש להזין סיסמה חדשה.
+ הכספת %1$s לא נמצאה
+ מחק
+ הקובץ כבר קיים
+ החלף
+ כבר קיים קובץ בשם %1$s.
+ דלג על קיימים
+ החלף הכל
+ החלף קיימים
+ החלף
+ להחליף את הקובץ?
+ להחליף את הקבצים?
+ אין אפשרות לשתף את הקבצים
+ עדיין לא הגדרת כספת. צור כספת חדשה בעזרת אפליקציית Cryptomator.
+ אישור
+ צור כספת חדשה
+ הקובץ %1$s לא נתמך
+ לא נמצאה אפליקצייה שיכולה להציג את הקובץ. האם תרצה לשמור קובץ זה על המכשיר?
+ שנה שם כספת
+ שנה שם תיקיה
+ שינוי שם קובץ
+ יש לך שינויים שלא נשמרו
+ אתה בטוח שברצנוך לצאת מבלי לשמור את השינויים שביצעת?
+ ביטול
+ text.txt
+ אתה בטוח שברצונך למחוק כספת זו?
+ פעולה זו תעלים את הכספת מהרשימה, אך לא תמחק אותה לחלוטין ממקום האחסון.
+ שולח…
+ קובץ %1$d מתוך %2$d
+ מיצא (%2$d/%1$d)
+ אנא המתן…
+ יוצר תיקייה…
+ יוצר קובץ טקסט…
+ אימות…
+ משנה שם…
+ מוחק…
+ פותח כספת…
+ משנה סיסמה…
+ יוצר כספת…
+ שולח…
+ מוריד…
+ מצפין…
+ מפענח…
+ מעביר…נעילה
+ תעודת SSL לא חוקית
+ תעודת SSL לא חוקית. תרצה לבטוח בתעודה זו בכל מקרה?
+ פרטים
+ פעולה זו יכולה לגרום לפרצות אבטחה. אני מבין מהם ההשלכות.
+ HTTP הוא פרוטוקול לא מאובטח. אנו ממליצים להשתמש ב HTTPS במקום. אם אתה מבין את הסיכונים בכך, אתה יכול להמשיך להשתמש ב HTTP.
+ עבור ל-HTTPS
+ להשתמש ב-HTTPS?
+ שים לב
+ הפעל
+ שים לב
+ כבה
+ אפליקציה אחרת מציגה משהו מעל Cryptomator (לדוגמה, אפליקציית סינון אור כחול למצב לילה). מטעמי אבטחה, Cryptomator ייסגר עכשיו.\n\nאיך להפעיל את Cryptomatorסגור
+ למחוק %1$d פריטים?
+ אתה בטוח שברצונך למחוק קבצים אלו?
+ אתה בטוח שברצונך למחוק קובץ זה?
+ אתה בטוח שברצונך למחוק תיקייה זו? הפעולה תמחק גם את כל הקבצים שנמצאים בתוך התיקייה.
+ האימות הביומטרי בוטל
+ שימוש במפתח רישיון
+ זיהינו שהתקנת את Cryptomator לא דרך ה-Google Play Store. להפעלת האפליקציה, יש להכניס מפתח רישיון. ניתן לרכוש מפתח ב-https://cryptomator.org/android/
+ המפתח לא אומת. וודא כי הזנת אותו כהלכה.
+ לא הוזן מפתח, אנא הזן מפתח רישיון תקין.
+ יציאה
+ מפתח הרישיון אומת
+ תודה %1$s, על כך שהזנת מפתח רישיון תקין.
+ עדכון זמין
+ עדכן לגרסה החדשה ביותר של Cryptomator. לאחר שתסכים, העדכון ירד ברקע וכשההורדה תסתיים, תתבקש לבצע את ההתקנה.
+ עדכן עכשיו
+ למעבר לאתר הההורדות
+ מאוחר יותר
+ מוריד
+ מוריד את הגרסה העדכנית ביותר של Cryptomator
+ התיקייה היא קישור סימבולי
+ לא ניתן לנווט אל תוך קישור סימבולי זהחזור
+ טעינת תיקייה זו נכשלה
+ אין עוד תמונות להציג…
+ אם ברצונך להוסיף משתמש pCloud נוסף, לחץ על הקישור www.pcloud.com, התנתק מהמשתמש הנוכחי ולחץ על ה \'+\' באפליקצייה כדי להוסיף חיבור חדש.
+ Cryptomator זקוק להרשאת גישה לזיכרון המכשיר כדי להשתמש בכספת מקומית
+ Cryptomator זקוק להרשאת גישה לזיכרון המכשיר כדי לבצע העלאה אוטומטית של תמונות
+ 0 kB
+ bytes
+ kB
+ MB
+ GB
+ TB
+ שנייה
+ שניות
+ דקה
+ דקות
+ שעה
+ שעות
+ יום
+ ימים
+ שבוע
+ שבועות
+ חודש
+ חודש
+ שנה
+ שנים
+ אימות ביומטרי
+ התחבר באמצעות אימות ביומטרי
+ השתמש בסיסמת הכספת
+ לא ניתן לבצע העלאה אוטומטית של קבצים
+ כספות פתוחות: %1$d
+ נעילה אוטומטית בעוד %1$s
+ נעל הכל
+ בטל העלאה
+ מתבצעת העלאה אוטומטית של תמונות
+ מעלה %1d/%2d
+ העלאה אוטומטית של תמונות הסתיימה
+ העלאה אוטומטית של תמונות נכשלה
+ הכספת המוגדרת להעלאה אוטומטית של קבצים לא קיימת יותר.
+ הגרסה העדכנית ביותר מותקנת
+ מטמון
+ נפח מטמון
+ נקה מטמון
+ רשום עבור
+ %1$s
+ בדוק עדכונים אוטומטית
+ חפש עדכונים
+ בדיקה אחרונה %1$s
+ גודל המטמון עבור כל שירות ענן
+ מיידי
+ דקה
+ 2 דקות
+ 5 דקות
+ 10 דקות
+ אף פעם
+ 50 MB
+ 100 MB
+ 250 MB
+ 500 MB
+ 1 GB
+ 5 GB
+ עיצוב
+ אוטומטי (לפי מערכת הפעלה)
+ בהיר
+ כהה
+ פעם ביום
+ פעם בשבוע
+ פעם בחודש
diff --git a/presentation/src/main/res/values-ja-rJP/strings.xml b/presentation/src/main/res/values-ja-rJP/strings.xml
index f4c66fafc..98e936300 100644
--- a/presentation/src/main/res/values-ja-rJP/strings.xml
+++ b/presentation/src/main/res/values-ja-rJP/strings.xml
@@ -9,7 +9,7 @@
ネットワーク接続がありませんパスワードが正しくありませんファイルかフォルダーが既に存在します。
- サポートされない金庫です。この金庫は別のバージョンの Cryptomator を使用して作成されました。
+ サポートされない金庫です。この金庫は別のバージョンの Cryptomator で作成されました。金庫が既に存在します。ファイルが存在しません。金庫が施錠されました。
@@ -20,18 +20,18 @@
エクスポートに失敗しました。ファイル名から特殊文字を削除して再度エクスポートしてください。特殊文字を含めることはできません。特殊文字を含むファイル名は使用できません。
- 特殊文字を含む金庫名は使用できません。
+ 金庫名に特殊文字を含めることはできません。更新の確認に失敗しました。エラーが発生しました。更新の確認に失敗しました。ハッシュ値がアップロードされたファイルと一致しません。更新の確認に失敗しました。インターネット接続がありません。WebDAV パスワードの復号に失敗しました。設定を再度追加してください
- Google Play Services がインストールされていません
+ Google Playサービスがインストールされていません生体認証が中断されました%1$s で指定されたバージョンが %2$s と異なります%1$s はこの %2$s と一致しません金庫の設定を読み込み中に失敗しました
- Bucket がありません
- 自由に Masterkey の場所を設定することはまだできません
+ バケットがありません
+ 好きな場所に Masterkey を置くことはまだできませんローカルストレージ
@@ -40,10 +40,11 @@
ファイルをエクスポートするには、Cryptomator がストレージにアクセスする許可が必要ですファイルをアップロードするには、Cryptomator がストレージにアクセスする許可が必要ですファイルを共有するには、Cryptomator がストレージにアクセスする許可が必要です
+ Cryptomator がこの場所にアクセスする権限がなくなりました。このフォルダーを再度選択して権限を再度取得してください。設定検索戻る
- 次へ
+ 進むソートA - ZZ - A
@@ -76,16 +77,16 @@
テキスト ファイルを作成ファイルをアップロードファイル
- エクスポートされたファイル
- エクスポートされたファイル
+ ファイルをエクスポートしました
+ ファイルをエクスポートしましたエクスポートするものがありません
- ダウンロード ディレクトリの作成に失敗しました
+ ダウンロードディレクトリの作成に失敗しました共有
- 名前の変更
+ 名前を変更編集エクスポート削除
- 次で開く…
+ …で開くアイテムを選択%1$d 個選択済み選択
@@ -100,15 +101,15 @@
テキストファイルファイル
- ファイル名は重複しない必要があります。名前を変更してください
+ ファイル名は重複してはなりません。名前を変更してください保存先保存暗号化が完了しました
- クラウド サービス
+ クラウド・サービス接続先を選択
- ここをタップして場所を追加する
+ ここをタップして接続先を追加するサーバーに WebDAV との互換性がありません追加の利用できる保存先はありません。
@@ -122,16 +123,16 @@
パスワードは空にできません。表示名
- 接続キー
- 秘密鍵
- 既存の Bucket
+ アクセスキー
+ シークレットキー
+ 既存のバケットエンドポイント
- 地域
+ リージョン表示名は空にできません
- 接続キーは空にできません
- 秘密キーは空にできません
- Bucket は空にできません
- エンドポイントまたは地域は空にできません
+ アクセスキーは空にできません
+ シークレットキーは空にできません
+ バケットは空にできません
+ エンドポイントまたはリージョンは空にできません金庫名は空にできません。金庫の名前
@@ -149,10 +150,10 @@
非常に強い基本設定
- クラウド サービス
+ クラウド・サービス生体認証生体認証を有効にする
- 顔認証のロック解除 (利用できる場合)
+ 顔認証のロック解除(利用できる場合)他のアプリが重なるときにアプリを停止入力をブロックし、偽のユーザー インターフェイスを表示するスクリーンショットをブロック
@@ -163,7 +164,7 @@
glob パターンを使用して検索alice.*.jpg のような glob パターン一致を使用する自動的な施錠
- 次の場合にロックする
+ 次の場合に施錠する画面がロックされたとき自動的に画像をアップロードアップロードする金庫を選択
@@ -172,7 +173,7 @@
インスタントをアップロード金庫が解錠されているときに直接アップロードWIFI を使用しているときのみアップロード
- ビデオをアップロード
+ 動画をアップロード… へのファイルの自動アップロードを保存Cryptomator のウェブサイトTwitter でフォローする
@@ -183,11 +184,12 @@
サポートヘルプを求めるデバッグ モード
- ログ ファイルを送信
+ ログファイルを送信送信できませんでした
- セキュリティのヒント
+ セキュリティの心得バージョン高度な設定
+ 高速な解錠パスワードまたは生体による認証中に、バックグラウンドで金庫の設定をダウンロードします解錠したままにするファイルの編集中は金庫を解錠しておく
@@ -195,13 +197,13 @@
WebDAV 接続pCloud 接続S3 接続
- ローカル ストレージの場所
+ ローカル・ストレージの場所ログイン次からサインアウト%1$s は認証できませんでした。
- pCloud 資格情報を更新
+ pCloud アカウント情報を更新キャンセル
@@ -223,7 +225,7 @@
すべて置換今のものを置き換える置換
- ファイル名 \"%1$s\" が既に存在します。置き換えますか?
+ ファイル名 \"%1$s\" が既に存在します。上書きしますか?すべてのファイルが既に存在します。すべて置き換えますか?%1$d ファイルが既に存在します。すべて置き換えますか?ファイルを置き換えますか?
@@ -236,7 +238,7 @@
このファイルを開くことができるアプリをダウンロードしてください。それともデバイスに保存しますか?金庫の名前を変更フォルダーの名前を変更
- ファイルの名前を変更
+ ファイル名を変更保存していない変更があります保存せずに終了してもよろしいですか?破棄
@@ -264,55 +266,56 @@
不正な SSL 証明書ですSSL 証明書が無効です。それでも信頼しますか?詳細
- これはセキュリティ リスクになる可能性があります。リスクについて理解していますか
- HTTP の使用は安全ではありません。代わりに HTTPS を使用することを推奨します。リスクを承知の上であれば HTTP をご使用ください。
- HTTPS に変更
- HTTPS を使用しますか?
+ これはセキュリティリスクになる可能性があります。リスクについて理解していますか
+ HTTP は安全ではありません。代わりに HTTPS を使用することを推奨します。リスクを承知の上であれば HTTP をご使用ください。
+ HTTPS を使用
+ HTTPS を使用しますか?画面ロックが設定されていません。認証情報を安全に保存するには、パターンまたはパスワードを設定してください。
- 画面ロックを設定しますか?
+ 画面ロックを設定しますか?画面ロックを設定システムに基本的な認証が設定されていませんこのサービスを利用するには少なくとも 1 つの指紋/顔を登録してください。このモードでは、デバイスのログファイルに機密情報が書き込まれることがあります(例: ファイル名やパス)。パスワードや cookie 等は除外されます。\n\n できるだけ早くデバッグ モードを無効化をすることを忘れないでください。注意
- 有効
+ 有効にするこの設定は安全のための機能です。他のアプリがユーザーを騙してしまうことを防ぎます。\n\n無効にすることで、 リスクを認識していること に留意する必要があります。注意無効アプリが重なっています
- 他のアプリケーションが Cryptomator の上に何かを表示しています (例: ブルーライト フィルターや night mode アプリ)。このため、セキュリティの観点から Cryptomator が無効化されています。\n\nCryptomator を有効にするには
+ 他のアプリケーションが Cryptomator の上に何かを表示しています(例: ブルーライト フィルターやナイト・モードアプリ)。このため、セキュリティの観点から Cryptomator が無効化されています。\n\nCryptomator を有効にするには閉じる%1s クラウンドの金庫を再追加してください金庫がクラウト接続のルート フォルダーですこの設定は安全のための機能です。他のアプリがユーザーを騙してしまうことを防ぎます。\n\n無効にすることで、 リスクを認識していること に留意する必要があります。本当にこのクラウド接続を削除しますか?この操作により、クラウド接続とクラウドのすべての金庫が削除されます。
- %1$d 個の項目を削除しますか?
- 本当にこれらの項目を削除してもよろしいですか?
+ %1$d 個の項目を削除しますか?
+ 本当にこれらの項目を削除してもよろしいですか?本当にこのファイルを削除してもよろしいですか?
- この操作はフォルダーの内容をすべて削除します。本当にこのフォルダーを削除してもよろしいですか?
+ この操作はフォルダーの内容をすべて削除します。本当にこのフォルダーを削除してもよろしいですか?生体認証機能が無効になりました
- 鍵が無効になったため、生体認証が無効になりました。再度有効にするには、Cryptomator 設定を開いてください。
+ 鍵が無効になったため、生体認証が無効になりました。再度有効にするには、Cryptomator の設定を開いてください。有効なライセンスを入力してください
- Google Play Store を使用せずに Cryptomator をインストールしたことを検出しました。有効なライセンスを購入してください: https://cryptomator.org/android/
+ Google Play ストアを使用せずに Cryptomator をインストールしたことを検出しました。有効なライセンスを購入してください: https://cryptomator.org/android/入力されたライセンスが無効です。正しく入力されていることを確認してください。ライセンスがありません。有効なライセンスを入力してください。終了
- ライセンスの確認
+ ライセンスの確認を完了%1$s-san 有効なライセンスを入力していただきありがとうございます。 利用可能なアップデートがありますCryptomator を最新のバージョンに更新します。OK を押すとバックグラウンドでアプリがダウンロードされ、インストール可能になると通知されます。すぐに更新
- ダウンロード サイトに行く
+ ダウンロードサイトに行くあとでダウンロード中Cryptomator の最新バージョンをダウンロード中
- フォルダがシンボリック リンクです
- このシンボリック リンクに移動することはできません
+ フォルダがシンボリックリンクです
+ このシンボリックリンクに移動することはできません戻るディレクトリのコンテンツを読み込むことができません表示する画像がありません…\'%1$s\' の資格情報が更新されました
+ pCloud アカウントを追加するには、次のリンクをクリックしてください www.pcloud.com。現在のアカウントからログアウトし、このアプリの「+」を再度クリックして、新しいクラウド接続を作成してください。ローカルの金庫を使用するには、Cryptomator がストレージにアクセスする許可が必要です自動的に画像をアップロードするには、Cryptomator がストレージにアクセスする許可が必要です
@@ -355,7 +358,9 @@
%1$d 個の画像を金庫にアップロードしました写真の自動アップロードが失敗しましたアップロード中にエラーが発生しました。
+ アップロード用として選択されたフォルダーを利用できません。設定に移動して新しいフォルダーを選択してください。アップロード中は金庫が施錠されます。続けるには金庫を再度開いてください。
+ 自動アップロードに設定された金庫が存在しません。書き込み可能なファイルを開く編集が完了するまで金庫は施錠されます最新バージョンがインストールされました
@@ -370,12 +375,12 @@
最終実行 %1$sクラウドごとのキャッシュ サイズ
- インスタント
- 1分
- 2分
- 5分
- 10分
- 無期限
+ 即時
+ 1分経過後
+ 2分経過後
+ 5分経過後
+ 10分経過後
+ ロックしない50 MB100 MB
@@ -385,7 +390,7 @@
5 GB外観
- 自動 (システムに従う)
+ 自動(システムに従う)ライトダーク
diff --git a/presentation/src/main/res/values-nb-rNO/strings.xml b/presentation/src/main/res/values-nb-rNO/strings.xml
index d1342c6ff..358be81a8 100644
--- a/presentation/src/main/res/values-nb-rNO/strings.xml
+++ b/presentation/src/main/res/values-nb-rNO/strings.xml
@@ -22,11 +22,18 @@
Filnavn kan ikke inneholde spesialtegn.Navn på hvelvet kan ikke inneholde spesialtegn.Oppdateringskontrollen mislyktes. Det oppstod en generell feil.
+ Oppdateringskontrollen mislyktes. Den beregnede hash-koden stemmer ikke med den opplastede filen
+ Biometrisk autentisering avbrutt
+ Egendefinert posisjon for Masterkey er foreløpig ikke støttetLokal lagring
+ Cryptomator trenger lagringstilgang for å eksportere filer
+ Cryptomator trenger lagringstilgang for å laste opp filer
+ Cryptomator trenger lagringstilgang for å dele filer
+ Cryptomator har mistet tilgangen til denne plasseringen. Velg mappen på nytt for å gjenopprette tillatelsen.InnstillingerSøkForrige
@@ -68,6 +75,7 @@
EksporterSlettÅpne med…
+ Velg elementer%1$d valgtVelg alleOppdater
@@ -80,7 +88,9 @@
tekstfilfiler
+ Filnavnene må være unike, velg nye navn på duplikatene.Lagre
+ Kryptering fullførtSkylagringstjeneste
@@ -88,12 +98,21 @@
URLBrukernavnPassord
+ URL-adressen kan ikke være tomt.
+ Brukernavnet kan ikke være tomt.
+ Passordet kan ikke være tomt.
+ Visningsnavn
+ Visningsnavn kan ikke være tomt
+ Tilgangsnøkkel kan ikke være tom
+ Hemmelig nøkkel kan ikke være tom
+ Navnet på hvelvet kan ikke være tomt.HvelvnavnOpprettAngi passord
+ Passordene stemmer ikke overens.FerdigGjenta passordetSvakt
@@ -103,6 +122,9 @@
GenereltSkylagringstjenester
+ Biometrisk autentisering
+ Aktiver biometrisk autentisering
+ Bekreft ansiktsopplåsing (hvis tilgjengelig)SøkLås etterAktiver
diff --git a/presentation/src/main/res/values-nl-rNL/strings.xml b/presentation/src/main/res/values-nl-rNL/strings.xml
index b7d858230..9555ccd2f 100644
--- a/presentation/src/main/res/values-nl-rNL/strings.xml
+++ b/presentation/src/main/res/values-nl-rNL/strings.xml
@@ -199,6 +199,7 @@
Ontgrendeld houdenHoud kluizen ontgrendeld tijdens het bewerken van bestanden
+ OneDrive verbindingenWebDAV verbindingenpCloud verbindingenS3 verbindingen
@@ -372,6 +373,7 @@
Open schrijfbaar bestandKluis blijft ontgrendeld tot het bewerken voltooid isLaatste versie geïnstalleerd
+ Verifiëren…CacheBewaar recent geopende bestanden versleuteld en lokaal op het apparaat voor later hergebruikTotale cache grootte
diff --git a/presentation/src/main/res/values-pl-rPL/strings.xml b/presentation/src/main/res/values-pl-rPL/strings.xml
index 06ad41373..0a34f5930 100644
--- a/presentation/src/main/res/values-pl-rPL/strings.xml
+++ b/presentation/src/main/res/values-pl-rPL/strings.xml
@@ -201,6 +201,7 @@
Zachowaj odblokowanyZachowaj odblokowane sejfy podczas edycji plików
+ Połączenia OneDrivePołączenia WebDAVPołączenia pCloudPołączenia S3
@@ -374,6 +375,7 @@
Otwórz plik zapisywalnySejf pozostaje odblokowany do czasu zakończenia edycjiZainstalowano najnowszą wersję
+ Uwierzytelnianie…Pamięć podręcznaPamięć podręczna ostatnio uruchomionych plików zaszyfrowanych lokalnie na urządzeniu w celu ponownego użycia po ponownym otwarciuRozmiar całkowity pamięci podręcznej
diff --git a/presentation/src/main/res/values-pt-rBR/strings.xml b/presentation/src/main/res/values-pt-rBR/strings.xml
index 0e1818565..15ba8d4a7 100644
--- a/presentation/src/main/res/values-pt-rBR/strings.xml
+++ b/presentation/src/main/res/values-pt-rBR/strings.xml
@@ -41,6 +41,7 @@
Cryptomator precisa de permissão de acesso ao armazenamento para exportar arquivosCryptomator precisa de permissão de acesso ao armazenamento para fazer upload de arquivosCryptomator precisa de permissão de acesso ao armazenamento para compartilhar arquivos
+ O Cryptomator perdeu a permissão para acessar este local. Por favor, selecione esta pasta novamente para restaurar sua permissão.ConfiguraçõesBuscarAnterior
@@ -198,6 +199,7 @@
Manter desbloqueadoMantenha cofres desbloqueados durante a edição de arquivos
+ Conexões OneDriveConexões WebDAVconexões pCloudConexões S3
@@ -288,6 +290,10 @@
O aplicativo está escuroOutro aplicativo está exibindo algo no topo do Cryptomator (por exemplo, um filtro de luz azul ou aplicativo de modo noturno). Por razões de segurança, o Cryptomator está desativado.\n\nComo ativar o CryptomatorFechar
+ Por favor, readicione cofres para %1s nuvem
+ Durante a migração para esta versão do aplicativo, precisamos remover os seguintes cofres do aplicativo:\n%2s \n\nEsses cofres não são removidos da nuvem, mas apenas deste aplicativo. Desculpe o incômodo e por favor adicione novamente estes cofres para continuar a trabalhar com eles.
+ O cofre é a pasta raiz da conexão com a nuvem
+ Crie uma nova conexão com a nuvem onde você seleciona pelo menos a pasta principal desta pasta de cofre como o diretório raiz para adicionar este cofre.Esta configuração é um recurso de segurança e impede que outros aplicativos induzam os usuários a fazer coisas que não devem fazer.\n\nAo desativar, você confirma que está ciente dos riscos.Tem certeza de que deseja remover esta conexão com a nuvem?Esta ação removerá a conexão com o provedor de nuvem e todos os cofres desta nuvem.
@@ -367,6 +373,7 @@
Abrir arquivo gravávelCofre permanece desbloqueado até terminar de editarVersão mais recente instalada
+ Autenticando…CacheCache de arquivos acessados recentemente criptografados localmente no dispositivo para reutilização posterior quando reabertoTamanho total do cache
diff --git a/presentation/src/main/res/values-pt-rPT/strings.xml b/presentation/src/main/res/values-pt-rPT/strings.xml
index 2230353ad..092fbf672 100644
--- a/presentation/src/main/res/values-pt-rPT/strings.xml
+++ b/presentation/src/main/res/values-pt-rPT/strings.xml
@@ -40,6 +40,7 @@
Geral
+ Conexões do OneDrive
@@ -56,6 +57,7 @@
+ Autenticação…
diff --git a/presentation/src/main/res/values-ru-rRU/strings.xml b/presentation/src/main/res/values-ru-rRU/strings.xml
index 4cd391699..fa3baf338 100644
--- a/presentation/src/main/res/values-ru-rRU/strings.xml
+++ b/presentation/src/main/res/values-ru-rRU/strings.xml
@@ -201,6 +201,7 @@
Держать разблокированнымНе блокировать при редактировании
+ Подключения OneDriveПодключения WebDAVПодключения pCloudПодключения S3
@@ -374,6 +375,7 @@
Открыть файл, доступный для записиХранилище разблокировано до завершения редактированияУстановлена новейшая версия
+ Аутентификация…КэшКэшировать зашифрованные локально на устройстве файлы, к которым недавно был доступ, для последующего использования при повторном открытииОбщий размер кэша
diff --git a/presentation/src/main/res/values-sk-rSK/strings.xml b/presentation/src/main/res/values-sk-rSK/strings.xml
index 5220bfdf9..2ee484c1d 100644
--- a/presentation/src/main/res/values-sk-rSK/strings.xml
+++ b/presentation/src/main/res/values-sk-rSK/strings.xml
@@ -3,7 +3,7 @@
Zašifrovať
- Vyskytol sa problém
+ Vyskytla sa chybaNeúspešná autentikáciaNeúspešná autentikácia, prosím prihláste sa pomocou %1$sChýba sieťové pripojenie
@@ -16,11 +16,11 @@
Cloud už existuje.Prosím stiahnite takú aplikáciu ktorá dokáže otvoriť tento súbor.Server nenájdený.
- Prosím otvorte nastavenia zaridenia a nastavte uzamykanie obrazovky ručne
+ Prosím otvorte nastavenia zariadenia a nastavte uzamykanie obrazovky ručneExport neúspešný. Pokúste sa odstrániť špeciálne znaky z názvov súborov a exportujte znovu.Nemôže obsahovať špeciálne znaky.
- Názvy súborov nesmú obsahovať špecálne znaky.
- Meno trezoru nemôže obsahovať špecálne znaky.
+ Názvy súborov nesmú obsahovať špeciálne znaky.
+ Meno trezoru nemôže obsahovať špeciálne znaky.Kontrola aktualizácie zlyhala. Vyskytol sa problém.Kontrola aktualizácie zlyhala. Vypočítaný hash nekorešponduje s nahratým súboromKontrola aktualizácie zlyhala. Neexistuje spojenie s internetom.
@@ -31,7 +31,7 @@
%1$s nezodpovedá s týmto %2$sChyba počas zavádzania konfigurácie trezoraLokálny súbor nie je viac prezentovaný po prepnutí naspäť do Cryptomator-a. Možné zmeny sa neprenesú späť do cloudu.
- Žiadna taká nádoba
+ Bucket neexistujeVoliteľnost umiestnenia hlavného kľúča zatiaľ nie je podporovaná
@@ -59,7 +59,7 @@
Vytvoriť nový trezorPridať existujúci trezorOdstrániť
- Sem kliknúť pre vytvorenie nového trezoru
+ Kliknite sem pre vytvorenie nového trezoraHeslo úspešne zmenenéTrezor
@@ -132,13 +132,13 @@
Zobrazované menoPrístupový kľúčTajný kľúč
- Existujúce vedro
+ Existujúci bucketKoncový bodRegiónZobrazované meno nemôže byť prázdnePrístupový kľúč nemôže byť prázdnyTajný kľúč nesmie byť prázdny
- Vedro nemôže byť prázdne
+ Bucket nemôže byť prázdnyKoncový bod alebo región nemôže byť prázdnyMeno trezora nemôže byť prázdne.
@@ -163,8 +163,8 @@
Potvrďte odomykanie tvárou (ak je dostupné)Blokovanie aplikácie pri zatemneníBlokovanie zachytávania vstupu a zobrazovania falošného uživateľského rozhrania
- Blokovanie snímkov obrazovky
- Blokovanie snímkov obrazovky v nedávnom zozname a vo vnútri aplikácie
+ Blokovanie vytvorenia snímkov obrazovky
+ Zakázať vytváranie snímkov obrazovky v tejto aplikácii a v zozname bežiacich aplikáciíHľadaťŽivé vyhľadávanieAktualizovať výsledky hľadania počas zadávania otázky
@@ -201,6 +201,7 @@
Držať odomknutéDržať trezory odomknuté pokiaľ sa editujú súbory
+ OneDrive pripojeniaWebDAV pripojeniapCloud pripojeniaS3 pripojenia
@@ -292,7 +293,7 @@
Ďalšia aplikácia zobrazuje niečo na vrchu Cryptomator-a (ako napr. modré svetlo alebo nočný režim). Z bezpečnostných dôvodov je Cryptomator zakázaný.\n\nAko povoliť CryptomatorZavrieťProsím zadajte znovu trezory pre %1s cloud
- Počas migrácie na túto verziu aplikácie potrebujeme odstrániť nasledujúce trezory z aplikácie:\n%2s \n\n Tieto trezory nebudú odstránené z clodu ale len z tejto aplikácie. Prepáčte za nepohodlie a prosím znovu zadajte trezory pre pokračovanie ich používania.
+ Počas migrácie na túto verziu aplikácie potrebujeme odstrániť nasledujúce trezory z aplikácie:\n%2s \n\n Tieto trezory nebudú odstránené z cloudu, ale len z tejto aplikácie. Prepáčte za nepohodlie a prosím znovu zadajte trezory pre pokračovanie ich používania.Trezor je koreňovým adresárom cloudového spojeniaVytvorte nové cloudové pripojenie kde vyberiete minimálne nadradený adresár tohto trezora ako koreňový adresár pre pridanie tohot trezora.Toto nastavenie je bezpečnostná vlastnosť a zabraňuje ostatným aplikáciám klamať užívateľov robiť veci čo nechcú robiť.\n\nVypnutím súhlasíte s tým žeste si vedomí rizika.
@@ -304,11 +305,11 @@
Toto zmaže obsah celého adresára. Ste si istý že chcete zmazať tento adresár?Funkcia biometrickej autentikácie je deaktivovanáPretože kľúč bol zneplatnený, funkcia biometrickej autentikácie bola deaktivovaná. Pre opätovné povolenie, otvorte nastavenia Cryptomator-a.
- Poskytnite platnú licenciu
+ Zadajte platný licenčný kľúčDetekovali sme že máte nainštalovaný Cryptomator bez použitia Google Play Store. Poskytnite platnú licenciu, ktorá bola zakúpená v https://cryptomator.org/android/Poskytnutá licencia nie je platná. Uistite sa či bola zadaná korektne.Licencia neposkytnutá. Prosím zadajte platnú licenciu.
- Výstup
+ UkončiťPotvrdenie licencieĎakujeme %1$s za poskytnutie Vašej platnej licencie.Aktualizácia k dispozícii
@@ -374,6 +375,7 @@
Otvoriť zapisovateľný súborTrezor zostáva odomknutý pokial nie je ukončené editovanieNajnovšia verzia inštalovaná
+ Autentikujem…Vyrovnávacia pamäťNedávno sprístupnené súbory vyrovnávaciej pamäťe lokálne zašifrované na zariadení pre neskoršie použitie pri novom otvoreniCelková veľkosť vyrovovnávacej pamäte
diff --git a/presentation/src/main/res/values-th-rTH/strings.xml b/presentation/src/main/res/values-th-rTH/strings.xml
index 0c5cc3282..b3ae0ca6e 100644
--- a/presentation/src/main/res/values-th-rTH/strings.xml
+++ b/presentation/src/main/res/values-th-rTH/strings.xml
@@ -6,9 +6,11 @@
+ ถัดไป
+ Vault
@@ -17,13 +19,19 @@
+ เสร็จสิ้น
+ ยกเลิก
+ ปลดล็อก
+ ล็อก
+ ปิด
+ ย้อนกลับ
diff --git a/presentation/src/main/res/values-tr-rTR/strings.xml b/presentation/src/main/res/values-tr-rTR/strings.xml
index d6d099f45..19a9f8ba3 100644
--- a/presentation/src/main/res/values-tr-rTR/strings.xml
+++ b/presentation/src/main/res/values-tr-rTR/strings.xml
@@ -4,10 +4,10 @@
ŞifreleBir hata oluştu
- Kullanıcı adı veya şifre yanlış
+ Kimlik doğrulaması başarısız olduKimlik doğrulama başarısız, lütfen %1$s kullanarak giriş yapınızAğ bağlantısı yok
- Şifre yanlış
+ Şifre hatalıDosya veya klasör zaten var.Kasa Desteklenmiyor. Bu kasa, Cryptomator\'un başka bir sürümüyle oluşturuldu.Kasa zaten var.
@@ -199,6 +199,7 @@
Kilidi açık tutDüzenlerken kasa kilidi açık
+ OneDrive bağlantılarıWebDAV bağlantılarıpCloud bağlantılarıS3 bağlantıları
@@ -372,6 +373,7 @@
Yazılabilir dosyayı açDüzenleme tamamlanana kadar, uygulamalar kasası kilidi açık kalırEn son sürüm yüklendi
+ Doğrulanıyor…ÖnbellekYeniden açıldıklarında daha sonra yeniden kullanılmak üzere, cihazda yerel olarak şifrelenmiş yakın zamanda erişilen dosyaları önbelleğe alınToplam önbellek boyutu
diff --git a/presentation/src/main/res/values-uk-rUA/strings.xml b/presentation/src/main/res/values-uk-rUA/strings.xml
index ebe8f04aa..9cd2874e9 100644
--- a/presentation/src/main/res/values-uk-rUA/strings.xml
+++ b/presentation/src/main/res/values-uk-rUA/strings.xml
@@ -250,18 +250,42 @@
Файл %1$d з %2$dЗавантаження…Заблокувати
+ Використовувати HTTPS?
+ Увімкнути
+ ВимкнутиЗакритиЦя дія видалить підключення до хмари та всі сховища з цієї хмари.Видалити %1$d об\'єкти?Ви впевнені, що бажаєте видалити ці об\'єкти?Ви впевнені, що бажаєте видалити цей файл?
+ Вийти
+ Оновити зараз
+ Перейти на сторінку завантаження
+ ПізнішеНазад
+ секунда
+ секунд
+ хвилину
+ хвилин
+ годин
+ годин
+ день
+ днів
+ тиждень
+ тижнів
+ місяць
+ місяців
+ рік
+ років
+ Біометричний вхід
+ Зареєстровано за
+ Перевiрити наявнiсть оновлень
diff --git a/presentation/src/main/res/values-zh-rCN/strings.xml b/presentation/src/main/res/values-zh-rCN/strings.xml
index 444d8f4ec..ea58d5ffa 100644
--- a/presentation/src/main/res/values-zh-rCN/strings.xml
+++ b/presentation/src/main/res/values-zh-rCN/strings.xml
@@ -198,6 +198,7 @@
保持解锁状态编辑文件时保持保险库解锁
+ OneDrive 连接WebDAV 连接pCloud 连接S3 连接
@@ -371,6 +372,7 @@
打开可写文件编辑期间保险库保持解锁已安装最新版本
+ 正在验证 …缓存缓存最近在本地加密的访问文件,用以下次快速加载缓存总大小
diff --git a/presentation/src/main/res/values-zh-rHK/strings.xml b/presentation/src/main/res/values-zh-rHK/strings.xml
new file mode 100644
index 000000000..0c5cc3282
--- /dev/null
+++ b/presentation/src/main/res/values-zh-rHK/strings.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml
index 243af0ee4..03d574f8c 100644
--- a/presentation/src/main/res/values/strings.xml
+++ b/presentation/src/main/res/values/strings.xml
@@ -282,6 +282,7 @@
@string/screen_settings_cloud_settings_label
+ OneDrive connectionsWebDAV connectionspCloud connectionsS3 connections
@@ -546,6 +547,8 @@
Latest version installed
+ Authenticating…
+
Cache@string/screen_settings_section_auto_photo_upload_toggleCache recently accessed files encrypted locally on the device for later reuse when reopened
diff --git a/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt
index 7e12859bc..f84f0af1c 100644
--- a/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt
+++ b/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt
@@ -9,9 +9,16 @@ import android.widget.Toast
import com.dropbox.core.android.Auth
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential
import com.google.api.services.drive.DriveScopes
-import org.cryptomator.data.cloud.onedrive.OnedriveClientFactory
-import org.cryptomator.data.cloud.onedrive.graph.ClientException
-import org.cryptomator.data.cloud.onedrive.graph.ICallback
+import com.microsoft.identity.client.AuthenticationCallback
+import com.microsoft.identity.client.IAccount
+import com.microsoft.identity.client.IAuthenticationResult
+import com.microsoft.identity.client.IMultipleAccountPublicClientApplication
+import com.microsoft.identity.client.IPublicClientApplication
+import com.microsoft.identity.client.PublicClientApplication
+import com.microsoft.identity.client.exception.MsalClientException
+import com.microsoft.identity.client.exception.MsalException
+import com.microsoft.identity.client.exception.MsalServiceException
+import com.microsoft.identity.client.exception.MsalUiRequiredException
import org.cryptomator.data.util.X509CertificateHelper
import org.cryptomator.domain.Cloud
import org.cryptomator.domain.CloudType
@@ -35,7 +42,6 @@ import org.cryptomator.generator.Callback
import org.cryptomator.presentation.BuildConfig
import org.cryptomator.presentation.R
import org.cryptomator.presentation.exception.ExceptionHandlers
-import org.cryptomator.presentation.exception.PermissionNotGrantedException
import org.cryptomator.presentation.intent.AuthenticateCloudIntent
import org.cryptomator.presentation.intent.Intents
import org.cryptomator.presentation.model.CloudModel
@@ -151,10 +157,6 @@ class AuthenticateCloudPresenter @Inject constructor( //
finish()
}
- private fun failAuthentication(error: PermissionNotGrantedException) {
- finishWithResult(error)
- }
-
private inner class DropboxAuthStrategy : AuthStrategy {
private var authenticationStarted = false
@@ -271,29 +273,108 @@ class AuthenticateCloudPresenter @Inject constructor( //
private fun startAuthentication(cloud: CloudModel) {
authenticationStarted = true
- val authenticationAdapter = OnedriveClientFactory.getAuthAdapter(context(), (cloud.toCloud() as OnedriveCloud).accessToken())
- authenticationAdapter.login(activity(), object : ICallback {
- override fun success(accessToken: String?) {
- if (accessToken == null) {
- Timber.tag("AuthicateCloudPrester").e("Onedrive access token is empty")
+
+ Toast.makeText(context(), R.string.notification_authenticating, Toast.LENGTH_SHORT).show()
+
+ PublicClientApplication.createMultipleAccountPublicClientApplication(
+ context(),
+ R.raw.auth_config_onedrive,
+ object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener {
+ override fun onCreated(application: IMultipleAccountPublicClientApplication) {
+ application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback {
+ override fun onTaskCompleted(accounts: List) {
+ if (accounts.isEmpty()) {
+ application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud))
+ } else {
+ accounts.find { account -> account.username == cloud.username() }?.let {
+ application.acquireTokenSilentAsync(
+ onedriveScopes(),
+ it,
+ "https://login.microsoftonline.com/common",
+ getAuthSilentCallback(cloud, application)
+ )
+ } ?: application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud))
+ }
+ }
+
+ override fun onError(e: MsalException) {
+ Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts")
+ failAuthentication(cloud.name())
+ }
+ })
+ }
+
+ override fun onError(e: MsalException) {
+ Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration")
failAuthentication(cloud.name())
- } else {
- showProgress(ProgressModel(ProgressStateModel.AUTHENTICATION))
- handleAuthenticationResult(cloud, accessToken)
+ }
+ })
+ }
+
+ private fun getAuthSilentCallback(cloud: CloudModel, application: IMultipleAccountPublicClientApplication): AuthenticationCallback {
+ return object : AuthenticationCallback {
+
+ override fun onSuccess(authenticationResult: IAuthenticationResult) {
+ Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated")
+ handleAuthenticationResult(cloud, authenticationResult.accessToken)
+ }
+
+ override fun onError(e: MsalException) {
+ Timber.tag("AuthenticateCloudPresenter").e(e, "Failed to acquireToken")
+ when (e) {
+ is MsalClientException -> {
+ /* Exception inside MSAL, more info inside MsalError.java */
+ failAuthentication(cloud.name())
+ }
+ is MsalServiceException -> {
+ /* Exception when communicating with the STS, likely config issue */
+ failAuthentication(cloud.name())
+ }
+ is MsalUiRequiredException -> {
+ /* Tokens expired or no session, retry with interactive */
+ application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud))
+ }
}
}
- override fun failure(ex: ClientException) {
- Timber.tag("AuthicateCloudPrester").e(ex)
+ override fun onCancel() {
+ Timber.tag("AuthenticateCloudPresenter").i("User cancelled login")
+ }
+ }
+ }
+
+ private fun getAuthInteractiveCallback(cloud: CloudModel): AuthenticationCallback {
+ return object : AuthenticationCallback {
+
+ override fun onSuccess(authenticationResult: IAuthenticationResult) {
+ Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated")
+ handleAuthenticationResult(cloud, authenticationResult.accessToken, authenticationResult.account.username)
+ }
+
+ override fun onError(e: MsalException) {
+ Timber.tag("AuthenticateCloudPresenter").e(e, "Successfully authenticated")
failAuthentication(cloud.name())
}
- })
+
+ override fun onCancel() {
+ Timber.tag("AuthenticateCloudPresenter").i("User cancelled login")
+ }
+ }
}
private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String) {
getUsernameAndSuceedAuthentication( //
OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) //
- .withAccessToken(accessToken) //
+ .withAccessToken(encrypt(accessToken)) //
+ .build()
+ )
+ }
+
+ private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String, username: String) {
+ getUsernameAndSuceedAuthentication( //
+ OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) //
+ .withAccessToken(encrypt(accessToken)) //
+ .withUsername(username)
.build()
)
}
@@ -558,6 +639,10 @@ class AuthenticateCloudPresenter @Inject constructor( //
companion object {
const val WEBDAV_ACCEPTED_UNTRUSTED_CERTIFICATE = "acceptedUntrustedCertificate"
+
+ fun onedriveScopes(): Array {
+ return arrayOf("User.Read", "Files.ReadWrite")
+ }
}
init {
diff --git a/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java b/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java
index 699008f65..874b49ee9 100644
--- a/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java
+++ b/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java
@@ -1,5 +1,11 @@
package org.cryptomator.presentation.presenter;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static java.util.Arrays.asList;
+
import android.app.Activity;
import org.cryptomator.data.util.NetworkConnectionCheck;
@@ -20,6 +26,7 @@
import org.cryptomator.domain.usecases.vault.RenameVaultUseCase;
import org.cryptomator.domain.usecases.vault.SaveVaultUseCase;
import org.cryptomator.domain.usecases.vault.UnlockToken;
+import org.cryptomator.domain.usecases.vault.UpdateVaultParameterIfChangedRemotelyUseCase;
import org.cryptomator.presentation.exception.ExceptionHandlers;
import org.cryptomator.presentation.model.VaultModel;
import org.cryptomator.presentation.model.mappers.CloudFolderModelMapper;
@@ -37,12 +44,6 @@
import java.util.Collections;
import java.util.List;
-import static java.util.Arrays.asList;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
public class VaultListPresenterTest {
private static final String A_NEW_VAULT_NAME = "Haribo";
@@ -103,6 +104,7 @@ public class VaultListPresenterTest {
private DoLicenseCheckUseCase doLicenceCheckUsecase = Mockito.mock(DoLicenseCheckUseCase.class);
private DoUpdateCheckUseCase updateCheckUseCase = Mockito.mock(DoUpdateCheckUseCase.class);
private DoUpdateUseCase updateUseCase = Mockito.mock(DoUpdateUseCase.class);
+ private UpdateVaultParameterIfChangedRemotelyUseCase updateVaultParameterIfChangedRemotelyUseCase = Mockito.mock(UpdateVaultParameterIfChangedRemotelyUseCase.class);
private NetworkConnectionCheck networkConnectionCheck = Mockito.mock(NetworkConnectionCheck.class);
private FileUtil fileUtil = Mockito.mock(FileUtil.class);
private AuthenticationExceptionHandler authenticationExceptionHandler = Mockito.mock(AuthenticationExceptionHandler.class);
@@ -125,6 +127,7 @@ public void setup() {
doLicenceCheckUsecase, //
updateCheckUseCase, //
updateUseCase, //
+ updateVaultParameterIfChangedRemotelyUseCase, //
networkConnectionCheck, //
fileUtil, //
authenticationExceptionHandler, //
diff --git a/settings.gradle b/settings.gradle
index 6398dc179..cf7883a7d 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,8 +1,7 @@
-include ':generator', ':presentation', ':generator-api', ':domain', ':data', ':util', ':msa-auth-for-android', ':pcloud-sdk-java-root', ':pcloud-sdk-java', ':subsampling-image-view'
+include ':generator', ':presentation', ':generator-api', ':domain', ':data', ':util', ':pcloud-sdk-java-root', ':pcloud-sdk-java', ':subsampling-image-view'
var libFolder = new File(rootDir, 'lib')
-project(':msa-auth-for-android').projectDir = file(new File(libFolder, 'msa-auth-for-android'))
project(':pcloud-sdk-java-root').projectDir = file(new File(libFolder, 'pcloud-sdk-java'))
project(':pcloud-sdk-java').projectDir = file(new File(libFolder, 'pcloud-sdk-java/java-core'))
project(':subsampling-image-view').projectDir = file(new File(libFolder, 'subsampling-scale-image-view/library'))
diff --git a/util/build.gradle b/util/build.gradle
index b2dbdbf01..ab081d0bb 100644
--- a/util/build.gradle
+++ b/util/build.gradle
@@ -3,8 +3,6 @@ apply plugin: 'kotlin-android'
apply plugin: 'de.mannodermaus.android-junit5'
android {
- defaultPublishConfig "debug"
-
def globalConfiguration = rootProject.extensions.getByName("ext")
compileSdkVersion globalConfiguration["androidCompileSdkVersion"]
@@ -24,15 +22,20 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
+ packagingOptions {
+ jniLibs {
+ pickFirsts += ['META-INF/*']
+ }
+ resources {
+ pickFirsts += ['META-INF/*']
+ }
+ }
- lintOptions {
- quiet true
+
+ lint {
abortOnError false
ignoreWarnings true
- }
-
- packagingOptions {
- pickFirst 'META-INF/*'
+ quiet true
}
}