diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 000000000..31b43f7cd
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,131 @@
+name: Build
+
+on:
+ [push]
+
+jobs:
+ test:
+ name: Run Tests
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up JDK 14
+ uses: actions/setup-java@v1
+ with:
+ java-version: 14
+ - uses: actions/cache@v1
+ with:
+ path: ~/.m2/repository
+ key: ${{ runner.os }}-maven-${{ github.run_id }}
+ restore-keys: |
+ ${{ runner.os }}-maven-
+ - name: Ensure to use tagged version
+ run: mvn versions:set --file main/pom.xml -DnewVersion=${GITHUB_REF##*/} # use shell parameter expansion to strip of 'refs/tags'
+ if: startsWith(github.ref, 'refs/tags/')
+ - name: Build with Maven
+ run: mvn -B install --file main/pom.xml -Pcoverage
+ - name: Run Codacy Coverage Reporter
+ run: |
+ curl -o ~/codacy-coverage-reporter.jar https://repo.maven.apache.org/maven2/com/codacy/codacy-coverage-reporter/7.1.0/codacy-coverage-reporter-7.1.0-assembly.jar
+ $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/commons/target/site/jacoco/jacoco.xml --partial
+ $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/keychain/target/site/jacoco/jacoco.xml --partial
+ $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/ui/target/site/jacoco/jacoco.xml --partial
+ $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/launcher/target/site/jacoco/jacoco.xml --partial
+ $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar final
+ env:
+ CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
+
+ assemble-build-kit:
+ name: Assemble Build Kit
+ runs-on: ubuntu-latest
+ needs: test
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up JDK 14
+ uses: actions/setup-java@v1
+ with:
+ java-version: 14
+ - uses: actions/cache@v1
+ with:
+ path: ~/.m2/repository
+ key: ${{ runner.os }}-maven-${{ github.run_id }}
+ - name: Ensure to use tagged version
+ run: mvn versions:set --file main/pom.xml -DnewVersion=${GITHUB_REF##*/} # use shell parameter expansion to strip of 'refs/tags'
+ if: startsWith(github.ref, 'refs/tags/')
+ - name: Build with Maven
+ run: mvn -B package -DskipTests --file main/pom.xml --resume-from=buildkit -Prelease
+ - name: Upload buildkit-linux.zip
+ uses: actions/upload-artifact@v1
+ with:
+ name: buildkit-linux.zip
+ path: main/buildkit/target/buildkit-linux.zip
+ - name: Upload buildkit-mac.zip
+ uses: actions/upload-artifact@v1
+ with:
+ name: buildkit-mac.zip
+ path: main/buildkit/target/buildkit-mac.zip
+ - name: Upload buildkit-win.zip
+ uses: actions/upload-artifact@v1
+ with:
+ name: buildkit-win.zip
+ path: main/buildkit/target/buildkit-win.zip
+
+ github-release:
+ name: Draft a Release on GitHub Releases
+ runs-on: ubuntu-latest
+ needs: assemble-build-kit
+ if: startsWith(github.ref, 'refs/tags/')
+ steps:
+ - name: Download buildkit-linux.zip
+ uses: actions/download-artifact@v1
+ with:
+ name: buildkit-linux.zip
+ path: .
+ - name: Download buildkit-mac.zip
+ uses: actions/download-artifact@v1
+ with:
+ name: buildkit-mac.zip
+ path: .
+ - name: Download buildkit-win.zip
+ uses: actions/download-artifact@v1
+ with:
+ name: buildkit-win.zip
+ path: .
+ - id: create_release
+ uses: actions/create-release@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ tag_name: ${{ github.ref }}
+ release_name: ${{ github.ref }}
+ body: |
+ TODO
+ draft: true
+ prerelease: true
+ - name: Upload buildkit-linux.zip to GitHub Releases
+ uses: actions/upload-release-asset@v1.0.1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
+ asset_path: buildkit-linux.zip
+ asset_name: buildkit-linux.zip
+ asset_content_type: application/zip
+ - name: Upload buildkit-mac.zip to GitHub Releases
+ uses: actions/upload-release-asset@v1.0.1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
+ asset_path: buildkit-mac.zip
+ asset_name: buildkit-mac.zip
+ asset_content_type: application/zip
+ - name: Upload buildkit-win.zip to GitHub Releases
+ uses: actions/upload-release-asset@v1.0.1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
+ asset_path: buildkit-win.zip
+ asset_name: buildkit-win.zip
+ asset_content_type: application/zip
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 000000000..727c7b1bb
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index c20d5a34e..eab8a318e 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -8,7 +8,7 @@
-
+
\ No newline at end of file
diff --git a/.travis-deploy-release.tmpl.json b/.travis-deploy-release.tmpl.json
deleted file mode 100644
index 435e3dd82..000000000
--- a/.travis-deploy-release.tmpl.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "package": {
- "name": "buildkit",
- "repo": "cryptomator",
- "subject": "cryptomator"
- },
- "version": {
- "name": "$TRAVIS_TAG",
- "desc": "Cryptomator version $TRAVIS_TAG",
- "released": "$TODAY",
- "vcs_tag": "$TRAVIS_TAG",
- "gpgSign": true
- },
- "files":
- [
- {"includePattern": "main/buildkit/target/(buildkit-[a-z]+\\.zip)", "uploadPattern": "/$TRAVIS_TAG/$1"}
- ],
- "publish": true
-}
diff --git a/.travis-deploy-snapshot.json b/.travis-deploy-snapshot.json
deleted file mode 100644
index fa3897a4d..000000000
--- a/.travis-deploy-snapshot.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "package": {
- "name": "buildkit",
- "repo": "cryptomator",
- "subject": "cryptomator"
- },
- "version": {
- "name": "snapshot"
- },
- "files":
- [
- {"includePattern": "main/buildkit/target/(buildkit-[a-z]+\\.zip)", "uploadPattern": "/snapshot/$1", "matrixParams": {"override": 1}}
- ],
- "publish": true
-}
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 41f912fa8..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,65 +0,0 @@
-dist: bionic
-language: java
-sudo: false
-jdk:
-- openjdk11
-cache:
- directories:
- - $HOME/.m2
-env:
- global:
- - 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:
- apt:
- packages:
- - haveged
-install:
-# - curl -o $HOME/.m2/settings.xml https://gist.githubusercontent.com/cryptobot/cf5fbd909c4782aaeeeb7c7f4a1a43da/raw/e60ee486e34ee0c79f89f947abe2c83b4290c6bb/settings.xml
-- mvn -fmain/pom.xml clean install -DskipTests -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN org.codehaus.mojo:versions-maven-plugin:help dependency:go-offline -Pcoverage,release # "clean install" needed until we can exclude artifacts currently in the reactor, see https://maven.apache.org/plugins/maven-dependency-plugin/go-offline-mojo.html#excludeReactor and https://issues.apache.org/jira/browse/MDEP-568
-before_script:
-- |
- if [[ -n "$TRAVIS_TAG" ]]; then
- mvn -fmain/pom.xml org.codehaus.mojo:versions-maven-plugin:set -DnewVersion=$TRAVIS_TAG
- else
- mvn -fmain/pom.xml org.codehaus.mojo:versions-maven-plugin:set -DnewVersion=SNAPSHOT-$(echo $TRAVIS_COMMIT | head -c7)
- fi
-script:
-- mvn --update-snapshots -fmain/pom.xml clean test verify -Pcoverage
-after_success:
-- curl -o ~/codacy-coverage-reporter.jar https://repo.maven.apache.org/maven2/com/codacy/codacy-coverage-reporter/7.1.0/codacy-coverage-reporter-7.1.0-assembly.jar
-- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/commons/target/site/jacoco/jacoco.xml --partial
-- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/keychain/target/site/jacoco/jacoco.xml --partial
-- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/ui/target/site/jacoco/jacoco.xml --partial
-- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/launcher/target/site/jacoco/jacoco.xml --partial
-- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar final
-before_deploy:
-- mvn -fmain/pom.xml package -Prelease -DskipTests
-- export TODAY=`date +'%Y-%m-%d'`; envsubst '$TRAVIS_TAG $TODAY' < .travis-deploy-release.tmpl.json > .travis-deploy-release.json
-deploy:
-- provider: bintray # SNAPSHOTS
- file: .travis-deploy-snapshot.json
- user: cryptobot
- key: $BINTRAY_API_KEY
- skip_cleanup: true
- on:
- repo: cryptomator/cryptomator
- branch: develop
-- provider: bintray # RELEASES
- file: .travis-deploy-release.json
- user: cryptobot
- key: $BINTRAY_API_KEY
- skip_cleanup: true
- on:
- repo: cryptomator/cryptomator
- tags: true
-- provider: releases
- api_key: $GITHUB_API_KEY
- file_glob: true
- file:
- - "main/buildkit/target/buildkit-*.zip"
- skip_cleanup: true
- on:
- repo: cryptomator/cryptomator
- tags: true
\ No newline at end of file
diff --git a/README.md b/README.md
index 2f8c79a3d..a8a7248cd 100644
--- a/README.md
+++ b/README.md
@@ -15,6 +15,10 @@ Cryptomator is provided free of charge as an open-source project despite the hig
- [One-time or recurring donation via Cryptomator's website.](https://cryptomator.org/#donate)
- [Become a sponsor via Cryptomator's sponsors website.](https://cryptomator.org/sponsors/)
+### Gold Sponsors
+
+[
](https://www.gee-whiz.de/)
+
### Silver Sponsors
[](https://thebestvpn.com/)
@@ -55,7 +59,7 @@ Download native binaries of Cryptomator on [cryptomator.org](https://cryptomator
### Security Architecture
-For more information on the security details visit [cryptomator.org](https://cryptomator.org/architecture/).
+For more information on the security details visit [cryptomator.org](https://docs.cryptomator.org/en/latest/security/architecture/).
## Building
diff --git a/main/buildkit/pom.xml b/main/buildkit/pom.xml
index b763fdd2c..b29cb977d 100644
--- a/main/buildkit/pom.xml
+++ b/main/buildkit/pom.xml
@@ -4,7 +4,7 @@
org.cryptomator
main
- 1.5.0
+ 1.5.1
buildkit
pom
diff --git a/main/commons/pom.xml b/main/commons/pom.xml
index 2e7e88a2a..fd6b0aea0 100644
--- a/main/commons/pom.xml
+++ b/main/commons/pom.xml
@@ -4,7 +4,7 @@
org.cryptomator
main
- 1.5.0
+ 1.5.1
commons
Cryptomator Commons
diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/SettingsProvider.java b/main/commons/src/main/java/org/cryptomator/common/settings/SettingsProvider.java
index 7bb7aefa0..390e40f5a 100644
--- a/main/commons/src/main/java/org/cryptomator/common/settings/SettingsProvider.java
+++ b/main/commons/src/main/java/org/cryptomator/common/settings/SettingsProvider.java
@@ -10,7 +10,9 @@ package org.cryptomator.common.settings;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
+import com.google.gson.JsonParser;
import org.cryptomator.common.Environment;
import org.cryptomator.common.LazyInitializer;
import org.slf4j.Logger;
@@ -77,12 +79,15 @@ public class SettingsProvider implements Supplier {
LOG.debug("Attempting to load settings from {}", path);
try (InputStream in = Files.newInputStream(path, StandardOpenOption.READ); //
Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) {
- Settings settings = gson.fromJson(reader, Settings.class);
- if (settings == null) {
- throw new IOException("Unexpected EOF");
+ JsonElement json = JsonParser.parseReader(reader);
+ if (json.isJsonObject()) {
+ Settings settings = gson.fromJson(json, Settings.class);
+ LOG.info("Settings loaded from {}", path);
+ return Stream.of(settings);
+ } else {
+ LOG.warn("Invalid json file {}", path);
+ return Stream.empty();
}
- LOG.info("Settings loaded from {}", path);
- return Stream.of(settings);
} catch (NoSuchFileException e) {
return Stream.empty();
} catch (IOException e) {
diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java b/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java
index 6e35ffab2..e9e0fbd6d 100644
--- a/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java
+++ b/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java
@@ -27,6 +27,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
+import javax.inject.Named;
import javax.inject.Provider;
import java.io.IOException;
import java.nio.file.NoSuchFileException;
@@ -51,6 +52,7 @@ public class Vault {
private final StringBinding defaultMountFlags;
private final AtomicReference cryptoFileSystem;
private final ObjectProperty state;
+ private final ObjectProperty lastKnownException;
private final VaultStats stats;
private final StringBinding displayableName;
private final StringBinding displayablePath;
@@ -59,18 +61,20 @@ public class Vault {
private final BooleanBinding unlocked;
private final BooleanBinding missing;
private final BooleanBinding needsMigration;
+ private final BooleanBinding unknownError;
private final StringBinding accessPoint;
private final BooleanBinding accessPointPresent;
private volatile Volume volume;
@Inject
- Vault(VaultSettings vaultSettings, Provider volumeProvider, @DefaultMountFlags StringBinding defaultMountFlags, AtomicReference cryptoFileSystem, ObjectProperty state, VaultStats stats) {
+ Vault(VaultSettings vaultSettings, Provider volumeProvider, @DefaultMountFlags StringBinding defaultMountFlags, AtomicReference cryptoFileSystem, ObjectProperty state, @Named("lastKnownException") ObjectProperty lastKnownException, VaultStats stats) {
this.vaultSettings = vaultSettings;
this.volumeProvider = volumeProvider;
this.defaultMountFlags = defaultMountFlags;
this.cryptoFileSystem = cryptoFileSystem;
this.state = state;
+ this.lastKnownException = lastKnownException;
this.stats = stats;
this.displayableName = Bindings.createStringBinding(this::getDisplayableName, vaultSettings.path());
this.displayablePath = Bindings.createStringBinding(this::getDisplayablePath, vaultSettings.path());
@@ -79,6 +83,7 @@ public class Vault {
this.unlocked = Bindings.createBooleanBinding(this::isUnlocked, state);
this.missing = Bindings.createBooleanBinding(this::isMissing, state);
this.needsMigration = Bindings.createBooleanBinding(this::isNeedsMigration, state);
+ this.unknownError = Bindings.createBooleanBinding(this::isUnknownError, state);
this.accessPoint = Bindings.createStringBinding(this::getAccessPoint, state);
this.accessPointPresent = this.accessPoint.isNotEmpty();
}
@@ -149,6 +154,18 @@ public class Vault {
state.setValue(value);
}
+ public ObjectProperty lastKnownExceptionProperty() {
+ return lastKnownException;
+ }
+
+ public Exception getLastKnownException() {
+ return lastKnownException.get();
+ }
+
+ public void setLastKnownException(Exception e) {
+ lastKnownException.setValue(e);
+ }
+
public BooleanBinding lockedProperty() {
return locked;
}
@@ -189,6 +206,14 @@ public class Vault {
return state.get() == VaultState.NEEDS_MIGRATION;
}
+ public BooleanBinding unknownErrorProperty() {
+ return unknownError;
+ }
+
+ public boolean isUnknownError() {
+ return state.get() == VaultState.ERROR;
+ }
+
public StringBinding displayableNameProperty() {
return displayableName;
}
diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultComponent.java b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultComponent.java
index 58abd2d37..98a9f951d 100644
--- a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultComponent.java
+++ b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultComponent.java
@@ -10,6 +10,9 @@ import org.cryptomator.common.settings.VaultSettings;
import dagger.Subcomponent;
+import javax.annotation.Nullable;
+import javax.inject.Named;
+
@PerVault
@Subcomponent(modules = {VaultModule.class})
public interface VaultComponent {
@@ -25,6 +28,9 @@ public interface VaultComponent {
@BindsInstance
Builder initialVaultState(VaultState vaultState);
+ @BindsInstance
+ Builder initialErrorCause(@Nullable @Named("lastKnownException") Exception initialErrorCause);
+
VaultComponent build();
}
diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultListManager.java b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultListManager.java
index 521ca4658..09bd60c77 100644
--- a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultListManager.java
+++ b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultListManager.java
@@ -14,6 +14,8 @@ import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.cryptofs.CryptoFileSystemProvider;
import org.cryptomator.cryptofs.migration.Migrators;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -29,7 +31,9 @@ import static org.cryptomator.common.Constants.MASTERKEY_FILENAME;
@Singleton
public class VaultListManager {
-
+
+ private static final Logger LOG = LoggerFactory.getLogger(VaultListManager.class);
+
private final VaultComponent.Builder vaultComponentBuilder;
private final ObservableList vaultList;
@@ -37,7 +41,7 @@ public class VaultListManager {
public VaultListManager(VaultComponent.Builder vaultComponentBuilder, Settings settings) {
this.vaultComponentBuilder = vaultComponentBuilder;
this.vaultList = FXCollections.observableArrayList(Vault::observables);
-
+
addAll(settings.getDirectories());
vaultList.addListener(new VaultListChangeListener(settings.getDirectories()));
}
@@ -61,12 +65,12 @@ public class VaultListManager {
return newVault;
}
}
-
+
private void addAll(Collection vaultSettings) {
Collection vaults = vaultSettings.stream().map(this::create).collect(Collectors.toList());
vaultList.addAll(vaults);
}
-
+
private Optional get(Path vaultPath) {
return vaultList.stream().filter(v -> {
try {
@@ -78,22 +82,25 @@ public class VaultListManager {
}
private Vault create(VaultSettings vaultSettings) {
- VaultState vaultState = determineVaultState(vaultSettings.path().get());
- VaultComponent comp = vaultComponentBuilder.vaultSettings(vaultSettings).initialVaultState(vaultState).build();
- return comp.vault();
+ VaultComponent.Builder compBuilder = vaultComponentBuilder.vaultSettings(vaultSettings);
+ try {
+ VaultState vaultState = determineVaultState(vaultSettings.path().get());
+ compBuilder.initialVaultState(vaultState);
+ } catch (IOException e) {
+ LOG.warn("Failed to determine vault state for " + vaultSettings.path().get(), e);
+ compBuilder.initialVaultState(VaultState.ERROR);
+ compBuilder.initialErrorCause(e);
+ }
+ return compBuilder.build().vault();
}
- public static VaultState determineVaultState(Path pathToVault) {
- try {
- if (!CryptoFileSystemProvider.containsVault(pathToVault, MASTERKEY_FILENAME)) {
- return VaultState.MISSING;
- } else if (Migrators.get().needsMigration(pathToVault, MASTERKEY_FILENAME)) {
- return VaultState.NEEDS_MIGRATION;
- } else {
- return VaultState.LOCKED;
- }
- } catch (IOException e) {
- return VaultState.ERROR;
+ public static VaultState determineVaultState(Path pathToVault) throws IOException {
+ if (!CryptoFileSystemProvider.containsVault(pathToVault, MASTERKEY_FILENAME)) {
+ return VaultState.MISSING;
+ } else if (Migrators.get().needsMigration(pathToVault, MASTERKEY_FILENAME)) {
+ return VaultState.NEEDS_MIGRATION;
+ } else {
+ return VaultState.LOCKED;
}
}
diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultModule.java b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultModule.java
index f9c6b9177..1afd9d88b 100644
--- a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultModule.java
+++ b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultModule.java
@@ -23,6 +23,8 @@ import org.cryptomator.cryptofs.CryptoFileSystem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.annotation.Nullable;
+import javax.inject.Named;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -46,6 +48,14 @@ public class VaultModule {
return new SimpleObjectProperty<>(initialState);
}
+ @Provides
+ @Named("lastKnownException")
+ @PerVault
+ public ObjectProperty provideLastKnownException(@Named("lastKnownException") @Nullable Exception initialErrorCause) {
+ return new SimpleObjectProperty<>(initialErrorCause);
+ }
+
+
@Provides
public Volume provideVolume(Settings settings, WebDavVolume webDavVolume, FuseVolume fuseVolume, DokanyVolume dokanyVolume) {
VolumeImpl preferredImpl = settings.preferredVolumeImpl().get();
diff --git a/main/commons/src/test/java/org/cryptomator/common/settings/SettingsJsonAdapterTest.java b/main/commons/src/test/java/org/cryptomator/common/settings/SettingsJsonAdapterTest.java
index 1d31e9cea..347ec1e45 100644
--- a/main/commons/src/test/java/org/cryptomator/common/settings/SettingsJsonAdapterTest.java
+++ b/main/commons/src/test/java/org/cryptomator/common/settings/SettingsJsonAdapterTest.java
@@ -7,6 +7,8 @@ package org.cryptomator.common.settings;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
import java.io.IOException;
@@ -34,4 +36,16 @@ public class SettingsJsonAdapterTest {
Assertions.assertEquals(VolumeImpl.FUSE, settings.preferredVolumeImpl().get());
}
+ @ParameterizedTest(name = "fromJson() should throw IOException for input: {0}")
+ @ValueSource(strings = {
+ "",
+ "",
+ "{invalidjson}"
+ })
+ public void testDeserializeMalformed(String input) {
+ Assertions.assertThrows(IOException.class, () -> {
+ adapter.fromJson(input);
+ });
+ }
+
}
diff --git a/main/keychain/pom.xml b/main/keychain/pom.xml
index ee87d5163..7b99f1730 100644
--- a/main/keychain/pom.xml
+++ b/main/keychain/pom.xml
@@ -4,7 +4,7 @@
org.cryptomator
main
- 1.5.0
+ 1.5.1
keychain
System Keychain Access
diff --git a/main/launcher/pom.xml b/main/launcher/pom.xml
index 962160c6f..ef3d74d4c 100644
--- a/main/launcher/pom.xml
+++ b/main/launcher/pom.xml
@@ -4,7 +4,7 @@
org.cryptomator
main
- 1.5.0
+ 1.5.1
launcher
Cryptomator Launcher
diff --git a/main/pom.xml b/main/pom.xml
index 5d58a60ef..dbb5c18eb 100644
--- a/main/pom.xml
+++ b/main/pom.xml
@@ -3,7 +3,7 @@
4.0.0
org.cryptomator
main
- 1.5.0
+ 1.5.1
pom
Cryptomator
@@ -24,7 +24,7 @@
UTF-8
- 1.9.5
+ 1.9.7
2.2.2
1.2.3
1.1.13
@@ -331,7 +331,7 @@
maven-compiler-plugin
3.8.1
- 11
+ 14
com.google.dagger
diff --git a/main/ui/pom.xml b/main/ui/pom.xml
index 2ced5b191..364d66d62 100644
--- a/main/ui/pom.xml
+++ b/main/ui/pom.xml
@@ -4,7 +4,7 @@
org.cryptomator
main
- 1.5.0
+ 1.5.1
ui
Cryptomator GUI
diff --git a/main/ui/src/main/java/org/cryptomator/ui/common/ErrorModule.java b/main/ui/src/main/java/org/cryptomator/ui/common/ErrorModule.java
index 9b272a585..27a51c00b 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/common/ErrorModule.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/common/ErrorModule.java
@@ -21,10 +21,11 @@ abstract class ErrorModule {
static FXMLLoaderFactory provideFxmlLoaderFactory(Map, Provider> factories, DefaultSceneFactory sceneFactory, ResourceBundle resourceBundle) {
return new FXMLLoaderFactory(factories, sceneFactory, resourceBundle);
}
-
+
@Provides
@Named("stackTrace")
static String provideStackTrace(Throwable cause) {
+ // TODO deduplicate VaultDetailUnknownErrorController.java
ByteArrayOutputStream baos = new ByteArrayOutputStream();
cause.printStackTrace(new PrintStream(baos));
return baos.toString(StandardCharsets.UTF_8);
diff --git a/main/ui/src/main/java/org/cryptomator/ui/controls/NiceSecurePasswordField.java b/main/ui/src/main/java/org/cryptomator/ui/controls/NiceSecurePasswordField.java
index d23951a4b..497913e65 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/controls/NiceSecurePasswordField.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/controls/NiceSecurePasswordField.java
@@ -1,5 +1,6 @@
package org.cryptomator.ui.controls;
+import javafx.beans.Observable;
import javafx.beans.binding.Bindings;
import javafx.beans.property.StringProperty;
import javafx.geometry.Pos;
@@ -55,19 +56,24 @@ public class NiceSecurePasswordField extends StackPane {
passwordField.revealPasswordProperty().bind(revealPasswordButton.selectedProperty());
getChildren().addAll(passwordField, iconContainer);
+ disabledProperty().addListener(this::disabledChanged);
}
private FontAwesome5Icon getRevealPasswordGlyph() {
return revealPasswordButton.isSelected() ? FontAwesome5Icon.EYE_SLASH : FontAwesome5Icon.EYE;
}
+ private void disabledChanged(@SuppressWarnings("unused") Observable observable) {
+ revealPasswordButton.setSelected(false);
+ }
+
/* Passthrough */
@Override
public void requestFocus() {
passwordField.requestFocus();
}
-
+
public String getText() {
return passwordField.getText();
}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java
index 5043fa485..04a047424 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java
@@ -6,13 +6,9 @@ import dagger.Provides;
import dagger.multibindings.IntoMap;
import javafx.scene.Scene;
import javafx.scene.image.Image;
-import javafx.scene.input.KeyCode;
-import javafx.scene.input.KeyCodeCombination;
-import javafx.scene.input.KeyCombination;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent;
-import org.cryptomator.ui.common.DefaultSceneFactory;
import org.cryptomator.ui.common.FXMLLoaderFactory;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.common.FxControllerKey;
@@ -87,7 +83,7 @@ abstract class MainWindowModule {
@IntoMap
@FxControllerKey(VaultDetailController.class)
abstract FxController bindVaultDetailController(VaultDetailController controller);
-
+
@Binds
@IntoMap
@FxControllerKey(WelcomeController.class)
@@ -102,7 +98,7 @@ abstract class MainWindowModule {
@IntoMap
@FxControllerKey(VaultDetailUnlockedController.class)
abstract FxController bindVaultDetailUnlockedController(VaultDetailUnlockedController controller);
-
+
@Binds
@IntoMap
@FxControllerKey(VaultDetailMissingVaultController.class)
@@ -113,11 +109,15 @@ abstract class MainWindowModule {
@FxControllerKey(VaultDetailNeedsMigrationController.class)
abstract FxController bindVaultDetailNeedsMigrationController(VaultDetailNeedsMigrationController controller);
+ @Binds
+ @IntoMap
+ @FxControllerKey(VaultDetailUnknownErrorController.class)
+ abstract FxController bindVaultDetailUnknownErrorController(VaultDetailUnknownErrorController controller);
+
@Binds
@IntoMap
@FxControllerKey(VaultListCellController.class)
abstract FxController bindVaultListCellController(VaultListCellController controller);
-
}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnknownErrorController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnknownErrorController.java
new file mode 100644
index 000000000..4c23ba4ae
--- /dev/null
+++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnknownErrorController.java
@@ -0,0 +1,40 @@
+package org.cryptomator.ui.mainwindow;
+
+import javafx.beans.binding.Binding;
+import javafx.beans.property.ObjectProperty;
+import org.cryptomator.common.vaults.Vault;
+import org.cryptomator.ui.common.FxController;
+import org.fxmisc.easybind.EasyBind;
+
+import javax.inject.Inject;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.nio.charset.StandardCharsets;
+
+@MainWindowScoped
+public class VaultDetailUnknownErrorController implements FxController {
+
+ private final Binding stackTrace;
+
+ @Inject
+ public VaultDetailUnknownErrorController(ObjectProperty vault) {
+ this.stackTrace = EasyBind.select(vault).selectObject(Vault::lastKnownExceptionProperty).map(this::provideStackTrace).orElse("");
+ }
+
+ private String provideStackTrace(Throwable cause) {
+ // TODO deduplicate ErrorModule.java
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ cause.printStackTrace(new PrintStream(baos));
+ return baos.toString(StandardCharsets.UTF_8);
+ }
+
+ /* Getter/Setter */
+
+ public Binding stackTraceProperty() {
+ return stackTrace;
+ }
+
+ public String getStackTrace() {
+ return stackTrace.getValue();
+ }
+}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java
index 167138e0f..625a10e65 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java
@@ -18,6 +18,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
+import java.io.IOException;
@MainWindowScoped
public class VaultListController implements FxController {
@@ -68,8 +69,14 @@ public class VaultListController implements FxController {
case LOCKED:
case NEEDS_MIGRATION:
case MISSING:
- VaultState determinedState = VaultListManager.determineVaultState(newValue.getPath());
- newValue.setState(determinedState);
+ try {
+ VaultState determinedState = VaultListManager.determineVaultState(newValue.getPath());
+ newValue.setState(determinedState);
+ } catch (IOException e) {
+ LOG.warn("Failed to determine vault state for " + newValue.getPath(), e);
+ newValue.setState(VaultState.ERROR);
+ newValue.setLastKnownException(e);
+ }
break;
case ERROR:
case UNLOCKED:
diff --git a/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationRunController.java b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationRunController.java
index 826fa6053..d7340618d 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationRunController.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationRunController.java
@@ -99,6 +99,7 @@ public class MigrationRunController implements FxController {
LOG.info("Migrating vault {}", vault.getPath());
CharSequence password = passwordField.getCharacters();
vault.setState(VaultState.PROCESSING);
+ passwordField.setDisable(true);
ScheduledFuture> progressSyncTask = scheduler.scheduleAtFixedRate(() -> {
Platform.runLater(() -> {
migrationProgress.set(volatileMigrationProgress);
@@ -120,6 +121,7 @@ public class MigrationRunController implements FxController {
}
}).onError(InvalidPassphraseException.class, e -> {
Animations.createShakeWindowAnimation(window).play();
+ passwordField.setDisable(false);
passwordField.selectAll();
passwordField.requestFocus();
vault.setState(VaultState.NEEDS_MIGRATION);
@@ -133,6 +135,7 @@ public class MigrationRunController implements FxController {
vault.setState(VaultState.NEEDS_MIGRATION);
errorComponent.cause(e).window(window).returnToScene(startScene.get()).build().showErrorScene();
}).andFinally(() -> {
+ passwordField.setDisable(false);
progressSyncTask.cancel(true);
}).runOnce(executor);
}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockController.java b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockController.java
index f06a03621..d725fd0ea 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockController.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockController.java
@@ -4,7 +4,6 @@ import dagger.Lazy;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.ObjectBinding;
import javafx.beans.property.BooleanProperty;
-import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.concurrent.Task;
@@ -30,7 +29,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
-import javax.inject.Named;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.NotDirectoryException;
import java.util.Arrays;
@@ -90,9 +88,11 @@ public class UnlockController implements FxController {
public void unlock() {
LOG.trace("UnlockController.unlock()");
CharSequence password = passwordField.getCharacters();
-
+
Task task = vaultService.createUnlockTask(vault, password);
+ passwordField.setDisable(true);
task.setOnSucceeded(event -> {
+ passwordField.setDisable(false);
if (keychainAccess.isPresent() && savePassword.isSelected()) {
try {
keychainAccess.get().storePassphrase(vault.getId(), password);
@@ -105,12 +105,12 @@ public class UnlockController implements FxController {
window.setScene(successScene.get());
});
task.setOnFailed(event -> {
+ passwordField.setDisable(false);
if (task.getException() instanceof InvalidPassphraseException) {
Animations.createShakeWindowAnimation(window).play();
passwordField.selectAll();
passwordField.requestFocus();
- } else if (task.getException() instanceof NotDirectoryException
- || task.getException() instanceof DirectoryNotEmptyException) {
+ } else if (task.getException() instanceof NotDirectoryException || task.getException() instanceof DirectoryNotEmptyException) {
LOG.error("Unlock failed. Mount point not an empty directory: {}", task.getException().getMessage());
window.setScene(invalidMountPointScene.get());
} else {
diff --git a/main/ui/src/main/resources/fxml/vault_detail.fxml b/main/ui/src/main/resources/fxml/vault_detail.fxml
index 349db1f4c..e171e0887 100644
--- a/main/ui/src/main/resources/fxml/vault_detail.fxml
+++ b/main/ui/src/main/resources/fxml/vault_detail.fxml
@@ -52,5 +52,6 @@
+
diff --git a/main/ui/src/main/resources/fxml/vault_detail_unknownerror.fxml b/main/ui/src/main/resources/fxml/vault_detail_unknownerror.fxml
new file mode 100644
index 000000000..4c33a67f0
--- /dev/null
+++ b/main/ui/src/main/resources/fxml/vault_detail_unknownerror.fxml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/main/ui/src/main/resources/fxml/vault_detail_welcome.fxml b/main/ui/src/main/resources/fxml/vault_detail_welcome.fxml
index 2712354ec..31e5f174c 100644
--- a/main/ui/src/main/resources/fxml/vault_detail_welcome.fxml
+++ b/main/ui/src/main/resources/fxml/vault_detail_welcome.fxml
@@ -13,8 +13,8 @@
-
-
+
+
diff --git a/main/ui/src/main/resources/fxml/wrongfilealert.fxml b/main/ui/src/main/resources/fxml/wrongfilealert.fxml
index 35b218ecd..3e665f6db 100644
--- a/main/ui/src/main/resources/fxml/wrongfilealert.fxml
+++ b/main/ui/src/main/resources/fxml/wrongfilealert.fxml
@@ -49,7 +49,7 @@
-
+
diff --git a/main/ui/src/main/resources/i18n/strings.properties b/main/ui/src/main/resources/i18n/strings.properties
index 5c30df295..66d0fdf54 100644
--- a/main/ui/src/main/resources/i18n/strings.properties
+++ b/main/ui/src/main/resources/i18n/strings.properties
@@ -191,7 +191,7 @@ wrongFileAlert.instruction.0=To encrypt files, follow these steps:
wrongFileAlert.instruction.1=1. Unlock your vault.
wrongFileAlert.instruction.2=2. Click on "Reveal" to open the volume in your file manager.
wrongFileAlert.instruction.3=3. Add your files to this volume.
-wrongFileAlert.link=For futher assistance, visit
+wrongFileAlert.link=For further assistance, visit
# Vault Options
## General
diff --git a/main/ui/src/main/resources/i18n/strings_ar.properties b/main/ui/src/main/resources/i18n/strings_ar.properties
index 4d1ae099b..60cb6712b 100644
--- a/main/ui/src/main/resources/i18n/strings_ar.properties
+++ b/main/ui/src/main/resources/i18n/strings_ar.properties
@@ -190,7 +190,7 @@ wrongFileAlert.instruction.0=لتشفير الملفات، قم باتباع ا
wrongFileAlert.instruction.1=1. فتح المخزن الخاص بك.
wrongFileAlert.instruction.2=2. انقر على "إظهار" لفتح المجلد في مدير الملفات الخاص بك.
wrongFileAlert.instruction.3=3. أضف ملفاتك إلى هذا المجلد.
-wrongFileAlert.link=للحصول على مساعدة اضافية، قم بزيارة
+wrongFileAlert.link=لمزيد من المساعدة، قم بزيارة
# Vault Options
## General
diff --git a/main/ui/src/main/resources/i18n/strings_ca.properties b/main/ui/src/main/resources/i18n/strings_ca.properties
new file mode 100644
index 000000000..ee82230d2
--- /dev/null
+++ b/main/ui/src/main/resources/i18n/strings_ca.properties
@@ -0,0 +1,241 @@
+# Locale Specific CSS files such as CJK, RTL,...
+
+# Generics
+## Button
+generic.button.apply=Aplica
+generic.button.back=Enrere
+generic.button.cancel=Cancel·la
+generic.button.change=Canvia
+generic.button.close=Tanca
+generic.button.copy=Copia
+generic.button.copied=Copiat!
+generic.button.done=Fet
+generic.button.next=Següent
+generic.button.print=Imprimeix
+## Error
+generic.error.title=S'ha produït un error inesperat
+generic.error.instruction=Això no hauria d'haver passat. Si us plau, informeu del text de l'error i inclogueu una descripció de quins passos han dut a aquest error.
+
+# Tray Menu
+traymenu.showMainWindow=Mostra
+traymenu.showPreferencesWindow=Preferències
+traymenu.lockAllVaults=Bloqueja tot
+traymenu.quitApplication=Surt
+traymenu.vault.unlock=Desbloqueja
+traymenu.vault.lock=Bloqueja
+traymenu.vault.reveal=Mostra
+
+# Add Vault Wizard
+addvaultwizard.title=Afegir una caixa forta
+## Welcome
+addvaultwizard.welcome.newButton=Crea una caixa forta nova
+addvaultwizard.welcome.existingButton=Obri una caixa forta existent
+## New
+### Name
+addvaultwizard.new.nameInstruction=Introduiu el nom de la caixa forta
+addvaultwizard.new.namePrompt=Nom de la caixa forta
+### Location
+addvaultwizard.new.locationInstruction=On deu emmagatzemar Cryptomator els fitxers xifrats de la vostra caixa forta?
+addvaultwizard.new.locationLabel=Ubicació de l'emmagatzematge
+addvaultwizard.new.locationPrompt=…
+addvaultwizard.new.directoryPickerLabel=Ubicació personalitzada
+addvaultwizard.new.directoryPickerButton=Trieu…
+addvaultwizard.new.directoryPickerTitle=Seleccioneu el directori
+addvaultwizard.new.fileAlreadyExists=No es pot crear una caixa forta en aquest camí perquè ja hi ha algun objecte.
+addvaultwizard.new.invalidName=El nom de la caixa forta no és vàlid. Si us plau, escribiu un mom de directori amb caràcters estàndard.
+### Password
+addvaultwizard.new.createVaultBtn=Crea la caixa forta
+addvaultwizard.new.generateRecoveryKeyChoice=No podreu accedir a les vostres dades sense la contrasenya. Voleu crear una clau de recuperació en cas perdre la vostra contrasenya?
+addvaultwizard.new.generateRecoveryKeyChoice.yes=Sí, si us plau. Val més prevenir que guarir.
+addvaultwizard.new.generateRecoveryKeyChoice.no=No, gràcies. No predré la meva contrasenya
+### Information
+addvault.new.readme.storageLocation.fileName=IMPORTANT.rtf
+addvault.new.readme.storageLocation.1=⚠️ FITXERS DE LA CAIXA FORTA ⚠️
+addvault.new.readme.storageLocation.2=Aquesta és la ubicació d'emmagatzematge de la vostra caixa forta.
+addvault.new.readme.storageLocation.3=NO
+addvault.new.readme.storageLocation.4=• modifiqueu cap fitxer dins d'aquest directori ni
+addvault.new.readme.storageLocation.5=• enganxeu cap fitxer a xifrar en aquest directori.
+addvault.new.readme.storageLocation.6=Si voleu xifrar fitxers i veure el contigut de la caixa forta, feu el següent:
+addvault.new.readme.storageLocation.7=1. Afegiu aquesta caixa forta a Cryptomator.
+addvault.new.readme.storageLocation.8=2. Desbloquejeu la caixa forta enCryptomator.
+addvault.new.readme.storageLocation.9=3. Feu click damunt del botó "Mostra" per obrir la ubicació d'accès.
+addvault.new.readme.storageLocation.10=Si us cal ajuda, llegiu la documentació: %s
+addvault.new.readme.accessLocation.fileName=BENVINGUTS.rtf
+addvault.new.readme.accessLocation.1=🔐️ VOLUM XIFRAT 🔐️
+addvault.new.readme.accessLocation.2=Aquesta és la ubicació d'accès de la vostra caixa forta.
+addvault.new.readme.accessLocation.3=Cryptomator xifra tots els fitxers afegits a aquest volum. Podeu treballar en aquest volum com en qualsevol altra unitat o carpeta. La vista mostra el contingut desxifrat però els fitxers sempre estan xifrats en el vostre disc dur.
+addvault.new.readme.accessLocation.4=Pots esborrar aquest fitxer si vols.
+## Existing
+addvaultwizard.existing.instruction=Seleccioneu el fitxer "masterkey.cryptomator" de la vostra caixa forta.
+addvaultwizard.existing.chooseBtn=Trieu…
+addvaultwizard.existing.filePickerTitle=Seleccioneu el fitxer Masterkey
+## Success
+addvaultwizard.success.nextStepsInstructions=S'ha afegit la caixa forta "%s".\nHeu de desbloquejar-la si voleu accedir-hi o afegir nou contingut. També podeu desbloquejar-la en qualsevol altre moment.
+addvaultwizard.success.unlockNow=Desbloqueja ara
+
+# Remove Vault
+removeVault.title=Elimina la caixa forta
+removeVault.information=Cryptomator simplement deixarà de mostrar la caixa forta. Podeu tornar a afegir-la més endavant. Cap fitxer xifrat serà eliminat del disc dur.
+removeVault.confirmBtn=Elimina la caixa forta
+
+# Change Password
+changepassword.title=Canvia la contrasenya
+changepassword.enterOldPassword=Introduïu la contrasenya actual per a "%s"
+changepassword.finalConfirmation=Entenc que no podré accedir les meves dades si oblido la meva contrasenya
+
+# Forget Password
+forgetPassword.title=He oblidat la contrasenya
+forgetPassword.information=Això eliminarà la contrasenya desada d'aquesta caixa forta del vostre clauer.
+forgetPassword.confirmBtn=He oblidat la contrasenya
+
+# Unlock
+unlock.title=Desbloquejar la caixa forta
+unlock.passwordPrompt=Introduïu la contrasenya de "%s":
+unlock.savePassword=Recorda la contrasenya
+unlock.unlockBtn=Desbloqueja
+## Success
+unlock.success.message="%s" s'ha desbloquejat correctament! Ja es pot accedir a la caixa forta.
+unlock.success.revealBtn=Mostra la caixa forta
+## Invalid Mount Point
+unlock.error.invalidMountPoint=El punt de muntatge no és un directori buit: %s
+
+# Migration
+migration.title=Actualitza la caixa forta
+## Start
+migration.start.prompt=La vostra caixa forta "%s" ha de ser actualitzada a un format més nou. Abans de continuar, assegureu-vos de que no hi haja cap sincronització pendent que puga afectar a aquesta caixa forta.
+migration.start.confirm=Sí, la meua caixa forta està completament sicronitzada
+## Run
+migration.run.enterPassword=Introduïu la contrasenya per a "%s"
+migration.run.startMigrationBtn=Migrar la caixa forta
+## Sucess
+migration.success.nextStepsInstructions="%s" s'ha migrat correctament.\nJa podeu desbloquejar la vostra caixa forta.
+migration.success.unlockNow=Desbloqueja ara
+## Missing file system capabilities
+migration.error.missingFileSystemCapabilities.title=El sistema de fitxers no és admès
+migration.error.missingFileSystemCapabilities.description=La migració no s'ha iniciat perquè la vostra caixa forta es troba en un sistema de fitxers no compatible.
+migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=El sistema de fitxers no suporta noms de fitxers llargs.
+migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=El sistema de fitxers no suporta camins llargs.
+
+# Preferences
+preferences.title=Preferències
+## General
+preferences.general=General
+preferences.general.theme=Apariència
+preferences.general.unlockThemes=Desbloqueja el tema fosc
+preferences.general.startHidden=Amaga la finestra al iniciar Cryptomator
+preferences.general.debugLogging=Habilita el registre de depuració
+preferences.general.autoStart=Executa Cryptomator en engegar el sistema
+preferences.general.interfaceOrientation=Orientació de la interfície
+preferences.general.interfaceOrientation.ltr=Esquerra a dreta
+preferences.general.interfaceOrientation.rtl=Dreta a esquerra
+## Volume
+preferences.volume=Unitat virtual
+preferences.volume.type=Tipus de volum
+preferences.volume.webdav.port=Port WebDAV
+preferences.volume.webdav.scheme=Esquema WebDAV
+## Updates
+preferences.updates=Actualitzacions
+preferences.updates.currentVersion=Versió actual: %s
+preferences.updates.autoUpdateCheck=Comprova automàticament si hi ha actualitzacions
+preferences.updates.checkNowBtn=Comprova-ho ara
+preferences.updates.updateAvailable=L'actualització a la versió %s es troba disponible.
+## Donation Key
+preferences.donationKey=Donacions
+preferences.donationKey.registeredFor=Registrat per %s
+preferences.donationKey.noDonationKey=No s'ha trobar una clau de donació vàlida. És sembla a una clau de llicència però per gent meravellosa qui utilitza programari lliure. ;-)
+preferences.donationKey.getDonationKey=Obtingau una clau de donació
+## About
+preferences.about=Quant a
+
+# Main Window
+main.closeBtn.tooltip=Tanca
+main.minimizeBtn.tooltip=Minimitza
+main.preferencesBtn.tooltip=Preferències
+main.donationKeyMissing.tooltip=Si us plau, considereu fer una donació
+## Drag 'n' Drop
+main.dropZone.dropVault=Afegeix aquesta caixa forta
+main.dropZone.unknownDragboardContent=Si voleu afegir una caixa forta, arrossegueu-la a aquesta finestra
+## Vault List
+main.vaultlist.emptyList.onboardingInstruction=Feu clic aquí per afegir una caixa forta
+main.vaultlist.contextMenu.remove=Elimina la caixa forta
+main.vaultlist.addVaultBtn=Afegir una caixa forta
+## Vault Detail
+### Welcome
+main.vaultDetail.welcomeOnboarding=Gràcies per escollir Cryptomator per protegir els vostres fitxers. Si vos cal ajuda, llegiu les nostres guies per donar els Primers passos:
+### Locked
+main.vaultDetail.lockedStatus=BLOQUEJADA
+main.vaultDetail.unlockBtn=Desbloqueja
+main.vaultDetail.optionsBtn=Opcions de la caixa forta
+### Unlocked
+main.vaultDetail.unlockedStatus=DESBLOQUEJADA
+main.vaultDetail.accessLocation=Els continguts de la vostra caixa forta són accessibles aquí:
+main.vaultDetail.revealBtn=Mostra la unitat
+main.vaultDetail.lockBtn=Bloqueja
+main.vaultDetail.bytesPerSecondRead=lectura:
+main.vaultDetail.bytesPerSecondWritten=escriptura:
+main.vaultDetail.throughput.idle=inactiu
+main.vaultDetail.throughput.kbps=%.1f kiB/s
+main.vaultDetail.throughput.mbps=%.1f MiB/s
+### Missing
+main.vaultDetail.missing.info=Cryptomator no ha trobat una caixa forta en aquest camí.
+### Needs Migration
+main.vaultDetail.migrateButton=Actualitza la caixa forta
+main.vaultDetail.migratePrompt=Per accedir a la vostra caixa forta abans cal actualitzar-la al nou format
+
+# Wrong File Alert
+wrongFileAlert.title=Com xifrar fitxers
+wrongFileAlert.header.title=Heu intentat xifrar aquests fitxers?
+wrongFileAlert.header.lead=Per aconseguir tal fi, Cryptomator crea un volum en el vostre gestor de fitxers del sistema.
+wrongFileAlert.instruction.0=Sigau aquests pasos per xifrar fitxers:
+wrongFileAlert.instruction.1=1. Desbloquejeu la caixa forta.
+wrongFileAlert.instruction.2=2. Feu clic en "Mostrar" per obrir el volum en el vostre gestor de fitxers.
+wrongFileAlert.instruction.3=3. Afegiu fitxers al volum.
+wrongFileAlert.link=Per rebre assistència, visiteu
+
+# Vault Options
+## General
+vaultOptions.general=General
+vaultOptions.general.unlockAfterStartup=Desbloqueja la caixa forta al iniciar Cryptomator
+## Mount
+vaultOptions.mount=Muntatge
+vaultOptions.mount.readonly=Només lectura
+vaultOptions.mount.driveName=Nom de la unitat
+vaultOptions.mount.customMountFlags=Senyaladors de muntatge personalitzats
+vaultOptions.mount.winDriveLetterOccupied=ocupat
+vaultOptions.mount.mountPoint=Punt de muntatge
+vaultOptions.mount.mountPoint.auto=Tria automàticament una ubicació adequada
+vaultOptions.mount.mountPoint.driveLetter=Utilitza la lletra de la unitat assignada
+vaultOptions.mount.mountPoint.custom=Camí personalitzat
+vaultOptions.mount.mountPoint.directoryPickerButton=Trieu…
+vaultOptions.mount.mountPoint.directoryPickerTitle=Esculliu un directori buit
+## Master Key
+vaultOptions.masterkey=Contrasenya
+vaultOptions.masterkey.changePasswordBtn=Canvi de contrasenya
+vaultOptions.masterkey.recoveryKeyExpanation=La clau de recuperació és l'unic mitjà de restaurar l'accès a la caixa forta en cas de perdre la contrasenya.
+vaultOptions.masterkey.showRecoveryKeyBtn=Mostra la clau de recuperació
+vaultOptions.masterkey.recoverPasswordBtn=Recupera la contrasenya
+
+# Recovery Key
+recoveryKey.title=Clau de recuperació
+recoveryKey.enterPassword.prompt=Introduïu la vostra clau per mostrar la clau de recuperació de "%s":
+recoveryKey.display.message=Utilitzeu la següent clau de recuperació per restaurar l'accès a "%s":
+recoveryKey.display.StorageHints=Conserveu-la en un lloc molt segur. P. ex.:\n • Emmagatzemeu-la utilitzant un gestor de claus\n • Deseu-la en una memòria USB\n • Imprimiu-la en paper
+recoveryKey.recover.prompt=Introduïu la vostra clau de recuperació de "%s":
+recoveryKey.recover.validKey=La clau de recuperació és vàlida
+recoveryKey.printout.heading=Clau de recuperació de Cryptomator\n"%s"\n
+
+# New Password
+newPassword.promptText=Introdueix una contrasenya nova
+newPassword.reenterPassword=Confirma la nova contrasenya
+newPassword.passwordsMatch=Les contrasenyes coincideixen!
+newPassword.passwordsDoNotMatch=Les contrasenyes no coincideixen
+passwordStrength.messageLabel.tooShort=Cal un mínim de %d caràcters
+passwordStrength.messageLabel.0=Molt poc segura
+passwordStrength.messageLabel.1=Poc segura
+passwordStrength.messageLabel.2=Suficient
+passwordStrength.messageLabel.3=Segura
+passwordStrength.messageLabel.4=Molt segura
+
+# Quit
+quit.prompt=Sortir de l'aplicació? Hi ha voltes debloquejades.
+quit.lockAndQuit=Bloqueja i surt
diff --git a/main/ui/src/main/resources/i18n/strings_cs.properties b/main/ui/src/main/resources/i18n/strings_cs.properties
index ba0655c8b..1a89dcc64 100644
--- a/main/ui/src/main/resources/i18n/strings_cs.properties
+++ b/main/ui/src/main/resources/i18n/strings_cs.properties
@@ -59,6 +59,7 @@ addvault.new.readme.storageLocation.6=Pokud chcete zašifrovat soubory a zobrazi
addvault.new.readme.storageLocation.7=1. Přidejte tento trezor do Cryptomator.
addvault.new.readme.storageLocation.8=2. Odemkněte trezor v Cryptomator.
addvault.new.readme.storageLocation.9=3. Otevřete umístění přístupu kliknutím na tlačítko "Reveal".
+addvault.new.readme.storageLocation.10=Pokud potřebujete pomoc, navštivte dokumentaci: %s
addvault.new.readme.accessLocation.fileName=VÍTEJ.rtf
addvault.new.readme.accessLocation.1=🔐️ ZAŠIFROVANÁ JEDNOTKA 🔐️
addvault.new.readme.accessLocation.2=Toto je místo přístupu vašeho trezoru.
@@ -80,6 +81,7 @@ removeVault.confirmBtn=Odstranit trezor
# Change Password
changepassword.title=Změnit heslo
changepassword.enterOldPassword=Zadejte současné heslo pro "%s"
+changepassword.finalConfirmation=Chápu, že pokud zapomenu své heslo, nebudu mít přístup k mým datům
# Forget Password
forgetPassword.title=Zapomenout heslo
@@ -143,6 +145,7 @@ preferences.donationKey.registeredFor=Registrováno na: %s
preferences.donationKey.noDonationKey=Nebyl nalezen žádný platný darovací klíč. Je to jako licenční klíč, ale pro úžasné lidi využívající software zadarmo. ;-)
preferences.donationKey.getDonationKey=Získat darovací klíč
## About
+preferences.about=O aplikaci
# Main Window
main.closeBtn.tooltip=Zavřít
@@ -153,7 +156,7 @@ main.donationKeyMissing.tooltip=Prosím, zvažte darování
main.dropZone.dropVault=Přidat tento trezor
main.dropZone.unknownDragboardContent=Pokud chcete přidat trezor, přetáhněte jej do tohoto okna
## Vault List
-main.vaultlist.emptyList.onboardingInstruction=Klikněte sem pro přidání nového trezoru
+main.vaultlist.emptyList.onboardingInstruction=Klikněte zde pro přidání nového trezoru
main.vaultlist.contextMenu.remove=Odstranit trezor
main.vaultlist.addVaultBtn=Přidat trezor
## Vault Detail
@@ -180,6 +183,14 @@ main.vaultDetail.migrateButton=Upgrade trezoru
main.vaultDetail.migratePrompt=Váš trezor musí být aktualizován na nový formát, než k němu budete mít přístup
# Wrong File Alert
+wrongFileAlert.title=Jak šifrovat soubory
+wrongFileAlert.header.title=Pokusili jste se tyto soubory zašifrovat?
+wrongFileAlert.header.lead=Pro tento účel Cryptomator vytvoří jednotku ve vašem systémovém správci souborů.
+wrongFileAlert.instruction.0=Pro zašifrování souborů postupujte následovně:
+wrongFileAlert.instruction.1=1. Odemkni svůj trezor.
+wrongFileAlert.instruction.2=2. Klikněte na "Zobrazit" pro otevření jednotky ve správci souborů.
+wrongFileAlert.instruction.3=3. Přidejte své soubory do této jednotky.
+wrongFileAlert.link=Pro další informace navštivte
# Vault Options
## General
@@ -190,10 +201,10 @@ vaultOptions.mount=Připojení
vaultOptions.mount.readonly=Pouze pro čtení
vaultOptions.mount.driveName=Jméno jednotky
vaultOptions.mount.customMountFlags=Vlastní parametry
-vaultOptions.mount.winDriveLetterOccupied=obsazené
+vaultOptions.mount.winDriveLetterOccupied=obsazeno
vaultOptions.mount.mountPoint=Přípojný bod
vaultOptions.mount.mountPoint.auto=Automaticky vybrat vhodné místo
-vaultOptions.mount.mountPoint.driveLetter=Použít přiřazené písmeno
+vaultOptions.mount.mountPoint.driveLetter=Použít zvolenou jednotku
vaultOptions.mount.mountPoint.custom=Vlastní cesta
vaultOptions.mount.mountPoint.directoryPickerButton=Vybrat...
vaultOptions.mount.mountPoint.directoryPickerTitle=Vyberte prázdný adresář
diff --git a/main/ui/src/main/resources/i18n/strings_de.properties b/main/ui/src/main/resources/i18n/strings_de.properties
index fd6c67476..b456bc15e 100644
--- a/main/ui/src/main/resources/i18n/strings_de.properties
+++ b/main/ui/src/main/resources/i18n/strings_de.properties
@@ -143,7 +143,7 @@ preferences.updates.updateAvailable=Update auf Version %s verfügbar.
preferences.donationKey=Spende
preferences.donationKey.registeredFor=Registriert für %s
preferences.donationKey.noDonationKey=Kein gültiger Spendenschlüssel gefunden. Er ist wie ein Lizenzschlüssel, aber für tolle Leute, die freie Software verwenden. ;-)
-preferences.donationKey.getDonationKey=Einen Spendenschlüssel erhalten
+preferences.donationKey.getDonationKey=Hol dir einen Spendenschlüssel
## About
preferences.about=Über
@@ -151,7 +151,7 @@ preferences.about=Über
main.closeBtn.tooltip=Schließen
main.minimizeBtn.tooltip=Minimieren
main.preferencesBtn.tooltip=Einstellungen
-main.donationKeyMissing.tooltip=Bitte denke über eine Spende nach
+main.donationKeyMissing.tooltip=Zieh bitte eine Spende in Betracht
## Drag 'n' Drop
main.dropZone.dropVault=Diesen Tresor hinzufügen
main.dropZone.unknownDragboardContent=Wenn Sie einen Tresor hinzufügen möchten, ziehen Sie ihn in dieses Fenster
@@ -161,7 +161,7 @@ main.vaultlist.contextMenu.remove=Tresor entfernen
main.vaultlist.addVaultBtn=Tresor hinzufügen
## Vault Detail
### Welcome
-main.vaultDetail.welcomeOnboarding=Danke, dass du zum Schützen deiner Dateien Cryptomator gewählt hast. Falls du Hilfe brauchst, schau dir unsere Anleitungen an:
+main.vaultDetail.welcomeOnboarding=Danke, dass du zum Schutz deiner Dateien Cryptomator gewählt hast. Falls du Hilfe brauchst, schau dir unsere Anleitungen an:
### Locked
main.vaultDetail.lockedStatus=GESPERRT
main.vaultDetail.unlockBtn=Entsperren
@@ -180,7 +180,7 @@ main.vaultDetail.throughput.mbps=%.1f MiB/s
main.vaultDetail.missing.info=Mit diesem Pfad konnte Cryptomator keinen Tresor finden.
### Needs Migration
main.vaultDetail.migrateButton=Tresor aktualisieren
-main.vaultDetail.migratePrompt=Dein Tresor muss auf ein neues Format aktualisiert werden, bevor Du auf ihn zugreifen kannst
+main.vaultDetail.migratePrompt=Dein Tresor muss auf ein neues Format aktualisiert werden, bevor du auf ihn zugreifen kannst
# Wrong File Alert
wrongFileAlert.title=Verschlüsseln von Dateien
@@ -190,12 +190,12 @@ wrongFileAlert.instruction.0=Folge diesen Schritten, um Dateien zu verschlüssel
wrongFileAlert.instruction.1=1. Entsperre deinen Tresor.
wrongFileAlert.instruction.2=2. Klicke auf „Anzeigen“, um das Laufwerk in deinem Dateimanager zu öffnen.
wrongFileAlert.instruction.3=3. Füge deine Dateien diesem Laufwerk hinzu.
-wrongFileAlert.link=Für weitere Hilfe besuche
+wrongFileAlert.link=Für weitere Unterstützung besuche
# Vault Options
## General
vaultOptions.general=Allgemein
-vaultOptions.general.unlockAfterStartup=Tresor beim Starten von Cryptomator entsperren
+vaultOptions.general.unlockAfterStartup=Tresor beim Start von Cryptomator entsperren
## Mount
vaultOptions.mount=Laufwerk
vaultOptions.mount.readonly=Schreibgeschützt
diff --git a/main/ui/src/main/resources/i18n/strings_es.properties b/main/ui/src/main/resources/i18n/strings_es.properties
index 10646f33e..3a54b8093 100644
--- a/main/ui/src/main/resources/i18n/strings_es.properties
+++ b/main/ui/src/main/resources/i18n/strings_es.properties
@@ -190,7 +190,7 @@ wrongFileAlert.instruction.0=Para cifrar archivos, seguir estos pasos:
wrongFileAlert.instruction.1=1. Desbloquear la bóveda.
wrongFileAlert.instruction.2=2. Hacer clic en "Revelar" para abrir el volumen en el administrador de archivos.
wrongFileAlert.instruction.3=3. Añadir los archivos a este volumen.
-wrongFileAlert.link=Para más ayuda, visitar
+wrongFileAlert.link=Para más ayuda, visite
# Vault Options
## General
diff --git a/main/ui/src/main/resources/i18n/strings_fr.properties b/main/ui/src/main/resources/i18n/strings_fr.properties
index dd946339f..5e5331730 100644
--- a/main/ui/src/main/resources/i18n/strings_fr.properties
+++ b/main/ui/src/main/resources/i18n/strings_fr.properties
@@ -190,7 +190,7 @@ wrongFileAlert.instruction.0=Pour chiffrer des fichiers, suivez ces étapes :
wrongFileAlert.instruction.1=1. Déverrouillez votre coffre.
wrongFileAlert.instruction.2=2. Cliquez sur "Révéler" pour ouvrir le volume dans votre gestionnaire de fichiers.
wrongFileAlert.instruction.3=3. Ajoutez vos fichiers à ce volume.
-wrongFileAlert.link=Pour plus d'assistance, visitez
+wrongFileAlert.link=Pour toute aide supplémentaire, visitez
# Vault Options
## General
diff --git a/main/ui/src/main/resources/i18n/strings_hi.properties b/main/ui/src/main/resources/i18n/strings_hi.properties
index 9b8f0b023..1bfbcf08e 100644
--- a/main/ui/src/main/resources/i18n/strings_hi.properties
+++ b/main/ui/src/main/resources/i18n/strings_hi.properties
@@ -58,6 +58,7 @@ unlock.unlockBtn=अनलॉक करें
## Invalid Mount Point
# Migration
+migration.title=वाउल्ट को अपग्रेड करें
## Start
## Run
## Sucess
@@ -65,12 +66,14 @@ unlock.unlockBtn=अनलॉक करें
# Preferences
## General
+preferences.general=सामान्य
## Volume
## Updates
## Donation Key
## About
# Main Window
+main.closeBtn.tooltip=बंद करें
## Drag 'n' Drop
## Vault List
main.vaultlist.addVaultBtn=वाउल्ट डालें
@@ -88,6 +91,7 @@ main.vaultDetail.migrateButton=वाउल्ट को अपग्रेड
# Wrong File Alert
wrongFileAlert.instruction.1=अपना वाउल्ट खोलें।
+wrongFileAlert.link=और मदद लिए, यह जाएं
# Vault Options
## General
diff --git a/main/ui/src/main/resources/i18n/strings_ja.properties b/main/ui/src/main/resources/i18n/strings_ja.properties
index 785574b64..4701d1e56 100644
--- a/main/ui/src/main/resources/i18n/strings_ja.properties
+++ b/main/ui/src/main/resources/i18n/strings_ja.properties
@@ -52,7 +52,7 @@ addvaultwizard.new.generateRecoveryKeyChoice.no=いいえ、パスワードを
addvault.new.readme.storageLocation.fileName=IMPORTANT.rtf
addvault.new.readme.storageLocation.1=⚠️ 金庫ファイル ⚠️
addvault.new.readme.storageLocation.2=ここは金庫のストレージ場所です。
-addvault.new.readme.storageLocation.3=しないでください:
+addvault.new.readme.storageLocation.3=次のことをしないでください:
addvault.new.readme.storageLocation.4=• このディレクトリ内のファイルを変更
addvault.new.readme.storageLocation.5=• このディレクトリに暗号化するファイルを張り付け。
addvault.new.readme.storageLocation.6=ファイルを暗号化したり金庫の内容を確認するには、次の方法に従ってください:
diff --git a/main/ui/src/main/resources/i18n/strings_ko.properties b/main/ui/src/main/resources/i18n/strings_ko.properties
index 2bbaa98f7..e1288a00c 100644
--- a/main/ui/src/main/resources/i18n/strings_ko.properties
+++ b/main/ui/src/main/resources/i18n/strings_ko.properties
@@ -81,6 +81,7 @@ removeVault.confirmBtn=Vault 제거
# Change Password
changepassword.title=비밀번호 변경
changepassword.enterOldPassword="%s"의 비밀번호를 입력하여 주십시요.
+changepassword.finalConfirmation=비밀번호를 잊어버리면, 데이터에 접근할 수 없음을 이해했습니다.
# Forget Password
forgetPassword.title=비밀번호 분실
@@ -183,6 +184,8 @@ main.vaultDetail.migratePrompt=Vault에 접근하기 전, 새로운 포멧으로
# Wrong File Alert
wrongFileAlert.title=파일 암호화 방법
+wrongFileAlert.header.title=이 파일들을 암호화하려고 하십니까?
+wrongFileAlert.header.lead=이 목적을 위해, Cryptomator는 파일 관리자에 볼륨을 제공합니다.
wrongFileAlert.instruction.0=파일을 암호화 하려면, 다음의 3단계를 따르십시요:
wrongFileAlert.instruction.1=1. Vault의 잠금해제
wrongFileAlert.instruction.2=2. 파일 관리자에서 열람된 볼륨의 "표시" 버튼 클릭
diff --git a/main/ui/src/main/resources/i18n/strings_lv.properties b/main/ui/src/main/resources/i18n/strings_lv.properties
new file mode 100644
index 000000000..2615f059e
--- /dev/null
+++ b/main/ui/src/main/resources/i18n/strings_lv.properties
@@ -0,0 +1,63 @@
+# Locale Specific CSS files such as CJK, RTL,...
+
+# Generics
+## Button
+## Error
+
+# Tray Menu
+
+# Add Vault Wizard
+## Welcome
+## New
+### Name
+### Location
+### Password
+### Information
+## Existing
+## Success
+
+# Remove Vault
+
+# Change Password
+
+# Forget Password
+
+# Unlock
+## Success
+## Invalid Mount Point
+
+# Migration
+## Start
+## Run
+## Sucess
+## Missing file system capabilities
+
+# Preferences
+## General
+## Volume
+## Updates
+## Donation Key
+## About
+
+# Main Window
+## Drag 'n' Drop
+## Vault List
+## Vault Detail
+### Welcome
+### Locked
+### Unlocked
+### Missing
+### Needs Migration
+
+# Wrong File Alert
+
+# Vault Options
+## General
+## Mount
+## Master Key
+
+# Recovery Key
+
+# New Password
+
+# Quit
diff --git a/main/ui/src/main/resources/i18n/strings_nb.properties b/main/ui/src/main/resources/i18n/strings_nb.properties
index 505f11a76..21fb07f58 100644
--- a/main/ui/src/main/resources/i18n/strings_nb.properties
+++ b/main/ui/src/main/resources/i18n/strings_nb.properties
@@ -28,11 +28,11 @@ traymenu.vault.reveal=Gjør synlig
# Add Vault Wizard
addvaultwizard.title=Legg til hvelv
## Welcome
-addvaultwizard.welcome.newButton=Lag nytt hvelv
-addvaultwizard.welcome.existingButton=Åpne eksisterende hvelv
+addvaultwizard.welcome.newButton=Lag et nytt hvelv
+addvaultwizard.welcome.existingButton=Åpne et eksisterende hvelv
## New
### Name
-addvaultwizard.new.nameInstruction=Velg et navn for hvelvet
+addvaultwizard.new.nameInstruction=Velg et navn på hvelvet
addvaultwizard.new.namePrompt=Navn på hvelvet
### Location
addvaultwizard.new.locationInstruction=Hvor skal Cryptomator lagre de krypterte filene dine?
diff --git a/main/ui/src/main/resources/i18n/strings_nn.properties b/main/ui/src/main/resources/i18n/strings_nn.properties
index 699fd8350..8f46ec60a 100644
--- a/main/ui/src/main/resources/i18n/strings_nn.properties
+++ b/main/ui/src/main/resources/i18n/strings_nn.properties
@@ -28,11 +28,11 @@ traymenu.vault.reveal=Gjer synleg
# Add Vault Wizard
addvaultwizard.title=Legg til kvelv
## Welcome
-addvaultwizard.welcome.newButton=Opprett ny kvelv
-addvaultwizard.welcome.existingButton=Opne eksisterande kvelv
+addvaultwizard.welcome.newButton=Opprett ein ny kvelv
+addvaultwizard.welcome.existingButton=Opn ein eksisterande kvelv
## New
### Name
-addvaultwizard.new.nameInstruction=Vel eit namn for kvelven
+addvaultwizard.new.nameInstruction=Vel eit namn på kvelven
addvaultwizard.new.namePrompt=Namn på kvelven
### Location
addvaultwizard.new.locationInstruction=Kvar skal Cryptomator lagra dei krypterte filene i kvelven din?
diff --git a/main/ui/src/main/resources/i18n/strings_ru.properties b/main/ui/src/main/resources/i18n/strings_ru.properties
index 1f590fbce..22efe76a9 100644
--- a/main/ui/src/main/resources/i18n/strings_ru.properties
+++ b/main/ui/src/main/resources/i18n/strings_ru.properties
@@ -7,14 +7,14 @@ generic.button.back=Назад
generic.button.cancel=Отмена
generic.button.change=Изменить
generic.button.close=Закрыть
-generic.button.copy=Копировать
+generic.button.copy=Скопировать
generic.button.copied=Скопировано!
generic.button.done=Готово
generic.button.next=Далее
generic.button.print=Распечатать
## Error
generic.error.title=Произошла непредвиденная ошибка
-generic.error.instruction=Этого не должно было произойти. Пожалуйста, создайте отчет об ошибке ниже и опишите, какие шаги к ней привели.
+generic.error.instruction=Этого не должно было произойти. Создайте отчёт об ошибке ниже и опишите, какие шаги к ней привели.
# Tray Menu
traymenu.showMainWindow=Показать
@@ -38,7 +38,7 @@ addvaultwizard.new.namePrompt=Имя хранилища
addvaultwizard.new.locationInstruction=Где Cryptomator должен хранить зашифрованные файлы вашего хранилища?
addvaultwizard.new.locationLabel=Место хранения
addvaultwizard.new.locationPrompt=…
-addvaultwizard.new.directoryPickerLabel=Пользовательское расположение
+addvaultwizard.new.directoryPickerLabel=Своё расположение
addvaultwizard.new.directoryPickerButton=Выбрать…
addvaultwizard.new.directoryPickerTitle=Выберите каталог
addvaultwizard.new.fileAlreadyExists=Хранилище не может быть создано по этому пути, потому что некоторые объекты уже существуют.
@@ -46,7 +46,7 @@ addvaultwizard.new.invalidName=Неверное имя хранилища. Ук
### Password
addvaultwizard.new.createVaultBtn=Создать хранилище
addvaultwizard.new.generateRecoveryKeyChoice=Вы не сможете получить доступ к своим данным без пароля. Хотите создать ключ для восстановления на случай потери пароля?
-addvaultwizard.new.generateRecoveryKeyChoice.yes=Да, пожалуй, лучше так, чем потом сожалеть
+addvaultwizard.new.generateRecoveryKeyChoice.yes=Да, лучше предостеречься, чем потом жалеть
addvaultwizard.new.generateRecoveryKeyChoice.no=Нет, спасибо, я не потеряю свой пароль
### Information
addvault.new.readme.storageLocation.fileName=ВАЖНО.rtf
@@ -55,7 +55,7 @@ addvault.new.readme.storageLocation.2=Это место, где находитс
addvault.new.readme.storageLocation.3=НЕТ
addvault.new.readme.storageLocation.4=• изменяйте любые файлы в этой папке или
addvault.new.readme.storageLocation.5=• добавляйте в эту папку любые файлы для шифрования.
-addvault.new.readme.storageLocation.6=Если вы хотите зашифровать файлы и просмотреть содержимое хранилища, сделайте следующее:
+addvault.new.readme.storageLocation.6=Чтобы зашифровать файлы и просмотреть содержимое хранилища, сделайте следующее:
addvault.new.readme.storageLocation.7=1. Добавьте это хранилище в Cryptomator.
addvault.new.readme.storageLocation.8=2. Разблокируйте хранилище в Cryptomator.
addvault.new.readme.storageLocation.9=3. Откройте место доступа, нажав кнопку "Показать".
@@ -63,7 +63,7 @@ addvault.new.readme.storageLocation.10=Если вам нужна помощь,
addvault.new.readme.accessLocation.fileName=ПРИВЕТСТВИЕ.rtf
addvault.new.readme.accessLocation.1=🔐️ ЗАШИФРОВАННЫЙ ТОМ 🔐️
addvault.new.readme.accessLocation.2=Это место доступа к вашему хранилищу.
-addvault.new.readme.accessLocation.3=Любые файлы, добавленные в этот том, будут зашифрованы Cryptomator. Вы можете работать с ним, как с любым другим диском/папкой. Здесь отображается только расшифрованное содержимое тома, ваши файлы остаются зашифрованными на жестком диске постоянно.
+addvault.new.readme.accessLocation.3=Любые файлы, добавленные в этот том, будут зашифрованы Cryptomator. Вы можете работать с ним как с любым другим диском/папкой. Здесь отображается только расшифрованное содержимое тома, ваши файлы остаются зашифрованными на жёстком диске постоянно.
addvault.new.readme.accessLocation.4=Этот файл можно удалить.
## Existing
addvaultwizard.existing.instruction=Выберите файл "masterkey.cryptomator" из имеющегося хранилища.
@@ -85,7 +85,7 @@ changepassword.finalConfirmation=Я понимаю, что не смогу по
# Forget Password
forgetPassword.title=Не помню пароль
-forgetPassword.information=Это удалит сохраненный пароль от этого хранилища из вашего хранилища ключей.
+forgetPassword.information=Сохранённый пароль от этого хранилища будет удалён из вашей связки ключей.
forgetPassword.confirmBtn=Не помню пароль
# Unlock
@@ -102,8 +102,8 @@ unlock.error.invalidMountPoint=Точка монтирования - не пус
# Migration
migration.title=Обновить хранилище
## Start
-migration.start.prompt=Хранилище "%s" нужно обновить до более нового формата. Прежде чем продолжить, убедитесь, что нет отложенной синхронизации, которая может повлиять на хранилище.
-migration.start.confirm=Да, мое хранилище полностью синхронизировано
+migration.start.prompt=Хранилище "%s" нужно преобразовать в более новый формат. Прежде чем продолжить, убедитесь, что нет отложенной синхронизации, которая может повлиять на хранилище.
+migration.start.confirm=Да, моё хранилище полностью синхронизировано
## Run
migration.run.enterPassword=Введите пароль для "%s"
migration.run.startMigrationBtn=Перенести хранилище
@@ -125,7 +125,7 @@ preferences.general.unlockThemes=Разблокировать тёмный ре
preferences.general.startHidden=Скрывать окно при запуске Cryptomator
preferences.general.debugLogging=Вести журнал отладки
preferences.general.autoStart=Запускать Cryptomator при старте системы
-preferences.general.interfaceOrientation=Ориентация интерфейса
+preferences.general.interfaceOrientation=Интерфейс
preferences.general.interfaceOrientation.ltr=Слева направо
preferences.general.interfaceOrientation.rtl=Справа налево
## Volume
@@ -151,7 +151,7 @@ preferences.about=О программе
main.closeBtn.tooltip=Закрыть
main.minimizeBtn.tooltip=Свернуть
main.preferencesBtn.tooltip=Настройки
-main.donationKeyMissing.tooltip=Пожалуйста, обдумайте возможность поддержать приложение
+main.donationKeyMissing.tooltip=Мы будем рады финансовой помощи
## Drag 'n' Drop
main.dropZone.dropVault=Добавить это хранилище
main.dropZone.unknownDragboardContent=Если вы хотите добавить хранилище, перетащите его в это окно
@@ -161,7 +161,7 @@ main.vaultlist.contextMenu.remove=Удалить хранилище
main.vaultlist.addVaultBtn=Добавить хранилище
## Vault Detail
### Welcome
-main.vaultDetail.welcomeOnboarding=Спасибо, что выбрали Cryptomator для защиты ваших файлов. Если вам нужна помощь, ознакомьтесь с нашими руководствами по началу работы:
+main.vaultDetail.welcomeOnboarding=Благодарим за выбор Cryptomator для защиты ваших файлов. Если требуется помощь, ознакомьтесь с документацией по началу работы:
### Locked
main.vaultDetail.lockedStatus=ЗАБЛОКИРОВАНО
main.vaultDetail.unlockBtn=Разблокировать
@@ -180,15 +180,15 @@ main.vaultDetail.throughput.mbps=%.1f МиБ/с
main.vaultDetail.missing.info=Cryptomator не смог найти хранилище по этому пути.
### Needs Migration
main.vaultDetail.migrateButton=Обновить хранилище
-main.vaultDetail.migratePrompt=Хранилище должно быть обновлено до нового формата, прежде чем вы сможете получить к нему доступ
+main.vaultDetail.migratePrompt=Чтобы получить доступ к хранилищу, его нужно преобразовать в новый формат
# Wrong File Alert
wrongFileAlert.title=Как шифровать файлы
wrongFileAlert.header.title=Вы пытались зашифровать эти файлы?
-wrongFileAlert.header.lead=Для этого Cryptomator создает том в системном файловом менеджере.
-wrongFileAlert.instruction.0=Чтобы зашифровать файлы, выполните следующие действия:
+wrongFileAlert.header.lead=Для этого Cryptomator создаёт том в системном диспетчере файлов.
+wrongFileAlert.instruction.0=Чтобы зашифровать файлы, выполните следующее:
wrongFileAlert.instruction.1=1. Разблокируйте хранилище.
-wrongFileAlert.instruction.2=2. Нажмите кнопку " Показать", чтобы открыть том в файловом менеджере.
+wrongFileAlert.instruction.2=2. Нажмите кнопку "Показать", чтобы открыть том в диспетчере файлов.
wrongFileAlert.instruction.3=3. Добавьте файлы в этот том.
wrongFileAlert.link=Если нужна помощь, посетите
@@ -205,13 +205,13 @@ vaultOptions.mount.winDriveLetterOccupied=занято
vaultOptions.mount.mountPoint=Точка монтирования
vaultOptions.mount.mountPoint.auto=Автоматически выбирать подходящую
vaultOptions.mount.mountPoint.driveLetter=Использовать назначенную букву диска
-vaultOptions.mount.mountPoint.custom=Пользовательский путь
+vaultOptions.mount.mountPoint.custom=Свой путь
vaultOptions.mount.mountPoint.directoryPickerButton=Выбрать…
vaultOptions.mount.mountPoint.directoryPickerTitle=Выберите пустую папку
## Master Key
vaultOptions.masterkey=Пароль
vaultOptions.masterkey.changePasswordBtn=Изменить пароль
-vaultOptions.masterkey.recoveryKeyExpanation=Ключ восстановления - это единственный способ восстановить доступ к хранилищу в случае утери пароля.
+vaultOptions.masterkey.recoveryKeyExpanation=Ключ восстановления - это единственный способ восстановить доступ к хранилищу при утере пароля.
vaultOptions.masterkey.showRecoveryKeyBtn=Показать ключ восстановления
vaultOptions.masterkey.recoverPasswordBtn=Восстановить пароль
@@ -237,5 +237,5 @@ passwordStrength.messageLabel.3=Сильный
passwordStrength.messageLabel.4=Очень сильный
# Quit
-quit.prompt=Выйти из приложения? Есть разблокированные хранилища.
+quit.prompt=Выйти из приложения? Есть незаблокированные хранилища.
quit.lockAndQuit=Заблокировать и выйти
diff --git a/main/ui/src/main/resources/i18n/strings_sv.properties b/main/ui/src/main/resources/i18n/strings_sv.properties
index dac833b91..d0495e760 100644
--- a/main/ui/src/main/resources/i18n/strings_sv.properties
+++ b/main/ui/src/main/resources/i18n/strings_sv.properties
@@ -50,7 +50,7 @@ addvaultwizard.new.generateRecoveryKeyChoice.yes=Ja tack. För säkerhets skull
addvaultwizard.new.generateRecoveryKeyChoice.no=Nej tack. Här slarvas inga lösenord bort
### Information
addvault.new.readme.storageLocation.fileName=VIKTIGT.rtf
-addvault.new.readme.storageLocation.1=⚠️ VALV FILER ⚠️
+addvault.new.readme.storageLocation.1=⚠️ VALVFILER ⚠️
addvault.new.readme.storageLocation.2=Detta är ditt valvs lagringsplats.
addvault.new.readme.storageLocation.3=INTE
addvault.new.readme.storageLocation.4=• ändra någon fil i denna katalog eller
@@ -58,7 +58,7 @@ addvault.new.readme.storageLocation.5=• klistra in filer för kryptering i den
addvault.new.readme.storageLocation.6=Om du vill kryptera filer och se innehållet i valvet, gör följande:
addvault.new.readme.storageLocation.7=1. Lägg till detta valv till Cryptomator.
addvault.new.readme.storageLocation.8=2. Lås upp valvet i Cryptomator.
-addvault.new.readme.storageLocation.9=3. Öppna åtkomstplatsen genom att klicka på "Visa" knappen.
+addvault.new.readme.storageLocation.9=3. Öppna åtkomstplatsen genom att klicka på "Visa"-knappen.
addvault.new.readme.storageLocation.10=Om du behöver hjälp, läs dokumentationen: %s
addvault.new.readme.accessLocation.fileName=WELCOME.rtf
addvault.new.readme.accessLocation.1=\\fs\\qc 🔐️ KRYPTERAD VOLYM 🔐️
@@ -190,7 +190,7 @@ wrongFileAlert.instruction.0=För att kryptera filer, följ dessa steg:
wrongFileAlert.instruction.1=1. Lås upp ditt valv.
wrongFileAlert.instruction.2=2. Klicka på "Visa" för att öppna volymen i din filhanterare.
wrongFileAlert.instruction.3=3. Lägg till dina filer i denna volym.
-wrongFileAlert.link=För mer hjälp, besök
+wrongFileAlert.link=För ytterligare hjälp, besök
# Vault Options
## General
diff --git a/main/ui/src/main/resources/i18n/strings_tr.properties b/main/ui/src/main/resources/i18n/strings_tr.properties
index 735ef1503..e42d18178 100644
--- a/main/ui/src/main/resources/i18n/strings_tr.properties
+++ b/main/ui/src/main/resources/i18n/strings_tr.properties
@@ -59,6 +59,7 @@ addvault.new.readme.storageLocation.6=Dosyaları şifrelemek ve kasanın içeri
addvault.new.readme.storageLocation.7=1. Bu kasayı Cryptomator'a ekleyin.
addvault.new.readme.storageLocation.8=2. Cryptomator'da kasanın kilidini açın.
addvault.new.readme.storageLocation.9=3. "Göster" düğmesini tıklayarak erişim konumunu açın.
+addvault.new.readme.storageLocation.10=Yardım lazımsa, belgeleri ziyaret edin: %s
addvault.new.readme.accessLocation.fileName=WELCOME.rtf
addvault.new.readme.accessLocation.1=🔐️ ŞİFRELENMİŞ BİRİM 🔐️
addvault.new.readme.accessLocation.2=Burası kasanızın erişim konumudur.
@@ -80,6 +81,7 @@ removeVault.confirmBtn=Kasayı Sil
# Change Password
changepassword.title=Şifreyi Değiştir
changepassword.enterOldPassword="%s" için şuanki şifreyi gir
+changepassword.finalConfirmation=Şifremi unutursam verilerime ulaşamayacağımın farkındayım
# Forget Password
forgetPassword.title=Şifreyi Unut
@@ -143,6 +145,7 @@ preferences.donationKey.registeredFor=%s için kaydedildi
preferences.donationKey.noDonationKey=Geçerli bir bağış anahtarı bulunamadı. Bu anahtar, lisans anahtarı gibidir ama ücretsiz uygulama kullanan muhteşem insanlar içindir ;-)
preferences.donationKey.getDonationKey=Bir bağış anahtarı al
## About
+preferences.about=Hakkında
# Main Window
main.closeBtn.tooltip=Kapat
@@ -180,6 +183,14 @@ main.vaultDetail.migrateButton=Kasayı Güncelle
main.vaultDetail.migratePrompt=Kasaya erişmeden önce kasanızın yeni bir formata yükseltilmesi gerekiyor
# Wrong File Alert
+wrongFileAlert.title=Dosyalar Nasıl Şifrelenir
+wrongFileAlert.header.title=Bu dosyaları şifrelemeye çalıştınız mı?
+wrongFileAlert.header.lead=Bu amaçla, Cryptomator sistem dosya yöneticinizde bir birim oluşturur.
+wrongFileAlert.instruction.0=Dosyaları şifrelemek için, şu adımları izleyin:
+wrongFileAlert.instruction.1=1. Kasanızın kilidini açın.
+wrongFileAlert.instruction.2=2. "Sürücüyü Göster"e basarak birimi dosya yöneticinizde açın.
+wrongFileAlert.instruction.3=3. Dosyalarınızı bu birime ekleyin.
+wrongFileAlert.link=Daha fazla yardım için, ziyaret edin:
# Vault Options
## General
@@ -211,6 +222,7 @@ recoveryKey.display.message=Aşağıdaki kurtarma anahtarı "%s" kasasına eriş
recoveryKey.display.StorageHints=Bunu çok güvenli bir yerde saklayın, örneğin:\n • Şifre yöneticisi kullanarak depolayın\n • USB flash belleğe kaydedin\n • Bir sayfaya yazdırın
recoveryKey.recover.prompt="%s" için kurtarma anahtarınızı girin:
recoveryKey.recover.validKey=Bu geçerli bir kurtarma anahtarı
+recoveryKey.printout.heading=Cryptomator Kurtarma Anahtarı\n"%s"\n
# New Password
newPassword.promptText=Yeni bir şifre girin
diff --git a/main/ui/src/main/resources/i18n/strings_zh.properties b/main/ui/src/main/resources/i18n/strings_zh.properties
index a0fcabeab..86007c281 100644
--- a/main/ui/src/main/resources/i18n/strings_zh.properties
+++ b/main/ui/src/main/resources/i18n/strings_zh.properties
@@ -122,9 +122,9 @@ preferences.title=首选项
preferences.general=常规
preferences.general.theme=界面外观
preferences.general.unlockThemes=解锁暗黑模式
-preferences.general.startHidden=启动Cryptomator时隐藏窗口
+preferences.general.startHidden=最小化启动 Cryptomator 到系统托盘
preferences.general.debugLogging=启用调试日志
-preferences.general.autoStart=开机运行Cryptomator
+preferences.general.autoStart=开机运行 Cryptomator
preferences.general.interfaceOrientation=界面方向
preferences.general.interfaceOrientation.ltr=从左到右
preferences.general.interfaceOrientation.rtl=从右到左
@@ -142,7 +142,7 @@ preferences.updates.updateAvailable=可更新到版本 %s
## Donation Key
preferences.donationKey=捐赠
preferences.donationKey.registeredFor=已注册给 %s
-preferences.donationKey.noDonationKey=找不到有效的捐赠密钥,它相当于一个专门给使用免费软件的帅哥美女的许可证密钥。;-)
+preferences.donationKey.noDonationKey=找不到有效的捐赠密钥,它相当于一个专门给使用免费软件的帅哥美女的许可证密钥 ;-)
preferences.donationKey.getDonationKey=获取一个捐赠密钥
## About
preferences.about=关于
@@ -195,7 +195,7 @@ wrongFileAlert.link=如需进一步帮助,请访问
# Vault Options
## General
vaultOptions.general=常规
-vaultOptions.general.unlockAfterStartup=启动Cryptomator时解锁保险库
+vaultOptions.general.unlockAfterStartup=启动 Cryptomator 时解锁保险库 (此功能需先勾选保存密码)
## Mount
vaultOptions.mount=挂载
vaultOptions.mount.readonly=只读
diff --git a/main/ui/src/main/resources/i18n/strings_zh_TW.properties b/main/ui/src/main/resources/i18n/strings_zh_TW.properties
index 6be0d669e..7f7145db8 100644
--- a/main/ui/src/main/resources/i18n/strings_zh_TW.properties
+++ b/main/ui/src/main/resources/i18n/strings_zh_TW.properties
@@ -190,7 +190,7 @@ wrongFileAlert.instruction.0=請依下列步驟加密檔案:
wrongFileAlert.instruction.1=1. 解鎖您的加密檔案庫。
wrongFileAlert.instruction.2=2. 點擊「顯示」可在檔案總管中檢視磁區。
wrongFileAlert.instruction.3=3. 把您的檔案加入磁區。
-wrongFileAlert.link=如果需要進一步的協助,請前往
+wrongFileAlert.link=如需進一步協助協助,請前往
# Vault Options
## General