mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-23 13:11:28 +00:00
Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
207bfee6e5 | ||
|
|
d08f3d03d0 | ||
|
|
a88bd81347 | ||
|
|
8e2d2b899e | ||
|
|
3b4870a98a | ||
|
|
ef5eabdb79 | ||
|
|
f52b2f323a | ||
|
|
7e60e5606c | ||
|
|
8e2fa082cc | ||
|
|
d8ef402607 | ||
|
|
748f1be0c5 | ||
|
|
608d54a8f2 | ||
|
|
50b167e28f | ||
|
|
b7d06783dd | ||
|
|
5ef3d23970 | ||
|
|
200a195f3b | ||
|
|
db0aceefdf | ||
|
|
492e986608 | ||
|
|
98cab7e4d8 | ||
|
|
384c9de7aa | ||
|
|
528005a623 | ||
|
|
c78d4c2d0e | ||
|
|
c8e9201692 | ||
|
|
536da2621a | ||
|
|
6167eeecb4 | ||
|
|
9cc873a344 | ||
|
|
b539590d7a | ||
|
|
5209bef1a9 | ||
|
|
fccd02a7e8 | ||
|
|
7e46957bcb |
19
.idea/compiler.xml
generated
19
.idea/compiler.xml
generated
@@ -2,10 +2,27 @@
|
|||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="CompilerConfiguration">
|
<component name="CompilerConfiguration">
|
||||||
<annotationProcessing>
|
<annotationProcessing>
|
||||||
<profile name="Maven default annotation processors profile" enabled="true">
|
<profile name="Annotation profile for Cryptomator" enabled="true">
|
||||||
<sourceOutputDir name="target/generated-sources/annotations" />
|
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||||
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||||
<outputRelativeToContentRoot value="true" />
|
<outputRelativeToContentRoot value="true" />
|
||||||
|
<processorPath useClasspath="false">
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-compiler/2.20/dagger-compiler-2.20.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger/2.20/dagger-2.20.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/javax/inject/javax.inject/1/javax.inject-1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-producers/2.20/dagger-producers-2.20.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/google/guava/guava/25.0-jre/guava-25.0-jre.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/checkerframework/checker-compat-qual/2.5.3/checker-compat-qual-2.5.3.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.1.3/error_prone_annotations-2.1.3.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/org/codehaus/mojo/animal-sniffer-annotations/1.14/animal-sniffer-annotations-1.14.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-spi/2.20/dagger-spi-2.20.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/com/squareup/javapoet/1.11.1/javapoet-1.11.1.jar" />
|
||||||
|
<entry name="$MAVEN_REPOSITORY$/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar" />
|
||||||
|
</processorPath>
|
||||||
<module name="commons" />
|
<module name="commons" />
|
||||||
<module name="keychain" />
|
<module name="keychain" />
|
||||||
<module name="launcher" />
|
<module name="launcher" />
|
||||||
|
|||||||
10
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
10
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
|
||||||
|
<option name="processCode" value="true" />
|
||||||
|
<option name="processLiterals" value="true" />
|
||||||
|
<option name="processComments" value="true" />
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
||||||
1
main/ant-kit/.gitignore
vendored
1
main/ant-kit/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
/target/
|
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.cryptomator</groupId>
|
<groupId>org.cryptomator</groupId>
|
||||||
<artifactId>main</artifactId>
|
<artifactId>main</artifactId>
|
||||||
<version>1.4.1</version>
|
<version>1.4.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>ant-kit</artifactId>
|
<artifactId>ant-kit</artifactId>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.cryptomator</groupId>
|
<groupId>org.cryptomator</groupId>
|
||||||
<artifactId>main</artifactId>
|
<artifactId>main</artifactId>
|
||||||
<version>1.4.1</version>
|
<version>1.4.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>commons</artifactId>
|
<artifactId>commons</artifactId>
|
||||||
<name>Cryptomator Commons</name>
|
<name>Cryptomator Commons</name>
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.cryptomator.common.settings;
|
package org.cryptomator.common.settings;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
import javafx.beans.Observable;
|
import javafx.beans.Observable;
|
||||||
import javafx.beans.property.BooleanProperty;
|
import javafx.beans.property.BooleanProperty;
|
||||||
import javafx.beans.property.ObjectProperty;
|
import javafx.beans.property.ObjectProperty;
|
||||||
@@ -20,6 +21,7 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -31,6 +33,7 @@ public class VaultSettings {
|
|||||||
public static final boolean DEFAULT_UNLOCK_AFTER_STARTUP = false;
|
public static final boolean DEFAULT_UNLOCK_AFTER_STARTUP = false;
|
||||||
public static final boolean DEFAULT_REAVEAL_AFTER_MOUNT = true;
|
public static final boolean DEFAULT_REAVEAL_AFTER_MOUNT = true;
|
||||||
public static final boolean DEFAULT_USES_INDIVIDUAL_MOUNTPATH = false;
|
public static final boolean DEFAULT_USES_INDIVIDUAL_MOUNTPATH = false;
|
||||||
|
public static final boolean DEFAULT_USES_READONLY_MODE = false;
|
||||||
|
|
||||||
private final String id;
|
private final String id;
|
||||||
private final ObjectProperty<Path> path = new SimpleObjectProperty<>();
|
private final ObjectProperty<Path> path = new SimpleObjectProperty<>();
|
||||||
@@ -40,6 +43,7 @@ public class VaultSettings {
|
|||||||
private final BooleanProperty revealAfterMount = new SimpleBooleanProperty(DEFAULT_REAVEAL_AFTER_MOUNT);
|
private final BooleanProperty revealAfterMount = new SimpleBooleanProperty(DEFAULT_REAVEAL_AFTER_MOUNT);
|
||||||
private final BooleanProperty usesIndividualMountPath = new SimpleBooleanProperty(DEFAULT_USES_INDIVIDUAL_MOUNTPATH);
|
private final BooleanProperty usesIndividualMountPath = new SimpleBooleanProperty(DEFAULT_USES_INDIVIDUAL_MOUNTPATH);
|
||||||
private final StringProperty individualMountPath = new SimpleStringProperty();
|
private final StringProperty individualMountPath = new SimpleStringProperty();
|
||||||
|
private final BooleanProperty usesReadOnlyMode = new SimpleBooleanProperty(DEFAULT_USES_READONLY_MODE);
|
||||||
|
|
||||||
public VaultSettings(String id) {
|
public VaultSettings(String id) {
|
||||||
this.id = Objects.requireNonNull(id);
|
this.id = Objects.requireNonNull(id);
|
||||||
@@ -48,7 +52,7 @@ public class VaultSettings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Observable[] observables() {
|
Observable[] observables() {
|
||||||
return new Observable[]{path, mountName, winDriveLetter, unlockAfterStartup, revealAfterMount, usesIndividualMountPath, individualMountPath};
|
return new Observable[]{path, mountName, winDriveLetter, unlockAfterStartup, revealAfterMount, usesIndividualMountPath, individualMountPath, usesReadOnlyMode};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deriveMountNameFromPath(Path path) {
|
private void deriveMountNameFromPath(Path path) {
|
||||||
@@ -131,6 +135,18 @@ public class VaultSettings {
|
|||||||
return individualMountPath;
|
return individualMountPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<String> getIndividualMountPath() {
|
||||||
|
if (usesIndividualMountPath.get()) {
|
||||||
|
return Optional.ofNullable(Strings.emptyToNull(individualMountPath.get()));
|
||||||
|
} else {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public BooleanProperty usesReadOnlyMode() {
|
||||||
|
return usesReadOnlyMode;
|
||||||
|
}
|
||||||
|
|
||||||
/* Hashcode/Equals */
|
/* Hashcode/Equals */
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class VaultSettingsJsonAdapter {
|
|||||||
out.name("revealAfterMount").value(value.revealAfterMount().get());
|
out.name("revealAfterMount").value(value.revealAfterMount().get());
|
||||||
out.name("usesIndividualMountPath").value(value.usesIndividualMountPath().get());
|
out.name("usesIndividualMountPath").value(value.usesIndividualMountPath().get());
|
||||||
out.name("individualMountPath").value(value.individualMountPath().get()); //TODO: should this always be written? ( because it could contain metadata, which the user may not want to save!)
|
out.name("individualMountPath").value(value.individualMountPath().get()); //TODO: should this always be written? ( because it could contain metadata, which the user may not want to save!)
|
||||||
|
out.name("usesReadOnlyMode").value(value.usesReadOnlyMode().get());
|
||||||
out.endObject();
|
out.endObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,6 +40,7 @@ class VaultSettingsJsonAdapter {
|
|||||||
boolean unlockAfterStartup = VaultSettings.DEFAULT_UNLOCK_AFTER_STARTUP;
|
boolean unlockAfterStartup = VaultSettings.DEFAULT_UNLOCK_AFTER_STARTUP;
|
||||||
boolean revealAfterMount = VaultSettings.DEFAULT_REAVEAL_AFTER_MOUNT;
|
boolean revealAfterMount = VaultSettings.DEFAULT_REAVEAL_AFTER_MOUNT;
|
||||||
boolean usesIndividualMountPath = VaultSettings.DEFAULT_USES_INDIVIDUAL_MOUNTPATH;
|
boolean usesIndividualMountPath = VaultSettings.DEFAULT_USES_INDIVIDUAL_MOUNTPATH;
|
||||||
|
boolean usesReadOnlyMode = VaultSettings.DEFAULT_USES_READONLY_MODE;
|
||||||
|
|
||||||
in.beginObject();
|
in.beginObject();
|
||||||
while (in.hasNext()) {
|
while (in.hasNext()) {
|
||||||
@@ -68,6 +70,9 @@ class VaultSettingsJsonAdapter {
|
|||||||
case "individualMountPath":
|
case "individualMountPath":
|
||||||
individualMountPath = in.nextString();
|
individualMountPath = in.nextString();
|
||||||
break;
|
break;
|
||||||
|
case "usesReadOnlyMode":
|
||||||
|
usesReadOnlyMode = in.nextBoolean();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
LOG.warn("Unsupported vault setting found in JSON: " + name);
|
LOG.warn("Unsupported vault setting found in JSON: " + name);
|
||||||
in.skipValue();
|
in.skipValue();
|
||||||
@@ -83,6 +88,7 @@ class VaultSettingsJsonAdapter {
|
|||||||
vaultSettings.revealAfterMount().set(revealAfterMount);
|
vaultSettings.revealAfterMount().set(revealAfterMount);
|
||||||
vaultSettings.usesIndividualMountPath().set(usesIndividualMountPath);
|
vaultSettings.usesIndividualMountPath().set(usesIndividualMountPath);
|
||||||
vaultSettings.individualMountPath().set(individualMountPath);
|
vaultSettings.individualMountPath().set(individualMountPath);
|
||||||
|
vaultSettings.usesReadOnlyMode().set(usesReadOnlyMode);
|
||||||
return vaultSettings;
|
return vaultSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.cryptomator</groupId>
|
<groupId>org.cryptomator</groupId>
|
||||||
<artifactId>main</artifactId>
|
<artifactId>main</artifactId>
|
||||||
<version>1.4.1</version>
|
<version>1.4.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>keychain</artifactId>
|
<artifactId>keychain</artifactId>
|
||||||
<name>System Keychain Access</name>
|
<name>System Keychain Access</name>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.cryptomator</groupId>
|
<groupId>org.cryptomator</groupId>
|
||||||
<artifactId>main</artifactId>
|
<artifactId>main</artifactId>
|
||||||
<version>1.4.1</version>
|
<version>1.4.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>launcher</artifactId>
|
<artifactId>launcher</artifactId>
|
||||||
<name>Cryptomator Launcher</name>
|
<name>Cryptomator Launcher</name>
|
||||||
|
|||||||
10
main/pom.xml
10
main/pom.xml
@@ -3,7 +3,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>org.cryptomator</groupId>
|
<groupId>org.cryptomator</groupId>
|
||||||
<artifactId>main</artifactId>
|
<artifactId>main</artifactId>
|
||||||
<version>1.4.1</version>
|
<version>1.4.3</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<name>Cryptomator</name>
|
<name>Cryptomator</name>
|
||||||
|
|
||||||
@@ -25,11 +25,11 @@
|
|||||||
|
|
||||||
<!-- dependency versions -->
|
<!-- dependency versions -->
|
||||||
<cryptomator.cryptolib.version>1.2.1</cryptomator.cryptolib.version>
|
<cryptomator.cryptolib.version>1.2.1</cryptomator.cryptolib.version>
|
||||||
<cryptomator.cryptofs.version>1.6.2</cryptomator.cryptofs.version>
|
<cryptomator.cryptofs.version>1.7.0</cryptomator.cryptofs.version>
|
||||||
<cryptomator.jni.version>2.0.0</cryptomator.jni.version>
|
<cryptomator.jni.version>2.0.0</cryptomator.jni.version>
|
||||||
<cryptomator.fuse.version>1.0.3</cryptomator.fuse.version>
|
<cryptomator.fuse.version>1.1.0</cryptomator.fuse.version>
|
||||||
<cryptomator.dokany.version>1.1.1</cryptomator.dokany.version>
|
<cryptomator.dokany.version>1.1.3</cryptomator.dokany.version>
|
||||||
<cryptomator.webdav.version>1.0.5</cryptomator.webdav.version>
|
<cryptomator.webdav.version>1.0.6</cryptomator.webdav.version>
|
||||||
|
|
||||||
<commons-io.version>2.6</commons-io.version>
|
<commons-io.version>2.6</commons-io.version>
|
||||||
<commons-lang3.version>3.8.1</commons-lang3.version>
|
<commons-lang3.version>3.8.1</commons-lang3.version>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.cryptomator</groupId>
|
<groupId>org.cryptomator</groupId>
|
||||||
<artifactId>main</artifactId>
|
<artifactId>main</artifactId>
|
||||||
<version>1.4.1</version>
|
<version>1.4.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>uber-jar</artifactId>
|
<artifactId>uber-jar</artifactId>
|
||||||
<name>Single über jar with all dependencies</name>
|
<name>Single über jar with all dependencies</name>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.cryptomator</groupId>
|
<groupId>org.cryptomator</groupId>
|
||||||
<artifactId>main</artifactId>
|
<artifactId>main</artifactId>
|
||||||
<version>1.4.1</version>
|
<version>1.4.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>ui</artifactId>
|
<artifactId>ui</artifactId>
|
||||||
<name>Cryptomator GUI</name>
|
<name>Cryptomator GUI</name>
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import java.util.Optional;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import javafx.beans.Observable;
|
||||||
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
|
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
|
||||||
import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException;
|
import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException;
|
||||||
import org.cryptomator.ui.controls.SecPasswordField;
|
import org.cryptomator.ui.controls.SecPasswordField;
|
||||||
@@ -48,7 +49,7 @@ public class ChangePasswordController implements ViewController {
|
|||||||
private final Application app;
|
private final Application app;
|
||||||
private final PasswordStrengthUtil strengthRater;
|
private final PasswordStrengthUtil strengthRater;
|
||||||
private final Localization localization;
|
private final Localization localization;
|
||||||
private final IntegerProperty passwordStrength = new SimpleIntegerProperty(); // 0-4
|
private final IntegerProperty passwordStrength = new SimpleIntegerProperty(-1); // 0-4
|
||||||
private Optional<ChangePasswordListener> listener = Optional.empty();
|
private Optional<ChangePasswordListener> listener = Optional.empty();
|
||||||
private Vault vault;
|
private Vault vault;
|
||||||
|
|
||||||
@@ -100,11 +101,9 @@ public class ChangePasswordController implements ViewController {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
BooleanBinding oldPasswordIsEmpty = oldPasswordField.textProperty().isEmpty();
|
oldPasswordField.textProperty().addListener(this::passwordsChanged);
|
||||||
BooleanBinding newPasswordIsEmpty = newPasswordField.textProperty().isEmpty();
|
newPasswordField.textProperty().addListener(this::passwordsChanged);
|
||||||
BooleanBinding passwordsDiffer = newPasswordField.textProperty().isNotEqualTo(retypePasswordField.textProperty());
|
retypePasswordField.textProperty().addListener(this::passwordsChanged);
|
||||||
changePasswordButton.disableProperty().bind(oldPasswordIsEmpty.or(newPasswordIsEmpty.or(passwordsDiffer)));
|
|
||||||
passwordStrength.bind(EasyBind.map(newPasswordField.textProperty(), strengthRater::computeRate));
|
|
||||||
|
|
||||||
passwordStrengthLevel0.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(0), strengthRater::getBackgroundWithStrengthColor));
|
passwordStrengthLevel0.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(0), strengthRater::getBackgroundWithStrengthColor));
|
||||||
passwordStrengthLevel1.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(1), strengthRater::getBackgroundWithStrengthColor));
|
passwordStrengthLevel1.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(1), strengthRater::getBackgroundWithStrengthColor));
|
||||||
@@ -114,6 +113,14 @@ public class ChangePasswordController implements ViewController {
|
|||||||
passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription));
|
passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void passwordsChanged(Observable observable) {
|
||||||
|
boolean oldPasswordEmpty = oldPasswordField.getCharacters().length() == 0;
|
||||||
|
boolean newPasswordEmpty = newPasswordField.getCharacters().length() == 0;
|
||||||
|
boolean passwordsEqual = newPasswordField.getCharacters().equals(retypePasswordField.getCharacters());
|
||||||
|
changePasswordButton.setDisable(oldPasswordEmpty || newPasswordEmpty || !passwordsEqual);
|
||||||
|
passwordStrength.set(strengthRater.computeRate(newPasswordField.getCharacters().toString()));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Parent getRoot() {
|
public Parent getRoot() {
|
||||||
return root;
|
return root;
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ import java.util.Optional;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import javafx.beans.Observable;
|
||||||
|
import javafx.beans.property.IntegerProperty;
|
||||||
|
import javafx.beans.value.ObservableIntegerValue;
|
||||||
import org.cryptomator.ui.controls.SecPasswordField;
|
import org.cryptomator.ui.controls.SecPasswordField;
|
||||||
import org.cryptomator.ui.l10n.Localization;
|
import org.cryptomator.ui.l10n.Localization;
|
||||||
import org.cryptomator.ui.model.Vault;
|
import org.cryptomator.ui.model.Vault;
|
||||||
@@ -42,7 +45,7 @@ public class InitializeController implements ViewController {
|
|||||||
|
|
||||||
private final Localization localization;
|
private final Localization localization;
|
||||||
private final PasswordStrengthUtil strengthRater;
|
private final PasswordStrengthUtil strengthRater;
|
||||||
private ObservableValue<Integer> passwordStrength; // 0-4
|
private IntegerProperty passwordStrength = new SimpleIntegerProperty(-1); // strengths: 0-4
|
||||||
private Optional<InitializationListener> listener = Optional.empty();
|
private Optional<InitializationListener> listener = Optional.empty();
|
||||||
private Vault vault;
|
private Vault vault;
|
||||||
|
|
||||||
@@ -87,10 +90,8 @@ public class InitializeController implements ViewController {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
BooleanBinding passwordIsEmpty = passwordField.textProperty().isEmpty();
|
passwordField.textProperty().addListener(this::passwordsChanged);
|
||||||
BooleanBinding passwordsDiffer = passwordField.textProperty().isNotEqualTo(retypePasswordField.textProperty());
|
retypePasswordField.textProperty().addListener(this::passwordsChanged);
|
||||||
okButton.disableProperty().bind(passwordIsEmpty.or(passwordsDiffer));
|
|
||||||
passwordStrength = EasyBind.map(passwordField.textProperty(), strengthRater::computeRate);
|
|
||||||
|
|
||||||
passwordStrengthLevel0.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(0), strengthRater::getBackgroundWithStrengthColor));
|
passwordStrengthLevel0.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(0), strengthRater::getBackgroundWithStrengthColor));
|
||||||
passwordStrengthLevel1.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(1), strengthRater::getBackgroundWithStrengthColor));
|
passwordStrengthLevel1.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(1), strengthRater::getBackgroundWithStrengthColor));
|
||||||
@@ -100,6 +101,13 @@ public class InitializeController implements ViewController {
|
|||||||
passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription));
|
passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void passwordsChanged(Observable observable) {
|
||||||
|
boolean passwordsEmpty = passwordField.getCharacters().length() == 0;
|
||||||
|
boolean passwordsEqual = passwordField.getCharacters().equals(retypePasswordField.getCharacters());
|
||||||
|
okButton.setDisable(passwordsEmpty || !passwordsEqual);
|
||||||
|
passwordStrength.set(strengthRater.computeRate(passwordField.getCharacters().toString()));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Parent getRoot() {
|
public Parent getRoot() {
|
||||||
return root;
|
return root;
|
||||||
|
|||||||
@@ -27,7 +27,10 @@ import javafx.scene.control.ProgressIndicator;
|
|||||||
import javafx.scene.control.TextField;
|
import javafx.scene.control.TextField;
|
||||||
import javafx.scene.input.KeyEvent;
|
import javafx.scene.input.KeyEvent;
|
||||||
import javafx.scene.layout.GridPane;
|
import javafx.scene.layout.GridPane;
|
||||||
|
import javafx.scene.layout.HBox;
|
||||||
import javafx.scene.text.Text;
|
import javafx.scene.text.Text;
|
||||||
|
import javafx.stage.DirectoryChooser;
|
||||||
|
import javafx.stage.Stage;
|
||||||
import javafx.util.StringConverter;
|
import javafx.util.StringConverter;
|
||||||
import org.apache.commons.lang3.CharUtils;
|
import org.apache.commons.lang3.CharUtils;
|
||||||
import org.apache.commons.lang3.SystemUtils;
|
import org.apache.commons.lang3.SystemUtils;
|
||||||
@@ -36,11 +39,9 @@ import org.cryptomator.common.settings.VaultSettings;
|
|||||||
import org.cryptomator.common.settings.VolumeImpl;
|
import org.cryptomator.common.settings.VolumeImpl;
|
||||||
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
|
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
|
||||||
import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException;
|
import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException;
|
||||||
import org.cryptomator.frontend.webdav.ServerLifecycleException;
|
|
||||||
import org.cryptomator.keychain.KeychainAccess;
|
import org.cryptomator.keychain.KeychainAccess;
|
||||||
import org.cryptomator.ui.controls.SecPasswordField;
|
import org.cryptomator.ui.controls.SecPasswordField;
|
||||||
import org.cryptomator.ui.l10n.Localization;
|
import org.cryptomator.ui.l10n.Localization;
|
||||||
import org.cryptomator.ui.model.InvalidSettingsException;
|
|
||||||
import org.cryptomator.ui.model.Vault;
|
import org.cryptomator.ui.model.Vault;
|
||||||
import org.cryptomator.ui.model.WindowsDriveLetters;
|
import org.cryptomator.ui.model.WindowsDriveLetters;
|
||||||
import org.cryptomator.ui.util.DialogBuilderUtil;
|
import org.cryptomator.ui.util.DialogBuilderUtil;
|
||||||
@@ -51,6 +52,12 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
import java.io.File;
|
||||||
|
import java.nio.file.DirectoryNotEmptyException;
|
||||||
|
import java.nio.file.NotDirectoryException;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -67,6 +74,7 @@ public class UnlockController implements ViewController {
|
|||||||
.precomputed();
|
.precomputed();
|
||||||
|
|
||||||
private final Application app;
|
private final Application app;
|
||||||
|
private final Stage mainWindow;
|
||||||
private final Localization localization;
|
private final Localization localization;
|
||||||
private final WindowsDriveLetters driveLetters;
|
private final WindowsDriveLetters driveLetters;
|
||||||
private final ChangeListener<Character> driveLetterChangeListener = this::winDriveLetterDidChange;
|
private final ChangeListener<Character> driveLetterChangeListener = this::winDriveLetterDidChange;
|
||||||
@@ -78,8 +86,9 @@ public class UnlockController implements ViewController {
|
|||||||
private Subscription vaultSubs = Subscription.EMPTY;
|
private Subscription vaultSubs = Subscription.EMPTY;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public UnlockController(Application app, Localization localization, WindowsDriveLetters driveLetters, Optional<KeychainAccess> keychainAccess, Settings settings, ExecutorService executor) {
|
public UnlockController(Application app, @Named("mainWindow") Stage mainWindow, Localization localization, WindowsDriveLetters driveLetters, Optional<KeychainAccess> keychainAccess, Settings settings, ExecutorService executor) {
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
this.mainWindow = mainWindow;
|
||||||
this.localization = localization;
|
this.localization = localization;
|
||||||
this.driveLetters = driveLetters;
|
this.driveLetters = driveLetters;
|
||||||
this.keychainAccess = keychainAccess;
|
this.keychainAccess = keychainAccess;
|
||||||
@@ -115,13 +124,13 @@ public class UnlockController implements ViewController {
|
|||||||
private ChoiceBox<Character> winDriveLetter;
|
private ChoiceBox<Character> winDriveLetter;
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private CheckBox useCustomMountPath;
|
private CheckBox useCustomMountPoint;
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private Label customMountPathLabel;
|
private HBox customMountPoint;
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private TextField customMountPathField;
|
private Label customMountPointLabel;
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private ProgressIndicator progressIndicator;
|
private ProgressIndicator progressIndicator;
|
||||||
@@ -141,6 +150,9 @@ public class UnlockController implements ViewController {
|
|||||||
@FXML
|
@FXML
|
||||||
private CheckBox unlockAfterStartup;
|
private CheckBox unlockAfterStartup;
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private CheckBox useReadOnlyMode;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
advancedOptions.managedProperty().bind(advancedOptions.visibleProperty());
|
advancedOptions.managedProperty().bind(advancedOptions.visibleProperty());
|
||||||
@@ -150,11 +162,8 @@ public class UnlockController implements ViewController {
|
|||||||
savePassword.setDisable(!keychainAccess.isPresent());
|
savePassword.setDisable(!keychainAccess.isPresent());
|
||||||
unlockAfterStartup.disableProperty().bind(savePassword.disabledProperty().or(savePassword.selectedProperty().not()));
|
unlockAfterStartup.disableProperty().bind(savePassword.disabledProperty().or(savePassword.selectedProperty().not()));
|
||||||
|
|
||||||
customMountPathLabel.visibleProperty().bind(useCustomMountPath.selectedProperty());
|
customMountPoint.visibleProperty().bind(useCustomMountPoint.selectedProperty());
|
||||||
customMountPathLabel.managedProperty().bind(useCustomMountPath.selectedProperty());
|
customMountPoint.managedProperty().bind(useCustomMountPoint.selectedProperty());
|
||||||
customMountPathField.visibleProperty().bind(useCustomMountPath.selectedProperty());
|
|
||||||
customMountPathField.managedProperty().bind(useCustomMountPath.selectedProperty());
|
|
||||||
customMountPathField.textProperty().addListener(this::mountPathDidChange);
|
|
||||||
winDriveLetter.setConverter(new WinDriveLetterLabelConverter());
|
winDriveLetter.setConverter(new WinDriveLetterLabelConverter());
|
||||||
|
|
||||||
if (!SystemUtils.IS_OS_WINDOWS) {
|
if (!SystemUtils.IS_OS_WINDOWS) {
|
||||||
@@ -163,20 +172,6 @@ public class UnlockController implements ViewController {
|
|||||||
winDriveLetter.setVisible(false);
|
winDriveLetter.setVisible(false);
|
||||||
winDriveLetter.setManaged(false);
|
winDriveLetter.setManaged(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VolumeImpl.WEBDAV.equals(settings.preferredVolumeImpl().get())) {
|
|
||||||
useCustomMountPath.setVisible(false);
|
|
||||||
useCustomMountPath.setManaged(false);
|
|
||||||
customMountPathField.setMouseTransparent(true);
|
|
||||||
} else {
|
|
||||||
useCustomMountPath.setVisible(true);
|
|
||||||
if (SystemUtils.IS_OS_WINDOWS) {
|
|
||||||
winDriveLetter.visibleProperty().bind(useCustomMountPath.selectedProperty().not());
|
|
||||||
winDriveLetter.managedProperty().bind(useCustomMountPath.selectedProperty().not());
|
|
||||||
winDriveLetterLabel.visibleProperty().bind(useCustomMountPath.selectedProperty().not());
|
|
||||||
winDriveLetterLabel.managedProperty().bind(useCustomMountPath.selectedProperty().not());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -225,7 +220,7 @@ public class UnlockController implements ViewController {
|
|||||||
char[] storedPw = keychainAccess.get().loadPassphrase(vault.getId());
|
char[] storedPw = keychainAccess.get().loadPassphrase(vault.getId());
|
||||||
if (storedPw != null) {
|
if (storedPw != null) {
|
||||||
savePassword.setSelected(true);
|
savePassword.setSelected(true);
|
||||||
passwordField.setText(new String(storedPw));
|
passwordField.setPassword(storedPw);
|
||||||
passwordField.selectRange(storedPw.length, storedPw.length);
|
passwordField.selectRange(storedPw.length, storedPw.length);
|
||||||
Arrays.fill(storedPw, ' ');
|
Arrays.fill(storedPw, ' ');
|
||||||
}
|
}
|
||||||
@@ -234,15 +229,58 @@ public class UnlockController implements ViewController {
|
|||||||
unlockAfterStartup.setSelected(savePassword.isSelected() && vaultSettings.unlockAfterStartup().get());
|
unlockAfterStartup.setSelected(savePassword.isSelected() && vaultSettings.unlockAfterStartup().get());
|
||||||
revealAfterMount.setSelected(vaultSettings.revealAfterMount().get());
|
revealAfterMount.setSelected(vaultSettings.revealAfterMount().get());
|
||||||
|
|
||||||
if (!settings.preferredVolumeImpl().get().equals(VolumeImpl.WEBDAV)) {
|
// WEBDAV-dependent controls:
|
||||||
useCustomMountPath.setSelected(vaultSettings.usesIndividualMountPath().get());
|
if (VolumeImpl.WEBDAV.equals(settings.preferredVolumeImpl().get())) {
|
||||||
customMountPathField.textProperty().setValue(vaultSettings.individualMountPath().getValueSafe());
|
useCustomMountPoint.setVisible(false);
|
||||||
|
useCustomMountPoint.setManaged(false);
|
||||||
|
} else {
|
||||||
|
useCustomMountPoint.setVisible(true);
|
||||||
|
useCustomMountPoint.setSelected(vaultSettings.usesIndividualMountPath().get());
|
||||||
|
if (Strings.isNullOrEmpty(vaultSettings.individualMountPath().get())) {
|
||||||
|
customMountPointLabel.setText(localization.getString("unlock.label.chooseMountPath"));
|
||||||
|
} else {
|
||||||
|
customMountPointLabel.setText(displayablePath(vaultSettings.individualMountPath().getValueSafe()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DOKANY-dependent controls:
|
||||||
|
if (VolumeImpl.DOKANY.equals(settings.preferredVolumeImpl().get())) {
|
||||||
|
winDriveLetter.visibleProperty().bind(useCustomMountPoint.selectedProperty().not());
|
||||||
|
winDriveLetter.managedProperty().bind(useCustomMountPoint.selectedProperty().not());
|
||||||
|
winDriveLetterLabel.visibleProperty().bind(useCustomMountPoint.selectedProperty().not());
|
||||||
|
winDriveLetterLabel.managedProperty().bind(useCustomMountPoint.selectedProperty().not());
|
||||||
|
// readonly not yet supported by dokany
|
||||||
|
useReadOnlyMode.setSelected(false);
|
||||||
|
useReadOnlyMode.setVisible(false);
|
||||||
|
useReadOnlyMode.setManaged(false);
|
||||||
|
} else {
|
||||||
|
useReadOnlyMode.setSelected(vaultSettings.usesReadOnlyMode().get());
|
||||||
|
}
|
||||||
|
|
||||||
|
// OS-dependent controls:
|
||||||
|
if (SystemUtils.IS_OS_WINDOWS) {
|
||||||
|
winDriveLetter.visibleProperty().bind(useCustomMountPoint.selectedProperty().not());
|
||||||
|
winDriveLetter.managedProperty().bind(useCustomMountPoint.selectedProperty().not());
|
||||||
|
winDriveLetterLabel.visibleProperty().bind(useCustomMountPoint.selectedProperty().not());
|
||||||
|
winDriveLetterLabel.managedProperty().bind(useCustomMountPoint.selectedProperty().not());
|
||||||
}
|
}
|
||||||
|
|
||||||
vaultSubs = vaultSubs.and(EasyBind.subscribe(unlockAfterStartup.selectedProperty(), vaultSettings.unlockAfterStartup()::set));
|
vaultSubs = vaultSubs.and(EasyBind.subscribe(unlockAfterStartup.selectedProperty(), vaultSettings.unlockAfterStartup()::set));
|
||||||
vaultSubs = vaultSubs.and(EasyBind.subscribe(revealAfterMount.selectedProperty(), vaultSettings.revealAfterMount()::set));
|
vaultSubs = vaultSubs.and(EasyBind.subscribe(revealAfterMount.selectedProperty(), vaultSettings.revealAfterMount()::set));
|
||||||
vaultSubs = vaultSubs.and(EasyBind.subscribe(useCustomMountPath.selectedProperty(), vaultSettings.usesIndividualMountPath()::set));
|
vaultSubs = vaultSubs.and(EasyBind.subscribe(useCustomMountPoint.selectedProperty(), vaultSettings.usesIndividualMountPath()::set));
|
||||||
|
vaultSubs = vaultSubs.and(EasyBind.subscribe(useReadOnlyMode.selectedProperty(), vaultSettings.usesReadOnlyMode()::set));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String displayablePath(String path) {
|
||||||
|
Path homeDir = Paths.get(SystemUtils.USER_HOME);
|
||||||
|
Path p = Paths.get(path);
|
||||||
|
if (p.startsWith(homeDir)) {
|
||||||
|
Path relativePath = homeDir.relativize(p);
|
||||||
|
String homePrefix = SystemUtils.IS_OS_WINDOWS ? "~\\" : "~/";
|
||||||
|
return homePrefix + relativePath.toString();
|
||||||
|
} else {
|
||||||
|
return p.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****************************************
|
// ****************************************
|
||||||
@@ -284,8 +322,13 @@ public class UnlockController implements ViewController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mountPathDidChange(ObservableValue<? extends String> property, String oldValue, String newValue) {
|
public void didClickChooseCustomMountPoint(ActionEvent actionEvent) {
|
||||||
vault.setCustomMountPath(newValue);
|
DirectoryChooser dirChooser = new DirectoryChooser();
|
||||||
|
File file = dirChooser.showDialog(mainWindow);
|
||||||
|
if (file != null) {
|
||||||
|
customMountPointLabel.setText(displayablePath(file.toString()));
|
||||||
|
vault.setCustomMountPath(file.toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -298,7 +341,7 @@ public class UnlockController implements ViewController {
|
|||||||
if (letter == null) {
|
if (letter == null) {
|
||||||
return localization.getString("unlock.choicebox.winDriveLetter.auto");
|
return localization.getString("unlock.choicebox.winDriveLetter.auto");
|
||||||
} else {
|
} else {
|
||||||
return Character.toString(letter) + ":";
|
return letter + ":";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -401,10 +444,6 @@ public class UnlockController implements ViewController {
|
|||||||
messageText.setText(null);
|
messageText.setText(null);
|
||||||
downloadsPageLink.setVisible(false);
|
downloadsPageLink.setVisible(false);
|
||||||
listener.ifPresent(lstnr -> lstnr.didUnlock(vault));
|
listener.ifPresent(lstnr -> lstnr.didUnlock(vault));
|
||||||
}).onError(InvalidSettingsException.class, e -> {
|
|
||||||
messageText.setText(localization.getString("unlock.errorMessage.invalidMountPath"));
|
|
||||||
advancedOptions.setVisible(true);
|
|
||||||
customMountPathField.setStyle("-fx-border-color: red;");
|
|
||||||
}).onError(InvalidPassphraseException.class, e -> {
|
}).onError(InvalidPassphraseException.class, e -> {
|
||||||
messageText.setText(localization.getString("unlock.errorMessage.wrongPassword"));
|
messageText.setText(localization.getString("unlock.errorMessage.wrongPassword"));
|
||||||
passwordField.selectAll();
|
passwordField.selectAll();
|
||||||
@@ -420,10 +459,17 @@ public class UnlockController implements ViewController {
|
|||||||
} else if (e.getDetectedVersion() == Integer.MAX_VALUE) {
|
} else if (e.getDetectedVersion() == Integer.MAX_VALUE) {
|
||||||
messageText.setText(localization.getString("unlock.errorMessage.unauthenticVersionMac"));
|
messageText.setText(localization.getString("unlock.errorMessage.unauthenticVersionMac"));
|
||||||
}
|
}
|
||||||
}).onError(ServerLifecycleException.class, e -> {
|
}).onError(NotDirectoryException.class, e -> {
|
||||||
LOG.error("Unlock failed for technical reasons.", e);
|
LOG.error("Unlock failed. Mount point not a directory: {}", e.getMessage());
|
||||||
messageText.setText(localization.getString("unlock.errorMessage.unlockFailed"));
|
advancedOptions.setVisible(true);
|
||||||
}).onError(Exception.class, e -> {
|
messageText.setText(null);
|
||||||
|
showUnlockFailedErrorDialog("unlock.failedDialog.content.mountPathNonExisting");
|
||||||
|
}).onError(DirectoryNotEmptyException.class, e -> {
|
||||||
|
LOG.error("Unlock failed. Mount point not empty: {}", e.getMessage());
|
||||||
|
advancedOptions.setVisible(true);
|
||||||
|
messageText.setText(null);
|
||||||
|
showUnlockFailedErrorDialog("unlock.failedDialog.content.mountPathNotEmpty");
|
||||||
|
}).onError(Exception.class, e -> { // including RuntimeExceptions
|
||||||
LOG.error("Unlock failed for technical reasons.", e);
|
LOG.error("Unlock failed for technical reasons.", e);
|
||||||
messageText.setText(localization.getString("unlock.errorMessage.unlockFailed"));
|
messageText.setText(localization.getString("unlock.errorMessage.unlockFailed"));
|
||||||
}).andFinally(() -> {
|
}).andFinally(() -> {
|
||||||
@@ -432,12 +478,17 @@ public class UnlockController implements ViewController {
|
|||||||
}
|
}
|
||||||
advancedOptions.setDisable(false);
|
advancedOptions.setDisable(false);
|
||||||
progressIndicator.setVisible(false);
|
progressIndicator.setVisible(false);
|
||||||
if (advancedOptions.isVisible()) { //dirty programming, but otherwise the focus is wrong
|
|
||||||
customMountPathField.requestFocus();
|
|
||||||
}
|
|
||||||
}).runOnce(executor);
|
}).runOnce(executor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showUnlockFailedErrorDialog(String localizableContentKey) {
|
||||||
|
String title = localization.getString("unlock.failedDialog.title");
|
||||||
|
String header = localization.getString("unlock.failedDialog.header");
|
||||||
|
String content = localization.getString(localizableContentKey);
|
||||||
|
Alert alert = DialogBuilderUtil.buildErrorDialog(title, header, content, ButtonType.OK);
|
||||||
|
alert.show();
|
||||||
|
}
|
||||||
|
|
||||||
/* callback */
|
/* callback */
|
||||||
|
|
||||||
public void setListener(UnlockListener listener) {
|
public void setListener(UnlockListener listener) {
|
||||||
@@ -453,9 +504,9 @@ public class UnlockController implements ViewController {
|
|||||||
/* state */
|
/* state */
|
||||||
|
|
||||||
public enum State {
|
public enum State {
|
||||||
UNLOCKING(null),
|
UNLOCKING(null), //
|
||||||
INITIALIZED("unlock.successLabel.vaultCreated"),
|
INITIALIZED("unlock.successLabel.vaultCreated"), //
|
||||||
PASSWORD_CHANGED("unlock.successLabel.passwordChanged"),
|
PASSWORD_CHANGED("unlock.successLabel.passwordChanged"), //
|
||||||
UPGRADED("unlock.successLabel.upgraded");
|
UPGRADED("unlock.successLabel.upgraded");
|
||||||
|
|
||||||
private Optional<String> successMessage;
|
private Optional<String> successMessage;
|
||||||
|
|||||||
@@ -2,25 +2,35 @@
|
|||||||
* Copyright (c) 2014, 2017 Sebastian Stenzel
|
* Copyright (c) 2014, 2017 Sebastian Stenzel
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* This program and the accompanying materials are made available under the terms of the accompanying LICENSE file.
|
* This program and the accompanying materials are made available under the terms of the accompanying LICENSE file.
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Sebastian Stenzel - initial API and implementation
|
* Sebastian Stenzel - initial API and implementation
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
package org.cryptomator.ui.controls;
|
package org.cryptomator.ui.controls;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import com.google.common.base.Strings;
|
||||||
|
|
||||||
import javafx.scene.control.PasswordField;
|
import javafx.scene.control.PasswordField;
|
||||||
import javafx.scene.input.DragEvent;
|
import javafx.scene.input.DragEvent;
|
||||||
import javafx.scene.input.Dragboard;
|
import javafx.scene.input.Dragboard;
|
||||||
import javafx.scene.input.TransferMode;
|
import javafx.scene.input.TransferMode;
|
||||||
|
|
||||||
|
import java.nio.CharBuffer;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compromise in security. While the text can be swiped, any access to the {@link #getText()} method will create a copy of the String in the heap.
|
* Patched PasswordField that doesn't create String copies of the password in memory. Instead the password is stored in a char[] that can be swiped.
|
||||||
|
*
|
||||||
|
* @implNote Since {@link #setText(String)} is final, we can not override its behaviour. For that reason you should not use the {@link #textProperty()} for anything else than display purposes.
|
||||||
*/
|
*/
|
||||||
public class SecPasswordField extends PasswordField {
|
public class SecPasswordField extends PasswordField {
|
||||||
|
|
||||||
private static final char SWIPE_CHAR = ' ';
|
private static final char SWIPE_CHAR = ' ';
|
||||||
|
private static final int INITIAL_BUFFER_SIZE = 50;
|
||||||
|
private static final int GROW_BUFFER_SIZE = 50;
|
||||||
|
private static final String PLACEHOLDER = "*";
|
||||||
|
|
||||||
|
private char[] content = new char[INITIAL_BUFFER_SIZE];
|
||||||
|
private int length = 0;
|
||||||
|
|
||||||
public SecPasswordField() {
|
public SecPasswordField() {
|
||||||
this.onDragOverProperty().set(this::handleDragOver);
|
this.onDragOverProperty().set(this::handleDragOver);
|
||||||
@@ -43,26 +53,54 @@ public class SecPasswordField extends PasswordField {
|
|||||||
event.consume();
|
event.consume();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void replaceText(int start, int end, String text) {
|
||||||
|
int removed = end - start;
|
||||||
|
int added = text.length();
|
||||||
|
this.length += added - removed;
|
||||||
|
growContentIfNeeded();
|
||||||
|
text.getChars(0, text.length(), content, start);
|
||||||
|
|
||||||
|
String placeholderString = Strings.repeat(PLACEHOLDER, text.length());
|
||||||
|
super.replaceText(start, end, placeholderString);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void growContentIfNeeded() {
|
||||||
|
if (this.length > content.length) {
|
||||||
|
char[] newContent = new char[content.length + GROW_BUFFER_SIZE];
|
||||||
|
System.arraycopy(content, 0, newContent, 0, content.length);
|
||||||
|
swipe();
|
||||||
|
this.content = newContent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link #getContent()} uses a StringBuilder, which in turn is backed by a char[].
|
* Creates a CharSequence by wrapping the password characters.
|
||||||
* The delete operation of AbstractStringBuilder closes the gap, that forms by deleting chars, by moving up the following chars.
|
*
|
||||||
* <br/>
|
* @return A character sequence backed by the SecPasswordField's buffer (not a copy).
|
||||||
* Imagine the following example with <code>pass</code> being the password, <code>x</code> being the swipe char and <code>'</code> being the offset of the char array:
|
* @implNote The CharSequence will not copy the backing char[].
|
||||||
* <ol>
|
* Therefore any mutation to the SecPasswordField's content will mutate or eventually swipe the returned CharSequence.
|
||||||
* <li>Append filling chars to the end of the password: <code>passxxxx'</code></li>
|
* @see #swipe()
|
||||||
* <li>Delete first 4 chars. Internal implementation will then copy subsequent chars to the position, where the deletion occured: <code>xxxx'xxxx</code></li>
|
*/
|
||||||
* <li>Delete first 4 chars again, as we appended 4 chars in step 1: <code>'xxxxxx</code></li>
|
@Override
|
||||||
* </ol>
|
public CharSequence getCharacters() {
|
||||||
|
return CharBuffer.wrap(content, 0, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(char[] password) {
|
||||||
|
swipe();
|
||||||
|
content = Arrays.copyOf(password, password.length);
|
||||||
|
length = password.length;
|
||||||
|
|
||||||
|
String placeholderString = Strings.repeat(PLACEHOLDER, password.length);
|
||||||
|
setText(placeholderString);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroys the stored password by overriding each character with a different character.
|
||||||
*/
|
*/
|
||||||
public void swipe() {
|
public void swipe() {
|
||||||
final int pwLength = this.getContent().length();
|
Arrays.fill(content, SWIPE_CHAR);
|
||||||
final char[] fillingChars = new char[pwLength];
|
|
||||||
Arrays.fill(fillingChars, SWIPE_CHAR);
|
|
||||||
this.getContent().insert(pwLength, new String(fillingChars), false);
|
|
||||||
this.getContent().delete(0, pwLength, true);
|
|
||||||
this.getContent().delete(0, pwLength, true);
|
|
||||||
// previous text has now been overwritten. but we still need to update the text to trigger some property bindings:
|
|
||||||
this.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,14 +6,24 @@ import org.cryptomator.cryptofs.CryptoFileSystem;
|
|||||||
import org.cryptomator.frontend.dokany.Mount;
|
import org.cryptomator.frontend.dokany.Mount;
|
||||||
import org.cryptomator.frontend.dokany.MountFactory;
|
import org.cryptomator.frontend.dokany.MountFactory;
|
||||||
import org.cryptomator.frontend.dokany.MountFailedException;
|
import org.cryptomator.frontend.dokany.MountFailedException;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.DirectoryNotEmptyException;
|
||||||
|
import java.nio.file.DirectoryStream;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.NotDirectoryException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
public class DokanyVolume implements Volume {
|
public class DokanyVolume implements Volume {
|
||||||
|
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(DokanyVolume.class);
|
||||||
|
|
||||||
private static final String FS_TYPE_NAME = "Cryptomator File System";
|
private static final String FS_TYPE_NAME = "Cryptomator File System";
|
||||||
|
|
||||||
private final VaultSettings vaultSettings;
|
private final VaultSettings vaultSettings;
|
||||||
@@ -28,37 +38,52 @@ public class DokanyVolume implements Volume {
|
|||||||
this.windowsDriveLetters = windowsDriveLetters;
|
this.windowsDriveLetters = windowsDriveLetters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isSupported() {
|
public boolean isSupported() {
|
||||||
return DokanyVolume.isSupportedStatic();
|
return DokanyVolume.isSupportedStatic();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mount(CryptoFileSystem fs) throws VolumeException {
|
public void mount(CryptoFileSystem fs) throws VolumeException, IOException {
|
||||||
Path mountPath = Paths.get(getMountPathString());
|
Path mountPath = getMountPoint();
|
||||||
String mountName = vaultSettings.mountName().get();
|
String mountName = vaultSettings.mountName().get();
|
||||||
try {
|
try {
|
||||||
this.mount = mountFactory.mount(fs.getPath("/"), mountPath, mountName, FS_TYPE_NAME);
|
this.mount = mountFactory.mount(fs.getPath("/"), mountPath, mountName, FS_TYPE_NAME);
|
||||||
} catch (MountFailedException e) {
|
} catch (MountFailedException e) {
|
||||||
|
if (vaultSettings.getIndividualMountPath().isPresent()) {
|
||||||
|
LOG.warn("Failed to mount vault into {}. Is this directory currently accessed by another process (e.g. Windows Explorer)?", mountPath);
|
||||||
|
}
|
||||||
throw new VolumeException("Unable to mount Filesystem", e);
|
throw new VolumeException("Unable to mount Filesystem", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getMountPathString() throws VolumeException {
|
private Path getMountPoint() throws VolumeException, IOException {
|
||||||
if (vaultSettings.usesIndividualMountPath().get()) {
|
Optional<String> optionalCustomMountPoint = vaultSettings.getIndividualMountPath();
|
||||||
return vaultSettings.individualMountPath().get();
|
if (optionalCustomMountPoint.isPresent()) {
|
||||||
|
Path customMountPoint = Paths.get(optionalCustomMountPoint.get());
|
||||||
|
checkProvidedMountPoint(customMountPoint);
|
||||||
|
return customMountPoint;
|
||||||
} else if (!Strings.isNullOrEmpty(vaultSettings.winDriveLetter().get())) {
|
} else if (!Strings.isNullOrEmpty(vaultSettings.winDriveLetter().get())) {
|
||||||
return vaultSettings.winDriveLetter().get().charAt(0) + ":\\";
|
return Paths.get(vaultSettings.winDriveLetter().get().charAt(0) + ":\\");
|
||||||
} else {
|
} else {
|
||||||
//auto assign drive letter
|
//auto assign drive letter
|
||||||
if (!windowsDriveLetters.getAvailableDriveLetters().isEmpty()) {
|
if (!windowsDriveLetters.getAvailableDriveLetters().isEmpty()) {
|
||||||
return windowsDriveLetters.getAvailableDriveLetters().iterator().next() + ":\\";
|
return Paths.get(windowsDriveLetters.getAvailableDriveLetters().iterator().next() + ":\\");
|
||||||
} else {
|
} else {
|
||||||
throw new VolumeException("No free drive letter available.");
|
throw new VolumeException("No free drive letter available.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkProvidedMountPoint(Path mountPoint) throws IOException {
|
||||||
|
if (!Files.isDirectory(mountPoint)) {
|
||||||
|
throw new NotDirectoryException(mountPoint.toString());
|
||||||
|
}
|
||||||
|
try (DirectoryStream<Path> ds = Files.newDirectoryStream(mountPoint)) {
|
||||||
|
if (ds.iterator().hasNext()) {
|
||||||
|
throw new DirectoryNotEmptyException(mountPoint.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,14 +1,5 @@
|
|||||||
package org.cryptomator.ui.model;
|
package org.cryptomator.ui.model;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.DirectoryNotEmptyException;
|
|
||||||
import java.nio.file.DirectoryStream;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.SystemUtils;
|
import org.apache.commons.lang3.SystemUtils;
|
||||||
import org.cryptomator.common.settings.VaultSettings;
|
import org.cryptomator.common.settings.VaultSettings;
|
||||||
import org.cryptomator.cryptofs.CryptoFileSystem;
|
import org.cryptomator.cryptofs.CryptoFileSystem;
|
||||||
@@ -20,65 +11,86 @@ import org.cryptomator.frontend.fuse.mount.Mount;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.DirectoryNotEmptyException;
|
||||||
|
import java.nio.file.DirectoryStream;
|
||||||
|
import java.nio.file.FileAlreadyExistsException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.NotDirectoryException;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public class FuseVolume implements Volume {
|
public class FuseVolume implements Volume {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(FuseVolume.class);
|
private static final Logger LOG = LoggerFactory.getLogger(FuseVolume.class);
|
||||||
|
|
||||||
/**
|
// TODO: dont use fixed Strings and rather set them in some system environment variables in the cryptomator installer and load those!
|
||||||
* TODO: dont use fixed Strings and rather set them in some system environment variables in the cryptomator installer and load those!
|
|
||||||
*/
|
|
||||||
private static final String DEFAULT_MOUNTROOTPATH_MAC = System.getProperty("user.home") + "/Library/Application Support/Cryptomator";
|
private static final String DEFAULT_MOUNTROOTPATH_MAC = System.getProperty("user.home") + "/Library/Application Support/Cryptomator";
|
||||||
private static final String DEFAULT_MOUNTROOTPATH_LINUX = System.getProperty("user.home") + "/.Cryptomator";
|
private static final String DEFAULT_MOUNTROOTPATH_LINUX = System.getProperty("user.home") + "/.Cryptomator";
|
||||||
|
private static final int MAX_TMPMOUNTPOINT_CREATION_RETRIES = 10;
|
||||||
|
|
||||||
private final VaultSettings vaultSettings;
|
private final VaultSettings vaultSettings;
|
||||||
|
|
||||||
private Mount fuseMnt;
|
private Mount fuseMnt;
|
||||||
private Path mountPath;
|
private Path mountPoint;
|
||||||
private boolean extraDirCreated;
|
private boolean createdTemporaryMountPoint;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public FuseVolume(VaultSettings vaultSettings) {
|
public FuseVolume(VaultSettings vaultSettings) {
|
||||||
this.vaultSettings = vaultSettings;
|
this.vaultSettings = vaultSettings;
|
||||||
this.extraDirCreated = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mount(CryptoFileSystem fs) throws IOException, FuseNotSupportedException, VolumeException {
|
public void mount(CryptoFileSystem fs) throws IOException, FuseNotSupportedException, VolumeException {
|
||||||
String mountPath;
|
Optional<String> optionalCustomMountPoint = vaultSettings.getIndividualMountPath();
|
||||||
if (vaultSettings.usesIndividualMountPath().get()) {
|
if (optionalCustomMountPoint.isPresent()) {
|
||||||
//specific path given
|
Path customMountPoint = Paths.get(optionalCustomMountPoint.get());
|
||||||
mountPath = vaultSettings.individualMountPath().get();
|
checkProvidedMountPoint(customMountPoint);
|
||||||
|
this.mountPoint = customMountPoint;
|
||||||
|
this.createdTemporaryMountPoint = false;
|
||||||
|
LOG.debug("Successfully checked custom mount point: {}", mountPoint);
|
||||||
} else {
|
} else {
|
||||||
//choose default path & create extra directory
|
this.mountPoint = createTemporaryMountPoint();
|
||||||
mountPath = createDirIfNotExist(SystemUtils.IS_OS_MAC ? DEFAULT_MOUNTROOTPATH_MAC : DEFAULT_MOUNTROOTPATH_LINUX, vaultSettings.mountName().get());
|
this.createdTemporaryMountPoint = true;
|
||||||
extraDirCreated = true;
|
LOG.debug("Successfully created mount point: {}", mountPoint);
|
||||||
}
|
}
|
||||||
this.mountPath = Paths.get(mountPath).toAbsolutePath();
|
|
||||||
mount(fs.getPath("/"));
|
mount(fs.getPath("/"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private String createDirIfNotExist(String prefix, String dirName) throws IOException {
|
private void checkProvidedMountPoint(Path mountPoint) throws IOException {
|
||||||
Path p = Paths.get(prefix, dirName + vaultSettings.getId());
|
if (!Files.isDirectory(mountPoint)) {
|
||||||
if (Files.isDirectory(p)) {
|
throw new NotDirectoryException(mountPoint.toString());
|
||||||
try (DirectoryStream<Path> emptyCheck = Files.newDirectoryStream(p)) {
|
|
||||||
if (emptyCheck.iterator().hasNext()) {
|
|
||||||
throw new DirectoryNotEmptyException("Mount point is not empty.");
|
|
||||||
} else {
|
|
||||||
LOG.info("Directory already exists and is empty. Using it as mount point.");
|
|
||||||
return p.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Files.createDirectory(p);
|
|
||||||
return p.toString();
|
|
||||||
}
|
}
|
||||||
|
try (DirectoryStream<Path> ds = Files.newDirectoryStream(mountPoint)) {
|
||||||
|
if (ds.iterator().hasNext()) {
|
||||||
|
throw new DirectoryNotEmptyException(mountPoint.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Path createTemporaryMountPoint() throws IOException {
|
||||||
|
Path parent = Paths.get(SystemUtils.IS_OS_MAC ? DEFAULT_MOUNTROOTPATH_MAC : DEFAULT_MOUNTROOTPATH_LINUX);
|
||||||
|
String basename = vaultSettings.getId();
|
||||||
|
for (int i = 0; i < MAX_TMPMOUNTPOINT_CREATION_RETRIES; i++) {
|
||||||
|
try {
|
||||||
|
Path mountPath = parent.resolve(basename + "_" + i);
|
||||||
|
Files.createDirectory(mountPath);
|
||||||
|
return mountPath;
|
||||||
|
} catch (FileAlreadyExistsException e) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOG.error("Failed to create mount path at {}/{}_x. Giving up after {} attempts.", parent, basename, MAX_TMPMOUNTPOINT_CREATION_RETRIES);
|
||||||
|
throw new FileAlreadyExistsException(parent.toString() + "/" + basename);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mount(Path root) throws VolumeException {
|
private void mount(Path root) throws VolumeException {
|
||||||
try {
|
try {
|
||||||
EnvironmentVariables envVars = EnvironmentVariables.create()
|
EnvironmentVariables envVars = EnvironmentVariables.create() //
|
||||||
.withMountName(vaultSettings.mountName().getValue())
|
.withMountName(vaultSettings.mountName().getValue()) //
|
||||||
.withMountPath(mountPath)
|
.withMountPath(mountPoint) //
|
||||||
.build();
|
.build();
|
||||||
this.fuseMnt = FuseMountFactory.getMounter().mount(root, envVars);
|
this.fuseMnt = FuseMountFactory.getMounter().mount(root, envVars);
|
||||||
} catch (CommandFailedException e) {
|
} catch (CommandFailedException e) {
|
||||||
@@ -91,27 +103,45 @@ public class FuseVolume implements Volume {
|
|||||||
try {
|
try {
|
||||||
fuseMnt.revealInFileManager();
|
fuseMnt.revealInFileManager();
|
||||||
} catch (CommandFailedException e) {
|
} catch (CommandFailedException e) {
|
||||||
LOG.info("Revealing the vault in file manger failed: " + e.getMessage());
|
LOG.debug("Revealing the vault in file manger failed: " + e.getMessage());
|
||||||
throw new VolumeException(e);
|
throw new VolumeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void unmount() throws VolumeException {
|
public boolean supportsForcedUnmount() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void unmountForced() throws VolumeException {
|
||||||
try {
|
try {
|
||||||
|
fuseMnt.unmountForced();
|
||||||
fuseMnt.close();
|
fuseMnt.close();
|
||||||
} catch (CommandFailedException e) {
|
} catch (CommandFailedException e) {
|
||||||
throw new VolumeException(e);
|
throw new VolumeException(e);
|
||||||
}
|
}
|
||||||
cleanup();
|
deleteTemporaryMountPoint();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cleanup() {
|
@Override
|
||||||
if (extraDirCreated) {
|
public synchronized void unmount() throws VolumeException {
|
||||||
|
try {
|
||||||
|
fuseMnt.unmount();
|
||||||
|
fuseMnt.close();
|
||||||
|
} catch (CommandFailedException e) {
|
||||||
|
throw new VolumeException(e);
|
||||||
|
}
|
||||||
|
deleteTemporaryMountPoint();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deleteTemporaryMountPoint() {
|
||||||
|
if (createdTemporaryMountPoint) {
|
||||||
try {
|
try {
|
||||||
Files.delete(mountPath);
|
Files.delete(mountPoint);
|
||||||
|
LOG.debug("Successfully deleted mount point: {}", mountPoint);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOG.warn("Could not delete mounting directory:" + e.getMessage());
|
LOG.warn("Could not delete mount point: {}", e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
package org.cryptomator.ui.model;
|
|
||||||
|
|
||||||
public class InvalidSettingsException extends RuntimeException {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.cryptomator.ui.model;
|
package org.cryptomator.ui.model;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import javafx.beans.Observable;
|
import javafx.beans.Observable;
|
||||||
import javafx.beans.binding.Binding;
|
import javafx.beans.binding.Binding;
|
||||||
@@ -21,6 +22,7 @@ import org.cryptomator.common.settings.Settings;
|
|||||||
import org.cryptomator.common.settings.VaultSettings;
|
import org.cryptomator.common.settings.VaultSettings;
|
||||||
import org.cryptomator.cryptofs.CryptoFileSystem;
|
import org.cryptomator.cryptofs.CryptoFileSystem;
|
||||||
import org.cryptomator.cryptofs.CryptoFileSystemProperties;
|
import org.cryptomator.cryptofs.CryptoFileSystemProperties;
|
||||||
|
import org.cryptomator.cryptofs.CryptoFileSystemProperties.FileSystemFlags;
|
||||||
import org.cryptomator.cryptofs.CryptoFileSystemProvider;
|
import org.cryptomator.cryptofs.CryptoFileSystemProvider;
|
||||||
import org.cryptomator.cryptolib.api.CryptoException;
|
import org.cryptomator.cryptolib.api.CryptoException;
|
||||||
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
|
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
|
||||||
@@ -35,8 +37,11 @@ import java.io.IOException;
|
|||||||
import java.nio.file.FileAlreadyExistsException;
|
import java.nio.file.FileAlreadyExistsException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.NoSuchFileException;
|
import java.nio.file.NoSuchFileException;
|
||||||
|
import java.nio.file.NotDirectoryException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
@@ -77,9 +82,13 @@ public class Vault {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private CryptoFileSystem unlockCryptoFileSystem(CharSequence passphrase) throws NoSuchFileException, IOException, InvalidPassphraseException, CryptoException {
|
private CryptoFileSystem unlockCryptoFileSystem(CharSequence passphrase) throws NoSuchFileException, IOException, InvalidPassphraseException, CryptoException {
|
||||||
|
List<FileSystemFlags> flags = new ArrayList<>();
|
||||||
|
if (vaultSettings.usesReadOnlyMode().get()) {
|
||||||
|
flags.add(FileSystemFlags.READONLY);
|
||||||
|
}
|
||||||
CryptoFileSystemProperties fsProps = CryptoFileSystemProperties.cryptoFileSystemProperties() //
|
CryptoFileSystemProperties fsProps = CryptoFileSystemProperties.cryptoFileSystemProperties() //
|
||||||
.withPassphrase(passphrase) //
|
.withPassphrase(passphrase) //
|
||||||
.withFlags() //
|
.withFlags(flags) //
|
||||||
.withMasterkeyFilename(MASTERKEY_FILENAME) //
|
.withMasterkeyFilename(MASTERKEY_FILENAME) //
|
||||||
.build();
|
.build();
|
||||||
return CryptoFileSystemProvider.newFileSystem(getPath(), fsProps);
|
return CryptoFileSystemProvider.newFileSystem(getPath(), fsProps);
|
||||||
@@ -97,11 +106,11 @@ public class Vault {
|
|||||||
CryptoFileSystemProvider.changePassphrase(getPath(), MASTERKEY_FILENAME, oldPassphrase, newPassphrase);
|
CryptoFileSystemProvider.changePassphrase(getPath(), MASTERKEY_FILENAME, oldPassphrase, newPassphrase);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void unlock(CharSequence passphrase) throws InvalidSettingsException, CryptoException, IOException, Volume.VolumeException {
|
public synchronized void unlock(CharSequence passphrase) throws CryptoException, IOException, Volume.VolumeException {
|
||||||
Platform.runLater(() -> state.set(State.PROCESSING));
|
Platform.runLater(() -> state.set(State.PROCESSING));
|
||||||
try {
|
try {
|
||||||
if (vaultSettings.usesIndividualMountPath().and(vaultSettings.individualMountPath().isEmpty()).get()) {
|
if (vaultSettings.usesIndividualMountPath().get() && Strings.isNullOrEmpty(vaultSettings.individualMountPath().get())) {
|
||||||
throw new InvalidSettingsException();
|
throw new NotDirectoryException("");
|
||||||
}
|
}
|
||||||
CryptoFileSystem fs = getCryptoFileSystem(passphrase);
|
CryptoFileSystem fs = getCryptoFileSystem(passphrase);
|
||||||
volume = volumeProvider.get();
|
volume = volumeProvider.get();
|
||||||
|
|||||||
@@ -22,11 +22,11 @@ import org.apache.commons.lang3.SystemUtils;
|
|||||||
@Singleton
|
@Singleton
|
||||||
public final class WindowsDriveLetters {
|
public final class WindowsDriveLetters {
|
||||||
|
|
||||||
private static final Set<Character> A_TO_Z;
|
private static final Set<Character> D_TO_Z;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
try (IntStream stream = IntStream.rangeClosed('A', 'Z')) {
|
try (IntStream stream = IntStream.rangeClosed('D', 'Z')) {
|
||||||
A_TO_Z = stream.mapToObj(i -> (char) i).collect(Collectors.toSet());
|
D_TO_Z = stream.mapToObj(i -> (char) i).collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ public final class WindowsDriveLetters {
|
|||||||
public Set<Character> getAvailableDriveLetters() {
|
public Set<Character> getAvailableDriveLetters() {
|
||||||
Set<Character> occupiedDriveLetters = getOccupiedDriveLetters();
|
Set<Character> occupiedDriveLetters = getOccupiedDriveLetters();
|
||||||
Predicate<Character> isOccupiedDriveLetter = occupiedDriveLetters::contains;
|
Predicate<Character> isOccupiedDriveLetter = occupiedDriveLetters::contains;
|
||||||
return A_TO_Z.stream().filter(isOccupiedDriveLetter.negate()).collect(Collectors.toSet());
|
return D_TO_Z.stream().filter(isOccupiedDriveLetter.negate()).collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,23 +7,20 @@
|
|||||||
Contributors:
|
Contributors:
|
||||||
Sebastian Stenzel - initial API and implementation
|
Sebastian Stenzel - initial API and implementation
|
||||||
-->
|
-->
|
||||||
<?import org.cryptomator.ui.controls.SecPasswordField?>
|
|
||||||
|
<?import javafx.geometry.Insets?>
|
||||||
|
<?import javafx.scene.control.Button?>
|
||||||
|
<?import javafx.scene.control.CheckBox?>
|
||||||
|
<?import javafx.scene.control.ChoiceBox?>
|
||||||
|
<?import javafx.scene.control.Hyperlink?>
|
||||||
<?import javafx.scene.control.Label?>
|
<?import javafx.scene.control.Label?>
|
||||||
<?import javafx.scene.control.ProgressIndicator?>
|
<?import javafx.scene.control.ProgressIndicator?>
|
||||||
<?import javafx.scene.control.CheckBox?>
|
|
||||||
<?import javafx.scene.control.Button?>
|
|
||||||
<?import javafx.scene.layout.GridPane?>
|
|
||||||
<?import javafx.geometry.Insets?>
|
|
||||||
<?import javafx.scene.layout.ColumnConstraints?>
|
|
||||||
<?import javafx.scene.control.TextField?>
|
|
||||||
<?import javafx.scene.text.TextFlow?>
|
|
||||||
<?import javafx.scene.control.Hyperlink?>
|
|
||||||
<?import javafx.scene.text.Text?>
|
|
||||||
<?import javafx.scene.layout.HBox?>
|
|
||||||
<?import javafx.scene.control.Separator?>
|
<?import javafx.scene.control.Separator?>
|
||||||
<?import javafx.scene.control.ChoiceBox?>
|
<?import javafx.scene.control.TextField?>
|
||||||
<?import javafx.scene.layout.VBox?>
|
<?import javafx.scene.layout.*?>
|
||||||
|
<?import javafx.scene.text.Text?>
|
||||||
|
<?import javafx.scene.text.TextFlow?>
|
||||||
|
<?import org.cryptomator.ui.controls.SecPasswordField?>
|
||||||
<GridPane fx:controller="org.cryptomator.ui.controllers.UnlockController" fx:id="root" vgap="12.0" hgap="12.0" prefWidth="400.0" xmlns:fx="http://javafx.com/fxml" cacheShape="true" cache="true">
|
<GridPane fx:controller="org.cryptomator.ui.controllers.UnlockController" fx:id="root" vgap="12.0" hgap="12.0" prefWidth="400.0" xmlns:fx="http://javafx.com/fxml" cacheShape="true" cache="true">
|
||||||
<padding>
|
<padding>
|
||||||
<Insets top="24.0" right="12.0" bottom="24.0" left="12.0" />
|
<Insets top="24.0" right="12.0" bottom="24.0" left="12.0" />
|
||||||
@@ -83,16 +80,23 @@
|
|||||||
<CheckBox GridPane.rowIndex="4" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="revealAfterMount" text="%unlock.label.revealAfterMount" cacheShape="true" cache="true" />
|
<CheckBox GridPane.rowIndex="4" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="revealAfterMount" text="%unlock.label.revealAfterMount" cacheShape="true" cache="true" />
|
||||||
|
|
||||||
<!-- Row 3.5 -->
|
<!-- Row 3.5 -->
|
||||||
<CheckBox GridPane.rowIndex="5" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="useCustomMountPath" text="%unlock.label.useOwnMountPath" cacheShape="true" cache="true" />
|
<CheckBox GridPane.rowIndex="5" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="useReadOnlyMode" text="%unlock.label.useReadOnlyMode" cacheShape="true" cache="true" />
|
||||||
|
|
||||||
<!-- Row 3.6 Alt1 -->
|
<!-- Row 3.6 -->
|
||||||
<Label GridPane.rowIndex="6" GridPane.columnIndex="0" fx:id="winDriveLetterLabel" text="%unlock.label.winDriveLetter" cacheShape="true" cache="true" />
|
<CheckBox GridPane.rowIndex="6" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="useCustomMountPoint" text="%unlock.label.useOwnMountPath" cacheShape="true" cache="true" />
|
||||||
<ChoiceBox GridPane.rowIndex="6" GridPane.columnIndex="1" fx:id="winDriveLetter" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" />
|
|
||||||
|
|
||||||
<!-- Row 3.6 Alt2 -->
|
<!-- Row 3.7 Alt1 -->
|
||||||
<Label GridPane.rowIndex="6" GridPane.columnIndex="0" fx:id="customMountPathLabel" text="%unlock.label.mountPath" cacheShape="true" cache="true" />
|
<Label GridPane.rowIndex="7" GridPane.columnIndex="0" fx:id="winDriveLetterLabel" text="%unlock.label.winDriveLetter" cacheShape="true" cache="true" />
|
||||||
<TextField GridPane.rowIndex="6" GridPane.columnIndex="1" fx:id="customMountPathField" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" />
|
<ChoiceBox GridPane.rowIndex="7" GridPane.columnIndex="1" fx:id="winDriveLetter" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" />
|
||||||
|
|
||||||
|
<!-- Row 3.7 Alt2 -->
|
||||||
|
<HBox fx:id="customMountPoint" GridPane.rowIndex="7" GridPane.columnIndex="0" GridPane.columnSpan="2" spacing="6" alignment="BASELINE_LEFT" cacheShape="true" cache="true">
|
||||||
|
<padding>
|
||||||
|
<Insets left="20.0" />
|
||||||
|
</padding>
|
||||||
|
<Label HBox.hgrow="ALWAYS" fx:id="customMountPointLabel" textOverrun="LEADING_ELLIPSIS" cacheShape="true" cache="true" />
|
||||||
|
<Button HBox.hgrow="NEVER" minWidth="-Infinity" text="" styleClass="ionicons" onAction="#didClickChooseCustomMountPoint" focusTraversable="true" cacheShape="true" cache="true" />
|
||||||
|
</HBox>
|
||||||
</GridPane>
|
</GridPane>
|
||||||
|
|
||||||
<!-- Row 4 -->
|
<!-- Row 4 -->
|
||||||
|
|||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPl
|
|||||||
main.createVault.nonEmptyDir.title = Creating vault failed
|
main.createVault.nonEmptyDir.title = Creating vault failed
|
||||||
main.createVault.nonEmptyDir.header = Chosen directory is not empty
|
main.createVault.nonEmptyDir.header = Chosen directory is not empty
|
||||||
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
||||||
unlock.label.mountPath = Mount path
|
|
||||||
unlock.label.mountPathButton = Apply
|
|
||||||
settings.webdav.port.label = WebDAV Port
|
settings.webdav.port.label = WebDAV Port
|
||||||
settings.webdav.port.prompt = 0 \= Choose automatically
|
settings.webdav.port.prompt = 0 \= Choose automatically
|
||||||
settings.webdav.port.apply = Apply
|
settings.webdav.port.apply = Apply
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Update check
|
|||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.tryAgain = Try again
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = Този сейф трябва да бъде обно
|
|||||||
main.createVault.nonEmptyDir.title = Неуспешно създаване на сейф
|
main.createVault.nonEmptyDir.title = Неуспешно създаване на сейф
|
||||||
main.createVault.nonEmptyDir.header = Избраната директория не е празна
|
main.createVault.nonEmptyDir.header = Избраната директория не е празна
|
||||||
main.createVault.nonEmptyDir.content = Избраната директория съдържа файлове /може би скрити/. Сейфът може да бъде създаден само в празна директория
|
main.createVault.nonEmptyDir.content = Избраната директория съдържа файлове /може би скрити/. Сейфът може да бъде създаден само в празна директория
|
||||||
unlock.label.mountPath = Път за монтиране
|
|
||||||
unlock.label.mountPathButton = Приложи
|
|
||||||
settings.webdav.port.label = WebCAM порт
|
settings.webdav.port.label = WebCAM порт
|
||||||
settings.webdav.port.prompt = 0 \= Автоматично избиране
|
settings.webdav.port.prompt = 0 \= Автоматично избиране
|
||||||
settings.webdav.port.apply = Приложи
|
settings.webdav.port.apply = Приложи
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Update check
|
|||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.tryAgain = Try again
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
125
main/ui/src/main/resources/localization/ca.txt
Normal file
125
main/ui/src/main/resources/localization/ca.txt
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
app.name = Cryptomator
|
||||||
|
# main.fxml
|
||||||
|
main.emptyListInstructions = Feu click ací per afegir una caixa forta
|
||||||
|
main.directoryList.contextMenu.remove = Elimina de la llista
|
||||||
|
main.directoryList.contextMenu.changePassword = Canvia la contrasenya
|
||||||
|
main.addDirectory.contextMenu.new = Crea una caixa forta nova
|
||||||
|
main.addDirectory.contextMenu.open = Obri una caixa forta existent
|
||||||
|
# welcome.fxml
|
||||||
|
welcome.checkForUpdates.label.currentlyChecking = Comprovant actualitzacions
|
||||||
|
welcome.newVersionMessage = La versió %1$s és disponible per descarregar.\nLa versió actual és %2$s.
|
||||||
|
# initialize.fxml
|
||||||
|
initialize.label.password = Contrasenya
|
||||||
|
initialize.label.retypePassword = Torneu a escriure la contrasenya
|
||||||
|
initialize.button.ok = Crea una caixa forta
|
||||||
|
initialize.messageLabel.alreadyInitialized = La caixa forta ja està inicialitzada
|
||||||
|
initialize.messageLabel.initializationFailed = No s'ha pogut inicialitzar la caixa forta. Consulteu l'arxiu de registre per a més informació.
|
||||||
|
# notfound.fxml
|
||||||
|
notfound.label = No s'ha trobat la caixa forta. S'ha mogut a altre lloc?
|
||||||
|
# upgrade.fxml
|
||||||
|
upgrade.button = Actualitza la caixa forta
|
||||||
|
upgrade.version3dropBundleExtension.msg = Esta caixa forta es deu actualitzar a un format més modern.\nEs va a canviar el nom de "%1$s" a "%2$s".\nAssegureu-vos de que la sincronització ha acabat abans d'iniciar el procés.
|
||||||
|
upgrade.version3dropBundleExtension.err.alreadyExists = Error en la migració automàtica.\n"%s" ja existeix.
|
||||||
|
# unlock.fxml
|
||||||
|
unlock.label.password = Contrasenya
|
||||||
|
unlock.label.mountName = Nom de la unitat
|
||||||
|
unlock.label.winDriveLetter = Lletra de la unitat
|
||||||
|
unlock.label.downloadsPageLink = Totes les versions de Cryptomator
|
||||||
|
unlock.label.advancedHeading = Opcions avançades
|
||||||
|
unlock.button.unlock = Debloqueja la caixa forta
|
||||||
|
unlock.button.advancedOptions.show = Més opcions
|
||||||
|
unlock.button.advancedOptions.hide = Menys opcions
|
||||||
|
unlock.choicebox.winDriveLetter.auto = Assigna automàticament
|
||||||
|
unlock.errorMessage.wrongPassword = Contrasenya incorrecta
|
||||||
|
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = La caixa forta no és compatible. Aquesta caixa forta s'ha creat amb una versió anterior de Cryptomator.
|
||||||
|
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = La caixa forta no és compatible. Aquesta caixa forta s'ha creat amb una versió més nova de Cryptomator.
|
||||||
|
unlock.messageLabel.startServerFailed = S'ha produït un error en iniciar el servidor WebDAV.
|
||||||
|
# change_password.fxml
|
||||||
|
changePassword.label.oldPassword = Contrasenya antiga
|
||||||
|
changePassword.label.newPassword = Contrasenya nova
|
||||||
|
changePassword.label.retypePassword = Torneu a escriure la contrasenya
|
||||||
|
changePassword.label.downloadsPageLink = Totes les versions de Cryptomator
|
||||||
|
changePassword.button.change = Canvia la contrasenya
|
||||||
|
changePassword.errorMessage.wrongPassword = Contrasenya incorrecta
|
||||||
|
changePassword.errorMessage.decryptionFailed = Ha fallat el desencriptatge
|
||||||
|
# unlocked.fxml
|
||||||
|
unlocked.button.lock = Bloqueja la caixa forta
|
||||||
|
unlocked.moreOptions.reveal = Mostra la unitat
|
||||||
|
unlocked.label.revealFailed = L'ordre ha fallat
|
||||||
|
unlocked.label.unmountFailed = Error al expulsar la unidad
|
||||||
|
unlocked.label.statsEncrypted = xifrat
|
||||||
|
unlocked.label.statsDecrypted = desxifrat
|
||||||
|
unlocked.ioGraph.yAxis.label = Velocitat de transferència de dades (MiB/s)
|
||||||
|
# settings.fxml
|
||||||
|
settings.version.label = Versió %s
|
||||||
|
settings.checkForUpdates.label = Comprova si hi ha actualitzacions
|
||||||
|
settings.requiresRestartLabel = És necessari reiniciar * Cryptomator
|
||||||
|
# tray icon
|
||||||
|
tray.menu.open = Obri
|
||||||
|
tray.menu.quit = Surt
|
||||||
|
tray.infoMsg.title = Encara s'està executant
|
||||||
|
tray.infoMsg.msg = Cryptomator encara està executant-se. Sortiu des de la icona de la safata.
|
||||||
|
tray.infoMsg.msg.osx = Cryptomator encara està executant-se. Sortiu des de la icona de la barra de menú
|
||||||
|
initialize.messageLabel.passwordStrength.0 = Molt dèbil
|
||||||
|
initialize.messageLabel.passwordStrength.1 = Dèbil
|
||||||
|
initialize.messageLabel.passwordStrength.2 = Acceptable
|
||||||
|
initialize.messageLabel.passwordStrength.3 = Forta
|
||||||
|
initialize.messageLabel.passwordStrength.4 = Molt forta
|
||||||
|
initialize.label.doNotForget = IMPORTANT\: No hi ha manera de recuperar les dades si oblideu la contrasenya.
|
||||||
|
main.directoryList.remove.confirmation.title = Suprimeix la caixa forta
|
||||||
|
main.directoryList.remove.confirmation.header = ¿Esteu segur que voleu suprimir aquesta caixa forta?
|
||||||
|
main.directoryList.remove.confirmation.content = La caixa forta només es suprimeix de la llista. Per tal de eliminar-la permanentment esborreu la caixa forta del vostre sistema de fitxers.
|
||||||
|
upgrade.version3to4.msg = S'ha de migrar la caixa forta a un format més nou.\nS'actualitzaran els noms xifrats de les carpetes.\nAssegureu-vos que la sincronització ha acabat abans de continuar.
|
||||||
|
upgrade.version3to4.err.io = Error en la migració degut a una excepció de E/S. Comproveu el registre per veure'n els detalls.\n
|
||||||
|
# upgrade.fxml
|
||||||
|
upgrade.confirmation.label = Sí, m'he assegurat que la sincronització hagi acabat
|
||||||
|
unlock.label.savePassword = Desa la contrasenya
|
||||||
|
unlock.errorMessage.unauthenticVersionMac = No s'ha pogut autenticar la versió de MAC.
|
||||||
|
unlocked.label.mountFailed = Ha fallat el muntatge de la unitat
|
||||||
|
unlock.savePassword.delete.confirmation.title = Elimina la contrasenya desada
|
||||||
|
unlock.savePassword.delete.confirmation.header = Esteu segur que voleu eliminar la contrasenya desada d'aquesta unitat?
|
||||||
|
unlock.savePassword.delete.confirmation.content = La contrasenya desada d'aquesta caixa forta va a ser eliminada inmediatament del clauer del seu sistema. Si voleu tornar a desar la contrasenya haureu de tornar a desbloquejar la vostra caixa forta i activar l'opció "Desa la contrasenya".
|
||||||
|
settings.debugMode.label = Mode de depuració *
|
||||||
|
upgrade.version3dropBundleExtension.title = Actualitza la caixa forta a la versió 3 (Drop Bundle Extension)
|
||||||
|
upgrade.version3to4.title = Actualitza la caixa forta de la versió 3 a la 4
|
||||||
|
upgrade.version4to5.title = Actualitza la caixa forta de la versió 4 a la 5
|
||||||
|
upgrade.version4to5.msg = S'ha de migrar la caixa forta a un format més nou.\nS'actualitzaran els fitxers xifrats.\nAssegureu-vos que la sincronització ha acabat abans de continuar.\n\nNota\: la data de modificació de tots els fitxers es canviarà a la data/hora del procés.
|
||||||
|
upgrade.version4to5.err.io = La migració ha fallat a causa d'una excepció d'E/S. Comproveu el registre per veure'n els detalls.
|
||||||
|
unlock.label.revealAfterMount = Mostra la unitat
|
||||||
|
unlocked.lock.force.confirmation.title = Ha fallat el bloqueig de %1$s
|
||||||
|
unlocked.lock.force.confirmation.header = Voleu forçar el bloqueig?
|
||||||
|
unlocked.lock.force.confirmation.content = Això pot ser perquè altres programes encara estan accedint als fitxers de la caixa forta o perquè s'ha produït un altre problema.\n\nEls programes què encara estan accedint als fitxers poden funcionar incorrectament i les dades què aquests programes no hagin escrit es poden perdre.
|
||||||
|
unlock.label.unlockAfterStartup = Desbloqueig automàtic al iniciar (experimental)
|
||||||
|
unlock.errorMessage.unlockFailed = Ha fallat el desbloqueig. Comproveu el registre per veure'n els detalls.
|
||||||
|
upgrade.version5toX.title = Actualització de la versió de la caixa forta
|
||||||
|
upgrade.version5toX.msg = S'ha de migrar la caixa forta a un format més nou.\nAssegureu-vos que la sincronització ha acabat abans de continuar.
|
||||||
|
main.createVault.nonEmptyDir.title = Ha fallat la creació de la caixa forta
|
||||||
|
main.createVault.nonEmptyDir.header = El directori seleccionat no és buit
|
||||||
|
main.createVault.nonEmptyDir.content = Hi ha fitxers (possibement ocults) al directori seleccionat. Només es pot crear una caixa forta a un directori buit.
|
||||||
|
settings.webdav.port.label = Port WebDAV
|
||||||
|
settings.webdav.port.prompt = 0 \= Tria automàticament
|
||||||
|
settings.webdav.port.apply = Aplica
|
||||||
|
settings.webdav.prefGvfsScheme.label = Esquema de WebDAV
|
||||||
|
settings.volume.label = Tipus de volum preferit
|
||||||
|
settings.volume.webdav = WebDAV
|
||||||
|
settings.volume.fuse = FUSE
|
||||||
|
unlock.successLabel.vaultCreated = La caixa forta s'ha creat correctament.
|
||||||
|
unlock.successLabel.passwordChanged = La contrasenya s'ha canviat correctament.
|
||||||
|
unlock.successLabel.upgraded = Cryptomator s'ha actualitzat correctament.
|
||||||
|
unlock.label.useOwnMountPath = Utilitza un punt de muntatge personalitzat
|
||||||
|
welcome.askForUpdateCheck.dialog.title = Comprovació d'actualizacions
|
||||||
|
welcome.askForUpdateCheck.dialog.header = Activo la comprovació automàtica d'actualitzacions?
|
||||||
|
welcome.askForUpdateCheck.dialog.content = Recomanat\: Activa la comprovació d'actualitzacions per assegurar-vos que sempre teniu la darrera versió de Cryptomator instal·lada amb totes les actualitzacions de seguretat.\n\nPodeu canviar aquesta opció des de la configuració en qualsevol moment.
|
||||||
|
settings.volume.dokany = Dokany
|
||||||
|
main.gracefulShutdown.dialog.title = Ha fallat el bloqueig de la caixa(es) forta(es)
|
||||||
|
main.gracefulShutdown.dialog.header = La caixa(es) forta(es) és(són) en ús
|
||||||
|
main.gracefulShutdown.dialog.content = Hi ha programes encara estan utilitzant una caixa forta o més d'una. Tanqueu-los per permetre que Cryptomator es tanqui correctament i, a continuació, torneu-ho a intentar.\n\nSi això no funciona, es pot forçar l'aturada de Cryptomator tot i que no es recomana, donç pot comportar pèrdua de dades.
|
||||||
|
main.gracefulShutdown.button.tryAgain = Torna-ho a intentar
|
||||||
|
main.gracefulShutdown.button.forceShutdown = Força l'aturada
|
||||||
|
unlock.pendingMessage.unlocking = La caixa forta s'està desbloquejant...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -98,8 +98,6 @@ upgrade.version5toX.msg = Tento trezor je třeba aktualizovat na novější form
|
|||||||
main.createVault.nonEmptyDir.title = Vytvoření trezoru se nezdařilo
|
main.createVault.nonEmptyDir.title = Vytvoření trezoru se nezdařilo
|
||||||
main.createVault.nonEmptyDir.header = Zvolená složka není prázdná
|
main.createVault.nonEmptyDir.header = Zvolená složka není prázdná
|
||||||
main.createVault.nonEmptyDir.content = Zvolená složka už obsahuje soubory (možná skryté). Trezor je možné vytvořit pouze v prázdné složce.
|
main.createVault.nonEmptyDir.content = Zvolená složka už obsahuje soubory (možná skryté). Trezor je možné vytvořit pouze v prázdné složce.
|
||||||
unlock.label.mountPath = Popis umístění přípojného bodu
|
|
||||||
unlock.label.mountPathButton = Použít
|
|
||||||
settings.webdav.port.label = Port WebDAV
|
settings.webdav.port.label = Port WebDAV
|
||||||
settings.webdav.port.prompt = 0 \= zvolit automaticky
|
settings.webdav.port.prompt = 0 \= zvolit automaticky
|
||||||
settings.webdav.port.apply = Použít
|
settings.webdav.port.apply = Použít
|
||||||
@@ -115,10 +113,15 @@ welcome.askForUpdateCheck.dialog.title = Zjišťování aktualizací
|
|||||||
welcome.askForUpdateCheck.dialog.header = Zjišťovat automaticky nové verze?
|
welcome.askForUpdateCheck.dialog.header = Zjišťovat automaticky nové verze?
|
||||||
welcome.askForUpdateCheck.dialog.content = Ke zjištění aktualizací, Cryptomator stáhne aktuální verzi z instalačních serverů a zobrazí nápovědu, když je k dispozici novější verze, než je nainstalovaná.\n\nDoporučujeme zapnout zjišťování aktualizací a zajistit tak, že vždy budete mít nejnovější verzi Cryptomator, se všemi opravami zabezpečení nainstalovanými. Pokud automatické zjišťování nezapnete, je možné ručně stahovat nejnovější verzi z https\://cryptomator.org/downloads/.\n\nToto nastavení je možné kdykoli změnit v nastavení aplikace.
|
welcome.askForUpdateCheck.dialog.content = Ke zjištění aktualizací, Cryptomator stáhne aktuální verzi z instalačních serverů a zobrazí nápovědu, když je k dispozici novější verze, než je nainstalovaná.\n\nDoporučujeme zapnout zjišťování aktualizací a zajistit tak, že vždy budete mít nejnovější verzi Cryptomator, se všemi opravami zabezpečení nainstalovanými. Pokud automatické zjišťování nezapnete, je možné ručně stahovat nejnovější verzi z https\://cryptomator.org/downloads/.\n\nToto nastavení je možné kdykoli změnit v nastavení aplikace.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Individuální přípojný bod není nastaven
|
|
||||||
main.gracefulShutdown.dialog.title = Zamčení trezorů se nezdařilo
|
main.gracefulShutdown.dialog.title = Zamčení trezorů se nezdařilo
|
||||||
main.gracefulShutdown.dialog.header = Trezory v používání
|
main.gracefulShutdown.dialog.header = Trezory v používání
|
||||||
main.gracefulShutdown.dialog.content = Jeden nebo více trezorů je stále v používání ostatními programy. Ukončete je aby se Cryptomator mohl správně vypnout a zkuste to znovu.\n\nPokud to nezabere, Cryptomator je možné vypnout vynuceně, ale to může vést ke ztrátě dat a není proto doporučeno.
|
main.gracefulShutdown.dialog.content = Jeden nebo více trezorů je stále v používání ostatními programy. Ukončete je aby se Cryptomator mohl správně vypnout a zkuste to znovu.\n\nPokud to nezabere, Cryptomator je možné vypnout vynuceně, ale to může vést ke ztrátě dat a není proto doporučeno.
|
||||||
main.gracefulShutdown.button.tryAgain = Zkusit znovu
|
main.gracefulShutdown.button.tryAgain = Zkusit znovu
|
||||||
main.gracefulShutdown.button.forceShutdown = Vynutit vypnutí
|
main.gracefulShutdown.button.forceShutdown = Vynutit vypnutí
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Odemykání trezoru…
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPl
|
|||||||
main.createVault.nonEmptyDir.title = Creating vault failed
|
main.createVault.nonEmptyDir.title = Creating vault failed
|
||||||
main.createVault.nonEmptyDir.header = Chosen directory is not empty
|
main.createVault.nonEmptyDir.header = Chosen directory is not empty
|
||||||
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
||||||
unlock.label.mountPath = Mount path
|
|
||||||
unlock.label.mountPathButton = Apply
|
|
||||||
settings.webdav.port.label = WebDAV Port
|
settings.webdav.port.label = WebDAV Port
|
||||||
settings.webdav.port.prompt = 0 \= Choose automatically
|
settings.webdav.port.prompt = 0 \= Choose automatically
|
||||||
settings.webdav.port.apply = Apply
|
settings.webdav.port.apply = Apply
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Update check
|
|||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.tryAgain = Try again
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = Dieser Tresor muss auf ein neueres Format aktualisiert
|
|||||||
main.createVault.nonEmptyDir.title = Erstellung des Tresors fehlgeschlagen
|
main.createVault.nonEmptyDir.title = Erstellung des Tresors fehlgeschlagen
|
||||||
main.createVault.nonEmptyDir.header = Ausgewählter Ordner ist nicht leer
|
main.createVault.nonEmptyDir.header = Ausgewählter Ordner ist nicht leer
|
||||||
main.createVault.nonEmptyDir.content = Der ausgewählte Ordner enthält bereits Dateien (möglicherweise unsichtbar). Ein Tresor kann nur innerhalb eines leeren Ordners erstellt werden.
|
main.createVault.nonEmptyDir.content = Der ausgewählte Ordner enthält bereits Dateien (möglicherweise unsichtbar). Ein Tresor kann nur innerhalb eines leeren Ordners erstellt werden.
|
||||||
unlock.label.mountPath = Verzeichnis
|
|
||||||
unlock.label.mountPathButton = Anwenden
|
|
||||||
settings.webdav.port.label = WebDAV-Port
|
settings.webdav.port.label = WebDAV-Port
|
||||||
settings.webdav.port.prompt = 0 \= automatische Auswahl
|
settings.webdav.port.prompt = 0 \= automatische Auswahl
|
||||||
settings.webdav.port.apply = Anwenden
|
settings.webdav.port.apply = Anwenden
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Auf Updates prüfen
|
|||||||
welcome.askForUpdateCheck.dialog.header = Eingebaute Update-Prüfung aktivieren?
|
welcome.askForUpdateCheck.dialog.header = Eingebaute Update-Prüfung aktivieren?
|
||||||
welcome.askForUpdateCheck.dialog.content = Empfehlung\: Aktivieren Sie die Update-Prüfung, um sicherzustellen, dass Sie stets die neueste Cryptomator-Version mit allen Sicherheits-Patches verwenden.\n\nDiese Einstellung können Sie jederzeit im Einstellungs-Menü ändern.
|
welcome.askForUpdateCheck.dialog.content = Empfehlung\: Aktivieren Sie die Update-Prüfung, um sicherzustellen, dass Sie stets die neueste Cryptomator-Version mit allen Sicherheits-Patches verwenden.\n\nDiese Einstellung können Sie jederzeit im Einstellungs-Menü ändern.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Individueller Mount-Punkt ist nicht gesetzt.
|
|
||||||
main.gracefulShutdown.dialog.title = Sperren des Tresors gescheitert
|
main.gracefulShutdown.dialog.title = Sperren des Tresors gescheitert
|
||||||
main.gracefulShutdown.dialog.header = Tresor in Gebrauch
|
main.gracefulShutdown.dialog.header = Tresor in Gebrauch
|
||||||
main.gracefulShutdown.dialog.content = Ein oder mehrere Tresore werden noch von anderen Programmen genutzt. Bitte schliessen Sie die Programme um es Cryptomator zu ermöglichen richtig herunter zu fahren. Versuchen Sie es danach erneut.\n\nFalls dies nicht klappt, kann Cryptomator das Beenden erzwingen. Dies kann zu einem Datenverlust führen und ist nicht empfohlen.
|
main.gracefulShutdown.dialog.content = Ein oder mehrere Tresore werden noch von anderen Programmen genutzt. Bitte schliessen Sie die Programme um es Cryptomator zu ermöglichen richtig herunter zu fahren. Versuchen Sie es danach erneut.\n\nFalls dies nicht klappt, kann Cryptomator das Beenden erzwingen. Dies kann zu einem Datenverlust führen und ist nicht empfohlen.
|
||||||
main.gracefulShutdown.button.tryAgain = Versuchen Sie es erneut
|
main.gracefulShutdown.button.tryAgain = Versuchen Sie es erneut
|
||||||
main.gracefulShutdown.button.forceShutdown = Herunterfahren erzwingen
|
main.gracefulShutdown.button.forceShutdown = Herunterfahren erzwingen
|
||||||
unlock.pendingMessage.unlocking = Entsperre Tresor...
|
unlock.pendingMessage.unlocking = Entsperre Tresor...
|
||||||
|
unlock.failedDialog.title = Entsperren fehlgeschlagen
|
||||||
|
unlock.failedDialog.header = Entsperren fehlgeschlagen
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Laufwerksverzeichnis existiert nicht.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Laufwerksverzeichnis ist nicht leer.
|
||||||
|
unlock.label.useReadOnlyMode = Nur lesend
|
||||||
|
unlock.label.chooseMountPath = Leeren Ordner auswählen…
|
||||||
@@ -73,10 +73,10 @@ unlock.label.savePassword=Save Password
|
|||||||
unlock.label.mountName=Drive Name
|
unlock.label.mountName=Drive Name
|
||||||
unlock.label.unlockAfterStartup=Auto-Unlock on Start (Experimental)
|
unlock.label.unlockAfterStartup=Auto-Unlock on Start (Experimental)
|
||||||
unlock.label.revealAfterMount=Reveal Drive
|
unlock.label.revealAfterMount=Reveal Drive
|
||||||
|
unlock.label.useReadOnlyMode=Read-Only
|
||||||
unlock.label.winDriveLetter=Drive Letter
|
unlock.label.winDriveLetter=Drive Letter
|
||||||
unlock.label.useOwnMountPath=Use Custom Mount Point
|
unlock.label.useOwnMountPath=Use Custom Mount Point
|
||||||
unlock.label.mountPath=Mount path
|
unlock.label.chooseMountPath=Choose empty directory…
|
||||||
unlock.label.mountPathButton=Apply
|
|
||||||
unlock.label.downloadsPageLink=All Cryptomator versions
|
unlock.label.downloadsPageLink=All Cryptomator versions
|
||||||
unlock.label.advancedHeading=Advanced Options
|
unlock.label.advancedHeading=Advanced Options
|
||||||
unlock.button.unlock=Unlock Vault
|
unlock.button.unlock=Unlock Vault
|
||||||
@@ -88,8 +88,6 @@ unlock.savePassword.delete.confirmation.content=The saved password of this vault
|
|||||||
unlock.choicebox.winDriveLetter.auto=Assign automatically
|
unlock.choicebox.winDriveLetter.auto=Assign automatically
|
||||||
unlock.pendingMessage.unlocking=Unlocking vault...
|
unlock.pendingMessage.unlocking=Unlocking vault...
|
||||||
unlock.errorMessage.wrongPassword=Wrong password
|
unlock.errorMessage.wrongPassword=Wrong password
|
||||||
unlock.errorMessage.wrongPassword=Wrong Password
|
|
||||||
unlock.errorMessage.invalidMountPath=Use of custom mount path selected, but no path given.
|
|
||||||
unlock.errorMessage.unlockFailed=Unlock failed. See log file for details.
|
unlock.errorMessage.unlockFailed=Unlock failed. See log file for details.
|
||||||
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware=Unsupported vault. This vault has been created with an older version of Cryptomator.
|
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware=Unsupported vault. This vault has been created with an older version of Cryptomator.
|
||||||
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault=Unsupported vault. This vault has been created with a newer version of Cryptomator.
|
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault=Unsupported vault. This vault has been created with a newer version of Cryptomator.
|
||||||
@@ -99,6 +97,12 @@ unlock.successLabel.vaultCreated=Vault was successfully created.
|
|||||||
unlock.successLabel.passwordChanged=Password was successfully changed.
|
unlock.successLabel.passwordChanged=Password was successfully changed.
|
||||||
unlock.successLabel.upgraded=Cryptomator was successfully upgraded.
|
unlock.successLabel.upgraded=Cryptomator was successfully upgraded.
|
||||||
|
|
||||||
|
unlock.failedDialog.title=Unlock failed
|
||||||
|
unlock.failedDialog.header=Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting=Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty=Mount point is not empty.
|
||||||
|
|
||||||
|
|
||||||
# change_password.fxml
|
# change_password.fxml
|
||||||
changePassword.label.oldPassword=Old Password
|
changePassword.label.oldPassword=Old Password
|
||||||
changePassword.label.newPassword=New Password
|
changePassword.label.newPassword=New Password
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ main.emptyListInstructions = Haga clic aquí para añadir una caja fuerte
|
|||||||
# should it be imperative?
|
# should it be imperative?
|
||||||
main.directoryList.contextMenu.remove = Eliminar de la lista
|
main.directoryList.contextMenu.remove = Eliminar de la lista
|
||||||
main.directoryList.contextMenu.changePassword = Cambiar la contraseña
|
main.directoryList.contextMenu.changePassword = Cambiar la contraseña
|
||||||
|
# Fuzzy
|
||||||
main.addDirectory.contextMenu.new = Crear una nueva caja fuerte
|
main.addDirectory.contextMenu.new = Crear una nueva caja fuerte
|
||||||
main.addDirectory.contextMenu.open = Abrir una caja fuerte existente
|
main.addDirectory.contextMenu.open = Abrir una caja fuerte existente
|
||||||
# welcome.fxml
|
# welcome.fxml
|
||||||
@@ -98,8 +99,6 @@ upgrade.version5toX.msg = Esta caja fuerte debe ser migrada a un formato más mo
|
|||||||
main.createVault.nonEmptyDir.title = Error en la creación de la bóveda
|
main.createVault.nonEmptyDir.title = Error en la creación de la bóveda
|
||||||
main.createVault.nonEmptyDir.header = El directorio elegido no está vacío
|
main.createVault.nonEmptyDir.header = El directorio elegido no está vacío
|
||||||
main.createVault.nonEmptyDir.content = El directorio seleccionado ya contiene archivos (posiblemente ocultos). Una bóveda sólo puede crearse en un directorio vacío.
|
main.createVault.nonEmptyDir.content = El directorio seleccionado ya contiene archivos (posiblemente ocultos). Una bóveda sólo puede crearse en un directorio vacío.
|
||||||
unlock.label.mountPath = Punto de montaje
|
|
||||||
unlock.label.mountPathButton = Aplicar
|
|
||||||
settings.webdav.port.label = Puerto WebDAV
|
settings.webdav.port.label = Puerto WebDAV
|
||||||
settings.webdav.port.prompt = 0 \= Elige automáticamente
|
settings.webdav.port.prompt = 0 \= Elige automáticamente
|
||||||
settings.webdav.port.apply = Aplicar
|
settings.webdav.port.apply = Aplicar
|
||||||
@@ -115,10 +114,15 @@ welcome.askForUpdateCheck.dialog.title = Buscar actualización
|
|||||||
welcome.askForUpdateCheck.dialog.header = ¿Habilitar la búsqueda de actualizaciones automática?
|
welcome.askForUpdateCheck.dialog.header = ¿Habilitar la búsqueda de actualizaciones automática?
|
||||||
welcome.askForUpdateCheck.dialog.content = Para buscar actualizaciones, Cryptomator buscará la versión actual en los servidores de Cryptomator y le mostrará una sugerencia si hay una versión más nueva disponible.\n\nRecomendamos habilitar la comprobación de actualización para asegurarse siempre de que tiene instalada la versión más reciente de Cryptomator, con todos los parches de seguridad. Si no habilita la verificación de actualización, puede verificar y descargar la versión actual desde https\://cryptomator.org/downloads/.\n\nPuede cambiar esto en cualquier momento desde dentro de la configuración.
|
welcome.askForUpdateCheck.dialog.content = Para buscar actualizaciones, Cryptomator buscará la versión actual en los servidores de Cryptomator y le mostrará una sugerencia si hay una versión más nueva disponible.\n\nRecomendamos habilitar la comprobación de actualización para asegurarse siempre de que tiene instalada la versión más reciente de Cryptomator, con todos los parches de seguridad. Si no habilita la verificación de actualización, puede verificar y descargar la versión actual desde https\://cryptomator.org/downloads/.\n\nPuede cambiar esto en cualquier momento desde dentro de la configuración.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = La ruta individual de montaje no ha sido asignada.
|
|
||||||
main.gracefulShutdown.dialog.title = No fue posible cerrar la(s) caja(s) fuerte(s)
|
main.gracefulShutdown.dialog.title = No fue posible cerrar la(s) caja(s) fuerte(s)
|
||||||
main.gracefulShutdown.dialog.header = Caja(s) Fuertes(s) en uso
|
main.gracefulShutdown.dialog.header = Caja(s) Fuertes(s) en uso
|
||||||
main.gracefulShutdown.dialog.content = Una o más cajas fuertes están siendo utilizadas por otros programas. Por favor ciérrelos para permitir a Cryptomator cerrarse adecuadamente, e intente de nuevo.\n\nSi esto no funciona, Cryptomator puede cerrarse forzosamente, pero esta vía puede provocar pérdida de información y no es recomendada.
|
main.gracefulShutdown.dialog.content = Una o más cajas fuertes están siendo utilizadas por otros programas. Por favor ciérrelos para permitir a Cryptomator cerrarse adecuadamente, e intente de nuevo.\n\nSi esto no funciona, Cryptomator puede cerrarse forzosamente, pero esta vía puede provocar pérdida de información y no es recomendada.
|
||||||
main.gracefulShutdown.button.tryAgain = Intente de nuevo
|
main.gracefulShutdown.button.tryAgain = Intente de nuevo
|
||||||
main.gracefulShutdown.button.forceShutdown = Forzar apagado
|
main.gracefulShutdown.button.forceShutdown = Forzar apagado
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Desbloqueando la caja fuerte...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -99,8 +99,6 @@ upgrade.version5toX.msg = Ce coffre-fort doit être converti dans un format plus
|
|||||||
main.createVault.nonEmptyDir.title = Echec de création du coffre-fort
|
main.createVault.nonEmptyDir.title = Echec de création du coffre-fort
|
||||||
main.createVault.nonEmptyDir.header = Le répertoire sélectionné n'est pas vide
|
main.createVault.nonEmptyDir.header = Le répertoire sélectionné n'est pas vide
|
||||||
main.createVault.nonEmptyDir.content = Le répertoire sélectionné contient déjà des fichiers (potentiellement cachés). Un coffre-fort ne peut être créé que dans un répertoire vide.
|
main.createVault.nonEmptyDir.content = Le répertoire sélectionné contient déjà des fichiers (potentiellement cachés). Un coffre-fort ne peut être créé que dans un répertoire vide.
|
||||||
unlock.label.mountPath = Chemin de montage
|
|
||||||
unlock.label.mountPathButton = Appliquer
|
|
||||||
settings.webdav.port.label = Port de WebDAV
|
settings.webdav.port.label = Port de WebDAV
|
||||||
settings.webdav.port.prompt = 0 \= choisir automatiquement
|
settings.webdav.port.prompt = 0 \= choisir automatiquement
|
||||||
settings.webdav.port.apply = Appliquer
|
settings.webdav.port.apply = Appliquer
|
||||||
@@ -116,10 +114,15 @@ welcome.askForUpdateCheck.dialog.title = vérification de la mise à jour
|
|||||||
welcome.askForUpdateCheck.dialog.header = Activer le contrôle de mise à jour intégré ?
|
welcome.askForUpdateCheck.dialog.header = Activer le contrôle de mise à jour intégré ?
|
||||||
welcome.askForUpdateCheck.dialog.content = Pour vérifier les mises à jour, Cryptomator récupère la version actuelle sur les serveurs Cryptomator et vous donne un aperçu si une nouvelle version est disponible.\n\nNous vous recommandons d'activer la vérification de mise à jour pour vous assurer que vous avez toujours la dernière version de Cryptomator, avec tous les correctifs de sécurité, installés. Si vous n'activez pas le contrôle de mise à jour, vous pouvez vérifier et télécharger la version actuelle à partir de https\://cryptomator.org/downloads/.\n\nVous pouvez le modifier à tout moment à partir des paramètres.
|
welcome.askForUpdateCheck.dialog.content = Pour vérifier les mises à jour, Cryptomator récupère la version actuelle sur les serveurs Cryptomator et vous donne un aperçu si une nouvelle version est disponible.\n\nNous vous recommandons d'activer la vérification de mise à jour pour vous assurer que vous avez toujours la dernière version de Cryptomator, avec tous les correctifs de sécurité, installés. Si vous n'activez pas le contrôle de mise à jour, vous pouvez vérifier et télécharger la version actuelle à partir de https\://cryptomator.org/downloads/.\n\nVous pouvez le modifier à tout moment à partir des paramètres.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Le chemin de montage n'est pas défini.
|
|
||||||
main.gracefulShutdown.dialog.title = Échec en fermant le coffre-fort.
|
main.gracefulShutdown.dialog.title = Échec en fermant le coffre-fort.
|
||||||
main.gracefulShutdown.dialog.header = Coffre-fort est en cours d'utilisation.
|
main.gracefulShutdown.dialog.header = Coffre-fort est en cours d'utilisation.
|
||||||
main.gracefulShutdown.dialog.content = Un ou plusieurs coffre-forts sont en cours d'utilisation par d'autres logiciels. S'il vous plait, fermer-les pour permettre à Cryptomator de finir proprement.\n\nSi ça ne marche pas, Cryptomator peut fermer par force, mais cela peut résulter d'une perte de vos fichiers (non recommandé).
|
main.gracefulShutdown.dialog.content = Un ou plusieurs coffre-forts sont en cours d'utilisation par d'autres logiciels. S'il vous plait, fermer-les pour permettre à Cryptomator de finir proprement.\n\nSi ça ne marche pas, Cryptomator peut fermer par force, mais cela peut résulter d'une perte de vos fichiers (non recommandé).
|
||||||
main.gracefulShutdown.button.tryAgain = Réessayez
|
main.gracefulShutdown.button.tryAgain = Réessayez
|
||||||
main.gracefulShutdown.button.forceShutdown = Arrêt forcé
|
main.gracefulShutdown.button.forceShutdown = Arrêt forcé
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = A széf új verzióra történő migrációja szüksé
|
|||||||
main.createVault.nonEmptyDir.title = A széf létrehozása sikertelen
|
main.createVault.nonEmptyDir.title = A széf létrehozása sikertelen
|
||||||
main.createVault.nonEmptyDir.header = A kiválasztott mappa nem üres
|
main.createVault.nonEmptyDir.header = A kiválasztott mappa nem üres
|
||||||
main.createVault.nonEmptyDir.content = A kiválasztott mappa már tartalmaz fájlokat (valószínűleg rejtett). A széf csak üres mappában hozható létre.
|
main.createVault.nonEmptyDir.content = A kiválasztott mappa már tartalmaz fájlokat (valószínűleg rejtett). A széf csak üres mappában hozható létre.
|
||||||
unlock.label.mountPath = Elérési út csatlakoztatása
|
|
||||||
unlock.label.mountPathButton = Alkalmaz
|
|
||||||
settings.webdav.port.label = WebDAV Port
|
settings.webdav.port.label = WebDAV Port
|
||||||
settings.webdav.port.prompt = 0 \= Automatikus választás
|
settings.webdav.port.prompt = 0 \= Automatikus választás
|
||||||
settings.webdav.port.apply = Alkalmaz
|
settings.webdav.port.apply = Alkalmaz
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Update check
|
|||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Próbáld újra
|
main.gracefulShutdown.button.tryAgain = Próbáld újra
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = Questo vault deve migrare ad un nuovo formato.\nAssicu
|
|||||||
main.createVault.nonEmptyDir.title = Creazione del vaul fallita
|
main.createVault.nonEmptyDir.title = Creazione del vaul fallita
|
||||||
main.createVault.nonEmptyDir.header = La directory scelta non è vuota
|
main.createVault.nonEmptyDir.header = La directory scelta non è vuota
|
||||||
main.createVault.nonEmptyDir.content = La directory selezionata contiene già dei file (forse nascosti). Un vault può essere creato solo in una directory vuota.
|
main.createVault.nonEmptyDir.content = La directory selezionata contiene già dei file (forse nascosti). Un vault può essere creato solo in una directory vuota.
|
||||||
unlock.label.mountPath = Monta il percorso
|
|
||||||
unlock.label.mountPathButton = Applica
|
|
||||||
settings.webdav.port.label = WebDAV Port
|
settings.webdav.port.label = WebDAV Port
|
||||||
settings.webdav.port.prompt = 0 \= Scelta automatica
|
settings.webdav.port.prompt = 0 \= Scelta automatica
|
||||||
settings.webdav.port.apply = Applica
|
settings.webdav.port.apply = Applica
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Update check
|
|||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.tryAgain = Try again
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = この金庫を新しいバージョンに移行する
|
|||||||
main.createVault.nonEmptyDir.title = 金庫の作成が失敗しました
|
main.createVault.nonEmptyDir.title = 金庫の作成が失敗しました
|
||||||
main.createVault.nonEmptyDir.header = 空ではないディレクトリが選択されました
|
main.createVault.nonEmptyDir.header = 空ではないディレクトリが選択されました
|
||||||
main.createVault.nonEmptyDir.content = 選択されたディレクトリが既にファイルを含んでいます(隠れている可能性があります)。金庫は空のディレクトのみに作れます。
|
main.createVault.nonEmptyDir.content = 選択されたディレクトリが既にファイルを含んでいます(隠れている可能性があります)。金庫は空のディレクトのみに作れます。
|
||||||
unlock.label.mountPath = マウントパス
|
|
||||||
unlock.label.mountPathButton = 適用
|
|
||||||
settings.webdav.port.label = WebDAV ポート
|
settings.webdav.port.label = WebDAV ポート
|
||||||
settings.webdav.port.prompt = 0 \= 自動的に選択
|
settings.webdav.port.prompt = 0 \= 自動的に選択
|
||||||
settings.webdav.port.apply = 適用
|
settings.webdav.port.apply = 適用
|
||||||
@@ -108,15 +106,20 @@ settings.volume.fuse = FUSE
|
|||||||
unlock.successLabel.vaultCreated = 金庫が正常に作成されました。
|
unlock.successLabel.vaultCreated = 金庫が正常に作成されました。
|
||||||
unlock.successLabel.passwordChanged = パスワードが正常に変更されました。
|
unlock.successLabel.passwordChanged = パスワードが正常に変更されました。
|
||||||
unlock.successLabel.upgraded = Cryptomator が正常にアップグレードされました。
|
unlock.successLabel.upgraded = Cryptomator が正常にアップグレードされました。
|
||||||
unlock.label.useOwnMountPath = Use Custom Mount Point
|
unlock.label.useOwnMountPath = カスタムマウントポイントを使う
|
||||||
welcome.askForUpdateCheck.dialog.title = Update check
|
welcome.askForUpdateCheck.dialog.title = アップデート確認
|
||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = 統合アップデート確認を有効にしますか?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = おすすめ\: アップデート確認を有効にして、常にすべてのセキュリティパッチが適用されたCryptomatorを維持してください。\n設定はいつでも変えられます。
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
main.gracefulShutdown.dialog.title = 金庫のロックに失敗しました。
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.header = 金庫が使用中です。
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.content = 金庫が複数のプログラムによって使用されています。Cryptomatorが正しく終了できるようにプログラムを閉じてから、もう一度やり直してください。\nこれでうまくいかない場合、Cryptomatorを強制的に終了できますが、データの損失が発生しかねないためお勧めできません。
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.button.tryAgain = やり直す
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.forceShutdown = 強制終了
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
unlock.pendingMessage.unlocking = 金庫を施錠中...
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.failedDialog.title = 施錠に失敗しました
|
||||||
|
unlock.failedDialog.header = 施錠に失敗しました
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = マウントポイントが存在しません。
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = 이 보관함은 새로운 버전으로 이전되어
|
|||||||
main.createVault.nonEmptyDir.title = 보관함 생성 실패
|
main.createVault.nonEmptyDir.title = 보관함 생성 실패
|
||||||
main.createVault.nonEmptyDir.header = 선택된 디렉토리가 비어있지 않습니다
|
main.createVault.nonEmptyDir.header = 선택된 디렉토리가 비어있지 않습니다
|
||||||
main.createVault.nonEmptyDir.content = 선택된 디렉토리가 이미 파일을 포함하고 있습니다 (숨겨져 있을 수도 있습니다). 보관함은 비어있는 디렉토리에만 생성할 수 있습니다.
|
main.createVault.nonEmptyDir.content = 선택된 디렉토리가 이미 파일을 포함하고 있습니다 (숨겨져 있을 수도 있습니다). 보관함은 비어있는 디렉토리에만 생성할 수 있습니다.
|
||||||
unlock.label.mountPath = 경로 마운트
|
|
||||||
unlock.label.mountPathButton = 적용
|
|
||||||
settings.webdav.port.label = WebDAV 포트
|
settings.webdav.port.label = WebDAV 포트
|
||||||
settings.webdav.port.prompt = 0 \= 자동으로 선택
|
settings.webdav.port.prompt = 0 \= 자동으로 선택
|
||||||
settings.webdav.port.apply = 적용
|
settings.webdav.port.apply = 적용
|
||||||
@@ -105,18 +103,23 @@ settings.webdav.prefGvfsScheme.label = WebDAV 스킴
|
|||||||
settings.volume.label = 마운트-방법 *
|
settings.volume.label = 마운트-방법 *
|
||||||
settings.volume.webdav = WebDAV
|
settings.volume.webdav = WebDAV
|
||||||
settings.volume.fuse = FUSE
|
settings.volume.fuse = FUSE
|
||||||
unlock.successLabel.vaultCreated = Vault was successfully created.
|
unlock.successLabel.vaultCreated = 보관함이 성공적으로 생성되었습니다.
|
||||||
unlock.successLabel.passwordChanged = Password was successfully changed.
|
unlock.successLabel.passwordChanged = 비밀번호가 성공적으로 변경되었습니다.
|
||||||
unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
|
unlock.successLabel.upgraded = Cryptomator가 성공적으로 업그레이드 되었습니다.
|
||||||
unlock.label.useOwnMountPath = Use Custom Mount Point
|
unlock.label.useOwnMountPath = 커스텀 마운트 지점 사용
|
||||||
welcome.askForUpdateCheck.dialog.title = Update check
|
welcome.askForUpdateCheck.dialog.title = 업데이트 확인
|
||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = 통합 업데이트 확인을 활성화 하겠습니까?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = 추천\: 모든 보안 패치가 적용된 최신 버전의 Cryptomator를 유지하기 위해 업데이트 확인을 활성화 하십시오.\n설정에서 언제든지 바꿀 수 있습니다.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
main.gracefulShutdown.dialog.title = 보관함 잠그기 실패
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.header = 보관함이 사용중입니다.
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.content = 하나 이상의 보관함을 다른 프로그램이 사용하고 있습니다. Cryptomator를 올바르게 종료하려면 프로그램을 먼저 종료하고 다시 시도해 주세요.
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.button.tryAgain = 다시 시도
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.forceShutdown = 강제 종료
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
unlock.pendingMessage.unlocking = 보관함 여는 중
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.failedDialog.title = 잠금 해제 실패
|
||||||
|
unlock.failedDialog.header = 잠금 해제 실패
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = 마운트 지점이 존재하지 않습니다.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = 마운트 지점이 비어있지 않습니다.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -97,8 +97,6 @@ upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPl
|
|||||||
main.createVault.nonEmptyDir.title = Creating vault failed
|
main.createVault.nonEmptyDir.title = Creating vault failed
|
||||||
main.createVault.nonEmptyDir.header = Chosen directory is not empty
|
main.createVault.nonEmptyDir.header = Chosen directory is not empty
|
||||||
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
||||||
unlock.label.mountPath = Mount path
|
|
||||||
unlock.label.mountPathButton = Apply
|
|
||||||
settings.webdav.port.label = WebDAV Port
|
settings.webdav.port.label = WebDAV Port
|
||||||
settings.webdav.port.prompt = 0 \= Choose automatically
|
settings.webdav.port.prompt = 0 \= Choose automatically
|
||||||
settings.webdav.port.apply = Apply
|
settings.webdav.port.apply = Apply
|
||||||
@@ -114,10 +112,15 @@ welcome.askForUpdateCheck.dialog.title = Update check
|
|||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.tryAgain = Try again
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -98,8 +98,6 @@ upgrade.version5toX.msg = Deze kluis moet gemigreerd worden naar een nieuwer for
|
|||||||
main.createVault.nonEmptyDir.title = Kluis aanmaken mislukt
|
main.createVault.nonEmptyDir.title = Kluis aanmaken mislukt
|
||||||
main.createVault.nonEmptyDir.header = De gekozen map is niet leeg
|
main.createVault.nonEmptyDir.header = De gekozen map is niet leeg
|
||||||
main.createVault.nonEmptyDir.content = De geselecteerde map bevat al bestanden (mogelijk verborgen). Een klluis kan alleen worden aangemaakt in een lege map.
|
main.createVault.nonEmptyDir.content = De geselecteerde map bevat al bestanden (mogelijk verborgen). Een klluis kan alleen worden aangemaakt in een lege map.
|
||||||
unlock.label.mountPath = Mount pad
|
|
||||||
unlock.label.mountPathButton = Toepassen
|
|
||||||
settings.webdav.port.label = WebDAV Poort
|
settings.webdav.port.label = WebDAV Poort
|
||||||
settings.webdav.port.prompt = 0 \= Automatisch kiezen
|
settings.webdav.port.prompt = 0 \= Automatisch kiezen
|
||||||
settings.webdav.port.apply = Toepassen
|
settings.webdav.port.apply = Toepassen
|
||||||
@@ -115,10 +113,15 @@ welcome.askForUpdateCheck.dialog.title = Update check
|
|||||||
welcome.askForUpdateCheck.dialog.header = Geintegreerde update check aanzetten
|
welcome.askForUpdateCheck.dialog.header = Geintegreerde update check aanzetten
|
||||||
welcome.askForUpdateCheck.dialog.content = Om te controleren op updates haalt Cryptomator het huidige versienummer van de Cryptomatorservers en toont een hint indien een nieuwere versie beschikbaar is.\n\nWe raden aan om de geintegreerde update check aan te zetten om zeker te weten dat je de nieuwste versie van Cryptomator met alle beveiligings aanpassingen hebt geinstalleerd. Indien je deze niet aanzet kun je zelf de versie controleren en downloaden van https\://cryptomatr.org/downloads/.\n\n\nJe kan dit te allen tijden bij instellingen aanpassen.
|
welcome.askForUpdateCheck.dialog.content = Om te controleren op updates haalt Cryptomator het huidige versienummer van de Cryptomatorservers en toont een hint indien een nieuwere versie beschikbaar is.\n\nWe raden aan om de geintegreerde update check aan te zetten om zeker te weten dat je de nieuwste versie van Cryptomator met alle beveiligings aanpassingen hebt geinstalleerd. Indien je deze niet aanzet kun je zelf de versie controleren en downloaden van https\://cryptomatr.org/downloads/.\n\n\nJe kan dit te allen tijden bij instellingen aanpassen.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Eigen koppel pad is niet ingevuld.
|
|
||||||
main.gracefulShutdown.dialog.title = Vergrendelen kluis/kluizen mislukt
|
main.gracefulShutdown.dialog.title = Vergrendelen kluis/kluizen mislukt
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Probeer opnieuw
|
main.gracefulShutdown.button.tryAgain = Probeer opnieuw
|
||||||
main.gracefulShutdown.button.forceShutdown = Geforceerd afsluiten
|
main.gracefulShutdown.button.forceShutdown = Geforceerd afsluiten
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = Ten portfel wymaga migracji do nowszego formatu.\nZani
|
|||||||
main.createVault.nonEmptyDir.title = Błąd podczas tworzenia portfela
|
main.createVault.nonEmptyDir.title = Błąd podczas tworzenia portfela
|
||||||
main.createVault.nonEmptyDir.header = Wybrany katalog nie jest pusty
|
main.createVault.nonEmptyDir.header = Wybrany katalog nie jest pusty
|
||||||
main.createVault.nonEmptyDir.content = Wybrany katalog zawiera już pliki (prawdopodobnie ukryte). Portfel mozna utworzyć wyłącznie w pustym katalogu.
|
main.createVault.nonEmptyDir.content = Wybrany katalog zawiera już pliki (prawdopodobnie ukryte). Portfel mozna utworzyć wyłącznie w pustym katalogu.
|
||||||
unlock.label.mountPath = Zamontuj ścieżkę
|
|
||||||
unlock.label.mountPathButton = Zastosuj
|
|
||||||
settings.webdav.port.label = Port WebDAV
|
settings.webdav.port.label = Port WebDAV
|
||||||
settings.webdav.port.prompt = 0 \= Wybierz automatycznie
|
settings.webdav.port.prompt = 0 \= Wybierz automatycznie
|
||||||
settings.webdav.port.apply = Zastosuj
|
settings.webdav.port.apply = Zastosuj
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Sprawdź aktualizację
|
|||||||
welcome.askForUpdateCheck.dialog.header = Włącz zintegrowane sprawdzenie aktualizacji?
|
welcome.askForUpdateCheck.dialog.header = Włącz zintegrowane sprawdzenie aktualizacji?
|
||||||
welcome.askForUpdateCheck.dialog.content = Aby sprawdzić dostępność aktualizacji, Cryptomator pobierze bieżącą wersję z serwerów Cryptomator i wyświetli podpowiedź, jeśli dostępna będzie nowsza wersja.\n\nZalecamy włączenie sprawdzania aktualizacji, aby zawsze mieć pewność, że zainstalowana jest najnowsza wersja Cryptomatora ze wszystkimi poprawkami zabezpieczeń. Jeśli nie włączysz sprawdzania aktualizacji, możesz sprawdzić i pobrać aktualną wersję z https\://cryptomator.org/downloads/.\n\nMożesz to zmienić w dowolnym momencie, korzystając z ustawień.
|
welcome.askForUpdateCheck.dialog.content = Aby sprawdzić dostępność aktualizacji, Cryptomator pobierze bieżącą wersję z serwerów Cryptomator i wyświetli podpowiedź, jeśli dostępna będzie nowsza wersja.\n\nZalecamy włączenie sprawdzania aktualizacji, aby zawsze mieć pewność, że zainstalowana jest najnowsza wersja Cryptomatora ze wszystkimi poprawkami zabezpieczeń. Jeśli nie włączysz sprawdzania aktualizacji, możesz sprawdzić i pobrać aktualną wersję z https\://cryptomator.org/downloads/.\n\nMożesz to zmienić w dowolnym momencie, korzystając z ustawień.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Indywidualna ścieżka montażu nie jest ustawiona.
|
|
||||||
main.gracefulShutdown.dialog.title = Nie udało się zablokować porfela(i)
|
main.gracefulShutdown.dialog.title = Nie udało się zablokować porfela(i)
|
||||||
main.gracefulShutdown.dialog.header = Portfel(e) w użyciu
|
main.gracefulShutdown.dialog.header = Portfel(e) w użyciu
|
||||||
main.gracefulShutdown.dialog.content = Jedna lub więcej porfelii jest nadal używana przez inne programy. Zamknij je, aby umożliwić prawidłowe zamknięcie Cryptomator, a następnie spróbuj ponownie.\n\nJeśli to nie zadziała, Cryptomator może zamknąć na siłę, ale może to spowodować utratę danych i nie jest zalecane.
|
main.gracefulShutdown.dialog.content = Jedna lub więcej porfelii jest nadal używana przez inne programy. Zamknij je, aby umożliwić prawidłowe zamknięcie Cryptomator, a następnie spróbuj ponownie.\n\nJeśli to nie zadziała, Cryptomator może zamknąć na siłę, ale może to spowodować utratę danych i nie jest zalecane.
|
||||||
main.gracefulShutdown.button.tryAgain = Spróbuj ponownie
|
main.gracefulShutdown.button.tryAgain = Spróbuj ponownie
|
||||||
main.gracefulShutdown.button.forceShutdown = Wymuś zamknięcie
|
main.gracefulShutdown.button.forceShutdown = Wymuś zamknięcie
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = Este cofre precisa ser migrado a um novo formato. Por
|
|||||||
main.createVault.nonEmptyDir.title = Falha ao criar o cofre
|
main.createVault.nonEmptyDir.title = Falha ao criar o cofre
|
||||||
main.createVault.nonEmptyDir.header = O diretório escolhido não se encontra vazio
|
main.createVault.nonEmptyDir.header = O diretório escolhido não se encontra vazio
|
||||||
main.createVault.nonEmptyDir.content = O diretório selecionado contém arquivos (possivelmente ocultos). Um cofre só pode ser criado num diretório vazio.
|
main.createVault.nonEmptyDir.content = O diretório selecionado contém arquivos (possivelmente ocultos). Um cofre só pode ser criado num diretório vazio.
|
||||||
unlock.label.mountPath = Local da montagem
|
|
||||||
unlock.label.mountPathButton = Aplicar
|
|
||||||
settings.webdav.port.label = WebDAV Porta
|
settings.webdav.port.label = WebDAV Porta
|
||||||
settings.webdav.port.prompt = 0 \= Escolha Automática
|
settings.webdav.port.prompt = 0 \= Escolha Automática
|
||||||
settings.webdav.port.apply = Aplicar
|
settings.webdav.port.apply = Aplicar
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Verificação de atualização
|
|||||||
welcome.askForUpdateCheck.dialog.header = Habilitar a verificação de atualização integrada?
|
welcome.askForUpdateCheck.dialog.header = Habilitar a verificação de atualização integrada?
|
||||||
welcome.askForUpdateCheck.dialog.content = Para verificar atualizações, Cryptomator vai buscar a versão atual dos servidores e exibirá uma dica para você se uma nova versão estiver disponível.\n\nNós recomendamos que habilite a verificação de atualização para que sempre tenha certeza de que está usando a última versão do Crytomator, com todos os pacotes de segurança instalados. Se você não habilitar a verificação de atualização, você pode verificar e baixar a versão atual em https\://cryptomator.org/downloads/.\n\nVocê pode mudar isso a qualquer momento através das configurações.
|
welcome.askForUpdateCheck.dialog.content = Para verificar atualizações, Cryptomator vai buscar a versão atual dos servidores e exibirá uma dica para você se uma nova versão estiver disponível.\n\nNós recomendamos que habilite a verificação de atualização para que sempre tenha certeza de que está usando a última versão do Crytomator, com todos os pacotes de segurança instalados. Se você não habilitar a verificação de atualização, você pode verificar e baixar a versão atual em https\://cryptomator.org/downloads/.\n\nVocê pode mudar isso a qualquer momento através das configurações.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Caminho individual de montagem não está definido.
|
|
||||||
main.gracefulShutdown.dialog.title = Falha no bloqueio do(s) cofre(s)
|
main.gracefulShutdown.dialog.title = Falha no bloqueio do(s) cofre(s)
|
||||||
main.gracefulShutdown.dialog.header = Cofre(s) em uso
|
main.gracefulShutdown.dialog.header = Cofre(s) em uso
|
||||||
main.gracefulShutdown.dialog.content = Um ou mais cofres ainda estão em uso por outros programas. Por favor, feche-os para permitir que Cryptomator encerre corretamente, em seguida, tente novamente.\n\nSe isso não funcionar, Cryptomator pode forçar o desligamento, mas isso pode causar perda de dados e não é recomendado.
|
main.gracefulShutdown.dialog.content = Um ou mais cofres ainda estão em uso por outros programas. Por favor, feche-os para permitir que Cryptomator encerre corretamente, em seguida, tente novamente.\n\nSe isso não funcionar, Cryptomator pode forçar o desligamento, mas isso pode causar perda de dados e não é recomendado.
|
||||||
main.gracefulShutdown.button.tryAgain = Tente novamente
|
main.gracefulShutdown.button.tryAgain = Tente novamente
|
||||||
main.gracefulShutdown.button.forceShutdown = Forçar desligamento
|
main.gracefulShutdown.button.forceShutdown = Forçar desligamento
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = Esse Cofre precisa ser migrado para o novo formato.\nP
|
|||||||
main.createVault.nonEmptyDir.title = Criação do cofre falhou
|
main.createVault.nonEmptyDir.title = Criação do cofre falhou
|
||||||
main.createVault.nonEmptyDir.header = O diretório escolhido não está vazio
|
main.createVault.nonEmptyDir.header = O diretório escolhido não está vazio
|
||||||
main.createVault.nonEmptyDir.content = O diretório selecionado já contém arquivos (possivelmente ocultos). Um cofre só pode ser criado em um diretório vazio.
|
main.createVault.nonEmptyDir.content = O diretório selecionado já contém arquivos (possivelmente ocultos). Um cofre só pode ser criado em um diretório vazio.
|
||||||
unlock.label.mountPath = Caminho da Montagem
|
|
||||||
unlock.label.mountPathButton = Aplicar
|
|
||||||
settings.webdav.port.label = WebDAV Porta
|
settings.webdav.port.label = WebDAV Porta
|
||||||
settings.webdav.port.prompt = 0 \= Escolher automaticamente
|
settings.webdav.port.prompt = 0 \= Escolher automaticamente
|
||||||
settings.webdav.port.apply = Aplicar
|
settings.webdav.port.apply = Aplicar
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Checar atualizações
|
|||||||
welcome.askForUpdateCheck.dialog.header = Ativar a checagem por atualizações?
|
welcome.askForUpdateCheck.dialog.header = Ativar a checagem por atualizações?
|
||||||
welcome.askForUpdateCheck.dialog.content = Para checar as atualizações, Cryptomator irá verificar a versão mais recente em nossos servidores e avisará se existe uma versão disponível.\n\nRecomendamos ativar a checagem por novas atualizações para ter certeza que se tenha a versão mais recente do Cryptomator, com todas as correções de segurança. Se não ativar as atualizações é possivel checar e baixa-las a versão mais recente em https\://cryptomator.org/downloads/.\n\nVocê pode alterar as configurações a qualquer hora.
|
welcome.askForUpdateCheck.dialog.content = Para checar as atualizações, Cryptomator irá verificar a versão mais recente em nossos servidores e avisará se existe uma versão disponível.\n\nRecomendamos ativar a checagem por novas atualizações para ter certeza que se tenha a versão mais recente do Cryptomator, com todas as correções de segurança. Se não ativar as atualizações é possivel checar e baixa-las a versão mais recente em https\://cryptomator.org/downloads/.\n\nVocê pode alterar as configurações a qualquer hora.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Caminho para montagem individual não configurado.
|
|
||||||
main.gracefulShutdown.dialog.title = Falha ao trancar o cofre
|
main.gracefulShutdown.dialog.title = Falha ao trancar o cofre
|
||||||
main.gracefulShutdown.dialog.header = Cofre(s) em uso
|
main.gracefulShutdown.dialog.header = Cofre(s) em uso
|
||||||
main.gracefulShutdown.dialog.content = Um ou mais cofres ainda estão em uso por outros programas. Por favor feche-os para permitir ao Cryptomator encerrar apropriadamente, então tente novamente.
|
main.gracefulShutdown.dialog.content = Um ou mais cofres ainda estão em uso por outros programas. Por favor feche-os para permitir ao Cryptomator encerrar apropriadamente, então tente novamente.
|
||||||
main.gracefulShutdown.button.tryAgain = Tente novamente
|
main.gracefulShutdown.button.tryAgain = Tente novamente
|
||||||
main.gracefulShutdown.button.forceShutdown = Forçar término da execução
|
main.gracefulShutdown.button.forceShutdown = Forçar término da execução
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Destravando Cofre...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -103,8 +103,6 @@ main.createVault.nonEmptyDir.title = Ошибка создания хранил
|
|||||||
main.createVault.nonEmptyDir.header = Выбранная папка не пуста
|
main.createVault.nonEmptyDir.header = Выбранная папка не пуста
|
||||||
# Выбранная папка уже содержит файлы (возможно скрытые). Хранилище может быть создано только в пустой папке.
|
# Выбранная папка уже содержит файлы (возможно скрытые). Хранилище может быть создано только в пустой папке.
|
||||||
main.createVault.nonEmptyDir.content = В выбранной папке уже есть файлы (возможно, скрытые). Хранилище можно создавать только в пустой папке.
|
main.createVault.nonEmptyDir.content = В выбранной папке уже есть файлы (возможно, скрытые). Хранилище можно создавать только в пустой папке.
|
||||||
unlock.label.mountPath = Путь монтирования
|
|
||||||
unlock.label.mountPathButton = Применить
|
|
||||||
settings.webdav.port.label = Порт WebDAV
|
settings.webdav.port.label = Порт WebDAV
|
||||||
settings.webdav.port.prompt = 0 \= автовыбор
|
settings.webdav.port.prompt = 0 \= автовыбор
|
||||||
settings.webdav.port.apply = Применить
|
settings.webdav.port.apply = Применить
|
||||||
@@ -120,10 +118,15 @@ welcome.askForUpdateCheck.dialog.title = Проверка обновлений
|
|||||||
welcome.askForUpdateCheck.dialog.header = Включить встроенную проверку обновлений?
|
welcome.askForUpdateCheck.dialog.header = Включить встроенную проверку обновлений?
|
||||||
welcome.askForUpdateCheck.dialog.content = Для проверки наличия обновлений Cryptomator будет получать номер текущей версии со своих серверов и показывать подсказку, что доступна более новая версия.\n\nРекомендуем включить проверку обновлений, чтобы быть уверенным, что у вас всегда новейшая версия программы, содержащая все патчи безопасности. Если вы не хотите включать проверку обновлений, то проверить наличие новой версии и загрузить её можно по адресу https\://cryptomator.org/downloads/\n\nЭтот параметр можно всегда изменить в настройках программы.
|
welcome.askForUpdateCheck.dialog.content = Для проверки наличия обновлений Cryptomator будет получать номер текущей версии со своих серверов и показывать подсказку, что доступна более новая версия.\n\nРекомендуем включить проверку обновлений, чтобы быть уверенным, что у вас всегда новейшая версия программы, содержащая все патчи безопасности. Если вы не хотите включать проверку обновлений, то проверить наличие новой версии и загрузить её можно по адресу https\://cryptomator.org/downloads/\n\nЭтот параметр можно всегда изменить в настройках программы.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Не установлен индивидуальный путь монтирования.
|
|
||||||
main.gracefulShutdown.dialog.title = Ошибка блокировки хранилища
|
main.gracefulShutdown.dialog.title = Ошибка блокировки хранилища
|
||||||
main.gracefulShutdown.dialog.header = Используемые хранилища
|
main.gracefulShutdown.dialog.header = Используемые хранилища
|
||||||
main.gracefulShutdown.dialog.content = Одно или несколько хранилищ всё ещё используются другими программами. Закройте их, чтобы Cryptomator мог корректно завершить работу, и повторите попытку.\n\nЕсли это не поможет, Cryptomator может завершить работу принудительно, но с риском потери данных, и потому это не рекомендуется.
|
main.gracefulShutdown.dialog.content = Одно или несколько хранилищ всё ещё используются другими программами. Закройте их, чтобы Cryptomator мог корректно завершить работу, и повторите попытку.\n\nЕсли это не поможет, Cryptomator может завершить работу принудительно, но с риском потери данных, и потому это не рекомендуется.
|
||||||
main.gracefulShutdown.button.tryAgain = Попробовать снова
|
main.gracefulShutdown.button.tryAgain = Попробовать снова
|
||||||
main.gracefulShutdown.button.forceShutdown = Принудительно завершить работу
|
main.gracefulShutdown.button.forceShutdown = Принудительно завершить работу
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Открываем хранилеще
|
||||||
|
unlock.failedDialog.title = Разблокировка не удалась
|
||||||
|
unlock.failedDialog.header = Разблокировка не удалась\n
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Точка монтирования не существует
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Точка монтирования не пуста
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -99,8 +99,6 @@ upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPl
|
|||||||
main.createVault.nonEmptyDir.title = Creating vault failed
|
main.createVault.nonEmptyDir.title = Creating vault failed
|
||||||
main.createVault.nonEmptyDir.header = Chosen directory is not empty
|
main.createVault.nonEmptyDir.header = Chosen directory is not empty
|
||||||
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
||||||
unlock.label.mountPath = Mount path
|
|
||||||
unlock.label.mountPathButton = Apply
|
|
||||||
settings.webdav.port.label = WebDAV Port
|
settings.webdav.port.label = WebDAV Port
|
||||||
settings.webdav.port.prompt = 0 \= Choose automatically
|
settings.webdav.port.prompt = 0 \= Choose automatically
|
||||||
settings.webdav.port.apply = Apply
|
settings.webdav.port.apply = Apply
|
||||||
@@ -116,10 +114,15 @@ welcome.askForUpdateCheck.dialog.title = Update check
|
|||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.tryAgain = Try again
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = กล่องข้อมูลต้องการ
|
|||||||
main.createVault.nonEmptyDir.title = การสร้างกล่องข้อมูลล้มเหลว
|
main.createVault.nonEmptyDir.title = การสร้างกล่องข้อมูลล้มเหลว
|
||||||
main.createVault.nonEmptyDir.header = โฟลเดอร์ที่เลือกมีไฟล์อยู่
|
main.createVault.nonEmptyDir.header = โฟลเดอร์ที่เลือกมีไฟล์อยู่
|
||||||
main.createVault.nonEmptyDir.content = โฟลเดอที่เลือกมีไฟล์อยู่ (อาจจะซ่อนอยู่)\nกล่องข้อมูลสามารถสร้างได้จากโฟลเดอร์เปล่าเท่านั้น
|
main.createVault.nonEmptyDir.content = โฟลเดอที่เลือกมีไฟล์อยู่ (อาจจะซ่อนอยู่)\nกล่องข้อมูลสามารถสร้างได้จากโฟลเดอร์เปล่าเท่านั้น
|
||||||
unlock.label.mountPath = Mount path
|
|
||||||
unlock.label.mountPathButton = Apply
|
|
||||||
settings.webdav.port.label = WebDAV Port
|
settings.webdav.port.label = WebDAV Port
|
||||||
settings.webdav.port.prompt = 0 \= Choose automatically
|
settings.webdav.port.prompt = 0 \= Choose automatically
|
||||||
settings.webdav.port.apply = Apply
|
settings.webdav.port.apply = Apply
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Update check
|
|||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.tryAgain = Try again
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPl
|
|||||||
main.createVault.nonEmptyDir.title = Creating vault failed
|
main.createVault.nonEmptyDir.title = Creating vault failed
|
||||||
main.createVault.nonEmptyDir.header = Chosen directory is not empty
|
main.createVault.nonEmptyDir.header = Chosen directory is not empty
|
||||||
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
||||||
unlock.label.mountPath = Mount path
|
|
||||||
unlock.label.mountPathButton = Apply
|
|
||||||
settings.webdav.port.label = WebDAV Port
|
settings.webdav.port.label = WebDAV Port
|
||||||
settings.webdav.port.prompt = 0 \= Choose automatically
|
settings.webdav.port.prompt = 0 \= Choose automatically
|
||||||
settings.webdav.port.apply = Apply
|
settings.webdav.port.apply = Apply
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Update check
|
|||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.tryAgain = Try again
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = Це сховище потрібно перконве
|
|||||||
main.createVault.nonEmptyDir.title = Створення сховища не вдалося
|
main.createVault.nonEmptyDir.title = Створення сховища не вдалося
|
||||||
main.createVault.nonEmptyDir.header = Вибраний каталог не порожній
|
main.createVault.nonEmptyDir.header = Вибраний каталог не порожній
|
||||||
main.createVault.nonEmptyDir.content = Вибрана директорія вже містить файли (можливо, приховані). Сховище можна створити лише у порожньому каталозі.
|
main.createVault.nonEmptyDir.content = Вибрана директорія вже містить файли (можливо, приховані). Сховище можна створити лише у порожньому каталозі.
|
||||||
unlock.label.mountPath = Шлях монтування
|
|
||||||
unlock.label.mountPathButton = Застосувати
|
|
||||||
settings.webdav.port.label = Порт WebDAV
|
settings.webdav.port.label = Порт WebDAV
|
||||||
settings.webdav.port.prompt = 0 \= автовибір
|
settings.webdav.port.prompt = 0 \= автовибір
|
||||||
settings.webdav.port.apply = Застосувати
|
settings.webdav.port.apply = Застосувати
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Перевірити оновлення
|
|||||||
welcome.askForUpdateCheck.dialog.header = Включити інтегровану перевірку оновлень?
|
welcome.askForUpdateCheck.dialog.header = Включити інтегровану перевірку оновлень?
|
||||||
welcome.askForUpdateCheck.dialog.content = Щоб перевірити наявність оновлень, Cryptomator буде завантажувати поточну версію з серверів Cryptomator і показувати підказку, якщо доступна нова версія.\nМи рекомендуємо ввімкнути перевірку оновлень, щоб завжди бути впевненим, що ви встановили найновішу версію Cryptomator з усіма оновленнями безпеки. Якщо ви не ввімкнули перевірку оновлень, ви можете перевірити та завантажити поточну версію за адресою https\://cryptomator.org/downloads/.\nВи можете будь-коли змінити це налаштування.
|
welcome.askForUpdateCheck.dialog.content = Щоб перевірити наявність оновлень, Cryptomator буде завантажувати поточну версію з серверів Cryptomator і показувати підказку, якщо доступна нова версія.\nМи рекомендуємо ввімкнути перевірку оновлень, щоб завжди бути впевненим, що ви встановили найновішу версію Cryptomator з усіма оновленнями безпеки. Якщо ви не ввімкнули перевірку оновлень, ви можете перевірити та завантажити поточну версію за адресою https\://cryptomator.org/downloads/.\nВи можете будь-коли змінити це налаштування.
|
||||||
settings.volume.dokany = Віртуальна файлова система
|
settings.volume.dokany = Віртуальна файлова система
|
||||||
unlock.errorMessage.invalidMountPath = Користувацьку опцію монтування не встановлено.
|
|
||||||
main.gracefulShutdown.dialog.title = Блокування сховищ(а) не вдалося
|
main.gracefulShutdown.dialog.title = Блокування сховищ(а) не вдалося
|
||||||
main.gracefulShutdown.dialog.header = Сховища(е) використовуються
|
main.gracefulShutdown.dialog.header = Сховища(е) використовуються
|
||||||
main.gracefulShutdown.dialog.content = Один або декілька сховищ все ще використовуються іншими програмами. Закрийте їх, щоб дозволити Cryptomator безпечно завершити роботу, а потім повторіть спробу.\nЯкщо це не спрацьовує, Cryptomator може примусово завершити роботу, але це може призвести до втрати даних, це нелогічно та не рекомендується.
|
main.gracefulShutdown.dialog.content = Один або декілька сховищ все ще використовуються іншими програмами. Закрийте їх, щоб дозволити Cryptomator безпечно завершити роботу, а потім повторіть спробу.\nЯкщо це не спрацьовує, Cryptomator може примусово завершити роботу, але це може призвести до втрати даних, це нелогічно та не рекомендується.
|
||||||
main.gracefulShutdown.button.tryAgain = Спробуйте ще раз
|
main.gracefulShutdown.button.tryAgain = Спробуйте ще раз
|
||||||
main.gracefulShutdown.button.forceShutdown = Примусово завершити роботу
|
main.gracefulShutdown.button.forceShutdown = Примусово завершити роботу
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -97,8 +97,6 @@ upgrade.version5toX.msg = 此资料库需要升级至最新版本,\n请确保
|
|||||||
main.createVault.nonEmptyDir.title = 创建资料库失败
|
main.createVault.nonEmptyDir.title = 创建资料库失败
|
||||||
main.createVault.nonEmptyDir.header = 选择的目录不为空
|
main.createVault.nonEmptyDir.header = 选择的目录不为空
|
||||||
main.createVault.nonEmptyDir.content = 选择的目录含有文件(可能是隐藏的)。资料库只能创建在空目录
|
main.createVault.nonEmptyDir.content = 选择的目录含有文件(可能是隐藏的)。资料库只能创建在空目录
|
||||||
unlock.label.mountPath = 挂载路径
|
|
||||||
unlock.label.mountPathButton = 设定
|
|
||||||
settings.webdav.port.label = webDav端口
|
settings.webdav.port.label = webDav端口
|
||||||
settings.webdav.port.prompt = 0\=自动选择WebDav端口
|
settings.webdav.port.prompt = 0\=自动选择WebDav端口
|
||||||
settings.webdav.port.apply = 设定
|
settings.webdav.port.apply = 设定
|
||||||
@@ -114,10 +112,15 @@ welcome.askForUpdateCheck.dialog.title = 检查更新
|
|||||||
welcome.askForUpdateCheck.dialog.header = 启用更新检查?
|
welcome.askForUpdateCheck.dialog.header = 启用更新检查?
|
||||||
welcome.askForUpdateCheck.dialog.content = 启用检查更新,Cryptomator将从Cryptomator服务器获取当前版本,并在有新版本时提示。\n我们建议您启用更新检查,以确保安装了最新版的Cryptomator,并安装了所有安全补丁。如果您未启用更新检查,则需要您自己到https\://cryptomator.org/downloads/ 检查并下载最新版本。\n你可以随时在设置中更改此设置。
|
welcome.askForUpdateCheck.dialog.content = 启用检查更新,Cryptomator将从Cryptomator服务器获取当前版本,并在有新版本时提示。\n我们建议您启用更新检查,以确保安装了最新版的Cryptomator,并安装了所有安全补丁。如果您未启用更新检查,则需要您自己到https\://cryptomator.org/downloads/ 检查并下载最新版本。\n你可以随时在设置中更改此设置。
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = 未设置单独的挂载路径
|
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.tryAgain = Try again
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPl
|
|||||||
main.createVault.nonEmptyDir.title = Creating vault failed
|
main.createVault.nonEmptyDir.title = Creating vault failed
|
||||||
main.createVault.nonEmptyDir.header = Chosen directory is not empty
|
main.createVault.nonEmptyDir.header = Chosen directory is not empty
|
||||||
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
||||||
unlock.label.mountPath = Mount path
|
|
||||||
unlock.label.mountPathButton = Apply
|
|
||||||
settings.webdav.port.label = WebDAV Port
|
settings.webdav.port.label = WebDAV Port
|
||||||
settings.webdav.port.prompt = 0 \= Choose automatically
|
settings.webdav.port.prompt = 0 \= Choose automatically
|
||||||
settings.webdav.port.apply = Apply
|
settings.webdav.port.apply = Apply
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Update check
|
|||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.tryAgain = Try again
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -96,8 +96,6 @@ upgrade.version5toX.msg = 這個檔案庫需要轉移到新的格式。\n進行
|
|||||||
main.createVault.nonEmptyDir.title = 建立vault時發生錯誤
|
main.createVault.nonEmptyDir.title = 建立vault時發生錯誤
|
||||||
main.createVault.nonEmptyDir.header = 選擇的資料夾並不是空的
|
main.createVault.nonEmptyDir.header = 選擇的資料夾並不是空的
|
||||||
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
|
||||||
unlock.label.mountPath = 掛載路徑
|
|
||||||
unlock.label.mountPathButton = 套用
|
|
||||||
settings.webdav.port.label = WebDAV Port
|
settings.webdav.port.label = WebDAV Port
|
||||||
settings.webdav.port.prompt = 0 \= 自動選擇
|
settings.webdav.port.prompt = 0 \= 自動選擇
|
||||||
settings.webdav.port.apply = 套用
|
settings.webdav.port.apply = 套用
|
||||||
@@ -113,10 +111,15 @@ welcome.askForUpdateCheck.dialog.title = Update check
|
|||||||
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
|
||||||
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
|
||||||
settings.volume.dokany = Dokany
|
settings.volume.dokany = Dokany
|
||||||
unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
|
|
||||||
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
main.gracefulShutdown.dialog.title = Locking vault(s) failed
|
||||||
main.gracefulShutdown.dialog.header = Vault(s) in use
|
main.gracefulShutdown.dialog.header = Vault(s) in use
|
||||||
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
|
||||||
main.gracefulShutdown.button.tryAgain = Try again
|
main.gracefulShutdown.button.tryAgain = Try again
|
||||||
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
main.gracefulShutdown.button.forceShutdown = Force shutdown
|
||||||
unlock.pendingMessage.unlocking = Unlocking vault...
|
unlock.pendingMessage.unlocking = Unlocking vault...
|
||||||
|
unlock.failedDialog.title = Unlock failed
|
||||||
|
unlock.failedDialog.header = Unlock failed
|
||||||
|
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
|
||||||
|
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
|
||||||
|
unlock.label.useReadOnlyMode = Read-Only
|
||||||
|
unlock.label.chooseMountPath = Choose empty directory…
|
||||||
@@ -31,7 +31,7 @@ public class LocalizationTest {
|
|||||||
private static final Logger LOG = LoggerFactory.getLogger(LocalizationTest.class);
|
private static final Logger LOG = LoggerFactory.getLogger(LocalizationTest.class);
|
||||||
private static final String RESOURCE_FOLDER_PATH = "/localization/";
|
private static final String RESOURCE_FOLDER_PATH = "/localization/";
|
||||||
private static final String REF_FILE_NAME = "en.txt";
|
private static final String REF_FILE_NAME = "en.txt";
|
||||||
private static final String[] LANG_FILE_NAMES = {"ar.txt", "bg.txt", "cs.txt", "da.txt", "de.txt", "es.txt", "fr.txt", "hu.txt", "it.txt", "ja.txt", //
|
private static final String[] LANG_FILE_NAMES = {"ar.txt", "bg.txt", "ca.txt", "cs.txt", "da.txt", "de.txt", "es.txt", "fr.txt", "hu.txt", "it.txt", "ja.txt", //
|
||||||
"ko.txt", "lv.txt", "nl.txt", "pl.txt", "pt.txt", "pt_BR.txt", "ru.txt", "sk.txt", "th.txt", "tr.txt", "uk.txt", "zh_HK.txt", "zh_TW.txt", "zh.txt"};
|
"ko.txt", "lv.txt", "nl.txt", "pl.txt", "pt.txt", "pt_BR.txt", "ru.txt", "sk.txt", "th.txt", "tr.txt", "uk.txt", "zh_HK.txt", "zh_TW.txt", "zh.txt"};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user