Merge branch 'release/1.6.3'
This commit is contained in:
commit
7a2ccf8379
13
.idea/runConfigurations.xml
generated
13
.idea/runConfigurations.xml
generated
@ -1,13 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="RunConfigurationProducerService">
|
||||
<option name="ignoredProducers">
|
||||
<set>
|
||||
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
|
||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
|
||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
|
||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
|
||||
</set>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
38
Gemfile.lock
38
Gemfile.lock
@ -10,17 +10,17 @@ GEM
|
||||
artifactory (3.0.15)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.509.0)
|
||||
aws-sdk-core (3.121.1)
|
||||
aws-partitions (1.525.0)
|
||||
aws-sdk-core (3.122.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.239.0)
|
||||
aws-partitions (~> 1, >= 1.525.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
jmespath (~> 1.0)
|
||||
aws-sdk-kms (1.48.0)
|
||||
aws-sdk-core (~> 3, >= 3.120.0)
|
||||
aws-sdk-kms (1.51.0)
|
||||
aws-sdk-core (~> 3, >= 3.122.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.103.0)
|
||||
aws-sdk-core (~> 3, >= 3.120.0)
|
||||
aws-sdk-s3 (1.105.0)
|
||||
aws-sdk-core (~> 3, >= 3.122.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.4)
|
||||
aws-sigv4 (1.4.0)
|
||||
@ -40,7 +40,7 @@ GEM
|
||||
dotenv (2.7.6)
|
||||
ed25519 (1.2.4)
|
||||
emoji_regex (3.2.3)
|
||||
excon (0.86.0)
|
||||
excon (0.88.0)
|
||||
faraday (1.8.0)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
@ -63,10 +63,10 @@ GEM
|
||||
faraday-net_http_persistent (1.2.0)
|
||||
faraday-patron (1.0.0)
|
||||
faraday-rack (1.0.0)
|
||||
faraday_middleware (1.1.0)
|
||||
faraday_middleware (1.2.0)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.2.5)
|
||||
fastlane (2.195.0)
|
||||
fastlane (2.197.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
@ -111,7 +111,7 @@ GEM
|
||||
mime-types (~> 3.3)
|
||||
fastlane-plugin-get_version_name (0.2.2)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.11.0)
|
||||
google-apis-androidpublisher_v3 (0.13.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-core (0.4.1)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
@ -122,11 +122,11 @@ GEM
|
||||
retriable (>= 2.0, < 4.a)
|
||||
rexml
|
||||
webrick
|
||||
google-apis-iamcredentials_v1 (0.7.0)
|
||||
google-apis-iamcredentials_v1 (0.8.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-playcustomapp_v1 (0.5.0)
|
||||
google-apis-playcustomapp_v1 (0.6.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-storage_v1 (0.8.0)
|
||||
google-apis-storage_v1 (0.9.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-cloud-core (1.6.0)
|
||||
google-cloud-env (~> 1.0)
|
||||
@ -142,7 +142,7 @@ GEM
|
||||
google-cloud-core (~> 1.6)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (1.0.0)
|
||||
googleauth (1.1.0)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
jwt (>= 1.4, < 3.0)
|
||||
memoist (~> 0.16)
|
||||
@ -154,14 +154,14 @@ GEM
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.8.3)
|
||||
jmespath (1.4.0)
|
||||
json (2.5.1)
|
||||
jwt (2.2.3)
|
||||
json (2.6.1)
|
||||
jwt (2.3.0)
|
||||
memoist (0.16.2)
|
||||
mime-types (3.3.1)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2021.0704)
|
||||
mime-types-data (3.2021.0901)
|
||||
mini_magick (4.11.0)
|
||||
mini_mime (1.1.1)
|
||||
mini_mime (1.1.2)
|
||||
multi_json (1.15.0)
|
||||
multipart-post (2.0.0)
|
||||
nanaimo (0.3.0)
|
||||
|
@ -8,7 +8,7 @@ buildscript {
|
||||
google()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.0.2'
|
||||
classpath 'com.android.tools.build:gradle:7.0.3'
|
||||
classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0'
|
||||
classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.16.0'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
@ -39,7 +39,7 @@ allprojects {
|
||||
ext {
|
||||
androidApplicationId = 'org.cryptomator'
|
||||
androidVersionCode = getVersionCode()
|
||||
androidVersionName = '1.6.2'
|
||||
androidVersionName = '1.6.3'
|
||||
}
|
||||
repositories {
|
||||
mavenCentral()
|
||||
|
@ -8,8 +8,8 @@ allprojects {
|
||||
ext {
|
||||
androidBuildToolsVersion = "30.0.2"
|
||||
androidMinSdkVersion = 24
|
||||
androidTargetSdkVersion = 29
|
||||
androidCompileSdkVersion = 29
|
||||
androidTargetSdkVersion = 30
|
||||
androidCompileSdkVersion = 30
|
||||
|
||||
// android and java libs
|
||||
androidVersion = '4.1.1.4'
|
||||
@ -29,7 +29,7 @@ ext {
|
||||
rxAndroidVersion = '2.1.1'
|
||||
rxBindingVersion = '2.2.0'
|
||||
|
||||
daggerVersion = '2.39'
|
||||
daggerVersion = '2.40'
|
||||
|
||||
gsonVersion = '2.8.8'
|
||||
|
||||
@ -52,7 +52,7 @@ ext {
|
||||
// cloud provider libs
|
||||
cryptolibVersion = '2.0.2'
|
||||
|
||||
dropboxVersion = '4.0.1'
|
||||
dropboxVersion = '5.0.0'
|
||||
|
||||
googleApiServicesVersion = 'v3-rev20210919-1.32.1'
|
||||
googlePlayServicesVersion = '19.2.0'
|
||||
@ -65,7 +65,7 @@ ext {
|
||||
|
||||
msgraphVersion = '2.10.0'
|
||||
|
||||
minIoVersion = '8.3.0'
|
||||
minIoVersion = '8.3.3'
|
||||
staxVersion = '1.2.0' // needed for minIO
|
||||
|
||||
commonsCodecVersion = '1.15'
|
||||
@ -76,8 +76,8 @@ ext {
|
||||
|
||||
jUnitVersion = '5.8.1'
|
||||
assertJVersion = '1.7.1'
|
||||
mockitoVersion = '3.12.4'
|
||||
mockitoKotlinVersion = '3.2.0'
|
||||
mockitoVersion = '4.0.0'
|
||||
mockitoKotlinVersion = '4.0.0'
|
||||
hamcrestVersion = '1.3'
|
||||
dexmakerVersion = '1.0'
|
||||
espressoVersion = '3.4.0'
|
||||
|
@ -82,7 +82,7 @@ android {
|
||||
}
|
||||
|
||||
greendao {
|
||||
schemaVersion 9
|
||||
schemaVersion 10
|
||||
}
|
||||
|
||||
configurations.all {
|
||||
|
@ -50,6 +50,7 @@ class UpgradeDatabaseTest {
|
||||
Upgrade6To7().applyTo(db, 6)
|
||||
Upgrade7To8().applyTo(db, 7)
|
||||
Upgrade8To9(sharedPreferencesHandler).applyTo(db, 8)
|
||||
Upgrade9To10(sharedPreferencesHandler).applyTo(db, 9)
|
||||
|
||||
CloudEntityDao(DaoConfig(db, CloudEntityDao::class.java)).loadAll()
|
||||
VaultEntityDao(DaoConfig(db, VaultEntityDao::class.java)).loadAll()
|
||||
@ -407,4 +408,66 @@ class UpgradeDatabaseTest {
|
||||
|
||||
Assert.assertThat(sharedPreferencesHandler.isBetaModeAlreadyShown(), CoreMatchers.`is`(false))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun upgrade9To10() {
|
||||
Upgrade0To1().applyTo(db, 0)
|
||||
Upgrade1To2().applyTo(db, 1)
|
||||
Upgrade2To3(context).applyTo(db, 2)
|
||||
Upgrade3To4().applyTo(db, 3)
|
||||
Upgrade4To5().applyTo(db, 4)
|
||||
Upgrade5To6().applyTo(db, 5)
|
||||
Upgrade6To7().applyTo(db, 6)
|
||||
Upgrade7To8().applyTo(db, 7)
|
||||
Upgrade8To9(sharedPreferencesHandler).applyTo(db, 8)
|
||||
|
||||
Sql.insertInto("CLOUD_ENTITY") //
|
||||
.integer("_id", 15) //
|
||||
.text("TYPE", CloudType.LOCAL.name) //
|
||||
.text("URL", "url") //
|
||||
.text("USERNAME", "username") //
|
||||
.text("WEBDAV_CERTIFICATE", "certificate") //
|
||||
.text("ACCESS_TOKEN", "accessToken")
|
||||
.text("S3_BUCKET", "s3Bucket") //
|
||||
.text("S3_REGION", "s3Region") //
|
||||
.text("S3_SECRET_KEY", "s3SecretKey") //
|
||||
.executeOn(db)
|
||||
|
||||
Sql.insertInto("VAULT_ENTITY") //
|
||||
.integer("_id", 25) //
|
||||
.integer("FOLDER_CLOUD_ID", 15) //
|
||||
.text("FOLDER_PATH", "path") //
|
||||
.text("FOLDER_NAME", "name") //
|
||||
.text("CLOUD_TYPE", CloudType.LOCAL.name) //
|
||||
.text("PASSWORD", "password") //
|
||||
.integer("POSITION", 10) //
|
||||
.executeOn(db)
|
||||
|
||||
Sql.insertInto("VAULT_ENTITY") //
|
||||
.integer("_id", 26) //
|
||||
.integer("FOLDER_CLOUD_ID", 4) //
|
||||
.text("FOLDER_PATH", "pathOfVault26") //
|
||||
.text("FOLDER_NAME", "name") //
|
||||
.text("CLOUD_TYPE", CloudType.LOCAL.name) //
|
||||
.text("PASSWORD", "password") //
|
||||
.integer("POSITION", 11) //
|
||||
.executeOn(db)
|
||||
|
||||
Sql.query("CLOUD_ENTITY").executeOn(db).use {
|
||||
Assert.assertThat(it.count, CoreMatchers.`is`(5))
|
||||
}
|
||||
|
||||
Upgrade9To10(sharedPreferencesHandler).applyTo(db, 9)
|
||||
|
||||
Sql.query("VAULT_ENTITY").executeOn(db).use {
|
||||
Assert.assertThat(it.count, CoreMatchers.`is`(1))
|
||||
}
|
||||
|
||||
Sql.query("CLOUD_ENTITY").executeOn(db).use {
|
||||
Assert.assertThat(it.count, CoreMatchers.`is`(4))
|
||||
}
|
||||
|
||||
Assert.assertThat(sharedPreferencesHandler.vaultsRemovedDuringMigration(), CoreMatchers.`is`(Pair("LOCAL", arrayListOf("pathOfVault26"))))
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -31,11 +31,6 @@ public class CryptoCloud implements Cloud {
|
||||
return vault.equals(cloud.vault);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean predefined() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean persistent() {
|
||||
return false;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package org.cryptomator.data.cloud.local.storageaccessframework
|
||||
package org.cryptomator.data.cloud.local
|
||||
|
||||
import android.util.LruCache
|
||||
import org.cryptomator.domain.CloudFolder
|
@ -1,4 +1,4 @@
|
||||
package org.cryptomator.data.cloud.local.storageaccessframework
|
||||
package org.cryptomator.data.cloud.local
|
||||
|
||||
import android.net.Uri
|
||||
import org.cryptomator.domain.Cloud
|
@ -1,4 +1,4 @@
|
||||
package org.cryptomator.data.cloud.local.storageaccessframework
|
||||
package org.cryptomator.data.cloud.local
|
||||
|
||||
import android.net.Uri
|
||||
import org.cryptomator.domain.Cloud
|
@ -1,4 +1,4 @@
|
||||
package org.cryptomator.data.cloud.local.storageaccessframework
|
||||
package org.cryptomator.data.cloud.local
|
||||
|
||||
import android.content.Context
|
||||
import org.cryptomator.domain.LocalStorageCloud
|
@ -1,4 +1,4 @@
|
||||
package org.cryptomator.data.cloud.local.storageaccessframework
|
||||
package org.cryptomator.data.cloud.local
|
||||
|
||||
import android.content.ContentResolver
|
||||
import android.content.Context
|
||||
@ -7,10 +7,10 @@ import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.provider.DocumentsContract
|
||||
import androidx.documentfile.provider.DocumentFile
|
||||
import org.cryptomator.data.cloud.local.storageaccessframework.LocalStorageAccessFrameworkNodeFactory.file
|
||||
import org.cryptomator.data.cloud.local.storageaccessframework.LocalStorageAccessFrameworkNodeFactory.folder
|
||||
import org.cryptomator.data.cloud.local.storageaccessframework.LocalStorageAccessFrameworkNodeFactory.from
|
||||
import org.cryptomator.data.cloud.local.storageaccessframework.LocalStorageAccessFrameworkNodeFactory.getNodePath
|
||||
import org.cryptomator.data.cloud.local.LocalStorageAccessFrameworkNodeFactory.file
|
||||
import org.cryptomator.data.cloud.local.LocalStorageAccessFrameworkNodeFactory.folder
|
||||
import org.cryptomator.data.cloud.local.LocalStorageAccessFrameworkNodeFactory.from
|
||||
import org.cryptomator.data.cloud.local.LocalStorageAccessFrameworkNodeFactory.getNodePath
|
||||
import org.cryptomator.data.util.CopyStream
|
||||
import org.cryptomator.data.util.TransferredBytesAwareInputStream
|
||||
import org.cryptomator.data.util.TransferredBytesAwareOutputStream
|
||||
@ -243,7 +243,8 @@ internal class LocalStorageAccessFrameworkImpl(context: Context, private val mim
|
||||
private fun rename(source: LocalStorageAccessNode, name: String): LocalStorageAccessNode {
|
||||
source.parent?.let { parent ->
|
||||
var newUri = try {
|
||||
DocumentsContract.renameDocument(contentResolver(), source.uri, name)
|
||||
requireNotNull(source.uri)
|
||||
DocumentsContract.renameDocument(contentResolver(), source.uri!!, name)
|
||||
} catch (e: FileNotFoundException) {
|
||||
/* Bug in Android 9 see #460 TLDR; In this renameDocument-method, Android 9 throws
|
||||
a `FileNotFoundException` although the file exists and is also renamed. */
|
||||
@ -336,11 +337,13 @@ internal class LocalStorageAccessFrameworkImpl(context: Context, private val mim
|
||||
|
||||
private fun createNewDocumentSupplier(file: LocalStorageAccessFile): Supplier<Uri?> {
|
||||
return Supplier {
|
||||
val mimeType = if (mimeTypes.fromFilename(file.name) == null) MimeType.APPLICATION_OCTET_STREAM else mimeTypes.fromFilename(file.name)
|
||||
try {
|
||||
DocumentsContract.createDocument(contentResolver(), file.parent.uri, mimeType.toString(), file.name) // FIXME
|
||||
} catch (e: FileNotFoundException) {
|
||||
null
|
||||
file.parent.uri?.let {
|
||||
val mimeType = if (mimeTypes.fromFilename(file.name) == null) MimeType.APPLICATION_OCTET_STREAM else mimeTypes.fromFilename(file.name)
|
||||
try {
|
||||
DocumentsContract.createDocument(contentResolver(), it, mimeType.toString(), file.name)
|
||||
} catch (e: FileNotFoundException) {
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -372,7 +375,7 @@ internal class LocalStorageAccessFrameworkImpl(context: Context, private val mim
|
||||
fun delete(node: LocalStorageAccessNode) {
|
||||
requireNotNull(node.uri)
|
||||
try {
|
||||
DocumentsContract.deleteDocument(contentResolver(), node.uri)
|
||||
DocumentsContract.deleteDocument(contentResolver(), node.uri!!)
|
||||
} catch (e: FileNotFoundException) {
|
||||
throw NoSuchCloudFileException(node.name)
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package org.cryptomator.data.cloud.local.storageaccessframework
|
||||
package org.cryptomator.data.cloud.local
|
||||
|
||||
import android.database.Cursor
|
||||
import android.provider.DocumentsContract
|
@ -1,4 +1,4 @@
|
||||
package org.cryptomator.data.cloud.local.storageaccessframework
|
||||
package org.cryptomator.data.cloud.local
|
||||
|
||||
import android.net.Uri
|
||||
import org.cryptomator.domain.CloudNode
|
@ -1,9 +1,10 @@
|
||||
package org.cryptomator.data.cloud.local;
|
||||
|
||||
import android.content.Context;
|
||||
import static org.cryptomator.domain.CloudType.LOCAL;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.UriPermission;
|
||||
|
||||
import org.cryptomator.data.cloud.local.file.LocalStorageContentRepository;
|
||||
import org.cryptomator.data.cloud.local.storageaccessframework.LocalStorageAccessFrameworkContentRepository;
|
||||
import org.cryptomator.data.repository.CloudContentRepositoryFactory;
|
||||
import org.cryptomator.domain.Cloud;
|
||||
import org.cryptomator.domain.LocalStorageCloud;
|
||||
@ -11,15 +12,11 @@ import org.cryptomator.domain.exception.authentication.NoAuthenticationProvidedE
|
||||
import org.cryptomator.domain.repository.CloudContentRepository;
|
||||
import org.cryptomator.util.file.MimeTypes;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
|
||||
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
import static androidx.core.content.ContextCompat.checkSelfPermission;
|
||||
import static org.cryptomator.domain.CloudType.LOCAL;
|
||||
|
||||
@Singleton
|
||||
public class LocalStorageContentRepositoryFactory implements CloudContentRepositoryFactory {
|
||||
|
||||
@ -39,23 +36,14 @@ public class LocalStorageContentRepositoryFactory implements CloudContentReposit
|
||||
|
||||
@Override
|
||||
public CloudContentRepository cloudContentRepositoryFor(Cloud cloud) {
|
||||
if (!hasPermissions(WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE)) {
|
||||
throw new NoAuthenticationProvidedException(cloud);
|
||||
}
|
||||
if (((LocalStorageCloud) cloud).rootUri() != null) {
|
||||
return new LocalStorageAccessFrameworkContentRepository(context, mimeTypes, (LocalStorageCloud) cloud);
|
||||
} else {
|
||||
return new LocalStorageContentRepository(context, (LocalStorageCloud) cloud);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hasPermissions(String... permissions) {
|
||||
for (String permission : permissions) {
|
||||
if (checkSelfPermission(context, permission) != PERMISSION_GRANTED) {
|
||||
return false;
|
||||
List<UriPermission> permissions = context.getContentResolver().getPersistedUriPermissions();
|
||||
for (UriPermission permission : permissions) {
|
||||
if(permission.getUri().toString().equals(((LocalStorageCloud) cloud).rootUri())) {
|
||||
return new LocalStorageAccessFrameworkContentRepository(context, mimeTypes, (LocalStorageCloud) cloud);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
throw new NoAuthenticationProvidedException(cloud);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package org.cryptomator.data.cloud.local.storageaccessframework
|
||||
package org.cryptomator.data.cloud.local
|
||||
|
||||
import android.net.Uri
|
||||
import android.provider.DocumentsContract
|
@ -1,11 +0,0 @@
|
||||
package org.cryptomator.data.cloud.local.file
|
||||
|
||||
import org.cryptomator.domain.Cloud
|
||||
import org.cryptomator.domain.CloudFile
|
||||
import java.util.Date
|
||||
|
||||
class LocalFile(override val parent: LocalFolder, override val name: String, override val path: String, override val size: Long?, override val modified: Date?) : CloudFile, LocalNode {
|
||||
|
||||
override val cloud: Cloud?
|
||||
get() = parent.cloud
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
package org.cryptomator.data.cloud.local.file
|
||||
|
||||
import org.cryptomator.domain.Cloud
|
||||
import org.cryptomator.domain.CloudFolder
|
||||
|
||||
open class LocalFolder(override val parent: LocalFolder?, override val name: String, override val path: String) : CloudFolder, LocalNode {
|
||||
|
||||
override val cloud: Cloud?
|
||||
get() = parent?.cloud
|
||||
|
||||
override fun withCloud(cloud: Cloud?): LocalFolder? {
|
||||
return LocalFolder(parent?.withCloud(cloud), name, path)
|
||||
}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
package org.cryptomator.data.cloud.local.file
|
||||
|
||||
import org.cryptomator.domain.CloudNode
|
||||
|
||||
interface LocalNode : CloudNode {
|
||||
|
||||
override val parent: LocalFolder?
|
||||
|
||||
}
|
@ -1,111 +0,0 @@
|
||||
package org.cryptomator.data.cloud.local.file
|
||||
|
||||
import android.content.Context
|
||||
import org.cryptomator.domain.LocalStorageCloud
|
||||
import org.cryptomator.domain.exception.BackendException
|
||||
import org.cryptomator.domain.exception.FatalBackendException
|
||||
import org.cryptomator.domain.exception.NoSuchCloudFileException
|
||||
import org.cryptomator.domain.repository.CloudContentRepository
|
||||
import org.cryptomator.domain.usecases.ProgressAware
|
||||
import org.cryptomator.domain.usecases.cloud.DataSource
|
||||
import org.cryptomator.domain.usecases.cloud.DownloadState
|
||||
import org.cryptomator.domain.usecases.cloud.UploadState
|
||||
import org.cryptomator.util.ExceptionUtil
|
||||
import java.io.File
|
||||
import java.io.FileNotFoundException
|
||||
import java.io.IOException
|
||||
import java.io.OutputStream
|
||||
|
||||
class LocalStorageContentRepository(context: Context, localStorageCloud: LocalStorageCloud) : CloudContentRepository<LocalStorageCloud, LocalNode, LocalFolder, LocalFile> {
|
||||
|
||||
private val localStorageImpl: LocalStorageImpl = LocalStorageImpl(context, localStorageCloud)
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun root(cloud: LocalStorageCloud): LocalFolder {
|
||||
return localStorageImpl.root()
|
||||
}
|
||||
|
||||
override fun resolve(cloud: LocalStorageCloud, path: String): LocalFolder {
|
||||
return localStorageImpl.resolve(path)
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun file(parent: LocalFolder, name: String): LocalFile {
|
||||
return localStorageImpl.file(parent, name, null)
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun file(parent: LocalFolder, name: String, size: Long?): LocalFile {
|
||||
return localStorageImpl.file(parent, name, size)
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun folder(parent: LocalFolder, name: String): LocalFolder {
|
||||
return localStorageImpl.folder(parent, name)
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun exists(node: LocalNode): Boolean {
|
||||
return localStorageImpl.exists(node)
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun list(folder: LocalFolder): List<LocalNode> {
|
||||
return localStorageImpl.list(folder)
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun create(folder: LocalFolder): LocalFolder {
|
||||
return localStorageImpl.create(folder)
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun move(source: LocalFolder, target: LocalFolder): LocalFolder {
|
||||
return localStorageImpl.move(source, target) as LocalFolder
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun move(source: LocalFile, target: LocalFile): LocalFile {
|
||||
return localStorageImpl.move(source, target) as LocalFile
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun write(file: LocalFile, data: DataSource, progressAware: ProgressAware<UploadState>, replace: Boolean, size: Long): LocalFile {
|
||||
return try {
|
||||
localStorageImpl.write(file, data, progressAware, replace, size)
|
||||
} catch (e: IOException) {
|
||||
if (ExceptionUtil.contains(e, FileNotFoundException::class.java)) {
|
||||
throw NoSuchCloudFileException(file.name)
|
||||
}
|
||||
throw FatalBackendException(e)
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun read(file: LocalFile, encryptedTmpFile: File?, data: OutputStream, progressAware: ProgressAware<DownloadState>) {
|
||||
try {
|
||||
localStorageImpl.read(file, data, progressAware)
|
||||
} catch (e: IOException) {
|
||||
if (ExceptionUtil.contains(e, FileNotFoundException::class.java)) {
|
||||
throw NoSuchCloudFileException(file.name)
|
||||
}
|
||||
throw FatalBackendException(e)
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun delete(node: LocalNode) {
|
||||
localStorageImpl.delete(node)
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun checkAuthenticationAndRetrieveCurrentAccount(cloud: LocalStorageCloud): String {
|
||||
return ""
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
override fun logout(cloud: LocalStorageCloud) {
|
||||
// empty
|
||||
}
|
||||
|
||||
}
|
@ -1,165 +0,0 @@
|
||||
package org.cryptomator.data.cloud.local.file
|
||||
|
||||
import android.content.Context
|
||||
import org.cryptomator.data.util.CopyStream
|
||||
import org.cryptomator.data.util.TransferredBytesAwareInputStream
|
||||
import org.cryptomator.data.util.TransferredBytesAwareOutputStream
|
||||
import org.cryptomator.domain.CloudNode
|
||||
import org.cryptomator.domain.LocalStorageCloud
|
||||
import org.cryptomator.domain.exception.BackendException
|
||||
import org.cryptomator.domain.exception.CloudNodeAlreadyExistsException
|
||||
import org.cryptomator.domain.exception.FatalBackendException
|
||||
import org.cryptomator.domain.exception.NoSuchCloudFileException
|
||||
import org.cryptomator.domain.exception.ParentFolderIsNullException
|
||||
import org.cryptomator.domain.usecases.ProgressAware
|
||||
import org.cryptomator.domain.usecases.cloud.DataSource
|
||||
import org.cryptomator.domain.usecases.cloud.DownloadState
|
||||
import org.cryptomator.domain.usecases.cloud.Progress
|
||||
import org.cryptomator.domain.usecases.cloud.UploadState
|
||||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
import java.io.FileOutputStream
|
||||
import java.io.IOException
|
||||
import java.io.OutputStream
|
||||
import java.util.Date
|
||||
|
||||
internal class LocalStorageImpl(private val context: Context, localStorageCloud: LocalStorageCloud) {
|
||||
|
||||
private val root: RootLocalFolder = RootLocalFolder(localStorageCloud)
|
||||
|
||||
fun root(): LocalFolder {
|
||||
return root
|
||||
}
|
||||
|
||||
fun resolve(path: String): LocalFolder {
|
||||
val names = path.substring(root.path.length + 1).split("/").toTypedArray()
|
||||
var folder: LocalFolder = root
|
||||
for (name in names) {
|
||||
folder = folder(folder, name)
|
||||
}
|
||||
return folder
|
||||
}
|
||||
|
||||
fun file(folder: LocalFolder, name: String, size: Long?): LocalFile {
|
||||
return LocalStorageNodeFactory.file(folder, name, folder.path + '/' + name, size, null)
|
||||
}
|
||||
|
||||
fun folder(folder: LocalFolder, name: String): LocalFolder {
|
||||
return LocalStorageNodeFactory.folder(folder, name, folder.path + '/' + name)
|
||||
}
|
||||
|
||||
fun exists(node: CloudNode): Boolean {
|
||||
return File(node.path).exists()
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
fun list(folder: LocalFolder): List<LocalNode> {
|
||||
val localDirectory = File(folder.path)
|
||||
if (!exists(folder)) {
|
||||
throw NoSuchCloudFileException()
|
||||
}
|
||||
return localDirectory.listFiles()?.map { file -> LocalStorageNodeFactory.from(folder, file) }
|
||||
?: throw FatalBackendException("listFiles() shouldn't return null")
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
fun create(folder: LocalFolder): LocalFolder {
|
||||
folder.parent?.let { parentFolder ->
|
||||
val createFolder = File(folder.path)
|
||||
if (createFolder.exists()) {
|
||||
throw CloudNodeAlreadyExistsException(folder.name)
|
||||
}
|
||||
if (!createFolder.mkdirs()) {
|
||||
throw FatalBackendException("Couldn't create a local folder at " + folder.path)
|
||||
}
|
||||
return LocalStorageNodeFactory.folder(parentFolder, createFolder)
|
||||
} ?: throw ParentFolderIsNullException(folder.name)
|
||||
}
|
||||
|
||||
@Throws(BackendException::class)
|
||||
fun move(source: LocalNode, target: LocalNode): LocalNode {
|
||||
target.parent?.let {
|
||||
val sourceFile = File(source.path)
|
||||
val targetFile = File(target.path)
|
||||
if (targetFile.exists()) {
|
||||
throw CloudNodeAlreadyExistsException(target.name)
|
||||
}
|
||||
if (!sourceFile.exists()) {
|
||||
throw NoSuchCloudFileException(source.name)
|
||||
}
|
||||
if (!sourceFile.renameTo(targetFile)) {
|
||||
throw FatalBackendException("Couldn't move " + source.path + " to " + target.path)
|
||||
}
|
||||
|
||||
return LocalStorageNodeFactory.from(it, targetFile)
|
||||
} ?: throw ParentFolderIsNullException(target.name)
|
||||
}
|
||||
|
||||
fun delete(node: CloudNode) {
|
||||
val fileOrDirectory = File(node.path)
|
||||
if (!deleteRecursive(fileOrDirectory)) {
|
||||
throw FatalBackendException("Couldn't delete local CloudNode $fileOrDirectory")
|
||||
}
|
||||
}
|
||||
|
||||
private fun deleteRecursive(fileOrDirectory: File): Boolean {
|
||||
if (fileOrDirectory.isDirectory) {
|
||||
fileOrDirectory.listFiles()?.forEach {
|
||||
deleteRecursive(it)
|
||||
}
|
||||
}
|
||||
return fileOrDirectory.delete()
|
||||
}
|
||||
|
||||
@Throws(IOException::class, BackendException::class)
|
||||
fun write(file: LocalFile, data: DataSource, progressAware: ProgressAware<UploadState>, replace: Boolean, size: Long): LocalFile {
|
||||
if (!replace && exists(file)) {
|
||||
throw CloudNodeAlreadyExistsException("CloudNode already exists and replace is false")
|
||||
}
|
||||
progressAware.onProgress(Progress.started(UploadState.upload(file)))
|
||||
val localFile = File(file.path)
|
||||
FileOutputStream(localFile).use { out ->
|
||||
data.open(context)?.use { inputStream ->
|
||||
object : TransferredBytesAwareInputStream(inputStream) {
|
||||
override fun bytesTransferred(transferred: Long) {
|
||||
progressAware.onProgress( //
|
||||
Progress.progress(UploadState.upload(file)) //
|
||||
.between(0) //
|
||||
.and(size) //
|
||||
.withValue(transferred)
|
||||
)
|
||||
}
|
||||
}.use { CopyStream.copyStreamToStream(it, out) }
|
||||
} ?: throw FatalBackendException("InputStream shouldn't be null")
|
||||
}
|
||||
progressAware.onProgress(Progress.completed(UploadState.upload(file)))
|
||||
return LocalStorageNodeFactory.file( //
|
||||
file.parent, //
|
||||
file.name, //
|
||||
localFile.path, //
|
||||
localFile.length(), //
|
||||
Date(localFile.lastModified())
|
||||
)
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
fun read(file: LocalFile, data: OutputStream, progressAware: ProgressAware<DownloadState>) {
|
||||
progressAware.onProgress(Progress.started(DownloadState.download(file)))
|
||||
val localFile = File(file.path)
|
||||
FileInputStream(localFile).use { inputStream ->
|
||||
object : TransferredBytesAwareOutputStream(data) {
|
||||
override fun bytesTransferred(transferred: Long) {
|
||||
progressAware //
|
||||
.onProgress(
|
||||
Progress.progress(DownloadState.download(file)) //
|
||||
.between(0) //
|
||||
.and(localFile.length()) //
|
||||
.withValue(transferred)
|
||||
)
|
||||
}
|
||||
}.use { out -> CopyStream.copyStreamToStream(inputStream, out) }
|
||||
}
|
||||
progressAware.onProgress(Progress.completed(DownloadState.download(file)))
|
||||
}
|
||||
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
package org.cryptomator.data.cloud.local.file
|
||||
|
||||
import java.io.File
|
||||
import java.util.Date
|
||||
|
||||
internal object LocalStorageNodeFactory {
|
||||
|
||||
@JvmStatic
|
||||
fun from(parent: LocalFolder, file: File): LocalNode {
|
||||
return if (file.isDirectory) {
|
||||
folder(parent, file)
|
||||
} else {
|
||||
file( //
|
||||
parent, //
|
||||
file.name, //
|
||||
file.path, //
|
||||
file.length(), //
|
||||
Date(file.lastModified())
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun folder(parent: LocalFolder, file: File): LocalFolder {
|
||||
return folder(parent, file.name, file.path)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun folder(parent: LocalFolder, name: String, path: String): LocalFolder {
|
||||
return LocalFolder(parent, name, path)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun file(folder: LocalFolder, name: String, path: String, size: Long?, modified: Date?): LocalFile {
|
||||
return LocalFile(folder, name, path, size, modified)
|
||||
}
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
package org.cryptomator.data.cloud.local.file
|
||||
|
||||
import android.os.Environment
|
||||
import org.cryptomator.domain.Cloud
|
||||
import org.cryptomator.domain.LocalStorageCloud
|
||||
|
||||
class RootLocalFolder(private val localStorageCloud: LocalStorageCloud) : LocalFolder(null, "", Environment.getExternalStorageDirectory().path) {
|
||||
|
||||
override val cloud: Cloud
|
||||
get() = localStorageCloud
|
||||
|
||||
override fun withCloud(cloud: Cloud?): RootLocalFolder {
|
||||
return RootLocalFolder(cloud as LocalStorageCloud)
|
||||
}
|
||||
}
|
@ -9,6 +9,6 @@ import javax.inject.Singleton
|
||||
class ConnectionHandlerFactory @Inject constructor(private val context: Context) {
|
||||
|
||||
fun createConnectionHandler(cloud: WebDavCloud): ConnectionHandlerHandlerImpl {
|
||||
return ConnectionHandlerHandlerImpl(WebDavCompatibleHttpClient(cloud, context), context)
|
||||
return ConnectionHandlerHandlerImpl(WebDavCompatibleHttpClient(cloud, context))
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
package org.cryptomator.data.cloud.webdav.network
|
||||
|
||||
import android.content.Context
|
||||
import org.cryptomator.data.cloud.webdav.WebDavFolder
|
||||
import org.cryptomator.data.cloud.webdav.WebDavNode
|
||||
import org.cryptomator.domain.CloudFolder
|
||||
@ -8,9 +7,9 @@ import org.cryptomator.domain.exception.BackendException
|
||||
import java.io.InputStream
|
||||
import javax.inject.Inject
|
||||
|
||||
class ConnectionHandlerHandlerImpl @Inject internal constructor(httpClient: WebDavCompatibleHttpClient, context: Context) {
|
||||
class ConnectionHandlerHandlerImpl @Inject internal constructor(httpClient: WebDavCompatibleHttpClient) {
|
||||
|
||||
private val webDavClient: WebDavClient = WebDavClient(context, httpClient)
|
||||
private val webDavClient: WebDavClient = WebDavClient(httpClient)
|
||||
|
||||
@Throws(BackendException::class)
|
||||
fun dirList(url: String, listedFolder: WebDavFolder): List<WebDavNode> {
|
||||
|
@ -11,7 +11,12 @@ internal object SSLSocketFactories {
|
||||
|
||||
fun from(trustManager: X509TrustManager): SSLSocketFactory {
|
||||
return try {
|
||||
val sslContext = SSLContext.getInstance("TLSv1.2")
|
||||
val tlsVersion = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
|
||||
"TLSv1.3"
|
||||
} else {
|
||||
"TLSv1.2"
|
||||
}
|
||||
val sslContext = SSLContext.getInstance(tlsVersion)
|
||||
sslContext.init(null, arrayOf<TrustManager>(trustManager), null)
|
||||
sslContext.socketFactory
|
||||
} catch (e: GeneralSecurityException) {
|
||||
|
@ -1,6 +1,5 @@
|
||||
package org.cryptomator.data.cloud.webdav.network
|
||||
|
||||
import android.content.Context
|
||||
import org.cryptomator.data.cloud.webdav.WebDavFolder
|
||||
import org.cryptomator.data.cloud.webdav.WebDavNode
|
||||
import org.cryptomator.domain.CloudFolder
|
||||
@ -26,7 +25,7 @@ import okhttp3.Request
|
||||
import okhttp3.RequestBody.Companion.toRequestBody
|
||||
import okhttp3.Response
|
||||
|
||||
internal class WebDavClient(private val context: Context, private val httpClient: WebDavCompatibleHttpClient) {
|
||||
internal class WebDavClient(private val httpClient: WebDavCompatibleHttpClient) {
|
||||
|
||||
private val ASCENDING_BY_DEPTH = Comparator { o1: PropfindEntryData, o2: PropfindEntryData -> o1.getDepth() - o2.getDepth() }
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
package org.cryptomator.data.cloud.webdav.network
|
||||
|
||||
import android.content.Context
|
||||
import android.net.ConnectivityManager
|
||||
import com.burgstaller.okhttp.AuthenticationCacheInterceptor
|
||||
import com.burgstaller.okhttp.CachingAuthenticatorDecorator
|
||||
import com.burgstaller.okhttp.DispatchingAuthenticator
|
||||
@ -22,7 +21,6 @@ import java.io.IOException
|
||||
import java.nio.charset.StandardCharsets
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
import java.util.concurrent.TimeUnit
|
||||
import javax.net.ssl.X509TrustManager
|
||||
import okhttp3.Authenticator
|
||||
import okhttp3.Cache
|
||||
import okhttp3.CacheControl
|
||||
@ -66,33 +64,30 @@ internal class WebDavCompatibleHttpClient(cloud: WebDavCloud, context: Context)
|
||||
val cache = Cache(LruFileCacheUtil(context).resolve(LruFileCacheUtil.Cache.WEBDAV), lruCacheSize.toLong())
|
||||
builder.cache(cache) //
|
||||
.addNetworkInterceptor(provideCacheInterceptor()) //
|
||||
.addInterceptor(provideOfflineCacheInterceptor(context))
|
||||
.addInterceptor(provideOfflineCacheInterceptor())
|
||||
}
|
||||
|
||||
val trustManager: X509TrustManager
|
||||
if (usingWebDavWithSelfSignedCertificate(webDavCloud)) {
|
||||
val trustManager = if (usingWebDavWithSelfSignedCertificate(webDavCloud)) {
|
||||
val pinningTrustManager = PinningTrustManager(webDavCloud.certificate())
|
||||
trustManager = pinningTrustManager
|
||||
builder.hostnameVerifier(pinningTrustManager.hostnameVerifier())
|
||||
pinningTrustManager
|
||||
} else {
|
||||
trustManager = DefaultTrustManager()
|
||||
DefaultTrustManager()
|
||||
}
|
||||
|
||||
builder.sslSocketFactory(SSLSocketFactories.from(trustManager), trustManager)
|
||||
|
||||
return builder.build()
|
||||
}
|
||||
|
||||
private fun provideOfflineCacheInterceptor(context: Context): Interceptor {
|
||||
private fun provideOfflineCacheInterceptor(): Interceptor {
|
||||
return Interceptor { chain: Interceptor.Chain ->
|
||||
var request = chain.request()
|
||||
if (isNetworkAvailable(context)) {
|
||||
val cacheControl = CacheControl.Builder() //
|
||||
.maxAge(0, TimeUnit.DAYS) //
|
||||
.build()
|
||||
request = request.newBuilder() //
|
||||
.cacheControl(cacheControl) //
|
||||
.build()
|
||||
}
|
||||
val cacheControl = CacheControl.Builder() //
|
||||
.maxAge(0, TimeUnit.DAYS) //
|
||||
.build()
|
||||
request = request.newBuilder() //
|
||||
.cacheControl(cacheControl) //
|
||||
.build()
|
||||
chain.proceed(request)
|
||||
}
|
||||
}
|
||||
@ -147,12 +142,6 @@ internal class WebDavCompatibleHttpClient(cloud: WebDavCloud, context: Context)
|
||||
private fun usingWebDavWithSelfSignedCertificate(webDavCloud: WebDavCloud): Boolean {
|
||||
return webDavCloud.certificate() != null
|
||||
}
|
||||
|
||||
private fun isNetworkAvailable(context: Context): Boolean {
|
||||
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
||||
val activeNetworkInfo = connectivityManager.activeNetworkInfo
|
||||
return activeNetworkInfo != null && activeNetworkInfo.isConnected
|
||||
}
|
||||
}
|
||||
|
||||
class UserAgentInterceptor : Interceptor {
|
||||
|
@ -27,7 +27,8 @@ class DatabaseUpgrades {
|
||||
Upgrade5To6 upgrade5To6, //
|
||||
Upgrade6To7 upgrade6To7, //
|
||||
Upgrade7To8 upgrade7To8, //
|
||||
Upgrade8To9 upgrade8To9) {
|
||||
Upgrade8To9 upgrade8To9, //
|
||||
Upgrade9To10 upgrade9To10) {
|
||||
|
||||
availableUpgrades = defineUpgrades( //
|
||||
upgrade0To1, //
|
||||
@ -38,7 +39,8 @@ class DatabaseUpgrades {
|
||||
upgrade5To6, //
|
||||
upgrade6To7, //
|
||||
upgrade7To8, //
|
||||
upgrade8To9);
|
||||
upgrade8To9, //
|
||||
upgrade9To10);
|
||||
}
|
||||
|
||||
private static Comparator<DatabaseUpgrade> reverseOrder() {
|
||||
|
48
data/src/main/java/org/cryptomator/data/db/Upgrade9To10.kt
Normal file
48
data/src/main/java/org/cryptomator/data/db/Upgrade9To10.kt
Normal file
@ -0,0 +1,48 @@
|
||||
package org.cryptomator.data.db
|
||||
|
||||
import org.cryptomator.domain.CloudType
|
||||
import org.cryptomator.util.SharedPreferencesHandler
|
||||
import org.greenrobot.greendao.database.Database
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
import timber.log.Timber
|
||||
|
||||
@Singleton
|
||||
internal class Upgrade9To10 @Inject constructor(private val sharedPreferencesHandler: SharedPreferencesHandler) : DatabaseUpgrade(9, 10) {
|
||||
|
||||
private val defaultLocalStorageCloudId = 4L
|
||||
|
||||
override fun internalApplyTo(db: Database, origin: Int) {
|
||||
db.beginTransaction()
|
||||
|
||||
try {
|
||||
Sql.query("VAULT_ENTITY")
|
||||
.columns(listOf("FOLDER_PATH"))
|
||||
.where("FOLDER_CLOUD_ID", Sql.eq(defaultLocalStorageCloudId))
|
||||
.executeOn(db).use {
|
||||
val vaultsToBeRemoved = ArrayList<String>()
|
||||
while (it.moveToNext()) {
|
||||
val folderPath = it.getString(it.getColumnIndex("FOLDER_PATH"))
|
||||
vaultsToBeRemoved.add(folderPath)
|
||||
}
|
||||
if (vaultsToBeRemoved.isNotEmpty()) {
|
||||
sharedPreferencesHandler.vaultsRemovedDuringMigration(Pair(CloudType.LOCAL.name, vaultsToBeRemoved))
|
||||
Timber.tag("Upgrade9To10").i("Added %s to the removeDuringMigrations", vaultsToBeRemoved)
|
||||
}
|
||||
}
|
||||
|
||||
Sql.deleteFrom("VAULT_ENTITY")
|
||||
.where("FOLDER_CLOUD_ID", Sql.eq(defaultLocalStorageCloudId))
|
||||
.executeOn(db)
|
||||
|
||||
Sql.deleteFrom("CLOUD_ENTITY")
|
||||
.where("_id", Sql.eq(defaultLocalStorageCloudId))
|
||||
.where("TYPE", Sql.eq("LOCAL"))
|
||||
.executeOn(db)
|
||||
|
||||
db.setTransactionSuccessful()
|
||||
} finally {
|
||||
db.endTransaction()
|
||||
}
|
||||
}
|
||||
}
|
@ -76,9 +76,6 @@ class CloudRepositoryImpl implements CloudRepository {
|
||||
|
||||
@Override
|
||||
public void delete(Cloud cloud) {
|
||||
if (cloud.predefined()) {
|
||||
throw new IllegalArgumentException("Can not delete predefined cloud");
|
||||
}
|
||||
if (!cloud.persistent()) {
|
||||
throw new IllegalArgumentException("Can not delete non persistent cloud");
|
||||
}
|
||||
|
@ -28,6 +28,6 @@ class NetworkConnectionCheck @Inject internal constructor(private val context: C
|
||||
fun checkWifiOnAndConnected(): Boolean {
|
||||
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
||||
val activeNetwork = connectivityManager.activeNetwork
|
||||
return connectivityManager.getNetworkCapabilities(activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
|
||||
return connectivityManager.getNetworkCapabilities(activeNetwork)?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,6 @@ interface Cloud : Serializable {
|
||||
fun id(): Long?
|
||||
fun type(): CloudType?
|
||||
fun configurationMatches(cloud: Cloud?): Boolean
|
||||
fun predefined(): Boolean
|
||||
fun persistent(): Boolean
|
||||
fun requiresNetwork(): Boolean
|
||||
}
|
||||
|
@ -48,11 +48,6 @@ public class DropboxCloud implements Cloud {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean predefined() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean persistent() {
|
||||
return true;
|
||||
|
@ -48,11 +48,6 @@ public class GoogleDriveCloud implements Cloud {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean predefined() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean persistent() {
|
||||
return true;
|
||||
|
@ -1,6 +1,5 @@
|
||||
package org.cryptomator.domain;
|
||||
|
||||
import android.os.Build;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@ -48,11 +47,6 @@ public class LocalStorageCloud implements Cloud {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean predefined() {
|
||||
return Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean persistent() {
|
||||
return true;
|
||||
|
@ -43,11 +43,6 @@ public class OnedriveCloud implements Cloud {
|
||||
return CloudType.ONEDRIVE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean predefined() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean persistent() {
|
||||
return true;
|
||||
|
@ -59,12 +59,6 @@ public class PCloud implements Cloud {
|
||||
return username.equals(cloud.username);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean predefined() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean persistent() {
|
||||
return true;
|
||||
|
@ -80,12 +80,6 @@ public class S3Cloud implements Cloud {
|
||||
return s3Bucket.equals(cloud.s3Bucket) && s3Endpoint.equals(cloud.s3Endpoint) && s3Region.equals(cloud.s3Region);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean predefined() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean persistent() {
|
||||
return true;
|
||||
|
@ -66,11 +66,6 @@ public class WebDavCloud implements Cloud {
|
||||
return certificate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean predefined() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean persistent() {
|
||||
return true;
|
||||
|
@ -1 +1,4 @@
|
||||
- pCloud-Verbindung können wieder auf allen Geräten hinzugefügt werden
|
||||
- Fotos können sofort hochgeladen werden, wenn der automatische Fotoupload aktiviert und der Tresor entsperrt ist
|
||||
- Wenn der Tresor-Order der Stammordner der Cloud ist, kann dieser nun nicht mehr hinzugefügt werden
|
||||
- Überarbeitung des Zugriffs auf den lokalen Speicher
|
||||
- Sicherheit von WebDAV-Verbindungen verbessert
|
@ -1 +1,4 @@
|
||||
- Fixed add pCloud connection on some devices
|
||||
- Upload photos instantly when auto photo upload is enabled and vault is unlocked
|
||||
- Fixed vault name is empty when it is the root folder of the cloud
|
||||
- Refactored access to local storage
|
||||
- Enhanced security of WebDAV connections
|
@ -1,3 +1,6 @@
|
||||
<ul>
|
||||
<li>Fixed add pCloud connection on some devices</li>
|
||||
<li>Upload photos instantly when auto photo upload is enabled and vault is unlocked</li>
|
||||
<li>Fixed vault name is empty when it is the root folder of the cloud</li>
|
||||
<li>Refactored access to local storage</li>
|
||||
<li>Enhanced security of WebDAV connections</li>
|
||||
</ul>
|
@ -1,7 +1,9 @@
|
||||
package org.cryptomator.presentation.presenter
|
||||
|
||||
import android.Manifest
|
||||
import android.accounts.AccountManager
|
||||
import android.content.Intent
|
||||
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
|
||||
@ -35,6 +37,7 @@ import org.cryptomator.presentation.intent.AuthenticateCloudIntent
|
||||
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.ProgressModel
|
||||
import org.cryptomator.presentation.model.ProgressStateModel
|
||||
import org.cryptomator.presentation.model.S3CloudModel
|
||||
@ -44,7 +47,6 @@ import org.cryptomator.presentation.ui.activity.view.AuthenticateCloudView
|
||||
import org.cryptomator.presentation.workflow.ActivityResult
|
||||
import org.cryptomator.presentation.workflow.AddExistingVaultWorkflow
|
||||
import org.cryptomator.presentation.workflow.CreateNewVaultWorkflow
|
||||
import org.cryptomator.presentation.workflow.PermissionsResult
|
||||
import org.cryptomator.presentation.workflow.Workflow
|
||||
import org.cryptomator.util.ExceptionUtil
|
||||
import org.cryptomator.util.crypto.CredentialCryptor
|
||||
@ -433,6 +435,7 @@ class AuthenticateCloudPresenter @Inject constructor( //
|
||||
private inner class LocalStorageAuthStrategy : AuthStrategy {
|
||||
|
||||
private var authenticationStarted = false
|
||||
|
||||
override fun supports(cloud: CloudModel): Boolean {
|
||||
return cloud.cloudType() == CloudTypeModel.LOCAL
|
||||
}
|
||||
@ -445,22 +448,41 @@ class AuthenticateCloudPresenter @Inject constructor( //
|
||||
|
||||
private fun startAuthentication(cloud: CloudModel) {
|
||||
authenticationStarted = true
|
||||
requestPermissions(
|
||||
PermissionsResultCallbacks.onLocalStorageAuthenticated(cloud), //
|
||||
R.string.permission_snackbar_auth_local_vault, //
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE, //
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
||||
)
|
||||
|
||||
val uri = (cloud as LocalStorageModel).uri()
|
||||
|
||||
val permissions = context().contentResolver.persistedUriPermissions
|
||||
for (permission in permissions) {
|
||||
if (permission.uri.toString() == uri) {
|
||||
succeedAuthenticationWith(cloud.toCloud())
|
||||
}
|
||||
}
|
||||
|
||||
Timber.tag("AuthicateCloudPrester").e("Permission revoked, ask to re-pick location")
|
||||
|
||||
Toast.makeText(context(), getString(R.string.permission_revoked_re_request_permission), Toast.LENGTH_LONG).show()
|
||||
|
||||
val openDocumentTree = Intent(ACTION_OPEN_DOCUMENT_TREE).apply {
|
||||
putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri)
|
||||
}
|
||||
|
||||
requestActivityResult(ActivityResultCallbacks.rePickedLocalStorageLocation(cloud), openDocumentTree)
|
||||
}
|
||||
}
|
||||
|
||||
@Callback
|
||||
fun onLocalStorageAuthenticated(result: PermissionsResult, cloud: CloudModel) {
|
||||
if (result.granted()) {
|
||||
succeedAuthenticationWith(cloud.toCloud())
|
||||
} else {
|
||||
failAuthentication(PermissionNotGrantedException(R.string.permission_snackbar_auth_local_vault))
|
||||
fun rePickedLocalStorageLocation(result: ActivityResult, cloud: LocalStorageModel) {
|
||||
val rootTreeUriOfLocalStorage = result.intent().data
|
||||
rootTreeUriOfLocalStorage?.let {
|
||||
context() //
|
||||
.contentResolver //
|
||||
.takePersistableUriPermission( //
|
||||
it, //
|
||||
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
|
||||
)
|
||||
}
|
||||
Timber.tag("AuthicateCloudPrester").e("Permission granted again")
|
||||
succeedAuthenticationWith(cloud.toCloud())
|
||||
}
|
||||
|
||||
private fun encrypt(password: String): String {
|
||||
|
@ -7,7 +7,6 @@
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
@ -28,7 +27,6 @@
|
||||
android:allowBackup="false"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
android:usesCleartextTraffic="true">
|
||||
|
@ -3,7 +3,6 @@ package org.cryptomator.presentation
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import org.cryptomator.presentation.service.CryptorsService
|
||||
import org.cryptomator.presentation.service.PhotoContentJob
|
||||
import org.cryptomator.util.SharedPreferencesHandler
|
||||
@ -18,7 +17,7 @@ class BootAwareReceiver : BroadcastReceiver() {
|
||||
context.stopService(CryptorsService.lockAllIntent(context))
|
||||
}
|
||||
intent.action.equals(Intent.ACTION_BOOT_COMPLETED, ignoreCase = true) -> {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && SharedPreferencesHandler(context).usePhotoUpload()) {
|
||||
if (SharedPreferencesHandler(context).usePhotoUpload()) {
|
||||
Timber.tag("BootAwareReceiver").i("Starting AutoUploadJobScheduler")
|
||||
PhotoContentJob.scheduleJob(context)
|
||||
}
|
||||
|
@ -120,6 +120,22 @@ class CryptomatorApp : MultiDexApplication(), HasComponent<ApplicationComponent>
|
||||
}, BIND_AUTO_CREATE)
|
||||
}
|
||||
|
||||
fun startAutoUpload() {
|
||||
val sharedPreferencesHandler = SharedPreferencesHandler(applicationContext())
|
||||
if (checkToStartAutoImageUpload(sharedPreferencesHandler)) {
|
||||
val vault = applicationComponent.vaultRepository().load(sharedPreferencesHandler.photoUploadVault())
|
||||
if (vault.isUnlocked) {
|
||||
val cloud = applicationComponent.cloudRepository().decryptedViewOf(vault)
|
||||
applicationContext().startService(AutoUploadService.startAutoUploadIntent(applicationContext(), cloud))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkToStartAutoImageUpload(sharedPreferencesHandler: SharedPreferencesHandler): Boolean {
|
||||
return sharedPreferencesHandler.usePhotoUpload()
|
||||
&& (!sharedPreferencesHandler.autoPhotoUploadOnlyUsingWifi() || applicationComponent.networkConnectionCheck().checkWifiOnAndConnected())
|
||||
}
|
||||
|
||||
private fun setupLogging() {
|
||||
setupLoggingFramework()
|
||||
setup()
|
||||
|
@ -4,11 +4,8 @@ import android.Manifest
|
||||
import android.content.ActivityNotFoundException
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Environment
|
||||
import android.provider.DocumentsContract
|
||||
import android.widget.Toast
|
||||
import androidx.annotation.RequiresApi
|
||||
import org.cryptomator.domain.CloudFile
|
||||
import org.cryptomator.domain.CloudFolder
|
||||
import org.cryptomator.domain.CloudNode
|
||||
@ -83,10 +80,8 @@ import org.cryptomator.util.SharedPreferencesHandler
|
||||
import org.cryptomator.util.file.FileCacheUtils
|
||||
import org.cryptomator.util.file.MimeType
|
||||
import org.cryptomator.util.file.MimeTypes
|
||||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
import java.io.FileNotFoundException
|
||||
import java.io.FileOutputStream
|
||||
import java.io.Serializable
|
||||
import java.security.DigestInputStream
|
||||
import java.security.MessageDigest
|
||||
@ -738,30 +733,6 @@ class BrowseFilesPresenter @Inject constructor( //
|
||||
exportNodesToUserSelectedLocation(selectedCloudFiles, trigger)
|
||||
}
|
||||
|
||||
@Callback
|
||||
fun exportFileToDownloadDirectory(result: PermissionsResult, fileToExport: CloudFileModel, exportOperation: ExportOperation) {
|
||||
if (result.granted()) {
|
||||
val downloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
|
||||
val cryptomatorDownloads = File(downloads, context().getString(R.string.download_subdirectory_name))
|
||||
cryptomatorDownloads.mkdirs()
|
||||
if (cryptomatorDownloads.isDirectory) {
|
||||
val target = File(cryptomatorDownloads, fileToExport.name)
|
||||
try {
|
||||
val downloadFile = DownloadFile.Builder() //
|
||||
.setDownloadFile(fileToExport.toCloudNode()) //
|
||||
.setDataSink(FileOutputStream(target)) //
|
||||
.build()
|
||||
exportOperation.export(this, listOf(downloadFile))
|
||||
} catch (e: FileNotFoundException) {
|
||||
showError(e)
|
||||
}
|
||||
} else {
|
||||
view?.showError(R.string.screen_file_browser_msg_creating_download_dir_failed)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.KITKAT)
|
||||
private fun exportFileToUserSelectedLocation(fileToExport: CloudFileModel, exportOperation: ExportOperation) {
|
||||
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE)
|
||||
@ -789,7 +760,6 @@ class BrowseFilesPresenter @Inject constructor( //
|
||||
}
|
||||
|
||||
@Callback
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
fun pickedLocalStorageLocation(
|
||||
result: ActivityResult, //
|
||||
nodesToExport: ArrayList<CloudNodeModel<*>>, //
|
||||
@ -809,7 +779,6 @@ class BrowseFilesPresenter @Inject constructor( //
|
||||
disableSelectionMode()
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private fun collectNodesToExport(
|
||||
parentUri: Uri, //
|
||||
exportOperation: ExportOperation, //
|
||||
@ -827,7 +796,6 @@ class BrowseFilesPresenter @Inject constructor( //
|
||||
collectFolderContentForExport(parentUri, exportOperation, foldersForRecursiveDirListing, filesToExport)
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private fun collectFolderContentForExport(
|
||||
parentUri: Uri, exportOperation: ExportOperation, folders: List<CloudFolderModel>, //
|
||||
filesToExport: List<CloudFileModel>
|
||||
@ -847,7 +815,6 @@ class BrowseFilesPresenter @Inject constructor( //
|
||||
})
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private fun prepareExportingOf(parentUri: Uri, exportOperation: ExportOperation, filesToExport: List<CloudFileModel>, cloudNodeRecursiveListing: CloudNodeRecursiveListing) {
|
||||
downloadFiles = ArrayList()
|
||||
downloadFiles.addAll(prepareFilesForExport(cloudFileModelMapper.fromModels(filesToExport), parentUri))
|
||||
@ -862,12 +829,10 @@ class BrowseFilesPresenter @Inject constructor( //
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private fun prepareFilesForExport(filesToExport: List<CloudFile>, parentUri: Uri): List<DownloadFile> {
|
||||
return filesToExport.mapTo(ArrayList()) { createDownloadFile(it, parentUri) }
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private fun prepareFolderContentForExport(cloudFolderRecursiveListing: CloudFolderRecursiveListing, parentUri: Uri) {
|
||||
createFolder(parentUri, cloudFolderRecursiveListing.parent.name)?.let {
|
||||
downloadFiles.addAll(prepareFilesForExport(cloudFolderRecursiveListing.files, it))
|
||||
@ -877,7 +842,6 @@ class BrowseFilesPresenter @Inject constructor( //
|
||||
} ?: throw FatalBackendException("Failed to create parent folder for export")
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private fun createFolder(parentUri: Uri, folderName: String): Uri? {
|
||||
return try {
|
||||
DocumentsContract.createDocument( //
|
||||
@ -892,7 +856,6 @@ class BrowseFilesPresenter @Inject constructor( //
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private fun createDownloadFile(file: CloudFile, documentUri: Uri): DownloadFile {
|
||||
return try {
|
||||
DownloadFile.Builder() //
|
||||
@ -918,7 +881,6 @@ class BrowseFilesPresenter @Inject constructor( //
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
@Throws(IllegalFileNameException::class, NoSuchCloudFileException::class)
|
||||
private fun createNewDocumentUri(parentUri: Uri, fileName: String): Uri {
|
||||
val mimeType = mimeTypes.fromFilename(fileName) ?: MimeType.APPLICATION_OCTET_STREAM
|
||||
|
@ -3,9 +3,7 @@ package org.cryptomator.presentation.presenter
|
||||
import android.content.ActivityNotFoundException
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.widget.Toast
|
||||
import androidx.annotation.RequiresApi
|
||||
import org.cryptomator.domain.Cloud
|
||||
import org.cryptomator.domain.LocalStorageCloud
|
||||
import org.cryptomator.domain.PCloud
|
||||
@ -251,7 +249,6 @@ class CloudConnectionListPresenter @Inject constructor( //
|
||||
}
|
||||
|
||||
@Callback
|
||||
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
|
||||
fun pickedLocalStorageLocation(result: ActivityResult) {
|
||||
val rootTreeUriOfLocalStorage = result.intent().data
|
||||
persistUriPermission(rootTreeUriOfLocalStorage)
|
||||
@ -266,7 +263,6 @@ class CloudConnectionListPresenter @Inject constructor( //
|
||||
})
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
|
||||
private fun persistUriPermission(rootTreeUriOfLocalStorage: Uri?) {
|
||||
rootTreeUriOfLocalStorage?.let {
|
||||
context() //
|
||||
@ -278,7 +274,6 @@ class CloudConnectionListPresenter @Inject constructor( //
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
|
||||
private fun releaseUriPermission(uri: String) {
|
||||
context() //
|
||||
.contentResolver //
|
||||
@ -294,10 +289,6 @@ class CloudConnectionListPresenter @Inject constructor( //
|
||||
}
|
||||
}
|
||||
|
||||
fun onDefaultLocalCloudConnectionClicked() {
|
||||
finishWithResult(SELECTED_CLOUD, defaultLocalStorageCloud)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
const val SELECTED_CLOUD = "selectedCloudConnection"
|
||||
|
@ -3,8 +3,6 @@ package org.cryptomator.presentation.presenter
|
||||
import android.Manifest
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Environment
|
||||
import org.cryptomator.domain.CloudFile
|
||||
import org.cryptomator.domain.CloudNode
|
||||
import org.cryptomator.domain.di.PerView
|
||||
@ -30,9 +28,7 @@ import org.cryptomator.presentation.util.ShareFileHelper
|
||||
import org.cryptomator.presentation.workflow.ActivityResult
|
||||
import org.cryptomator.presentation.workflow.PermissionsResult
|
||||
import org.cryptomator.util.ExceptionUtil
|
||||
import java.io.File
|
||||
import java.io.FileNotFoundException
|
||||
import java.io.FileOutputStream
|
||||
import java.io.IOException
|
||||
import java.io.InputStream
|
||||
import java.io.OutputStream
|
||||
@ -58,37 +54,33 @@ class ImagePreviewPresenter @Inject constructor( //
|
||||
@InstanceState
|
||||
lateinit var pageIndexes: ArrayList<Int>
|
||||
|
||||
fun onExportImageClicked(uri: Uri) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
|
||||
copyFileToDownloadDirectory(uri)
|
||||
} else {
|
||||
copyFileToUserSelectedLocation(uri)
|
||||
}
|
||||
fun exportImageToUserSelectedLocation(uri: Uri) {
|
||||
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE)
|
||||
intent.type = "*/*"
|
||||
intent.putExtra(Intent.EXTRA_TITLE, contentResolverUtil.fileName(uri))
|
||||
requestActivityResult(ActivityResultCallbacks.exportImageToUserSelectedLocation(uri.toString()), intent)
|
||||
}
|
||||
|
||||
private fun copyFileToDownloadDirectory(uri: Uri) {
|
||||
@Callback
|
||||
fun exportImageToUserSelectedLocation(result: ActivityResult, sourceUri: String?) {
|
||||
requestPermissions(
|
||||
PermissionsResultCallbacks.copyFileToDownloadDirectory(uri.toString()), //
|
||||
R.string.permission_message_export_file, Manifest.permission.WRITE_EXTERNAL_STORAGE
|
||||
PermissionsResultCallbacks.exportImageToUserSelectedLocation(result.intent()?.dataString, sourceUri), //
|
||||
R.string.permission_message_export_file, //
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE
|
||||
)
|
||||
}
|
||||
|
||||
@Callback
|
||||
fun copyFileToDownloadDirectory(result: PermissionsResult, uriString: String?) {
|
||||
fun exportImageToUserSelectedLocation(result: PermissionsResult, targetUri: String?, sourceUri: String?) {
|
||||
if (result.granted()) {
|
||||
val uriFile = Uri.parse(uriString)
|
||||
val downloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
|
||||
val cryptomatorDownloads = File(downloads, context().getString(R.string.download_subdirectory_name))
|
||||
cryptomatorDownloads.mkdirs()
|
||||
if (cryptomatorDownloads.isDirectory) {
|
||||
val target = File(cryptomatorDownloads, contentResolverUtil.fileName(uriFile))
|
||||
try {
|
||||
copyFile(contentResolverUtil.openInputStream(uriFile), FileOutputStream(target))
|
||||
} catch (e: FileNotFoundException) {
|
||||
showError(e)
|
||||
}
|
||||
} else {
|
||||
view?.showError(R.string.screen_file_browser_msg_creating_download_dir_failed)
|
||||
try {
|
||||
copyFile(
|
||||
contentResolverUtil.openInputStream(Uri.parse(sourceUri)), //
|
||||
contentResolverUtil.openOutputStream(Uri.parse(targetUri))
|
||||
)
|
||||
} catch (e: FileNotFoundException) {
|
||||
showError(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -107,37 +99,6 @@ class ImagePreviewPresenter @Inject constructor( //
|
||||
})
|
||||
}
|
||||
|
||||
private fun copyFileToUserSelectedLocation(uri: Uri) {
|
||||
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE)
|
||||
intent.type = "*/*"
|
||||
intent.putExtra(Intent.EXTRA_TITLE, contentResolverUtil.fileName(uri))
|
||||
requestActivityResult(ActivityResultCallbacks.copyFileToUserSelectedLocation(uri.toString()), intent)
|
||||
}
|
||||
|
||||
@Callback
|
||||
fun copyFileToUserSelectedLocation(result: ActivityResult, sourceUri: String?) {
|
||||
requestPermissions(
|
||||
PermissionsResultCallbacks.copyFileToUserSelectedLocation(result.intent()?.dataString, sourceUri), //
|
||||
R.string.permission_message_export_file, //
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE
|
||||
)
|
||||
}
|
||||
|
||||
@Callback
|
||||
fun copyFileToUserSelectedLocation(result: PermissionsResult, targetUri: String?, sourceUri: String?) {
|
||||
if (result.granted()) {
|
||||
try {
|
||||
copyFile(
|
||||
contentResolverUtil.openInputStream(Uri.parse(sourceUri)), //
|
||||
contentResolverUtil.openOutputStream(Uri.parse(targetUri))
|
||||
)
|
||||
} catch (e: FileNotFoundException) {
|
||||
showError(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun onShareImageClicked(uri: Uri) {
|
||||
shareFileHelper.shareFile(this, uri)
|
||||
}
|
||||
|
@ -90,17 +90,14 @@ class SettingsPresenter @Inject internal constructor(
|
||||
requestPermissions(
|
||||
PermissionsResultCallbacks.onLocalStoragePermissionGranted(), //
|
||||
R.string.permission_snackbar_auth_auto_upload, //
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE, //
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE
|
||||
)
|
||||
}
|
||||
|
||||
@Callback
|
||||
fun onLocalStoragePermissionGranted(result: PermissionsResult) {
|
||||
if (result.granted()) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
scheduleJob(context())
|
||||
}
|
||||
scheduleJob(context())
|
||||
} else {
|
||||
view?.disableAutoUpload()
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ class UnlockVaultPresenter @Inject constructor(
|
||||
super.destroyed()
|
||||
if (retryUnlockHandler != null) {
|
||||
running = false
|
||||
retryUnlockHandler?.removeCallbacks(null)
|
||||
retryUnlockHandler?.removeCallbacksAndMessages(null)
|
||||
}
|
||||
}
|
||||
|
||||
@ -140,11 +140,12 @@ class UnlockVaultPresenter @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME why is this method not used?
|
||||
fun onWindowFocusChanged(hasFocus: Boolean) {
|
||||
if (hasFocus) {
|
||||
if (retryUnlockHandler != null) {
|
||||
running = false
|
||||
retryUnlockHandler?.removeCallbacks(null)
|
||||
retryUnlockHandler?.removeCallbacksAndMessages(null)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -12,6 +12,7 @@ import org.cryptomator.data.cloud.crypto.CryptoCloud
|
||||
import org.cryptomator.data.util.NetworkConnectionCheck
|
||||
import org.cryptomator.domain.Cloud
|
||||
import org.cryptomator.domain.CloudFolder
|
||||
import org.cryptomator.domain.CloudType
|
||||
import org.cryptomator.domain.Vault
|
||||
import org.cryptomator.domain.di.PerView
|
||||
import org.cryptomator.domain.exception.license.LicenseNotValidException
|
||||
@ -46,10 +47,10 @@ import org.cryptomator.presentation.ui.activity.LicenseCheckActivity
|
||||
import org.cryptomator.presentation.ui.activity.view.VaultListView
|
||||
import org.cryptomator.presentation.ui.dialog.AppIsObscuredInfoDialog
|
||||
import org.cryptomator.presentation.ui.dialog.AskForLockScreenDialog
|
||||
import org.cryptomator.presentation.ui.dialog.BetaConfirmationDialog
|
||||
import org.cryptomator.presentation.ui.dialog.EnterPasswordDialog
|
||||
import org.cryptomator.presentation.ui.dialog.UpdateAppAvailableDialog
|
||||
import org.cryptomator.presentation.ui.dialog.UpdateAppDialog
|
||||
import org.cryptomator.presentation.ui.dialog.VaultsRemovedDuringMigrationDialog
|
||||
import org.cryptomator.presentation.util.FileUtil
|
||||
import org.cryptomator.presentation.workflow.ActivityResult
|
||||
import org.cryptomator.presentation.workflow.AddExistingVaultWorkflow
|
||||
@ -104,6 +105,12 @@ class VaultListPresenter @Inject constructor( //
|
||||
sharedPreferencesHandler.setScreenLockDialogAlreadyShown()
|
||||
}
|
||||
|
||||
sharedPreferencesHandler.vaultsRemovedDuringMigration()?.let {
|
||||
val cloudNameString = getString(CloudTypeModel.valueOf(CloudType.valueOf(it.first)).displayNameResource)
|
||||
view?.showDialog(VaultsRemovedDuringMigrationDialog.newInstance(Pair(cloudNameString, it.second)))
|
||||
sharedPreferencesHandler.vaultsRemovedDuringMigration(null)
|
||||
}
|
||||
|
||||
checkLicense()
|
||||
}
|
||||
|
||||
@ -119,9 +126,10 @@ class VaultListPresenter @Inject constructor( //
|
||||
}
|
||||
|
||||
override fun onError(e: Throwable) {
|
||||
var license: String? = ""
|
||||
if (e is LicenseNotValidException) {
|
||||
license = e.license
|
||||
val license = if (e is LicenseNotValidException) {
|
||||
e.license
|
||||
} else {
|
||||
""
|
||||
}
|
||||
val intent = Intent(context(), LicenseCheckActivity::class.java)
|
||||
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||
@ -272,8 +280,8 @@ class VaultListPresenter @Inject constructor( //
|
||||
view?.showVaultCreationHint()
|
||||
} else {
|
||||
view?.hideVaultCreationHint()
|
||||
view?.renderVaultList(vaultModels)
|
||||
}
|
||||
view?.renderVaultList(vaultModels)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -212,7 +212,7 @@ public class AutoUploadService extends Service {
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
Timber.tag("AutoUploadService").d("created");
|
||||
notification = new AutoUploadNotification(this, 5);
|
||||
notification = new AutoUploadNotification(this, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -13,6 +13,7 @@ import android.net.Uri
|
||||
import android.os.Handler
|
||||
import android.provider.MediaStore
|
||||
import org.cryptomator.domain.exception.FatalBackendException
|
||||
import org.cryptomator.presentation.CryptomatorApp
|
||||
import org.cryptomator.presentation.R
|
||||
import org.cryptomator.presentation.util.FileUtil
|
||||
import org.cryptomator.presentation.util.ResourceHelper
|
||||
@ -38,6 +39,8 @@ class PhotoContentJob : JobService() {
|
||||
|
||||
runningParams = params
|
||||
|
||||
var filesCaptured = false
|
||||
|
||||
params.triggeredContentAuthorities?.let {
|
||||
if (params.triggeredContentUris != null) {
|
||||
val ids = getIds(params)
|
||||
@ -49,6 +52,8 @@ class PhotoContentJob : JobService() {
|
||||
fileUtil.addImageToAutoUploads(dir)
|
||||
Timber.tag("PhotoContentJob").i("Added file to UploadList")
|
||||
Timber.tag("PhotoContentJob").d(String.format("Added file to UploadList %s", dir))
|
||||
|
||||
filesCaptured = true
|
||||
} catch (e: FatalBackendException) {
|
||||
Timber.tag("PhotoContentJob").e(e, "Failed to add image to auto upload list")
|
||||
} catch (e: SecurityException) {
|
||||
@ -65,6 +70,10 @@ class PhotoContentJob : JobService() {
|
||||
}
|
||||
} ?: Timber.tag("PhotoContentJob").w("No photos content")
|
||||
|
||||
if(filesCaptured && SharedPreferencesHandler(applicationContext).usePhotoUploadInstant()) {
|
||||
(application as CryptomatorApp).startAutoUpload()
|
||||
}
|
||||
|
||||
handler.post(worker)
|
||||
return false
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ class ImagePreviewActivity : BaseActivity(), ImagePreviewView, ConfirmDeleteClou
|
||||
presenter.onDeleteImageClicked(imagePreviewFiles[imagePreviewSliderAdapter.getIndex(viewPager.currentItem)])
|
||||
}
|
||||
exportImage.setOnClickListener {
|
||||
currentImageUri?.let { presenter.onExportImageClicked(it) }
|
||||
currentImageUri?.let { presenter.exportImageToUserSelectedLocation(it) }
|
||||
}
|
||||
shareImage.setOnClickListener {
|
||||
currentImageUri?.let { presenter.onShareImageClicked(it) }
|
||||
|
@ -1,6 +1,5 @@
|
||||
package org.cryptomator.presentation.ui.bottomsheet
|
||||
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import org.cryptomator.generator.BottomSheet
|
||||
@ -46,12 +45,10 @@ class FolderSettingsBottomSheet : BaseBottomSheet<FolderSettingsBottomSheet.Call
|
||||
callback?.onMoveFolderClicked(cloudFolderModel)
|
||||
dismiss()
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
export_folder.visibility = View.VISIBLE
|
||||
export_folder.setOnClickListener {
|
||||
callback?.onExportFolderClicked(cloudFolderModel)
|
||||
dismiss()
|
||||
}
|
||||
export_folder.visibility = View.VISIBLE
|
||||
export_folder.setOnClickListener {
|
||||
callback?.onExportFolderClicked(cloudFolderModel)
|
||||
dismiss()
|
||||
}
|
||||
delete_folder.setOnClickListener {
|
||||
callback?.onDeleteNodeClicked(cloudFolderModel)
|
||||
|
@ -13,10 +13,10 @@ import kotlinx.android.synthetic.main.dialog_app_is_obscured_info.tv_app_is_obsc
|
||||
class AppIsObscuredInfoDialog : BaseDialog<Activity>() {
|
||||
|
||||
public override fun setupDialog(builder: AlertDialog.Builder): android.app.Dialog {
|
||||
builder //
|
||||
return builder //
|
||||
.setTitle(R.string.dialog_app_is_obscured_info_title) //
|
||||
.setNeutralButton(R.string.dialog_app_is_obscured_info_neutral_button) { dialog: DialogInterface, _: Int -> dialog.dismiss() }
|
||||
return builder.create()
|
||||
.setNeutralButton(R.string.dialog_app_is_obscured_info_neutral_button) { dialog: DialogInterface, _: Int -> dialog.dismiss() } //
|
||||
.create()
|
||||
}
|
||||
|
||||
override fun disableDialogWhenObscured(): Boolean {
|
||||
|
@ -1,7 +1,6 @@
|
||||
package org.cryptomator.presentation.ui.dialog
|
||||
|
||||
import android.content.DialogInterface
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.text.Html
|
||||
import android.view.View
|
||||
@ -32,11 +31,7 @@ class UpdateAppAvailableDialog : BaseProgressErrorDialog<UpdateAppAvailableDialo
|
||||
|
||||
public override fun setupView() {
|
||||
val message = requireArguments().getSerializable(MESSAGE_ARG) as String
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
tv_message.text = Html.fromHtml(message, Html.FROM_HTML_MODE_COMPACT)
|
||||
} else {
|
||||
tv_message.text = Html.fromHtml(message)
|
||||
}
|
||||
tv_message.text = Html.fromHtml(message, Html.FROM_HTML_MODE_COMPACT)
|
||||
}
|
||||
|
||||
override fun enableViewAfterError(): View {
|
||||
|
@ -0,0 +1,28 @@
|
||||
package org.cryptomator.presentation.ui.dialog
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.DialogInterface
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import org.cryptomator.generator.Dialog
|
||||
import org.cryptomator.presentation.R
|
||||
|
||||
@Dialog(R.layout.dialog_vault_is_root_folder_of_cloud)
|
||||
class VaultIsRootFolderOfCloudDialog : BaseDialog<Activity>() {
|
||||
|
||||
public override fun setupDialog(builder: AlertDialog.Builder): android.app.Dialog {
|
||||
return builder //
|
||||
.setTitle(R.string.dialog_vault_is_root_folder_of_cloud_title) //
|
||||
.setNeutralButton(R.string.dialog_vault_is_root_folder_of_cloud_neutral_button) { dialog: DialogInterface, _: Int -> dialog.dismiss() }
|
||||
.create()
|
||||
}
|
||||
|
||||
override fun setupView() {}
|
||||
|
||||
companion object {
|
||||
|
||||
fun newInstance(): DialogFragment {
|
||||
return VaultIsRootFolderOfCloudDialog()
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
package org.cryptomator.presentation.ui.dialog
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.DialogInterface
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import org.cryptomator.generator.Dialog
|
||||
import org.cryptomator.presentation.R
|
||||
import kotlinx.android.synthetic.main.dialog_vaults_removed_during_migration.tv_message
|
||||
|
||||
@Dialog(R.layout.dialog_vaults_removed_during_migration)
|
||||
class VaultsRemovedDuringMigrationDialog : BaseDialog<Activity>() {
|
||||
|
||||
public override fun setupDialog(builder: AlertDialog.Builder): android.app.Dialog {
|
||||
val vaultsRemovedDuringMigration = requireArguments().getSerializable(VAULTS_REMOVED_ARG) as Pair<String, ArrayList<String>>
|
||||
|
||||
return builder //
|
||||
.setTitle(String.format(getString(R.string.dialog_vaults_removed_during_migration_title), vaultsRemovedDuringMigration.first)) //
|
||||
.setNeutralButton(R.string.dialog_vaults_removed_during_migration_neutral_button) { dialog: DialogInterface, _: Int -> dialog.dismiss() }
|
||||
.create()
|
||||
}
|
||||
|
||||
public override fun setupView() {
|
||||
val vaultsRemovedDuringMigration = requireArguments().getSerializable(VAULTS_REMOVED_ARG) as Pair<String, ArrayList<String>>
|
||||
|
||||
val vaultsRemovedDuringMigrationString = vaultsRemovedDuringMigration
|
||||
.second
|
||||
.map { path -> "* $path" }
|
||||
.reduce { acc, s -> "$acc\n$s" }
|
||||
|
||||
tv_message.text = String.format(getString(R.string.dialog_vaults_removed_during_migration_hint), vaultsRemovedDuringMigrationString)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
private const val VAULTS_REMOVED_ARG = "vaultsRemovedArg"
|
||||
|
||||
fun newInstance(vaultsRemovedDuringMigration: Pair<String, List<String>>): DialogFragment {
|
||||
val args = Bundle()
|
||||
args.putSerializable(VAULTS_REMOVED_ARG, vaultsRemovedDuringMigration)
|
||||
val fragment = VaultsRemovedDuringMigrationDialog()
|
||||
fragment.arguments = args
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
package org.cryptomator.presentation.ui.fragment
|
||||
|
||||
import android.os.Environment
|
||||
import android.util.TypedValue
|
||||
import android.view.View.GONE
|
||||
import android.view.View.VISIBLE
|
||||
@ -13,10 +12,7 @@ import org.cryptomator.presentation.presenter.CloudConnectionListPresenter
|
||||
import org.cryptomator.presentation.ui.adapter.CloudConnectionListAdapter
|
||||
import javax.inject.Inject
|
||||
import kotlinx.android.synthetic.main.fragment_browse_cloud_connections.floating_action_button
|
||||
import kotlinx.android.synthetic.main.fragment_browse_cloud_connections.rv_local_default_cloud
|
||||
import kotlinx.android.synthetic.main.recycler_view_layout.recyclerView
|
||||
import kotlinx.android.synthetic.main.view_cloud_connection_content.cloudSubText
|
||||
import kotlinx.android.synthetic.main.view_cloud_connection_content.cloudText
|
||||
import kotlinx.android.synthetic.main.view_empty_cloud_connections.rl_creation_hint
|
||||
|
||||
@Fragment(R.layout.fragment_browse_cloud_connections)
|
||||
@ -42,7 +38,6 @@ class CloudConnectionListFragment : BaseFragment() {
|
||||
|
||||
override fun setupView() {
|
||||
setupRecyclerView()
|
||||
rv_local_default_cloud.setOnClickListener { cloudConnectionListPresenter.onDefaultLocalCloudConnectionClicked() }
|
||||
floating_action_button.setOnClickListener { cloudConnectionListPresenter.onAddConnectionClicked() }
|
||||
}
|
||||
|
||||
@ -71,11 +66,5 @@ class CloudConnectionListFragment : BaseFragment() {
|
||||
|
||||
fun setSelectedCloudType(selectedCloudType: CloudTypeModel) {
|
||||
this.selectedCloudType = selectedCloudType
|
||||
|
||||
if (CloudTypeModel.LOCAL == selectedCloudType) {
|
||||
rv_local_default_cloud.visibility = VISIBLE
|
||||
cloudText.text = getString(R.string.screen_cloud_local_default_storage_title)
|
||||
cloudSubText.text = Environment.getExternalStorageDirectory().toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
package org.cryptomator.presentation.ui.fragment
|
||||
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.text.SpannableString
|
||||
import android.text.style.ForegroundColorSpan
|
||||
@ -259,9 +258,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
|
||||
if (enabled) {
|
||||
activity().grantLocalStoragePermissionForAutoUpload()
|
||||
} else {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
PhotoContentJob.cancelJob(activity().applicationContext)
|
||||
}
|
||||
PhotoContentJob.cancelJob(activity().applicationContext)
|
||||
}
|
||||
(findPreference(SharedPreferencesHandler.PHOTO_UPLOAD) as SwitchPreferenceCompat?)?.isChecked = enabled
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ import org.cryptomator.presentation.model.ProgressModel;
|
||||
import org.cryptomator.presentation.model.mappers.CloudModelMapper;
|
||||
import org.cryptomator.presentation.presenter.ChooseCloudServicePresenter;
|
||||
import org.cryptomator.presentation.presenter.VaultListPresenter;
|
||||
import org.cryptomator.presentation.ui.dialog.VaultIsRootFolderOfCloudDialog;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Arrays;
|
||||
@ -116,9 +117,13 @@ public class AddExistingVaultWorkflow extends Workflow<AddExistingVaultWorkflow.
|
||||
@Callback
|
||||
void cryptomatorFileChosen(SerializableResult<CloudFileModel> result) {
|
||||
CloudFileModel masterkeyFile = result.getResult();
|
||||
state().masterkeyFile = masterkeyFile.toCloudNode();
|
||||
presenter().getView().showProgress(ProgressModel.GENERIC);
|
||||
finish();
|
||||
if(!masterkeyFile.getPath().equals("/masterkey.cryptomator") && !masterkeyFile.getPath().equals("/vault.cryptomator")) {
|
||||
state().masterkeyFile = masterkeyFile.toCloudNode();
|
||||
presenter().getView().showProgress(ProgressModel.GENERIC);
|
||||
finish();
|
||||
} else {
|
||||
presenter().getView().showDialog(VaultIsRootFolderOfCloudDialog.Companion.newInstance());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="@dimen/activity_vertical_margin">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_message"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:text="@string/dialog_vault_is_root_folder_of_cloud_hint" />
|
||||
|
||||
</RelativeLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="@dimen/activity_vertical_margin">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_message"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:text="@string/dialog_vaults_removed_during_migration_hint" />
|
||||
|
||||
</RelativeLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
@ -9,38 +9,10 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/rv_local_default_cloud"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone">
|
||||
|
||||
<include
|
||||
android:id="@+id/default_local_cloud"
|
||||
layout="@layout/view_default_local_cloud"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="72dp"
|
||||
android:clickable="true"
|
||||
android:clipToPadding="true"
|
||||
android:focusable="true" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/default_local_cloud"
|
||||
android:layout_marginStart="16dp"
|
||||
android:singleLine="true"
|
||||
android:text="@string/screen_cloud_local_custom_storage_title"
|
||||
android:textColor="@color/colorPrimary"
|
||||
android:textSize="16sp" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<include
|
||||
layout="@layout/recycler_view_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_below="@+id/rv_local_default_cloud"
|
||||
android:clipToPadding="true"
|
||||
android:paddingBottom="88dp" />
|
||||
|
||||
|
@ -105,7 +105,6 @@
|
||||
<string name="screen_cloud_connections_title">اختر المسار</string>
|
||||
<string name="screen_cloud_connections_no_connections">انقر هنا لإضافة مسار</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">لا يبدو أن الخادم متوافق مع WebDAV</string>
|
||||
<string name="screen_cloud_local_default_storage_title">ذاكرة التخزين الافتراضية</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">لا توجد مواقع إضافية متاحة.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">الرابط</string>
|
||||
|
@ -108,8 +108,6 @@
|
||||
<string name="screen_cloud_connections_title">Trieu una destinació</string>
|
||||
<string name="screen_cloud_connections_no_connections">Feu clic aquí per afegir destinacions</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">El servidor no sembla que sigui compatible amb WebDAV</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Ubicacions personalitzades</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Emmagatzematge predefinit</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">No hi ha ubicacions addicionals disponibles.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
|
@ -23,6 +23,7 @@
|
||||
<string name="error_general_update">Kontrola aktualizací se nezdařila. Došlo k obecné chybě.</string>
|
||||
<string name="error_hash_mismatch_update">Kontrola aktualizace se nezdařila. Hash neodpovídá nahranému souboru</string>
|
||||
<string name="error_update_no_internet">Kontrola aktualizací se nezdařila. Žádné připojení k internetu.</string>
|
||||
<string name="error_play_services_not_available">Obchod Google Play není nainstalován</string>
|
||||
<string name="error_biometric_auth_aborted">Ověření pomocí otisků prstů selhalo</string>
|
||||
<string name="error_vault_config_loading">Obecná chyba při načítání konfigurace trezoru</string>
|
||||
<string name="error_file_not_found_after_opening_using_3party">Místní soubor již není přítomen po přepnutí zpět na Cryptomator. Možné změny nelze promítnout zpět do cloudu.</string>
|
||||
@ -112,8 +113,6 @@
|
||||
<string name="screen_cloud_connections_title">Vyberte umístění</string>
|
||||
<string name="screen_cloud_connections_no_connections">Klikněte zde pro přidání umístění</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Server není kompatibilní s WebDAV</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Vlastní umístění</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Výchozí úložiště</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Nejsou k dispozici žádná další umístění.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
|
@ -16,7 +16,7 @@
|
||||
<string name="error_cloud_already_exists">Cloud existiert bereits.</string>
|
||||
<string name="error_activity_not_found">Installiere eine App, die diesen Dateityp unterstützt.</string>
|
||||
<string name="error_server_not_found">Server nicht gefunden.</string>
|
||||
<string name="error_device_policy_manager_not_found">Bitte öffne die Einstellungen und setze den Sperrbildschirm von Hand</string>
|
||||
<string name="error_device_policy_manager_not_found">Bitte öffne die Einstellungen Deines Geräts und stelle die Bildschirmsperre von Hand ein</string>
|
||||
<string name="error_export_illegal_file_name">Export fehlgeschlagen. Versuche, Sonderzeichen aus den Dateinamen zu entfernen und erneut zu exportieren.</string>
|
||||
<string name="error_name_contains_invalid_characters">Keine Sonderzeichen möglich.</string>
|
||||
<string name="error_names_contains_invalid_characters">Dateinamen können keine Sonderzeichen enthalten.</string>
|
||||
@ -27,7 +27,7 @@
|
||||
<string name="error_failed_to_decrypt_webdav_password">Beim entschlüsseln des WebDAV-Passworts trat ein Fehler auf. Bitte in den Einstellungen erneut festlegen.</string>
|
||||
<string name="error_play_services_not_available">Die Google Play Services sind nicht installiert</string>
|
||||
<string name="error_biometric_auth_aborted">Biometrischer Login abgebrochen</string>
|
||||
<string name="error_vault_version_mismatch">Die in der %1$s-Datei angegebene Version ist nicht identisch mit jener der %2$s-Datei</string>
|
||||
<string name="error_vault_version_mismatch">Die in %1$s angegebene Version ist nicht identisch mit der Version in %2$s</string>
|
||||
<string name="error_vault_key_invalid">%1$s-Datei stimmt nicht mit der %2$s-Datei überein</string>
|
||||
<string name="error_vault_config_loading">Allgemeiner Fehler beim Laden der Tresorkonfiguration</string>
|
||||
<string name="error_file_not_found_after_opening_using_3party">Lokale Datei ist nach dem Zurückwechseln zu Cryptomator nicht mehr vorhanden. Mögliche Änderungen können nicht in die Cloud übertragen werden.</string>
|
||||
@ -41,6 +41,7 @@
|
||||
<string name="permission_message_export_file">Zum Exportieren von Dateien benötigt Cryptomator Speicherzugriff</string>
|
||||
<string name="permission_message_upload_file">Zum Hochladen von Dateien benötigt Cryptomator Speicherzugriff</string>
|
||||
<string name="permission_message_share_file">Zum Teilen von Dateien benötigt Cryptomator Speicherzugriff</string>
|
||||
<string name="permission_revoked_re_request_permission">Cryptomator hat die Berechtigung zum Zugriff auf diesen Ort verloren. Bitte wähle diesen Ordner erneut aus, um die Berechtigung wiederherzustellen.</string>
|
||||
<string name="snack_bar_action_title_settings">Einstellungen</string>
|
||||
<string name="snack_bar_action_title_search">Suche</string>
|
||||
<string name="snack_bar_action_title_search_previous">Vorheriges</string>
|
||||
@ -115,8 +116,6 @@
|
||||
<string name="screen_cloud_connections_title">Ort auswählen</string>
|
||||
<string name="screen_cloud_connections_no_connections">Hier klicken um einen neuen Ort hinzufügen</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Server scheint nicht WebDAV-kompatibel zu sein</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Benutzerdefinierte Orte</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Standard-Speicher</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Weitere Orte sind nicht verfügbar.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -290,6 +289,10 @@
|
||||
<string name="dialog_app_is_obscured_info_title">App wird verdeckt</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">Eine App zeigt etwas über Cryptomator an (z.B. ein Blaulichtfilter oder eine Nachtmodus-App). Aus Sicherheitsgründen ist Cryptomator deaktiviert.\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Wie Cryptomator aktiviert werden kann</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Schließen</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">Bitte Tresore für die %1s-Cloud erneut hinzufügen</string>
|
||||
<string name="dialog_vaults_removed_during_migration_hint">Während der Migration auf diese App-Version müssen wir folgende Tresore aus der App entfernen:\n%2s \n\nDiese Tresore werden nicht aus der Cloud entfernt, sondern nur aus dieser App. Entschuldigung für die Unannehmlichkeiten. Füge diese Tresore bitte erneut hinzu, um weiter mit ihnen zu arbeiten.</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">Tresor ist Wurzelverzeichnis der Cloud-Verbindung</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_hint">Erstelle eine neue Cloud-Verbindung, wo du mindestens den übergeordneten Ordner dieses Tresors als Wurzelverzeichnis auswählst, um diesen Tresor hinzuzufügen.</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">Dies ist eine Sicherheitsfunktion, die andere Anwendungen daran hindert, Nutzer zu ungewollten Aktionen zu verleiten.\n\nDurch Deaktivieren bestätigst du, dass du dir <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">der Risiken bewusst</a> bist.</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">Bist du dir sicher, dass du die Cloud-Verbindung entfernen möchtest?</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">Dieser Vorgang wird die Cloud-Verbindung und alle zugehörigen Tresore löschen.</string>
|
||||
@ -321,7 +324,7 @@
|
||||
<string name="dialog_no_more_images_to_display">Keine weiteren Bilder anzuzeigen…</string>
|
||||
<string name="dialog_pcloud_credentials_updated_title">Anmeldedaten von \'%1$s\' aktualisiert</string>
|
||||
<string name="dialog_pcloud_credentials_updated">Falls du ein neues pCloud-Konto hinzufügen wolltest, klicke auf diese URL <a href="https://www.pcloud.com">www.pcloud.com</a>, melde dich vom aktuellen Konto ab und klicke in dieser App erneut auf das „+“, um eine neue Cloud-Verbindung zu erstellen.</string>
|
||||
<string name="permission_snackbar_auth_local_vault">Cryptomator benötigt Speicherzugriff, um lokale Tresore nutzen zu können</string>
|
||||
<string name="permission_snackbar_auth_local_vault">Um lokale Tresore nutzen zu können benötigt Cryptomator Speicherzugriff</string>
|
||||
<string name="permission_snackbar_auth_auto_upload">Cryptomator benötigt Zugriff auf den Speicher um den automatischen Foto-Upload zu nutzen</string>
|
||||
<!-- # error reports -->
|
||||
<!-- # misc -->
|
||||
|
@ -41,6 +41,7 @@
|
||||
<string name="permission_message_export_file">Το Cryptomator χρειάζεται πρόσβαση στον αποθηκευτικό χώρο για την εξαγωγή αρχείων</string>
|
||||
<string name="permission_message_upload_file">Το Cryptomator χρειάζεται πρόσβαση στον αποθηκευτικό χώρο για μεταφόρτωση αρχείων</string>
|
||||
<string name="permission_message_share_file">Το Cryptomator χρειάζεται πρόσβαση στον αποθηκευτικό χώρο για κοινή χρήση αρχείων</string>
|
||||
<string name="permission_revoked_re_request_permission">Το Cryptomator έχει χάσει την άδεια πρόσβασης σε αυτήν την τοποθεσία. Παρακαλώ επιλέξτε ξανά αυτόν το φάκελο για να επαναφέρετε το δικαίωμα.</string>
|
||||
<string name="snack_bar_action_title_settings">Ρυθμίσεις</string>
|
||||
<string name="snack_bar_action_title_search">Αναζήτηση</string>
|
||||
<string name="snack_bar_action_title_search_previous">Προηγούμενο</string>
|
||||
@ -115,8 +116,6 @@
|
||||
<string name="screen_cloud_connections_title">Επιλέξτε μια τοποθεσία</string>
|
||||
<string name="screen_cloud_connections_no_connections">Κάντε κλικ εδώ για να προσθέσετε τοποθεσίες</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Ο διακομιστής δεν φαίνεται να είναι συμβατός με WebDAV</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Προσαρμοσμένες τοποθεσίες</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Προεπιλεγμένος χώρος αποθήκευσης</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Δεν υπάρχουν διαθέσιμες πρόσθετες τοποθεσίες.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -290,6 +289,10 @@
|
||||
<string name="dialog_app_is_obscured_info_title">Η εφαρμογή αποκρύπτεται</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">Μια άλλη εφαρμογή εμφανίζει κάτι πάνω από το Cryptomator (π.χ. ένα φίλτρο μπλε φωτός ή μια εφαρμογή νυχτερινής λειτουργίας). Για λόγους ασφαλείας, το Cryptomator είναι απενεργοποιημένο.\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Πώς να ενεργοποιήσετε το Cryptomator</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Κλείσιμο</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">Παρακαλώ προσθέστε ξανά κρύπτες για %1s cloud</string>
|
||||
<string name="dialog_vaults_removed_during_migration_hint">Κατά τη μετάβαση σε αυτήν την έκδοση της εφαρμογής, πρέπει να αφαιρέσουμε τις ακόλουθες κρύπτες από την εφαρμογή:\n%2s\n\nΑυτές οι κρύπτες δεν έχουν αφαιρεθεί από το cloud αλλά μόνο από αυτήν την εφαρμογή. Λυπούμαστε για την ταλαιπωρία και παρακαλούμε προσθέστε ξανά αυτές τις κρύπτες για να συνεχίσετε να εργάζεστε μαζί τους.</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">Η κρύπτη είναι ριζικός φάκελος της σύνδεσης cloud</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_hint">Δημιουργήστε μια νέα σύνδεση στο cloud όπου επιλέγετε τουλάχιστον τον γονικό φάκελο αυτού του φακέλου κρύπτης ως ριζικό κατάλογο για να προσθέσετε αυτή την κρύπτη.</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">Αυτή η ρύθμιση είναι μια λειτουργία ασφαλείας και αποτρέπει άλλες εφαρμογές από το να ξεγελάσουν τους χρήστες να κάνουν πράγματα που δεν θέλουν να κάνουν.\n\nΜε την απενεργοποίηση, επιβεβαιώνετε ότι γνωρίζετε <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">τους κινδύνους</a>.</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτή τη σύνδεση cloud;</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">Αυτή η ενέργεια θα αφαιρέσει τη σύνδεση στο cloud και όλες οι κρύπτες αυτού του cloud.</string>
|
||||
|
@ -41,6 +41,7 @@
|
||||
<string name="permission_message_export_file">Cryptomator necesita acceso al almacenamiento para exportar archivos.</string>
|
||||
<string name="permission_message_upload_file">Cryptomator necesita acceso al almacenamiento para subir archivos.</string>
|
||||
<string name="permission_message_share_file">Cryptomator necesita acceso al almacenamiento para compartir archivos.</string>
|
||||
<string name="permission_revoked_re_request_permission">Cryptomator ha perdido permiso para acceder a esta ubicación. Seleccione esta carpeta de nuevo para restaurar el permiso.</string>
|
||||
<string name="snack_bar_action_title_settings">Configuración</string>
|
||||
<string name="snack_bar_action_title_search">Buscar</string>
|
||||
<string name="snack_bar_action_title_search_previous">Anterior</string>
|
||||
@ -115,8 +116,6 @@
|
||||
<string name="screen_cloud_connections_title">Elegir ubicación</string>
|
||||
<string name="screen_cloud_connections_no_connections">Haz clic aquí para añadir ubicaciones</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">El servidor no parece ser compatible con WebDAV</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Ubicaciones personalizadas</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Almacenamiento predeterminado</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">No hay ubicaciones extra disponibles.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -290,6 +289,10 @@
|
||||
<string name="dialog_app_is_obscured_info_title">La aplicación está oscura</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">Otra aplicación muestra algo en la parte superior de Cryptomator (por ejemplo, un filtro de luz azul o una aplicación en modo nocturno). Por razones de seguridad, Cryptomator está desactivado.\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Cómo activar Cryptomator</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Cerrar</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">Vuelva a añadir bóvedas para la nube %1s</string>
|
||||
<string name="dialog_vaults_removed_during_migration_hint">Mientras se migra a esta versión de la aplicación, necesitamos eliminar las siguientes bóvedas de la aplicación:\n%2s \n\nEsas bóvedas no se eliminan de la nube sino sólo de esta aplicación. Lamentamos las molestias, por favor añada de nuevo estas bóvedas para seguir trabajando con ellas.</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">La bóveda es la carpeta raíz de la conexión a la nube</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_hint">Crear 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.</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">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 <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">consciente de los riesgos</a>.</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">\"¿Estás seguro de que quieres eliminar esta conexión de nube?</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">Esta acción eliminará la conexión de nube y todas las cajas fuertes de esta nube.</string>
|
||||
|
276
presentation/src/main/res/values-fil-rPH/strings.xml
Normal file
276
presentation/src/main/res/values-fil-rPH/strings.xml
Normal file
@ -0,0 +1,276 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- # app -->
|
||||
<string name="share_with_label">I-encrypt</string>
|
||||
<!-- # error messages -->
|
||||
<string name="error_generic">Nagkaroon ng error</string>
|
||||
<string name="error_authentication_failed">Bigo ang pagpapatunay</string>
|
||||
<string name="error_authentication_failed_re_authenticate">Bigo ang pagtutunay, maaaring maglogin gamit ang %1$s</string>
|
||||
<string name="error_no_network_connection">Walang koneksyon sa network</string>
|
||||
<string name="error_invalid_passphrase">Mali ang password</string>
|
||||
<string name="error_vault_version_not_supported">Hindi suportado ang vault na ito. Ang vault na ito ay ginawa gamit ang ibang bersyon ng Cryptomator.</string>
|
||||
<string name="error_vault_already_exists">Umiiral na ang vault na ito.</string>
|
||||
<string name="error_no_such_file">Ang file na ito ay hindi pa umiiral.</string>
|
||||
<string name="error_vault_has_been_locked">Naisara na ang vault.</string>
|
||||
<string name="error_cloud_already_exists">Umiiral na ang cloud na ito.</string>
|
||||
<string name="error_activity_not_found">Magdownload ng app na kayang buksan ang file na ito.</string>
|
||||
<string name="error_server_not_found">Hindi mahanap ang server.</string>
|
||||
<string name="error_device_policy_manager_not_found">Maaaring buksan ang device settings at sariling itakda ang screen lock</string>
|
||||
<string name="error_name_contains_invalid_characters">Hindi maaring maglagay ng espesyal na mga karakter.</string>
|
||||
<string name="error_names_contains_invalid_characters">Hindi maaaring lagyan ng espesyal na karakter ang pangalan ng file.</string>
|
||||
<string name="error_vault_name_contains_invalid_characters">Hindi maaaring lagyan ng espesyal na karakter ang pangalan ng file.</string>
|
||||
<string name="error_play_services_not_available">Hindi naka-install ang Google Play Services</string>
|
||||
<string name="error_biometric_auth_aborted">Kinansela ang biometric authentication</string>
|
||||
<string name="error_no_such_bucket">Hindi matagpuan ang bucket na ito</string>
|
||||
<string name="error_masterkey_location_not_supported">Hindi pa suportado ang custom Masterkey location</string>
|
||||
<!-- # clouds -->
|
||||
<!-- ## cloud names -->
|
||||
<string name="cloud_names_local_storage">Local storage</string>
|
||||
<!-- # permission -->
|
||||
<!-- ## permission messages -->
|
||||
<string name="snack_bar_action_title_settings">Settings</string>
|
||||
<string name="snack_bar_action_title_search">Hanapin</string>
|
||||
<string name="snack_bar_action_title_search_previous">Nakaraan</string>
|
||||
<string name="snack_bar_action_title_search_next">Sunod</string>
|
||||
<string name="snack_bar_action_title_sort">Ayusin</string>
|
||||
<string name="snack_bar_action_title_sort_az">A - Z</string>
|
||||
<string name="snack_bar_action_title_sort_za">Z - A</string>
|
||||
<string name="snack_bar_action_title_sort_newest">Bago muna</string>
|
||||
<string name="snack_bar_action_title_sort_oldest">Luma muna</string>
|
||||
<string name="snack_bar_action_title_sort_biggest">Pinakamalaki muna</string>
|
||||
<string name="snack_bar_action_title_sort_smallest">Pinakamaliit muna</string>
|
||||
<!-- # screens -->
|
||||
<!-- # screen: vault list -->
|
||||
<string name="screen_vault_list_actions_title">Idagdag sa Cryptomator</string>
|
||||
<string name="screen_vault_list_action_create_new_vault">Gumawa ng bagong vault</string>
|
||||
<string name="screen_vault_list_action_add_existing_vault">Magdagdag ng umiiral na vault</string>
|
||||
<string name="screen_vault_list_vault_action_delete">Tanggalin</string>
|
||||
<string name="screen_vault_list_vault_creation_hint">Pindutin dito para gumawa ng bagong vault</string>
|
||||
<string name="screen_vault_list_change_password_successful">Matagumpay na napalitan ang password</string>
|
||||
<!-- # screen: file browser -->
|
||||
<string name="screen_file_browser_default_title">Vault</string>
|
||||
<string name="screen_file_browser_add_existing_vault_extra_text">Piliin ang masterkey file</string>
|
||||
<string name="screen_file_browser_create_new_vault_button_text">Ilagay dito</string>
|
||||
<string name="screen_file_browser_create_new_vault_extra_text">Pangalan ng vault: %1$s</string>
|
||||
<string name="screen_file_browser_move_button_text">Ilipat</string>
|
||||
<string name="screen_file_browser_msg_empty_folder">Walang laman na folder</string>
|
||||
<string name="screen_file_browser_share_intent_chooser_title">Ibahagi kay</string>
|
||||
<string name="screen_file_browser_share_destination_title">Pumili ng destinasyon</string>
|
||||
<string name="screen_file_browser_share_button_text">Pumili</string>
|
||||
<string name="screen_file_browser_nothing_to_share">Walang maibabahagi</string>
|
||||
<string name="screen_file_browser_actions_title">Idagdag sa %1$s</string>
|
||||
<string name="screen_file_browser_action_create_folder">Gumawa ng folder</string>
|
||||
<string name="screen_file_browser_action_create_new_text_file">Gumawa ng text file</string>
|
||||
<string name="screen_file_browser_action_upload_files">I-upload ang mga files</string>
|
||||
<string name="screen_file_browser_upload_files_chooser_title">Files</string>
|
||||
<string name="screen_file_browser_msg_file_exported">Na-export na ang file</string>
|
||||
<string name="screen_file_browser_msg_files_exported">Na-export na ang mga files</string>
|
||||
<string name="screen_file_browser_node_action_share">Ibahagi</string>
|
||||
<string name="screen_file_browser_node_action_rename">Baguhin ang pangalan</string>
|
||||
<string name="screen_file_browser_node_action_edit_text">I-edit</string>
|
||||
<string name="screen_file_browser_node_action_export">I-export</string>
|
||||
<string name="screen_file_browser_node_action_delete">Burahin</string>
|
||||
<string name="screen_file_browser_node_action_open_with_text">Buksan gamit ang …</string>
|
||||
<string name="screen_file_browser_selection_mode_title_zero_elements">Pumilii</string>
|
||||
<string name="screen_file_browser_selection_mode_title_one_or_more_elements">%1$d ang nakapili</string>
|
||||
<string name="screen_file_browser_select_items">Piliin</string>
|
||||
<string name="screen_file_browser_select_all_items">Piliin lahat</string>
|
||||
<string name="screen_file_browser_refresh_items">I-refresh</string>
|
||||
<string name="screen_file_browser_no_connection_message">Walang koneksyon</string>
|
||||
<string name="screen_file_browser_no_connection_button_text">Subukan muli</string>
|
||||
<!-- ## screen: text editor -->
|
||||
<string name="screen_text_editor_save_success">Matagumpay na nai-save</string>
|
||||
<!-- ## screen: share files -->
|
||||
<string name="screen_share_files_title">I-save ang %1$s sa …</string>
|
||||
<string name="screen_share_files_content_text">text</string>
|
||||
<string name="screen_share_files_content_file">file</string>
|
||||
<string name="screen_share_files_content_files">files</string>
|
||||
<string name="screen_share_files_msg_filenames_must_be_unique">Natatangi dapat ang pangalan ng mga files, maaari lamang na palitan ang mga may kapareho.</string>
|
||||
<string name="screen_share_files_section_location">I-save ang lokasyon</string>
|
||||
<string name="screen_share_files_save_button_text">I-save</string>
|
||||
<string name="screen_share_files_msg_success">Natapos na ang pag-encrypt</string>
|
||||
<!-- ## screen: choose cloud service -->
|
||||
<string name="screen_choose_cloud_service_title">Cloud service</string>
|
||||
<!-- ## screen: cloud connections -->
|
||||
<string name="screen_cloud_connections_title">Piliin ang location</string>
|
||||
<string name="screen_cloud_connections_no_connections">Pindutin dito upang magdagdag ng lugar</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Ang server na ito ay mukhang hindi tugma sa WebDAV</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Walang ibang lokasyon na magagamit.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
<string name="screen_webdav_settings_username_label">Username</string>
|
||||
<string name="screen_webdav_settings_password_label">Password</string>
|
||||
<string name="screen_webdav_settings_done_button_text">Kumonekta</string>
|
||||
<string name="screen_webdav_settings_msg_url_must_not_be_empty">Hindi maaaring walang laman ang URL.</string>
|
||||
<string name="screen_webdav_settings_msg_url_is_invalid">Hindi tama ang URL.</string>
|
||||
<string name="screen_webdav_settings_msg_username_must_not_be_empty">Hindi maaaring walang laman ang username.</string>
|
||||
<string name="screen_webdav_settings_msg_password_must_not_be_empty">Hindi maaaring walang laman ang password.</string>
|
||||
<!-- ## screen: s3 settings -->
|
||||
<string name="screen_s3_settings_access_key_label">Access Key</string>
|
||||
<string name="screen_s3_settings_region_label">Rehiyon</string>
|
||||
<string name="screen_s3_settings_msg_bucket_not_empty">Hindi maaaring walang laman ang bucket</string>
|
||||
<string name="screen_s3_settings_msg_endpoint_and_region_not_empty">Hindi maaaring walang laman ang endpoint o ang rehiyon</string>
|
||||
<!-- ## screen: enter vault name -->
|
||||
<string name="screen_enter_vault_name_msg_name_empty">Hindi maaaring walang pangalan ang vault.</string>
|
||||
<string name="screen_enter_vault_name_vault_label">Pangalan ng Vault</string>
|
||||
<string name="screen_enter_vault_name_button_text">Gumawa</string>
|
||||
<!-- ## screen: set password -->
|
||||
<string name="screen_set_password_title">Itakda ang password</string>
|
||||
<string name="screen_set_password_msg_password_mismatch">Hindi nagtugma ang bagong password sa ni-retype na password.</string>
|
||||
<string name="screen_set_password_button_text">Tapos na</string>
|
||||
<string name="screen_set_password_hint">IMPORTANTE: Walang paraan para maisalba ang iyong datos kapag nakalimutan ang iyong password.</string>
|
||||
<string name="screen_set_password_retype_password_label">Muling ilagay ang password</string>
|
||||
<string name="screen_set_password_strength_indicator_0">Masyadong mahina para gumawa ng vault</string>
|
||||
<string name="screen_set_password_strength_indicator_1">Mahina</string>
|
||||
<string name="screen_set_password_strength_indicator_2">Patas</string>
|
||||
<string name="screen_set_password_strength_indicator_3">Malakas</string>
|
||||
<string name="screen_set_password_strength_indicator_4">Higit na malakas</string>
|
||||
<!-- ## screen: settings -->
|
||||
<string name="screen_settings_section_general">Pangkalahatan</string>
|
||||
<string name="screen_settings_cloud_settings_label">Cloud services</string>
|
||||
<string name="screen_settings_biometric_auth">Biometric authentication</string>
|
||||
<string name="screen_settings_section_search">Hanapin</string>
|
||||
<string name="screen_settings_auto_lock_timeout">I-lock pagkatapos ng</string>
|
||||
<string name="screen_settings_auto_lock_on_screen_lock">Kapag ang screen ay disabled</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_vault">Pumili ng vault pang upload</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_toggle">I-activate</string>
|
||||
<string name="screen_settings_twitter_label">Sundan kami sa Twitter</string>
|
||||
<string name="screen_settings_facebook_label">I-like kami sa Facebook</string>
|
||||
<string name="screen_settings_section_legal">Ligal</string>
|
||||
<string name="screen_settings_licenses_label">Mga Lisensya</string>
|
||||
<string name="screen_settings_section_support">Suporta</string>
|
||||
<string name="screen_settings_contact_label">Humingi ng tulong</string>
|
||||
<string name="screen_settings_debug_mode_label">Debug mode</string>
|
||||
<string name="screen_settings_error_report_label">Ipadala ang log file</string>
|
||||
<string name="screen_settings_security_label">Mga pahiwatig ng seguridad</string>
|
||||
<string name="screen_settings_section_version">Bersyon</string>
|
||||
<string name="screen_settings_advanced_settings">Mga advanced na setting</string>
|
||||
<string name="screen_settings_background_unlock_preparation_label">Pabilisin ang pag-unlock</string>
|
||||
<!-- ## screen: cloud settings -->
|
||||
<!-- ## screen: licenses -->
|
||||
<!-- ## screen: authenticate cloud -->
|
||||
<!-- ## screen: insecure android version info -->
|
||||
<!-- # dialogs -->
|
||||
<string name="dialog_button_cancel">Kanselahin</string>
|
||||
<string name="dialog_enter_password_positive_button">I-unlock</string>
|
||||
<string name="dialog_change_password_new_password_label">Bagong Password</string>
|
||||
<string name="dialog_change_password">Palitan ang password</string>
|
||||
<string name="dialog_change_password_msg_old_password_empty">Hindi maaaring walang laman ang lumang password field.</string>
|
||||
<string name="dialog_change_password_msg_new_password_empty">Hindi maaaring walang laman ang bagong password field.</string>
|
||||
<string name="dialog_change_password_msg_password_mismatch">Hindi nagtugma ang bagong password sa ni-retype na password.</string>
|
||||
<!-- Vault not found -->
|
||||
<string name="dialog_vault_not_found_positive_button_text">Tanggalin</string>
|
||||
<string name="dialog_existing_file_title">Mayroon na ng file na ito</string>
|
||||
<string name="dialog_existing_file_positive_button">Palitan</string>
|
||||
<string name="dialog_existing_file_message">Umiiral na ang file na may pangalang \'%1$s\'.</string>
|
||||
<string name="dialog_replace_negative_button_at_least_two_but_not_all_files_exist">Laktawan ang umiiral</string>
|
||||
<string name="dialog_replace_positive_button_all_files_exist">Palitan lahat</string>
|
||||
<string name="dialog_replace_positive_button_some_files_exist">Palitan ang umiiral</string>
|
||||
<string name="dialog_replace_positive_button_single_file_exists">Palitan</string>
|
||||
<string name="dialog_replace_msg_single_file_exists">Umiiral na ang file na may pangalang \'%1$s\'. Nais mo bang palitan ito?</string>
|
||||
<string name="dialog_replace_msg_all_files_exists">Ang lahat ng files ay umiiral na. Nais mo bang palitan ang mga ito?</string>
|
||||
<string name="dialog_replace_title_single_file_exists">Palitan ang file?</string>
|
||||
<string name="dialog_replace_title_multiple_files_exist">Palitan ang mga file?</string>
|
||||
<string name="dialog_unable_to_share_positive_button">OK</string>
|
||||
<string name="dialog_unable_to_share_negative_button">Gumawa ng bagong vault</string>
|
||||
<string name="dialog_filetype_not_supported_message">Mag-download ng app na kayang buksan ang file na ito o nais mo bang i-save sa iyong device?</string>
|
||||
<string name="dialog_rename_vault_title">Palitan ang pangalan ng vault</string>
|
||||
<string name="dialog_rename_node_folder_title">Palitan ang pangalan ng folder</string>
|
||||
<string name="dialog_rename_node_file_title">Palitan ang pangalan ng file</string>
|
||||
<string name="dialog_unsaved_changes_title">Mayroon kang hindi na i-save na pagbabago</string>
|
||||
<string name="dialog_unsaved_changes_discard">Ibaliwala</string>
|
||||
<string name="dialog_delete_vault_message">Sigurado ka ba na nais mong alisin ang vault?</string>
|
||||
<string name="dialog_delete_vault_hint">Ang aksyon na ito ay aalisin lamang ang vault sa listahan at hindi ito buburahin.</string>
|
||||
<string name="dialog_progress_please_wait">Pakihintay…</string>
|
||||
<string name="dialog_progress_encryption">Ineencrypt…</string>
|
||||
<string name="dialog_progress_decryption">Dinedecrypt…</string>
|
||||
<string name="dialog_lock_vault">I-lock</string>
|
||||
<string name="dialog_accept_ssl_certificate_title">Hindi wasto ang SSL certificate</string>
|
||||
<string name="dialog_accept_ssl_certificate_hint">Hindi wasto ang SSL certificate. Nais mo paring pagkatiwalaan?</string>
|
||||
<string name="dialog_accept_ssl_certificate_details">Mga detalye</string>
|
||||
<string name="dialog_accept_ssl_certificate_security_checkbox">Maaaring panganib ito sa seguridad. Alam ko ang ginagawa ko.</string>
|
||||
<string name="dialog_http_security_hint">Ang pag-gamit ng HTTP ay hindi ligtas. Kung alam mo ang mga panganib, maaari kang tumuloy gamit ang HTTP.</string>
|
||||
<string name="dialog_http_security_checkbox">Gawing HTTPS</string>
|
||||
<string name="dialog_http_security_title">Gamiting ang HTTPS?</string>
|
||||
<string name="dialog_debug_mode_disclaimer_title">Atensyon</string>
|
||||
<string name="dialog_debug_mode_positive_button">I-enable</string>
|
||||
<string name="dialog_disable_app_obscured_disclaimer_hint">Ang setting na ito ay isang security feature at pinipigilan ang ibang mga apps sa lokohin ang mga gumagamit na gawin ang mga hindi nila gustong gawin.\n\nSa pag-alis nito, kinukumpirma mo na <a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured"> alam mo ang mga panganib</a>.</string>
|
||||
<string name="dialog_disable_app_obscured_disclaimer_title">Atensyon</string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Isara</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">Sigurado ka bang gusto mong tanggalin itong cloud connection?</string>
|
||||
<string name="dialog_confirm_delete_multiple_message">Sigurado ka bang gusto mong burahin ang mga ito?</string>
|
||||
<string name="dialog_confirm_delete_file_message">Sigurado ka bang gusto mong burahin ang file na ito?</string>
|
||||
<string name="dialog_confirm_delete_folder_message">Buburahin nito ang lahat ng laman ng folder. Sigurado ka ba na gusto mong burahin ang folder na ito?</string>
|
||||
<string name="dialog_biometric_auth_key_invalidated_title">Ang biometric authentication feature ay na deactivate na</string>
|
||||
<string name="dialog_biometric_auth_key_invalidated_message">Dahil wala nang bisa ang susi na ito, deactivated na ang biometric authentication feature. Upang paganahin muli, buksan ang settings ng Cryptomator.</string>
|
||||
<string name="dialog_enter_license_title">Magbigay ng wastong lisensya</string>
|
||||
<string name="dialog_enter_license_content">Natuklasan namin na ang nakainstall mong Cryptomator ay hind nanggaling sa Google Play Store. Maaari lamang na magbigay ng wastong lisensya na mabibili sa <a href="https://cryptomator.org/android/">https://cryptomator.org/android/</a></string>
|
||||
<string name="dialog_enter_license_not_valid_content">Ang lisensyang binigay ay hindi wasto. Siguraduhing tama ang iyong pagkakalagay.</string>
|
||||
<string name="dialog_enter_license_decline_button">I-sara</string>
|
||||
<string name="dialog_license_confirmation_message">Salamat %1$s sa pagbigay ng wastong lisensya.</string>
|
||||
<string name="dialog_update_available_update">I-update ngayon</string>
|
||||
<string name="dialog_update_available_cancel">Mamaya</string>
|
||||
<string name="dialog_sym_link_title">Ang folder na ito ay isang symbolic link</string>
|
||||
<string name="dialog_sym_link_message">Hindi maaaring puntahan ang symbolic link na ito</string>
|
||||
<string name="dialog_sym_link_back_button">Bumalik</string>
|
||||
<!-- # error reports -->
|
||||
<!-- # misc -->
|
||||
<!-- ## file size helper -->
|
||||
<string name="file_size_zero">Zero kB</string>
|
||||
<string name="file_size_unit_bytes">bytes</string>
|
||||
<string name="file_size_unit_kilo_bytes">kB</string>
|
||||
<string name="file_size_unit_mega_bytes">MB</string>
|
||||
<string name="file_size_unit_giga_bytes">GB</string>
|
||||
<string name="file_size_unit_tera_bytes">TB</string>
|
||||
<!-- ## date helper -->
|
||||
<string name="time_unit_seconds_sg">segundo</string>
|
||||
<string name="time_unit_seconds_pl">segundo</string>
|
||||
<string name="time_unit_minutes_sg">minuto</string>
|
||||
<string name="time_unit_minutes_pl">minuto</string>
|
||||
<string name="time_unit_hours_sg">oras</string>
|
||||
<string name="time_unit_hours_pl">oras</string>
|
||||
<string name="time_unit_days_sg">araw</string>
|
||||
<string name="time_unit_days_pl">araw</string>
|
||||
<string name="time_unit_weeks_sg">linggo</string>
|
||||
<string name="time_unit_weeks_pl">linggo</string>
|
||||
<string name="time_unit_months_sg">buwan</string>
|
||||
<string name="time_unit_months_pl">buwan</string>
|
||||
<string name="time_unit_years_sg">taon</string>
|
||||
<string name="time_unit_years_pl">taon</string>
|
||||
<!-- ## biometric authentication -->
|
||||
<string name="dialog_biometric_auth_title">Biometric login</string>
|
||||
<string name="dialog_biometric_auth_message">Mag-log in gamit ang iyong biometric credential</string>
|
||||
<string name="dialog_biometric_auth_use_password">Gamitin ang vault password</string>
|
||||
<!-- notification -->
|
||||
<string name="notification_unlocked">Vaults na na-unlock: %1$d</string>
|
||||
<string name="notification_timeout">Autolock in %1$s</string>
|
||||
<string name="notification_lock_all">I-lock lahat</string>
|
||||
<string name="notification_cancel_auto_upload">Ikansela ang pag-upload</string>
|
||||
<string name="notification_auto_upload_message">Uploading %1d/%2d</string>
|
||||
<string name="screen_settings_lru_cache">Cache</string>
|
||||
<string name="screen_settings_lru_cache_size">Kabuuang laki ng cache</string>
|
||||
<string name="screen_settings_clear_lru_cache_size">Linisin ang Cache</string>
|
||||
<string name="screen_settings_lru_cache_changed__restart_toast">Ang mga pagbabago ay makikita pagkatapos ng pag-restart ng app</string>
|
||||
<!-- lock timeout names -->
|
||||
<string name="lock_timeout_1m">1 minuto</string>
|
||||
<string name="lock_timeout_2m">2 minuto</string>
|
||||
<string name="lock_timeout_5m">5 minuto</string>
|
||||
<string name="lock_timeout_10m">10 minuto</string>
|
||||
<string name="lock_timeout_never">Hindi kailanman</string>
|
||||
<!-- cache size names -->
|
||||
<string name="cache_size_50m">50 MB</string>
|
||||
<string name="cache_size_100m">100 MB</string>
|
||||
<string name="cache_size_250m">250 MB</string>
|
||||
<string name="cache_size_500m">500 MB</string>
|
||||
<string name="cache_size_1000m">1 GB</string>
|
||||
<string name="cache_size_5000m">5 GB</string>
|
||||
<!-- screen scheme mode names -->
|
||||
<string name="screen_settings_style_mode">Estilo</string>
|
||||
<string name="follow_system">Awtomatico (sundan ang system)</string>
|
||||
<string name="light">Light</string>
|
||||
<string name="dark">Dark</string>
|
||||
<!-- update interval names -->
|
||||
<string name="update_interval_1d">Isang beses sa isang araw</string>
|
||||
<string name="update_interval_1w">Isang beses sa isang linggo</string>
|
||||
<string name="update_interval_1m">Isang beses sa isang buwan</string>
|
||||
</resources>
|
@ -16,6 +16,7 @@
|
||||
<string name="error_cloud_already_exists">Cloud existant.</string>
|
||||
<string name="error_activity_not_found">Veuillez télécharger une application qui peut ouvrir ce fichier.</string>
|
||||
<string name="error_server_not_found">Serveur introuvable.</string>
|
||||
<string name="error_device_policy_manager_not_found">Veuillez ouvrir les paramètres de votre appareil et régler le verrouillage de l\'écran à la main</string>
|
||||
<string name="error_export_illegal_file_name">L\'exportation a échoué. Essayez de supprimer les caractères spéciaux des noms de fichiers et d\'exporter à nouveau.</string>
|
||||
<string name="error_name_contains_invalid_characters">Ne peut pas contenir de caractères spéciaux.</string>
|
||||
<string name="error_names_contains_invalid_characters">Les noms de fichiers ne peuvent pas contenir de caractères spéciaux.</string>
|
||||
@ -23,7 +24,11 @@
|
||||
<string name="error_general_update">La vérification de la mise à jour a échoué. Une erreur générale s\'est produite.</string>
|
||||
<string name="error_hash_mismatch_update">La vérification de la mise à jour a échoué. Le hachage calculé ne correspond pas au fichier téléchargé</string>
|
||||
<string name="error_update_no_internet">La vérification de la mise à jour a échoué. Pas de connexion Internet.</string>
|
||||
<string name="error_failed_to_decrypt_webdav_password">Echec lors du déchiffrement du mot de passe WebDAV, veuillez l\'ajouter une nouvelle fois dans les paramètres</string>
|
||||
<string name="error_play_services_not_available">Les services Google Play ne sont pas installés</string>
|
||||
<string name="error_biometric_auth_aborted">Authentification biométrique avortée</string>
|
||||
<string name="error_vault_version_mismatch">La version spécifiée dans %1$s est différente de %2$s</string>
|
||||
<string name="error_vault_key_invalid">%1$s ne correspond pas à ce %2$s</string>
|
||||
<string name="error_vault_config_loading">Erreur générale lors du chargement de la configuration du coffre</string>
|
||||
<string name="error_file_not_found_after_opening_using_3party">Le fichier local n\'est plus présent après le retour à Cryptomator. Les éventuels modifications ne peuvent être propagées au nuage.</string>
|
||||
<string name="error_no_such_bucket">Aucun compartiment de ce type</string>
|
||||
@ -36,6 +41,7 @@
|
||||
<string name="permission_message_export_file">Cryptomator a besoin de l\'accès au stockage pour exporter des fichiers</string>
|
||||
<string name="permission_message_upload_file">Cryptomateur a besoin de l\'accès au stockage pour téléverser des fichiers</string>
|
||||
<string name="permission_message_share_file">Cryptomator a besoin de l\'accès au stockage pour partager des fichiers</string>
|
||||
<string name="permission_revoked_re_request_permission">Cryptomator n\'a plus accès à cet emplacement. Merci de resélectionner ce répertoire pour restaurer les droits d\'accès.</string>
|
||||
<string name="snack_bar_action_title_settings">Paramètres</string>
|
||||
<string name="snack_bar_action_title_search">Rechercher</string>
|
||||
<string name="snack_bar_action_title_search_previous">Précédent</string>
|
||||
@ -110,8 +116,6 @@
|
||||
<string name="screen_cloud_connections_title">Choisissez l\'emplacement</string>
|
||||
<string name="screen_cloud_connections_no_connections">Cliquez ici pour ajouter des emplacements</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Le serveur ne semble pas compatible avec WebDAV</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Emplacements personnalisés</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Stockage par défaut</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Aucun emplacement supplémentaire disponible.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -171,6 +175,8 @@
|
||||
<string name="screen_settings_section_auto_photo_upload_vault">Choisir un coffre-fort pour le téléversement</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_toggle">Activer</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_toggle_summary">Capturez les images en arrière-plan et une fois que le coffre-fort sélectionné est déverrouillé, lancez le téléversement</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_toggle_instant_upload">Télécharger instantanément</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_toggle_instant_upload_summary">Télécharger directement si le coffre est déverrouillé</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_only_wifi_toggle">Téléverser sur réseau WIFI uniquement</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_including_videos">Téléversement des vidéos</string>
|
||||
<string name="screen_settings_auto_photo_upload_title">Enregistrer les fichiers téléverser automatiquement dans…</string>
|
||||
@ -215,6 +221,7 @@
|
||||
<string name="dialog_change_password_msg_password_mismatch">Le nouveau mot de passe ne correspond pas au mot de passe retapé.</string>
|
||||
<!-- Vault not found -->
|
||||
<string name="dialog_vault_not_found_title">Coffre-fort %1$s introuvable</string>
|
||||
<string name="dialog_vault_not_found_message">Le coffre-fort a été renommé, déplacé ou supprimé. Supprimez ce coffre-fort de la liste et ajoutez-le à nouveau pour continuer. Supprimer maintenant ?</string>
|
||||
<string name="dialog_vault_not_found_positive_button_text">Supprimer</string>
|
||||
<string name="dialog_existing_file_title">Le fichier existe déjà</string>
|
||||
<string name="dialog_existing_file_positive_button">Remplacer</string>
|
||||
@ -282,6 +289,10 @@
|
||||
<string name="dialog_app_is_obscured_info_title">\'application est masquée</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">Une autre application affiche quelque chose au-dessus de Cryptomator (par exemple, un filtre de lumière bleue ou une application forçant le mode nuit). Pour des raisons de sécurité, Cryptomator est désactivé.\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Comment activer Cryptomator</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Fermer</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">Veuillez rajouter les coffres pour le cloud %1s</string>
|
||||
<string name="dialog_vaults_removed_during_migration_hint">Lors de la migration vers cette version de l\'application, nous devons supprimer les coffres suivants de l\'application :\n%2s \n\nCes coffres ne sont pas retirés du cloud mais seulement de cette application. Désolé pour le désagrément et veuillez rajouter ces coffres pour continuer à les utiliser.</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">Le coffre est le dossier racine de la connexion cloud</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_hint">Créez une nouvelle connexion cloud où vous sélectionnerez au moins le dossier parent de ce dossier de coffre comme répertoire racine pour ajouter ce coffre.</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">Ce paramètre est une fonction de sécurité qui empêche les autres applications de tromper les utilisateurs en leur faisant faire des choses qu\'ils ne veulent pas faire.\n\nEn le désactivant, vous confirmez que vous êtes <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">conscients des risques</a>.</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">Êtes-vous sûr de vouloir supprimer cette connexion au cloud?</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">Cette action retirera l\'accès à ce cloud et à tous les coffre-fort de celui-ci.</string>
|
||||
|
@ -61,8 +61,6 @@
|
||||
<string name="screen_cloud_connections_title">Válasszon helyt</string>
|
||||
<string name="screen_cloud_connections_no_connections">Kattintson ide a hely hozzáadásához</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">A kiszolgáló nem tűnik WebDAV kompatibilisnek</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Egyedi helyek</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Alapértelmezett tároló</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">További helyszínek nem állnak rendelkezésre.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">ULR</string>
|
||||
|
@ -24,6 +24,8 @@
|
||||
<string name="error_general_update">Controllo dell\'aggiornamento non riuscito. Si è verificato un errore generale.</string>
|
||||
<string name="error_hash_mismatch_update">Controllo di aggiornamento non riuscito. L\'hash calcolato non corrisponde al file caricato</string>
|
||||
<string name="error_update_no_internet">Controllo aggiornamento non riuscito. Nessuna connessione internet.</string>
|
||||
<string name="error_failed_to_decrypt_webdav_password">Impossibile decrittografare la password WebDAV, aggiungere nuovamente nelle impostazioni</string>
|
||||
<string name="error_play_services_not_available">Google Play Services non installati</string>
|
||||
<string name="error_biometric_auth_aborted">Autenticazione biometrica interrotta</string>
|
||||
<string name="error_vault_version_mismatch">La versione specificata in %1$s è diversa da %2$s</string>
|
||||
<string name="error_vault_key_invalid">%1$s non corrisponde a questo %2$s</string>
|
||||
@ -39,6 +41,7 @@
|
||||
<string name="permission_message_export_file">Cryptomator necessita dell\'accesso all\'archivio per esportare i file</string>
|
||||
<string name="permission_message_upload_file">Cryptomator ha bisogno di accesso all\'archivio per caricare i file</string>
|
||||
<string name="permission_message_share_file">Cryptomator ha bisogno di accesso all\'archivio per condividere i file</string>
|
||||
<string name="permission_revoked_re_request_permission">Cryptomator ha perso il permesso di accedere a questa posizione. Si prega di selezionare nuovamente questa cartella per ripristinare il permesso.</string>
|
||||
<string name="snack_bar_action_title_settings">Impostazioni</string>
|
||||
<string name="snack_bar_action_title_search">Cerca</string>
|
||||
<string name="snack_bar_action_title_search_previous">Precedente</string>
|
||||
@ -113,8 +116,6 @@
|
||||
<string name="screen_cloud_connections_title">Scegli una posizione</string>
|
||||
<string name="screen_cloud_connections_no_connections">Clicca qui per aggiungere posizioni</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Il server non sembra essere compatibile con WebDAV</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Posizioni personalizzate</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Archiviazione predefinita</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Nessuna posizione aggiuntiva disponibile.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -288,6 +289,10 @@
|
||||
<string name="dialog_app_is_obscured_info_title">L\'app è oscurata</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">Un\'altra app sta mostrando qualcosa sopra Cryptomator (ad esempio, un filtro luce blu o un\'app per la modalità notturna). Per motivi di sicurezza, Cryptomator è disabilitato.\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Come abilitare Cryptomator</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Chiudi</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">Si prega di ri-aggiungere cassaforti per il cloud %1s</string>
|
||||
<string name="dialog_vaults_removed_during_migration_hint">Durante la migrazione a questa versione dell\'app abbiamo avuto bisogno di rimuovere le seguenti cassaforti dall\'app:\n%2s \n\nQueste cassaforti non sono state rimosse dal cloud ma solo da questa app. Siamo spiacenti per l\'inconveniente e si prega di ri-aggiungere queste cassaforti per continuare ad usarle.</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">La cassaforte è la cartella root della connessione al cloud</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_hint">Crea una nuova connessione al cloud dove bisogna selezionare almeno la cartella padre di questa cassaforte come cartella radice per aggiungere questa cassaforte.</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">Questa impostazione è una funzione di sicurezza e impedisce ad altre applicazioni di ingannare gli utenti a fare cose che non sono in grado di fare.\n\nDisabilitandola confermi di essere <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">a conoscenza dei rischi</a>.</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">Sei sicuro di voler rimuovere questa connessione cloud?</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">Questa azione rimuoverà la connessione cloud e tutte le cassaforti di questo cloud.</string>
|
||||
|
@ -110,8 +110,6 @@
|
||||
<string name="screen_cloud_connections_title">接続先を選択</string>
|
||||
<string name="screen_cloud_connections_no_connections">ここをタップして場所を追加する</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">サーバーに WebDAV との互換性がありません</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">その他の保存先</string>
|
||||
<string name="screen_cloud_local_default_storage_title">デフォルトの保存先</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">追加の利用できる保存先はありません。</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -284,6 +282,7 @@
|
||||
<string name="dialog_app_is_obscured_info_title">アプリが重なっています</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">他のアプリケーションが Cryptomator の上に何かを表示しています (例: ブルーライト フィルターや night mode アプリ)。このため、セキュリティの観点から Cryptomator が無効化されています。\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Cryptomator を有効にするには</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">閉じる</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">%1s クラウンドの金庫を再追加してください</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">この設定は安全のための機能です。他のアプリがユーザーを騙してしまうことを防ぎます。\n\n無効にすることで、 <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">リスクを認識していること</a> に留意する必要があります。</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">本当にこのクラウド接続を削除しますか?</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">この操作により、クラウド接続とクラウドのすべての金庫が削除されます。</string>
|
||||
|
@ -100,7 +100,6 @@
|
||||
<string name="screen_choose_cloud_service_title">클라우드 서비스</string>
|
||||
<!-- ## screen: cloud connections -->
|
||||
<string name="screen_cloud_connections_title">위치 선택</string>
|
||||
<string name="screen_cloud_local_default_storage_title">기본 저장소</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
<string name="screen_webdav_settings_username_label">사용자명</string>
|
||||
|
37
presentation/src/main/res/values-mk-rMK/strings.xml
Normal file
37
presentation/src/main/res/values-mk-rMK/strings.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- # app -->
|
||||
<!-- # error messages -->
|
||||
<!-- # clouds -->
|
||||
<!-- ## cloud names -->
|
||||
<!-- # permission -->
|
||||
<!-- ## permission messages -->
|
||||
<!-- # screens -->
|
||||
<!-- # screen: vault list -->
|
||||
<!-- # screen: file browser -->
|
||||
<!-- ## screen: text editor -->
|
||||
<!-- ## screen: share files -->
|
||||
<!-- ## screen: choose cloud service -->
|
||||
<!-- ## screen: cloud connections -->
|
||||
<!-- ## screen: webdav settings -->
|
||||
<!-- ## screen: s3 settings -->
|
||||
<!-- ## screen: enter vault name -->
|
||||
<!-- ## screen: set password -->
|
||||
<!-- ## screen: settings -->
|
||||
<!-- ## screen: cloud settings -->
|
||||
<!-- ## screen: licenses -->
|
||||
<!-- ## screen: authenticate cloud -->
|
||||
<!-- ## screen: insecure android version info -->
|
||||
<!-- # dialogs -->
|
||||
<!-- Vault not found -->
|
||||
<!-- # error reports -->
|
||||
<!-- # misc -->
|
||||
<!-- ## file size helper -->
|
||||
<!-- ## date helper -->
|
||||
<!-- ## biometric authentication -->
|
||||
<!-- notification -->
|
||||
<!-- lock timeout names -->
|
||||
<!-- cache size names -->
|
||||
<!-- screen scheme mode names -->
|
||||
<!-- update interval names -->
|
||||
</resources>
|
@ -41,6 +41,7 @@
|
||||
<string name="permission_message_export_file">Cryptomator heeft toegang tot opslag nodig om bestanden te exporteren</string>
|
||||
<string name="permission_message_upload_file">Cryptomator heeft toegang tot opslag nodig om bestanden te uploaden</string>
|
||||
<string name="permission_message_share_file">Cryptomator heeft toegang tot opslag nodig om bestanden te delen</string>
|
||||
<string name="permission_revoked_re_request_permission">Cryptomator heeft geen toegang meer tot deze locatie. Selecteer de map opnieuw om de toegangsrechten te herstellen.</string>
|
||||
<string name="snack_bar_action_title_settings">Instellingen</string>
|
||||
<string name="snack_bar_action_title_search">Zoeken</string>
|
||||
<string name="snack_bar_action_title_search_previous">Vorige</string>
|
||||
@ -115,8 +116,6 @@
|
||||
<string name="screen_cloud_connections_title">Kies een locatie</string>
|
||||
<string name="screen_cloud_connections_no_connections">Klik hier om locaties toe te voegen</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Server lijkt niet WebDAV compatibel te zijn</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Aangepaste locaties</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Standaard opslag</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Geen extra locaties beschikbaar.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -290,6 +289,8 @@
|
||||
<string name="dialog_app_is_obscured_info_title">App is naar de achtergrond gewezen</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">Een andere app toont iets bovenop Cryptomator (bijv. een blauw lichtfilter of nachtmodus). Om veiligheidsredenen is Cryptomator uitgeschakeld.\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Hoe kunt u Cryptomator inschakelen</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Sluiten</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">Voeg de kluis voor %1\'s cloud opnieuw toe</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">Kluis is hoofdmap van de cloud-verbinding</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">Deze instelling is een beveiligingsfunctie en voorkomt dat andere apps gebruikers misleiden.\n\nDoor deze instelling uit te schakelen bevestig je dat je <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security"> bewust bent van de risico\'s</a>.</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">Weet je zeker dat je deze cloud verbinding wilt verwijderen?</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">Deze actie zal de cloud-verbinding en alle kluizen van deze cloud verwijderen.</string>
|
||||
|
@ -41,6 +41,7 @@
|
||||
<string name="permission_message_export_file">Cryptomator potrzebuje dostępu do pamięci masowej do eksportu plików</string>
|
||||
<string name="permission_message_upload_file">Cryptomator potrzebuje dostępu do pamięci masowej, aby przesłać pliki</string>
|
||||
<string name="permission_message_share_file">Cryptomator potrzebuje dostępu do pamięci masowej, aby udostępniać pliki</string>
|
||||
<string name="permission_revoked_re_request_permission">Cryptomator stracił uprawnienia do dostępu do tej lokalizacji. Wybierz ten katalog ponownie, aby przywrócić uprawnienia.</string>
|
||||
<string name="snack_bar_action_title_settings">Ustawienia</string>
|
||||
<string name="snack_bar_action_title_search">Szukaj</string>
|
||||
<string name="snack_bar_action_title_search_previous">Poprzedni</string>
|
||||
@ -117,8 +118,6 @@
|
||||
<string name="screen_cloud_connections_title">Wybierz lokalizację</string>
|
||||
<string name="screen_cloud_connections_no_connections">Kliknij tutaj, aby dodać nową lokalizację</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Serwer wydaje się być niekompatybilny z WebDAV</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Niestandardowe lokalizacje</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Pamięć domyślna</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Brak dodatkowych lokalizacji.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -292,6 +291,10 @@
|
||||
<string name="dialog_app_is_obscured_info_title">Aplikacja jest zasłonięta inną</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">Inna aplikacja jest wyświetlana nad Cryptomatorem (na przykład filtr niebieskiego światła, tryb nocny). Dla twojego bezpieczeństwa Cryptomator jest wyłączony.\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Jak ponownie włączyć aplikację. </a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Zamknij</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">Proszę ponownie dodać sejfy dla chmury %1s</string>
|
||||
<string name="dialog_vaults_removed_during_migration_hint">Podczas migracji do tej wersji aplikacji musimy usunąć następujące sejfy z aplikacji:\n%2s \n\nTe sejfy nie są usuwane z chmury, ale tylko z tej aplikacji. Przepraszamy za niedogodności. Dodaj ponownie te sejfy, aby dalej z nich korzystać.</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">Sejf jest głównym folderem w połączonej chmurze</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_hint">Utwórz nowe połączenie z chmurą, gdzie wybierzesz przynajmniej folder nadrzędny tego sejfu jako główny katalog, aby dodać ten sejf.</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">To ustawienie jest funkcją bezpieczeństwa i uniemożliwia innym aplikacjom oszukiwanie użytkowników do robienia rzeczy, których nie chcą robić.\n\nWyłączając je potwierdzasz, że jesteś <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">świadomy ryzyka</a>.</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">Czy na pewno chcesz usunąć to połączenie z serwerem chmury?</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">Ta akcja usunie połączenie z usługą chmury i wszystkimi sejfami w tej chmurze.</string>
|
||||
|
@ -115,8 +115,6 @@
|
||||
<string name="screen_cloud_connections_title">Selecionar um local</string>
|
||||
<string name="screen_cloud_connections_no_connections">Clique aqui para adicionar locais</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">O servidor não parece ser compatível com WebDAV</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Locais personalizados</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Armazenamento padrão</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Não há localizações adicionais disponíveis.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
|
@ -111,8 +111,6 @@
|
||||
<string name="screen_cloud_connections_title">Alegeți o locație</string>
|
||||
<string name="screen_cloud_connections_no_connections">Faceți clic aici pentru a adăuga locații</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Serverul nu pare să fie compatibil cu WebDAV</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Locații personalizate</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Spațiu de stocare prestabilit</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Nu există locații suplimentare disponibile.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">Adresa URL</string>
|
||||
|
@ -14,11 +14,11 @@
|
||||
<string name="error_no_such_file">Файл не существует.</string>
|
||||
<string name="error_vault_has_been_locked">Хранилище заблокировано.</string>
|
||||
<string name="error_cloud_already_exists">Облако уже существует.</string>
|
||||
<string name="error_activity_not_found">Скачайте приложение, которое может открыть этот файл.</string>
|
||||
<string name="error_activity_not_found">Пожалуйста, скачайте приложение, которое может открыть этот файл.</string>
|
||||
<string name="error_server_not_found">Сервер не найден.</string>
|
||||
<string name="error_device_policy_manager_not_found">Откройте настройки устройств и установите блокировку экрана вручную</string>
|
||||
<string name="error_export_illegal_file_name">Ошибка экспорта. Попробуйте удалить спецсимволы из имён файлов и экспортировать снова.</string>
|
||||
<string name="error_name_contains_invalid_characters">Не может содержать спецсимволы.</string>
|
||||
<string name="error_device_policy_manager_not_found">Откройте настройки устройства и установите блокировку экрана вручную</string>
|
||||
<string name="error_export_illegal_file_name">Не удалось экспортировать. Попробуйте удалить специальные символы из имен файлов и экспортировать снова.</string>
|
||||
<string name="error_name_contains_invalid_characters">Не может содержать специальные символы.</string>
|
||||
<string name="error_names_contains_invalid_characters">В имени файла не может быть спецсимволов.</string>
|
||||
<string name="error_vault_name_contains_invalid_characters">В имени хранилища не может быть спецсимволов.</string>
|
||||
<string name="error_general_update">Не удалось проверить наличие обновления. Общая ошибка.</string>
|
||||
@ -41,6 +41,7 @@
|
||||
<string name="permission_message_export_file">У Cryptomator должен быть доступ к хранилищу для экспорта файлов</string>
|
||||
<string name="permission_message_upload_file">У Cryptomator должен быть доступ к хранилищу для отправки файлов</string>
|
||||
<string name="permission_message_share_file">У Cryptomator должен быть доступ к хранилищу для обмена файлами</string>
|
||||
<string name="permission_revoked_re_request_permission">У Cryptomator больше нет прав доступа к этому местоположению. Выберите эту папку ещё раз, чтобы восстановить права.</string>
|
||||
<string name="snack_bar_action_title_settings">Настройки</string>
|
||||
<string name="snack_bar_action_title_search">Поиск</string>
|
||||
<string name="snack_bar_action_title_search_previous">Назад</string>
|
||||
@ -117,8 +118,6 @@
|
||||
<string name="screen_cloud_connections_title">Выберите местоположение</string>
|
||||
<string name="screen_cloud_connections_no_connections">Нажмите, чтобы добавить места</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Похоже, сервер не совместим с WebDAV</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Другие места</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Хранилище по умолчанию</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Нет дополнительных мест.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -292,6 +291,10 @@
|
||||
<string name="dialog_app_is_obscured_info_title">Приложение скрыто</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">Другое приложение отображает что-то поверх Cryptomator (например синий световой фильтр или ночной режим). В целях безопасности Cryptomator отключён.\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Как включить Cryptomator</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Закрыть</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">Добавьте хранилища заново для облака %1s</string>
|
||||
<string name="dialog_vaults_removed_during_migration_hint">Во время переноса в эту версию приложения необходимо удалить следующие хранилища из приложения:\n%2s \n\nЭти хранилища не удаляются из облака, а только из приложения. Извините за неудобства и добавьте снова эти хранилища, чтобы продолжить работу с ними.</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">Хранилище - это корневая папка подключения к облаку</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_hint">Создайте новое облачное соединение, в котором вы выберете по крайней мере родительскую папку этой папки хранилища в качестве корневой папки для добавления этого хранилища.</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">Эта настройка связана с безопасностью, она не позволяет другим приложениям обманом вынуждать пользователей делать то, что им не нужно.\n\nОтключив, вы подтверждаете, что <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">знаете о рисках</a>.</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">Вы действительно хотите удалить это облачное соединение?</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">Это действие удалит облако и все хранилища в нём.</string>
|
||||
|
@ -41,6 +41,7 @@
|
||||
<string name="permission_message_export_file">Cryptomator vyžaduje prístup k úložisku pre export súborov</string>
|
||||
<string name="permission_message_upload_file">Cryptomator vyžaduje prístup k úložisku pre nahratie súborov</string>
|
||||
<string name="permission_message_share_file">Cryptomator vyžaduje prístup k úložisku pre zdieľanie súborov</string>
|
||||
<string name="permission_revoked_re_request_permission">Cryptomator stratil oprávnia k prístupu tejto lokality. Prosím vyberte tento akresár znovu pre obnovenie povoleni.</string>
|
||||
<string name="snack_bar_action_title_settings">Nastavenia</string>
|
||||
<string name="snack_bar_action_title_search">Hľadať</string>
|
||||
<string name="snack_bar_action_title_search_previous">Predošlý</string>
|
||||
@ -117,8 +118,6 @@
|
||||
<string name="screen_cloud_connections_title">Vybrať umiestnenie</string>
|
||||
<string name="screen_cloud_connections_no_connections">Kliknite sem pre pridanie umiestnení</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Server zdá sa byť WebDAV kompatibilný</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Vlastné umiestnenia</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Predvolené úložisko</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Ďalšie úložiská nie sú dostupné.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -292,6 +291,10 @@
|
||||
<string name="dialog_app_is_obscured_info_title">Aplikácia je zatmavená</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">Ď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\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Ako povoliť Cryptomator</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Zavrieť</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">Prosím zadajte znovu trezory pre %1s cloud</string>
|
||||
<string name="dialog_vaults_removed_during_migration_hint">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.</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">Trezor je koreňovým adresárom cloudového spojenia</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_hint">Vytvorte nové cloudové pripojenie kde vyberiete minimálne nadradený adresár tohto trezora ako koreňový adresár pre pridanie tohot trezora.</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">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 že<a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">ste si vedomí rizika</a>.</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">Ste si istý že chcete odstrániť toto cloudové pripojenie?</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">Táto akcia odstráni pripojenie cloudu a všetky trezory tohto cloudu.</string>
|
||||
|
@ -41,6 +41,7 @@
|
||||
<string name="permission_message_export_file">Cryptomator behöver åtkomst till lagringsutrymme för att exportera filer</string>
|
||||
<string name="permission_message_upload_file">Cryptomator behöver åtkomst till lagringsutrymme för att ladda upp filer</string>
|
||||
<string name="permission_message_share_file">Cryptomator behöver åtkomst till lagringsutrymme för att dela filer</string>
|
||||
<string name="permission_revoked_re_request_permission">Cryptomator har förlorat behörighet att komma åt den här platsen. Välj denna mapp igen för att återställa behörigheten.</string>
|
||||
<string name="snack_bar_action_title_settings">Inställningar</string>
|
||||
<string name="snack_bar_action_title_search">Sök</string>
|
||||
<string name="snack_bar_action_title_search_previous">Föregående</string>
|
||||
@ -115,8 +116,6 @@
|
||||
<string name="screen_cloud_connections_title">Välj en plats</string>
|
||||
<string name="screen_cloud_connections_no_connections">Klicka här för att lägga till platser</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Servern verkar inte vara WebDAV-kompatibel</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Anpassad plats</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Förvald lagring</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Inga ytterligare platser tillgängliga.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -290,6 +289,10 @@
|
||||
<string name="dialog_app_is_obscured_info_title">Appen är täckt</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">En annan app visar något ovanpå Cryptomator (t.ex., ett blått ljusfilter eller nattläge app). Av säkerhetsskäl är Cryptomator inaktiverad.\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Så här aktiverar du Cryptomator</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Stäng</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">Vänligen lägg till valv igen för %1s molnet</string>
|
||||
<string name="dialog_vaults_removed_during_migration_hint">Medan vi migrerar till den här appversionen måste vi ta bort följande valv från appen:\n%2s \n\nDessa valv tas inte bort från molnet utan endast från den här appen. Ledsen för besväret. Du lägger sedan till dessa valv igen för att fortsätta arbeta med dem.</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">Valvet är rotmapp för molnanslutningen</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_hint">Skapa en ny molnanslutning där du väljer minst den överordnade mappen i denna valvkatalog som rotkatalog för att lägga till valvet.</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">Den här inställningen är en säkerhetsfunktion och hindrar andra appar från att lura användare att göra saker de inte vill göra.\n\nGenom att inaktivera bekräftar du att du är <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">medveten om riskerna</a>.</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">Är du säker på att du vill ta bort den här molnanslutningen?</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">Denna åtgärd kommer att ta bort molnanslutningen och alla valv i detta moln.</string>
|
||||
|
113
presentation/src/main/res/values-ta-rIN/strings.xml
Normal file
113
presentation/src/main/res/values-ta-rIN/strings.xml
Normal file
@ -0,0 +1,113 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- # app -->
|
||||
<string name="share_with_label">குறியாக்கு</string>
|
||||
<!-- # error messages -->
|
||||
<string name="error_generic">ஒரு பிழை ஏற்பட்டுள்ளது</string>
|
||||
<string name="error_authentication_failed">அங்கீகரிப்பு தோல்வியுற்றது</string>
|
||||
<string name="error_no_network_connection">நெட்வொர்க் இணைப்பு இல்லை</string>
|
||||
<string name="error_invalid_passphrase">தவறான கடவுச்சொல்</string>
|
||||
<string name="error_no_such_file">கோப்பு இருப்பில் இல்லை.</string>
|
||||
<!-- # clouds -->
|
||||
<!-- ## cloud names -->
|
||||
<string name="cloud_names_local_storage">உள்ளூர் சேமிப்பகம்</string>
|
||||
<!-- # permission -->
|
||||
<!-- ## permission messages -->
|
||||
<string name="snack_bar_action_title_settings">அமைப்புகள்</string>
|
||||
<string name="snack_bar_action_title_search">தேடு</string>
|
||||
<string name="snack_bar_action_title_search_previous">முந்தைய</string>
|
||||
<string name="snack_bar_action_title_search_next">அடுத்து</string>
|
||||
<string name="snack_bar_action_title_sort">வரிசைப்படுத்து</string>
|
||||
<!-- # screens -->
|
||||
<!-- # screen: vault list -->
|
||||
<!-- # screen: file browser -->
|
||||
<string name="screen_file_browser_move_button_text">நகர்த்து</string>
|
||||
<string name="screen_file_browser_msg_empty_folder">காலி கோப்புறை</string>
|
||||
<string name="screen_file_browser_share_intent_chooser_title">இதனுடன் பகிர்</string>
|
||||
<string name="screen_file_browser_select_items">தேர்ந்தெடு</string>
|
||||
<string name="screen_file_browser_select_all_items">அனைத்தையும் தேர்ந்தெடு</string>
|
||||
<string name="screen_file_browser_refresh_items">புதுப்பி</string>
|
||||
<string name="screen_file_browser_no_connection_message">இணைப்பு இல்லை</string>
|
||||
<string name="screen_file_browser_no_connection_button_text">மீண்டும் முயற்சிக்கவும்</string>
|
||||
<!-- ## screen: text editor -->
|
||||
<string name="screen_text_editor_save_success">வெற்றிகரமாக சேமிக்கப்பட்டது</string>
|
||||
<!-- ## screen: share files -->
|
||||
<string name="screen_share_files_content_file">கோப்பு</string>
|
||||
<string name="screen_share_files_content_files">கோப்புகள்</string>
|
||||
<string name="screen_share_files_save_button_text">சேமி</string>
|
||||
<string name="screen_share_files_msg_success">குறியாக்கம் முடிந்தது</string>
|
||||
<!-- ## screen: choose cloud service -->
|
||||
<!-- ## screen: cloud connections -->
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">இணையமுகவரி</string>
|
||||
<string name="screen_webdav_settings_username_label">பயனர்பெயர்</string>
|
||||
<string name="screen_webdav_settings_password_label">கடவுச்சொல்</string>
|
||||
<string name="screen_webdav_settings_msg_url_must_not_be_empty">இணையமுகவரி வெறுமையாக இருக்க கூடாது.</string>
|
||||
<string name="screen_webdav_settings_msg_url_is_invalid">இணையமுகவரி தவறானது.</string>
|
||||
<string name="screen_webdav_settings_msg_username_must_not_be_empty">பயனர்பெயர் காலியாக இருக்க முடியாது.</string>
|
||||
<string name="screen_webdav_settings_msg_password_must_not_be_empty">கடவுச்சொல் காலியாக இருக்கக்கூடாது.</string>
|
||||
<!-- ## screen: s3 settings -->
|
||||
<string name="screen_s3_settings_display_name_label">புனைப்பெயர்</string>
|
||||
<string name="screen_s3_settings_region_label">பகுதி</string>
|
||||
<!-- ## screen: enter vault name -->
|
||||
<!-- ## screen: set password -->
|
||||
<!-- ## screen: settings -->
|
||||
<string name="screen_settings_biometric_auth">உயிரியளவுகள் உறுதிசெய்தல்</string>
|
||||
<string name="screen_settings_section_search">தேடு</string>
|
||||
<string name="screen_settings_live_search">நேரடி தேடல்</string>
|
||||
<string name="screen_settings_auto_lock_timeout">இதன்பிறகு செயலியை பூட்டு</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_toggle">செயல்படுத்து</string>
|
||||
<string name="screen_settings_twitter_label">டுவிட்டரில் எங்களைத் தொடருங்கள்</string>
|
||||
<string name="screen_settings_facebook_label">Facebook இல் எங்களை போன்ற</string>
|
||||
<string name="screen_settings_section_legal">சட்டம்</string>
|
||||
<string name="screen_settings_section_support">ஆதரவு</string>
|
||||
<!-- ## screen: cloud settings -->
|
||||
<!-- ## screen: licenses -->
|
||||
<!-- ## screen: authenticate cloud -->
|
||||
<!-- ## screen: insecure android version info -->
|
||||
<!-- # dialogs -->
|
||||
<string name="dialog_change_password_msg_new_password_empty">கடவுச்சொல் காலியாக இருக்கக்கூடாது.</string>
|
||||
<!-- Vault not found -->
|
||||
<string name="dialog_vault_not_found_positive_button_text">நீக்கு</string>
|
||||
<string name="dialog_existing_file_title">கோப்பு ஏற்கனவே உள்ளது</string>
|
||||
<string name="dialog_existing_file_positive_button">மாற்று</string>
|
||||
<string name="dialog_existing_file_message">ஏற்கனவே \'%1$s\' என்ற பெயரில் வெறெரு கோப்பு உள்ளது.</string>
|
||||
<string name="dialog_replace_negative_button_at_least_two_but_not_all_files_exist">ஏற்கனவே இருப்பதை தவிர்க்கவும்</string>
|
||||
<string name="dialog_replace_positive_button_all_files_exist">அனைத்தையும் மாற்று</string>
|
||||
<string name="dialog_replace_positive_button_some_files_exist">ஏற்கனவே உள்ளதை மாற்றவும்</string>
|
||||
<string name="dialog_replace_positive_button_single_file_exists">மாற்று</string>
|
||||
<string name="dialog_replace_title_single_file_exists">கோப்பை மாற்றிடவா?</string>
|
||||
<string name="dialog_replace_title_multiple_files_exist">கோப்புகளை மாற்றிடவா?</string>
|
||||
<string name="dialog_unable_to_share_positive_button">சரி</string>
|
||||
<string name="dialog_rename_node_folder_title">கோப்புறைக்கு மறுபெயரிடு</string>
|
||||
<string name="dialog_rename_node_file_title">கோப்பை மறுபெயரிடு</string>
|
||||
<string name="dialog_unsaved_changes_title">சேமிக்கப்படாத மாற்றங்கள் உள்ளன</string>
|
||||
<string name="dialog_no_screen_lock_checkbox">திரைப்பூட்டை அமை</string>
|
||||
<string name="dialog_debug_mode_disclaimer_title">கவனிக்க</string>
|
||||
<string name="dialog_debug_mode_positive_button">இயக்கு</string>
|
||||
<string name="dialog_disable_app_obscured_disclaimer_title">கவனிக்க</string>
|
||||
<string name="dialog_disable_app_obscured_positive_button">முடக்கு</string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">மூடு</string>
|
||||
<!-- # error reports -->
|
||||
<!-- # misc -->
|
||||
<!-- ## file size helper -->
|
||||
<!-- ## date helper -->
|
||||
<string name="time_unit_minutes_pl">நிமிடங்கள்</string>
|
||||
<string name="time_unit_days_pl">நாட்கள்</string>
|
||||
<string name="time_unit_weeks_sg">வாரம்</string>
|
||||
<string name="time_unit_weeks_pl">வாரங்கள்</string>
|
||||
<string name="time_unit_months_sg">மாதம்</string>
|
||||
<string name="time_unit_months_pl">மாதங்கள்</string>
|
||||
<string name="time_unit_years_sg">ஆண்டு</string>
|
||||
<!-- ## biometric authentication -->
|
||||
<!-- notification -->
|
||||
<!-- lock timeout names -->
|
||||
<!-- cache size names -->
|
||||
<!-- screen scheme mode names -->
|
||||
<string name="light">வெளிச்சம்</string>
|
||||
<string name="dark">இருள்</string>
|
||||
<!-- update interval names -->
|
||||
<string name="update_interval_1d">தினம் ஒரு முறை</string>
|
||||
<string name="update_interval_1w">வாரம் ஒரு முறை</string>
|
||||
<string name="update_interval_1m">மாதம் ஒரு முறை</string>
|
||||
</resources>
|
68
presentation/src/main/res/values-te-rIN/strings.xml
Normal file
68
presentation/src/main/res/values-te-rIN/strings.xml
Normal file
@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- # app -->
|
||||
<string name="share_with_label">ఎన్క్రిప్ట్</string>
|
||||
<!-- # error messages -->
|
||||
<!-- # clouds -->
|
||||
<!-- ## cloud names -->
|
||||
<!-- # permission -->
|
||||
<!-- ## permission messages -->
|
||||
<string name="snack_bar_action_title_sort">అమర్చు</string>
|
||||
<string name="snack_bar_action_title_sort_az">A - Z</string>
|
||||
<string name="snack_bar_action_title_sort_za">Z - A</string>
|
||||
<string name="snack_bar_action_title_sort_newest">కొత్త మొదటి</string>
|
||||
<string name="snack_bar_action_title_sort_oldest">పాతది ముందు</string>
|
||||
<string name="snack_bar_action_title_sort_biggest">పెద్దది ముందు</string>
|
||||
<string name="snack_bar_action_title_sort_smallest">చిన్న ముందు</string>
|
||||
<!-- # screens -->
|
||||
<!-- # screen: vault list -->
|
||||
<string name="screen_vault_list_actions_title">Kripṭōmēṭarlō cērcaṇḍi</string>
|
||||
<string name="screen_vault_list_action_create_new_vault">కొత్త ఖజానాను సృష్టించండి</string>
|
||||
<string name="screen_vault_list_action_add_existing_vault">ఇప్పటికే ఉన్న ఖజానాను తెరవండి</string>
|
||||
<!-- # screen: file browser -->
|
||||
<string name="screen_file_browser_share_intent_chooser_title">Itarulaku pampaṇḍi</string>
|
||||
<string name="screen_file_browser_share_button_text">ఎంచుకోండి</string>
|
||||
<string name="screen_file_browser_node_action_share">తో పంచు</string>
|
||||
<string name="screen_file_browser_node_action_edit_text">మార్పు</string>
|
||||
<string name="screen_file_browser_node_action_delete">తొలగించు</string>
|
||||
<string name="screen_file_browser_no_connection_button_text">మళ్ళీ చేయండి</string>
|
||||
<!-- ## screen: text editor -->
|
||||
<!-- ## screen: share files -->
|
||||
<!-- ## screen: choose cloud service -->
|
||||
<!-- ## screen: cloud connections -->
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
<!-- ## screen: s3 settings -->
|
||||
<!-- ## screen: enter vault name -->
|
||||
<string name="screen_enter_vault_name_button_text">సృష్టించు</string>
|
||||
<!-- ## screen: set password -->
|
||||
<string name="screen_set_password_button_text">పూర్తయింది</string>
|
||||
<string name="screen_set_password_retype_password_label">పాస్వర్డ్ మళ్ళీ వ్రాయండి</string>
|
||||
<string name="screen_set_password_strength_indicator_1">బలంగా లేదు</string>
|
||||
<string name="screen_set_password_strength_indicator_2">అది సరే</string>
|
||||
<string name="screen_set_password_strength_indicator_3">అది బలంగా ఉంది</string>
|
||||
<string name="screen_set_password_strength_indicator_4">అది చాలా బలంగా ఉంది</string>
|
||||
<!-- ## screen: settings -->
|
||||
<string name="screen_settings_section_search">వెతకండి</string>
|
||||
<string name="screen_settings_section_support">సహాయం</string>
|
||||
<!-- ## screen: cloud settings -->
|
||||
<!-- ## screen: licenses -->
|
||||
<!-- ## screen: authenticate cloud -->
|
||||
<!-- ## screen: insecure android version info -->
|
||||
<!-- # dialogs -->
|
||||
<string name="dialog_button_cancel">ఆపండి</string>
|
||||
<string name="dialog_enter_password_positive_button">తాళం తెరవండి</string>
|
||||
<!-- Vault not found -->
|
||||
<string name="dialog_unable_to_share_positive_button">సరే</string>
|
||||
<string name="dialog_accept_ssl_certificate_title">తప్పు SSL certificate</string>
|
||||
<!-- # error reports -->
|
||||
<!-- # misc -->
|
||||
<!-- ## file size helper -->
|
||||
<!-- ## date helper -->
|
||||
<!-- ## biometric authentication -->
|
||||
<!-- notification -->
|
||||
<!-- lock timeout names -->
|
||||
<!-- cache size names -->
|
||||
<!-- screen scheme mode names -->
|
||||
<!-- update interval names -->
|
||||
</resources>
|
@ -41,6 +41,7 @@
|
||||
<string name="permission_message_export_file">Cryptomator\'un dosyaları dışa aktarmak için depolama erişimine ihtiyacı var</string>
|
||||
<string name="permission_message_upload_file">Cryptomator\'un dosyaları yüklemek için depolama erişimine ihtiyacı var</string>
|
||||
<string name="permission_message_share_file">Cryptomator\'un dosyaları paylaşmak için depolama erişimine ihtiyacı var</string>
|
||||
<string name="permission_revoked_re_request_permission">Cryptomator bu konuma erişim iznini kaybetti. İzni geri yüklemek için lütfen bu klasörü tekrar seçin.</string>
|
||||
<string name="snack_bar_action_title_settings">Ayarlar</string>
|
||||
<string name="snack_bar_action_title_search">Ara</string>
|
||||
<string name="snack_bar_action_title_search_previous">Önceki</string>
|
||||
@ -115,8 +116,6 @@
|
||||
<string name="screen_cloud_connections_title">Bir yer seçin</string>
|
||||
<string name="screen_cloud_connections_no_connections">Konum eklemek için buraya tıklayın</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Sunucu WebDAV uyumlu görünmüyor</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Özel konumlar</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Varsayılan depolama</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Kullanılabilir ek konum yok.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -290,6 +289,10 @@
|
||||
<string name="dialog_app_is_obscured_info_title">Uygulama gizlendi</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">Cryptomator\'un üstünde çalışan bazı uygulamalar, (örn. Mavi ışık filtresi ve gece modu uygulamaları gibi) içeriği görüntüler! Bu nedenden dolayı, güvenlik amacıyla Cryptomator devre dışı bırakılır!\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Cryptomator\'u tekrar nasıl etkinleştirebilirim?</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Kapat</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">Lütfen %1s bulutu için kasaları yeniden ekleyin</string>
|
||||
<string name="dialog_vaults_removed_during_migration_hint">Bu uygulama sürümüne geçiş yaparken aşağıdaki kasaları uygulamadan kaldırmamız gerekiyor:\n%2s \n\nBu kasalar buluttan değil, yalnızca bu uygulamadan kaldırılır. Rahatsızlık için özür dileriz ve onlarla çalışmaya devam etmek için lütfen bu kasaları yeniden ekleyin.</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">Vault, bulut bağlantısının kök klasörüdür</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_hint">Bu kasayı eklemek için kök dizin olarak bu kasa klasörünün en azından üst klasörünü seçtiğiniz yeni bir bulut bağlantısı oluşturun.</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">Bu ayar bir güvenlik özelliğidir ve diğer uygulamaların, kullanıcıları kandırmasını engeller.\n\nDevre dışı bırakarak, <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">risklerin farkında olduğunuzu onaylamış olursunuz</a>.</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">Bu bulut bağlantısını kaldırmak istediğinizden emin misiniz?</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">Bu işlem, bulut bağlantısını ve bu bulutun tüm kasalarını kaldıracak.</string>
|
||||
|
187
presentation/src/main/res/values-uk-rUA/strings.xml
Normal file
187
presentation/src/main/res/values-uk-rUA/strings.xml
Normal file
@ -0,0 +1,187 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- # app -->
|
||||
<string name="share_with_label">Зашифрувати</string>
|
||||
<!-- # error messages -->
|
||||
<string name="error_generic">Виникла помилка</string>
|
||||
<string name="error_authentication_failed">Помилка автентифікації</string>
|
||||
<string name="error_authentication_failed_re_authenticate">Помилка автентифікації, будь ласка увійдіть за допомогою %1$s</string>
|
||||
<string name="error_no_network_connection">Відсутнє з\'єднання з мережею</string>
|
||||
<string name="error_invalid_passphrase">Неправильний пароль</string>
|
||||
<string name="error_file_or_folder_exists">Файл чи тека вже існує.</string>
|
||||
<string name="error_vault_version_not_supported">Непідтримуване сховище. Це сховище було створено іншою версією криптоматора.</string>
|
||||
<string name="error_vault_already_exists">Сховище вже існує.</string>
|
||||
<string name="error_no_such_file">Файлу не існує.</string>
|
||||
<string name="error_vault_has_been_locked">Сховище було заблоковано.</string>
|
||||
<string name="error_cloud_already_exists">Ця хмара вже використовується.</string>
|
||||
<string name="error_activity_not_found">Будь ласка, завантажте додаток, що може відкрити цей файл.</string>
|
||||
<string name="error_server_not_found">Сервер не знайдено.</string>
|
||||
<string name="error_device_policy_manager_not_found">Відкрийте налаштування пристрою та встановіть блокування екрану вручну</string>
|
||||
<string name="error_export_illegal_file_name">Не вдалося виконати експорт. Спробуйте видалити спеціальні символи з імен файлів та експортувати знову.</string>
|
||||
<string name="error_name_contains_invalid_characters">Не може містити спеціальні символи.</string>
|
||||
<string name="error_names_contains_invalid_characters">Назва файлу не може містити спеціальні символи.</string>
|
||||
<string name="error_vault_name_contains_invalid_characters">Назва сховища не може містити спеціальні символи.</string>
|
||||
<string name="error_general_update">Помилка перевірки оновлення. Загальна помилка.</string>
|
||||
<string name="error_hash_mismatch_update">Помилка перевірки оновлення. Хеш не збігається з завантаженим файлом</string>
|
||||
<string name="error_update_no_internet">Не вдалося перевірити оновлення. Немає з\'єднання з мережею.</string>
|
||||
<string name="error_failed_to_decrypt_webdav_password">Не вдалося розшифрувати пароль WebDAV, будь ласка, повторно додайте його в налаштування</string>
|
||||
<string name="error_play_services_not_available">Google Play Services не встановлені</string>
|
||||
<string name="error_biometric_auth_aborted">Біометрична автентифікація скасована</string>
|
||||
<string name="error_vault_version_mismatch">Версія вказана в %1$s відрізняється від %2$s</string>
|
||||
<string name="error_vault_key_invalid">%1$s не відповідає %2$s</string>
|
||||
<string name="error_vault_config_loading">Загальна помилка при завантаженні конфігурації сховища</string>
|
||||
<string name="error_file_not_found_after_opening_using_3party">Локальний файл більше не присутній посля повернення до Cryptomator. Можливі зміни не будуть застосовані до хмари.</string>
|
||||
<string name="error_no_such_bucket">Відсутній бакет</string>
|
||||
<string name="error_masterkey_location_not_supported">Користувацьке розташування Masterkey ще не підтримується</string>
|
||||
<!-- # clouds -->
|
||||
<!-- ## cloud names -->
|
||||
<string name="cloud_names_local_storage">Локальне сховище</string>
|
||||
<!-- # permission -->
|
||||
<!-- ## permission messages -->
|
||||
<string name="permission_message_export_file">Cryptomator потребує доступу до сховища для експорту файлів</string>
|
||||
<string name="permission_message_upload_file">Cryptomator потребує доступу до сховища для завантаження файлів</string>
|
||||
<string name="permission_message_share_file">Cryptomator потребує доступу до сховища щоб ділитися файлами</string>
|
||||
<string name="permission_revoked_re_request_permission">Криптоматор втратив дозвіл на доступ до цього розташування. Будь ласка, оберіть цю папку ще раз, щоб відновити дозвіл.</string>
|
||||
<string name="snack_bar_action_title_settings">Налаштування</string>
|
||||
<string name="snack_bar_action_title_search">Пошук</string>
|
||||
<string name="snack_bar_action_title_search_previous">Попередній</string>
|
||||
<string name="snack_bar_action_title_search_next">Наступний</string>
|
||||
<string name="snack_bar_action_title_sort">Сортування</string>
|
||||
<string name="snack_bar_action_title_sort_az">А - Я</string>
|
||||
<string name="snack_bar_action_title_sort_za">Я - А</string>
|
||||
<string name="snack_bar_action_title_sort_newest">Спочатку новіші</string>
|
||||
<string name="snack_bar_action_title_sort_oldest">Спочатку старіші</string>
|
||||
<string name="snack_bar_action_title_sort_biggest">Спочатку найбільші</string>
|
||||
<string name="snack_bar_action_title_sort_smallest">Спершу найменші</string>
|
||||
<!-- # screens -->
|
||||
<!-- # screen: vault list -->
|
||||
<string name="screen_vault_list_actions_title">Додати до Cryptomator</string>
|
||||
<string name="screen_vault_list_action_create_new_vault">Створити нове сховище</string>
|
||||
<string name="screen_vault_list_action_add_existing_vault">Додати існуюче сховище</string>
|
||||
<string name="screen_vault_list_vault_action_delete">Прибрати</string>
|
||||
<string name="screen_vault_list_vault_creation_hint">Натисніть тут, щоб створити нове сховище</string>
|
||||
<string name="screen_vault_list_change_password_successful">Пароль успішно змінено</string>
|
||||
<!-- # screen: file browser -->
|
||||
<string name="screen_file_browser_default_title">Сховище</string>
|
||||
<string name="screen_file_browser_add_existing_vault_extra_text">Виберіть файл майстер-ключа</string>
|
||||
<string name="screen_file_browser_create_new_vault_button_text">Розмістити тут</string>
|
||||
<string name="screen_file_browser_create_new_vault_extra_text">Назва сховища: %1$s</string>
|
||||
<string name="screen_file_browser_move_button_text">Перемістити</string>
|
||||
<string name="screen_file_browser_msg_empty_folder">Порожня тека</string>
|
||||
<string name="screen_file_browser_file_info_label_date">змінено %1$s тому</string>
|
||||
<string name="screen_file_browser_share_intent_chooser_title">Поділитися за допомогою</string>
|
||||
<string name="screen_file_browser_share_destination_title">Оберіть призначення</string>
|
||||
<string name="screen_file_browser_share_button_text">Оберіть</string>
|
||||
<string name="screen_file_browser_nothing_to_share">Відсутні елементи для поширення</string>
|
||||
<string name="screen_file_browser_actions_title">Додати до %1$s</string>
|
||||
<string name="screen_file_browser_action_create_folder">Створити теку</string>
|
||||
<string name="screen_file_browser_action_create_new_text_file">Створити текстовий файл</string>
|
||||
<string name="screen_file_browser_action_upload_files">Завантажити файли</string>
|
||||
<string name="screen_file_browser_upload_files_chooser_title">Файли</string>
|
||||
<string name="screen_file_browser_msg_file_exported">Файл експортовано</string>
|
||||
<string name="screen_file_browser_msg_files_exported">Файли експортовано</string>
|
||||
<string name="screen_file_browser_nothing_to_export">Нічого експортувати</string>
|
||||
<string name="screen_file_browser_msg_creating_download_dir_failed">Не вдалося створити каталог для завантажень</string>
|
||||
<string name="screen_file_browser_node_action_share">Поділитись</string>
|
||||
<string name="screen_file_browser_node_action_rename">Перейменувати</string>
|
||||
<string name="screen_file_browser_node_action_edit_text">Редагувати</string>
|
||||
<string name="screen_file_browser_node_action_export">Експорт</string>
|
||||
<string name="screen_file_browser_node_action_delete">Видалити</string>
|
||||
<string name="screen_file_browser_node_action_open_with_text">Відкрити з…</string>
|
||||
<string name="screen_file_browser_selection_mode_title_zero_elements">Оберіть файли</string>
|
||||
<string name="screen_file_browser_selection_mode_title_one_or_more_elements">%1$d обрано</string>
|
||||
<string name="screen_file_browser_select_items">Оберіть</string>
|
||||
<string name="screen_file_browser_select_all_items">Вибрати все</string>
|
||||
<string name="screen_file_browser_refresh_items">Оновити</string>
|
||||
<string name="screen_file_browser_no_connection_message">Немає підключення</string>
|
||||
<string name="screen_file_browser_no_connection_button_text">Повторити</string>
|
||||
<!-- ## screen: text editor -->
|
||||
<string name="screen_text_editor_save_success">Успішно збережено</string>
|
||||
<!-- ## screen: share files -->
|
||||
<string name="screen_share_files_title">Зберегти %1$s до…</string>
|
||||
<string name="screen_share_files_content_text">текст</string>
|
||||
<string name="screen_share_files_content_file">файл</string>
|
||||
<string name="screen_share_files_content_files">файли</string>
|
||||
<string name="screen_share_files_msg_filenames_must_be_unique">Імена файлів мають бути унікальними, будь ласка, перейменуйте дублікати.</string>
|
||||
<string name="screen_share_files_section_location">Місце збереження</string>
|
||||
<string name="screen_share_files_save_button_text">Зберегти</string>
|
||||
<string name="screen_share_files_msg_success">Шифрування завершено</string>
|
||||
<!-- ## screen: choose cloud service -->
|
||||
<string name="screen_choose_cloud_service_title">Хмарні служби</string>
|
||||
<!-- ## screen: cloud connections -->
|
||||
<string name="screen_cloud_connections_title">Обрати місцерозташування</string>
|
||||
<string name="screen_cloud_connections_no_connections">Натисніть сюди щоб додати розташування</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Схоже, сервер не сумісний з WebDAV</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">Немає доступних місцерозташувань.</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">Адреса посилання</string>
|
||||
<string name="screen_webdav_settings_username_label">Ім\'я користувача</string>
|
||||
<string name="screen_webdav_settings_password_label">Пароль</string>
|
||||
<string name="screen_webdav_settings_done_button_text">Підключитися</string>
|
||||
<string name="screen_webdav_settings_msg_url_must_not_be_empty">Посилання не може бути порожнім.</string>
|
||||
<string name="screen_webdav_settings_msg_url_is_invalid">Неприпустима URL-адреса.</string>
|
||||
<string name="screen_webdav_settings_msg_username_must_not_be_empty">Поле для імені користувача не може бути порожнім.</string>
|
||||
<string name="screen_webdav_settings_msg_password_must_not_be_empty">Пароль не може бути порожнім.</string>
|
||||
<!-- ## screen: s3 settings -->
|
||||
<string name="screen_s3_settings_display_name_label">Ім\'я для відображення</string>
|
||||
<string name="screen_s3_settings_access_key_label">Ключ доступу</string>
|
||||
<string name="screen_s3_settings_secret_key_label">Секретний ключ</string>
|
||||
<string name="screen_s3_settings_bucket_label">Існуючий бакет</string>
|
||||
<string name="screen_s3_settings_endpoint_label">Кінцева точка</string>
|
||||
<string name="screen_s3_settings_region_label">Регіон</string>
|
||||
<string name="screen_s3_settings_msg_display_name_not_empty">Ім\'я не може бути порожнім</string>
|
||||
<string name="screen_s3_settings_msg_access_key_not_empty">Ключ доступу не може бути порожнім</string>
|
||||
<string name="screen_s3_settings_msg_secret_key_not_empty">Секретний ключ не може бути порожнім</string>
|
||||
<string name="screen_s3_settings_msg_bucket_not_empty">Бакет не може бути порожнім</string>
|
||||
<string name="screen_s3_settings_msg_endpoint_and_region_not_empty">Кінцева точка або регіон не можуть бути порожніми</string>
|
||||
<!-- ## screen: enter vault name -->
|
||||
<string name="screen_enter_vault_name_msg_name_empty">Назва сховища не може бути порожньою.</string>
|
||||
<string name="screen_enter_vault_name_vault_label">Назва сховища</string>
|
||||
<string name="screen_enter_vault_name_button_text">Створити</string>
|
||||
<!-- ## screen: set password -->
|
||||
<string name="screen_set_password_title">Задати пароль</string>
|
||||
<string name="screen_set_password_msg_password_mismatch">Пароль не збігається з введеним паролем.</string>
|
||||
<string name="screen_set_password_button_text">Готово</string>
|
||||
<string name="screen_set_password_hint">ВАЖЛИВО: Якщо ви забудете пароль, то не зможете відновити дані.</string>
|
||||
<string name="screen_set_password_retype_password_label">Введіть пароль ще раз</string>
|
||||
<string name="screen_set_password_strength_indicator_0">Занадто слабкий пароль для створення сховища</string>
|
||||
<string name="screen_set_password_strength_indicator_1">Слабкий</string>
|
||||
<string name="screen_set_password_strength_indicator_2">Середній</string>
|
||||
<string name="screen_set_password_strength_indicator_3">Надійний</string>
|
||||
<string name="screen_set_password_strength_indicator_4">Дуже надійний</string>
|
||||
<!-- ## screen: settings -->
|
||||
<string name="screen_settings_section_general">Основні налаштування</string>
|
||||
<string name="screen_settings_cloud_settings_label">Хмарні сервіси</string>
|
||||
<string name="screen_settings_biometric_auth">Біометрична автентифікація</string>
|
||||
<string name="screen_settings_activate_biometric_auth">Активувати біометричну автентифікацію</string>
|
||||
<string name="screen_settings_confirm_face_unlock">Підтвердити розблокування обличчям (якщо доступно)</string>
|
||||
<string name="screen_settings_block_app_when_obscured">Блокувати програму при виникненні екрану</string>
|
||||
<string name="screen_settings_block_app_when_obscured_summary">Блокувати перехоплення вводу й відображення інтерфейсу хибного ім\'я користувача</string>
|
||||
<string name="screen_settings_secure_screen">Блокувати знімки екрану</string>
|
||||
<string name="screen_settings_secure_screen_summary">Блокувати знімки екрану в списку нещодавніх та в середині програми</string>
|
||||
<string name="screen_settings_section_search">Пошук</string>
|
||||
<string name="screen_settings_live_search">\"Живий\" пошук</string>
|
||||
<string name="screen_settings_live_search_summary">Оновити результати пошуку при вході в запит</string>
|
||||
<!-- ## screen: cloud settings -->
|
||||
<!-- ## screen: licenses -->
|
||||
<!-- ## screen: authenticate cloud -->
|
||||
<!-- ## screen: insecure android version info -->
|
||||
<!-- # dialogs -->
|
||||
<string name="dialog_button_cancel">Відмінити</string>
|
||||
<string name="dialog_enter_password_positive_button">Розблокувати</string>
|
||||
<!-- Vault not found -->
|
||||
<string name="dialog_vault_not_found_positive_button_text">Прибрати</string>
|
||||
<string name="dialog_lock_vault">Заблокувати</string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Закрити</string>
|
||||
<string name="dialog_sym_link_back_button">Назад</string>
|
||||
<!-- # error reports -->
|
||||
<!-- # misc -->
|
||||
<!-- ## file size helper -->
|
||||
<!-- ## date helper -->
|
||||
<!-- ## biometric authentication -->
|
||||
<!-- notification -->
|
||||
<!-- lock timeout names -->
|
||||
<!-- cache size names -->
|
||||
<!-- screen scheme mode names -->
|
||||
<!-- update interval names -->
|
||||
</resources>
|
@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- # app -->
|
||||
<string name="share_with_label">加密</string>
|
||||
<string name="share_with_label">加密保存</string>
|
||||
<!-- # error messages -->
|
||||
<string name="error_generic">出错了</string>
|
||||
<string name="error_authentication_failed">验证失败</string>
|
||||
<string name="error_authentication_failed_re_authenticate">身份验证失败,请通过 %1$s 登录</string>
|
||||
<string name="error_generic">突发一个错误</string>
|
||||
<string name="error_authentication_failed">身份授权失败</string>
|
||||
<string name="error_authentication_failed_re_authenticate">身份验证失败,请使用 %1$s 登录</string>
|
||||
<string name="error_no_network_connection">无网络连接</string>
|
||||
<string name="error_invalid_passphrase">密码错误</string>
|
||||
<string name="error_file_or_folder_exists">文件(夹)已存在</string>
|
||||
@ -41,6 +41,7 @@
|
||||
<string name="permission_message_export_file">Cryptomator 需要存储权限以导出文件</string>
|
||||
<string name="permission_message_upload_file">Cryptomator 需要存储权限以上传文件</string>
|
||||
<string name="permission_message_share_file">Cryptomator 需要存储权限以共享文件</string>
|
||||
<string name="permission_revoked_re_request_permission">Cryptomator 已失去此位置的访问权限,请重新选择此文件夹以恢复。</string>
|
||||
<string name="snack_bar_action_title_settings">设置</string>
|
||||
<string name="snack_bar_action_title_search">搜索</string>
|
||||
<string name="snack_bar_action_title_search_previous">上一个</string>
|
||||
@ -54,8 +55,8 @@
|
||||
<string name="snack_bar_action_title_sort_smallest">大小 (升序)</string>
|
||||
<!-- # screens -->
|
||||
<!-- # screen: vault list -->
|
||||
<string name="screen_vault_list_actions_title">添加到 Cryptomator</string>
|
||||
<string name="screen_vault_list_action_create_new_vault">新建保险库</string>
|
||||
<string name="screen_vault_list_actions_title">添加到加密器</string>
|
||||
<string name="screen_vault_list_action_create_new_vault">添加新保险库</string>
|
||||
<string name="screen_vault_list_action_add_existing_vault">添加现有保险库</string>
|
||||
<string name="screen_vault_list_vault_action_delete">删除</string>
|
||||
<string name="screen_vault_list_vault_creation_hint">点击此处新建一个保险库</string>
|
||||
@ -114,8 +115,6 @@
|
||||
<string name="screen_cloud_connections_title">请选择位置</string>
|
||||
<string name="screen_cloud_connections_no_connections">点击此处添加位置</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">服务器似乎不兼容 WebDAV</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">自定义位置</string>
|
||||
<string name="screen_cloud_local_default_storage_title">默认存储</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">无可用其他位置</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">URL</string>
|
||||
@ -289,6 +288,10 @@
|
||||
<string name="dialog_app_is_obscured_info_title">应用被遮蔽</string>
|
||||
<string name="dialog_app_is_obscured_info_hint">另一应用正遮罩在 Cryptomator 之上 (例如蓝色光滤镜或夜间模式应用)。出于安全考虑,Cryptomator 已禁用\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">如何启用 Cryptomator</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">关闭</string>
|
||||
<string name="dialog_vaults_removed_during_migration_title">请重新添加 %1s 的保险库</string>
|
||||
<string name="dialog_vaults_removed_during_migration_hint">在进行应用版本迁移前,我们需要从应用中移除下列保险库:\n%2s \n\n这些保险库并不会从云端移除,仅仅是针对当前应用版本,抱歉给您带来不便,请重新添加这些保险库以便继续使之生效。</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">保险库是云端的根文件夹</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_hint">创建一个新的云端连接时,您需要选择这个保险库文件夹的父文件夹作为根目录来添加这个保险库。</string>
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">此为一项安全功能,可防止其他应用诱使用户做出错误操作\n\n如果禁用,即表示您了解<a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">其中风险</a></string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">您确定要移除此云连接吗?</string>
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_hint">此操作将移除云连接以及与之相关的所有保险库</string>
|
||||
@ -395,8 +398,8 @@
|
||||
<!-- screen scheme mode names -->
|
||||
<string name="screen_settings_style_mode">主题</string>
|
||||
<string name="follow_system">自动 (跟随系统)</string>
|
||||
<string name="light">亮色</string>
|
||||
<string name="dark">暗色</string>
|
||||
<string name="light">浅色</string>
|
||||
<string name="dark">深色</string>
|
||||
<!-- update interval names -->
|
||||
<string name="update_interval_1d">每天一次</string>
|
||||
<string name="update_interval_1w">每周一次</string>
|
||||
|
@ -10,22 +10,38 @@
|
||||
<string name="error_invalid_passphrase">密碼錯誤</string>
|
||||
<string name="error_file_or_folder_exists">該檔案或資料夾已存在。</string>
|
||||
<string name="error_vault_version_not_supported">不支援的加密檔案庫。這個加密檔案庫是用其它版本的 Cryptomator 所建立的。</string>
|
||||
<string name="error_vault_already_exists">保險箱已經存在。</string>
|
||||
<string name="error_vault_already_exists">加密檔案庫已經存在。</string>
|
||||
<string name="error_no_such_file">檔案不存在。</string>
|
||||
<string name="error_vault_has_been_locked">加密檔案庫已鎖定。</string>
|
||||
<string name="error_cloud_already_exists">雲端硬碟已經存在。</string>
|
||||
<string name="error_activity_not_found">請下載行動裝置應用程式來打開這個檔案。</string>
|
||||
<string name="error_server_not_found">找不到伺服器。</string>
|
||||
<string name="error_device_policy_manager_not_found">請打開你的裝置設定,再手動設定螢幕鎖定。</string>
|
||||
<string name="error_export_illegal_file_name">資料匯出失敗。請把檔案名稱中的特殊字元刪除後,再重新匯出資料。</string>
|
||||
<string name="error_name_contains_invalid_characters">不能含有特殊字元。</string>
|
||||
<string name="error_names_contains_invalid_characters">檔案名稱不能含有特殊字元。</string>
|
||||
<string name="error_vault_name_contains_invalid_characters">加密檔案庫的名稱不能含有特殊字元。</string>
|
||||
<string name="error_general_update">檢查更新失敗。發生一般錯誤。</string>
|
||||
<string name="error_hash_mismatch_update">更新檢查失敗。計算出的 Hash 與上傳檔案不匹配</string>
|
||||
<string name="error_update_no_internet">更新檢查失敗。沒有網絡連接。</string>
|
||||
<string name="error_failed_to_decrypt_webdav_password">解密webdav密碼失敗,請在設定中重新添加</string>
|
||||
<string name="error_play_services_not_available">尚未安裝 Google Play 服務。</string>
|
||||
<string name="error_biometric_auth_aborted">生物身份識別驗證中止</string>
|
||||
<string name="error_vault_version_mismatch">%1$s 中指定的版本不同於 %2$s</string>
|
||||
<string name="error_vault_key_invalid">%1$s 與 %2$s 不匹配</string>
|
||||
<string name="error_vault_config_loading">加載保險庫設定時發生錯誤</string>
|
||||
<string name="error_file_not_found_after_opening_using_3party">切換回 Cryptomator 後,本地檔案不再存在。期間發生的更改無法傳回雲端。</string>
|
||||
<string name="error_no_such_bucket">沒有該儲存貯體</string>
|
||||
<string name="error_masterkey_location_not_supported">尚未支持自定義 MasterKey 位置</string>
|
||||
<!-- # clouds -->
|
||||
<!-- ## cloud names -->
|
||||
<string name="cloud_names_local_storage">本機儲存空間</string>
|
||||
<!-- # permission -->
|
||||
<!-- ## permission messages -->
|
||||
<string name="permission_message_export_file">Cryptomator 需要存儲訪問權限用以導出文件</string>
|
||||
<string name="permission_message_upload_file">Cryptomator 需要存儲訪問權限用以上傳文件</string>
|
||||
<string name="permission_message_share_file">Cryptomator 需要存儲訪問權限用以共享文件</string>
|
||||
<string name="permission_revoked_re_request_permission">Cryptomator 已失去訪問此位置的許可。請再次選擇此文件夾以恢復權限。</string>
|
||||
<string name="snack_bar_action_title_settings">設定</string>
|
||||
<string name="snack_bar_action_title_search">搜尋</string>
|
||||
<string name="snack_bar_action_title_search_previous">上一頁</string>
|
||||
@ -43,14 +59,23 @@
|
||||
<string name="screen_vault_list_action_create_new_vault">新建加密檔案庫</string>
|
||||
<string name="screen_vault_list_action_add_existing_vault">新增至現有的加密檔案庫</string>
|
||||
<string name="screen_vault_list_vault_action_delete">移除</string>
|
||||
<string name="screen_vault_list_vault_creation_hint">點擊此處新建一個加密檔案庫</string>
|
||||
<string name="screen_vault_list_change_password_successful">密碼變更成功</string>
|
||||
<!-- # screen: file browser -->
|
||||
<string name="screen_file_browser_default_title">加密檔案庫</string>
|
||||
<string name="screen_file_browser_add_existing_vault_extra_text">選擇 Masterkey 檔案</string>
|
||||
<string name="screen_file_browser_create_new_vault_button_text">在此添加</string>
|
||||
<string name="screen_file_browser_create_new_vault_extra_text">加密檔案庫名稱:%1$s</string>
|
||||
<plurals name="screen_file_browser_subtitle_move">
|
||||
<item quantity="other">移動 %1$s 到</item>
|
||||
</plurals>
|
||||
<string name="screen_file_browser_move_button_text">移動</string>
|
||||
<string name="screen_file_browser_msg_empty_folder">清空資料夾</string>
|
||||
<string name="screen_file_browser_share_intent_chooser_title">分享對象</string>
|
||||
<string name="screen_file_browser_share_destination_title">選擇目的地</string>
|
||||
<string name="screen_file_browser_share_button_text">選擇</string>
|
||||
<string name="screen_file_browser_nothing_to_share">沒有東西可分享</string>
|
||||
<string name="screen_file_browser_actions_title">加入至 %1$s</string>
|
||||
<string name="screen_file_browser_action_create_folder">建立新資料夾</string>
|
||||
<string name="screen_file_browser_action_create_new_text_file">建立新文字檔案</string>
|
||||
<string name="screen_file_browser_action_upload_files">上傳檔案</string>
|
||||
@ -58,16 +83,23 @@
|
||||
<string name="screen_file_browser_msg_file_exported">檔案已匯出</string>
|
||||
<string name="screen_file_browser_msg_files_exported">所有的檔案皆已匯出</string>
|
||||
<string name="screen_file_browser_nothing_to_export">沒有任何東西可匯出。</string>
|
||||
<string name="screen_file_browser_msg_creating_download_dir_failed">建立檔案目錄失敗</string>
|
||||
<string name="screen_file_browser_node_action_share">分享</string>
|
||||
<string name="screen_file_browser_node_action_rename">重新命名</string>
|
||||
<string name="screen_file_browser_node_action_edit_text">編輯</string>
|
||||
<string name="screen_file_browser_node_action_export">匯出</string>
|
||||
<string name="screen_file_browser_node_action_delete">刪除</string>
|
||||
<string name="screen_file_browser_selection_mode_title_zero_elements">選擇項目</string>
|
||||
<string name="screen_file_browser_selection_mode_title_one_or_more_elements">已選取 %1$d 個項目</string>
|
||||
<string name="screen_file_browser_select_items">選擇</string>
|
||||
<string name="screen_file_browser_select_all_items">選擇全部</string>
|
||||
<string name="screen_file_browser_refresh_items">重新整理</string>
|
||||
<string name="screen_file_browser_no_connection_message">沒有連接</string>
|
||||
<string name="screen_file_browser_no_connection_button_text">重試</string>
|
||||
<!-- ## screen: text editor -->
|
||||
<string name="screen_text_editor_save_success">儲存成功。</string>
|
||||
<!-- ## screen: share files -->
|
||||
<string name="screen_share_files_title">正在将%1$s保存至……</string>
|
||||
<string name="screen_share_files_content_text">文字</string>
|
||||
<string name="screen_share_files_content_file">檔案</string>
|
||||
<string name="screen_share_files_content_files">檔案</string>
|
||||
@ -79,9 +111,9 @@
|
||||
<!-- ## screen: cloud connections -->
|
||||
<string name="screen_cloud_connections_title">選擇位置</string>
|
||||
<string name="screen_cloud_connections_no_connections">點擊此處新增位置</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">自訂位置</string>
|
||||
<!-- ## screen: webdav settings -->
|
||||
<string name="screen_webdav_settings_url_port_label">網址</string>
|
||||
<string name="screen_webdav_settings_username_label">帳號名稱</string>
|
||||
<string name="screen_webdav_settings_password_label">密碼</string>
|
||||
<string name="screen_webdav_settings_done_button_text">連線</string>
|
||||
<string name="screen_webdav_settings_msg_url_must_not_be_empty">網址不能為空白</string>
|
||||
@ -91,19 +123,36 @@
|
||||
<!-- ## screen: s3 settings -->
|
||||
<string name="screen_s3_settings_display_name_label">顯示名稱</string>
|
||||
<string name="screen_s3_settings_region_label">區域</string>
|
||||
<string name="screen_s3_settings_msg_bucket_not_empty">儲存貯體不可留空</string>
|
||||
<!-- ## screen: enter vault name -->
|
||||
<string name="screen_enter_vault_name_msg_name_empty">加密檔案庫名稱不可留空。</string>
|
||||
<string name="screen_enter_vault_name_vault_label">加密檔案庫名稱</string>
|
||||
<string name="screen_enter_vault_name_button_text">新建</string>
|
||||
<!-- ## screen: set password -->
|
||||
<string name="screen_set_password_title">設定密碼</string>
|
||||
<string name="screen_set_password_button_text">完成</string>
|
||||
<string name="screen_set_password_retype_password_label">再次輸入密碼</string>
|
||||
<string name="screen_set_password_strength_indicator_0">密碼強度不足,無法新建加密檔案庫</string>
|
||||
<string name="screen_set_password_strength_indicator_1">弱</string>
|
||||
<string name="screen_set_password_strength_indicator_2">一般</string>
|
||||
<string name="screen_set_password_strength_indicator_3">強</string>
|
||||
<string name="screen_set_password_strength_indicator_4">非常強</string>
|
||||
<!-- ## screen: settings -->
|
||||
<string name="screen_settings_section_general">一般</string>
|
||||
<string name="screen_settings_cloud_settings_label">雲端服務</string>
|
||||
<string name="screen_settings_biometric_auth">生物識別驗證</string>
|
||||
<string name="screen_settings_activate_biometric_auth">開啓生物識別驗證</string>
|
||||
<string name="screen_settings_confirm_face_unlock">確認面容解鎖(如果可用)</string>
|
||||
<string name="screen_settings_section_search">搜尋</string>
|
||||
<string name="screen_settings_live_search">即時搜尋</string>
|
||||
<string name="screen_settings_section_auto_lock">自動鎖定</string>
|
||||
<string name="screen_settings_auto_lock_on_screen_lock">當螢幕被鎖定</string>
|
||||
<string name="screen_settings_section_auto_photo_upload">自動上傳像片</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_vault">選擇要上傳的加密檔案庫</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_toggle">啟動</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_only_wifi_toggle">僅使用 Wi-Fi 上傳</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_including_videos">上傳影片</string>
|
||||
<string name="screen_settings_website_label">Cryptomator 網站</string>
|
||||
<string name="screen_settings_twitter_label">在 Twitter 上追蹤我們</string>
|
||||
<string name="screen_settings_facebook_label">在臉書上給我們點讚</string>
|
||||
<string name="screen_settings_section_legal">法律</string>
|
||||
@ -111,38 +160,143 @@
|
||||
<string name="screen_settings_section_support">技術支援</string>
|
||||
<string name="screen_settings_contact_label">請求協助</string>
|
||||
<string name="screen_settings_debug_mode_label">除錯模式</string>
|
||||
<string name="screen_settings_error_report_label">發送日誌檔案</string>
|
||||
<string name="screen_settings_error_report_failed">發送失敗</string>
|
||||
<string name="screen_settings_security_label">安全提示</string>
|
||||
<string name="screen_settings_section_version">版本</string>
|
||||
<string name="screen_settings_advanced_settings">進階設定</string>
|
||||
<!-- ## screen: cloud settings -->
|
||||
<string name="screen_cloud_settings_webdav_connections">WebDAV 連線</string>
|
||||
<string name="screen_cloud_settings_pcloud_connections">pCloud 連線</string>
|
||||
<string name="screen_cloud_settings_s3_connections">S3 連線</string>
|
||||
<string name="screen_cloud_settings_log_in_to">登錄到</string>
|
||||
<!-- ## screen: licenses -->
|
||||
<!-- ## screen: authenticate cloud -->
|
||||
<string name="screen_authenticate_auth_authentication_failed">%1$s 無法完成身份驗證</string>
|
||||
<!-- ## screen: insecure android version info -->
|
||||
<!-- # dialogs -->
|
||||
<string name="dialog_button_cancel">取消</string>
|
||||
<string name="dialog_enter_password_positive_button">解鎖</string>
|
||||
<string name="dialog_change_password_old_password_label">舊密碼</string>
|
||||
<string name="dialog_change_password_new_password_label">新密碼</string>
|
||||
<string name="dialog_change_password">更改密碼</string>
|
||||
<string name="dialog_change_password_msg_old_password_empty">舊密碼不可留空。</string>
|
||||
<string name="dialog_change_password_msg_new_password_empty">新密碼不可留空。</string>
|
||||
<string name="dialog_change_password_msg_password_mismatch">新密碼與再次輸入的密碼不匹配</string>
|
||||
<!-- Vault not found -->
|
||||
<string name="dialog_vault_not_found_title">找不到名為%1$s的加密檔案庫</string>
|
||||
<string name="dialog_vault_not_found_positive_button_text">移除</string>
|
||||
<string name="dialog_existing_file_title">檔案已經存在</string>
|
||||
<string name="dialog_existing_file_positive_button">取代</string>
|
||||
<string name="dialog_existing_file_message">名稱為「%s」的檔案已經存在。</string>
|
||||
<string name="dialog_replace_negative_button_at_least_two_but_not_all_files_exist">跳過已存在項目</string>
|
||||
<string name="dialog_replace_positive_button_all_files_exist">全部取代</string>
|
||||
<string name="dialog_replace_positive_button_some_files_exist">替換現有的</string>
|
||||
<string name="dialog_replace_positive_button_single_file_exists">取代</string>
|
||||
<string name="dialog_replace_msg_single_file_exists">名為「%1$s」的檔案已經存在。您想要替換它嗎?</string>
|
||||
<string name="dialog_replace_title_single_file_exists">替換檔案?</string>
|
||||
<string name="dialog_replace_title_multiple_files_exist">要取代檔案嗎?</string>
|
||||
<string name="dialog_unable_to_share_title">無法分享檔案</string>
|
||||
<string name="dialog_unable_to_share_positive_button">確認</string>
|
||||
<string name="dialog_unable_to_share_negative_button">新建加密檔案庫</string>
|
||||
<string name="dialog_filetype_not_supported_title">無法打開%1$s</string>
|
||||
<string name="dialog_rename_vault_title">重命名加密檔案庫</string>
|
||||
<string name="dialog_rename_node_folder_title">重命名檔案夾</string>
|
||||
<string name="dialog_rename_node_file_title">重新命名檔案</string>
|
||||
<string name="dialog_unsaved_changes_title">您有未保存的更改</string>
|
||||
<string name="dialog_unsaved_changes_message">您確定要不保存就離開嗎?</string>
|
||||
<string name="dialog_unsaved_changes_discard">放棄</string>
|
||||
<string name="dialog_file_name_placeholder">文本.txt</string>
|
||||
<string name="dialog_delete_vault_message">您確定要刪除這個加密檔案庫嗎?</string>
|
||||
<string name="dialog_upload_file_title">正在上傳中……</string>
|
||||
<string name="dialog_export_file_title">正在導出中(%1$d/%2$d)</string>
|
||||
<string name="dialog_progress_please_wait">請稍候……</string>
|
||||
<string name="dialog_progress_creating_folder">正在創建資料夾……</string>
|
||||
<string name="action_progress_renaming">正在重命名……</string>
|
||||
<string name="action_progress_deleting">正在删除…</string>
|
||||
<string name="dialog_progress_unlocking_vault">正在解鎖加密檔案庫……</string>
|
||||
<string name="dialog_progress_change_password">正在變更密碼……</string>
|
||||
<string name="dialog_progress_creating_vault">正在創建加密檔案庫……</string>
|
||||
<string name="dialog_progress_upload_file">正在上傳中……</string>
|
||||
<string name="dialog_progress_download_file">正在下載…</string>
|
||||
<string name="dialog_progress_encryption">正在加密中……</string>
|
||||
<string name="action_progress_moving">正在移動中……</string>
|
||||
<string name="dialog_lock_vault">鎖定</string>
|
||||
<string name="dialog_accept_ssl_certificate_title">無效的 TLS 憑證</string>
|
||||
<string name="dialog_accept_ssl_certificate_details">詳情</string>
|
||||
<string name="dialog_http_security_checkbox">更換為 HTTPS</string>
|
||||
<string name="dialog_http_security_title">是否使用 HTTPS?</string>
|
||||
<string name="dialog_no_screen_lock_title">設定螢幕鎖定?</string>
|
||||
<string name="dialog_no_screen_lock_checkbox">設定螢幕鎖定</string>
|
||||
<string name="dialog_debug_mode_disclaimer_title">注意</string>
|
||||
<string name="dialog_debug_mode_positive_button">啟用</string>
|
||||
<string name="dialog_disable_app_obscured_disclaimer_title">注意</string>
|
||||
<string name="dialog_disable_app_obscured_positive_button">禁用</string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">關閉</string>
|
||||
<string name="dialog_confirm_delete_multiple_title">是否刪除%1$d個項目?</string>
|
||||
<string name="dialog_confirm_delete_multiple_message">您確定要刪除這些項目嗎?</string>
|
||||
<string name="dialog_confirm_delete_file_message">您確定要刪除這個檔案嗎?</string>
|
||||
<string name="dialog_enter_license_title">提供一個有效的許可證書</string>
|
||||
<string name="dialog_enter_license_content">我們檢測到你沒有使用 Google Play 商店安裝 Cryptomator。提供一個有效的許可證書,證書可以從<a href="https://cryptomator.org/android/">https://cryptomator.org/android/</a>購買</string>
|
||||
<string name="dialog_enter_license_not_valid_content">提供的許可證書無效。請確認您輸入無誤。</string>
|
||||
<string name="dialog_enter_license_no_content">未提供許可證書。請輸入一個有效的許可證書。</string>
|
||||
<string name="dialog_enter_license_decline_button">退出</string>
|
||||
<string name="dialog_license_confirmation_title">許可證書確認</string>
|
||||
<string name="dialog_update_available_title">有可用更新</string>
|
||||
<string name="dialog_update_available_update">現在更新</string>
|
||||
<string name="dialog_update_available_download_site">前往下載網址</string>
|
||||
<string name="dialog_update_available_cancel">以後再說</string>
|
||||
<string name="dialog_download_update_title">正在下載</string>
|
||||
<string name="dialog_download_update_message">下載最新版本的 Cryptomator</string>
|
||||
<string name="dialog_sym_link_back_button">上一頁</string>
|
||||
<!-- # error reports -->
|
||||
<!-- # misc -->
|
||||
<!-- ## file size helper -->
|
||||
<string name="file_size_zero">0 kB</string>
|
||||
<string name="file_size_unit_bytes">位元組</string>
|
||||
<string name="file_size_unit_kilo_bytes">kB</string>
|
||||
<string name="file_size_unit_mega_bytes">MB</string>
|
||||
<string name="file_size_unit_giga_bytes">GB</string>
|
||||
<string name="file_size_unit_tera_bytes">TB</string>
|
||||
<!-- ## date helper -->
|
||||
<string name="time_unit_seconds_sg">秒</string>
|
||||
<string name="time_unit_seconds_pl">秒</string>
|
||||
<string name="time_unit_minutes_sg">分鐘</string>
|
||||
<string name="time_unit_minutes_pl">分鐘</string>
|
||||
<string name="time_unit_hours_sg">小時</string>
|
||||
<string name="time_unit_hours_pl">小時</string>
|
||||
<string name="time_unit_days_sg">天</string>
|
||||
<string name="time_unit_days_pl">天</string>
|
||||
<string name="time_unit_weeks_sg">周</string>
|
||||
<string name="time_unit_weeks_pl">周</string>
|
||||
<string name="time_unit_months_sg">月</string>
|
||||
<string name="time_unit_months_pl">月</string>
|
||||
<string name="time_unit_years_sg">年</string>
|
||||
<string name="time_unit_years_pl">年</string>
|
||||
<!-- ## biometric authentication -->
|
||||
<!-- notification -->
|
||||
<string name="screen_settings_check_updates">檢查更新</string>
|
||||
<!-- lock timeout names -->
|
||||
<string name="lock_timeout_instant">立即</string>
|
||||
<string name="lock_timeout_1m">1分鐘</string>
|
||||
<string name="lock_timeout_2m">2分鐘</string>
|
||||
<string name="lock_timeout_5m">5分鐘</string>
|
||||
<string name="lock_timeout_10m">10分鐘</string>
|
||||
<string name="lock_timeout_never">從不</string>
|
||||
<!-- cache size names -->
|
||||
<string name="cache_size_50m">50 MB</string>
|
||||
<string name="cache_size_100m">100 MB</string>
|
||||
<string name="cache_size_250m">250 MB</string>
|
||||
<string name="cache_size_500m">500 MB</string>
|
||||
<string name="cache_size_1000m">1 GB</string>
|
||||
<string name="cache_size_5000m">5 GB</string>
|
||||
<!-- screen scheme mode names -->
|
||||
<string name="screen_settings_style_mode">樣式</string>
|
||||
<string name="follow_system">自動(跟隨系統)</string>
|
||||
<string name="light">亮色</string>
|
||||
<string name="dark">暗色</string>
|
||||
<!-- update interval names -->
|
||||
<string name="update_interval_1d">每日一次</string>
|
||||
<string name="update_interval_1w">每週一次</string>
|
||||
<string name="update_interval_1m">每月一次</string>
|
||||
</resources>
|
||||
|
@ -61,6 +61,8 @@
|
||||
<string name="permission_message_upload_file">Cryptomator needs storage access to upload files</string>
|
||||
<string name="permission_message_share_file">Cryptomator needs storage access to share files</string>
|
||||
|
||||
<string name="permission_revoked_re_request_permission">Cryptomator has lost permission to access this location. Please select this folder again to restore the permission.</string>
|
||||
|
||||
<string name="snack_bar_action_title_settings">Settings</string>
|
||||
<string name="snack_bar_action_title_search">Search</string>
|
||||
<string name="snack_bar_action_title_search_previous">Previous</string>
|
||||
@ -166,8 +168,6 @@
|
||||
<string name="screen_cloud_settings_option_delete" translatable="false">@string/screen_vault_list_vault_action_delete</string>
|
||||
<string name="screen_cloud_connections_no_connections">Click here to add locations</string>
|
||||
<string name="screen_cloud_error_webdav_not_supported">Server doesn\'t seem to be WebDAV compatible</string>
|
||||
<string name="screen_cloud_local_custom_storage_title">Custom locations</string>
|
||||
<string name="screen_cloud_local_default_storage_title">Default storage</string>
|
||||
<string name="screen_cloud_local_error_no_content_provider">No additional locations available.</string>
|
||||
|
||||
<!-- ## screen: webdav settings -->
|
||||
@ -244,6 +244,8 @@
|
||||
<string name="screen_settings_section_auto_photo_upload_vault">Choose vault for upload</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_toggle">Activate</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_toggle_summary">Capture images in the background and once the selected vault is unlocked, start upload</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_toggle_instant_upload">Upload instant</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_toggle_instant_upload_summary">Upload directly if the vault is unlocked</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_only_wifi_toggle">Upload only using WIFI</string>
|
||||
<string name="screen_settings_section_auto_photo_upload_including_videos">Upload videos</string>
|
||||
|
||||
@ -415,6 +417,14 @@
|
||||
<string name="dialog_app_is_obscured_info_hint">Another app is displaying something on top of Cryptomator (e.g., a blue light filter or night mode app). For security reasons, Cryptomator is disabled.\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">How to enable Cryptomator</a></string>
|
||||
<string name="dialog_app_is_obscured_info_neutral_button">Close</string>
|
||||
|
||||
<string name="dialog_vaults_removed_during_migration_title">Please re-add vaults for %1s cloud</string>
|
||||
<string name="dialog_vaults_removed_during_migration_hint">While migrating to this app version we need to remove the following vaults from the app:\n%2s \n\nThose vaults aren\'t removed from the cloud but only from this app. Sorry for the inconvenience and please re-add these vaults to continue working with them.</string>
|
||||
<string name="dialog_vaults_removed_during_migration_neutral_button" translatable="false">@string/dialog_unable_to_share_positive_button</string>
|
||||
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_title">Vault is root folder of the cloud connection</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_hint">Create a new cloud connection where you select at least the parent folder of this vault folder as the root directory to add this vault.</string>
|
||||
<string name="dialog_vault_is_root_folder_of_cloud_neutral_button" translatable="false">@string/dialog_unable_to_share_positive_button</string>
|
||||
|
||||
<string name="dialog_disable_secure_screen_disclaimer_hint">This setting is a security feature and prevents other apps from tricking users into doing things they do not wan\'t to do.\n\nBy disabling, you confirm that you are <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">aware of the risks</a>.</string>
|
||||
|
||||
<string name="dialog_delete_cloud_connection_with_vaults_message">Are you sure you want to remove this cloud connection?</string>
|
||||
|
@ -105,6 +105,12 @@
|
||||
android:summary="@string/screen_settings_section_auto_photo_upload_toggle_summary"
|
||||
android:title="@string/screen_settings_section_auto_photo_upload_toggle" />
|
||||
|
||||
<androidx.preference.SwitchPreferenceCompat
|
||||
android:defaultValue="true"
|
||||
android:key="photoUploadInstant"
|
||||
android:summary="@string/screen_settings_section_auto_photo_upload_toggle_instant_upload_summary"
|
||||
android:title="@string/screen_settings_section_auto_photo_upload_toggle_instant_upload" />
|
||||
|
||||
<androidx.preference.SwitchPreferenceCompat
|
||||
android:defaultValue="true"
|
||||
android:key="photoUploadOnlyUsingWifi"
|
||||
|
@ -1,8 +1,10 @@
|
||||
package org.cryptomator.presentation.presenter
|
||||
|
||||
import android.Manifest
|
||||
import android.accounts.AccountManager
|
||||
import android.content.ActivityNotFoundException
|
||||
import android.content.Intent
|
||||
import android.content.Intent.ACTION_OPEN_DOCUMENT_TREE
|
||||
import android.provider.DocumentsContract
|
||||
import android.widget.Toast
|
||||
import com.dropbox.core.android.Auth
|
||||
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential
|
||||
@ -38,6 +40,7 @@ import org.cryptomator.presentation.intent.AuthenticateCloudIntent
|
||||
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.ProgressModel
|
||||
import org.cryptomator.presentation.model.ProgressStateModel
|
||||
import org.cryptomator.presentation.model.S3CloudModel
|
||||
@ -47,7 +50,6 @@ import org.cryptomator.presentation.ui.activity.view.AuthenticateCloudView
|
||||
import org.cryptomator.presentation.workflow.ActivityResult
|
||||
import org.cryptomator.presentation.workflow.AddExistingVaultWorkflow
|
||||
import org.cryptomator.presentation.workflow.CreateNewVaultWorkflow
|
||||
import org.cryptomator.presentation.workflow.PermissionsResult
|
||||
import org.cryptomator.presentation.workflow.Workflow
|
||||
import org.cryptomator.util.ExceptionUtil
|
||||
import org.cryptomator.util.crypto.CredentialCryptor
|
||||
@ -479,6 +481,7 @@ class AuthenticateCloudPresenter @Inject constructor( //
|
||||
private inner class LocalStorageAuthStrategy : AuthStrategy {
|
||||
|
||||
private var authenticationStarted = false
|
||||
|
||||
override fun supports(cloud: CloudModel): Boolean {
|
||||
return cloud.cloudType() == CloudTypeModel.LOCAL
|
||||
}
|
||||
@ -491,22 +494,41 @@ class AuthenticateCloudPresenter @Inject constructor( //
|
||||
|
||||
private fun startAuthentication(cloud: CloudModel) {
|
||||
authenticationStarted = true
|
||||
requestPermissions(
|
||||
PermissionsResultCallbacks.onLocalStorageAuthenticated(cloud), //
|
||||
R.string.permission_snackbar_auth_local_vault, //
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE, //
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
||||
)
|
||||
|
||||
val uri = (cloud as LocalStorageModel).uri()
|
||||
|
||||
val permissions = context().contentResolver.persistedUriPermissions
|
||||
for (permission in permissions) {
|
||||
if (permission.uri.toString() == uri) {
|
||||
succeedAuthenticationWith(cloud.toCloud())
|
||||
}
|
||||
}
|
||||
|
||||
Timber.tag("AuthicateCloudPrester").e("Permission revoked, ask to re-pick location")
|
||||
|
||||
Toast.makeText(context(), getString(R.string.permission_revoked_re_request_permission), Toast.LENGTH_LONG).show()
|
||||
|
||||
val openDocumentTree = Intent(ACTION_OPEN_DOCUMENT_TREE).apply {
|
||||
putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri)
|
||||
}
|
||||
|
||||
requestActivityResult(ActivityResultCallbacks.rePickedLocalStorageLocation(cloud), openDocumentTree)
|
||||
}
|
||||
}
|
||||
|
||||
@Callback
|
||||
fun onLocalStorageAuthenticated(result: PermissionsResult, cloud: CloudModel) {
|
||||
if (result.granted()) {
|
||||
succeedAuthenticationWith(cloud.toCloud())
|
||||
} else {
|
||||
failAuthentication(PermissionNotGrantedException(R.string.permission_snackbar_auth_local_vault))
|
||||
fun rePickedLocalStorageLocation(result: ActivityResult, cloud: LocalStorageModel) {
|
||||
val rootTreeUriOfLocalStorage = result.intent().data
|
||||
rootTreeUriOfLocalStorage?.let {
|
||||
context() //
|
||||
.contentResolver //
|
||||
.takePersistableUriPermission( //
|
||||
it, //
|
||||
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
|
||||
)
|
||||
}
|
||||
Timber.tag("AuthicateCloudPrester").e("Permission granted again")
|
||||
succeedAuthenticationWith(cloud.toCloud())
|
||||
}
|
||||
|
||||
private fun encrypt(password: String): String {
|
||||
|
@ -129,14 +129,18 @@ constructor(context: Context) : SharedPreferences.OnSharedPreferenceChangeListen
|
||||
defaultSharedPreferences.clear()
|
||||
}
|
||||
|
||||
fun autoPhotoUploadOnlyUsingWifi(): Boolean {
|
||||
return defaultSharedPreferences.getValue(PHOTO_UPLOAD_ONLY_USING_WIFI)
|
||||
}
|
||||
|
||||
fun usePhotoUpload(): Boolean {
|
||||
return defaultSharedPreferences.getValue(PHOTO_UPLOAD, false)
|
||||
}
|
||||
|
||||
fun usePhotoUploadInstant(): Boolean {
|
||||
return defaultSharedPreferences.getValue(PHOTO_UPLOAD_INSTANT, true)
|
||||
}
|
||||
|
||||
fun autoPhotoUploadOnlyUsingWifi(): Boolean {
|
||||
return defaultSharedPreferences.getValue(PHOTO_UPLOAD_ONLY_USING_WIFI)
|
||||
}
|
||||
|
||||
fun photoUploadVault(): Long {
|
||||
return defaultSharedPreferences.getValue(PHOTO_UPLOAD_VAULT, 0)
|
||||
}
|
||||
@ -232,6 +236,31 @@ constructor(context: Context) : SharedPreferences.OnSharedPreferenceChangeListen
|
||||
return defaultSharedPreferences.getBoolean(BACKGROUND_UNLOCK_PREPARATION, true)
|
||||
}
|
||||
|
||||
fun vaultsRemovedDuringMigration(vaultsToBeRemoved: Pair<String, List<String>>?) {
|
||||
vaultsToBeRemoved?.let {
|
||||
val vaultsToBeRemovedString = if (it.second.isNotEmpty()) {
|
||||
it.second.reduce { acc, s -> "$acc,$s" }
|
||||
} else {
|
||||
""
|
||||
}
|
||||
defaultSharedPreferences.setValue(VAULTS_REMOVED_DURING_MIGRATION_TYPE, it.first)
|
||||
defaultSharedPreferences.setValue(VAULTS_REMOVED_DURING_MIGRATION, vaultsToBeRemovedString)
|
||||
} ?: run {
|
||||
defaultSharedPreferences.setValue(VAULTS_REMOVED_DURING_MIGRATION_TYPE, null)
|
||||
defaultSharedPreferences.setValue(VAULTS_REMOVED_DURING_MIGRATION, null)
|
||||
}
|
||||
}
|
||||
|
||||
fun vaultsRemovedDuringMigration(): Pair<String, List<String>>? {
|
||||
val vaultsRemovedDuringMigrationType = defaultSharedPreferences.getString(VAULTS_REMOVED_DURING_MIGRATION_TYPE, null)
|
||||
val vaultsRemovedDuringMigration = defaultSharedPreferences.getString(VAULTS_REMOVED_DURING_MIGRATION, null)
|
||||
return if(vaultsRemovedDuringMigrationType != null && vaultsRemovedDuringMigration != null) {
|
||||
Pair(vaultsRemovedDuringMigrationType, ArrayList(vaultsRemovedDuringMigration.split(',')))
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
private const val SCREEN_LOCK_DIALOG_SHOWN = "askForScreenLockDialogShown"
|
||||
@ -244,11 +273,14 @@ constructor(context: Context) : SharedPreferences.OnSharedPreferenceChangeListen
|
||||
private const val GLOB_SEARCH = "globSearch"
|
||||
private const val KEEP_UNLOCKED_WHILE_EDITING = "keepUnlockedWhileEditing"
|
||||
private const val BACKGROUND_UNLOCK_PREPARATION = "backgroundUnlockPreparation"
|
||||
private const val VAULTS_REMOVED_DURING_MIGRATION = "vaultsRemovedDuringMigration"
|
||||
private const val VAULTS_REMOVED_DURING_MIGRATION_TYPE = "vaultsRemovedDuringMigrationType"
|
||||
const val DEBUG_MODE = "debugMode"
|
||||
const val DISABLE_APP_WHEN_OBSCURED = "disableAppWhenObscured"
|
||||
const val SECURE_SCREEN = "secureScreen"
|
||||
const val SCREEN_STYLE_MODE = "screenStyleMode"
|
||||
const val PHOTO_UPLOAD = "photoUpload"
|
||||
const val PHOTO_UPLOAD_INSTANT = "photoUploadInstant"
|
||||
const val PHOTO_UPLOAD_ONLY_USING_WIFI = "photoUploadOnlyUsingWifi"
|
||||
const val PHOTO_UPLOAD_VAULT = "photoUploadVault"
|
||||
const val PHOTO_UPLOAD_FOLDER = "photoUploadFolder"
|
||||
|
@ -1,7 +1,6 @@
|
||||
package org.cryptomator.util.crypto;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.security.keystore.KeyGenParameterSpec;
|
||||
import android.security.keystore.KeyProperties;
|
||||
|
||||
@ -43,13 +42,10 @@ class CryptoOperationsImpl implements CryptoOperations {
|
||||
KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec //
|
||||
.Builder(alias, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) //
|
||||
.setBlockModes(KeyProperties.BLOCK_MODE_CBC) //
|
||||
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7);
|
||||
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) //
|
||||
.setUserAuthenticationRequired(requireUserAuthentication) //
|
||||
.setInvalidatedByBiometricEnrollment(requireUserAuthentication);
|
||||
|
||||
builder.setUserAuthenticationRequired(requireUserAuthentication);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
builder.setInvalidatedByBiometricEnrollment(requireUserAuthentication);
|
||||
}
|
||||
generator.init(builder.build());
|
||||
generator.generateKey();
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user