diff --git a/.gitignore b/.gitignore
index 7051b0cd0..52f9a6ccd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,15 +9,13 @@
.settings
.project
.classpath
+
+# Maven #
target/
-test-output/
-# IntelliJ Settings Files #
-.idea/
-out/
-.idea_modules/
-*.iws
-*.iml
-
-# Temporary file created by test launcher
-main/launcher/.ipcPort.tmp
+# IntelliJ Settings Files (https://intellij-support.jetbrains.com/hc/en-us/articles/206544839-How-to-manage-projects-under-Version-Control-Systems) #
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/dictionaries
+.idea/**/libraries/
+*.iml
\ No newline at end of file
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 000000000..f9944b4aa
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+Cryptomator
\ No newline at end of file
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 000000000..d6cb2c866
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 000000000..79ee123c2
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 000000000..eb6e630bd
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 000000000..74a53dde5
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 000000000..146ab09b7
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 000000000..fd8e48573
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 000000000..94a25f7f4
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index b7789ec3d..00a1351d5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,13 +1,13 @@
language: java
sudo: false
jdk:
-- oraclejdk10
+- oraclejdk9
cache:
directories:
- $HOME/.m2
env:
global:
- - secure: "lV9OwUbHMrMpLUH1CY+Z4puLDdFXytudyPlG1eGRsesdpuG6KM3uQVz6uAtf6lrU8DRbMM/T7ML+PmvQ4UoPPYLdLxESLLBat2qUPOIVBOhTSlCc7I0DmGy04CSvkeMy8dPaQC0ukgNiR7zwoNzfcpGRN/U9S8tziDruuHoZSrg=" # BINTRAY_API_KEY
+ - secure: "HftEaabMmWn5GwKFKksUkOcelc3Mn7xazwAEy+4d4gL1+F8VhID/6DCK7nas+afUymWnxTano8Rv4Ci5MWryNkNkTH+FUPWmF3xWezc3hajSyS7RB92IZ8VPetl4Fo8UI1WwM5apDEaugalPxkIf8a7N+lpG5X/Gpumwzo3Be3w=" # BINTRAY_API_KEY
- secure: "oWFgRTVP6lyTa7qVxlvkpm20MtVc3BtmsNXQJS6bfg2A0o/iCQMNx7OD59BaafCLGRKvCcJVESiC8FlSylVMS7CDSyYu0gg70NUiIuHp4NBM5inFWYCy/PdQsCTzr5uvNG+rMFQpMFRaCV0FrfM3tLondcVkhsHL68l93Xoexx4=" # CODACY_PROJECT_TOKEN
- secure: "zJxgytA2Ks5Xzv+7kUaUq+EBFNQw9Qec63lcMJVuXVWczjL16nKW1EzzV515ag+OWL46z3lEPForDhufw0VtFnNmaX68jkO0mp01eLrHApc1llN2Y/U8GBXfNNazN4+Kom4H+z/AO+wJr8EsKMMUczCdQ3APgd9uVI0hzXw/Z3M=" # GITHUB_API_KEY
addons:
diff --git a/main/ant-kit/.gitignore b/main/ant-kit/.gitignore
deleted file mode 100644
index b83d22266..000000000
--- a/main/ant-kit/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/main/ant-kit/pom.xml b/main/ant-kit/pom.xml
index acd09e3f5..090e5142c 100644
--- a/main/ant-kit/pom.xml
+++ b/main/ant-kit/pom.xml
@@ -4,7 +4,7 @@
org.cryptomatormain
- 1.4.0-SNAPSHOT
+ 1.5.0-SNAPSHOTant-kitpom
diff --git a/main/commons/pom.xml b/main/commons/pom.xml
index 80d96e00c..723568fa6 100644
--- a/main/commons/pom.xml
+++ b/main/commons/pom.xml
@@ -4,7 +4,7 @@
org.cryptomatormain
- 1.4.0-SNAPSHOT
+ 1.5.0-SNAPSHOTcommonsCryptomator Commons
diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java
index 087c9b200..5c13b66bc 100644
--- a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java
+++ b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java
@@ -5,16 +5,6 @@
*******************************************************************************/
package org.cryptomator.common.settings;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Path;
-import java.util.Base64;
-import java.util.Objects;
-import java.util.UUID;
-
-import org.apache.commons.lang3.StringUtils;
-import org.fxmisc.easybind.EasyBind;
-
import javafx.beans.Observable;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty;
@@ -22,7 +12,20 @@ import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
+import org.apache.commons.lang3.StringUtils;
+import org.fxmisc.easybind.EasyBind;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.util.Base64;
+import java.util.Objects;
+import java.util.UUID;
+
+/**
+ * The settings specific to a single vault.
+ * TODO: Change the name of individualMountPath and its derivatives to customMountPath
+ */
public class VaultSettings {
public static final boolean DEFAULT_UNLOCK_AFTER_STARTUP = false;
diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java
index 96d983d9b..996c9a358 100644
--- a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java
+++ b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java
@@ -5,14 +5,13 @@
*******************************************************************************/
package org.cryptomator.common.settings;
-import java.io.IOException;
-import java.nio.file.Paths;
-
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.gson.stream.JsonReader;
-import com.google.gson.stream.JsonWriter;
+import java.io.IOException;
+import java.nio.file.Paths;
class VaultSettingsJsonAdapter {
@@ -27,8 +26,7 @@ class VaultSettingsJsonAdapter {
out.name("unlockAfterStartup").value(value.unlockAfterStartup().get());
out.name("revealAfterMount").value(value.revealAfterMount().get());
out.name("usesIndividualMountPath").value(value.usesIndividualMountPath().get());
- //TODO: should this always be written? ( because it could contain metadata, which the user does not want to save!)
- out.name("individualMountPath").value(value.individualMountPath().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("usesReadOnlyMode").value(value.usesReadOnlyMode().get());
out.endObject();
}
diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/VolumeImpl.java b/main/commons/src/main/java/org/cryptomator/common/settings/VolumeImpl.java
index 634f528f4..e475ff0d9 100644
--- a/main/commons/src/main/java/org/cryptomator/common/settings/VolumeImpl.java
+++ b/main/commons/src/main/java/org/cryptomator/common/settings/VolumeImpl.java
@@ -5,7 +5,7 @@ import java.util.Arrays;
public enum VolumeImpl {
WEBDAV("WebDAV"),
FUSE("FUSE"),
- DOKANY("DOKANY");
+ DOKANY("Dokany");
private String displayName;
diff --git a/main/keychain/pom.xml b/main/keychain/pom.xml
index 1d2ae0e0a..8ae41d506 100644
--- a/main/keychain/pom.xml
+++ b/main/keychain/pom.xml
@@ -4,7 +4,7 @@
org.cryptomatormain
- 1.4.0-SNAPSHOT
+ 1.5.0-SNAPSHOTkeychainSystem Keychain Access
diff --git a/main/launcher/pom.xml b/main/launcher/pom.xml
index bb55d145b..aef980622 100644
--- a/main/launcher/pom.xml
+++ b/main/launcher/pom.xml
@@ -4,7 +4,7 @@
org.cryptomatormain
- 1.4.0-SNAPSHOT
+ 1.5.0-SNAPSHOTlauncherCryptomator Launcher
diff --git a/main/launcher/src/main/java/org/cryptomator/launcher/MainApplication.java b/main/launcher/src/main/java/org/cryptomator/launcher/MainApplication.java
index 8ee283c36..c62f624c4 100644
--- a/main/launcher/src/main/java/org/cryptomator/launcher/MainApplication.java
+++ b/main/launcher/src/main/java/org/cryptomator/launcher/MainApplication.java
@@ -5,15 +5,12 @@
*******************************************************************************/
package org.cryptomator.launcher;
+import javafx.application.Application;
+import javafx.stage.Stage;
import org.cryptomator.ui.controllers.MainController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javafx.application.Application;
-import javafx.application.Platform;
-import javafx.fxml.FXMLLoader;
-import javafx.stage.Stage;
-
public class MainApplication extends Application {
private static final Logger LOG = LoggerFactory.getLogger(MainApplication.class);
diff --git a/main/pom.xml b/main/pom.xml
index 7ab33380a..d50465fc2 100644
--- a/main/pom.xml
+++ b/main/pom.xml
@@ -3,7 +3,7 @@
4.0.0org.cryptomatormain
- 1.4.0-SNAPSHOT
+ 1.5.0-SNAPSHOTpomCryptomator
@@ -24,20 +24,20 @@
UTF-8
- 1.2.0
- 1.5.2
+ 1.2.1
+ 1.6.22.0.0
- 0.1.5
- 0.1.2
- 1.0.4
+ 1.0.3
+ 1.1.1
+ 1.0.5
- 2.5
- 3.6
+ 2.6
+ 3.8.11.0.3
- 25.1-jre
- 2.16
+ 27.0-jre
+ 2.202.8.51.7.25
@@ -45,7 +45,7 @@
4.124.12.1
- 2.19.0
+ 2.23.01.3
@@ -288,7 +288,7 @@
org.jacocojacoco-maven-plugin
- 0.8.1
+ 0.8.2prepare-agent
@@ -315,15 +315,9 @@
maven-compiler-plugin
- 3.7.0
+ 3.8.0
- 10
- 10
- 10
-
- --add-modules
- jdk.incubator.httpclient
-
+ 9com.google.dagger
diff --git a/main/uber-jar/pom.xml b/main/uber-jar/pom.xml
index e0fb9e634..fa28bfada 100644
--- a/main/uber-jar/pom.xml
+++ b/main/uber-jar/pom.xml
@@ -4,7 +4,7 @@
org.cryptomatormain
- 1.4.0-SNAPSHOT
+ 1.5.0-SNAPSHOTuber-jarSingle über jar with all dependencies
diff --git a/main/ui/pom.xml b/main/ui/pom.xml
index 2421329e6..a613c2b01 100644
--- a/main/ui/pom.xml
+++ b/main/ui/pom.xml
@@ -4,7 +4,7 @@
org.cryptomatormain
- 1.4.0-SNAPSHOT
+ 1.5.0-SNAPSHOTuiCryptomator GUI
diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java
index fc5019162..b1a823178 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java
@@ -2,7 +2,7 @@
* Copyright (c) 2014, 2017 Sebastian Stenzel
* All rights reserved.
* This program and the accompanying materials are made available under the terms of the accompanying LICENSE file.
- *
+ *
* Contributors:
* Sebastian Stenzel - initial API and implementation
* Jean-Noël Charon - confirmation dialog on vault removal
@@ -110,7 +110,7 @@ public class MainController implements ViewController {
@Inject
public MainController(@Named("mainWindow") Stage mainWindow, ExecutorService executorService, @Named("fileOpenRequests") BlockingQueue fileOpenRequests, ExitUtil exitUtil, Localization localization,
- VaultFactory vaultFactoy, ViewControllerLoader viewControllerLoader, UpgradeStrategies upgradeStrategies, VaultList vaults, AutoUnlocker autoUnlocker) {
+ VaultFactory vaultFactoy, ViewControllerLoader viewControllerLoader, UpgradeStrategies upgradeStrategies, VaultList vaults, AutoUnlocker autoUnlocker) {
this.mainWindow = mainWindow;
this.executorService = executorService;
this.fileOpenRequests = fileOpenRequests;
@@ -222,7 +222,7 @@ public class MainController implements ViewController {
ButtonType forceShutdownButtonType = new ButtonType(localization.getString("main.gracefulShutdown.button.forceShutdown"));
Alert gracefulShutdownDialog = DialogBuilderUtil.buildGracefulShutdownDialog(
localization.getString("main.gracefulShutdown.dialog.title"), localization.getString("main.gracefulShutdown.dialog.header"), localization.getString("main.gracefulShutdown.dialog.content"),
- forceShutdownButtonType, forceShutdownButtonType, tryAgainButtonType);
+ forceShutdownButtonType, ButtonType.CANCEL, forceShutdownButtonType, tryAgainButtonType);
Optional choice = gracefulShutdownDialog.showAndWait();
choice.ifPresent(btnType -> {
@@ -230,8 +230,12 @@ public class MainController implements ViewController {
gracefulShutdown();
} else if (forceShutdownButtonType.equals(btnType)) {
Platform.runLater(Platform::exit);
+ } else {
+ return;
}
});
+ } else {
+ Platform.runLater(Platform::exit);
}
}
@@ -329,7 +333,7 @@ public class MainController implements ViewController {
/**
* adds the given directory or selects it if it is already in the list of directories.
- *
+ *
* @param path to a vault directory or masterkey file
*/
public void addVault(final Path path, boolean select) {
@@ -430,7 +434,13 @@ public class MainController implements ViewController {
}
private void didPressKeyOnRoot(KeyEvent event) {
- if ((event.isMetaDown() || event.isControlDown()) && event.getCode().isDigitKey()) {
+ boolean triggered;
+ if (SystemUtils.IS_OS_MAC) {
+ triggered = event.isMetaDown();
+ } else {
+ triggered = event.isControlDown() && !event.isAltDown();
+ }
+ if (triggered && event.getCode().isDigitKey()) {
int digit = Integer.valueOf(event.getText());
switch (digit) {
case 0: {
diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/SettingsController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/SettingsController.java
index 958dceb5b..8c1454404 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/controllers/SettingsController.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/SettingsController.java
@@ -8,17 +8,13 @@
******************************************************************************/
package org.cryptomator.ui.controllers;
-import java.util.Optional;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
+import javafx.beans.Observable;
import javafx.beans.binding.Bindings;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
+import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
@@ -26,15 +22,19 @@ import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;
-import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.util.StringConverter;
import org.apache.commons.lang3.SystemUtils;
-import org.cryptomator.common.settings.VolumeImpl;
import org.cryptomator.common.settings.Settings;
+import org.cryptomator.common.settings.VolumeImpl;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Volume;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+import java.util.Optional;
+
@Singleton
public class SettingsController implements ViewController {
@@ -49,16 +49,13 @@ public class SettingsController implements ViewController {
this.localization = localization;
this.settings = settings;
this.applicationVersion = applicationVersion;
+ this.webdavSettings = new Group();
}
@FXML
private CheckBox checkForUpdatesCheckbox;
- @FXML
- private GridPane webdavVolume;
-
- @FXML
- private GridPane fuseVolume;
+ private Group webdavSettings;
@FXML
private Label portFieldLabel;
@@ -97,15 +94,18 @@ public class SettingsController implements ViewController {
volume.getItems().addAll(Volume.getCurrentSupportedAdapters());
volume.setValue(settings.preferredVolumeImpl().get());
volume.setConverter(new NioAdapterImplStringConverter());
+ volume.valueProperty().addListener(this::setVisibilityGvfsElements);
//WEBDAV
- webdavVolume.visibleProperty().bind(volume.valueProperty().isEqualTo(VolumeImpl.WEBDAV));
- webdavVolume.managedProperty().bind(webdavVolume.visibleProperty());
- prefGvfsScheme.managedProperty().bind(webdavVolume.visibleProperty());
- prefGvfsSchemeLabel.managedProperty().bind(webdavVolume.visibleProperty());
- portFieldLabel.managedProperty().bind(webdavVolume.visibleProperty());
- changePortButton.managedProperty().bind(webdavVolume.visibleProperty());
- portField.managedProperty().bind(webdavVolume.visibleProperty());
+ webdavSettings.visibleProperty().bind(volume.valueProperty().isEqualTo(VolumeImpl.WEBDAV));
+ webdavSettings.managedProperty().bind(webdavSettings.visibleProperty());
+ prefGvfsScheme.managedProperty().bind(webdavSettings.visibleProperty());
+ prefGvfsSchemeLabel.managedProperty().bind(webdavSettings.visibleProperty());
+ portFieldLabel.managedProperty().bind(webdavSettings.visibleProperty());
+ portFieldLabel.visibleProperty().bind(webdavSettings.visibleProperty());
+ changePortButton.managedProperty().bind(webdavSettings.visibleProperty());
+ portField.managedProperty().bind(webdavSettings.visibleProperty());
+ portField.visibleProperty().bind(webdavSettings.visibleProperty());
portField.setText(String.valueOf(settings.port().intValue()));
portField.addEventFilter(KeyEvent.KEY_TYPED, this::filterNumericKeyEvents);
changePortButton.visibleProperty().bind(settings.port().asString().isNotEqualTo(portField.textProperty()));
@@ -116,10 +116,6 @@ public class SettingsController implements ViewController {
prefGvfsSchemeLabel.setVisible(SystemUtils.IS_OS_LINUX);
prefGvfsScheme.setVisible(SystemUtils.IS_OS_LINUX);
- //FUSE
- fuseVolume.visibleProperty().bind(volume.valueProperty().isEqualTo(VolumeImpl.FUSE));
- fuseVolume.managedProperty().bind(fuseVolume.visibleProperty());
-
debugModeCheckbox.setSelected(settings.debugMode().get());
settings.checkForUpdates().bind(checkForUpdatesCheckbox.selectedProperty());
@@ -163,6 +159,11 @@ public class SettingsController implements ViewController {
}
}
+ private void setVisibilityGvfsElements(Observable obs, Object oldValue, Object newValue) {
+ prefGvfsSchemeLabel.setVisible(SystemUtils.IS_OS_LINUX && ((VolumeImpl) newValue).getDisplayName().equals("WebDAV"));
+ prefGvfsScheme.setVisible(SystemUtils.IS_OS_LINUX && ((VolumeImpl) newValue).getDisplayName().equals("WebDAV"));
+ }
+
private boolean areUpdatesManagedExternally() {
return Boolean.parseBoolean(System.getProperty("cryptomator.updatesManagedExternally", "false"));
}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java
index 1b01bcef4..c2c50bdc5 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java
@@ -8,13 +8,6 @@
******************************************************************************/
package org.cryptomator.ui.controllers;
-import javax.inject.Inject;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.concurrent.ExecutorService;
-
import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
import javafx.application.Application;
@@ -33,8 +26,12 @@ import javafx.scene.control.Label;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;
+import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
+import javafx.scene.layout.HBox;
import javafx.scene.text.Text;
+import javafx.stage.DirectoryChooser;
+import javafx.stage.Stage;
import javafx.util.StringConverter;
import org.apache.commons.lang3.CharUtils;
import org.apache.commons.lang3.SystemUtils;
@@ -45,7 +42,6 @@ import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException;
import org.cryptomator.frontend.webdav.ServerLifecycleException;
import org.cryptomator.keychain.KeychainAccess;
-import org.cryptomator.ui.model.InvalidSettingsException;
import org.cryptomator.ui.controls.SecPasswordField;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
@@ -57,6 +53,17 @@ import org.fxmisc.easybind.Subscription;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.inject.Inject;
+import javax.inject.Named;
+import java.io.File;
+import java.nio.file.DirectoryNotEmptyException;
+import java.nio.file.NotDirectoryException;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.ExecutorService;
+
public class UnlockController implements ViewController {
private static final Logger LOG = LoggerFactory.getLogger(UnlockController.class);
@@ -67,6 +74,7 @@ public class UnlockController implements ViewController {
.precomputed();
private final Application app;
+ private final Stage mainWindow;
private final Localization localization;
private final WindowsDriveLetters driveLetters;
private final ChangeListener driveLetterChangeListener = this::winDriveLetterDidChange;
@@ -78,8 +86,9 @@ public class UnlockController implements ViewController {
private Subscription vaultSubs = Subscription.EMPTY;
@Inject
- public UnlockController(Application app, Localization localization, WindowsDriveLetters driveLetters, Optional keychainAccess, Settings settings, ExecutorService executor) {
+ public UnlockController(Application app, @Named("mainWindow") Stage mainWindow, Localization localization, WindowsDriveLetters driveLetters, Optional keychainAccess, Settings settings, ExecutorService executor) {
this.app = app;
+ this.mainWindow = mainWindow;
this.localization = localization;
this.driveLetters = driveLetters;
this.keychainAccess = keychainAccess;
@@ -115,13 +124,13 @@ public class UnlockController implements ViewController {
private ChoiceBox winDriveLetter;
@FXML
- private CheckBox useOwnMountPath;
+ private CheckBox useCustomMountPoint;
@FXML
- private Label mountPathLabel;
+ private HBox customMountPoint;
@FXML
- private TextField mountPath;
+ private Label customMountPointField;
@FXML
private ProgressIndicator progressIndicator;
@@ -153,27 +162,29 @@ public class UnlockController implements ViewController {
savePassword.setDisable(!keychainAccess.isPresent());
unlockAfterStartup.disableProperty().bind(savePassword.disabledProperty().or(savePassword.selectedProperty().not()));
- mountPathLabel.visibleProperty().bind(useOwnMountPath.selectedProperty());
- mountPath.visibleProperty().bind(useOwnMountPath.selectedProperty());
- mountPath.managedProperty().bind(useOwnMountPath.selectedProperty());
- mountPath.textProperty().addListener(this::mountPathDidChange);
+ customMountPoint.visibleProperty().bind(useCustomMountPoint.selectedProperty());
+ customMountPoint.managedProperty().bind(useCustomMountPoint.selectedProperty());
+ winDriveLetter.setConverter(new WinDriveLetterLabelConverter());
- if (SystemUtils.IS_OS_WINDOWS) {
- winDriveLetter.setConverter(new WinDriveLetterLabelConverter());
- useOwnMountPath.setVisible(false);
- useOwnMountPath.setManaged(false);
- mountPathLabel.setManaged(false);
- //dirty cheat
- mountPath.setMouseTransparent(true);
- } else {
+ if (!SystemUtils.IS_OS_WINDOWS) {
winDriveLetterLabel.setVisible(false);
winDriveLetterLabel.setManaged(false);
winDriveLetter.setVisible(false);
winDriveLetter.setManaged(false);
- if (VolumeImpl.WEBDAV.equals(settings.preferredVolumeImpl().get())) {
- useOwnMountPath.setVisible(false);
- useOwnMountPath.setManaged(false);
- mountPathLabel.setManaged(false);
+ }
+
+ if (VolumeImpl.WEBDAV.equals(settings.preferredVolumeImpl().get())) {
+ useCustomMountPoint.setVisible(false);
+ useCustomMountPoint.setManaged(false);
+ customMountPoint.setVisible(false);
+ customMountPoint.setManaged(false);
+ } else {
+ useCustomMountPoint.setVisible(true);
+ 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());
}
}
}
@@ -213,13 +224,11 @@ public class UnlockController implements ViewController {
winDriveLetter.getItems().addAll(driveLetters.getAvailableDriveLetters());
winDriveLetter.getItems().sort(new WinDriveLetterComparator());
winDriveLetter.valueProperty().addListener(driveLetterChangeListener);
+ chooseSelectedDriveLetter();
}
downloadsPageLink.setVisible(false);
messageText.setText(null);
mountName.setText(vault.getMountName());
- if (SystemUtils.IS_OS_WINDOWS) {
- chooseSelectedDriveLetter();
- }
savePassword.setSelected(false);
// auto-fill pw from keychain:
if (keychainAccess.isPresent()) {
@@ -234,16 +243,16 @@ public class UnlockController implements ViewController {
VaultSettings vaultSettings = vault.getVaultSettings();
unlockAfterStartup.setSelected(savePassword.isSelected() && vaultSettings.unlockAfterStartup().get());
revealAfterMount.setSelected(vaultSettings.revealAfterMount().get());
- useOwnMountPath.setSelected(vaultSettings.usesIndividualMountPath().get());
useReadOnlyMode.setSelected(vaultSettings.usesReadOnlyMode().get());
+ if (!settings.preferredVolumeImpl().get().equals(VolumeImpl.WEBDAV)) {
+ useCustomMountPoint.setSelected(vaultSettings.usesIndividualMountPath().get());
+ customMountPointField.textProperty().setValue(vaultSettings.individualMountPath().getValueSafe());
+ }
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(useOwnMountPath.selectedProperty(), vaultSettings.usesIndividualMountPath()::set));
+ vaultSubs = vaultSubs.and(EasyBind.subscribe(useCustomMountPoint.selectedProperty(), vaultSettings.usesIndividualMountPath()::set));
vaultSubs = vaultSubs.and(EasyBind.subscribe(useReadOnlyMode.selectedProperty(), vaultSettings.usesReadOnlyMode()::set));
-
- mountPath.textProperty().setValue(vaultSettings.individualMountPath().getValueSafe());
-
}
// ****************************************
@@ -285,8 +294,13 @@ public class UnlockController implements ViewController {
}
}
- private void mountPathDidChange(ObservableValue extends String> property, String oldValue, String newValue) {
- vault.setIndividualMountPath(newValue);
+ public void didClickChooseCustomMountPoint(ActionEvent actionEvent) {
+ DirectoryChooser dirChooser = new DirectoryChooser();
+ File file = dirChooser.showDialog(mainWindow);
+ if (file != null) {
+ customMountPointField.setText(file.toString());
+ vault.setCustomMountPath(file.toString());
+ }
}
/**
@@ -299,7 +313,7 @@ public class UnlockController implements ViewController {
if (letter == null) {
return localization.getString("unlock.choicebox.winDriveLetter.auto");
} else {
- return Character.toString(letter) + ":";
+ return letter + ":";
}
}
@@ -393,6 +407,7 @@ public class UnlockController implements ViewController {
CharSequence password = passwordField.getCharacters();
Tasks.create(() -> {
+ messageText.setText(localization.getString("unlock.pendingMessage.unlocking"));
vault.unlock(password);
if (keychainAccess.isPresent() && savePassword.isSelected()) {
keychainAccess.get().storePassphrase(vault.getId(), password);
@@ -401,10 +416,6 @@ public class UnlockController implements ViewController {
messageText.setText(null);
downloadsPageLink.setVisible(false);
listener.ifPresent(lstnr -> lstnr.didUnlock(vault));
- }).onError(InvalidSettingsException.class, e -> {
- messageText.setText(localization.getString("unlock.errorMessage.invalidMountPath"));
- advancedOptions.setVisible(true);
- mountPath.setStyle("-fx-border-color: red;");
}).onError(InvalidPassphraseException.class, e -> {
messageText.setText(localization.getString("unlock.errorMessage.wrongPassword"));
passwordField.selectAll();
@@ -420,10 +431,17 @@ public class UnlockController implements ViewController {
} else if (e.getDetectedVersion() == Integer.MAX_VALUE) {
messageText.setText(localization.getString("unlock.errorMessage.unauthenticVersionMac"));
}
- }).onError(ServerLifecycleException.class, e -> {
- LOG.error("Unlock failed for technical reasons.", e);
- messageText.setText(localization.getString("unlock.errorMessage.unlockFailed"));
- }).onError(Exception.class, e -> {
+ }).onError(NotDirectoryException.class, e -> {
+ LOG.error("Unlock failed. Mount point not a directory: {}", e.getMessage());
+ advancedOptions.setVisible(true);
+ 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);
messageText.setText(localization.getString("unlock.errorMessage.unlockFailed"));
}).andFinally(() -> {
@@ -432,12 +450,17 @@ public class UnlockController implements ViewController {
}
advancedOptions.setDisable(false);
progressIndicator.setVisible(false);
- if (advancedOptions.isVisible()) { //dirty programming, but otherwise the focus is wrong
- mountPath.requestFocus();
- }
}).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 */
public void setListener(UnlockListener listener) {
diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/DokanyVolume.java b/main/ui/src/main/java/org/cryptomator/ui/model/DokanyVolume.java
index 35aff5bcb..26a4b7993 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/model/DokanyVolume.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/model/DokanyVolume.java
@@ -1,14 +1,16 @@
package org.cryptomator.ui.model;
-import javax.inject.Inject;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-
-import com.google.common.collect.Sets;
+import com.google.common.base.Strings;
import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.cryptofs.CryptoFileSystem;
import org.cryptomator.frontend.dokany.Mount;
import org.cryptomator.frontend.dokany.MountFactory;
+import org.cryptomator.frontend.dokany.MountFailedException;
+
+import javax.inject.Inject;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.concurrent.ExecutorService;
public class DokanyVolume implements Volume {
@@ -32,25 +34,31 @@ public class DokanyVolume implements Volume {
return DokanyVolume.isSupportedStatic();
}
- //TODO: Drive letter 'A' as mount point is invalid in dokany. maybe we should do already here something against it
@Override
public void mount(CryptoFileSystem fs) throws VolumeException {
- char driveLetter;
- if (!vaultSettings.winDriveLetter().getValueSafe().equals("")) {
- driveLetter = vaultSettings.winDriveLetter().get().charAt(0);
+ Path mountPath = Paths.get(getMountPathString());
+ String mountName = vaultSettings.mountName().get();
+ try {
+ this.mount = mountFactory.mount(fs.getPath("/"), mountPath, mountName, FS_TYPE_NAME);
+ } catch (MountFailedException e) {
+ throw new VolumeException("Unable to mount Filesystem", e);
+ }
+ }
+
+ private String getMountPathString() throws VolumeException {
+ if (vaultSettings.usesIndividualMountPath().get()) {
+ return vaultSettings.individualMountPath().get();
+ } else if (!Strings.isNullOrEmpty(vaultSettings.winDriveLetter().get())) {
+ return vaultSettings.winDriveLetter().get().charAt(0) + ":\\";
} else {
//auto assign drive letter
if (!windowsDriveLetters.getAvailableDriveLetters().isEmpty()) {
- //this is a temporary fix for 'A' being an invalid drive letter
- Set availableLettersWithoutA = Sets.difference(windowsDriveLetters.getAvailableDriveLetters(), Set.of('A'));
- driveLetter = availableLettersWithoutA.iterator().next();
-// driveLetter = windowsDriveLetters.getAvailableDriveLetters().iterator().next();
+ return windowsDriveLetters.getAvailableDriveLetters().iterator().next() + ":\\";
} else {
throw new VolumeException("No free drive letter available.");
}
}
- String mountName = vaultSettings.mountName().get();
- this.mount = mountFactory.mount(fs.getPath("/"), driveLetter, mountName, FS_TYPE_NAME);
+
}
@Override
diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/FuseVolume.java b/main/ui/src/main/java/org/cryptomator/ui/model/FuseVolume.java
index ec63da443..972b9ce06 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/model/FuseVolume.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/model/FuseVolume.java
@@ -1,14 +1,5 @@
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.cryptomator.common.settings.VaultSettings;
import org.cryptomator.cryptofs.CryptoFileSystem;
@@ -20,65 +11,84 @@ import org.cryptomator.frontend.fuse.mount.Mount;
import org.slf4j.Logger;
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;
+
public class FuseVolume implements Volume {
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_LINUX = System.getProperty("user.home") + "/.Cryptomator";
+ private static final int MAX_TMPMOUNTPOINT_CREATION_RETRIES = 10;
private final VaultSettings vaultSettings;
private Mount fuseMnt;
- private Path mountPath;
- private boolean extraDirCreated;
+ private Path mountPoint;
+ private boolean createdTemporaryMountPoint;
@Inject
public FuseVolume(VaultSettings vaultSettings) {
this.vaultSettings = vaultSettings;
- this.extraDirCreated = false;
+ this.createdTemporaryMountPoint = false;
}
@Override
public void mount(CryptoFileSystem fs) throws IOException, FuseNotSupportedException, VolumeException {
- String mountPath;
if (vaultSettings.usesIndividualMountPath().get()) {
- //specific path given
- mountPath = vaultSettings.individualMountPath().get();
+ Path customMountPoint = Paths.get(vaultSettings.individualMountPath().get());
+ checkProvidedMountPoint(customMountPoint);
+ this.mountPoint = customMountPoint;
+ LOG.debug("Successfully checked custom mount point: {}", mountPoint);
} else {
- //choose default path & create extra directory
- mountPath = createDirIfNotExist(SystemUtils.IS_OS_MAC ? DEFAULT_MOUNTROOTPATH_MAC : DEFAULT_MOUNTROOTPATH_LINUX, vaultSettings.mountName().get());
- extraDirCreated = true;
+ this.mountPoint = createTemporaryMountPoint();
+ createdTemporaryMountPoint = true;
+ LOG.debug("Successfully created mount point: {}", mountPoint);
}
- this.mountPath = Paths.get(mountPath).toAbsolutePath();
mount(fs.getPath("/"));
}
- private String createDirIfNotExist(String prefix, String dirName) throws IOException {
- Path p = Paths.get(prefix, dirName + vaultSettings.getId());
- if (Files.isDirectory(p)) {
- try (DirectoryStream 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();
+ private void checkProvidedMountPoint(Path mountPoint) throws IOException {
+ if (!Files.isDirectory(mountPoint)) {
+ throw new NotDirectoryException(mountPoint.toString());
}
+ try (DirectoryStream 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 {
try {
- EnvironmentVariables envVars = EnvironmentVariables.create()
- .withMountName(vaultSettings.mountName().getValue())
- .withMountPath(mountPath)
+ EnvironmentVariables envVars = EnvironmentVariables.create() //
+ .withMountName(vaultSettings.mountName().getValue()) //
+ .withMountPath(mountPoint) //
.build();
this.fuseMnt = FuseMountFactory.getMounter().mount(root, envVars);
} catch (CommandFailedException e) {
@@ -91,7 +101,7 @@ public class FuseVolume implements Volume {
try {
fuseMnt.revealInFileManager();
} 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);
}
}
@@ -103,15 +113,16 @@ public class FuseVolume implements Volume {
} catch (CommandFailedException e) {
throw new VolumeException(e);
}
- cleanup();
+ deleteTemporaryMountPoint();
}
- private void cleanup() {
- if (extraDirCreated) {
+ private void deleteTemporaryMountPoint() {
+ if (createdTemporaryMountPoint) {
try {
- Files.delete(mountPath);
+ Files.delete(mountPoint);
+ LOG.debug("Successfully deleted mount point: {}", mountPoint);
} catch (IOException e) {
- LOG.warn("Could not delete mounting directory:" + e.getMessage());
+ LOG.warn("Could not delete mount point: {}", e.getMessage());
}
}
}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/InvalidSettingsException.java b/main/ui/src/main/java/org/cryptomator/ui/model/InvalidSettingsException.java
deleted file mode 100644
index ed9b39040..000000000
--- a/main/ui/src/main/java/org/cryptomator/ui/model/InvalidSettingsException.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.cryptomator.ui.model;
-
-public class InvalidSettingsException extends RuntimeException {
-
-}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion3to4.java b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion3to4.java
index 3c9e6aa2e..cb0981d52 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion3to4.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion3to4.java
@@ -5,8 +5,8 @@
*******************************************************************************/
package org.cryptomator.ui.model;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
+import javax.inject.Inject;
+import javax.inject.Singleton;
import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
@@ -19,11 +19,7 @@ import java.util.EnumSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-import org.apache.commons.codec.binary.Base32;
-import org.apache.commons.codec.binary.BaseNCodec;
+import com.google.common.io.BaseEncoding;
import org.apache.commons.lang3.StringUtils;
import org.cryptomator.cryptolib.Cryptors;
import org.cryptomator.cryptolib.api.Cryptor;
@@ -32,6 +28,8 @@ import org.cryptomator.ui.l10n.Localization;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
/**
* Contains the collective knowledge of all creatures who were alive during the development of vault format 3.
* This class uses no external classes from the crypto or shortening layer by purpose, so we don't need legacy code inside these.
@@ -50,7 +48,7 @@ class UpgradeVersion3to4 extends UpgradeStrategy {
private static final String NEW_FOLDER_PREFIX = "0";
private final MessageDigest sha1 = MessageDigestSupplier.SHA1.get();
- private final BaseNCodec base32 = new Base32();
+ private final BaseEncoding base32 = BaseEncoding.base32();
@Inject
public UpgradeVersion3to4(Localization localization) {
@@ -155,7 +153,7 @@ class UpgradeVersion3to4 extends UpgradeStrategy {
String oldLongName = new String(Files.readAllBytes(oldMetadataFile), UTF_8);
if (oldLongName.endsWith(OLD_FOLDER_SUFFIX)) {
String newLongName = NEW_FOLDER_PREFIX + StringUtils.removeEnd(oldLongName, OLD_FOLDER_SUFFIX);
- String newCanonicalBase32 = base32.encodeAsString(sha1.digest(newLongName.getBytes(UTF_8)));
+ String newCanonicalBase32 = base32.encode(sha1.digest(newLongName.getBytes(UTF_8)));
String newCanonicalName = newCanonicalBase32 + LONG_FILENAME_EXT;
Path newMetadataFile = metadataDir.resolve(newCanonicalName.substring(0, 2)).resolve(newCanonicalName.substring(2, 4)).resolve(newCanonicalName);
String newName = newCanonicalBase32 + oldNameSuffix + LONG_FILENAME_EXT;
diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java b/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java
index cf0e6d7cc..78a2a51e4 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java
@@ -8,19 +8,6 @@
*******************************************************************************/
package org.cryptomator.ui.model;
-import java.io.IOException;
-import java.nio.file.FileAlreadyExistsException;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Objects;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Predicate;
-
-import javax.inject.Inject;
-import javax.inject.Provider;
-
import javafx.application.Platform;
import javafx.beans.Observable;
import javafx.beans.binding.Binding;
@@ -42,6 +29,19 @@ import org.fxmisc.easybind.EasyBind;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.inject.Inject;
+import javax.inject.Provider;
+import java.io.IOException;
+import java.nio.file.FileAlreadyExistsException;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.NotDirectoryException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Objects;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Predicate;
+
@PerVault
public class Vault {
@@ -98,11 +98,11 @@ public class Vault {
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));
try {
- if (vaultSettings.usesIndividualMountPath().and(vaultSettings.individualMountPath().isEmpty()).get()) {
- throw new InvalidSettingsException();
+ if (vaultSettings.usesIndividualMountPath().get() && vaultSettings.individualMountPath().get().isEmpty()) {
+ throw new NotDirectoryException("");
}
CryptoFileSystem fs = getCryptoFileSystem(passphrase);
volume = volumeProvider.get();
@@ -241,11 +241,11 @@ public class Vault {
return vaultSettings.mountName().get();
}
- public String getIndividualMountPath() {
+ public String getCustomMountPath() {
return vaultSettings.individualMountPath().getValueSafe();
}
- public void setIndividualMountPath(String mountPath) {
+ public void setCustomMountPath(String mountPath) {
vaultSettings.individualMountPath().set(mountPath);
}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/WindowsDriveLetters.java b/main/ui/src/main/java/org/cryptomator/ui/model/WindowsDriveLetters.java
index 41b6799ba..4c2c3111e 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/model/WindowsDriveLetters.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/model/WindowsDriveLetters.java
@@ -22,11 +22,11 @@ import org.apache.commons.lang3.SystemUtils;
@Singleton
public final class WindowsDriveLetters {
- private static final Set A_TO_Z;
+ private static final Set D_TO_Z;
static {
- try (IntStream stream = IntStream.rangeClosed('A', 'Z')) {
- A_TO_Z = stream.mapToObj(i -> (char) i).collect(Collectors.toSet());
+ try (IntStream stream = IntStream.rangeClosed('D', 'Z')) {
+ D_TO_Z = stream.mapToObj(i -> (char) i).collect(Collectors.toSet());
}
}
@@ -45,7 +45,7 @@ public final class WindowsDriveLetters {
public Set getAvailableDriveLetters() {
Set occupiedDriveLetters = getOccupiedDriveLetters();
Predicate 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());
}
}
diff --git a/main/ui/src/main/resources/fxml/settings.fxml b/main/ui/src/main/resources/fxml/settings.fxml
index 794181cf5..efa95f19c 100644
--- a/main/ui/src/main/resources/fxml/settings.fxml
+++ b/main/ui/src/main/resources/fxml/settings.fxml
@@ -7,7 +7,6 @@
Contributors:
Sebastian Stenzel - initial API and implementation
-->
-
@@ -27,8 +26,8 @@
-
-
+
+
@@ -45,21 +44,15 @@
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
diff --git a/main/ui/src/main/resources/fxml/unlock.fxml b/main/ui/src/main/resources/fxml/unlock.fxml
index ca4463b26..428a696f6 100644
--- a/main/ui/src/main/resources/fxml/unlock.fxml
+++ b/main/ui/src/main/resources/fxml/unlock.fxml
@@ -7,29 +7,25 @@
Contributors:
Sebastian Stenzel - initial API and implementation
-->
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
+
@@ -45,7 +41,7 @@
-
+
@@ -54,12 +50,12 @@
-
+
-
+
@@ -69,49 +65,52 @@
-
+
-
+
-
+
-
-
-
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
+
+
+
+
+
+
-
-
diff --git a/main/ui/src/main/resources/fxml/welcome.fxml b/main/ui/src/main/resources/fxml/welcome.fxml
index e455e28e6..4cdfe8430 100644
--- a/main/ui/src/main/resources/fxml/welcome.fxml
+++ b/main/ui/src/main/resources/fxml/welcome.fxml
@@ -7,31 +7,28 @@
Contributors:
Sebastian Stenzel - initial API and implementation
-->
-
-
-
-
+
-
+
-
+
-
+
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/ar.txt b/main/ui/src/main/resources/localization/ar.txt
index debd26583..4259cc2f7 100644
--- a/main/ui/src/main/resources/localization/ar.txt
+++ b/main/ui/src/main/resources/localization/ar.txt
@@ -108,9 +108,15 @@ settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
-unlock.label.useOwnMountPath = Use individual mount point
+unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
+main.gracefulShutdown.dialog.title = Locking vault(s) failed
+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.button.tryAgain = Try again
+main.gracefulShutdown.button.forceShutdown = Force shutdown
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/bg.txt b/main/ui/src/main/resources/localization/bg.txt
index 47af38946..d7c67b4c2 100644
--- a/main/ui/src/main/resources/localization/bg.txt
+++ b/main/ui/src/main/resources/localization/bg.txt
@@ -111,6 +111,12 @@ unlock.successLabel.upgraded = Криптоматор беше обновен
unlock.label.useOwnMountPath = Използвайте собствена точка за монтиране
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
+main.gracefulShutdown.dialog.title = Locking vault(s) failed
+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.button.tryAgain = Try again
+main.gracefulShutdown.button.forceShutdown = Force shutdown
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/ca.txt b/main/ui/src/main/resources/localization/ca.txt
new file mode 100644
index 000000000..6b1e7c1a7
--- /dev/null
+++ b/main/ui/src/main/resources/localization/ca.txt
@@ -0,0 +1,122 @@
+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.
+unlock.label.mountPath = Punt de muntatge
+unlock.label.mountPathButton = Aplica
+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
+unlock.errorMessage.invalidMountPath = S'ha utilitzat el camí de muntatge personalitzat però no hi ha el camí.
+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...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/cs.txt b/main/ui/src/main/resources/localization/cs.txt
index 8fea819c5..5fe9ff9eb 100644
--- a/main/ui/src/main/resources/localization/cs.txt
+++ b/main/ui/src/main/resources/localization/cs.txt
@@ -1,6 +1,6 @@
app.name = Cryptomator
# main.fxml
-main.emptyListInstructions = Trezor přidáte kliknutím sem
+main.emptyListInstructions = Trezor přidáte kliknutím zde\n
main.directoryList.contextMenu.remove = Odstranit ze seznamu
main.directoryList.contextMenu.changePassword = Změnit heslo
main.addDirectory.contextMenu.new = Vytvořit nový trezor
@@ -115,4 +115,10 @@ welcome.askForUpdateCheck.dialog.title = Zjišťování aktualizací
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.
settings.volume.dokany = Dokany
-unlock.errorMessage.invalidMountPath = Individuální přípojný bod není nastaven
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Individuální přípojný bod není nastaven
+main.gracefulShutdown.dialog.title = Zamčení trezorů se nezdařilo
+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.button.tryAgain = Zkusit znovu
+main.gracefulShutdown.button.forceShutdown = Vynutit vypnutí
+unlock.pendingMessage.unlocking = Odemykání trezoru…
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/da.txt b/main/ui/src/main/resources/localization/da.txt
index e2cfa287e..e6289b90b 100644
--- a/main/ui/src/main/resources/localization/da.txt
+++ b/main/ui/src/main/resources/localization/da.txt
@@ -108,9 +108,15 @@ settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
-unlock.label.useOwnMountPath = Use individual mount point
+unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
+main.gracefulShutdown.dialog.title = Locking vault(s) failed
+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.button.tryAgain = Try again
+main.gracefulShutdown.button.forceShutdown = Force shutdown
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/de.txt b/main/ui/src/main/resources/localization/de.txt
index 15d39687c..e72bac2d5 100644
--- a/main/ui/src/main/resources/localization/de.txt
+++ b/main/ui/src/main/resources/localization/de.txt
@@ -111,6 +111,12 @@ unlock.successLabel.upgraded = Das Cryptomator Upgrade wurde erfolgreich abgesch
unlock.label.useOwnMountPath = Eigenes Laufwerksverzeichnis nutzen
welcome.askForUpdateCheck.dialog.title = Auf Updates prüfen
welcome.askForUpdateCheck.dialog.header = Eingebaute Update-Prüfung aktivieren?
-welcome.askForUpdateCheck.dialog.content = Zur Überprüfung, ob Updates verfügbar sind, lädt Cryptomator die aktuelle Versionsnummer von den Cryptomator-Servern und zeigt Ihnen einen Hinweis an, wenn eine aktuellere Version verfügbar ist.\n\nWir empfehlen, die Update-Prüfung zu aktivieren, damit Sie sicher sein können, dass Sie stets die neueste Cryptomator-Version mit allen Sicherheits-Patches verwenden. Wenn Sie die Update-Prüfung nicht aktivieren können Sie stattdessen auf https\://cryptomator.org/downloads/ selbst die aktuelle Version ermitteln und herunterladen.\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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Individueller Mount-Punkt ist nicht gesetzt.
+main.gracefulShutdown.dialog.title = Sperren des Tresors gescheitert
+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.button.tryAgain = Versuchen Sie es erneut
+main.gracefulShutdown.button.forceShutdown = Herunterfahren erzwingen
+unlock.pendingMessage.unlocking = Entsperre Tresor...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/en.txt b/main/ui/src/main/resources/localization/en.txt
index 6b8f6869e..1afc5b684 100644
--- a/main/ui/src/main/resources/localization/en.txt
+++ b/main/ui/src/main/resources/localization/en.txt
@@ -30,7 +30,7 @@ welcome.checkForUpdates.label.currentlyChecking=Checking for Updates...
welcome.newVersionMessage=Version %1$s can be downloaded.\nThis is %2$s.
welcome.askForUpdateCheck.dialog.title=Update check
welcome.askForUpdateCheck.dialog.header=Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content=To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+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.
# initialize.fxml
initialize.label.password=Password
@@ -75,7 +75,7 @@ unlock.label.unlockAfterStartup=Auto-Unlock on Start (Experimental)
unlock.label.revealAfterMount=Reveal Drive
unlock.label.useReadOnlyMode=Read-only
unlock.label.winDriveLetter=Drive Letter
-unlock.label.useOwnMountPath=Use individual mount point
+unlock.label.useOwnMountPath=Use Custom Mount Point
unlock.label.mountPath=Mount path
unlock.label.mountPathButton=Apply
unlock.label.downloadsPageLink=All Cryptomator versions
@@ -87,9 +87,8 @@ unlock.savePassword.delete.confirmation.title=Delete Saved Password
unlock.savePassword.delete.confirmation.header=Do you really want to delete the saved password of this vault?
unlock.savePassword.delete.confirmation.content=The saved password of this vault will be immediately deleted from your system keychain. If you'd like to save your password again, you'd have to unlock your vault with the "Save Password" option enabled.
unlock.choicebox.winDriveLetter.auto=Assign automatically
+unlock.pendingMessage.unlocking=Unlocking vault...
unlock.errorMessage.wrongPassword=Wrong password
-unlock.errorMessage.wrongPassword=Wrong Password
-unlock.errorMessage.invalidMountPath=Individual mount path is not set.
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.softwareOlderThanVault=Unsupported vault. This vault has been created with a newer version of Cryptomator.
@@ -99,6 +98,12 @@ unlock.successLabel.vaultCreated=Vault was successfully created.
unlock.successLabel.passwordChanged=Password was successfully changed.
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
changePassword.label.oldPassword=Old Password
changePassword.label.newPassword=New Password
diff --git a/main/ui/src/main/resources/localization/es.txt b/main/ui/src/main/resources/localization/es.txt
index 555d2b82f..4c2eb6cb2 100644
--- a/main/ui/src/main/resources/localization/es.txt
+++ b/main/ui/src/main/resources/localization/es.txt
@@ -49,8 +49,8 @@ unlocked.button.lock = Bloquear caja fuerte
unlocked.moreOptions.reveal = Revelar unidad
unlocked.label.revealFailed = La orden ha fallado
unlocked.label.unmountFailed = Error al expulsar la unidad
-unlocked.label.statsEncrypted = cifrado
-unlocked.label.statsDecrypted = descifrado
+unlocked.label.statsEncrypted = encriptado
+unlocked.label.statsDecrypted = desencriptado
unlocked.ioGraph.yAxis.label = Rendimiento (MiB/s)
# settings.fxml
settings.version.label = Versión %s
@@ -85,7 +85,7 @@ settings.debugMode.label = Modo depuración *
upgrade.version3dropBundleExtension.title = Actualizar caja fuerte a la versión 3 (Drop Bundle Extension)
upgrade.version3to4.title = Actualizar caja fuerte de versión 3 a 4
upgrade.version4to5.title = Actualizar caja fuerte de versión 4 a 5
-upgrade.version4to5.msg = Esta caja fuerte tiene que ser migrada a un formato más moderno.\nLos archivos cifrados se actualizarán.\nAsegúrese de que la sincronización ha terminado antes de iniciar el proceso.\n\nNota\: las fechas de modificación de todos los archivos, se cambiarán a la fecha actual.
+upgrade.version4to5.msg = Esta caja fuerte tiene que ser migrada a un formato más moderno.\nLos archivos encriptados se actualizarán.\nAsegúrese de que la sincronización ha terminado antes de iniciar el proceso.\n\nNota\: las fechas de modificación de todos los archivos, se cambiarán a la fecha actual.
upgrade.version4to5.err.io = Error en la migración debido a una excepción E/S. Consulte el archivo de registro para más información.
unlock.label.revealAfterMount = Revelar unidad
unlocked.lock.force.confirmation.title = Error al bloquear %1$s
@@ -100,19 +100,25 @@ 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.
unlock.label.mountPath = Punto de montaje
unlock.label.mountPathButton = Aplicar
-settings.webdav.port.label = WebDAV Port
+settings.webdav.port.label = Puerto WebDAV
settings.webdav.port.prompt = 0 \= Elige automáticamente
settings.webdav.port.apply = Aplicar
settings.webdav.prefGvfsScheme.label = Esquema de WebDAV
settings.volume.label = Método de montaje *
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
-unlock.successLabel.vaultCreated = La caja fuerte fue creado exitosamente.
+unlock.successLabel.vaultCreated = La caja fuerte fue creada exitosamente.
unlock.successLabel.passwordChanged = La contraseña ha sido cambiada con éxito.
unlock.successLabel.upgraded = Cryptomator fue actualizado exitosamente.
unlock.label.useOwnMountPath = Usar Punto de montaje propio
-welcome.askForUpdateCheck.dialog.title = Update check
-welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+welcome.askForUpdateCheck.dialog.title = Buscar actualización
+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.
settings.volume.dokany = Dokany
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+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.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.button.tryAgain = Intente de nuevo
+main.gracefulShutdown.button.forceShutdown = Forzar apagado
+unlock.pendingMessage.unlocking = Desbloqueando la caja fuerte...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/fr.txt b/main/ui/src/main/resources/localization/fr.txt
index 1b7cb5ec6..2dd21dde6 100644
--- a/main/ui/src/main/resources/localization/fr.txt
+++ b/main/ui/src/main/resources/localization/fr.txt
@@ -116,4 +116,10 @@ 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.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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+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.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.button.tryAgain = Réessayez
+main.gracefulShutdown.button.forceShutdown = Arrêt forcé
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/hu.txt b/main/ui/src/main/resources/localization/hu.txt
index b9caac685..af49f7efa 100644
--- a/main/ui/src/main/resources/localization/hu.txt
+++ b/main/ui/src/main/resources/localization/hu.txt
@@ -108,9 +108,15 @@ settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = A széf sikeresen létrehozva.
unlock.successLabel.passwordChanged = A jelszó sikeresen megváltoztatva.
unlock.successLabel.upgraded = A Cryptomator sikeresen frissítésre került.
-unlock.label.useOwnMountPath = Use individual mount point
+unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
+main.gracefulShutdown.dialog.title = Locking vault(s) failed
+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.button.tryAgain = Próbáld újra
+main.gracefulShutdown.button.forceShutdown = Force shutdown
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/it.txt b/main/ui/src/main/resources/localization/it.txt
index b00e32837..61863a3aa 100644
--- a/main/ui/src/main/resources/localization/it.txt
+++ b/main/ui/src/main/resources/localization/it.txt
@@ -108,9 +108,15 @@ settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vaul creato con successo.
unlock.successLabel.passwordChanged = Password modificata con successo.
unlock.successLabel.upgraded = Cryptomator aggiornato con successo.
-unlock.label.useOwnMountPath = Use individual mount point
+unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
+main.gracefulShutdown.dialog.title = Locking vault(s) failed
+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.button.tryAgain = Try again
+main.gracefulShutdown.button.forceShutdown = Force shutdown
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/ja.txt b/main/ui/src/main/resources/localization/ja.txt
index f71c6691a..f8560e5b8 100644
--- a/main/ui/src/main/resources/localization/ja.txt
+++ b/main/ui/src/main/resources/localization/ja.txt
@@ -108,9 +108,15 @@ settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = 金庫が正常に作成されました。
unlock.successLabel.passwordChanged = パスワードが正常に変更されました。
unlock.successLabel.upgraded = Cryptomator が正常にアップグレードされました。
-unlock.label.useOwnMountPath = Use individual mount point
-welcome.askForUpdateCheck.dialog.title = Update check
-welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+unlock.label.useOwnMountPath = カスタムマウントポイントを使う
+welcome.askForUpdateCheck.dialog.title = アップデート確認
+welcome.askForUpdateCheck.dialog.header = 統合アップデート確認を有効にしますか?
+welcome.askForUpdateCheck.dialog.content = おすすめ\: アップデート確認を有効にして、常にすべてのセキュリティパッチが適用されたCryptomatorを維持してください。\n設定はいつでも変えられます。
settings.volume.dokany = Dokany
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = カスタムマウントパスの使用が選択されましたが、パスが指定されていません。
+main.gracefulShutdown.dialog.title = 金庫のロックに失敗しました。
+main.gracefulShutdown.dialog.header = 金庫が使用中です。
+main.gracefulShutdown.dialog.content = 金庫が複数のプログラムによって使用されています。Cryptomatorが正しく終了できるようにプログラムを閉じてから、もう一度やり直してください。\nこれでうまくいかない場合、Cryptomatorを強制的に終了できますが、データの損失が発生しかねないためお勧めできません。
+main.gracefulShutdown.button.tryAgain = やり直す
+main.gracefulShutdown.button.forceShutdown = 強制終了
+unlock.pendingMessage.unlocking = ロック解除中
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/ko.txt b/main/ui/src/main/resources/localization/ko.txt
index e9a05bb81..bc771a590 100644
--- a/main/ui/src/main/resources/localization/ko.txt
+++ b/main/ui/src/main/resources/localization/ko.txt
@@ -105,12 +105,18 @@ settings.webdav.prefGvfsScheme.label = WebDAV 스킴
settings.volume.label = 마운트-방법 *
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
-unlock.successLabel.vaultCreated = Vault was successfully created.
-unlock.successLabel.passwordChanged = Password was successfully changed.
-unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
-unlock.label.useOwnMountPath = Use individual mount point
-welcome.askForUpdateCheck.dialog.title = Update check
-welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+unlock.successLabel.vaultCreated = 보관함이 성공적으로 생성되었습니다.
+unlock.successLabel.passwordChanged = 비밀번호가 성공적으로 변경되었습니다.
+unlock.successLabel.upgraded = Cryptomator가 성공적으로 업그레이드 되었습니다.
+unlock.label.useOwnMountPath = 커스텀 마운트 지점 사용
+welcome.askForUpdateCheck.dialog.title = 업데이트 확인
+welcome.askForUpdateCheck.dialog.header = 통합 업데이트 확인을 활성화 하겠습니까?
+welcome.askForUpdateCheck.dialog.content = 추천\: 모든 보안 패치가 적용된 최신 버전의 Cryptomator를 유지하기 위해 업데이트 확인을 활성화 하십시오.\n설정에서 언제든지 바꿀 수 있습니다.
settings.volume.dokany = Dokany
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = 커스텀 마운트 경로가 선택되었지만 경로가 주어지지 않았습니다.
+main.gracefulShutdown.dialog.title = 보관함 잠그기 실패
+main.gracefulShutdown.dialog.header = 보관함이 사용중입니다.
+main.gracefulShutdown.dialog.content = 하나 이상의 보관함을 다른 프로그램이 사용하고 있습니다. Cryptomator를 올바르게 종료하려면 프로그램을 먼저 종료하고 다시 시도해 주세요.
+main.gracefulShutdown.button.tryAgain = 다시 시도
+main.gracefulShutdown.button.forceShutdown = 강제 종료
+unlock.pendingMessage.unlocking = 보관함 여는 중
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/lv.txt b/main/ui/src/main/resources/localization/lv.txt
index 5fe6295f8..201b392c1 100644
--- a/main/ui/src/main/resources/localization/lv.txt
+++ b/main/ui/src/main/resources/localization/lv.txt
@@ -109,9 +109,15 @@ settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
-unlock.label.useOwnMountPath = Use individual mount point
+unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
+main.gracefulShutdown.dialog.title = Locking vault(s) failed
+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.button.tryAgain = Try again
+main.gracefulShutdown.button.forceShutdown = Force shutdown
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/nl.txt b/main/ui/src/main/resources/localization/nl.txt
index fbe751b92..9bb9efe20 100644
--- a/main/ui/src/main/resources/localization/nl.txt
+++ b/main/ui/src/main/resources/localization/nl.txt
@@ -115,4 +115,10 @@ welcome.askForUpdateCheck.dialog.title = Update check
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.
settings.volume.dokany = Dokany
-unlock.errorMessage.invalidMountPath = Eigen koppel pad is niet ingevuld.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Eigen koppel pad is niet ingevuld.
+main.gracefulShutdown.dialog.title = Vergrendelen kluis/kluizen mislukt
+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.button.tryAgain = Probeer opnieuw
+main.gracefulShutdown.button.forceShutdown = Geforceerd afsluiten
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/pl.txt b/main/ui/src/main/resources/localization/pl.txt
index f81f1e092..40d50b081 100644
--- a/main/ui/src/main/resources/localization/pl.txt
+++ b/main/ui/src/main/resources/localization/pl.txt
@@ -2,51 +2,51 @@ app.name = Cryptomator
# main.fxml
main.emptyListInstructions = Kliknij tutaj, aby utworzyć nowy portfel
main.directoryList.contextMenu.remove = Usuń z listy
-main.directoryList.contextMenu.changePassword = Zmień hasło
-main.addDirectory.contextMenu.new = Stwórz nowy portfel
+main.directoryList.contextMenu.changePassword = Zmień Hasło
+main.addDirectory.contextMenu.new = Utwórz Nowy Portfel
main.addDirectory.contextMenu.open = Otwórz istniejący portfel
# welcome.fxml
welcome.checkForUpdates.label.currentlyChecking = Sprawdzanie aktualizacji...
welcome.newVersionMessage = Nowa wersja %1$s jest dostępna do pobrania.\nObecnie używana wersja to %2$s.
# initialize.fxml
initialize.label.password = Hasło
-initialize.label.retypePassword = Powtórz hasło
-initialize.button.ok = Stwórz portfel
+initialize.label.retypePassword = Powtórz Hasło
+initialize.button.ok = Utwórz Portfel
initialize.messageLabel.alreadyInitialized = Portfel został utworzony
-initialize.messageLabel.initializationFailed = Nie można utworzyć portfela. Szczegóły błędu znajdziesz w logach.
+initialize.messageLabel.initializationFailed = Nie można zainicjować portfela. Zobacz plik dziennika, aby poznać szczegóły.
# notfound.fxml
notfound.label = Nie znaleziono portfela. Może został przeniesiony?
# upgrade.fxml
-upgrade.button = Zaktualizuj portfel
-upgrade.version3dropBundleExtension.msg = Portfel musi zostać zaktualizowany do nowszego formatu.\n"%1$s" zostanie zmienione na "%2$s".\nZanim rozpoczniesz migracje upewnij się, że synchronizacja plików została ukończona.
-upgrade.version3dropBundleExtension.err.alreadyExists = Błąd automatycznej migracji portfela.\n"%s" już istnieje.
+upgrade.button = Zaktualizuj Portfel
+upgrade.version3dropBundleExtension.msg = Portfel musi zostać zaktualizowany do nowszego formatu.\n"%1$s" zostanie zmienione na "%2$s".\nPrzed kontynuowaniem upewnij się, że synchronizacja została zakończona.
+upgrade.version3dropBundleExtension.err.alreadyExists = Automatyczna migracja nie powiodła się.\n"%s" już istnieje.
# unlock.fxml
-unlock.label.password = Hasło do wolumenu
-unlock.label.mountName = Nazwa wolumenu
-unlock.label.winDriveLetter = Litera dysku
+unlock.label.password = Hasło
+unlock.label.mountName = Nazwa Napędu
+unlock.label.winDriveLetter = Litera Napędu
unlock.label.downloadsPageLink = Wszystkie wersje Cryptomatora
-unlock.label.advancedHeading = Opcje zaawansowane
-unlock.button.unlock = Odblokuj portfel
-unlock.button.advancedOptions.show = Więcej opcji
-unlock.button.advancedOptions.hide = Mniej opcji
+unlock.label.advancedHeading = Opcje Zaawansowane
+unlock.button.unlock = Odblokuj Portfel
+unlock.button.advancedOptions.show = Więcej Opcji
+unlock.button.advancedOptions.hide = Mniej Opcji
unlock.choicebox.winDriveLetter.auto = Przydziel automatycznie
unlock.errorMessage.wrongPassword = Nieprawidłowe hasło
-unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = Niewspierana wersja portfela. Ten portfel został utworzony przez starszą wersję Cryptomatora.
-unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = Niewspierana wersja portfela. Ten portfel został utworzony przez nowszą wersję Cryptomatora.
+unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = Nieobsługiwana wersja portfela. Ten portfel został utworzony przez starszą wersję Cryptomatora.
+unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = Nieobsługiwana wersja portfela. Ten portfel został utworzony przez nowszą wersję Cryptomatora.
unlock.messageLabel.startServerFailed = Nie udało się uruchomić serwera WebDAV.
# change_password.fxml
-changePassword.label.oldPassword = Stare hasło
-changePassword.label.newPassword = Nowe hasło
-changePassword.label.retypePassword = Powtórz hasło
+changePassword.label.oldPassword = Stare Hasło
+changePassword.label.newPassword = Nowe Hasło
+changePassword.label.retypePassword = Powtórz Hasło
changePassword.label.downloadsPageLink = Wszystkie wersje Cryptomatora
-changePassword.button.change = Zmień hasło
+changePassword.button.change = Zmień Hasło
changePassword.errorMessage.wrongPassword = Nieprawidłowe hasło
changePassword.errorMessage.decryptionFailed = Błąd odszyfrowywania
# unlocked.fxml
-unlocked.button.lock = Zabezpiecz portfel
-unlocked.moreOptions.reveal = Odkryj wolumen
-unlocked.label.revealFailed = Błąd odkrywania wolumenu
-unlocked.label.unmountFailed = Błąd odłączania wolumenu
+unlocked.button.lock = Blokuj Portfel
+unlocked.moreOptions.reveal = Odkryj Napęd
+unlocked.label.revealFailed = Polecenie nie powiodło się
+unlocked.label.unmountFailed = Wysuwanie napędu nie powiodło się
unlocked.label.statsEncrypted = szyfrowane
unlocked.label.statsDecrypted = nieszyfrowywane
unlocked.ioGraph.yAxis.label = Wydajność (MiB/s)
@@ -57,60 +57,66 @@ settings.requiresRestartLabel = * Cryptomator wymaga restartu
# tray icon
tray.menu.open = Otwórz
tray.menu.quit = Wyjdź
-tray.infoMsg.title = Wciąż działa
-tray.infoMsg.msg = Cryptomator wciąż jest uruchomiony. Aby go wyłączyć, użyj ikony z obszaru powiadomień.
-tray.infoMsg.msg.osx = Cryptomator wciąż jest uruchomiony. Aby go wyłączyć, użyj ikony z paska menu.
+tray.infoMsg.title = Nadal Uruchomiony
+tray.infoMsg.msg = Cryptomator jest nadal uruchomiony. Zamknij go z ikony z paska zadań.
+tray.infoMsg.msg.osx = Cryptomator jest nadal uruchomiony. Zamknij go z ikony z paska menu.
initialize.messageLabel.passwordStrength.0 = Bardzo słabe
initialize.messageLabel.passwordStrength.1 = Słabe
-initialize.messageLabel.passwordStrength.2 = W porządku
+initialize.messageLabel.passwordStrength.2 = Dostateczne
initialize.messageLabel.passwordStrength.3 = Mocne
initialize.messageLabel.passwordStrength.4 = Bardzo mocne
-initialize.label.doNotForget = WAŻNE\: Jeśli zapomnisz hasło, nie ma żadnej innej możliwości odzyskania Twouch danych.
-main.directoryList.remove.confirmation.title = Usuń portfel
+initialize.label.doNotForget = WAŻNE\: Jeśli zapomnisz hasło, nie ma żadnej innej możliwości odzyskania twoich danych.
+main.directoryList.remove.confirmation.title = Usuń Portfel
main.directoryList.remove.confirmation.header = Czy na pewno chcesz usunąć ten portfel?
-main.directoryList.remove.confirmation.content = Ten portfel zostanie usunięty tylko z listy. Jeśli chcesz trwale go usunąć, usuń pliki portfela z dysku.
-upgrade.version3to4.msg = Ten portfel wymaga aktualizacji do nowszej wersji. \nZaszyfrowane nazwy folderów zostaną zmienione.\nZanim rozoczniesz migracje upewnij się, że synchronizacja plików została ukończona.
-upgrade.version3to4.err.io = Błąd aktualizacji z powodu problemów z odczytem/zapisem. Szczegóły błędu znajdziesz w logach.
+main.directoryList.remove.confirmation.content = Ten portfel zostanie usunięty tylko z listy. Jeśli chcesz trwale go usunąć, usuń pliki portfela ze swojego systemu plików.
+upgrade.version3to4.msg = Ten portfel wymaga migracji do nowszego formatu.\nZaszyfrowane nazwy folderów zostaną zaktualizowane.\nPrzed kontynuowaniem upewnij się, że synchronizacja została zakończona.
+upgrade.version3to4.err.io = Migracja nie powiodła się z powodu wyjątku I/O. Zobacz plik dziennika, aby poznać szczegóły.
# upgrade.fxml
-upgrade.confirmation.label = Tak, synchronizacja plików na pewno została ukończona.
-unlock.label.savePassword = Zapisz hasło
+upgrade.confirmation.label = Tak, upewniłem się że synchronizacja plików została ukończona.
+unlock.label.savePassword = Zapisz Hasło
unlock.errorMessage.unauthenticVersionMac = Nie udało się uwierzytelnić wersji MAC
-unlocked.label.mountFailed = Błąd podłączanie dysku.
-unlock.savePassword.delete.confirmation.title = Usuń zapisane hasło
+unlocked.label.mountFailed = Nie udało się połączyć z napędem
+unlock.savePassword.delete.confirmation.title = Usuń Zapisane Hasło
unlock.savePassword.delete.confirmation.header = Czy na pewno chcesz usunąć zapisane hasło do tego portfela?
-unlock.savePassword.delete.confirmation.content = Zapisane hasło do tego portfela zostanie natychmiast usunięte z systemowego pęku kluczy. Jeśli chcesz zapisać hasło ponownie, zaloguj się do portfela z zaznaczoną opcją "Zapisz hasło".
-settings.debugMode.label = Tryb debugowania *
+unlock.savePassword.delete.confirmation.content = Zapisane hasło do tego portfela zostanie natychmiast usunięte z systemowego pęku kluczy. Jeśli chcesz ponownie zapisać hasło, musisz odblokować portfel z włączoną opcją "Zapisz hasło".
+settings.debugMode.label = Tryb Debugowania *
upgrade.version3dropBundleExtension.title = Aktualizacja portfela do wersji 3 (Drop Bundle Extension)
upgrade.version3to4.title = Aktualizacja portfela z wersji 3 do 4
upgrade.version4to5.title = Aktualizacja portfela z wersji 4 do 5
-upgrade.version4to5.msg = Ten portfel wymaga aktualizacji do nowszej wersji. \nZaszyfrowane nazwy folderów zostaną zmienione.\nZanim rozpoczniesz migracje, upewnij się, że synchronizacja plików została ukończona.\n\nUwaga\: W procesie aktualizacji data modyfikacji wszystkich plików zmieni się na biezącą datę/czas.
-upgrade.version4to5.err.io = Błąd aktualizacji z powodu problemów z odczytem/zapisem. Szczegóły błędu znajdziesz w logach.
-unlock.label.revealAfterMount = Pokaż dysk
+upgrade.version4to5.msg = Ten portfel wymaga migracji do nowszego formatu.\nZaszyfrowane pliki zostaną zaktualizowane.\nPrzed kontynuowaniem upewnij się, że synchronizacja została zakończona..\n\nUwaga\: Data modyfikacji wszystkich plików zostanie zmieniona w procesie na bieżącą datę/czas.
+upgrade.version4to5.err.io = Migracja nie powiodła się z powodu wyjątku I/O. Szczegóły błędu znajdziesz w dzienniku.
+unlock.label.revealAfterMount = Pokaż Napęd
unlocked.lock.force.confirmation.title = Zablokowywanie %1$s nie powiodło się
unlocked.lock.force.confirmation.header = Czy chcesz wymusić zablokowanie?
unlocked.lock.force.confirmation.content = Może się tak dziać dlatego, że inne programy wciąż korzystają z plików z portfela lub wystąpił inny problem.\n\nProgramy wciąż korzystające z plików mogą przestać działać poprawnie, a nie zapisane przez nie dane mogą zostać utracone.
unlock.label.unlockAfterStartup = Auto-odblokowywanie podczas uruchamiania (Eksperymentalne)
-unlock.errorMessage.unlockFailed = Błąd odblokowywania. Szczegóły błędu znajdziesz w logach.
-upgrade.version5toX.title = Aktualizacja wersji portfela
-upgrade.version5toX.msg = Ten portfel wymaga aktualizacji do nowszej wersji.\nZanim rozpoczniesz migracje upewnij się, że synchronizacja plików została ukończona.
+unlock.errorMessage.unlockFailed = Błąd odblokowywania. Szczegóły błędu znajdziesz w dzienniku.
+upgrade.version5toX.title = Aktualizacja Wersji Portfela
+upgrade.version5toX.msg = Ten portfel wymaga migracji do nowszego formatu.\nZanim rozpoczniesz migrację upewnij się, że synchronizacja plików została zakończona.
main.createVault.nonEmptyDir.title = Błąd podczas tworzenia portfela
main.createVault.nonEmptyDir.header = Wybrany katalog nie jest pusty
-main.createVault.nonEmptyDir.content = Wybrany katalog aktualnie zawiera pliki (prawdopodobnie ukryte). Portfel mozna utworzyć wyłącznie w puatym katalogu.
-unlock.label.mountPath = Mount path
-unlock.label.mountPathButton = Apply
-settings.webdav.port.label = WebDAV Port
-settings.webdav.port.prompt = 0 \= Choose automatically
-settings.webdav.port.apply = Apply
-settings.webdav.prefGvfsScheme.label = WebDAV Scheme
-settings.volume.label = Preferred Volume Type
+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.prompt = 0 \= Wybierz automatycznie
+settings.webdav.port.apply = Zastosuj
+settings.webdav.prefGvfsScheme.label = System WebDAV
+settings.volume.label = Preferowany Typ Woluminu
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
-unlock.successLabel.vaultCreated = Vault was successfully created.
-unlock.successLabel.passwordChanged = Password was successfully changed.
-unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
-unlock.label.useOwnMountPath = Use individual mount point
-welcome.askForUpdateCheck.dialog.title = Update check
-welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+unlock.successLabel.vaultCreated = Portfel został pomyślnie utworzony.
+unlock.successLabel.passwordChanged = Hasło zostało pomyślnie zmienione.
+unlock.successLabel.upgraded = Cryptomator został pomyślnie zaktualizowany.
+unlock.label.useOwnMountPath = Użyj indywidualnego punktu montowania
+welcome.askForUpdateCheck.dialog.title = Sprawdź aktualizację
+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ń.
settings.volume.dokany = Dokany
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+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.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.button.tryAgain = Spróbuj ponownie
+main.gracefulShutdown.button.forceShutdown = Wymuś zamknięcie
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/pt.txt b/main/ui/src/main/resources/localization/pt.txt
index d8848c820..06ac6d717 100644
--- a/main/ui/src/main/resources/localization/pt.txt
+++ b/main/ui/src/main/resources/localization/pt.txt
@@ -73,7 +73,7 @@ upgrade.version3to4.msg = Esse cofre tem que ser migrado a um novo formato. Os n
upgrade.version3to4.err.io = Falha na migração devido a um erro de E/S. Veja o arquivo de log para mais detalhes.
# upgrade.fxml
upgrade.confirmation.label = Sim, tenho certeza de que a sincronização foi concluída
-unlock.label.savePassword = Armazenar senha
+unlock.label.savePassword = Salvar senha
unlock.errorMessage.unauthenticVersionMac = Não foi possível autenticar a versão do MAC.
unlocked.label.mountFailed = Falha ao conectar o drive
unlock.savePassword.delete.confirmation.title = Apagar a senha armazenada
@@ -105,12 +105,18 @@ settings.webdav.prefGvfsScheme.label = WebDAV schema
settings.volume.label = Método de Montagem
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
-unlock.successLabel.vaultCreated = Vault was successfully created.
-unlock.successLabel.passwordChanged = Password was successfully changed.
-unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
-unlock.label.useOwnMountPath = Use individual mount point
-welcome.askForUpdateCheck.dialog.title = Update check
-welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+unlock.successLabel.vaultCreated = Cofre criado com sucesso
+unlock.successLabel.passwordChanged = Senha modificada com sucesso
+unlock.successLabel.upgraded = Crytomator atualizado com sucesso
+unlock.label.useOwnMountPath = Usar Ponto de Montagem Personalizado
+welcome.askForUpdateCheck.dialog.title = Verificação de atualização
+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.
settings.volume.dokany = Dokany
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+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.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.button.tryAgain = Tente novamente
+main.gracefulShutdown.button.forceShutdown = Forçar desligamento
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/pt_BR.txt b/main/ui/src/main/resources/localization/pt_BR.txt
index 6761daff0..14052eccc 100644
--- a/main/ui/src/main/resources/localization/pt_BR.txt
+++ b/main/ui/src/main/resources/localization/pt_BR.txt
@@ -43,7 +43,7 @@ changePassword.button.change = Alterar senha
changePassword.errorMessage.wrongPassword = Senha errada
changePassword.errorMessage.decryptionFailed = Descriptografia falhou
# unlocked.fxml
-unlocked.button.lock = Travar Cofre
+unlocked.button.lock = Trancar Cofre
unlocked.moreOptions.reveal = Mostrar volume
unlocked.label.revealFailed = Falha no comando
unlocked.label.unmountFailed = A ejeção do volume falhou
@@ -108,9 +108,15 @@ settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Cofre foi criado com sucesso.
unlock.successLabel.passwordChanged = Senha for trocada com sucesso.
unlock.successLabel.upgraded = Cryptomator foi atualizado com sucesso.
-unlock.label.useOwnMountPath = Use individual mount point
-welcome.askForUpdateCheck.dialog.title = Update check
-welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+unlock.label.useOwnMountPath = Usar ponto de montagem individual
+welcome.askForUpdateCheck.dialog.title = Checar 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.
settings.volume.dokany = Dokany
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Caminho para montagem individual não configurado.
+main.gracefulShutdown.dialog.title = Falha ao trancar o cofre
+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.button.tryAgain = Tente novamente
+main.gracefulShutdown.button.forceShutdown = Forçar término da execução
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/ru.txt b/main/ui/src/main/resources/localization/ru.txt
index 0fe0b8506..2244a5bd6 100644
--- a/main/ui/src/main/resources/localization/ru.txt
+++ b/main/ui/src/main/resources/localization/ru.txt
@@ -120,4 +120,10 @@ welcome.askForUpdateCheck.dialog.title = Проверка обновлений
welcome.askForUpdateCheck.dialog.header = Включить встроенную проверку обновлений?
welcome.askForUpdateCheck.dialog.content = Для проверки наличия обновлений Cryptomator будет получать номер текущей версии со своих серверов и показывать подсказку, что доступна более новая версия.\n\nРекомендуем включить проверку обновлений, чтобы быть уверенным, что у вас всегда новейшая версия программы, содержащая все патчи безопасности. Если вы не хотите включать проверку обновлений, то проверить наличие новой версии и загрузить её можно по адресу https\://cryptomator.org/downloads/\n\nЭтот параметр можно всегда изменить в настройках программы.
settings.volume.dokany = Dokany
-unlock.errorMessage.invalidMountPath = Не установлен индивидуальный путь монтирования.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Не установлен индивидуальный путь монтирования.
+main.gracefulShutdown.dialog.title = Ошибка блокировки хранилища
+main.gracefulShutdown.dialog.header = Используемые хранилища
+main.gracefulShutdown.dialog.content = Одно или несколько хранилищ всё ещё используются другими программами. Закройте их, чтобы Cryptomator мог корректно завершить работу, и повторите попытку.\n\nЕсли это не поможет, Cryptomator может завершить работу принудительно, но с риском потери данных, и потому это не рекомендуется.
+main.gracefulShutdown.button.tryAgain = Попробовать снова
+main.gracefulShutdown.button.forceShutdown = Принудительно завершить работу
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/sk.txt b/main/ui/src/main/resources/localization/sk.txt
index 59ec035de..28f3734f2 100644
--- a/main/ui/src/main/resources/localization/sk.txt
+++ b/main/ui/src/main/resources/localization/sk.txt
@@ -111,9 +111,15 @@ settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
-unlock.label.useOwnMountPath = Use individual mount point
+unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
+main.gracefulShutdown.dialog.title = Locking vault(s) failed
+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.button.tryAgain = Try again
+main.gracefulShutdown.button.forceShutdown = Force shutdown
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/th.txt b/main/ui/src/main/resources/localization/th.txt
index ae481f22a..329a09017 100644
--- a/main/ui/src/main/resources/localization/th.txt
+++ b/main/ui/src/main/resources/localization/th.txt
@@ -108,9 +108,15 @@ settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
-unlock.label.useOwnMountPath = Use individual mount point
+unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
+main.gracefulShutdown.dialog.title = Locking vault(s) failed
+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.button.tryAgain = Try again
+main.gracefulShutdown.button.forceShutdown = Force shutdown
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/tr.txt b/main/ui/src/main/resources/localization/tr.txt
index d8ccc3d52..eefce0671 100644
--- a/main/ui/src/main/resources/localization/tr.txt
+++ b/main/ui/src/main/resources/localization/tr.txt
@@ -108,9 +108,15 @@ settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
-unlock.label.useOwnMountPath = Use individual mount point
+unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
+main.gracefulShutdown.dialog.title = Locking vault(s) failed
+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.button.tryAgain = Try again
+main.gracefulShutdown.button.forceShutdown = Force shutdown
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/uk.txt b/main/ui/src/main/resources/localization/uk.txt
index 2c6a48d19..113ccdce4 100644
--- a/main/ui/src/main/resources/localization/uk.txt
+++ b/main/ui/src/main/resources/localization/uk.txt
@@ -72,45 +72,51 @@ main.directoryList.remove.confirmation.content = Сховище буде вид
upgrade.version3to4.msg = Це сховище необхідно перетворити в новий формат. Зашифровані імена папок будуть оновлені. Перш ніж продовжити, виконайте синхронізацію.
upgrade.version3to4.err.io = Перетворення невдале через помилку введення-виведення. Дивіться деталі в файлі-звіті.
# upgrade.fxml
-upgrade.confirmation.label = Yes, I've made sure that synchronization has finished
-unlock.label.savePassword = Save Password
-unlock.errorMessage.unauthenticVersionMac = Could not authenticate version MAC.
-unlocked.label.mountFailed = Connecting drive failed
-unlock.savePassword.delete.confirmation.title = Delete Saved Password
-unlock.savePassword.delete.confirmation.header = Do you really want to delete the saved password of this vault?
-unlock.savePassword.delete.confirmation.content = The saved password of this vault will be immediately deleted from your system keychain. If you'd like to save your password again, you'd have to unlock your vault with the "Save Password" option enabled.
-settings.debugMode.label = Debug Mode *
-upgrade.version3dropBundleExtension.title = Vault Version 3 Upgrade (Drop Bundle Extension)
-upgrade.version3to4.title = Vault Version 3 to 4 Upgrade
-upgrade.version4to5.title = Vault Version 4 to 5 Upgrade
-upgrade.version4to5.msg = This vault needs to be migrated to a newer format.\nEncrypted files will be updated.\nPlease make sure synchronization has finished before proceeding.\n\nNote\: Modification date of all files will be changed to the current date/time in the process.
-upgrade.version4to5.err.io = Migration failed due to an I/O Exception. See log file for details.
-unlock.label.revealAfterMount = Reveal Drive
-unlocked.lock.force.confirmation.title = Locking of %1$s failed
-unlocked.lock.force.confirmation.header = Do you want to force locking?
-unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost.
-unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental)
-unlock.errorMessage.unlockFailed = Unlock failed. See log file for details.
-upgrade.version5toX.title = Vault Version Upgrade
-upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding.
-main.createVault.nonEmptyDir.title = Creating vault failed
-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.
-unlock.label.mountPath = Mount path
-unlock.label.mountPathButton = Apply
-settings.webdav.port.label = WebDAV Port
-settings.webdav.port.prompt = 0 \= Choose automatically
-settings.webdav.port.apply = Apply
-settings.webdav.prefGvfsScheme.label = WebDAV Scheme
-settings.volume.label = Preferred Volume Type
+upgrade.confirmation.label = Так, я переконався, що синхронізація завершена
+unlock.label.savePassword = Зберегти пароль
+unlock.errorMessage.unauthenticVersionMac = Неможливо перевірити справжність версії MAC.
+unlocked.label.mountFailed = Не вдалося підключити диск
+unlock.savePassword.delete.confirmation.title = Видалити збережений пароль
+unlock.savePassword.delete.confirmation.header = Ви дійсно хочете видалити збережений пароль цього сховища?
+unlock.savePassword.delete.confirmation.content = Збережений пароль цього сховища буде негайно видалено з вашого системної в'язки ключів. Якщо ви хочете знову зберегти свій пароль, вам потрібно буде розблокувати свої сховище з опцією "Зберегти пароль".
+settings.debugMode.label = Режим налагодження *
+upgrade.version3dropBundleExtension.title = Оновлення 3 версії сховища (Розширення пакету)
+upgrade.version3to4.title = Оновлення сховища з версії 3 на 4
+upgrade.version4to5.title = Оновлення сховища з версії 4 на 5
+upgrade.version4to5.msg = Це сховище потрібно перетворити в більш новий формат. Зашифровані файли будуть оновлені. Будь ласка, переконайтеся, що синхронізація завершена, перш ніж продовжувати.\nПримітка. Дата зміни всіх файлів буде змінена на поточну дату/час в процесі перевторення.
+upgrade.version4to5.err.io = Перетворення не виконано із-за помилок вводу-виводу. Перегляньте деталі в файлі журналу.
+unlock.label.revealAfterMount = Відкрити Диск
+unlocked.lock.force.confirmation.title = Заблокувати %1$s не вдалося
+unlocked.lock.force.confirmation.header = Ви хочете зупинити блокування?
+unlocked.lock.force.confirmation.content = Це може бути тому, що інші програми все ще отримують доступ до файлів у сховище або через деяку іншу проблему.\nПрограми, які все ще мають доступ до файлів, можуть працювати некоректно, а дані, які ще не написані цими програмами, можуть бути втрачені.
+unlock.label.unlockAfterStartup = Авто-розблокування при Запуску (експериментальна)
+unlock.errorMessage.unlockFailed = Розблокувати не вдалося. Детальніше перегляньте файл журналу.
+upgrade.version5toX.title = Оновлення версії сховища
+upgrade.version5toX.msg = Це сховище потрібно перконвертувати в більш новий формат.\nБудь ласка, переконайтеся, що синхронізація завершена, перш ніж продовжувати.
+main.createVault.nonEmptyDir.title = Створення сховища не вдалося
+main.createVault.nonEmptyDir.header = Вибраний каталог не порожній
+main.createVault.nonEmptyDir.content = Вибрана директорія вже містить файли (можливо, приховані). Сховище можна створити лише у порожньому каталозі.
+unlock.label.mountPath = Шлях монтування
+unlock.label.mountPathButton = Застосувати
+settings.webdav.port.label = Порт WebDAV
+settings.webdav.port.prompt = 0 \= автовибір
+settings.webdav.port.apply = Застосувати
+settings.webdav.prefGvfsScheme.label = Схема WebDAV\n
+settings.volume.label = Метод монтування*
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
-unlock.successLabel.vaultCreated = Vault was successfully created.
-unlock.successLabel.passwordChanged = Password was successfully changed.
-unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
-unlock.label.useOwnMountPath = Use individual mount point
-welcome.askForUpdateCheck.dialog.title = Update check
-welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
-settings.volume.dokany = Dokany
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.successLabel.vaultCreated = Сховище успішно створено.
+unlock.successLabel.passwordChanged = Пароль успішно змінено.
+unlock.successLabel.upgraded = Cryptomator був успішно оновлений.
+unlock.label.useOwnMountPath = Використати Користувацьку Точку Монтування
+welcome.askForUpdateCheck.dialog.title = Перевірити оновлення
+welcome.askForUpdateCheck.dialog.header = Включити інтегровану перевірку оновлень?
+welcome.askForUpdateCheck.dialog.content = Щоб перевірити наявність оновлень, Cryptomator буде завантажувати поточну версію з серверів Cryptomator і показувати підказку, якщо доступна нова версія.\nМи рекомендуємо ввімкнути перевірку оновлень, щоб завжди бути впевненим, що ви встановили найновішу версію Cryptomator з усіма оновленнями безпеки. Якщо ви не ввімкнули перевірку оновлень, ви можете перевірити та завантажити поточну версію за адресою https\://cryptomator.org/downloads/.\nВи можете будь-коли змінити це налаштування.
+settings.volume.dokany = Віртуальна файлова система
+unlock.errorMessage.invalidMountPath = Користувацьку опцію монтування не встановлено.
+main.gracefulShutdown.dialog.title = Блокування сховищ(а) не вдалося
+main.gracefulShutdown.dialog.header = Сховища(е) використовуються
+main.gracefulShutdown.dialog.content = Один або декілька сховищ все ще використовуються іншими програмами. Закрийте їх, щоб дозволити Cryptomator безпечно завершити роботу, а потім повторіть спробу.\nЯкщо це не спрацьовує, Cryptomator може примусово завершити роботу, але це може призвести до втрати даних, це нелогічно та не рекомендується.
+main.gracefulShutdown.button.tryAgain = Спробуйте ще раз
+main.gracefulShutdown.button.forceShutdown = Примусово завершити роботу
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/zh.txt b/main/ui/src/main/resources/localization/zh.txt
index 054a1e4f0..8bb95277a 100644
--- a/main/ui/src/main/resources/localization/zh.txt
+++ b/main/ui/src/main/resources/localization/zh.txt
@@ -114,4 +114,10 @@ welcome.askForUpdateCheck.dialog.title = 检查更新
welcome.askForUpdateCheck.dialog.header = 启用更新检查?
welcome.askForUpdateCheck.dialog.content = 启用检查更新,Cryptomator将从Cryptomator服务器获取当前版本,并在有新版本时提示。\n我们建议您启用更新检查,以确保安装了最新版的Cryptomator,并安装了所有安全补丁。如果您未启用更新检查,则需要您自己到https\://cryptomator.org/downloads/ 检查并下载最新版本。\n你可以随时在设置中更改此设置。
settings.volume.dokany = Dokany
-unlock.errorMessage.invalidMountPath = 未设置单独的挂载路径
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = 未设置单独的挂载路径
+main.gracefulShutdown.dialog.title = Locking vault(s) failed
+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.button.tryAgain = Try again
+main.gracefulShutdown.button.forceShutdown = Force shutdown
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/zh_HK.txt b/main/ui/src/main/resources/localization/zh_HK.txt
index e81e10f08..dc464dda8 100644
--- a/main/ui/src/main/resources/localization/zh_HK.txt
+++ b/main/ui/src/main/resources/localization/zh_HK.txt
@@ -108,9 +108,15 @@ settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
-unlock.label.useOwnMountPath = Use individual mount point
+unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
+main.gracefulShutdown.dialog.title = Locking vault(s) failed
+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.button.tryAgain = Try again
+main.gracefulShutdown.button.forceShutdown = Force shutdown
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/zh_TW.txt b/main/ui/src/main/resources/localization/zh_TW.txt
index 423231c86..de2297a30 100644
--- a/main/ui/src/main/resources/localization/zh_TW.txt
+++ b/main/ui/src/main/resources/localization/zh_TW.txt
@@ -111,6 +111,12 @@ unlock.successLabel.upgraded = Cryptomator成功的更新了
unlock.label.useOwnMountPath = 自訂掛載點
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
-welcome.askForUpdateCheck.dialog.content = To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https\://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings.
+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
-unlock.errorMessage.invalidMountPath = Individual mount path is not set.
\ No newline at end of file
+unlock.errorMessage.invalidMountPath = Use of custom mount path selected, but no path given.
+main.gracefulShutdown.dialog.title = Locking vault(s) failed
+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.button.tryAgain = Try again
+main.gracefulShutdown.button.forceShutdown = Force shutdown
+unlock.pendingMessage.unlocking = Unlocking vault...
\ No newline at end of file
diff --git a/main/ui/src/test/java/org/cryptomator/ui/l10n/LocalizationTest.java b/main/ui/src/test/java/org/cryptomator/ui/l10n/LocalizationTest.java
index 9a8061c23..9644d103f 100644
--- a/main/ui/src/test/java/org/cryptomator/ui/l10n/LocalizationTest.java
+++ b/main/ui/src/test/java/org/cryptomator/ui/l10n/LocalizationTest.java
@@ -31,7 +31,7 @@ public class LocalizationTest {
private static final Logger LOG = LoggerFactory.getLogger(LocalizationTest.class);
private static final String RESOURCE_FOLDER_PATH = "/localization/";
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"};
/*