+ * A full match of the error code indicates the exact same throwable (to the extent possible
+ * without hash collisions). A partial match of the first or second component indicates related problems
+ * with the same root cause.
+ *
+ * @return A three-part error code
+ */
+ @Override
+ public String toString() {
+ return methodCode() + DELIM + rootCauseCode() + DELIM + throwableCode();
+ }
+
+ /**
+ * Deterministically creates an error code from the stack trace of the given cause.
+ *
+ * The code consists of three parts separated by {@value DELIM}:
+ *
+ *
The first part depends on the root cause and the method that threw it
+ *
The second part depends on the root cause and its stack trace
+ *
The third part depends on all the cause hierarchy
+ *
+ *
+ * Parts may be identical if the cause is the root cause or the root cause has just one single item in its stack trace.
+ *
+ * @param throwable The exception
+ * @return A three-part error code
+ */
+ public static ErrorCode of(Throwable throwable) {
+ var causalChain = Throwables.getCausalChain(throwable);
+ if (causalChain.size() > 1) {
+ var rootCause = causalChain.get(causalChain.size() - 1);
+ var parentOfRootCause = causalChain.get(causalChain.size() - 2);
+ var rootSpecificFrames = countTopmostFrames(rootCause.getStackTrace(), parentOfRootCause.getStackTrace());
+ return new ErrorCode(throwable, rootCause, rootSpecificFrames);
+ } else {
+ return new ErrorCode(throwable, throwable, ALL_FRAMES);
+ }
+ }
+
+ private String format(int value) {
+ // Cut off highest 12 bits (only leave 20 least significant bits) and XOR rest with cutoff
+ value = (value & 0xfffff) ^ (value >>> 20);
+ return Strings.padStart(Integer.toString(value, 32).toUpperCase(Locale.ROOT), 4, '0');
+ }
+
+ private int traceCode(Throwable e, int frameCount) {
+ int result = SEED;
+ if (e.getCause() != null) {
+ result = traceCode(e.getCause(), frameCount);
+ }
+ result = result * A_PRIME + e.getClass().getName().hashCode();
+ var stack = e.getStackTrace();
+ for (int i = 0; i < Math.min(stack.length, frameCount); i++) {
+ result = result * A_PRIME + stack[i].getClassName().hashCode();
+ result = result * A_PRIME + stack[i].getMethodName().hashCode();
+ }
+ return result;
+ }
+
+ /**
+ * Counts the number of additional frames contained in allFrames but not in bottomFrames.
+ *
+ * If allFrames does not end with bottomFrames, it is considered distinct and all its frames are counted.
+ *
+ * @param allFrames Some stack frames
+ * @param bottomFrames Other stack frames, potentially forming the bottom of the stack of allFrames
+ * @return The number of additional frames in allFrames. In most cases this should be equal to the difference in size.
+ */
+ // visible for testing
+ static int countTopmostFrames(StackTraceElement[] allFrames, StackTraceElement[] bottomFrames) {
+ if (allFrames.length < bottomFrames.length) {
+ // if frames had been stacked on top of bottomFrames, allFrames would be larger
+ return allFrames.length;
+ } else {
+ return allFrames.length - commonSuffixLength(allFrames, bottomFrames);
+ }
+ }
+
+ // visible for testing
+ static int commonSuffixLength(T[] set, T[] subset) {
+ Preconditions.checkArgument(set.length >= subset.length);
+ // iterate items backwards as long as they are identical
+ var iterator = reverseStream(subset).iterator();
+ return (int) reverseStream(set).takeWhile(item -> iterator.hasNext() && iterator.next().equals(item)).count();
+ }
+
+ private static Stream reverseStream(T[] array) {
+ return IntStream.rangeClosed(1, array.length).mapToObj(i -> array[array.length - i]);
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/cryptomator/common/PluginClassLoader.java b/src/main/java/org/cryptomator/common/PluginClassLoader.java
new file mode 100644
index 000000000..16932923b
--- /dev/null
+++ b/src/main/java/org/cryptomator/common/PluginClassLoader.java
@@ -0,0 +1,66 @@
+package org.cryptomator.common;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.FileVisitOption;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+
+@Singleton
+public class PluginClassLoader extends URLClassLoader {
+
+ private static final Logger LOG = LoggerFactory.getLogger(PluginClassLoader.class);
+ private static final String NAME = "PluginClassLoader";
+ private static final String JAR_SUFFIX = ".jar";
+
+ @Inject
+ public PluginClassLoader(Environment env) {
+ super(NAME, env.getPluginDir().map(PluginClassLoader::findJars).orElse(new URL[0]), PluginClassLoader.class.getClassLoader());
+ }
+
+ private static URL[] findJars(Path path) {
+ if (!Files.isDirectory(path)) {
+ return new URL[0];
+ } else {
+ try {
+ var visitor = new JarVisitor();
+ Files.walkFileTree(path, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, visitor);
+ return visitor.urls.toArray(URL[]::new);
+ } catch (IOException e) {
+ LOG.warn("Failed to scan plugin dir " + path, e);
+ return new URL[0];
+ }
+ }
+ }
+
+ private static final class JarVisitor extends SimpleFileVisitor {
+
+ private final List urls = new ArrayList<>();
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
+ if (attrs.isRegularFile() && file.getFileName().toString().toLowerCase().endsWith(JAR_SUFFIX)) {
+ try {
+ urls.add(file.toUri().toURL());
+ } catch (MalformedURLException e) {
+ LOG.warn("Failed to create URL for jar file {}", file);
+ }
+ }
+ return FileVisitResult.CONTINUE;
+ }
+ }
+
+}
diff --git a/src/main/java/org/cryptomator/common/keychain/KeychainManager.java b/src/main/java/org/cryptomator/common/keychain/KeychainManager.java
index 57af6c685..c97d0e9c9 100644
--- a/src/main/java/org/cryptomator/common/keychain/KeychainManager.java
+++ b/src/main/java/org/cryptomator/common/keychain/KeychainManager.java
@@ -38,6 +38,11 @@ public class KeychainManager implements KeychainAccessProvider {
return result;
}
+ @Override
+ public String displayName() {
+ return getClass().getName();
+ }
+
@Override
public void storePassphrase(String key, CharSequence passphrase) throws KeychainAccessException {
getKeychainOrFail().storePassphrase(key, passphrase);
diff --git a/src/main/java/org/cryptomator/common/keychain/KeychainModule.java b/src/main/java/org/cryptomator/common/keychain/KeychainModule.java
index 01a221ed7..6356c4966 100644
--- a/src/main/java/org/cryptomator/common/keychain/KeychainModule.java
+++ b/src/main/java/org/cryptomator/common/keychain/KeychainModule.java
@@ -2,6 +2,7 @@ package org.cryptomator.common.keychain;
import dagger.Module;
import dagger.Provides;
+import org.cryptomator.common.PluginClassLoader;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.integrations.keychain.KeychainAccessProvider;
@@ -17,8 +18,8 @@ public class KeychainModule {
@Provides
@Singleton
- static Set> provideAvailableKeychainAccessProviderFactories() {
- return ServiceLoader.load(KeychainAccessProvider.class).stream().collect(Collectors.toUnmodifiableSet());
+ static Set> provideAvailableKeychainAccessProviderFactories(PluginClassLoader classLoader) {
+ return ServiceLoader.load(KeychainAccessProvider.class, classLoader).stream().collect(Collectors.toUnmodifiableSet());
}
@Provides
diff --git a/src/main/java/org/cryptomator/common/mountpoint/AvailableDriveLetterChooser.java b/src/main/java/org/cryptomator/common/mountpoint/AvailableDriveLetterChooser.java
index d0fc04f3c..23ce8466a 100644
--- a/src/main/java/org/cryptomator/common/mountpoint/AvailableDriveLetterChooser.java
+++ b/src/main/java/org/cryptomator/common/mountpoint/AvailableDriveLetterChooser.java
@@ -24,6 +24,6 @@ class AvailableDriveLetterChooser implements MountPointChooser {
@Override
public Optional chooseMountPoint(Volume caller) {
- return this.windowsDriveLetters.getAvailableDriveLetterPath();
+ return this.windowsDriveLetters.getDesiredAvailableDriveLetterPath();
}
}
diff --git a/src/main/java/org/cryptomator/common/settings/Settings.java b/src/main/java/org/cryptomator/common/settings/Settings.java
index e4cb9b8f7..82f2fb794 100644
--- a/src/main/java/org/cryptomator/common/settings/Settings.java
+++ b/src/main/java/org/cryptomator/common/settings/Settings.java
@@ -43,6 +43,8 @@ public class Settings {
public static final NodeOrientation DEFAULT_USER_INTERFACE_ORIENTATION = NodeOrientation.LEFT_TO_RIGHT;
public static final String DEFAULT_LICENSE_KEY = "";
public static final boolean DEFAULT_SHOW_MINIMIZE_BUTTON = false;
+ public static final String DEFAULT_DISPLAY_CONFIGURATION = "";
+
private final ObservableList directories = FXCollections.observableArrayList(VaultSettings::observables);
private final BooleanProperty askedForUpdateCheck = new SimpleBooleanProperty(DEFAULT_ASKED_FOR_UPDATE_CHECK);
@@ -59,6 +61,12 @@ public class Settings {
private final StringProperty licenseKey = new SimpleStringProperty(DEFAULT_LICENSE_KEY);
private final BooleanProperty showMinimizeButton = new SimpleBooleanProperty(DEFAULT_SHOW_MINIMIZE_BUTTON);
private final BooleanProperty showTrayIcon;
+ private final IntegerProperty windowXPosition = new SimpleIntegerProperty();
+ private final IntegerProperty windowYPosition = new SimpleIntegerProperty();
+ private final IntegerProperty windowWidth = new SimpleIntegerProperty();
+ private final IntegerProperty windowHeight = new SimpleIntegerProperty();
+ private final ObjectProperty displayConfiguration = new SimpleObjectProperty<>(DEFAULT_DISPLAY_CONFIGURATION);
+
private Consumer saveCmd;
@@ -83,6 +91,11 @@ public class Settings {
licenseKey.addListener(this::somethingChanged);
showMinimizeButton.addListener(this::somethingChanged);
showTrayIcon.addListener(this::somethingChanged);
+ windowXPosition.addListener(this::somethingChanged);
+ windowYPosition.addListener(this::somethingChanged);
+ windowWidth.addListener(this::somethingChanged);
+ windowHeight.addListener(this::somethingChanged);
+ displayConfiguration.addListener(this::somethingChanged);
}
void setSaveCmd(Consumer saveCmd) {
@@ -141,7 +154,7 @@ public class Settings {
return theme;
}
- public ObjectProperty keychainProvider() { return keychainProvider; }
+ public ObjectProperty keychainProvider() {return keychainProvider;}
public ObjectProperty userInterfaceOrientation() {
return userInterfaceOrientation;
@@ -158,4 +171,24 @@ public class Settings {
public BooleanProperty showTrayIcon() {
return showTrayIcon;
}
+
+ public IntegerProperty windowXPositionProperty() {
+ return windowXPosition;
+ }
+
+ public IntegerProperty windowYPositionProperty() {
+ return windowYPosition;
+ }
+
+ public IntegerProperty windowWidthProperty() {
+ return windowWidth;
+ }
+
+ public IntegerProperty windowHeightProperty() {
+ return windowHeight;
+ }
+
+ public ObjectProperty displayConfigurationProperty() {
+ return displayConfiguration;
+ }
}
diff --git a/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java b/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java
index 5bcb5f3d7..6d8d880e6 100644
--- a/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java
+++ b/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java
@@ -52,6 +52,12 @@ public class SettingsJsonAdapter extends TypeAdapter {
out.name("licenseKey").value(value.licenseKey().get());
out.name("showMinimizeButton").value(value.showMinimizeButton().get());
out.name("showTrayIcon").value(value.showTrayIcon().get());
+ out.name("windowXPosition").value((value.windowXPositionProperty().get()));
+ out.name("windowYPosition").value((value.windowYPositionProperty().get()));
+ out.name("windowWidth").value((value.windowWidthProperty().get()));
+ out.name("windowHeight").value((value.windowHeightProperty().get()));
+ out.name("displayConfiguration").value((value.displayConfigurationProperty().get()));
+
out.endObject();
}
@@ -86,6 +92,12 @@ public class SettingsJsonAdapter extends TypeAdapter {
case "licenseKey" -> settings.licenseKey().set(in.nextString());
case "showMinimizeButton" -> settings.showMinimizeButton().set(in.nextBoolean());
case "showTrayIcon" -> settings.showTrayIcon().set(in.nextBoolean());
+ case "windowXPosition" -> settings.windowXPositionProperty().set(in.nextInt());
+ case "windowYPosition" -> settings.windowYPositionProperty().set(in.nextInt());
+ case "windowWidth" -> settings.windowWidthProperty().set(in.nextInt());
+ case "windowHeight" -> settings.windowHeightProperty().set(in.nextInt());
+ case "displayConfiguration" -> settings.displayConfigurationProperty().set(in.nextString());
+
default -> {
LOG.warn("Unsupported vault setting found in JSON: " + name);
in.skipValue();
diff --git a/src/main/java/org/cryptomator/common/vaults/Vault.java b/src/main/java/org/cryptomator/common/vaults/Vault.java
index 74ac7dc40..96bf3b252 100644
--- a/src/main/java/org/cryptomator/common/vaults/Vault.java
+++ b/src/main/java/org/cryptomator/common/vaults/Vault.java
@@ -17,9 +17,6 @@ import org.cryptomator.cryptofs.CryptoFileSystem;
import org.cryptomator.cryptofs.CryptoFileSystemProperties;
import org.cryptomator.cryptofs.CryptoFileSystemProperties.FileSystemFlags;
import org.cryptomator.cryptofs.CryptoFileSystemProvider;
-import org.cryptomator.cryptofs.VaultConfig;
-import org.cryptomator.cryptofs.VaultConfig.UnverifiedVaultConfig;
-import org.cryptomator.cryptofs.VaultConfigLoadException;
import org.cryptomator.cryptofs.common.FileSystemCapabilityChecker;
import org.cryptomator.cryptolib.api.CryptoException;
import org.cryptomator.cryptolib.api.MasterkeyLoader;
@@ -38,8 +35,6 @@ import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleBooleanProperty;
import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.EnumSet;
@@ -62,6 +57,7 @@ public class Vault {
private final AtomicReference cryptoFileSystem;
private final VaultState state;
private final ObjectProperty lastKnownException;
+ private final VaultConfigCache configCache;
private final VaultStats stats;
private final StringBinding displayName;
private final StringBinding displayablePath;
@@ -78,8 +74,9 @@ public class Vault {
private volatile Volume volume;
@Inject
- Vault(VaultSettings vaultSettings, Provider volumeProvider, @DefaultMountFlags StringBinding defaultMountFlags, AtomicReference cryptoFileSystem, VaultState state, @Named("lastKnownException") ObjectProperty lastKnownException, VaultStats stats) {
+ Vault(VaultSettings vaultSettings, VaultConfigCache configCache, Provider volumeProvider, @DefaultMountFlags StringBinding defaultMountFlags, AtomicReference cryptoFileSystem, VaultState state, @Named("lastKnownException") ObjectProperty lastKnownException, VaultStats stats) {
this.vaultSettings = vaultSettings;
+ this.configCache = configCache;
this.volumeProvider = volumeProvider;
this.defaultMountFlags = defaultMountFlags;
this.cryptoFileSystem = cryptoFileSystem;
@@ -107,10 +104,10 @@ public class Vault {
Set flags = EnumSet.noneOf(FileSystemFlags.class);
if (vaultSettings.usesReadOnlyMode().get()) {
flags.add(FileSystemFlags.READONLY);
- } else if(vaultSettings.maxCleartextFilenameLength().get() == -1) {
+ } else if (vaultSettings.maxCleartextFilenameLength().get() == -1) {
LOG.debug("Determining cleartext filename length limitations...");
var checker = new FileSystemCapabilityChecker();
- int shorteningThreshold = getUnverifiedVaultConfig().allegedShorteningThreshold();
+ int shorteningThreshold = configCache.get().allegedShorteningThreshold();
int ciphertextLimit = checker.determineSupportedCiphertextFileNameLength(getPath());
if (ciphertextLimit < shorteningThreshold) {
int cleartextLimit = checker.determineSupportedCleartextFileNameLength(getPath());
@@ -328,19 +325,6 @@ public class Vault {
return stats;
}
- /**
- * Attempts to read the vault config file and parse it without verifying its integrity.
- *
- * @return an unverified vault config
- * @throws VaultConfigLoadException if the read file cannot be properly parsed
- * @throws IOException if reading the file fails
- *
- */
- public UnverifiedVaultConfig getUnverifiedVaultConfig() throws IOException {
- Path configPath = getPath().resolve(org.cryptomator.common.Constants.VAULTCONFIG_FILENAME);
- String token = Files.readString(configPath, StandardCharsets.US_ASCII);
- return VaultConfig.decode(token);
- }
public Observable[] observables() {
return new Observable[]{state};
@@ -375,6 +359,10 @@ public class Vault {
}
}
+ public VaultConfigCache getVaultConfigCache() {
+ return configCache;
+ }
+
public void setCustomMountFlags(String mountFlags) {
vaultSettings.mountFlags().set(mountFlags);
}
diff --git a/src/main/java/org/cryptomator/common/vaults/VaultComponent.java b/src/main/java/org/cryptomator/common/vaults/VaultComponent.java
index 588ff64cd..be844f510 100644
--- a/src/main/java/org/cryptomator/common/vaults/VaultComponent.java
+++ b/src/main/java/org/cryptomator/common/vaults/VaultComponent.java
@@ -25,6 +25,9 @@ public interface VaultComponent {
@BindsInstance
Builder vaultSettings(VaultSettings vaultSettings);
+ @BindsInstance
+ Builder vaultConfigCache(VaultConfigCache configCache);
+
@BindsInstance
Builder initialVaultState(VaultState.Value vaultState);
diff --git a/src/main/java/org/cryptomator/common/vaults/VaultConfigCache.java b/src/main/java/org/cryptomator/common/vaults/VaultConfigCache.java
new file mode 100644
index 000000000..80d70ffbf
--- /dev/null
+++ b/src/main/java/org/cryptomator/common/vaults/VaultConfigCache.java
@@ -0,0 +1,65 @@
+package org.cryptomator.common.vaults;
+
+import org.cryptomator.common.Constants;
+import org.cryptomator.common.settings.VaultSettings;
+import org.cryptomator.cryptofs.VaultConfig;
+import org.cryptomator.cryptofs.VaultConfigLoadException;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Wrapper for lazy loading and on-demand reloading of the vault configuration.
+ */
+public class VaultConfigCache {
+
+ private final VaultSettings settings;
+ private final AtomicReference config;
+
+ VaultConfigCache(VaultSettings settings) {
+ this.settings = settings;
+ this.config = new AtomicReference<>(null);
+ }
+
+ void reloadConfig() throws IOException {
+ try {
+ config.set(readConfigFromStorage(this.settings.path().get()));
+ } catch (IOException e) {
+ config.set(null);
+ throw e;
+ }
+ }
+
+ public VaultConfig.UnverifiedVaultConfig get() throws IOException {
+ if (config.get() == null) {
+ reloadConfig();
+ }
+ return config.get();
+ }
+
+ public VaultConfig.UnverifiedVaultConfig getUnchecked() {
+ try {
+ return get();
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
+
+
+ /**
+ * Attempts to read the vault config file and parse it without verifying its integrity.
+ *
+ * @throws VaultConfigLoadException if the read file cannot be properly parsed
+ * @throws IOException if reading the file fails
+ */
+ static VaultConfig.UnverifiedVaultConfig readConfigFromStorage(Path vaultPath) throws IOException {
+ Path configPath = vaultPath.resolve(Constants.VAULTCONFIG_FILENAME);
+ String token = Files.readString(configPath, StandardCharsets.US_ASCII);
+ return VaultConfig.decode(token);
+ }
+
+}
diff --git a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java
index 05ea8ce07..6a8c31d4f 100644
--- a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java
+++ b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java
@@ -18,7 +18,6 @@ import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Singleton;
-import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import java.io.IOException;
import java.nio.file.Files;
@@ -31,6 +30,7 @@ import java.util.ResourceBundle;
import static org.cryptomator.common.Constants.MASTERKEY_FILENAME;
import static org.cryptomator.common.Constants.VAULTCONFIG_FILENAME;
import static org.cryptomator.common.vaults.VaultState.Value.ERROR;
+import static org.cryptomator.common.vaults.VaultState.Value.LOCKED;
@Singleton
public class VaultListManager {
@@ -96,6 +96,11 @@ public class VaultListManager {
VaultComponent.Builder compBuilder = vaultComponentBuilder.vaultSettings(vaultSettings);
try {
VaultState.Value vaultState = determineVaultState(vaultSettings.path().get());
+ VaultConfigCache wrapper = new VaultConfigCache(vaultSettings);
+ compBuilder.vaultConfigCache(wrapper); //first set the wrapper in the builder, THEN try to load config
+ if (vaultState == LOCKED) { //for legacy reasons: pre v8 vault do not have a config, but they are in the NEEDS_MIGRATION state
+ wrapper.reloadConfig();
+ }
compBuilder.initialVaultState(vaultState);
} catch (IOException e) {
LOG.warn("Failed to determine vault state for " + vaultSettings.path().get(), e);
@@ -112,6 +117,9 @@ public class VaultListManager {
case LOCKED, NEEDS_MIGRATION, MISSING -> {
try {
var determinedState = determineVaultState(vault.getPath());
+ if (determinedState == LOCKED) {
+ vault.getVaultConfigCache().reloadConfig();
+ }
state.set(determinedState);
yield determinedState;
} catch (IOException e) {
@@ -132,7 +140,9 @@ public class VaultListManager {
return switch (CryptoFileSystemProvider.checkDirStructureForVault(pathToVault, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME)) {
case VAULT -> VaultState.Value.LOCKED;
case UNRELATED -> VaultState.Value.MISSING;
- case MAYBE_LEGACY -> Migrators.get().needsMigration(pathToVault, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME) ? VaultState.Value.NEEDS_MIGRATION : VaultState.Value.MISSING;
+ case MAYBE_LEGACY -> Migrators.get().needsMigration(pathToVault, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME) ? //
+ VaultState.Value.NEEDS_MIGRATION //
+ : VaultState.Value.MISSING;
};
}
diff --git a/src/main/java/org/cryptomator/common/vaults/WebDavVolume.java b/src/main/java/org/cryptomator/common/vaults/WebDavVolume.java
index b1850bc1e..3ac1820d4 100644
--- a/src/main/java/org/cryptomator/common/vaults/WebDavVolume.java
+++ b/src/main/java/org/cryptomator/common/vaults/WebDavVolume.java
@@ -70,7 +70,7 @@ public class WebDavVolume implements Volume {
//on windows, prevent an automatic drive letter selection in the upstream library. Either we choose already a specific one or there is no free.
Supplier driveLetterSupplier;
if (System.getProperty("os.name").toLowerCase().contains("windows") && vaultSettings.winDriveLetter().isEmpty().get()) {
- driveLetterSupplier = () -> windowsDriveLetters.getAvailableDriveLetter().orElse(null);
+ driveLetterSupplier = () -> windowsDriveLetters.getDesiredAvailableDriveLetter().orElse(null);
} else {
driveLetterSupplier = () -> vaultSettings.winDriveLetter().get();
}
diff --git a/src/main/java/org/cryptomator/common/vaults/WindowsDriveLetters.java b/src/main/java/org/cryptomator/common/vaults/WindowsDriveLetters.java
index f3ef2c7dc..9ca56b462 100644
--- a/src/main/java/org/cryptomator/common/vaults/WindowsDriveLetters.java
+++ b/src/main/java/org/cryptomator/common/vaults/WindowsDriveLetters.java
@@ -22,11 +22,11 @@ import java.util.stream.StreamSupport;
@Singleton
public final class WindowsDriveLetters {
- private static final Set C_TO_Z;
+ private static final Set A_TO_Z;
static {
- try (IntStream stream = IntStream.rangeClosed('C', 'Z')) {
- C_TO_Z = stream.mapToObj(i -> String.valueOf((char) i)).collect(ImmutableSet.toImmutableSet());
+ try (IntStream stream = IntStream.rangeClosed('A', 'Z')) {
+ A_TO_Z = stream.mapToObj(i -> String.valueOf((char) i)).collect(ImmutableSet.toImmutableSet());
}
}
@@ -35,7 +35,7 @@ public final class WindowsDriveLetters {
}
public Set getAllDriveLetters() {
- return C_TO_Z;
+ return A_TO_Z;
}
public Set getOccupiedDriveLetters() {
@@ -59,6 +59,26 @@ public final class WindowsDriveLetters {
return getAvailableDriveLetter().map(this::toPath);
}
+ /**
+ * Skips A and B and only returns them if all other are occupied.
+ *
+ * @return an Optional containing either the letter of a free drive letter or empty, if none is available
+ */
+ public Optional getDesiredAvailableDriveLetter() {
+ var availableDriveLetters = getAvailableDriveLetters();
+ var optString = availableDriveLetters.stream().filter(s -> !(s.equals("A") || s.equals("B"))).findFirst();
+ return optString.or(() -> availableDriveLetters.stream().findFirst());
+ }
+
+ /**
+ * Skips A and B and only returns them if all other are occupied.
+ *
+ * @return an Optional containing either the path to a free drive letter or empty, if none is available
+ */
+ public Optional getDesiredAvailableDriveLetterPath() {
+ return getDesiredAvailableDriveLetter().map(this::toPath);
+ }
+
public Path toPath(String driveLetter) {
return Path.of(driveLetter + ":\\");
}
diff --git a/src/main/java/org/cryptomator/ipc/IpcCommunicator.java b/src/main/java/org/cryptomator/ipc/IpcCommunicator.java
index 0120389c9..776299549 100644
--- a/src/main/java/org/cryptomator/ipc/IpcCommunicator.java
+++ b/src/main/java/org/cryptomator/ipc/IpcCommunicator.java
@@ -44,7 +44,9 @@ public interface IpcCommunicator extends Closeable {
}
// Didn't get any connection yet? I.e. we're the first app instance, so let's launch a server:
try {
- return Server.create(socketPaths.iterator().next());
+ final var socketPath = socketPaths.iterator().next();
+ Files.deleteIfExists(socketPath); // ensure path does not exist before creating it
+ return Server.create(socketPath);
} catch (IOException e) {
LOG.warn("Failed to create IPC server", e);
return new LoopbackCommunicator();
diff --git a/src/main/java/org/cryptomator/ipc/Server.java b/src/main/java/org/cryptomator/ipc/Server.java
index e9a82c328..6058a608f 100644
--- a/src/main/java/org/cryptomator/ipc/Server.java
+++ b/src/main/java/org/cryptomator/ipc/Server.java
@@ -27,6 +27,7 @@ class Server implements IpcCommunicator {
}
public static Server create(Path socketPath) throws IOException {
+ Files.createDirectories(socketPath.getParent());
var address = UnixDomainSocketAddress.of(socketPath);
var serverSocketChannel = ServerSocketChannel.open(StandardProtocolFamily.UNIX);
serverSocketChannel.bind(address);
diff --git a/src/main/java/org/cryptomator/launcher/Cryptomator.java b/src/main/java/org/cryptomator/launcher/Cryptomator.java
index 18a748fd8..5502d804a 100644
--- a/src/main/java/org/cryptomator/launcher/Cryptomator.java
+++ b/src/main/java/org/cryptomator/launcher/Cryptomator.java
@@ -38,18 +38,16 @@ public class Cryptomator {
private final DebugMode debugMode;
private final Environment env;
private final Lazy ipcMessageHandler;
- private final Optional applicationVersion;
private final CountDownLatch shutdownLatch;
private final ShutdownHook shutdownHook;
private final Lazy uiLauncher;
@Inject
- Cryptomator(LoggerConfiguration logConfig, DebugMode debugMode, Environment env, Lazy ipcMessageHandler, @Named("applicationVersion") Optional applicationVersion, @Named("shutdownLatch") CountDownLatch shutdownLatch, ShutdownHook shutdownHook, Lazy uiLauncher) {
+ Cryptomator(LoggerConfiguration logConfig, DebugMode debugMode, Environment env, Lazy ipcMessageHandler, @Named("shutdownLatch") CountDownLatch shutdownLatch, ShutdownHook shutdownHook, Lazy uiLauncher) {
this.logConfig = logConfig;
this.debugMode = debugMode;
this.env = env;
this.ipcMessageHandler = ipcMessageHandler;
- this.applicationVersion = applicationVersion;
this.shutdownLatch = shutdownLatch;
this.shutdownHook = shutdownHook;
this.uiLauncher = uiLauncher;
@@ -69,7 +67,7 @@ public class Cryptomator {
*/
private int run(String[] args) {
logConfig.init();
- LOG.info("Starting Cryptomator {} on {} {} ({})", applicationVersion.orElse("SNAPSHOT"), SystemUtils.OS_NAME, SystemUtils.OS_VERSION, SystemUtils.OS_ARCH);
+ LOG.info("Starting Cryptomator {} on {} {} ({})", env.getAppVersion().orElse("SNAPSHOT"), SystemUtils.OS_NAME, SystemUtils.OS_VERSION, SystemUtils.OS_ARCH);
debugMode.initialize();
/*
diff --git a/src/main/java/org/cryptomator/launcher/CryptomatorModule.java b/src/main/java/org/cryptomator/launcher/CryptomatorModule.java
index 4afe332b6..906971492 100644
--- a/src/main/java/org/cryptomator/launcher/CryptomatorModule.java
+++ b/src/main/java/org/cryptomator/launcher/CryptomatorModule.java
@@ -18,11 +18,4 @@ class CryptomatorModule {
return new CountDownLatch(1);
}
- @Provides
- @Singleton
- @Named("applicationVersion")
- static Optional provideApplicationVersion() {
- return Optional.ofNullable(Cryptomator.class.getPackage().getImplementationVersion());
- }
-
}
diff --git a/src/main/java/org/cryptomator/ui/addvaultwizard/ChooseExistingVaultController.java b/src/main/java/org/cryptomator/ui/addvaultwizard/ChooseExistingVaultController.java
index 214ed19b0..4fceaa929 100644
--- a/src/main/java/org/cryptomator/ui/addvaultwizard/ChooseExistingVaultController.java
+++ b/src/main/java/org/cryptomator/ui/addvaultwizard/ChooseExistingVaultController.java
@@ -56,11 +56,10 @@ public class ChooseExistingVaultController implements FxController {
@FXML
public void initialize() {
- final String resource = SystemUtils.IS_OS_MAC ? "/img/select-masterkey-mac.png" : "/img/select-masterkey-win.png";
- try (InputStream in = getClass().getResourceAsStream(resource)) {
- this.screenshot = new Image(in);
- } catch (IOException e) {
- throw new UncheckedIOException(e);
+ if (SystemUtils.IS_OS_MAC) {
+ this.screenshot = new Image(getClass().getResource("/img/select-masterkey-mac.png").toString());
+ } else {
+ this.screenshot = new Image(getClass().getResource("/img/select-masterkey-win.png").toString());
}
}
@@ -73,7 +72,7 @@ public class ChooseExistingVaultController implements FxController {
public void chooseFileAndNext() {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(resourceBundle.getString("addvaultwizard.existing.filePickerTitle"));
- fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Cryptomator Masterkey", "*.cryptomator"));
+ fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Cryptomator Vault", "*.cryptomator"));
File masterkeyFile = fileChooser.showOpenDialog(window);
if (masterkeyFile != null) {
vaultPath.setValue(masterkeyFile.toPath().toAbsolutePath().getParent());
diff --git a/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultLocationController.java b/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultLocationController.java
index 39e25d503..35f2be069 100644
--- a/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultLocationController.java
+++ b/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultLocationController.java
@@ -29,16 +29,20 @@ import javafx.scene.control.ToggleGroup;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import java.io.File;
+import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
import java.util.ResourceBundle;
+import java.util.UUID;
@AddVaultWizardScoped
public class CreateNewVaultLocationController implements FxController {
private static final Logger LOG = LoggerFactory.getLogger(CreateNewVaultLocationController.class);
private static final Path DEFAULT_CUSTOM_VAULT_PATH = Paths.get(System.getProperty("user.home"));
+ private static final String TEMP_FILE_FORMAT = "cryptomator-%s.tmp";
private final Stage window;
private final Lazy chooseNameScene;
@@ -92,7 +96,7 @@ public class CreateNewVaultLocationController implements FxController {
statusText.set(resourceBundle.getString("addvaultwizard.new.locationDoesNotExist"));
statusGraphic.set(badLocation);
return false;
- } else if (!Files.isWritable(p.getParent())) {
+ } else if (!isActuallyWritable(p.getParent())) {
statusText.set(resourceBundle.getString("addvaultwizard.new.locationIsNotWritable"));
statusGraphic.set(badLocation);
return false;
@@ -107,6 +111,21 @@ public class CreateNewVaultLocationController implements FxController {
}
}
+ private boolean isActuallyWritable(Path p) {
+ Path tmpFile = p.resolve(String.format(TEMP_FILE_FORMAT, UUID.randomUUID()));
+ try (var chan = Files.newByteChannel(tmpFile, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE, StandardOpenOption.DELETE_ON_CLOSE)) {
+ return true;
+ } catch (IOException e) {
+ return false;
+ } finally {
+ try {
+ Files.deleteIfExists(tmpFile);
+ } catch (IOException e) {
+ LOG.warn("Unable to delete temporary file {}. Needs to be deleted manually.", tmpFile);
+ }
+ }
+ }
+
@FXML
public void initialize() {
predefinedLocationToggler.selectedToggleProperty().addListener(this::togglePredefinedLocation);
diff --git a/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java b/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java
index 578b90969..b71bf0569 100644
--- a/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java
+++ b/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java
@@ -44,8 +44,10 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.security.SecureRandom;
+import java.util.Comparator;
import java.util.ResourceBundle;
import java.util.concurrent.ExecutorService;
+import java.util.concurrent.atomic.AtomicBoolean;
import static java.nio.charset.StandardCharsets.US_ASCII;
import static org.cryptomator.common.Constants.MASTERKEY_FILENAME;
@@ -195,12 +197,28 @@ public class CreateNewVaultPasswordController implements FxController {
} catch (CryptoException e) {
throw new IOException("Failed initialize vault.", e);
}
+ } finally {
+ AtomicBoolean cleanupFailed = new AtomicBoolean(false);
+ Files.walk(path)
+ .sorted(Comparator.reverseOrder())
+ .forEach(p -> {
+ try {
+ Files.deleteIfExists(p);
+ } catch (IOException e) {
+ cleanupFailed.set(false);
+ }
+ });
+ if(cleanupFailed.get()) {
+ LOG.warn("Failed to cleanup after failed vault creation at {}. Leftovers need to be deleted manually.", path);
+ }
}
// 4. write vault-external readme file:
String storagePathReadmeFileName = resourceBundle.getString("addvault.new.readme.storageLocation.fileName");
try (WritableByteChannel ch = Files.newByteChannel(path.resolve(storagePathReadmeFileName), StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE)) {
ch.write(US_ASCII.encode(readmeGenerator.createVaultStorageLocationReadmeRtf()));
+ } catch (IOException e) {
+ LOG.warn("Unable to create vault storage location readme.", e);
}
LOG.info("Created vault at {}", path);
diff --git a/src/main/java/org/cryptomator/ui/addvaultwizard/LocationPresets.java b/src/main/java/org/cryptomator/ui/addvaultwizard/LocationPresets.java
index 6cec655cb..313a31dc9 100644
--- a/src/main/java/org/cryptomator/ui/addvaultwizard/LocationPresets.java
+++ b/src/main/java/org/cryptomator/ui/addvaultwizard/LocationPresets.java
@@ -14,7 +14,7 @@ public class LocationPresets {
private static final String USER_HOME = System.getProperty("user.home");
private static final String[] ICLOUDDRIVE_LOCATIONS = {"~/Library/Mobile Documents/iCloud~com~setolabs~Cryptomator/Documents", "~/iCloudDrive/iCloud~com~setolabs~Cryptomator"};
private static final String[] DROPBOX_LOCATIONS = {"~/Dropbox"};
- private static final String[] GDRIVE_LOCATIONS = {"~/Google Drive"};
+ private static final String[] GDRIVE_LOCATIONS = {"~/Google Drive/My Drive", "~/Google Drive"};
private static final String[] ONEDRIVE_LOCATIONS = {"~/OneDrive"};
private static final String[] MEGA_LOCATIONS = {"~/MEGA"};
private static final String[] PCLOUD_LOCATIONS = {"~/pCloudDrive"};
diff --git a/src/main/java/org/cryptomator/ui/common/ErrorController.java b/src/main/java/org/cryptomator/ui/common/ErrorController.java
index 85b335b15..c75df26ce 100644
--- a/src/main/java/org/cryptomator/ui/common/ErrorController.java
+++ b/src/main/java/org/cryptomator/ui/common/ErrorController.java
@@ -1,22 +1,47 @@
package org.cryptomator.ui.common;
+import org.cryptomator.common.ErrorCode;
import org.cryptomator.common.Nullable;
import javax.inject.Inject;
import javax.inject.Named;
+import javafx.application.Application;
+import javafx.application.Platform;
+import javafx.beans.property.BooleanProperty;
+import javafx.beans.property.SimpleBooleanProperty;
import javafx.fxml.FXML;
import javafx.scene.Scene;
+import javafx.scene.input.Clipboard;
+import javafx.scene.input.ClipboardContent;
import javafx.stage.Stage;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
public class ErrorController implements FxController {
+ private static final String SEARCH_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/categories/errors?discussions_q=category:Errors+%s";
+ private static final String REPORT_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/new?category=Errors&title=Error+%s&body=%s";
+ private static final String SEARCH_ERRORCODE_DELIM = " OR ";
+ private static final String REPORT_BODY_TEMPLATE = """
+
+
+ """;
+
+ private final Application application;
private final String stackTrace;
+ private final ErrorCode errorCode;
private final Scene previousScene;
private final Stage window;
+ private BooleanProperty copiedDetails = new SimpleBooleanProperty();
+
@Inject
- ErrorController(@Named("stackTrace") String stackTrace, @Nullable Scene previousScene, Stage window) {
+ ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window) {
+ this.application = application;
this.stackTrace = stackTrace;
+ this.errorCode = errorCode;
this.previousScene = previousScene;
this.window = window;
}
@@ -33,6 +58,31 @@ public class ErrorController implements FxController {
window.close();
}
+ @FXML
+ public void searchError() {
+ var searchTerm = URLEncoder.encode(getErrorCode().replace(ErrorCode.DELIM, SEARCH_ERRORCODE_DELIM), StandardCharsets.UTF_8);
+ application.getHostServices().showDocument(SEARCH_URL_FORMAT.formatted(searchTerm));
+ }
+
+ @FXML
+ public void reportError() {
+ var title = URLEncoder.encode(getErrorCode(), StandardCharsets.UTF_8);
+ var body = URLEncoder.encode(REPORT_BODY_TEMPLATE, StandardCharsets.UTF_8);
+ application.getHostServices().showDocument(REPORT_URL_FORMAT.formatted(title, body));
+ }
+
+ @FXML
+ public void copyDetails() {
+ ClipboardContent clipboardContent = new ClipboardContent();
+ clipboardContent.putString(getDetailText());
+ Clipboard.getSystemClipboard().setContent(clipboardContent);
+
+ copiedDetails.set(true);
+ CompletableFuture.delayedExecutor(2, TimeUnit.SECONDS, Platform::runLater).execute(() -> {
+ copiedDetails.set(false);
+ });
+ }
+
/* Getter/Setter */
public boolean isPreviousScenePresent() {
@@ -42,4 +92,20 @@ public class ErrorController implements FxController {
public String getStackTrace() {
return stackTrace;
}
+
+ public String getErrorCode() {
+ return errorCode.toString();
+ }
+
+ public String getDetailText() {
+ return "```\nError Code " + getErrorCode() + "\n" + getStackTrace() + "\n```";
+ }
+
+ public BooleanProperty copiedDetailsProperty() {
+ return copiedDetails;
+ }
+
+ public boolean getCopiedDetails() {
+ return copiedDetails.get();
+ }
}
diff --git a/src/main/java/org/cryptomator/ui/common/ErrorModule.java b/src/main/java/org/cryptomator/ui/common/ErrorModule.java
index d2515e661..01b8790c1 100644
--- a/src/main/java/org/cryptomator/ui/common/ErrorModule.java
+++ b/src/main/java/org/cryptomator/ui/common/ErrorModule.java
@@ -4,6 +4,7 @@ import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
+import org.cryptomator.common.ErrorCode;
import javax.inject.Named;
import javax.inject.Provider;
@@ -31,6 +32,11 @@ abstract class ErrorModule {
return baos.toString(StandardCharsets.UTF_8);
}
+ @Provides
+ static ErrorCode provideErrorCode(Throwable cause) {
+ return ErrorCode.of(cause);
+ }
+
@Binds
@IntoMap
@FxControllerKey(ErrorController.class)
diff --git a/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/src/main/java/org/cryptomator/ui/common/FxmlFile.java
index 3588b0fe4..518671de8 100644
--- a/src/main/java/org/cryptomator/ui/common/FxmlFile.java
+++ b/src/main/java/org/cryptomator/ui/common/FxmlFile.java
@@ -12,7 +12,6 @@ public enum FxmlFile {
ERROR("/fxml/error.fxml"), //
FORGET_PASSWORD("/fxml/forget_password.fxml"), //
HEALTH_START("/fxml/health_start.fxml"), //
- HEALTH_START_FAIL("/fxml/health_start_fail.fxml"), //
HEALTH_CHECK_LIST("/fxml/health_check_list.fxml"), //
HUB_AUTH_FLOW("/fxml/hub_auth_flow.fxml"), //
HUB_RECEIVE_KEY("/fxml/hub_receive_key.fxml"), //
diff --git a/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java b/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java
index 15b1718e1..66eda7556 100644
--- a/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java
+++ b/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java
@@ -12,6 +12,7 @@ public enum FontAwesome5Icon {
CARET_RIGHT("\uF0Da"), //
CHECK("\uF00C"), //
CLOCK("\uF017"), //
+ CLIPBOARD("\uF328"), //
COG("\uF013"), //
COGS("\uF085"), //
COPY("\uF0C5"), //
diff --git a/src/main/java/org/cryptomator/ui/controls/SecurePasswordField.java b/src/main/java/org/cryptomator/ui/controls/SecurePasswordField.java
index 4e5e1cfe0..43193830b 100644
--- a/src/main/java/org/cryptomator/ui/controls/SecurePasswordField.java
+++ b/src/main/java/org/cryptomator/ui/controls/SecurePasswordField.java
@@ -10,6 +10,7 @@ package org.cryptomator.ui.controls;
import com.google.common.base.Strings;
+import javafx.application.Platform;
import javafx.beans.NamedArg;
import javafx.beans.Observable;
import javafx.beans.property.BooleanProperty;
@@ -27,7 +28,6 @@ import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.TransferMode;
-import java.awt.Toolkit;
import java.nio.CharBuffer;
import java.text.Normalizer;
import java.text.Normalizer.Form;
@@ -123,8 +123,7 @@ public class SecurePasswordField extends TextField {
}
private void updateCapsLocked() {
- //TODO: fixed in JavaFX 17. AWT code needed until update (see https://bugs.openjdk.java.net/browse/JDK-8259680)
- capsLocked.set(isFocused() && Toolkit.getDefaultToolkit().getLockingKeyState(java.awt.event.KeyEvent.VK_CAPS_LOCK));
+ capsLocked.set(Platform.isKeyLocked(KeyCode.CAPS).orElse(false));
}
private void updateContainingNonPrintableChars() {
diff --git a/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java b/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java
index d68521b6d..729791356 100644
--- a/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java
+++ b/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java
@@ -1,5 +1,6 @@
package org.cryptomator.ui.fxapp;
+import org.cryptomator.common.Environment;
import org.cryptomator.common.settings.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,9 +32,9 @@ public class UpdateChecker {
private final ScheduledService updateCheckerService;
@Inject
- UpdateChecker(Settings settings, @Named("applicationVersion") Optional applicationVersion, @Named("latestVersion") StringProperty latestVersionProperty, @Named("SemVer") Comparator semVerComparator, ScheduledService updateCheckerService) {
+ UpdateChecker(Settings settings, Environment env, @Named("latestVersion") StringProperty latestVersionProperty, @Named("SemVer") Comparator semVerComparator, ScheduledService updateCheckerService) {
this.settings = settings;
- this.applicationVersion = applicationVersion;
+ this.applicationVersion = env.getAppVersion();
this.latestVersionProperty = latestVersionProperty;
this.semVerComparator = semVerComparator;
this.updateCheckerService = updateCheckerService;
diff --git a/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerModule.java b/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerModule.java
index ef8621f3b..8c9f7fb20 100644
--- a/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerModule.java
+++ b/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerModule.java
@@ -3,6 +3,7 @@ package org.cryptomator.ui.fxapp;
import dagger.Module;
import dagger.Provides;
import org.apache.commons.lang3.SystemUtils;
+import org.cryptomator.common.Environment;
import org.cryptomator.common.settings.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,9 +52,9 @@ public abstract class UpdateCheckerModule {
@Provides
@FxApplicationScoped
- static HttpRequest provideCheckForUpdatesRequest(@Named("applicationVersion") Optional applicationVersion) {
+ static HttpRequest provideCheckForUpdatesRequest(Environment env) {
String userAgent = String.format("Cryptomator VersionChecker/%s %s %s (%s)", //
- applicationVersion.orElse("SNAPSHOT"), //
+ env.getAppVersion().orElse("SNAPSHOT"), //
SystemUtils.OS_NAME, //
SystemUtils.OS_VERSION, //
SystemUtils.OS_ARCH); //
diff --git a/src/main/java/org/cryptomator/ui/health/CheckListCellController.java b/src/main/java/org/cryptomator/ui/health/CheckListCellController.java
index 799b73358..5ef2926ef 100644
--- a/src/main/java/org/cryptomator/ui/health/CheckListCellController.java
+++ b/src/main/java/org/cryptomator/ui/health/CheckListCellController.java
@@ -1,16 +1,14 @@
package org.cryptomator.ui.health;
import com.tobiasdiez.easybind.EasyBind;
-import com.tobiasdiez.easybind.Subscription;
import org.cryptomator.ui.common.FxController;
import javax.inject.Inject;
import javafx.beans.binding.Binding;
+import javafx.beans.binding.Bindings;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.control.CheckBox;
-import java.util.ArrayList;
-import java.util.List;
public class CheckListCellController implements FxController {
@@ -18,26 +16,26 @@ public class CheckListCellController implements FxController {
private final ObjectProperty check;
private final Binding checkName;
private final Binding checkRunnable;
- private final List subscriptions;
/* FXML */
- public CheckBox forRunSelectedCheckBox;
+ public CheckBox checkbox;
@Inject
public CheckListCellController() {
check = new SimpleObjectProperty<>();
checkRunnable = EasyBind.wrapNullable(check).mapObservable(Check::stateProperty).map(Check.CheckState.RUNNABLE::equals).orElse(false);
checkName = EasyBind.wrapNullable(check).map(Check::getName).orElse("");
- subscriptions = new ArrayList<>();
}
public void initialize() {
- subscriptions.add(EasyBind.subscribe(check, c -> {
- forRunSelectedCheckBox.selectedProperty().unbind();
- if (c != null) {
- forRunSelectedCheckBox.selectedProperty().bindBidirectional(c.chosenForExecutionProperty());
+ check.addListener((observable, oldVal, newVal) -> {
+ if (oldVal != null) {
+ Bindings.unbindBidirectional(checkbox.selectedProperty(), oldVal.chosenForExecutionProperty());
}
- }));
+ if (newVal != null) {
+ Bindings.bindBidirectional(checkbox.selectedProperty(), newVal.chosenForExecutionProperty());
+ }
+ });
}
public ObjectProperty checkProperty() {
diff --git a/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java b/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java
index f78e815c6..aa69e0828 100644
--- a/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java
+++ b/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java
@@ -16,26 +16,15 @@ import javafx.stage.Stage;
@Subcomponent(modules = {HealthCheckModule.class})
public interface HealthCheckComponent {
- LoadUnverifiedConfigResult loadConfig();
-
@HealthCheckWindow
Stage window();
@FxmlScene(FxmlFile.HEALTH_START)
Lazy startScene();
- @FxmlScene(FxmlFile.HEALTH_START_FAIL)
- Lazy failScene();
-
default Stage showHealthCheckWindow() {
Stage stage = window();
- // TODO reevaluate config loading, as soon as we have the new generic error screen
- var unverifiedConf = loadConfig();
- if (unverifiedConf.config() != null) {
- stage.setScene(startScene().get());
- } else {
- stage.setScene(failScene().get());
- }
+ stage.setScene(startScene().get());
stage.show();
return stage;
}
@@ -52,5 +41,4 @@ public interface HealthCheckComponent {
HealthCheckComponent build();
}
- record LoadUnverifiedConfigResult(VaultConfig.UnverifiedVaultConfig config, Throwable error) {}
}
diff --git a/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java b/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java
index ad5ac6156..c36f486e0 100644
--- a/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java
+++ b/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java
@@ -27,7 +27,6 @@ import javafx.scene.Scene;
import javafx.stage.Modality;
import javafx.stage.Stage;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -37,18 +36,6 @@ import java.util.concurrent.atomic.AtomicReference;
@Module(subcomponents = {KeyLoadingComponent.class})
abstract class HealthCheckModule {
- // TODO reevaluate config loading, as soon as we have the new generic error screen
- @Provides
- @HealthCheckScoped
- static HealthCheckComponent.LoadUnverifiedConfigResult provideLoadConfigResult(@HealthCheckWindow Vault vault) {
- try {
- return new HealthCheckComponent.LoadUnverifiedConfigResult(vault.getUnverifiedVaultConfig(), null);
- } catch (IOException e) {
- return new HealthCheckComponent.LoadUnverifiedConfigResult(null, e);
- }
- }
-
-
@Provides
@HealthCheckScoped
static AtomicReference provideMasterkeyRef() {
@@ -129,13 +116,6 @@ abstract class HealthCheckModule {
return fxmlLoaders.createScene(FxmlFile.HEALTH_START);
}
- @Provides
- @FxmlScene(FxmlFile.HEALTH_START_FAIL)
- @HealthCheckScoped
- static Scene provideHealthStartFailScene(@HealthCheckWindow FxmlLoaderFactory fxmlLoaders) {
- return fxmlLoaders.createScene(FxmlFile.HEALTH_START_FAIL);
- }
-
@Provides
@FxmlScene(FxmlFile.HEALTH_CHECK_LIST)
@HealthCheckScoped
@@ -148,11 +128,6 @@ abstract class HealthCheckModule {
@FxControllerKey(StartController.class)
abstract FxController bindStartController(StartController controller);
- @Binds
- @IntoMap
- @FxControllerKey(StartFailController.class)
- abstract FxController bindStartFailController(StartFailController controller);
-
@Binds
@IntoMap
@FxControllerKey(CheckListController.class)
diff --git a/src/main/java/org/cryptomator/ui/health/StartController.java b/src/main/java/org/cryptomator/ui/health/StartController.java
index ec980b9f0..44c3f3a8f 100644
--- a/src/main/java/org/cryptomator/ui/health/StartController.java
+++ b/src/main/java/org/cryptomator/ui/health/StartController.java
@@ -1,7 +1,8 @@
package org.cryptomator.ui.health;
-import com.google.common.base.Preconditions;
import dagger.Lazy;
+import org.cryptomator.common.vaults.Vault;
+import org.cryptomator.common.vaults.VaultConfigCache;
import org.cryptomator.cryptofs.VaultConfig;
import org.cryptomator.cryptofs.VaultConfigLoadException;
import org.cryptomator.cryptofs.VaultKeyInvalidException;
@@ -18,8 +19,6 @@ import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Named;
import javafx.application.Platform;
-import javafx.beans.property.ObjectProperty;
-import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.scene.Scene;
import javafx.stage.Stage;
@@ -35,7 +34,7 @@ public class StartController implements FxController {
private final Stage window;
private final Stage unlockWindow;
- private final ObjectProperty unverifiedVaultConfig;
+ private final VaultConfigCache vaultConfig;
private final KeyLoadingStrategy keyLoadingStrategy;
private final ExecutorService executor;
private final AtomicReference masterkeyRef;
@@ -44,11 +43,10 @@ public class StartController implements FxController {
private final Lazy errorComponent;
@Inject
- public StartController(@HealthCheckWindow Stage window, HealthCheckComponent.LoadUnverifiedConfigResult configLoadResult, @HealthCheckWindow KeyLoadingStrategy keyLoadingStrategy, ExecutorService executor, AtomicReference masterkeyRef, AtomicReference vaultConfigRef, @FxmlScene(FxmlFile.HEALTH_CHECK_LIST) Lazy checkScene, Lazy errorComponent, @Named("unlockWindow") Stage unlockWindow) {
- Preconditions.checkNotNull(configLoadResult.config());
+ public StartController(@HealthCheckWindow Stage window, @HealthCheckWindow Vault vault, @HealthCheckWindow KeyLoadingStrategy keyLoadingStrategy, ExecutorService executor, AtomicReference masterkeyRef, AtomicReference vaultConfigRef, @FxmlScene(FxmlFile.HEALTH_CHECK_LIST) Lazy checkScene, Lazy errorComponent, @Named("unlockWindow") Stage unlockWindow) {
this.window = window;
this.unlockWindow = unlockWindow;
- this.unverifiedVaultConfig = new SimpleObjectProperty<>(configLoadResult.config());
+ this.vaultConfig = vault.getVaultConfigCache();
this.keyLoadingStrategy = keyLoadingStrategy;
this.executor = executor;
this.masterkeyRef = masterkeyRef;
@@ -71,7 +69,6 @@ public class StartController implements FxController {
private void loadKey() {
assert !Platform.isFxApplicationThread();
- assert unverifiedVaultConfig.get() != null;
try {
keyLoadingStrategy.use(this::verifyVaultConfig);
} catch (VaultConfigLoadException | UnlockCancelledException e) {
@@ -80,7 +77,7 @@ public class StartController implements FxController {
}
private void verifyVaultConfig(KeyLoadingStrategy keyLoadingStrategy) throws VaultConfigLoadException {
- var unverifiedCfg = unverifiedVaultConfig.get();
+ var unverifiedCfg = vaultConfig.getUnchecked();
try (var masterkey = keyLoadingStrategy.loadKey(unverifiedCfg.getKeyId())) {
var verifiedCfg = unverifiedCfg.verify(masterkey.getEncoded(), unverifiedCfg.allegedVaultVersion());
vaultConfigRef.set(verifiedCfg);
diff --git a/src/main/java/org/cryptomator/ui/health/StartFailController.java b/src/main/java/org/cryptomator/ui/health/StartFailController.java
deleted file mode 100644
index 826766026..000000000
--- a/src/main/java/org/cryptomator/ui/health/StartFailController.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.cryptomator.ui.health;
-
-import com.google.common.base.Preconditions;
-import org.cryptomator.cryptofs.VaultConfigLoadException;
-import org.cryptomator.ui.common.FxController;
-import org.cryptomator.ui.controls.FontAwesome5Icon;
-
-import javax.inject.Inject;
-import javafx.beans.property.ObjectProperty;
-import javafx.beans.property.SimpleObjectProperty;
-import javafx.beans.value.ObservableValue;
-import javafx.fxml.FXML;
-import javafx.scene.control.TitledPane;
-import javafx.stage.Stage;
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import java.nio.charset.StandardCharsets;
-
-// TODO reevaluate config loading, as soon as we have the new generic error screen
-@HealthCheckScoped
-public class StartFailController implements FxController {
-
- private final Stage window;
- private final ObjectProperty loadError;
- private final ObjectProperty moreInfoIcon;
-
- /* FXML */
- public TitledPane moreInfoPane;
-
- @Inject
- public StartFailController(@HealthCheckWindow Stage window, HealthCheckComponent.LoadUnverifiedConfigResult configLoadResult) {
- Preconditions.checkNotNull(configLoadResult.error());
- this.window = window;
- this.loadError = new SimpleObjectProperty<>(configLoadResult.error());
- this.moreInfoIcon = new SimpleObjectProperty<>(FontAwesome5Icon.CARET_RIGHT);
- }
-
- public void initialize() {
- moreInfoPane.expandedProperty().addListener(this::setMoreInfoIcon);
- }
-
- private void setMoreInfoIcon(ObservableValue extends Boolean> observable, boolean wasExpanded, boolean willExpand) {
- moreInfoIcon.set(willExpand ? FontAwesome5Icon.CARET_DOWN : FontAwesome5Icon.CARET_RIGHT);
- }
-
- @FXML
- public void close() {
- window.close();
- }
-
- /* Getter & Setter */
-
- public ObjectProperty moreInfoIconProperty() {
- return moreInfoIcon;
- }
-
- public FontAwesome5Icon getMoreInfoIcon() {
- return moreInfoIcon.getValue();
- }
-
- public String getStackTrace() {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- loadError.get().printStackTrace(new PrintStream(baos));
- return baos.toString(StandardCharsets.UTF_8);
- }
-
- public String getLocalizedErrorMessage() {
- return loadError.get().getLocalizedMessage();
- }
-
- public boolean isParseException() {
- return loadError.get() instanceof VaultConfigLoadException;
- }
-
- public boolean isIoException() {
- return !isParseException();
- }
-
-}
diff --git a/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingModule.java b/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingModule.java
index 3e0ed5572..21240b97a 100644
--- a/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingModule.java
+++ b/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingModule.java
@@ -3,7 +3,6 @@ package org.cryptomator.ui.keyloading;
import dagger.Module;
import dagger.Provides;
import org.cryptomator.common.vaults.Vault;
-import org.cryptomator.cryptofs.VaultConfig.UnverifiedVaultConfig;
import org.cryptomator.ui.common.DefaultSceneFactory;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.common.FxmlLoaderFactory;
@@ -12,9 +11,7 @@ import org.cryptomator.ui.keyloading.masterkeyfile.MasterkeyFileLoadingModule;
import javax.inject.Provider;
import java.io.IOException;
-import java.net.URI;
import java.util.Map;
-import java.util.Optional;
import java.util.ResourceBundle;
@Module(includes = {MasterkeyFileLoadingModule.class, HubKeyLoadingModule.class})
@@ -32,7 +29,7 @@ abstract class KeyLoadingModule {
@KeyLoadingScoped
static KeyLoadingStrategy provideKeyLoaderProvider(@KeyLoading Vault vault, Map> strategies) {
try {
- String scheme = vault.getUnverifiedVaultConfig().getKeyId().getScheme();
+ String scheme = vault.getVaultConfigCache().get().getKeyId().getScheme();
var fallback = KeyLoadingStrategy.failed(new IllegalArgumentException("Unsupported key id " + scheme));
return strategies.getOrDefault(scheme, () -> fallback).get();
} catch (IOException e) {
diff --git a/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java b/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java
index 614247ebc..f3f0aff8e 100644
--- a/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java
+++ b/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java
@@ -77,6 +77,7 @@ public interface KeyLoadingStrategy extends MasterkeyLoader {
boolean success = false;
try {
user.use(this);
+ success = true;
} catch (MasterkeyLoadingFailedException e) {
if (recoverFromException(e)) {
LOG.info("Unlock attempt threw {}. Reattempting...", e.getClass().getSimpleName());
diff --git a/src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingModule.java b/src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingModule.java
index 7ec46cd7a..7c76bc229 100644
--- a/src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingModule.java
+++ b/src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingModule.java
@@ -40,7 +40,7 @@ public abstract class HubKeyLoadingModule {
@KeyLoadingScoped
static HubConfig provideHubConfig(@KeyLoading Vault vault) {
try {
- return vault.getUnverifiedVaultConfig().getHeader("hub", HubConfig.class);
+ return vault.getVaultConfigCache().get().getHeader("hub", HubConfig.class);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
diff --git a/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java b/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java
index 5c8d488fd..e16df1994 100644
--- a/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java
+++ b/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java
@@ -150,7 +150,7 @@ public class ReceiveKeyController implements FxController {
private static URI getVaultBaseUri(Vault vault) {
try {
- var kid = vault.getUnverifiedVaultConfig().getKeyId();
+ var kid = vault.getVaultConfigCache().get().getKeyId();
assert kid.getScheme().startsWith(SCHEME_PREFIX);
var hubUriScheme = kid.getScheme().substring(SCHEME_PREFIX.length());
return new URI(hubUriScheme, kid.getSchemeSpecificPart(), kid.getFragment());
diff --git a/src/main/java/org/cryptomator/ui/launcher/AppLaunchEventHandler.java b/src/main/java/org/cryptomator/ui/launcher/AppLaunchEventHandler.java
index f4e5bb790..52ba838c0 100644
--- a/src/main/java/org/cryptomator/ui/launcher/AppLaunchEventHandler.java
+++ b/src/main/java/org/cryptomator/ui/launcher/AppLaunchEventHandler.java
@@ -11,12 +11,11 @@ import javax.inject.Named;
import javax.inject.Singleton;
import javafx.application.Platform;
import java.io.IOException;
-import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
-import static org.cryptomator.common.Constants.MASTERKEY_FILENAME;
+import static org.cryptomator.common.Constants.CRYPTOMATOR_FILENAME_EXT;
@Singleton
class AppLaunchEventHandler {
@@ -69,7 +68,7 @@ class AppLaunchEventHandler {
assert Platform.isFxApplicationThread();
try {
final Vault v;
- if (potentialVaultPath.getFileName().toString().equals(MASTERKEY_FILENAME)) {
+ if (potentialVaultPath.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT)) {
v = vaultListManager.add(potentialVaultPath.getParent());
} else {
v = vaultListManager.add(potentialVaultPath);
diff --git a/src/main/java/org/cryptomator/ui/launcher/UiLauncherModule.java b/src/main/java/org/cryptomator/ui/launcher/UiLauncherModule.java
index f85659c53..c30efa30e 100644
--- a/src/main/java/org/cryptomator/ui/launcher/UiLauncherModule.java
+++ b/src/main/java/org/cryptomator/ui/launcher/UiLauncherModule.java
@@ -2,6 +2,7 @@ package org.cryptomator.ui.launcher;
import dagger.Module;
import dagger.Provides;
+import org.cryptomator.common.PluginClassLoader;
import org.cryptomator.integrations.autostart.AutoStartProvider;
import org.cryptomator.integrations.tray.TrayIntegrationProvider;
import org.cryptomator.integrations.uiappearance.UiAppearanceProvider;
@@ -33,21 +34,21 @@ public abstract class UiLauncherModule {
@Provides
@Singleton
- static Optional provideAppearanceProvider() {
- return ServiceLoader.load(UiAppearanceProvider.class).findFirst();
+ static Optional provideAppearanceProvider(PluginClassLoader classLoader) {
+ return ServiceLoader.load(UiAppearanceProvider.class, classLoader).findFirst();
}
@Provides
@Singleton
- static Optional provideAutostartProvider() {
- return ServiceLoader.load(AutoStartProvider.class).findFirst();
+ static Optional provideAutostartProvider(PluginClassLoader classLoader) {
+ return ServiceLoader.load(AutoStartProvider.class, classLoader).findFirst();
}
@Provides
@Singleton
- static Optional provideTrayIntegrationProvider() {
- return ServiceLoader.load(TrayIntegrationProvider.class).findFirst();
+ static Optional provideTrayIntegrationProvider(PluginClassLoader classLoader) {
+ return ServiceLoader.load(TrayIntegrationProvider.class, classLoader).findFirst();
}
@Provides
diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java
index 392671246..c81aff125 100644
--- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java
+++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java
@@ -23,12 +23,11 @@ import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import java.io.File;
import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.util.Set;
import java.util.stream.Collectors;
+import static org.cryptomator.common.Constants.CRYPTOMATOR_FILENAME_EXT;
import static org.cryptomator.common.Constants.MASTERKEY_FILENAME;
import static org.cryptomator.common.Constants.VAULTCONFIG_FILENAME;
@@ -55,7 +54,7 @@ public class MainWindowController implements FxController {
@FXML
public void initialize() {
- LOG.debug("init MainWindowController");
+ LOG.trace("init MainWindowController");
root.setOnDragEntered(this::handleDragEvent);
root.setOnDragOver(this::handleDragEvent);
root.setOnDragDropped(this::handleDragEvent);
@@ -96,6 +95,9 @@ public class MainWindowController implements FxController {
private boolean containsVault(Path path) {
try {
+ if (path.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT)) {
+ path = path.getParent();
+ }
return CryptoFileSystemProvider.checkDirStructureForVault(path, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME) != DirStructure.UNRELATED;
} catch (IOException e) {
return false;
@@ -104,7 +106,7 @@ public class MainWindowController implements FxController {
private void addVault(Path pathToVault) {
try {
- if (pathToVault.getFileName().toString().equals(VAULTCONFIG_FILENAME)) {
+ if (pathToVault.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT)) {
vaultListManager.add(pathToVault.getParent());
} else {
vaultListManager.add(pathToVault);
diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java
index 90311bd5b..6f63db888 100644
--- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java
+++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java
@@ -6,29 +6,32 @@ import dagger.Provides;
import dagger.multibindings.IntoMap;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent;
-import org.cryptomator.ui.common.FxmlLoaderFactory;
+import org.cryptomator.ui.common.ErrorComponent;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.common.FxControllerKey;
import org.cryptomator.ui.common.FxmlFile;
+import org.cryptomator.ui.common.FxmlLoaderFactory;
import org.cryptomator.ui.common.FxmlScene;
import org.cryptomator.ui.common.StageFactory;
import org.cryptomator.ui.health.HealthCheckComponent;
import org.cryptomator.ui.migration.MigrationComponent;
import org.cryptomator.ui.removevault.RemoveVaultComponent;
-import org.cryptomator.ui.vaultoptions.VaultOptionsComponent;
import org.cryptomator.ui.stats.VaultStatisticsComponent;
+import org.cryptomator.ui.vaultoptions.VaultOptionsComponent;
import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent;
+import javax.inject.Named;
import javax.inject.Provider;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.Scene;
+import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import java.util.Map;
import java.util.ResourceBundle;
-@Module(subcomponents = {AddVaultWizardComponent.class, HealthCheckComponent.class, MigrationComponent.class, RemoveVaultComponent.class, VaultOptionsComponent.class, VaultStatisticsComponent.class, WrongFileAlertComponent.class})
+@Module(subcomponents = {AddVaultWizardComponent.class, HealthCheckComponent.class, MigrationComponent.class, RemoveVaultComponent.class, VaultOptionsComponent.class, VaultStatisticsComponent.class, WrongFileAlertComponent.class, ErrorComponent.class})
abstract class MainWindowModule {
@Provides
@@ -49,15 +52,23 @@ abstract class MainWindowModule {
@MainWindowScoped
static Stage provideStage(StageFactory factory) {
Stage stage = factory.create(StageStyle.UNDECORATED);
- // TODO: min/max values chosen arbitrarily. We might wanna take a look at the user's resolution...
stage.setMinWidth(650);
stage.setMinHeight(440);
- stage.setMaxWidth(1000);
- stage.setMaxHeight(700);
stage.setTitle("Cryptomator");
return stage;
}
+ @Provides
+ @MainWindowScoped
+ @Named("errorWindow")
+ static Stage provideErrorStage(@MainWindow Stage window, StageFactory factory, ResourceBundle resourceBundle) {
+ Stage stage = factory.create(StageStyle.DECORATED);
+ stage.setTitle(resourceBundle.getString("main.vaultDetail.error.windowTitle"));
+ stage.initModality(Modality.APPLICATION_MODAL);
+ stage.initOwner(window);
+ return stage;
+ }
+
@Provides
@FxmlScene(FxmlFile.MAIN_WINDOW)
@MainWindowScoped
diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java
index ef050e799..c8107415e 100644
--- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java
+++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java
@@ -16,6 +16,7 @@ import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.fxml.FXML;
+import javafx.scene.input.MouseButton;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
@@ -53,22 +54,43 @@ public class MainWindowTitleController implements FxController {
@FXML
public void initialize() {
- LOG.debug("init MainWindowTitleController");
+ LOG.trace("init MainWindowTitleController");
updateChecker.automaticallyCheckForUpdatesIfEnabled();
titleBar.setOnMousePressed(event -> {
xOffset = event.getSceneX();
yOffset = event.getSceneY();
+
+ });
+ titleBar.setOnMouseClicked(event -> {
+ if (event.getButton().equals(MouseButton.PRIMARY) && event.getClickCount() == 2) {
+ window.setFullScreen(!window.isFullScreen());
+ }
});
titleBar.setOnMouseDragged(event -> {
+ if (window.isFullScreen()) return;
window.setX(event.getScreenX() - xOffset);
window.setY(event.getScreenY() - yOffset);
});
+ titleBar.setOnDragDetected(mouseDragEvent -> {
+ titleBar.startFullDrag();
+ });
+ titleBar.setOnMouseDragReleased(mouseDragEvent -> {
+ saveWindowSettings();
+ });
+
window.setOnCloseRequest(event -> {
close();
event.consume();
});
}
+ private void saveWindowSettings() {
+ settings.windowYPositionProperty().setValue(window.getY());
+ settings.windowXPositionProperty().setValue(window.getX());
+ settings.windowWidthProperty().setValue(window.getWidth());
+ settings.windowHeightProperty().setValue(window.getHeight());
+ }
+
@FXML
public void close() {
if (trayMenuInitialized) {
diff --git a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java
index 908944d68..448d54d91 100644
--- a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java
+++ b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java
@@ -1,41 +1,100 @@
package org.cryptomator.ui.mainwindow;
+import org.cryptomator.common.settings.Settings;
import org.cryptomator.ui.common.FxController;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.inject.Inject;
+import javafx.beans.binding.Bindings;
+import javafx.beans.binding.BooleanBinding;
+import javafx.collections.ObservableList;
import javafx.fxml.FXML;
+import javafx.geometry.Rectangle2D;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Region;
+import javafx.stage.Screen;
import javafx.stage.Stage;
@MainWindow
public class ResizeController implements FxController {
+ private static final Logger LOG = LoggerFactory.getLogger(ResizeController.class);
+
private final Stage window;
public Region tlResizer;
public Region trResizer;
public Region blResizer;
public Region brResizer;
+ public Region tResizer;
+ public Region rResizer;
+ public Region bResizer;
+ public Region lResizer;
+ public Region lDefaultRegion;
+ public Region tDefaultRegion;
+ public Region rDefaultRegion;
+ public Region bDefaultRegion;
private double origX, origY, origW, origH;
+ private final Settings settings;
+
+ private final BooleanBinding showResizingArrows;
+
@Inject
- ResizeController(@MainWindow Stage window) {
+ ResizeController(@MainWindow Stage window, Settings settings) {
this.window = window;
- // TODO inject settings and save current position and size
+ this.settings = settings;
+ this.showResizingArrows = Bindings.createBooleanBinding(this::isShowResizingArrows, window.fullScreenProperty());
}
@FXML
public void initialize() {
- tlResizer.setOnMousePressed(this::startResize);
- trResizer.setOnMousePressed(this::startResize);
- blResizer.setOnMousePressed(this::startResize);
- brResizer.setOnMousePressed(this::startResize);
- tlResizer.setOnMouseDragged(this::resizeTopLeft);
- trResizer.setOnMouseDragged(this::resizeTopRight);
- blResizer.setOnMouseDragged(this::resizeBottomLeft);
- brResizer.setOnMouseDragged(this::resizeBottomRight);
+ LOG.trace("init ResizeController");
+
+ if (neverTouched()) {
+ settings.displayConfigurationProperty().setValue(getMonitorSizes());
+ return;
+ } else {
+ if (didDisplayConfigurationChange()) {
+ //If the position is illegal, then the window appears on the main screen in the middle of the window.
+ Rectangle2D primaryScreenBounds = Screen.getPrimary().getBounds();
+ window.setX((primaryScreenBounds.getWidth() - window.getMinWidth()) / 2);
+ window.setY((primaryScreenBounds.getHeight() - window.getMinHeight()) / 2);
+ window.setWidth(window.getMinWidth());
+ window.setHeight(window.getMinHeight());
+ } else {
+ window.setHeight(settings.windowHeightProperty().get() > window.getMinHeight() ? settings.windowHeightProperty().get() : window.getMinHeight());
+ window.setWidth(settings.windowWidthProperty().get() > window.getMinWidth() ? settings.windowWidthProperty().get() : window.getMinWidth());
+ window.setX(settings.windowXPositionProperty().get());
+ window.setY(settings.windowYPositionProperty().get());
+ }
+ }
+ savePositionalSettings();
+ }
+
+ private boolean neverTouched() {
+ return (settings.windowHeightProperty().get() == 0) && (settings.windowWidthProperty().get() == 0) && (settings.windowXPositionProperty().get() == 0) && (settings.windowYPositionProperty().get() == 0);
+ }
+
+ private boolean didDisplayConfigurationChange() {
+ String currentDisplayConfiguration = getMonitorSizes();
+ String settingsDisplayConfiguration = settings.displayConfigurationProperty().get();
+ boolean configurationHasChanged = !settingsDisplayConfiguration.equals(currentDisplayConfiguration);
+ if (configurationHasChanged) settings.displayConfigurationProperty().setValue(currentDisplayConfiguration);
+ return configurationHasChanged;
+ }
+
+ private String getMonitorSizes() {
+ ObservableList screens = Screen.getScreens();
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < screens.size(); i++) {
+ Rectangle2D screenBounds = screens.get(i).getBounds();
+ if (!sb.isEmpty()) sb.append(" ");
+ sb.append("displayId: " + i + ", " + screenBounds.getWidth() + "x" + screenBounds.getHeight() + ";");
+ }
+ return sb.toString();
}
private void startResize(MouseEvent evt) {
@@ -45,27 +104,33 @@ public class ResizeController implements FxController {
origH = window.getHeight();
}
+ @FXML
private void resizeTopLeft(MouseEvent evt) {
resizeTop(evt);
resizeLeft(evt);
}
+ @FXML
private void resizeTopRight(MouseEvent evt) {
resizeTop(evt);
resizeRight(evt);
}
+ @FXML
private void resizeBottomLeft(MouseEvent evt) {
resizeBottom(evt);
resizeLeft(evt);
}
+ @FXML
private void resizeBottomRight(MouseEvent evt) {
resizeBottom(evt);
resizeRight(evt);
}
+ @FXML
private void resizeTop(MouseEvent evt) {
+ startResize(evt);
double newY = evt.getScreenY();
double dy = newY - origY;
double newH = origH - dy;
@@ -75,7 +140,9 @@ public class ResizeController implements FxController {
}
}
+ @FXML
private void resizeLeft(MouseEvent evt) {
+ startResize(evt);
double newX = evt.getScreenX();
double dx = newX - origX;
double newW = origW - dx;
@@ -85,6 +152,7 @@ public class ResizeController implements FxController {
}
}
+ @FXML
private void resizeBottom(MouseEvent evt) {
double newH = evt.getSceneY();
if (newH < window.getMaxHeight() && newH > window.getMinHeight()) {
@@ -92,6 +160,7 @@ public class ResizeController implements FxController {
}
}
+ @FXML
private void resizeRight(MouseEvent evt) {
double newW = evt.getSceneX();
if (newW < window.getMaxWidth() && newW > window.getMinWidth()) {
@@ -99,4 +168,21 @@ public class ResizeController implements FxController {
}
}
-}
+ @FXML
+ public void savePositionalSettings() {
+ settings.windowHeightProperty().setValue(window.getHeight());
+ settings.windowWidthProperty().setValue(window.getWidth());
+ settings.windowYPositionProperty().setValue(window.getY());
+ settings.windowXPositionProperty().setValue(window.getX());
+ }
+
+ public BooleanBinding showResizingArrowsProperty() {
+ return showResizingArrows;
+ }
+
+ public boolean isShowResizingArrows() {
+ //If in fullscreen resizing is not be possible;
+ return !window.isFullScreen();
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnknownErrorController.java b/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnknownErrorController.java
index 13d1bf5c9..22365da7c 100644
--- a/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnknownErrorController.java
+++ b/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnknownErrorController.java
@@ -2,45 +2,46 @@ package org.cryptomator.ui.mainwindow;
import com.tobiasdiez.easybind.EasyBind;
import org.cryptomator.common.vaults.Vault;
+import org.cryptomator.common.vaults.VaultListManager;
+import org.cryptomator.ui.common.ErrorComponent;
import org.cryptomator.ui.common.FxController;
+import org.cryptomator.ui.removevault.RemoveVaultComponent;
import javax.inject.Inject;
+import javax.inject.Named;
import javafx.beans.binding.Binding;
import javafx.beans.property.ObjectProperty;
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import java.nio.charset.StandardCharsets;
+import javafx.fxml.FXML;
+import javafx.stage.Stage;
@MainWindowScoped
public class VaultDetailUnknownErrorController implements FxController {
- private final Binding stackTrace;
+ private final ObjectProperty vault;
+ private final ErrorComponent.Builder errorComponentBuilder;
+ private final Stage errorWindow;
+ private final RemoveVaultComponent.Builder removeVault;
@Inject
- public VaultDetailUnknownErrorController(ObjectProperty vault) {
- this.stackTrace = EasyBind.select(vault) //
- .selectObject(Vault::lastKnownExceptionProperty) //
- .map(this::provideStackTrace);
+ public VaultDetailUnknownErrorController(ObjectProperty vault, ErrorComponent.Builder errorComponentBuilder, @Named("errorWindow") Stage errorWindow, RemoveVaultComponent.Builder removeVault) {
+ this.vault = vault;
+ this.errorComponentBuilder = errorComponentBuilder;
+ this.errorWindow = errorWindow;
+ this.removeVault = removeVault;
}
- private String provideStackTrace(Throwable cause) {
- // TODO deduplicate ErrorModule.java
- if (cause != null) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- cause.printStackTrace(new PrintStream(baos));
- return baos.toString(StandardCharsets.UTF_8);
- } else {
- return "";
- }
+ @FXML
+ public void showError() {
+ errorComponentBuilder.window(errorWindow).cause(vault.get().getLastKnownException()).build().showErrorScene();
}
- /* Getter/Setter */
-
- public Binding stackTraceProperty() {
- return stackTrace;
+ @FXML
+ public void reload() {
+ VaultListManager.redetermineVaultState(vault.get());
}
- public String getStackTrace() {
- return stackTrace.getValue();
+ @FXML
+ void didClickRemoveVault() {
+ removeVault.vault(vault.get()).build().showRemoveVault();
}
}
diff --git a/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java b/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java
index 5fee567b7..189666591 100644
--- a/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java
+++ b/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java
@@ -42,7 +42,6 @@ abstract class PreferencesModule {
static Stage provideStage(StageFactory factory, ResourceBundle resourceBundle) {
Stage stage = factory.create();
stage.setTitle(resourceBundle.getString("preferences.title"));
- stage.setResizable(false);
return stage;
}
diff --git a/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java b/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java
index 6b87ab59a..2c176df76 100644
--- a/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java
+++ b/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java
@@ -2,9 +2,6 @@ package org.cryptomator.ui.traymenu;
import com.google.common.base.Preconditions;
import org.apache.commons.lang3.SystemUtils;
-import org.cryptomator.integrations.uiappearance.Theme;
-import org.cryptomator.integrations.uiappearance.UiAppearanceException;
-import org.cryptomator.integrations.uiappearance.UiAppearanceProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -12,38 +9,25 @@ import javax.inject.Inject;
import java.awt.AWTException;
import java.awt.SystemTray;
import java.awt.TrayIcon;
-import java.util.Optional;
@TrayMenuScoped
public class TrayIconController {
private static final Logger LOG = LoggerFactory.getLogger(TrayIconController.class);
- private final TrayImageFactory imageFactory;
- private final Optional appearanceProvider;
private final TrayMenuController trayMenuController;
private final TrayIcon trayIcon;
private volatile boolean initialized;
@Inject
- TrayIconController(TrayImageFactory imageFactory, TrayMenuController trayMenuController, Optional appearanceProvider) {
+ TrayIconController(TrayImageFactory imageFactory, TrayMenuController trayMenuController) {
this.trayMenuController = trayMenuController;
- this.imageFactory = imageFactory;
- this.appearanceProvider = appearanceProvider;
this.trayIcon = new TrayIcon(imageFactory.loadImage(), "Cryptomator", trayMenuController.getMenu());
}
public synchronized void initializeTrayIcon() throws IllegalStateException {
Preconditions.checkState(!initialized);
- appearanceProvider.ifPresent(appearanceProvider -> {
- try {
- appearanceProvider.addListener(this::systemInterfaceThemeChanged);
- } catch (UiAppearanceException e) {
- LOG.error("Failed to enable automatic tray icon theme switching.");
- }
- });
-
trayIcon.setImageAutoSize(true);
if (SystemUtils.IS_OS_WINDOWS) {
trayIcon.addActionListener(trayMenuController::showMainWindow);
@@ -61,10 +45,6 @@ public class TrayIconController {
this.initialized = true;
}
- private void systemInterfaceThemeChanged(Theme theme) {
- trayIcon.setImage(imageFactory.loadImage()); // TODO refactor "theme" is re-queried in loadImage()
- }
-
public boolean isInitialized() {
return initialized;
}
diff --git a/src/main/java/org/cryptomator/ui/traymenu/TrayImageFactory.java b/src/main/java/org/cryptomator/ui/traymenu/TrayImageFactory.java
index d9fcdfc29..aa55ca766 100644
--- a/src/main/java/org/cryptomator/ui/traymenu/TrayImageFactory.java
+++ b/src/main/java/org/cryptomator/ui/traymenu/TrayImageFactory.java
@@ -25,11 +25,7 @@ class TrayImageFactory {
}
private String getMacResourceName() {
- var theme = appearanceProvider.map(UiAppearanceProvider::getSystemTheme).orElse(Theme.LIGHT);
- return switch (theme) {
- case DARK -> "/img/tray_icon_mac_white.png";
- case LIGHT -> "/img/tray_icon_mac_black.png";
- };
+ return "/img/tray_icon_mac.png";
}
private String getWinOrLinuxResourceName() {
diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/MountOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/MountOptionsController.java
index b638ad889..8739be791 100644
--- a/src/main/java/org/cryptomator/ui/vaultoptions/MountOptionsController.java
+++ b/src/main/java/org/cryptomator/ui/vaultoptions/MountOptionsController.java
@@ -27,6 +27,7 @@ import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import javafx.util.StringConverter;
import java.io.File;
+import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.util.ResourceBundle;
import java.util.Set;
@@ -94,7 +95,9 @@ public class MountOptionsController implements FxController {
driveLetterSelection.setConverter(new WinDriveLetterLabelConverter(windowsDriveLetters, resourceBundle));
driveLetterSelection.setValue(vault.getVaultSettings().winDriveLetter().get());
- if (vault.getVaultSettings().useCustomMountPath().get() && !getRestrictToStableFuseOnWindows() /* to prevent invalid states */) {
+ if (vault.getVaultSettings().useCustomMountPath().get()
+ && vault.getVaultSettings().getCustomMountPath().isPresent()
+ && !getRestrictToStableFuseOnWindows() /* to prevent invalid states */) {
mountPoint.selectToggle(mountPointCustomDir);
} else if (!Strings.isNullOrEmpty(vault.getVaultSettings().winDriveLetter().get())) {
mountPoint.selectToggle(mountPointWinDriveLetter);
@@ -125,25 +128,30 @@ public class MountOptionsController implements FxController {
}
@FXML
- private void chooseCustomMountPoint() {
+ public void chooseCustomMountPoint() {
+ chooseCustomMountPointOrReset(mountPointCustomDir);
+ }
+
+ private void chooseCustomMountPointOrReset(Toggle previousMountToggle) {
DirectoryChooser directoryChooser = new DirectoryChooser();
directoryChooser.setTitle(resourceBundle.getString("vaultOptions.mount.mountPoint.directoryPickerTitle"));
try {
- directoryChooser.setInitialDirectory(Path.of(System.getProperty("user.home")).toFile());
- } catch (Exception e) {
- //NO-OP
+ var initialDir = vault.getVaultSettings().getCustomMountPath().orElse(System.getProperty("user.home"));
+ directoryChooser.setInitialDirectory(Path.of(initialDir).toFile());
+ } catch (InvalidPathException e) {
+ // no-op
}
File file = directoryChooser.showDialog(window);
if (file != null) {
vault.getVaultSettings().customMountPath().set(file.getAbsolutePath());
} else {
- vault.getVaultSettings().customMountPath().set(null);
+ mountPoint.selectToggle(previousMountToggle);
}
}
- private void toggleMountPoint(@SuppressWarnings("unused") ObservableValue extends Toggle> observable, @SuppressWarnings("unused") Toggle oldValue, Toggle newValue) {
+ private void toggleMountPoint(@SuppressWarnings("unused") ObservableValue extends Toggle> observable, Toggle oldValue, Toggle newValue) {
if (mountPointCustomDir.equals(newValue) && Strings.isNullOrEmpty(vault.getVaultSettings().customMountPath().get())) {
- chooseCustomMountPoint();
+ chooseCustomMountPointOrReset(oldValue);
}
}
diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java b/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java
index 9212b21dd..3fc738fb0 100644
--- a/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java
+++ b/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java
@@ -21,8 +21,4 @@ public enum SelectedVaultOptionsTab {
*/
KEY,
- /**
- * Show Auto-Lock tab
- */
- AUTOLOCK,
}
diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java
index 20dac7594..15879e316 100644
--- a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java
+++ b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java
@@ -23,7 +23,6 @@ public class VaultOptionsController implements FxController {
public Tab generalTab;
public Tab mountTab;
public Tab keyTab;
- public Tab autoLockTab;
@Inject
VaultOptionsController(@VaultOptionsWindow Stage window, ObjectProperty selectedTabProperty) {
@@ -48,7 +47,6 @@ public class VaultOptionsController implements FxController {
case ANY, GENERAL -> generalTab;
case MOUNT -> mountTab;
case KEY -> keyTab;
- case AUTOLOCK -> autoLockTab;
};
}
diff --git a/src/main/resources/fxml/error.fxml b/src/main/resources/fxml/error.fxml
index adcebdb67..4dbddc4c3 100644
--- a/src/main/resources/fxml/error.fxml
+++ b/src/main/resources/fxml/error.fxml
@@ -1,12 +1,15 @@
+
+
+
@@ -15,7 +18,7 @@
fx:controller="org.cryptomator.ui.common.ErrorController"
prefWidth="450"
prefHeight="450"
- spacing="12"
+ spacing="18"
alignment="TOP_CENTER">
@@ -27,12 +30,38 @@
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/fxml/health_check_list.fxml b/src/main/resources/fxml/health_check_list.fxml
index 1d8054ab6..1edb004df 100644
--- a/src/main/resources/fxml/health_check_list.fxml
+++ b/src/main/resources/fxml/health_check_list.fxml
@@ -3,7 +3,6 @@
-
@@ -27,7 +26,7 @@
-
+
diff --git a/src/main/resources/fxml/health_check_listcell.fxml b/src/main/resources/fxml/health_check_listcell.fxml
index 08155afc8..df000fa44 100644
--- a/src/main/resources/fxml/health_check_listcell.fxml
+++ b/src/main/resources/fxml/health_check_listcell.fxml
@@ -18,7 +18,7 @@
-
+
diff --git a/src/main/resources/fxml/health_start_fail.fxml b/src/main/resources/fxml/health_start_fail.fxml
deleted file mode 100644
index 9a35e4788..000000000
--- a/src/main/resources/fxml/health_start_fail.fxml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/main/resources/fxml/main_window.fxml b/src/main/resources/fxml/main_window.fxml
index ff8e65292..91e7512a4 100644
--- a/src/main/resources/fxml/main_window.fxml
+++ b/src/main/resources/fxml/main_window.fxml
@@ -12,7 +12,7 @@
fx:id="root"
fx:controller="org.cryptomator.ui.mainwindow.MainWindowController"
styleClass="main-window">
-
+
diff --git a/src/main/resources/fxml/main_window_resize.fxml b/src/main/resources/fxml/main_window_resize.fxml
index b4eb46916..7d5fb9437 100644
--- a/src/main/resources/fxml/main_window_resize.fxml
+++ b/src/main/resources/fxml/main_window_resize.fxml
@@ -9,9 +9,22 @@
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/fxml/vault_detail_unknownerror.fxml b/src/main/resources/fxml/vault_detail_unknownerror.fxml
index 5fc60f27b..8595d2fe1 100644
--- a/src/main/resources/fxml/vault_detail_unknownerror.fxml
+++ b/src/main/resources/fxml/vault_detail_unknownerror.fxml
@@ -1,15 +1,42 @@
+
+
+
-
+
+
+ alignment="TOP_CENTER"
+ spacing="9">
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/i18n/strings.properties b/src/main/resources/i18n/strings.properties
index 44fab3640..1cb5eb0b8 100644
--- a/src/main/resources/i18n/strings.properties
+++ b/src/main/resources/i18n/strings.properties
@@ -14,8 +14,11 @@ generic.button.done=Done
generic.button.next=Next
generic.button.print=Print
## Error
-generic.error.title=An unexpected error occurred
-generic.error.instruction=This should not have happened. Please report the error text below and include a description of what steps did lead to this error.
+generic.error.title=Error %s
+generic.error.instruction=Oops! Cryptomator didn't expect this to happen. You can look up existing solutions for this error. Or if it has not been reported yet, feel free to do so.
+generic.error.hyperlink.lookup=Look up this error
+generic.error.hyperlink.report=Report this error
+generic.error.technicalDetails=Details:
# Defaults
defaults.vault.vaultName=Vault
@@ -73,9 +76,9 @@ addvault.new.readme.accessLocation.2=This is your vault's access location.
addvault.new.readme.accessLocation.3=Any files added to this volume will be encrypted by Cryptomator. You can work on it like on any other drive/folder. This is only a decrypted view of its content, your files stay encrypted on your hard drive all the time.
addvault.new.readme.accessLocation.4=Feel free to remove this file.
## Existing
-addvaultwizard.existing.instruction=Choose the "masterkey.cryptomator" file of your existing vault.
+addvaultwizard.existing.instruction=Choose the "vault.cryptomator" file of your existing vault. If only a file named "masterkey.cryptomator" exists, select that instead.
addvaultwizard.existing.chooseBtn=Choose…
-addvaultwizard.existing.filePickerTitle=Select Masterkey File
+addvaultwizard.existing.filePickerTitle=Select Vault File
## Success
addvaultwizard.success.nextStepsInstructions=Added vault "%s".\nYou need to unlock this vault to access or add contents. Alternatively you can unlock it at any later point in time.
addvaultwizard.success.unlockNow=Unlock Now
@@ -297,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Change Vault Location…
### Needs Migration
main.vaultDetail.migrateButton=Upgrade Vault
main.vaultDetail.migratePrompt=Your vault needs to be upgraded to a new format, before you can access it
+### Error
+main.vaultDetail.error.info=An error occurred loading the vault from disk.
+main.vaultDetail.error.reload=Reload
+main.vaultDetail.error.windowTitle=Error loading vault
# Wrong File Alert
wrongFileAlert.title=How to Encrypt Files
diff --git a/src/main/resources/i18n/strings_ar.properties b/src/main/resources/i18n/strings_ar.properties
index 562cd2fd1..97904ae71 100644
--- a/src/main/resources/i18n/strings_ar.properties
+++ b/src/main/resources/i18n/strings_ar.properties
@@ -13,8 +13,6 @@ generic.button.done=تم
generic.button.next=التالي
generic.button.print=طباعة
## Error
-generic.error.title=حدث خطأ غير متوقع
-generic.error.instruction=ما كان ينبغي أن يحدث هذا. يرجى الإبلاغ عن نص الخطأ أدناه وإدراج وصف للخطوات التي أدت إلى هذا الخطأ.
# Defaults
defaults.vault.vaultName=مخزن
@@ -95,7 +93,6 @@ forgetPassword.information=سيؤدي هذا إلى حذف كلمة المرور
forgetPassword.confirmBtn=نسيت كلمة المرور
# Unlock
-unlock.title=افتح الحافظة
unlock.passwordPrompt=أدخل كلمة السر لـ "%s":
unlock.savePassword=تذكر كلمة المرور
unlock.unlockBtn=افتح
@@ -129,7 +126,7 @@ migration.start.confirm=نعم, محفظتي متزامنة بالكامل
migration.run.enterPassword=أدخل كلمة المرور لـ "%s"
migration.run.startMigrationBtn=ترقية الحافظة
migration.run.progressHint=قد يستغرق هذا بعض الوقت…
-## Sucess
+## Success
migration.success.nextStepsInstructions=تم ترحيل "%s" بنجاح.\nيمكنك الآن فتح مخزنك.
migration.success.unlockNow=افتح الان
## Missing file system capabilities
@@ -145,8 +142,11 @@ migration.impossible.reason=لا يمكن ترحيل المخزن تلقائيا
migration.impossible.moreInfo=لا يزال ممكناً فتح المخزن باستخدام إصدار قديم. للحصول على تعليمات حول كيفية ترحيل المخزن يدوياً، قم بزيارة
# Health Check
+## Start
+## Start Failure
+## Check Selection
## Detail view
-## Checks
+## Fix Application
# Preferences
preferences.title=تفضيلات
@@ -164,10 +164,6 @@ preferences.general.debugLogging=تمكين سجلات التصحيح
preferences.general.debugDirectory=عرض ملفات السجل
preferences.general.autoStart=تشغيل Cryptomator عند بدء تشغيل النظام
preferences.general.keychainBackend=تخزين كلمات المرور مع
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=محفظة KDE
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=الوصول إلى سلسلة مفاتيح ماك
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=حماية بيانات ويندوز
preferences.general.interfaceOrientation=اتجاه الواجهة
preferences.general.interfaceOrientation.ltr=من اليسار إلى اليمين
preferences.general.interfaceOrientation.rtl=من اليمين إلى اليسار
@@ -248,6 +244,7 @@ main.vaultDetail.missing.changeLocation=تغيير موقع الخزنة…
### Needs Migration
main.vaultDetail.migrateButton=ترقية الحافظة
main.vaultDetail.migratePrompt=يجب ترقية المخزن الخاص بك إلى تنسيق جديد، قبل أن تتمكن من الوصول إليه
+### Error
# Wrong File Alert
wrongFileAlert.title=كيفية تشفير الملفات
@@ -268,6 +265,7 @@ vaultOptions.general.actionAfterUnlock=بعد فتح القفل بنجاح
vaultOptions.general.actionAfterUnlock.ignore=لا تفعل شيئاً
vaultOptions.general.actionAfterUnlock.reveal=اظهار القرص
vaultOptions.general.actionAfterUnlock.ask=اسأل
+
## Mount
vaultOptions.mount=القرص الوهمي
vaultOptions.mount.readonly=للقراءة فقط
@@ -283,10 +281,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=اختر مجلد فارغ
vaultOptions.masterkey=كلمة المرور
vaultOptions.masterkey.changePasswordBtn=تغيير كلمة المرور
vaultOptions.masterkey.forgetSavedPasswordBtn=نسيان كلمة المرور المحفوظة
-vaultOptions.masterkey.recoveryKeyExpanation=مفتاح الاسترداد هو وسيلتك الوحيدة لاستعادة الوصول إلى مخزنك إذا فقدت كلمة المرور.
+vaultOptions.masterkey.recoveryKeyExplanation=مفتاح الاسترداد هو وسيلتك الوحيدة لاستعادة الوصول إلى مخزنك إذا فقدت كلمة المرور.
vaultOptions.masterkey.showRecoveryKeyBtn=عرض مفتاح الاسترداد
vaultOptions.masterkey.recoverPasswordBtn=استرجاع كلمة المرور
-## Auto Lock
+
# Recovery Key
recoveryKey.title=مفتاح الاسترداد
diff --git a/src/main/resources/i18n/strings_bs.properties b/src/main/resources/i18n/strings_bs.properties
index ccc6386f3..bbdaccbaf 100644
--- a/src/main/resources/i18n/strings_bs.properties
+++ b/src/main/resources/i18n/strings_bs.properties
@@ -13,8 +13,6 @@ generic.button.done=Gotovo
generic.button.next=Sljedeće
generic.button.print=Ispis
## Error
-generic.error.title=Došlo je do neočekivane greške
-generic.error.instruction=Ovo se nije trebalo dogoditi. Molimo da prijavite opis greške ispod, kao i korake koji su do greške doveli.
# Defaults
defaults.vault.vaultName=Sef
@@ -44,6 +42,10 @@ addvaultwizard.new.locationPrompt=…
addvaultwizard.new.directoryPickerLabel=Prilagođena lokacija
addvaultwizard.new.directoryPickerButton=Odaberi…
addvaultwizard.new.directoryPickerTitle=Izaberi folder
+addvaultwizard.new.fileAlreadyExists=Upozorenje: Fajl ili mapa s tim nazivom već postoji
+addvaultwizard.new.locationDoesNotExist=Direktorij u navedenoj putanji ne postoji ili mu se ne može pristupiti
+addvaultwizard.new.locationIsNotWritable=Nije moguće izvršiti operaciju pisanja na navedenoj putanji
+addvaultwizard.new.locationIsOk=Pogodno mjesto za vaš sef
addvaultwizard.new.invalidName=Naziv sefa neispravan. Molimo razmislite o drugom nazivu.
### Password
addvaultwizard.new.createVaultBtn=Kreiraj novi sef
@@ -91,7 +93,6 @@ forgetPassword.information=Ovo će izbrisati sačuvanu lozinku ovog sefa iz vaš
forgetPassword.confirmBtn=Zaboravili ste šifru
# Unlock
-unlock.title=Otključaj sef
unlock.passwordPrompt=Unesite lozinku za "%s":
unlock.savePassword=Zapamti šifru
unlock.unlockBtn=Otključaj
@@ -125,7 +126,7 @@ migration.start.confirm=Da, moj sef je u potpunosti sinhroniziran
migration.run.enterPassword=Unesite lozinku za "%s"
migration.run.startMigrationBtn=Nadogradi sef
migration.run.progressHint=Ovo bi moglo potrajati…
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" je uspješno nadograđen.\nSada možete otključati svoj sef.
migration.success.unlockNow=Otključaj sada
## Missing file system capabilities
@@ -141,8 +142,11 @@ migration.impossible.reason=Sef se ne može automatski migrirati jer njegovo mje
migration.impossible.moreInfo=Sef se i dalje može otvoriti sa starijom verzijom. Za upute o ručnom migriranju sefa posjetite
# Health Check
+## Start
+## Start Failure
+## Check Selection
## Detail view
-## Checks
+## Fix Application
# Preferences
preferences.title=Postavke
@@ -160,10 +164,6 @@ preferences.general.debugLogging=Omogući evidenciju otklanjanja pogrešaka
preferences.general.debugDirectory=Pokaži dnevnik podataka
preferences.general.autoStart=Pokreni Cryptomator pri pokretanju sistema
preferences.general.keychainBackend=Pohrani lozinku sa
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Keychain Access
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection
preferences.general.interfaceOrientation=Orijentacija Interfejsa
preferences.general.interfaceOrientation.ltr=S lijeva ka desno
preferences.general.interfaceOrientation.rtl=Sa desna ka lijevo
@@ -260,6 +260,7 @@ main.vaultDetail.missing.changeLocation=Promijeni lokaciju sefa…
### Needs Migration
main.vaultDetail.migrateButton=Nadogradi sef
main.vaultDetail.migratePrompt=Da biste mogli pristupiti svom sefu, morate ga nadograditi na novi format
+### Error
# Wrong File Alert
wrongFileAlert.title=Kako enkriptovati podatke
@@ -280,6 +281,7 @@ vaultOptions.general.actionAfterUnlock=Nakon uspješnog otključavanja
vaultOptions.general.actionAfterUnlock.ignore=Ne radi ništa
vaultOptions.general.actionAfterUnlock.reveal=Otkrij pogon
vaultOptions.general.actionAfterUnlock.ask=Pitaj
+
## Mount
vaultOptions.mount=Povezivanje
vaultOptions.mount.readonly=Samo čitanje
@@ -295,10 +297,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Izaberi praznu mapu
vaultOptions.masterkey=Šifra
vaultOptions.masterkey.changePasswordBtn=Promjeni lozinku
vaultOptions.masterkey.forgetSavedPasswordBtn=Zaborav spremljenu šifru
-vaultOptions.masterkey.recoveryKeyExpanation=Ključ za oporavak je vaše jedino sredstvo za vraćanje pristupa sefu ako izgubite lozinku.
+vaultOptions.masterkey.recoveryKeyExplanation=Ključ za oporavak je vaše jedino sredstvo za vraćanje pristupa sefu ako izgubite lozinku.
vaultOptions.masterkey.showRecoveryKeyBtn=Pokaži ključ za oporavak
vaultOptions.masterkey.recoverPasswordBtn=Povrati šifru
-## Auto Lock
+
# Recovery Key
recoveryKey.title=Ključ za oporavak
diff --git a/src/main/resources/i18n/strings_ca.properties b/src/main/resources/i18n/strings_ca.properties
index aeeffc959..c434f9f3f 100644
--- a/src/main/resources/i18n/strings_ca.properties
+++ b/src/main/resources/i18n/strings_ca.properties
@@ -13,8 +13,11 @@ 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.
+generic.error.title=Error %s
+generic.error.instruction=Ui! Cryptomator no esperava que passés això. Podeu cercar alguna de les solucions existents per a aquest error. Si no ha estat reportat encara, sentiu-vos lliure de fer-ho vós mateix.
+generic.error.hyperlink.lookup=Cerca aquest error
+generic.error.hyperlink.report=Notifica un error
+generic.error.technicalDetails=Detalls:
# Defaults
defaults.vault.vaultName=Caixa forta
@@ -45,7 +48,9 @@ addvaultwizard.new.directoryPickerLabel=Ubicació personalitzada
addvaultwizard.new.directoryPickerButton=Trieu…
addvaultwizard.new.directoryPickerTitle=Seleccioneu el directori
addvaultwizard.new.fileAlreadyExists=Ja existeix un fitxer o un directori amb el nom de la caixa forta
+addvaultwizard.new.locationDoesNotExist=Un directori de la ruta especificada no existeix o no s'hi pot accedir
addvaultwizard.new.locationIsNotWritable=No teniu permís d'escriptura en la ruta especificada
+addvaultwizard.new.locationIsOk=Localització per a la vostra caixa forta
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
@@ -93,7 +98,7 @@ forgetPassword.information=Això eliminarà la contrasenya desada d'aquesta caix
forgetPassword.confirmBtn=He oblidat la contrasenya
# Unlock
-unlock.title=Desbloquejar la caixa forta
+unlock.title=Desbloca "%s"
unlock.passwordPrompt=Introduïu la contrasenya de "%s":
unlock.savePassword=Recorda la contrasenya
unlock.unlockBtn=Desbloqueja
@@ -128,7 +133,7 @@ migration.start.confirm=Sí, la meua caixa forta està completament sicronitzada
migration.run.enterPassword=Introduïu la contrasenya per a "%s"
migration.run.startMigrationBtn=Migrar la caixa forta
migration.run.progressHint=Això pot trigar una mica...
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" s'ha migrat correctament.\nJa podeu desbloquejar la vostra caixa forta.
migration.success.unlockNow=Desbloqueja ara
## Missing file system capabilities
@@ -144,19 +149,38 @@ migration.impossible.reason=La caixa forta no es pot migrar automàticament perq
migration.impossible.moreInfo=La caixa forta es pot obrir amb una versió anterior. Per saber com poder fer la migració de manera manual, visiteu
# Health Check
-health.title=Comprovació de la caixa forta
-health.start.configInvalid=S'ha produït un problema en la lectura i anàlisi del fitxer de configuració de la caixa forta.
-health.checkList.selectAllBox=Selecciona-ho tot
+## Start
+health.title=Comprovació de "%s"
+health.intro.header=Comprovació d'estat
+health.intro.text=La comprovació de salut és una col·lecció de comprovacions per a detectar la possibilitat de resoldre problemes en l'estructura interna de la vostra caixa forta. Tingueu en compte:
+health.intro.remarkSync=Assegureu que tots els dispositius s'han sincronitzat completament, això resol la major part dels problemes.
+health.intro.remarkFix=No s'han pogut resoldre tots els problemes.
+health.intro.remarkBackup=Si les dades s'han corromput, solament una còpia de seguretat ho podrà resoldre.
+health.intro.affirmation=He llegit i entès la informació anterior
+## Start Failure
+health.fail.header=Error en desar la configuració de la caixa forta
+health.fail.ioError=S'ha trobat un error mentre s'accedia al fitxer de configuració.
+health.fail.parseError=S'ha trobat un error mentre es processava la configuració de la caixa forta.
+health.fail.moreInfo=Més informació
+## Check Selection
+health.checkList.description=Selecciona les caselles en la llista de l'esquerra o feu servir els botons de la part inferior.
+health.checkList.selectAllButton=Selecciona tots
+health.checkList.deselectAllButton=Deselecciona tots
health.check.runBatchBtn=Executa les proves seleccionades
## Detail view
-health.check.detail.header=Resultats de %s
-health.check.detail.taskNotStarted=La prova no ha estat seleccionada per a executar-la.
-health.check.detail.taskRunning=La prova és en procés…
-health.check.detail.taskSucceeded=La prova ha finalitzat amb èxit després de %d mil·lisegons.
-health.check.detail.taskCancelled=S'ha cancel·lat la prova.
-health.check.detail.problemCount=S'hi han trobat %d problemes i %d errades irrecuperables.
+health.check.detail.noSelectedCheck=Per a obtenir-ne els resultats trieu una de les comprovacions finalitzades de la llista de l'esquerra.
+health.check.detail.checkScheduled=La comprovació s'ha programat.
+health.check.detail.checkRunning=La prova és en procés…
+health.check.detail.checkSkipped=La prova no ha estat seleccionada per a executar-la.
+health.check.detail.checkFinished=La prova ha finalitzat amb èxit.
+health.check.detail.checkFinishedAndFound=La comprovació ha finalitzat. Si us plau, comproveu-ne es resultat.
+health.check.detail.checkFailed=La comprovació ha acabat a causa d'un error.
+health.check.detail.checkCancelled=S'ha cancel·lat la prova.
health.check.exportBtn=Exporta informe
-## Checks
+## Fix Application
+health.fix.fixBtn=Corregeix
+health.fix.successTip=S'ha corregit amb èxit
+health.fix.failTip=La correcció ha fallat, vegeu-ne els detalls al registre
# Preferences
preferences.title=Preferències
@@ -174,10 +198,6 @@ preferences.general.debugLogging=Habilita el registre de depuració
preferences.general.debugDirectory=Mostra els fitxers de registres
preferences.general.autoStart=Executa Cryptomator en engegar el sistema
preferences.general.keychainBackend=Desar contrasenyes amb
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Anell de claus de Gnome
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=Cartera de KDE
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=Accés a clauers macOS
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection
preferences.general.interfaceOrientation=Orientació de la interfície
preferences.general.interfaceOrientation.ltr=Esquerra a dreta
preferences.general.interfaceOrientation.rtl=Dreta a esquerra
@@ -279,6 +299,10 @@ main.vaultDetail.missing.changeLocation=Canvia la localització de la caixa fort
### 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
+### Error
+main.vaultDetail.error.info=Hi ha hagut un error mentre es carregava la caixa forta del disc.
+main.vaultDetail.error.reload=Torna a carregar
+main.vaultDetail.error.windowTitle=Error en carregar la caixa forta
# Wrong File Alert
wrongFileAlert.title=Com xifrar fitxers
@@ -294,12 +318,15 @@ wrongFileAlert.link=Per rebre assistència, visiteu
## General
vaultOptions.general=General
vaultOptions.general.vaultName=Nom de la caixa forta
+vaultOptions.general.autoLock.lockAfterTimePart1=Bloca després de
+vaultOptions.general.autoLock.lockAfterTimePart2=minuts
vaultOptions.general.unlockAfterStartup=Desbloqueja la caixa forta quan s'inicia Cryptomator
vaultOptions.general.actionAfterUnlock=Després d'un desbloqueig correcte
vaultOptions.general.actionAfterUnlock.ignore=No facis res
vaultOptions.general.actionAfterUnlock.reveal=Mostra la unitat
vaultOptions.general.actionAfterUnlock.ask=Pregunta
-vaultOptions.general.healthBtn=Inicia la comprovació
+vaultOptions.general.startHealthCheckBtn=Inicia la comprovació
+
## Mount
vaultOptions.mount=Muntatge
vaultOptions.mount.readonly=Només lectura
@@ -315,11 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Esculliu un directori buit
vaultOptions.masterkey=Contrasenya
vaultOptions.masterkey.changePasswordBtn=Canvi de contrasenya
vaultOptions.masterkey.forgetSavedPasswordBtn=Oblida la contrasenya desada
-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.recoveryKeyExplanation=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
-## Auto Lock
-vaultOptions.autoLock.lockAfterTimePart2=minuts
+
# Recovery Key
recoveryKey.title=Clau de recuperació
diff --git a/src/main/resources/i18n/strings_cs.properties b/src/main/resources/i18n/strings_cs.properties
index 651d13cdb..b1d3f4875 100644
--- a/src/main/resources/i18n/strings_cs.properties
+++ b/src/main/resources/i18n/strings_cs.properties
@@ -13,8 +13,11 @@ generic.button.done=Hotovo
generic.button.next=Další
generic.button.print=Tisk
## Error
-generic.error.title=Došlo k neočekávané chybě
-generic.error.instruction=Tohle se nemělo stát. Prosím, nahlaste níže uvedený chybový text a popište, jaké kroky vedly k této chybě.
+generic.error.title=Chyba %s
+generic.error.instruction=Jejda! Tohle Cryptomator nečekal. Můžete najít již existující řešení pro tuto chybu. Nebo pokud ještě nebyla nahlášena, neváhejte tak učinit.
+generic.error.hyperlink.lookup=Vyhledat tuto chybu
+generic.error.hyperlink.report=Nahlásit tuto chybu
+generic.error.technicalDetails=Podrobnosti:
# Defaults
defaults.vault.vaultName=Trezor
@@ -95,7 +98,7 @@ forgetPassword.information=Toto smaže uložené heslo pro tento trezor.
forgetPassword.confirmBtn=Zapomenout heslo
# Unlock
-unlock.title=Odemknout trezor
+unlock.title=Odemknout "%s"
unlock.passwordPrompt=Zadejte heslo pro "%s":
unlock.savePassword=Zapamatovat heslo
unlock.unlockBtn=Odemknout
@@ -130,7 +133,7 @@ migration.start.confirm=Ano, můj trezor je plně synchronizován.
migration.run.enterPassword=Zadejte heslo pro "%s"
migration.run.startMigrationBtn=Migrovat trezor
migration.run.progressHint=Může to chvíli trvat…
-## Sucess
+## Success
migration.success.nextStepsInstructions=Migrace "%s" byla úspěšná.\nNyní můžete svůj trezor odemknout.
migration.success.unlockNow=Odemknout nyní
## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=Trezor nemůže být automaticky zmigrován, protož
migration.impossible.moreInfo=Trezor může být stále otevřen starší verzí. Pro pokyny, jak ručně migrovat trezor, navštivte
# Health Check
-health.title=Kontrola stavu trezoru
-health.start.introduction=Kontrola stavu trezoru je soubor kontrol, jejichž cílem je odhalit a případně odstranit problémy ve vnitřní struktuře trezoru. Upozorňujeme, že ne všechny problémy lze opravit. K provedení kontrol potřebujete heslo k trezoru.
-health.start.configValid=Načtení a analýza konfiguračního souboru trezoru proběhly úspěšně. Pokračujte ve výběru kontrol.
-health.start.configInvalid=Chyba při čtení a analýze konfiguračního souboru trezoru.
-health.checkList.header=Dostupné kontroly stavu
-health.checkList.selectAllBox=Vybrat vše
+## Start
+health.title=Kontrola stavu "%s"
+health.intro.header=Kontrola stavu
+health.intro.text=Kontrola stavu je soubor kontrol, které odhalí a případně opraví problémy ve vnitřní struktuře vašeho trezoru. Mějte prosím na paměti, že:
+health.intro.remarkSync=Ujistěte se, že jsou všechna zařízení plně synchronizována, toto řeší většinu problémů.
+health.intro.remarkFix=Ne všechny problémy lze vyřešit.
+health.intro.remarkBackup=Pokud jsou data poškozena, může pomoci pouze záloha.
+health.intro.affirmation=Přečetl jsem si výše uvedené informace a rozumím jim
+## Start Failure
+health.fail.header=Chyba při načítání konfigurace trezoru
+health.fail.ioError=Došlo k chybě při přístupu a čtení konfiguračního souboru.
+health.fail.parseError=Při analýze nastavení trezoru došlo k chybě.
+health.fail.moreInfo=Více informací
+## Check Selection
+health.checkList.description=Vyberte kontroly z levého seznamu nebo použijte tlačítka níže.
+health.checkList.selectAllButton=Vybrat všechny kontroly
+health.checkList.deselectAllButton=Zrušit výběr všech kontrol
health.check.runBatchBtn=Spustit vybrané kontroly
## Detail view
health.check.detail.noSelectedCheck=Pro výsledky vyberte dokončenou kontrolu stavu v levém seznamu.
-health.check.detail.header=Výsledky pro %s
-health.check.detail.taskNotStarted=Kontrola nebyla vybrána ke spuštění.
-health.check.detail.taskScheduled=Kontrola je naplánována.
-health.check.detail.taskRunning=Kontrola právě probíhá…
-health.check.detail.taskSucceeded=Kontrola byla úspěšně dokončena po %d milisekundách.
-health.check.detail.taskFailed=Kontrola byla ukončena z důvodu chyby.
-health.check.detail.taskCancelled=Kontrola byla zrušena.
-health.check.detail.problemCount=Nalezeno %d problémů a %d neopravitelných chyb.
+health.check.detail.checkScheduled=Kontrola je naplánována.
+health.check.detail.checkRunning=Kontrola právě probíhá…
+health.check.detail.checkSkipped=Kontrola nebyla vybrána ke spuštění.
+health.check.detail.checkFinished=Kontrola byla úspěšně dokončena.
+health.check.detail.checkFinishedAndFound=Kontrola byla dokončena. Zkontrolujte prosím výsledky.
+health.check.detail.checkFailed=Kontrola byla ukončena z důvodu chyby.
+health.check.detail.checkCancelled=Kontrola byla zrušena.
health.check.exportBtn=Exportovat sestavu
-health.check.fixBtn=Opravit
-## Checks
-health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Kontrola adresáře
+## Fix Application
+health.fix.fixBtn=Opravit
+health.fix.successTip=Oprava byla úspěšná
+health.fix.failTip=Oprava selhala, podrobnosti naleznete v logu
# Preferences
preferences.title=Nastavení
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Ladicí režim
preferences.general.debugDirectory=Ukázat soubory se záznamy událostí (log)
preferences.general.autoStart=Spustit Cryptomator při spuštění systému
preferences.general.keychainBackend=Ukládat hesla pomocí
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome klíčenka
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE KWallet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Svazek klíčů
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection klíčenka
preferences.general.interfaceOrientation=Orientace prostředí
preferences.general.interfaceOrientation.ltr=Zleva doprava
preferences.general.interfaceOrientation.rtl=Zprava doleva
@@ -289,6 +299,7 @@ main.vaultDetail.missing.changeLocation=Změnit umístění trezoru…
### Needs Migration
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
+### Error
# Wrong File Alert
wrongFileAlert.title=Jak šifrovat soubory
@@ -304,12 +315,15 @@ wrongFileAlert.link=Pro další informace navštivte
## General
vaultOptions.general=Obecné
vaultOptions.general.vaultName=Název trezoru
+vaultOptions.general.autoLock.lockAfterTimePart1=Uzamknout při nečinnosti po
+vaultOptions.general.autoLock.lockAfterTimePart2=minut
vaultOptions.general.unlockAfterStartup=Odemknout trezor při spuštění Cryptomator
vaultOptions.general.actionAfterUnlock=Po úspěšném odemčení
vaultOptions.general.actionAfterUnlock.ignore=Nedělat nic
vaultOptions.general.actionAfterUnlock.reveal=Zobrazit jednotku
vaultOptions.general.actionAfterUnlock.ask=Zeptat se
-vaultOptions.general.healthBtn=Spuštění kontroly stavu
+vaultOptions.general.startHealthCheckBtn=Zahájit kontrolu stavu
+
## Mount
vaultOptions.mount=Připojení
vaultOptions.mount.readonly=Pouze pro čtení
@@ -325,13 +339,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Vyberte prázdný adresář
vaultOptions.masterkey=Heslo
vaultOptions.masterkey.changePasswordBtn=Změnit heslo
vaultOptions.masterkey.forgetSavedPasswordBtn=Zapomenout uložené heslo
-vaultOptions.masterkey.recoveryKeyExpanation=Obnovovací klíč je váš jediný způsob, jak obnovit přístup k trezoru, pokud ztratíte své heslo.
+vaultOptions.masterkey.recoveryKeyExplanation=Obnovovací klíč je váš jediný způsob, jak obnovit přístup k trezoru, pokud ztratíte své heslo.
vaultOptions.masterkey.showRecoveryKeyBtn=Zobrazit klíč k obnově
vaultOptions.masterkey.recoverPasswordBtn=Obnovit heslo
-## Auto Lock
-vaultOptions.autoLock=Automatické uzamčení
-vaultOptions.autoLock.lockAfterTimePart1=Uzamknout při nečinnosti po
-vaultOptions.autoLock.lockAfterTimePart2=minut
+
# Recovery Key
recoveryKey.title=Klíč k obnově
diff --git a/src/main/resources/i18n/strings_de.properties b/src/main/resources/i18n/strings_de.properties
index cd6068dad..8a1f08d62 100644
--- a/src/main/resources/i18n/strings_de.properties
+++ b/src/main/resources/i18n/strings_de.properties
@@ -13,8 +13,11 @@ generic.button.done=Fertig
generic.button.next=Weiter
generic.button.print=Drucken
## Error
-generic.error.title=Ein unerwarteter Fehler ist aufgetreten
-generic.error.instruction=Das hätte nicht passieren dürfen. Bitte melde den folgenden Fehlertext und beschreibe kurz, durch welche Schritte der Fehler aufgetreten ist.
+generic.error.title=Fehler %s
+generic.error.instruction=Ups! Das hat sich Cryptomator anders vorgestellt. Du kannst Lösungen für diesen Fehler nachschlagen oder einen neuen Fehlerbericht einreichen.
+generic.error.hyperlink.lookup=Diesen Fehler nachschlagen
+generic.error.hyperlink.report=Diesen Fehler melden
+generic.error.technicalDetails=Details:
# Defaults
defaults.vault.vaultName=Tresor
@@ -45,7 +48,7 @@ addvaultwizard.new.directoryPickerLabel=Eigener Ort
addvaultwizard.new.directoryPickerButton=Durchsuchen …
addvaultwizard.new.directoryPickerTitle=Verzeichnis auswählen
addvaultwizard.new.fileAlreadyExists=Eine Datei oder ein Ordner mit diesem Namen ist bereits vorhanden
-addvaultwizard.new.locationDoesNotExist=Der Ordner im angegebenen Pfad existiert nicht oder kann nicht geöffnet werden
+addvaultwizard.new.locationDoesNotExist=Ein Ordner im angegebenen Pfad existiert nicht oder kann nicht geöffnet werden
addvaultwizard.new.locationIsNotWritable=Kein Schreibzugriff auf den angegebenen Pfad
addvaultwizard.new.locationIsOk=Geeigneter Ort für deinen Tresor
addvaultwizard.new.invalidName=Ungültiger Tresorname. Bitte wähle einen regulären Namen, mit dem auch Verzeichnisse erstellt werden können.
@@ -59,7 +62,7 @@ addvault.new.readme.storageLocation.fileName=WICHTIG.rtf
addvault.new.readme.storageLocation.1=⚠️ TRESOR-DATEIEN ⚠️
addvault.new.readme.storageLocation.2=Dies ist der Speicherort deines Tresors.
addvault.new.readme.storageLocation.3=NICHT
-addvault.new.readme.storageLocation.4=• in diesem Verzeichnis Dateien ändern oder
+addvault.new.readme.storageLocation.4=• Dateien in diesem Verzeichnis ändern oder
addvault.new.readme.storageLocation.5=• zu verschlüsselnde Dateien in diesem Verzeichnis ablegen.
addvault.new.readme.storageLocation.6=Falls du Dateien verschlüsseln und den Inhalt des Tresors anzeigen möchtest, befolge folgende Schritte:
addvault.new.readme.storageLocation.7=1. Füge diesen Tresor zu Cryptomator hinzu.
@@ -73,7 +76,7 @@ addvault.new.readme.accessLocation.3=Alle zu diesem Laufwerk hinzugefügten Date
addvault.new.readme.accessLocation.4=Diese Datei kannst du löschen.
## Existing
addvaultwizard.existing.instruction=Wähle die Datei „masterkey.cryptomator“ deines vorhandenen Tresors aus.
-addvaultwizard.existing.chooseBtn=Durchsuchen …
+addvaultwizard.existing.chooseBtn=Durchsuchen…
addvaultwizard.existing.filePickerTitle=Masterkey-Datei auswählen
## Success
addvaultwizard.success.nextStepsInstructions=Tresor „%s“ hinzugefügt.\nUm auf Inhalte zuzugreifen oder welche hinzuzufügen, musst du den Tresor entsperren. Du kannst ihn aber auch zu jedem späteren Zeitpunkt entsperren.
@@ -95,7 +98,7 @@ forgetPassword.information=Dies löscht das gespeicherte Passwort dieses Tresors
forgetPassword.confirmBtn=Passwort vergessen
# Unlock
-unlock.title=Tresor entsperren
+unlock.title="%s" entsperren
unlock.passwordPrompt=Gib das Passwort für „%s“ ein:
unlock.savePassword=Passwort merken
unlock.unlockBtn=Entsperren
@@ -119,7 +122,7 @@ lock.forced.message=Aufgrund von Zugriffen laufender Prozesse oder geöffneter D
lock.forced.confirmBtn=Sperren erzwingen
## Failure
lock.fail.heading=Tresor konnte nicht gesperrt werden.
-lock.fail.message=Der Tresor „%s“ konnte nicht gesperrt werden. Stellen Sie sicher, dass Sie Ihre ungespeicherten Arbeit an anderer Stelle speichern und wichtige Lese-/Schreibvorgänge abgeschlossen sind. Um den Tresor zu schließen, beenden Sie den Cryptomator-Prozess.
+lock.fail.message=Der Tresor „%s“ konnte nicht gesperrt werden. Stelle sicher, dass du deine ungespeicherte Arbeit an anderer Stelle speicherst und wichtige Lese-/Schreibvorgänge abgeschlossen sind. Um den Tresor zu schließen, beende den Cryptomator-Prozess.
# Migration
migration.title=Tresor aktualisieren
@@ -130,7 +133,7 @@ migration.start.confirm=Ja, mein Tresor ist vollständig synchronisiert
migration.run.enterPassword=Gib das Passwort für „%s“ ein
migration.run.startMigrationBtn=Tresor migrieren
migration.run.progressHint=Dies kann einige Zeit dauern …
-## Sucess
+## Success
migration.success.nextStepsInstructions=„%s“ erfolgreich migriert.\nDu kannst deinen Tresor jetzt entsperren.
migration.success.unlockNow=Jetzt entsperren
## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=Der Tresor kann nicht automatisch migriert werden, d
migration.impossible.moreInfo=Der Tresor kann auch jetzt noch mit einer älteren Version geöffnet werden. Eine Anleitung zum manuellen Migrieren eines Tresors findest du unter
# Health Check
-health.title=Tresor-Integritätsprüfung
-health.start.introduction=Die Tresor-Integritätsprüfung ist eine Sammlung von Prüfungen, um Probleme in der internen Struktur deines Tresors zu erkennen und zu beheben. Bitte beachte, dass nicht alle Probleme behoben werden können. Du benötigst das Tresor-Passwort, um die Prüfungen durchzuführen.
-health.start.configValid=Das Lesen und Verarbeiten der Tresorkonfigurationsdatei war erfolgreich. Fahre fort, um Überprüfungen auszuwählen.
-health.start.configInvalid=Fehler beim Lesen und Verarbeiten der Tresorkonfigurationsdatei.
-health.checkList.header=Verfügbare Integritätsprüfungen
-health.checkList.selectAllBox=Alles auswählen
+## Start
+health.title=Integritätstest von "%s"
+health.intro.header=Zustandsprüfung
+health.intro.text=Der Zustandscheck ist eine Sammlung von Tests, um Probleme mit der internen Struktur deines Tresores zu finden und möglicherweise zu reparieren. Bitte bedenke:
+health.intro.remarkSync=Stelle sicher, dass alle Geräte vollständig synchronisiert sind. Dies löst die meisten Probleme.
+health.intro.remarkFix=Nicht alle Probleme können gelöst werden.
+health.intro.remarkBackup=Wenn Daten beschädigt sind, kann nur ein Backup helfen.
+health.intro.affirmation=Ich habe die obenstehende Information gelesen und verstanden
+## Start Failure
+health.fail.header=Fehler beim Laden der Tresorkonfiguration
+health.fail.ioError=Beim Lesezugriff auf die Konfigurationsdatei ist ein Fehler aufgetreten.
+health.fail.parseError=Beim Parsen der Tresor-Konfiguration ist ein Fehler aufgetreten.
+health.fail.moreInfo=Weitere Informationen
+## Check Selection
+health.checkList.description=Markiere Prüfungen in der linken Liste oder benutze die Knöpfe darunter.
+health.checkList.selectAllButton=Alle Prüfungen auswählen
+health.checkList.deselectAllButton=Alle Prüfungen abwählen
health.check.runBatchBtn=Ausgewählte Prüfungen ausführen
## Detail view
-health.check.detail.noSelectedCheck=Wähle für die Ergebnisse eine abgeschlossene Intregritätsprüfung in der Liste links aus.
-health.check.detail.header=Ergebnisse für %s
-health.check.detail.taskNotStarted=Die Prüfung wurde nicht zum Ausführen ausgewählt.
-health.check.detail.taskScheduled=Die Prüfung ist geplant.
-health.check.detail.taskRunning=Die Prüfung läuft derzeit …
-health.check.detail.taskSucceeded=Die Prüfung wurde nach %d Millisekunden erfolgreich beendet.
-health.check.detail.taskFailed=Die Prüfung wurde wegen eines Fehlers beendet.
-health.check.detail.taskCancelled=Die Prüfung wurde abgebrochen.
-health.check.detail.problemCount=%d Probleme und %d unbehebbare Fehler gefunden.
+health.check.detail.noSelectedCheck=Wähle für die Ergebnisse eine abgeschlossene Integritätsprüfung in der Liste links aus.
+health.check.detail.checkScheduled=Die Prüfung ist geplant.
+health.check.detail.checkRunning=Prüfung läuft…
+health.check.detail.checkSkipped=Die Prüfung wurde nicht zur Ausführung ausgewählt.
+health.check.detail.checkFinished=Die Prüfung wurde erfolgreich abgeschlossen.
+health.check.detail.checkFinishedAndFound=Die Überprüfung wurde beendet. Bitte sichte die Ergebnisse.
+health.check.detail.checkFailed=Die Prüfung wurde wegen eines Fehlers beendet.
+health.check.detail.checkCancelled=Die Prüfung wurde abgebrochen.
health.check.exportBtn=Bericht exportieren
-health.check.fixBtn=Reparieren
-## Checks
-health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Verzeichnisüberprüfung
+## Fix Application
+health.fix.fixBtn=Beheben
+health.fix.successTip=Fehlerbehebung erfolgreich
+health.fix.failTip=Reparatur fehlgeschlagen, siehe Log für Details
# Preferences
preferences.title=Einstellungen
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Diagnoseprotokoll aktivieren
preferences.general.debugDirectory=Protokolldateien anzeigen
preferences.general.autoStart=Cryptomator beim Systemstart starten
preferences.general.keychainBackend=Passwörter speichern mit
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome-Schlüsselbund
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS-Schlüsselbund-Zugriff
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows-Datenschutz
preferences.general.interfaceOrientation=Oberflächenausrichtung
preferences.general.interfaceOrientation.ltr=Von links nach rechts
preferences.general.interfaceOrientation.rtl=Von rechts nach links
@@ -251,7 +261,7 @@ main.debugModeEnabled.tooltip=Diagnosemodus ist aktiviert
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
+main.dropZone.unknownDragboardContent=Falls du einen Tresor hinzufügen möchtest, zieh ihn in dieses Fenster
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klicke hier, um einen Tresor hinzuzufügen
main.vaultlist.contextMenu.remove=Entfernen …
@@ -284,11 +294,15 @@ main.vaultDetail.stats=Tresorstatistik
### Missing
main.vaultDetail.missing.info=Cryptomator konnte keinen Tresor mit diesem Pfad finden.
main.vaultDetail.missing.recheck=Erneut prüfen
-main.vaultDetail.missing.remove=Aus Tresorliste entfernen…
-main.vaultDetail.missing.changeLocation=Speicherort des Tresors ändern…
+main.vaultDetail.missing.remove=Aus Tresorliste entfernen …
+main.vaultDetail.missing.changeLocation=Speicherort des Tresors ändern …
### 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
+### Error
+main.vaultDetail.error.info=Beim Laden des Tresors von der Festplatte ist ein Fehler aufgetreten.
+main.vaultDetail.error.reload=Erneut laden
+main.vaultDetail.error.windowTitle=Fehler beim Laden des Tresors
# Wrong File Alert
wrongFileAlert.title=Verschlüsseln von Dateien
@@ -304,12 +318,15 @@ wrongFileAlert.link=Besuche für weitere Hilfe
## General
vaultOptions.general=Allgemein
vaultOptions.general.vaultName=Tresorname
+vaultOptions.general.autoLock.lockAfterTimePart1=Nach
+vaultOptions.general.autoLock.lockAfterTimePart2=Minuten Inaktivität sperren
vaultOptions.general.unlockAfterStartup=Tresor beim Start von Cryptomator entsperren
vaultOptions.general.actionAfterUnlock=Nach erfolgreichem Entsperren
vaultOptions.general.actionAfterUnlock.ignore=Nichts tun
vaultOptions.general.actionAfterUnlock.reveal=Laufwerk anzeigen
vaultOptions.general.actionAfterUnlock.ask=Nachfragen
-vaultOptions.general.healthBtn=Integritätsprüfung starten
+vaultOptions.general.startHealthCheckBtn=Integritätsprüfung starten
+
## Mount
vaultOptions.mount=Laufwerk
vaultOptions.mount.readonly=Schreibgeschützt
@@ -325,13 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Wähle ein leeres Verzeichnis
vaultOptions.masterkey=Passwort
vaultOptions.masterkey.changePasswordBtn=Passwort ändern
vaultOptions.masterkey.forgetSavedPasswordBtn=Gespeichertes Passwort vergessen
-vaultOptions.masterkey.recoveryKeyExpanation=Dein Wiederherstellungsschlüssel gehört nur dir! Dieser wird benötigt, um deinen Tresor wiederherzustellen, für den Fall das du dein Passwort verloren hast.
+vaultOptions.masterkey.recoveryKeyExplanation=Dein Wiederherstellungsschlüssel gehört nur dir! Dieser wird benötigt, um deinen Tresor wiederherzustellen, für den Fall das du dein Passwort verloren hast.
vaultOptions.masterkey.showRecoveryKeyBtn=Wiederherstellungsschlüssel anzeigen
vaultOptions.masterkey.recoverPasswordBtn=Passwort wiederherstellen
-## Auto Lock
-vaultOptions.autoLock=Autom. Sperren
-vaultOptions.autoLock.lockAfterTimePart1=Nach
-vaultOptions.autoLock.lockAfterTimePart2=Minuten Inaktivität sperren
+
# Recovery Key
recoveryKey.title=Wiederherstellungsschlüssel
diff --git a/src/main/resources/i18n/strings_el.properties b/src/main/resources/i18n/strings_el.properties
index 462f79dcb..11230d7c8 100644
--- a/src/main/resources/i18n/strings_el.properties
+++ b/src/main/resources/i18n/strings_el.properties
@@ -13,11 +13,14 @@ generic.button.done=Κλείσιμο
generic.button.next=Επόμενο
generic.button.print=Εκτύπωση
## Error
-generic.error.title=Παρουσιάστηκε ένα απροσδόκητο σφάλμα
-generic.error.instruction=Αυτό δεν έπρεπε να συμβεί. Παρακαλώ αντιγράψτε το κείμενο του σφάλματος και επισυνάψτε μια περιγραφή των βημάτων που οδήγησαν σε αυτό το σφάλμα.
+generic.error.title=Σφάλμα %s
+generic.error.instruction=Ωχ! Το Cryptomator δεν περίμενε να συμβεί αυτό. Μπορείτε να αναζητήσετε υπάρχουσες λύσεις για αυτό το σφάλμα. Ή εάν δεν έχει αναφερθεί ακόμα, μη διστάσετε να το κάνετε.
+generic.error.hyperlink.lookup=Αναζήτηση αυτού του σφάλματος
+generic.error.hyperlink.report=Αναφέρετε αυτό το σφάλμα
+generic.error.technicalDetails=Λεπτομέρειες:
# Defaults
-defaults.vault.vaultName=Vault
+defaults.vault.vaultName=Κρύπτη
# Tray Menu
traymenu.showMainWindow=Εμφάνιση
@@ -29,34 +32,34 @@ traymenu.vault.lock=Κλείδωμα
traymenu.vault.reveal=Αποκάλυψη
# Add Vault Wizard
-addvaultwizard.title=Προσθήκη Vault
+addvaultwizard.title=Προσθήκη Κρύπτης
## Welcome
-addvaultwizard.welcome.newButton=Δημιουργία νέου Vault
-addvaultwizard.welcome.existingButton=Άνοιγμα υπάρχοντος Vault
+addvaultwizard.welcome.newButton=Δημιουργία Νέας Κρύπτης
+addvaultwizard.welcome.existingButton=Άνοιγμα Υπάρχοντος Κρύπτης
## New
### Name
-addvaultwizard.new.nameInstruction=Διαλέξτε ένα όνομα για το vault
-addvaultwizard.new.namePrompt=Όνομα Vault
+addvaultwizard.new.nameInstruction=Διαλέξτε ένα όνομα για την κρύπτη
+addvaultwizard.new.namePrompt=Όνομα Κρύπτης
### Location
-addvaultwizard.new.locationInstruction=Που θα αποθηκεύσει το Cryptomator τα κωδικοποιημένα αρχεία του vault σου;
+addvaultwizard.new.locationInstruction=Που θα πρέπει να αποθηκεύσει το Cryptomator τα κωδικοποιημένα αρχεία της κρύπτης σου;
addvaultwizard.new.locationLabel=Θέση αποθήκευσης
addvaultwizard.new.locationPrompt=…
addvaultwizard.new.directoryPickerLabel=Προσαρμοσμένη τοποθεσία
addvaultwizard.new.directoryPickerButton=Επιλογή…
addvaultwizard.new.directoryPickerTitle=Επιλογή φακέλου
-addvaultwizard.new.fileAlreadyExists=Ένα αρχείο ή φάκελος με το όνομα του vault υπάρχει ήδη
+addvaultwizard.new.fileAlreadyExists=Ένα αρχείο ή φάκελος με το όνομα της κρύπτης υπάρχει ήδη
addvaultwizard.new.locationDoesNotExist=Στην καθορισμένη διαδρομή δεν υπάρχει ή δεν μπορεί να προσπελαστεί ένας φάκελος
addvaultwizard.new.locationIsNotWritable=Δεν υπάρχει πρόσβαση εγγραφής στην καθορισμένη διαδρομή
-addvaultwizard.new.locationIsOk=Κατάλληλη τοποθεσία για το vault σας
-addvaultwizard.new.invalidName=Λάθος όνομα vault. Παρακαλώ χρησιμοποιείστε ένα κανονικό όνομα φακέλου.
+addvaultwizard.new.locationIsOk=Κατάλληλη τοποθεσία για την κρύπτη σας
+addvaultwizard.new.invalidName=Λάθος όνομα κρύπτης. Παρακαλώ χρησιμοποιείστε ένα κανονικό όνομα φακέλου.
### Password
-addvaultwizard.new.createVaultBtn=Δημιουργία Vault
+addvaultwizard.new.createVaultBtn=Δημιουργία Κρύπτης
addvaultwizard.new.generateRecoveryKeyChoice=Δεν θα μπορείτε να έχετε πρόσβαση στα δεδομένα σας χωρίς τον κωδικό σας. Θέλετε να δημιουργηθεί ένα κλειδί ανάκτησης στην περίπτωση που χάσετε τον κωδικό σας;
addvaultwizard.new.generateRecoveryKeyChoice.yes=Ναι παρακαλώ, καλύτερα ασφαλής παρά λυπημένος
addvaultwizard.new.generateRecoveryKeyChoice.no=Όχι ευχαριστώ, δεν θα χάσω τον κωδικό μου
### Information
addvault.new.readme.storageLocation.fileName=ΣΗΜΑΝΤΙΚΟ.rtf
-addvault.new.readme.storageLocation.1=ΑΡΧΕΙΑ VAULT
+addvault.new.readme.storageLocation.1=ΑΡΧΕΙΑ ΚΡΥΠΤΗΣ
addvault.new.readme.storageLocation.2=Αυτή είναι η τοποθεσία του vault σας.
addvault.new.readme.storageLocation.3=ΜΗΝ
addvault.new.readme.storageLocation.4=αλλάξετε οποιοδήποτε αρχείο σε αυτό το φάκελο ή
@@ -82,7 +85,7 @@ addvaultwizard.success.unlockNow=Ξεκλείδωμα τώρα
# Remove Vault
removeVault.title=Διαγραφή Vault
removeVault.information=Το Cryptomator θα ξεχάσει αυτό το vault. Μπορείτε να το προσθέσετε ξανά αργότερα. Δεν θα διαγραφούν τα κωδικοποιημένα αρχεία σας από τον σκληρό σας δίσκο.
-removeVault.confirmBtn=Διαγραφή Vault
+removeVault.confirmBtn=Διαγραφή Κρύπτης
# Change Password
changepassword.title=Αλλαγή κωδικού πρόσβασης
@@ -95,7 +98,7 @@ forgetPassword.information=Ο αποθηκευμένος κωδικός αυτο
forgetPassword.confirmBtn=Ξέχασα τον κωδικό πρόσβασης
# Unlock
-unlock.title=Ξεκλείδωμα Vault
+unlock.title=Ξεκλειδώστε "%s"
unlock.passwordPrompt=Εισάγετε τον κωδικό για "%s":
unlock.savePassword=Απομνημόνευση κωδικού πρόσβασης
unlock.unlockBtn=Ξεκλείδωμα
@@ -130,7 +133,7 @@ migration.start.confirm=Ναι, το vault μου είναι πλήρως συγ
migration.run.enterPassword=Εισάγετε τον κωδικό για "%s"
migration.run.startMigrationBtn=Ενσωμάτωση Vault
migration.run.progressHint=Αυτό θα πάρει αρκετό χρόνο…
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" συγχωνεύτηκε επιτυχώς.\nΜπορείτε να ξεκλειδώσετε το vault σας.
migration.success.unlockNow=Ξεκλείδωμα τώρα
## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=Το vault δεν μπορεί να συγχωνευ
migration.impossible.moreInfo=Το vault μπορεί να ανοιχθεί με παλαιότερη έκδοση. Για οδηγίες χειροκίνητης συγχώνευσης του vault, επισκεφτείτε
# Health Check
-health.title=Έλεγχος Υγείας Vault
-health.start.introduction=Ο Έλεγχος Υγείας του Vault είναι μια σειρά από ελέγχους για ανίχνευση και επιδιόρθωση των προβλημάτων στην εσωτερική δομή του Vault σας. Παρακαλώ σημειώστε, ότι δεν μπορούν να διορθωθούν όλα τα προβλήματα. Χρειάζεστε τον κωδικό πρόσβασης Vault για να εκτελέσετε τους ελέγχους.
-health.start.configValid=Η ανάγνωση και η ανάλυση του αρχείου ρυθμίσεων του Vault ήταν επιτυχής. Συνεχίστε για να επιλέξετε ελέγχους.
-health.start.configInvalid=Σφάλμα κατά την ανάγνωση και ανάλυση του αρχείου ρυθμίσεων του Vault.
-health.checkList.header=Διαθέσιμοι Έλεγχοι Υγείας
-health.checkList.selectAllBox=Επιλογή όλων
+## Start
+health.title=Έλεγχος υγείας του "%s"
+health.intro.header=Έλεγχος υγείας
+health.intro.text=Ο Έλεγχος Υγείας είναι μια συλλογή ελέγχων για τον εντοπισμό και ενδεχομένως την επίλυση προβλημάτων στην εσωτερική δομή του vault σας. Παρακαλώ λάβετε υπόψη:
+health.intro.remarkSync=Βεβαιωθείτε ότι όλες οι συσκευές είναι πλήρως συγχρονισμένες, αυτό επιλύει τα περισσότερα προβλήματα.
+health.intro.remarkFix=Δεν μπορούν να διορθωθούν όλα τα προβλήματα.
+health.intro.remarkBackup=Εάν τα δεδομένα είναι κατεστραμμένα, μόνο ένα αντίγραφο ασφαλείας μπορεί να βοηθήσει.
+health.intro.affirmation=Έχω διαβάσει και κατανοήσει τις παραπάνω πληροφορίες
+## Start Failure
+health.fail.header=Σφάλμα κατά τη φόρτωση παραμέτρων του Vault
+health.fail.ioError=Παρουσιάστηκε σφάλμα κατά την πρόσβαση και ανάγνωση του αρχείου ρυθμίσεων.
+health.fail.parseError=Παρουσιάστηκε σφάλμα κατά την ανάλυση των ρυθμίσεων του vault.
+health.fail.moreInfo=Περισσότερες Πληροφορίες
+## Check Selection
+health.checkList.description=Επιλέξτε τους ελέγχους στην αριστερή λίστα ή χρησιμοποιήστε τα παρακάτω κουμπιά.
+health.checkList.selectAllButton=Επιλογή Όλων Των Ελέγχων
+health.checkList.deselectAllButton=Αποεπιλογή Όλων Των Ελέγχων
health.check.runBatchBtn=Εκτέλεση επιλεγμένων ελέγχων
## Detail view
health.check.detail.noSelectedCheck=Για τα αποτελέσματα επιλέξτε έναν ολοκληρωμένο έλεγχο υγείας στην αριστερή λίστα.
-health.check.detail.header=Αποτελέσματα από %s
-health.check.detail.taskNotStarted=Ο έλεγχος δεν επιλέχθηκε για εκτέλεση.
-health.check.detail.taskScheduled=Ο έλεγχος έχει προγραμματιστεί.
-health.check.detail.taskRunning=Ο έλεγχος εκτελείται αυτήν τη στιγμή…
-health.check.detail.taskSucceeded=Ο έλεγχος ολοκληρώθηκε επιτυχώς μετά από %d χιλιοστά του δευτερολέπτου.
-health.check.detail.taskFailed=Ο έλεγχος τερματίστηκε λόγω σφάλματος.
-health.check.detail.taskCancelled=Ο έλεγχος ακυρώθηκε.
-health.check.detail.problemCount=Βρέθηκαν %d προβλήματα και %d μη επιδιορθώσιμα σφάλματα.
+health.check.detail.checkScheduled=Ο έλεγχος έχει προγραμματιστεί.
+health.check.detail.checkRunning=Ο έλεγχος εκτελείται αυτήν τη στιγμή…
+health.check.detail.checkSkipped=Ο έλεγχος δεν επιλέχθηκε για εκτέλεση.
+health.check.detail.checkFinished=Ο έλεγχος ολοκληρώθηκε με επιτυχία.
+health.check.detail.checkFinishedAndFound=Ο έλεγχος σταμάτησε να εκτελείται. Παρακαλώ εξετάστε τα αποτελέσματα.
+health.check.detail.checkFailed=Ο έλεγχος τερματίστηκε λόγω σφάλματος.
+health.check.detail.checkCancelled=Ο έλεγχος ακυρώθηκε.
health.check.exportBtn=Εξαγωγή Αναφοράς
-health.check.fixBtn=Επιδιόρθωση
-## Checks
-health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Έλεγχος Φακέλου
+## Fix Application
+health.fix.fixBtn=Επιδιόρθωση
+health.fix.successTip=Επιτυχής επιδιόρθωση
+health.fix.failTip=Επιδιόρθωση απέτυχε, δείτε το αρχείο καταγραφής για λεπτομέρειες
# Preferences
preferences.title=Προτιμήσεις
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Ενεργοποίηση καταγραφής
preferences.general.debugDirectory=Αποκάλυψη αρχείων καταγραφής
preferences.general.autoStart=Εκκίνηση Cryptomator στην εκκίνηση του συστήματος
preferences.general.keychainBackend=Αποθήκευση κωδικού πρόσβασης με
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Keychain πρόσβαση
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Προστασία δεδομένων Windows
preferences.general.interfaceOrientation=Προσανατολισμός εφαρμογής
preferences.general.interfaceOrientation.ltr=Αριστερά προς δεξιά
preferences.general.interfaceOrientation.rtl=Δεξιά προς αριστερά
@@ -260,7 +270,7 @@ main.vaultlist.contextMenu.unlock=Ξεκλείδωμα…
main.vaultlist.contextMenu.unlockNow=Ξεκλείδωμα τώρα
main.vaultlist.contextMenu.vaultoptions=Εμφάνιση επιλογών Vault
main.vaultlist.contextMenu.reveal=Αποκάλυψη εικονικού δίσκου
-main.vaultlist.addVaultBtn=Προσθήκη Vault
+main.vaultlist.addVaultBtn=Προσθήκη Κρύπτης
## Vault Detail
### Welcome
main.vaultDetail.welcomeOnboarding=Ευχαριστούμε που επιλέξατε το Cryptomator για να προστατεύσετε τα αρχεία σας. Αν χρειάζεστε οποιαδήποτε βοήθεια, ελέγξτε τους οδηγούς για αρχάριους:
@@ -289,6 +299,10 @@ main.vaultDetail.missing.changeLocation=Αλλαγή τοποθεσίας Vault
### Needs Migration
main.vaultDetail.migrateButton=Αναβάθμιση Vault
main.vaultDetail.migratePrompt=Το vault σας πρέπει να αναβαθμιστεί σε νέα μορφή, προτού να έχετε πρόσβαση σε αυτό
+### Error
+main.vaultDetail.error.info=Παρουσιάστηκε σφάλμα κατά τη φόρτωση της κρύπτης από το δίσκο.
+main.vaultDetail.error.reload=Επαναφόρτωση
+main.vaultDetail.error.windowTitle=Σφάλμα φόρτωσης κρύπτης
# Wrong File Alert
wrongFileAlert.title=Πως να κωδικοποιήσετε αρχεία
@@ -303,13 +317,16 @@ wrongFileAlert.link=Για παραπάνω βοήθεια, επισκεφτεί
# Vault Options
## General
vaultOptions.general=Γενικά
-vaultOptions.general.vaultName=Όνομα Vault
+vaultOptions.general.vaultName=Όνομα Κρύπτης
+vaultOptions.general.autoLock.lockAfterTimePart1=Κλείδωμα όταν παραμένει σε αδράνεια για
+vaultOptions.general.autoLock.lockAfterTimePart2=λεπτά
vaultOptions.general.unlockAfterStartup=Ξεκλείδωμα vault όταν ξεκινά το Cryptomator
vaultOptions.general.actionAfterUnlock=Μετά το επιτυχές ξεκλείδωμα
vaultOptions.general.actionAfterUnlock.ignore=Να μην γίνει τίποτα
vaultOptions.general.actionAfterUnlock.reveal=Αποκάλυψη Εικονικού Δίσκου
vaultOptions.general.actionAfterUnlock.ask=Ρώτα
-vaultOptions.general.healthBtn=Έναρξη ελέγχου Υγείας Vault
+vaultOptions.general.startHealthCheckBtn=Έναρξη ελέγχου Υγείας
+
## Mount
vaultOptions.mount=Προσάρτηση
vaultOptions.mount.readonly=Μόνο για ανάγνωση
@@ -325,13 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Επιλέξτε ένα άδ
vaultOptions.masterkey=Κωδικός πρόσβασης
vaultOptions.masterkey.changePasswordBtn=Αλλαγή κωδικού πρόσβασης
vaultOptions.masterkey.forgetSavedPasswordBtn=Διαγραφή αποθηκευμένου κωδικού
-vaultOptions.masterkey.recoveryKeyExpanation=Το κλειδί ασφαλείας είναι ο μόνος τρόπος ανάκτησης πρόσβασης στο vault αν χάσετε τον κωδικό σας.
+vaultOptions.masterkey.recoveryKeyExplanation=Το κλειδί ασφαλείας είναι ο μόνος τρόπος ανάκτησης πρόσβασης σε ένα vault αν χάσετε τον κωδικό σας.
vaultOptions.masterkey.showRecoveryKeyBtn=Προβολή κλειδιού ανάκτησης
vaultOptions.masterkey.recoverPasswordBtn=Ανάκτηση κωδικού
-## Auto Lock
-vaultOptions.autoLock=Αυτόματο Κλείδωμα
-vaultOptions.autoLock.lockAfterTimePart1=Κλείδωμα όταν παραμένει σε αδράνεια για
-vaultOptions.autoLock.lockAfterTimePart2=λεπτά
+
# Recovery Key
recoveryKey.title=Κλειδί Ανάκτησης
diff --git a/src/main/resources/i18n/strings_es.properties b/src/main/resources/i18n/strings_es.properties
index 349b6d80d..37e3568ce 100644
--- a/src/main/resources/i18n/strings_es.properties
+++ b/src/main/resources/i18n/strings_es.properties
@@ -13,8 +13,11 @@ generic.button.done=Hecho
generic.button.next=Continuar
generic.button.print=Imprimir
## Error
-generic.error.title=Ocurrió un error inesperado
-generic.error.instruction=Esto no debió suceder. Notifique el error de abajo e incluya una descripción de los pasos que llevaron a este error.
+generic.error.title=Error %s
+generic.error.instruction=¡Ups! Cryptomator no esperaba que esto sucediera. Puede buscar soluciones existentes para este error. O si aún no se ha notiicado, siéntase libre de hacerlo.
+generic.error.hyperlink.lookup=Buscar este error
+generic.error.hyperlink.report=Notificar este error
+generic.error.technicalDetails=Detalles:
# Defaults
defaults.vault.vaultName=Bóveda
@@ -95,7 +98,7 @@ forgetPassword.information=Esto eliminará la contraseña guardada de esta bóve
forgetPassword.confirmBtn=Olvidar contraseña
# Unlock
-unlock.title=Desbloquear bóveda
+unlock.title=Desbloquear "%s"
unlock.passwordPrompt=Ingresar contraseña para "%s":
unlock.savePassword=Recordar contraseña
unlock.unlockBtn=Desbloquear
@@ -130,7 +133,7 @@ migration.start.confirm=Sí, mi bóveda está sincronizada
migration.run.enterPassword=Ingresar la contraseña para "%s"
migration.run.startMigrationBtn=Migrar bóveda
migration.run.progressHint=Esto puede tardar un poco…
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" se migró con éxito.\nYa se puede desbloquear la bóveda.
migration.success.unlockNow=Desbloquear ahora
## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=La bóveda no puede migrarse automáticamente porque
migration.impossible.moreInfo=La bóveda aún se puede abrir con una versión anterior. Para obtener instrucciones en cómo migrar manualmente una bóveda, visite
# Health Check
-health.title=Comprobación del Estado de la Bóveda
-health.start.introduction=La comprobación del estado de la bóveda es un conjunto de pruebas para detectar y posiblemente solucionar los problemas de la estructura interna de la bóveda. Tenga en cuenta que no todos los problemas son corregibles. Necesita la contraseña de la bóveda para realizar las comprobaciones.
-health.start.configValid=La lectura y análisis del archivo de configuración de la bóveda fueron correctos. Proceda a seleccionar las comprobaciones.
-health.start.configInvalid=Error al leer y analizar el archivo de configuración de la bóveda.
-health.checkList.header=Comprobaciones del estado disponibles
-health.checkList.selectAllBox=Seleccionar todo
+## Start
+health.title=Comprobador de estado de "%s"
+health.intro.header=Comprobador de estado
+health.intro.text=El comprobador de estado es una colección de comprobaciones para detectar y posiblemente corregir problemas en la estructura interna de su bóveda. Tome en cuenta:
+health.intro.remarkSync=Asegúrese de que todos los dispositivos están completamente sincronizados, esto resuelve la mayoría de los problemas.
+health.intro.remarkFix=No todos los problemas se pueden solucionar.
+health.intro.remarkBackup=Si los datos están dañados, solo una copia de seguridad puede ayudar.
+health.intro.affirmation=He leído y entendido la información anterior
+## Start Failure
+health.fail.header=Error al cargar la configuración de la bóveda
+health.fail.ioError=Ocurrió un error al acceder y leer el archivo de configuración.
+health.fail.parseError=Ocurrió un error mientras se analizaba la configuración de la bóveda.
+health.fail.moreInfo=Más información
+## Check Selection
+health.checkList.description=Seleccione las comprobaciones en la lista de la izquierda o utilice los botones de abajo.
+health.checkList.selectAllButton=Seleccionar todas las comprobaciones
+health.checkList.deselectAllButton=Deseleccionar todas las comprobaciones
health.check.runBatchBtn=Ejecutar las comprobaciones seleccionadas
## Detail view
health.check.detail.noSelectedCheck=Para los resultados seleccione una comprobación del estado en la lista de la izquierda
-health.check.detail.header=Resultados de %s
-health.check.detail.taskNotStarted=No se ha seleccionado la comprobación para ejecutarse.
-health.check.detail.taskScheduled=La comprobación está programada.
-health.check.detail.taskRunning=La comprobación se está ejecutando…
-health.check.detail.taskSucceeded=La comprobación finalizó correctamente después de %d milisegundos.
-health.check.detail.taskFailed=La comprobación terminó debido a un error.
-health.check.detail.taskCancelled=La comprobación se canceló.
-health.check.detail.problemCount=Se encontraron %d problemas y %d errores no corregibles.
+health.check.detail.checkScheduled=La comprobación está programada.
+health.check.detail.checkRunning=La comprobación se está ejecutando…
+health.check.detail.checkSkipped=No se ha seleccionado la comprobación para ejecutarse.
+health.check.detail.checkFinished=La comprobación terminó con éxito.
+health.check.detail.checkFinishedAndFound=La comprobación terminó de ejecutarse. Revise los resultados.
+health.check.detail.checkFailed=La comprobación terminó debido a un error.
+health.check.detail.checkCancelled=La comprobación se canceló.
health.check.exportBtn=Exportar informe
-health.check.fixBtn=Reparar
-## Checks
-health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Comprobar directorio
+## Fix Application
+health.fix.fixBtn=Reparar
+health.fix.successTip=Reparación exitosa
+health.fix.failTip=Reparación fallida, ver el registro para más detalles
# Preferences
preferences.title=Preferencias
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Habilitar registro de depuración
preferences.general.debugDirectory=Revelar archivos de registro
preferences.general.autoStart=Cargar Cryptomator al iniciar el sistema
preferences.general.keychainBackend=Guardar contraseñas con
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=Acceso a llaveros macOS
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Protección de Datos de Windows
preferences.general.interfaceOrientation=Orientación de la interfaz
preferences.general.interfaceOrientation.ltr=Izquierda a derecha
preferences.general.interfaceOrientation.rtl=Derecha a izquierda
@@ -203,6 +213,11 @@ preferences.updates.autoUpdateCheck=Buscar actualizaciones automáticamente
preferences.updates.checkNowBtn=Buscar ahora
preferences.updates.updateAvailable=Actualización a la versión %s disponible.
## Contribution
+preferences.contribute=Apóyenos
+preferences.contribute.registeredFor=Certificado de soporte registrado para %s
+preferences.contribute.noCertificate=Apoye a Cryptomator y reciba un certificado de seguidor. Es como una clave de licencia, pero para gente asombrosa usando software libre. ;-)
+preferences.contribute.getCertificate=¿Aún no tiene una? Aprenda cómo puede obtenerlo.
+preferences.contribute.promptText=Pegue aquí el código de certificado de seguidor
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
@@ -284,6 +299,10 @@ main.vaultDetail.missing.changeLocation=Cambiar ubicación de la bóveda…
### Needs Migration
main.vaultDetail.migrateButton=Mejorar bóveda
main.vaultDetail.migratePrompt=Su bóveda necesita ser actualizada a un formato nuevo antes de poder acceder a ella
+### Error
+main.vaultDetail.error.info=Se produjo un error al cargar la bóveda del disco.
+main.vaultDetail.error.reload=Recargar
+main.vaultDetail.error.windowTitle=Error al cargar la bóveda
# Wrong File Alert
wrongFileAlert.title=Cómo encriptar archivos
@@ -299,12 +318,15 @@ wrongFileAlert.link=Para más ayuda, visite
## General
vaultOptions.general=General
vaultOptions.general.vaultName=Nombre de la bóveda
+vaultOptions.general.autoLock.lockAfterTimePart1=Bloquear después de
+vaultOptions.general.autoLock.lockAfterTimePart2=minutos
vaultOptions.general.unlockAfterStartup=Desbloquear bóveda al iniciar Cryptomator
vaultOptions.general.actionAfterUnlock=Después de desbloquear exitosamente
vaultOptions.general.actionAfterUnlock.ignore=No hacer nada
vaultOptions.general.actionAfterUnlock.reveal=Revelar unidad
vaultOptions.general.actionAfterUnlock.ask=Preguntar
-vaultOptions.general.healthBtn=Iniciar comprobación del estado
+vaultOptions.general.startHealthCheckBtn=Iniciar comprobación de estado
+
## Mount
vaultOptions.mount=Montaje
vaultOptions.mount.readonly=Sólo lectura
@@ -320,13 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Elegir un directorio vacío
vaultOptions.masterkey=Contraseña
vaultOptions.masterkey.changePasswordBtn=Cambiar contraseña
vaultOptions.masterkey.forgetSavedPasswordBtn=Olvidar contraseña guardada
-vaultOptions.masterkey.recoveryKeyExpanation=Una clave de recuperación es el único medio para restaurar el acceso a una bóveda si pierde su contraseña.
+vaultOptions.masterkey.recoveryKeyExplanation=Una clave de recuperación es el único medio para restaurar el acceso a una bóveda si pierde su contraseña.
vaultOptions.masterkey.showRecoveryKeyBtn=Mostrar clave de recuperación
vaultOptions.masterkey.recoverPasswordBtn=Recuperar contraseña
-## Auto Lock
-vaultOptions.autoLock=Autobloqueo
-vaultOptions.autoLock.lockAfterTimePart1=Bloquear después de
-vaultOptions.autoLock.lockAfterTimePart2=minutos
+
# Recovery Key
recoveryKey.title=Clave de recuperación
diff --git a/src/main/resources/i18n/strings_fr.properties b/src/main/resources/i18n/strings_fr.properties
index 50a670823..fe1fddaf8 100644
--- a/src/main/resources/i18n/strings_fr.properties
+++ b/src/main/resources/i18n/strings_fr.properties
@@ -13,8 +13,11 @@ generic.button.done=Terminé
generic.button.next=Suivant
generic.button.print=Imprimer
## Error
-generic.error.title=Une erreur inattendue est survenue
-generic.error.instruction=Cela n'aurait pas dû se produire. Veuillez reporter le texte d'erreur ci-dessous et inclure une description des étapes qui ont conduit à cette erreur.
+generic.error.title=Erreur: %s
+generic.error.instruction=Oups ! Cryptomator ne s'attendait pas à ce que cela se produise. Vous pouvez rechercher des solutions existantes pour cette erreur. Ou si elle n'a pas encore été signalée, n'hésitez pas à le faire.
+generic.error.hyperlink.lookup=Rechercher cette erreur
+generic.error.hyperlink.report=Signaler cette erreur
+generic.error.technicalDetails=Détails:
# Defaults
defaults.vault.vaultName=Coffre
@@ -60,7 +63,7 @@ addvault.new.readme.storageLocation.1=Fichiers de coffre-fort
addvault.new.readme.storageLocation.2=Ceci est le chemin de votre coffre-fort.
addvault.new.readme.storageLocation.3=NE PAS
addvault.new.readme.storageLocation.4=Modifier n'importe quel fichier dans ce répertoire ou
-addvault.new.readme.storageLocation.5=Collez n'importe quel fichier à crypter dans ce répertoire.
+addvault.new.readme.storageLocation.5=Collez n'importe quel fichier à chiffrer dans ce répertoire.
addvault.new.readme.storageLocation.6=Si vous voulez chiffrer les fichiers et afficher le contenu du coffre, faites ce qui suit :
addvault.new.readme.storageLocation.7=1. Ajouter ce coffre à Cryptomator.
addvault.new.readme.storageLocation.8=2. Déverrouillez le coffre-fort dans Cryptomator.
@@ -69,7 +72,7 @@ addvault.new.readme.storageLocation.10=Si vous avez besoin d'aide, consultez la
addvault.new.readme.accessLocation.fileName=BIENVENUE.rtf
addvault.new.readme.accessLocation.1=🔐 VOLUME CHIFFRÉ 🔐
addvault.new.readme.accessLocation.2=Ceci est le chemin d'accès de votre coffre-fort.
-addvault.new.readme.accessLocation.3=Tous les fichiers ajoutés à ce volume seront cryptés par Cryptomator. Vous pouvez l'utiliser comme n'importe quel lecteur/répertoire. Ceci est seulement une vue déchiffrée de son contenu, vos fichiers restent chiffrés dans votre disque dur à tout le temps.
+addvault.new.readme.accessLocation.3=Tous les fichiers ajoutés à ce volume seront chiffrés par Cryptomator. Vous pouvez l'utiliser comme n'importe quel lecteur/répertoire. Ceci est seulement une vue déchiffrée de son contenu, vos fichiers restent chiffrés dans votre disque dur à tout le temps.
addvault.new.readme.accessLocation.4=Vous pouvez supprimer ce fichier.
## Existing
addvaultwizard.existing.instruction=Sélectionner le fichier "masterkey.cryptomator" de votre coffre existant.
@@ -90,12 +93,12 @@ changepassword.enterOldPassword=Entrez le mot de passe actuel pour "%s"
changepassword.finalConfirmation=Je comprends que je ne pourrai pas récupérer mes données si j'oublie mon mot de passe
# Forget Password
-forgetPassword.title=Mot de passe oublié
+forgetPassword.title=Oublier le mot de passe
forgetPassword.information=Ceci supprimera le mot de passe enregistré pour ce coffre de votre chaîne de clés système.
forgetPassword.confirmBtn=Oublier le mot de passe
# Unlock
-unlock.title=Déverrouiller le coffre
+unlock.title=Déverrouiller %s
unlock.passwordPrompt=Entrez le mot de passe pour “%s” :
unlock.savePassword=Mémoriser le mot de passe
unlock.unlockBtn=Déverrouiller
@@ -130,7 +133,7 @@ migration.start.confirm=Oui, mon coffre est bien synchronisé
migration.run.enterPassword=Entrez le mot de passe pour %s
migration.run.startMigrationBtn=Migrer le coffre
migration.run.progressHint=Ceci peut prendre un certain temps…
-## Sucess
+## Success
migration.success.nextStepsInstructions=“%s” migré.\nVous pouvez à présent déverrouiller ce coffre.
migration.success.unlockNow=Déverrouiller
## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=Le coffre-fort ne peut pas être migré automatiquem
migration.impossible.moreInfo=Le coffre-fort peut encore être ouvert avec une version plus ancienne. Pour obtenir des instructions sur la façon de migrer manuellement un coffre-fort, visitez
# Health Check
-health.title=Vérification de l'état de la chambre forte
-health.start.introduction=La vérification d'état du coffre fort est une collection de vérifications pour détecter et possiblement corriger certains problèmes dans sa structure. Notez que tous les problèmes ne peuvent pas être réglés. Il vous faut le mot de passe de votre coffre fort pour effectuer ces vérifications.
-health.start.configValid=La lecture et le parcours de la configuration se sont déroulés avec succès. Continuez avec la sélection des vérifications.
-health.start.configInvalid=Erreur lors de la lecture et de l'analyse du fichier de configuration du coffre.
-health.checkList.header=Tests de santé disponibles
-health.checkList.selectAllBox=Tout sélectionner
+## Start
+health.title=Vérifier l'état de "%s"
+health.intro.header=Vérifier l'état
+health.intro.text=Le bilan de santé est une série de vérifications pour détecter et corriger d'éventuels problèmes de structure interne au coffre. Rappelez-vous :
+health.intro.remarkSync=S'assurer que tous les appareils sont complètement synchronisés résout la plupart des problèmes.
+health.intro.remarkFix=Certains problèmes ne peuvent pas être corrigés.
+health.intro.remarkBackup=Si des données sont corrompues, la seule solution est une sauvegarde.
+health.intro.affirmation=J'ai lu et compris les informations ci-dessus
+## Start Failure
+health.fail.header=Erreur lors du chargement de la configuration du coffre
+health.fail.ioError=Une erreur s'est produite lors de l'accès et de la lecture du fichier de configuration.
+health.fail.parseError=Une erreur est survenue pendant la lecture de la configuration du coffre.
+health.fail.moreInfo=Plus d'informations
+## Check Selection
+health.checkList.description=Sélectionnez les contrôles dans la liste de gauche ou utilisez les boutons ci-dessous.
+health.checkList.selectAllButton=Sélectionner toutes les vérifications
+health.checkList.deselectAllButton=Désélectionner toutes les vérifications
health.check.runBatchBtn=Exécuter les vérifications sélectionnées
## Detail view
health.check.detail.noSelectedCheck=Pour les résultats, sélectionnez un bilan de santé terminé dans la liste de gauche.
-health.check.detail.header=Résultats de %s
-health.check.detail.taskNotStarted=La vérification n'a pas été sélectionnée pour être exécutée.
-health.check.detail.taskScheduled=La vérification est programmée.
-health.check.detail.taskRunning=Vérification en cours d'exécution…
-health.check.detail.taskSucceeded=La vérification s'est terminée avec succès après %d millisecondes.
-health.check.detail.taskFailed=La vérification s'est arrêté en raison d'une erreur.
-health.check.detail.taskCancelled=Vérification annulée.
-health.check.detail.problemCount=%d problèmes trouvés et %d erreurs non corrigeables.
+health.check.detail.checkScheduled=La vérification est programmée.
+health.check.detail.checkRunning=Vérification en cours d'exécution…
+health.check.detail.checkSkipped=La vérification n'a pas été sélectionnée pour être exécutée.
+health.check.detail.checkFinished=La vérification s'est terminée avec succès.
+health.check.detail.checkFinishedAndFound=La vérification s'est terminée. Veuillez vérifier les résultats.
+health.check.detail.checkFailed=La vérification s'est arrêtée en raison d'une erreur.
+health.check.detail.checkCancelled=Vérification annulée.
health.check.exportBtn=Exporter le rapport
-health.check.fixBtn=Corriger
-## Checks
-health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Vérification du répertoire
+## Fix Application
+health.fix.fixBtn=Réparer
+health.fix.successTip=Réparation réussie
+health.fix.failTip=Correction échouée, voir le journal pour plus de détails
# Preferences
preferences.title=Préférences
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Activer les logs debug
preferences.general.debugDirectory=Afficher le journal
preferences.general.autoStart=Lancer Cryptomator au démarrage du système
preferences.general.keychainBackend=Stocker les mots de passe avec
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Trousseau Gnome
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=Portefeuille KDE
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=Accès au trousseau macOS
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Protection des données Windows
preferences.general.interfaceOrientation=Orientation de l'interface
preferences.general.interfaceOrientation.ltr=De gauche à droite
preferences.general.interfaceOrientation.rtl=De droite à gauche
@@ -289,6 +299,10 @@ main.vaultDetail.missing.changeLocation=Changer l'Emplacement du Coffre…
### Needs Migration
main.vaultDetail.migrateButton=Mettre à jour le coffre
main.vaultDetail.migratePrompt=Votre coffre doit être converti dans un nouveau format avant d'y accéder
+### Error
+main.vaultDetail.error.info=Une erreur s'est produite lors du chargement du coffre depuis le disque.
+main.vaultDetail.error.reload=Actualiser
+main.vaultDetail.error.windowTitle=Erreur lors du chargement du coffre
# Wrong File Alert
wrongFileAlert.title=Comment chiffrer ses données
@@ -304,12 +318,15 @@ wrongFileAlert.link=Pour toute aide supplémentaire, visitez
## General
vaultOptions.general=Général
vaultOptions.general.vaultName=Nom de voûte
+vaultOptions.general.autoLock.lockAfterTimePart1=Verrouiler en cas d'inactivité pendant
+vaultOptions.general.autoLock.lockAfterTimePart2=minutes
vaultOptions.general.unlockAfterStartup=Déverrouiller le coffre au démarrage
vaultOptions.general.actionAfterUnlock=Après un déverrouillage réussi
vaultOptions.general.actionAfterUnlock.ignore=Ne rien faire
vaultOptions.general.actionAfterUnlock.reveal=Afficher le disque
vaultOptions.general.actionAfterUnlock.ask=Demander
-vaultOptions.general.healthBtn=Commencer le contrôle de santé
+vaultOptions.general.startHealthCheckBtn=Commencer le contrôle de santé
+
## Mount
vaultOptions.mount=Montage
vaultOptions.mount.readonly=Lecture seule
@@ -325,13 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Choisir un répertoire vide
vaultOptions.masterkey=Mot de passe
vaultOptions.masterkey.changePasswordBtn=Modifier le mot de passe
vaultOptions.masterkey.forgetSavedPasswordBtn=Oublier le mot de passe enregistré
-vaultOptions.masterkey.recoveryKeyExpanation=Une clé de récupération est votre seul moyen de rétablir l'accès à un coffre-fort, si vous perdez votre mot de passe.
+vaultOptions.masterkey.recoveryKeyExplanation=Une clé de récupération est votre seul moyen de rétablir l'accès à un coffre-fort, si vous perdez votre mot de passe.
vaultOptions.masterkey.showRecoveryKeyBtn=Afficher la clé de récupération
vaultOptions.masterkey.recoverPasswordBtn=Récupération du mot de passe
-## Auto Lock
-vaultOptions.autoLock=Verrouillage automatique
-vaultOptions.autoLock.lockAfterTimePart1=Verrouiler en cas d'inactivité pendant
-vaultOptions.autoLock.lockAfterTimePart2=minutes
+
# Recovery Key
recoveryKey.title=Clé de récupération
diff --git a/src/main/resources/i18n/strings_hi.properties b/src/main/resources/i18n/strings_hi.properties
index 2b2cdd872..e0a4455d0 100644
--- a/src/main/resources/i18n/strings_hi.properties
+++ b/src/main/resources/i18n/strings_hi.properties
@@ -13,8 +13,6 @@ generic.button.done=हो गया
generic.button.next=अगला
generic.button.print=प्रिंट करें
## Error
-generic.error.title=कोई अनपेक्षित त्रुटि हो गई है
-generic.error.instruction=ऐसा नहीं होना चाहिए था। कृपया नीचे त्रुटि पाठ की रिपोर्ट करें और इस त्रुटि के लिए क्या कदम उठाए, इसका विवरण शामिल करें।
# Defaults
defaults.vault.vaultName=गुप्त तिजोरी
@@ -83,13 +81,16 @@ unlock.unlockBtn=अनलॉक करें
migration.title=वाउल्ट को अपग्रेड करें
## Start
## Run
-## Sucess
+## Success
## Missing file system capabilities
## Impossible
# Health Check
+## Start
+## Start Failure
+## Check Selection
## Detail view
-## Checks
+## Fix Application
# Preferences
preferences.title=प्राथमिकताएं
@@ -123,6 +124,7 @@ main.vaultDetail.lockBtn=लॉक करें
### Missing
### Needs Migration
main.vaultDetail.migrateButton=वाउल्ट को अपग्रेड करें
+### Error
# Wrong File Alert
wrongFileAlert.instruction.1=अपना वाउल्ट खोलें।
@@ -132,6 +134,7 @@ wrongFileAlert.link=और मदद के लिए, यह जाएं
## General
vaultOptions.general=सामान्य
vaultOptions.general.vaultName=वॉल्ट का नाम
+
## Mount
vaultOptions.mount=माउंट हो रहा है
vaultOptions.mount.winDriveLetterOccupied=इसका इस्तेमाल किया जा रहा है
@@ -144,7 +147,7 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=कोई खाली जग
## Master Key
vaultOptions.masterkey=पासवर्ड
vaultOptions.masterkey.changePasswordBtn=पासवर्ड बदलें
-## Auto Lock
+
# Recovery Key
diff --git a/src/main/resources/i18n/strings_hr.properties b/src/main/resources/i18n/strings_hr.properties
index 64ead470d..1b7af9c4d 100644
--- a/src/main/resources/i18n/strings_hr.properties
+++ b/src/main/resources/i18n/strings_hr.properties
@@ -37,13 +37,16 @@
# Migration
## Start
## Run
-## Sucess
+## Success
## Missing file system capabilities
## Impossible
# Health Check
+## Start
+## Start Failure
+## Check Selection
## Detail view
-## Checks
+## Fix Application
# Preferences
## General
@@ -67,14 +70,16 @@
### Unlocked
### Missing
### Needs Migration
+### Error
# Wrong File Alert
# Vault Options
## General
+
## Mount
## Master Key
-## Auto Lock
+
# Recovery Key
diff --git a/src/main/resources/i18n/strings_hu.properties b/src/main/resources/i18n/strings_hu.properties
index b49747707..de12a431e 100644
--- a/src/main/resources/i18n/strings_hu.properties
+++ b/src/main/resources/i18n/strings_hu.properties
@@ -13,8 +13,6 @@ generic.button.done=Kész
generic.button.next=Következő
generic.button.print=Nyomtatás
## Error
-generic.error.title=Egy váratlan hiba történt
-generic.error.instruction=Ennek nem lett volna szabad megtörténnie. Kérjük jelezze a hibát az alábbi szöveggel valamint a hiba reprodukálásához szükséges lépésekkel.
# Defaults
defaults.vault.vaultName=Széf
@@ -90,7 +88,6 @@ forgetPassword.information=Eltávolítja a széf mentett jelszavát a rendszere
forgetPassword.confirmBtn=Jelszó elfelejtése
# Unlock
-unlock.title=Széf feloldása
unlock.passwordPrompt=Írja be a jelszavát a következő széfhez "%s":
unlock.unlockBtn=Feloldás
##
@@ -117,7 +114,7 @@ migration.start.confirm=Igen, a széfem teljes mértékben szinkronizálva van
migration.run.enterPassword=Írja be a jelszót a következőhöz Enter the password for "%s"
migration.run.startMigrationBtn=Széf frissítése
migration.run.progressHint=Ez eltarthat egy darabig…
-## Sucess
+## Success
migration.success.nextStepsInstructions=A "%s" sikeresen migrálva. \nMost már feloldhatja a széfet.
migration.success.unlockNow=Azonnali feloldás
## Missing file system capabilities
@@ -133,8 +130,11 @@ migration.impossible.reason=A széfet nem lehet automatikusan frissíteni, mert
migration.impossible.moreInfo=A széf továbbra is megnyitható marad egy régebbi verzióval. A széf kézi frissítésével kapcsolatos utasításokért keresse fel a következő címet:
# Health Check
+## Start
+## Start Failure
+## Check Selection
## Detail view
-## Checks
+## Fix Application
# Preferences
preferences.title=Beállítások
@@ -239,6 +239,7 @@ main.vaultDetail.missing.changeLocation=A széf helyének megváltoztatása…
### Needs Migration
main.vaultDetail.migrateButton=Széf frissítése
main.vaultDetail.migratePrompt=A széfet új formátumra kell frissíteni, mielőtt hozzáférhet
+### Error
# Wrong File Alert
wrongFileAlert.title=Hogyan lehet fájlokat titkosítani
@@ -259,6 +260,7 @@ vaultOptions.general.actionAfterUnlock=Sikeres feloldás után
vaultOptions.general.actionAfterUnlock.ignore=Ne tegyen semmit
vaultOptions.general.actionAfterUnlock.reveal=Jelenítse meg a kötetet
vaultOptions.general.actionAfterUnlock.ask=Kérdez
+
## Mount
vaultOptions.mount=Felcsatolás
vaultOptions.mount.readonly=Csak-olvasható
@@ -274,10 +276,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Válasszon egy üres könyvt
vaultOptions.masterkey=Jelszó
vaultOptions.masterkey.changePasswordBtn=Jelszó megváltoztatása
vaultOptions.masterkey.forgetSavedPasswordBtn=Mentett jelszó törlése
-vaultOptions.masterkey.recoveryKeyExpanation=A helyreállítási kulcs az egyetlen módja annak, hogy visszaállítsa a széfhez való hozzáférést, ha elveíti a jelszavát.
+vaultOptions.masterkey.recoveryKeyExplanation=A helyreállítási kulcs az egyetlen módja annak, hogy visszaállítsa a széfhez való hozzáférést, ha elveíti a jelszavát.
vaultOptions.masterkey.showRecoveryKeyBtn=Visszaállítási kulcs megjelenítése
vaultOptions.masterkey.recoverPasswordBtn=Jelszó visszaállítása
-## Auto Lock
+
# Recovery Key
recoveryKey.title=Visszaállítási kulcs
diff --git a/src/main/resources/i18n/strings_id.properties b/src/main/resources/i18n/strings_id.properties
index d06035538..42ae22ba8 100644
--- a/src/main/resources/i18n/strings_id.properties
+++ b/src/main/resources/i18n/strings_id.properties
@@ -13,8 +13,6 @@ generic.button.done=Selesai
generic.button.next=Lanjut
generic.button.print=Cetak
## Error
-generic.error.title=Telah terjadi kesalahan tak terduga
-generic.error.instruction=Ini harusnya tidak terjadi. Harap laporkan pesan kesalahan dibawah dan tulis deskripsi kenapa ini bisa terjadi.
# Defaults
defaults.vault.vaultName=Brankas
@@ -95,7 +93,6 @@ forgetPassword.information=Kata sandi vault yang tersimpan akan dihapus dari key
forgetPassword.confirmBtn=Lupa Kata Sandi
# Unlock
-unlock.title=Buka Vault
unlock.passwordPrompt=Masukkan kata sandi untuk "%s":
unlock.savePassword=Simpan Kata Sandi
unlock.unlockBtn=Buka Gembok
@@ -130,7 +127,7 @@ migration.start.confirm=Ya, vault saya sepenuhnya tersinkronisasi
migration.run.enterPassword=Masukkan kata sandi untuk "%s"
migration.run.startMigrationBtn=Pindahkan Vault
migration.run.progressHint=Proses ini mungkin akan memakan waktu cukup lama…
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" telah berhasil dipindahkan.\nAnda sekarang dapat membuka vault Anda.
migration.success.unlockNow=Buka Kunci Sekarang
## Missing file system capabilities
@@ -146,27 +143,14 @@ migration.impossible.reason=Vault tidak dapat dipindahkan secara otomatis karena
migration.impossible.moreInfo=Vault dapat dibuka dengan program versi lebih lama. Apabila Anda ingin memindahkan vault secara manual, silahkan buka
# Health Check
-health.title=Pemeriksaan Kesehatan Vault
-health.start.introduction=Pemeriksaan Kesehatan Vault adalah kumpulan pemeriksaan untuk mendeteksi dan mungkin memperbaiki masalah dalam struktur internal brankas Anda. Harap dicatat, bahwa tidak semua masalah dapat diperbaiki. Anda memerlukan kata sandi brankas untuk melakukan pemeriksaan.
-health.start.configValid=Membaca dan mengurai file konfigurasi vault berhasil. Lanjutkan untuk memilih pemeriksaan.
-health.start.configInvalid=Kesalahan saat membaca dan menguraikan file pengaturan vault.
-health.checkList.header=Pemeriksaan Kesehatan yang Tersedia
-health.checkList.selectAllBox=Pilih Semua
+## Start
+## Start Failure
+## Check Selection
health.check.runBatchBtn=Cek Jalankan yang dipilih
## Detail view
health.check.detail.noSelectedCheck=Untuk hasil, pilih pemeriksaan kesehatan yang sudah selesai di sebelah kiri.
-health.check.detail.header=Hasil dari %s
-health.check.detail.taskNotStarted=Cek tidak dipilih untuk dijalankan.
-health.check.detail.taskScheduled=Pemeriksaan Terjadwal.
-health.check.detail.taskRunning=Saat ini pemeriksaan sedang berjalan…
-health.check.detail.taskSucceeded=Pemeriksaan berhasil diselesaikan setelah %d milidetik.
-health.check.detail.taskFailed=Cek keluar karena kesalahan.
-health.check.detail.taskCancelled=Cek dibatalkan.
-health.check.detail.problemCount=Ditemukan %d masalah dan %d kesalahan yang tidak dapat diperbaiki.
health.check.exportBtn=Ekspor Laporan
-health.check.fixBtn=Memperbaiki
-## Checks
-health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Pemeriksaan Direktori
+## Fix Application
# Preferences
preferences.title=Preferensi
@@ -184,10 +168,6 @@ preferences.general.debugLogging=Aktifkan pencatatan debug
preferences.general.debugDirectory=Buka file log
preferences.general.autoStart=Luncurkan Cryptomator pada awal sistem
preferences.general.keychainBackend=Simpan kata sandi dengan
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gantungan Kunci Gnome
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=Dompet KDE
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=akses Kunci Rantai mac-OS
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Perlindungan Data Windows
preferences.general.interfaceOrientation=Orientasi Antarmuka
preferences.general.interfaceOrientation.ltr=Kiri ke kanan
preferences.general.interfaceOrientation.rtl=Kanan ke kiri
@@ -234,6 +214,7 @@ main.vaultDetail.stats=Statistik Vault
### Missing
### Needs Migration
main.vaultDetail.migrateButton=Tingkatkan Vault
+### Error
# Wrong File Alert
@@ -242,11 +223,12 @@ main.vaultDetail.migrateButton=Tingkatkan Vault
vaultOptions.general=Umum
vaultOptions.general.vaultName=Nama Brankas
vaultOptions.general.actionAfterUnlock.reveal=Buka Drive
+
## Mount
vaultOptions.mount.mountPoint.directoryPickerButton=Pilih…
## Master Key
vaultOptions.masterkey.changePasswordBtn=Ubah Kata Sandi
-## Auto Lock
+
# Recovery Key
diff --git a/src/main/resources/i18n/strings_it.properties b/src/main/resources/i18n/strings_it.properties
index 11b544f4a..cb7315f3b 100644
--- a/src/main/resources/i18n/strings_it.properties
+++ b/src/main/resources/i18n/strings_it.properties
@@ -13,20 +13,23 @@ generic.button.done=Fatto
generic.button.next=Avanti
generic.button.print=Stampa
## Error
-generic.error.title=Si è verificato un errore inatteso
-generic.error.instruction=Questo non dovrebbe essere accaduto. Si prega di segnalare il testo dell'errore qui sotto e includere una descrizione delle fasi che hanno portato a questo errore.
+generic.error.title=Errore %s
+generic.error.instruction=Ops! Cryptomator non si aspettava che ciò succedesse. Puoi cercare le soluzioni esistenti per questo errore. O se non è stato ancora segnalato, sentiti libero di farlo.
+generic.error.hyperlink.lookup=Cerca questo errore
+generic.error.hyperlink.report=Segnala questo errore
+generic.error.technicalDetails=Dettagli:
# Defaults
defaults.vault.vaultName=Cassaforte
# Tray Menu
-traymenu.showMainWindow=Visualizza
-traymenu.showPreferencesWindow=Impostazioni
+traymenu.showMainWindow=Mostra
+traymenu.showPreferencesWindow=Preferenze
traymenu.lockAllVaults=Blocca Tutto
traymenu.quitApplication=Esci
traymenu.vault.unlock=Sblocca
traymenu.vault.lock=Blocca
-traymenu.vault.reveal=Mostra
+traymenu.vault.reveal=Rivela
# Add Vault Wizard
addvaultwizard.title=Aggiungi Cassaforte
@@ -35,179 +38,194 @@ addvaultwizard.welcome.newButton=Crea Nuova Cassaforte
addvaultwizard.welcome.existingButton=Apri Cassaforte Esistente
## New
### Name
-addvaultwizard.new.nameInstruction=Scegli un nome per la tua cassaforte
-addvaultwizard.new.namePrompt=Nome Cassaforte
+addvaultwizard.new.nameInstruction=Scegli un nome per la cassaforte
+addvaultwizard.new.namePrompt=Nome della Cassaforte
### Location
-addvaultwizard.new.locationInstruction=Dove dovrebbe memorizzare Cryptomator i file crittografati della tua cassaforte?
-addvaultwizard.new.locationLabel=Posizione archivio
+addvaultwizard.new.locationInstruction=Dove Cryptomator dovrebbe memorizzare i file crittografati della tua cassaforte?
+addvaultwizard.new.locationLabel=Posizione d'archiviazione
addvaultwizard.new.locationPrompt=…
-addvaultwizard.new.directoryPickerLabel=Posizione personalizzata
+addvaultwizard.new.directoryPickerLabel=Posizione Personalizzata
addvaultwizard.new.directoryPickerButton=Scegli…
-addvaultwizard.new.directoryPickerTitle=Seleziona cartella
-addvaultwizard.new.fileAlreadyExists=Un file o una cartella con il nome del vault esiste già
+addvaultwizard.new.directoryPickerTitle=Seleziona la Cartella
+addvaultwizard.new.fileAlreadyExists=Un file o una cartella con il nome della cassaforte esiste già
addvaultwizard.new.locationDoesNotExist=Una cartella nel percorso specificato non esiste o non è accessibile
-addvaultwizard.new.locationIsNotWritable=Non c'è accesso in scrittura nel percorso specificato
-addvaultwizard.new.locationIsOk=Posizione adatta per il tuo vault
-addvaultwizard.new.invalidName=Nome della cassaforte non valido. Si prega di considerare un nome di directory regolare.
+addvaultwizard.new.locationIsNotWritable=Nessun accesso di scrittura al percorso specificato
+addvaultwizard.new.locationIsOk=Posizione idonea per la tua cassaforte
+addvaultwizard.new.invalidName=Nome della cassaforte non valido. Sei pregato di considerare un nome della cartella regolare.
### Password
addvaultwizard.new.createVaultBtn=Crea Cassaforte
-addvaultwizard.new.generateRecoveryKeyChoice=Non sarai in grado di accedere ai tuoi dati senza password. Vuoi una chiave di recupero nel caso in cui perdi la password?
+addvaultwizard.new.generateRecoveryKeyChoice=Non potrai accedere ai tuoi dati senza la tua password. Desideri una chiave di recupero nel caso dovessi perdere la password?
addvaultwizard.new.generateRecoveryKeyChoice.yes=Si, per favore, è meglio essere al sicuro
addvaultwizard.new.generateRecoveryKeyChoice.no=No grazie, non perderò la mia password
### Information
addvault.new.readme.storageLocation.fileName=IMPORTANTE.rtf
-addvault.new.readme.storageLocation.1=⚠ FILE CASSAFORTE ⚠
-addvault.new.readme.storageLocation.2=Questa è la posizione di archiviazione della tua cassaforte.
+addvault.new.readme.storageLocation.1=⚠️ FILE DELLA CASSAFORTE ⚠️
+addvault.new.readme.storageLocation.2=Questa è la posizione d'archiviazione della tua cassaforte.
addvault.new.readme.storageLocation.3=NON
-addvault.new.readme.storageLocation.4=• modificare qualsiasi file in questa cartella o
-addvault.new.readme.storageLocation.5=• Incolla tutti i file da criptare in questa directory.
-addvault.new.readme.storageLocation.6=Se si desidera crittografare i file e visualizzare il contenuto della cassaforte, effettuare le seguenti operazioni:
+addvault.new.readme.storageLocation.4=• alterare alcun file in questa cartella o
+addvault.new.readme.storageLocation.5=• incollare alcun file per la crittografia in questa cartella.
+addvault.new.readme.storageLocation.6=Se vuoi crittografare i file e visualizzare il contenuto della cassaforte, fa quanto segue:
addvault.new.readme.storageLocation.7=1. Aggiungi questa cassaforte a Cryptomator.
-addvault.new.readme.storageLocation.8=2. Sblocca la cassaforte in Criptomator.
-addvault.new.readme.storageLocation.9=3. Apri la posizione di accesso cliccando sul pulsante "Rivela".
-addvault.new.readme.storageLocation.10=Se hai bisogno di aiuto, leggi la documentazione: %s
+addvault.new.readme.storageLocation.8=2. Sblocca la cassaforte su Cryptomator.
+addvault.new.readme.storageLocation.9=3. Apri la posizione d'accesso cliccando sul pulsante "Rivela".
+addvault.new.readme.storageLocation.10=Se ti serve aiuto, visita la documentazione: %s
addvault.new.readme.accessLocation.fileName=BENVENUTO.rtf
-addvault.new.readme.accessLocation.1=🔐 VOLUME CRIPTATO 🔐
-addvault.new.readme.accessLocation.2=Questa è la posizione di accesso della tua cassaforte.
-addvault.new.readme.accessLocation.3=Tutti i file aggiunti a questo volume verranno crittografati da Cryptomator. Puoi lavorare su di esso come su qualsiasi altra unità/cartella. Questa è solo una vista decriptata del suo contenuto, i file rimangono continuamente criptati sul disco rigido.
-addvault.new.readme.accessLocation.4=Sei libero di rimuovere questo file.
+addvault.new.readme.accessLocation.1=🔐 VOLUME CRITTOGRAFATO 🔐
+addvault.new.readme.accessLocation.2=Questa è la posizione d'accesso della tua cassaforte.
+addvault.new.readme.accessLocation.3=Ogni file aggiunto a questo volume sarà crittografato da Cryptomator. Puoi lavorarci come su ogni altra unità/cartella. Questa è solo una vista decrittografata del suo contenuto, i tuoi file restano sempre crittografati sul tuo disco rigido.
+addvault.new.readme.accessLocation.4=Sentiti libero di rimuovere questo file.
## Existing
-addvaultwizard.existing.instruction=Scegliere il file "masterkey.cryptomator" del deposito esistente.
+addvaultwizard.existing.instruction=Scegli il file "masterkey.cryptomator" della tua cassaforte esistente.
addvaultwizard.existing.chooseBtn=Scegli…
-addvaultwizard.existing.filePickerTitle=Seleziona file Masterkey
+addvaultwizard.existing.filePickerTitle=Seleziona il File Masterkey
## Success
-addvaultwizard.success.nextStepsInstructions=Aggiunta cassaforte"%s".\nÈ necessario sbloccare questa cassaforte per accedere o aggiungere contenuti. In alternativa puoi sbloccarla in qualsiasi momento successivo.
-addvaultwizard.success.unlockNow=Sblocca adesso
+addvaultwizard.success.nextStepsInstructions=Cassaforte "%s" aggiunta.\nDevi sbloccare questa cassaforte per accedere o aggiungere contenuti. Altrimenti, puoi sbloccarla in qualsiasi momento successivo.
+addvaultwizard.success.unlockNow=Sblocca Ora
# Remove Vault
removeVault.title=Rimuovi Cassaforte
-removeVault.information=Questo farà dimenticare Cryptomator a questo vault. Puoi aggiungerlo di nuovo in seguito. Nessun file crittografato verrà eliminato dal tuo disco rigido.
+removeVault.information=Questo farà solo dimenticare questa cassaforte a Cryptomator. Puoi aggiungerla nuovamente in seguito. Nessun file crittografato sarà eliminato dal tuo disco rigido.
removeVault.confirmBtn=Rimuovi Cassaforte
# Change Password
-changepassword.title=Modifica password
-changepassword.enterOldPassword=Inserisci la password attuale per "%s"
-changepassword.finalConfirmation=Ho capito che non sarò in grado di accedere ai miei dati se dimentico la mia password
+changepassword.title=Modifica la Password
+changepassword.enterOldPassword=Inserisci la password corrente per "%s"
+changepassword.finalConfirmation=Capisco che non potrò accedere ai miei dati se dimentico la mia password
# Forget Password
-forgetPassword.title=Password dimenticata
-forgetPassword.information=Questo cancellerà la password salvata di questa cassaforte dal tuo portachiavi di sistema.
-forgetPassword.confirmBtn=Password dimenticata
+forgetPassword.title=Dimentica la Password
+forgetPassword.information=Questo eliminerà la password salvata di questa cassaforte dal portachiavi del tuo sistema.
+forgetPassword.confirmBtn=Dimentica Password
# Unlock
-unlock.title=Sblocca Cassaforte
+unlock.title=Sblocca "%s"
unlock.passwordPrompt=Inserisci la password per "%s":
unlock.savePassword=Ricorda la Password
unlock.unlockBtn=Sblocca
##
-unlock.chooseMasterkey.prompt=Impossibile trovare il file masterkey per questa cassaforte nella posizione prevista. Scegliere manualmente il file chiave.
-unlock.chooseMasterkey.filePickerTitle=Seleziona file Masterkey
+unlock.chooseMasterkey.prompt=Impossibile trovare il file Masterkey per questa cassaforte alla sua posizione prevista. Sei pregato di sceglierlo manualmente.
+unlock.chooseMasterkey.filePickerTitle=Seleziona il File Masterkey
## Success
-unlock.success.message="%s" sbloccato con successo! La tua cassaforte è ora accessibile tramite il suo drive virtuale.
-unlock.success.rememberChoice=Ricorda la scelta, non mostrare ancora
-unlock.success.revealBtn=Rivela Drive
+unlock.success.message="%s" sbloccato correttamente! La tua cassaforte è ora accessibile tramite la sua unità virtuale.
+unlock.success.rememberChoice=Ricorda la scelta, non mostrarmelo più
+unlock.success.revealBtn=Rivela l'Unità
## Failure
unlock.error.heading=Impossibile sbloccare la cassaforte
### Invalid Mount Point
-unlock.error.invalidMountPoint.notExisting=Il punto di montaggio non è una directory vuota o non esiste: %s
-unlock.error.invalidMountPoint.existing=Il punto di Mount/cartella esiste già o la cartella superiore è mancante: %s
+unlock.error.invalidMountPoint.notExisting=Il punto di montaggio "%s" non è una cartella, non è vuoto o non esiste.
+unlock.error.invalidMountPoint.existing=Il punto di montaggio "%s" esiste già o la cartella madre è mancante.
# Lock
## Force
lock.forced.heading=Blocco normale fallito
-lock.forced.message=Il bloccaggio di "%s" è stato impedito da operazioni in sospeso o da file aperti. È possibile forzare il blocco di questa cassaforte, tuttavia interrompere I/O potrebbe causare la perdita di dati non salvati.
+lock.forced.message=Il bloccaggio di "%s" è stato impedito dalle operazioni in sospeso o dai file aperti. Puoi forzare il blocco di questa cassaforte, tuttavia, interrompere I/O potrebbe risultare nella perdita dei dati non salvati.
lock.forced.confirmBtn=Forza Blocco
## Failure
-lock.fail.heading=Blocco cassaforte fallito.
-lock.fail.message=Impossibile bloccare la cassaforte "%s". Assicurati che il lavoro non salvato sia salvato ovunque e che le operazioni di Lettura/Scrittura importanti siano concluse. Per chiudere la cassaforte, termina il processo di Cryptomator.
+lock.fail.heading=Blocco della cassaforte fallito.
+lock.fail.message=Impossibile bloccare la cassaforte "%s". Assicurati che il lavoro non salvato sia salvato altrove e che le importanti operazioni di Lettura/Scrittura siano terminate. Per chiudere la cassaforte, termina il processo di Cryptomator.
# Migration
-migration.title=Aggiorna Cassaforte
+migration.title=Aggiorna la Cassaforte
## Start
-migration.start.prompt=La tua cassaforte "%s" deve essere aggiornata a un formato più recente. Prima di procedere, assicurati che non ci sia nessuna sincronizzazione in sospeso che influisca su questa cassaforte.
+migration.start.prompt=La tua cassaforte "%s" dev'esser aggiornata a un formato più recente. Prima di procedere, assicurati che non ci sia alcuna sincronizzazione in sospeso relativa a questa cassaforte.
migration.start.confirm=Sì, la mia cassaforte è completamente sincronizzata
## Run
-migration.run.enterPassword=Immettere la password per "%s"
-migration.run.startMigrationBtn=Migra Cassaforte
-migration.run.progressHint=Potrebbe richiedere un po' di tempo…
-## Sucess
-migration.success.nextStepsInstructions=Migrato "%s" con successo.\nOra puoi sbloccare la tua cassaforte.
-migration.success.unlockNow=Sblocca adesso
+migration.run.enterPassword=Inserisci la password per "%s"
+migration.run.startMigrationBtn=Migra la Cassaforte
+migration.run.progressHint=Questo potrebbe richiedere un po' di tempo…
+## Success
+migration.success.nextStepsInstructions="%s" migrata con successo.\nPuoi ora sbloccare la tua cassaforte.
+migration.success.unlockNow=Sblocca Ora
## Missing file system capabilities
-migration.error.missingFileSystemCapabilities.title=File System non supportato
-migration.error.missingFileSystemCapabilities.description=La migrazione non è stata avviata perché la cassaforte è situata su un file system inadeguato.
-migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Il file system non supporta nomi di file lunghi.
-migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Il file system non supporta percorsi lunghi.
-migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Il file system non consente di essere letto.
-migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Il file system non consente di essere scritto.
+migration.error.missingFileSystemCapabilities.title=File di Sistema Non Supportato
+migration.error.missingFileSystemCapabilities.description=Migrazione non avviata perché la tua cassaforte si trova su un file di sistema inadeguato.
+migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Il file di sistema non supporta i nomi dei file lunghi.
+migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Il file di sistema non supporta i percorsi lunghi.
+migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Il file di sistema non consente di esser letto.
+migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Il file di sistema non consente di esser scritto.
## Impossible
migration.impossible.heading=Impossibile migrare la cassaforte
-migration.impossible.reason=La cassaforte non può essere migrata automaticamente perché la sua posizione di archiviazione di accesso non è compatibile.
-migration.impossible.moreInfo=La cassaforte può ancora essere aperta con una versione precedente. Per istruzioni su come migrare manualmente una cassaforte, visita
+migration.impossible.reason=Impossibile migrare automaticamente la cassaforte perché la sua posizione d'archiviazione o punto d'accesso non sono compatibili.
+migration.impossible.moreInfo=La cassaforte è ancora apribile con una versione precedente. Per le istruzioni su come migrare manualmente una cassaforte, visita
# Health Check
-health.title=Controllo Salute Cassaforte
-health.start.introduction=Il Controllo di Salute della Cassaforte è una raccolta di controlli per rilevare e possibilmente risolvere i problemi nella struttura interna della tua cassaforte. Sei pregato di notare che non tutti i problemi sono risolvibili. Ti serve la password della cassaforte per eseguire i controlli.
-health.start.configValid=La lettura e l'analisi del file di configurazione è riuscita. Procedi per selezionare i controlli.
-health.start.configInvalid=Errore leggendo e analizzando il file di configurazione della cassaforte.
-health.checkList.header=Controlli di Salute Disponibili
-health.checkList.selectAllBox=Seleziona Tutto
-health.check.runBatchBtn=Esegui i Controlli selezionati
+## Start
+health.title=Controllo Salute di "%s"
+health.intro.header=Controllo Salute
+health.intro.text=Il Controllo della Salute è una raccolta di controlli per rilevare e possibilmente risolvere i problemi nella struttura interna alla tua cassaforte. Sei pregato di tenere a mente:
+health.intro.remarkSync=Assicurati che tutti i dispositivi siano completamente sincronizzati, questo risolve gran parte dei problemi.
+health.intro.remarkFix=Non tutti i problemi sono risolvibili.
+health.intro.remarkBackup=Se i dati sono corrotti, solo un backup può aiutare.
+health.intro.affirmation=Ho letto e compreso le informazioni suddette
+## Start Failure
+health.fail.header=Errore caricando la Configurazione della Cassaforte
+health.fail.ioError=Si è verificato un errore accedendo e leggendo il file di configurazione.
+health.fail.parseError=Si è verificato un errore analizzando la configurazione della cassaforte.
+health.fail.moreInfo=Altre Info
+## Check Selection
+health.checkList.description=Seleziona i controlli nell'elenco a sinistra o usa i seguenti pulsanti.
+health.checkList.selectAllButton=Seleziona Tutti i Controlli
+health.checkList.deselectAllButton=Deseleziona Tutti i Controlli
+health.check.runBatchBtn=Esegui i Controlli Selezionati
## Detail view
-health.check.detail.noSelectedCheck=Per i risultati seleziona un controllo di salute concluso nell'elenco a sinistra.
-health.check.detail.header=Risultati di %s
-health.check.detail.taskNotStarted=Il controllo non è stato selezionato per l'esecuzione.
-health.check.detail.taskScheduled=Il controllo è pianificato.
-health.check.detail.taskRunning=Il controllo è correntemente in esecuzione…
-## Checks
+health.check.detail.noSelectedCheck=Per i risultati seleziona un controllo di salute terminato nell'elenco a sinistra.
+health.check.detail.checkScheduled=Il controllo è pianificato.
+health.check.detail.checkRunning=Il controllo è correntemente in esecuzione…
+health.check.detail.checkSkipped=Il controllo non è stato selezionato per l'esecuzione.
+health.check.detail.checkFinished=Il controllo è terminato correttamente.
+health.check.detail.checkFinishedAndFound=Il controllo è terminato. Sei pregato di revisionare i risultati.
+health.check.detail.checkFailed=Il controllo è terminato a causa di un errore.
+health.check.detail.checkCancelled=Il controllo è stato annullato.
+health.check.exportBtn=Esporta il Rapporto
+## Fix Application
+health.fix.fixBtn=Correggi
+health.fix.successTip=Correzione riuscita
+health.fix.failTip=Correzione fallita, vedi i registri per i dettagli
# Preferences
-preferences.title=Impostazioni
+preferences.title=Preferenze
## General
-preferences.general=Generali
+preferences.general=Generale
preferences.general.theme=Aspetto
preferences.general.theme.automatic=Automatico
preferences.general.theme.light=Chiaro
preferences.general.theme.dark=Scuro
-preferences.general.unlockThemes=Sblocca modalità scura
-preferences.general.showMinimizeButton=Mostra pulsante riduci a icona
-preferences.general.showTrayIcon=Mostra icona nel tray (richiede riavvio)
-preferences.general.startHidden=Nascondi la finestra all'avvio di Cryptomator
-preferences.general.debugLogging=Abilita i registri di debug
-preferences.general.debugDirectory=Mostra file log
+preferences.general.unlockThemes=Sblocca la modalità scura
+preferences.general.showMinimizeButton=Mostra il pulsante minimizza
+preferences.general.showTrayIcon=Mostra l'icona della barra d'applicazioni (richiede il riavvio)
+preferences.general.startHidden=Nascondi la finestra avviando Cryptomator
+preferences.general.debugLogging=Abilita la registrazione di debug
+preferences.general.debugDirectory=Rivela i file di registro
preferences.general.autoStart=Avvia Cryptomator all'avvio del sistema
-preferences.general.keychainBackend=Memorizza password con
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Portachiavi Gnome
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=Portafoglio KDE
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=accesso portachiavi macOS
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Protezione Dati Di Windows
-preferences.general.interfaceOrientation=Orientamento Interfaccia
+preferences.general.keychainBackend=Memorizza le password con
+preferences.general.interfaceOrientation=Orientamento dell'Interfaccia
preferences.general.interfaceOrientation.ltr=Da Sinistra a Destra
preferences.general.interfaceOrientation.rtl=Da Destra a Sinistra
## Volume
-preferences.volume=Drive virtuale
-preferences.volume.type=Tipo volume
+preferences.volume=Unità Virtuale
+preferences.volume.type=Tipo di Volume
preferences.volume.webdav.port=Porta WebDAV
preferences.volume.webdav.scheme=Schema WebDAV
## Updates
preferences.updates=Aggiornamenti
-preferences.updates.currentVersion=Versione attuale %s
-preferences.updates.autoUpdateCheck=Controlla automaticamente la presenza di aggiornamenti
-preferences.updates.checkNowBtn=Controlla adesso
-preferences.updates.updateAvailable=Disponibile aggiornamento alla versione %s.
+preferences.updates.currentVersion=Versione Corrente: %s
+preferences.updates.autoUpdateCheck=Cerca automaticamente gli aggiornamenti
+preferences.updates.checkNowBtn=Controlla Ora
+preferences.updates.updateAvailable=Aggiornamento alla versione %s disponibile.
## Contribution
preferences.contribute=Supportaci
-preferences.contribute.registeredFor=Certificato del supporto registrato per %s
-preferences.contribute.noCertificate=Supporta Cryptomator e ricevi un certificato di supporter. È come una chiave di licenza, ma per persone fantastiche che utilizzano software libero. ;-)
-preferences.contribute.getCertificate=Non ne hai già uno? Impara come puoi ottenerlo.
-preferences.contribute.promptText=Incolla qui il codice del certificato di supporter
+preferences.contribute.registeredFor=Certificato del sostenitore registrato per %s
+preferences.contribute.noCertificate=Supporta Cryptomator e ricevi il certificato da sostenitore. È come una chiave di licenza me per persone fantastiche che usano un software gratuito. ;-)
+preferences.contribute.getCertificate=Non ne hai ancora uno? Scopri come puoi ottenerlo.
+preferences.contribute.promptText=Incolla qui il codice del certificato da sostenitore
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
-preferences.about=Informazioni
+preferences.about=Info
# Vault Statistics
stats.title=Statistiche per %s
+stats.cacheHitRate=Frequenza di Raggiungimento della Cache
## Read
stats.read.throughput.idle=Lettura: inattivo
stats.read.throughput.kibs=Lettura: %.2f kiB/s
@@ -216,13 +234,13 @@ stats.read.total.data.none=Dati letti: -
stats.read.total.data.kib=Dati letti: %.1f kiB
stats.read.total.data.mib=Dati letti: %.1f MiB
stats.read.total.data.gib=Dati letti: %.1f GiB
-stats.decr.total.data.none=Dati decriptati: -
+stats.decr.total.data.none=Dati decrittografati: -
stats.decr.total.data.kib=Dati decrittografati: %.1f kiB
-stats.decr.total.data.mib=Dati decriptati: %.1f MiB
+stats.decr.total.data.mib=Dati decrittografati: %.1f MiB
stats.decr.total.data.gib=Dati decrittografati: %.1f GiB
-stats.read.accessCount=Totale lettura: %d
+stats.read.accessCount=Letture totali: %d
## Write
-stats.write.throughput.idle=Scrivi: inattivo
+stats.write.throughput.idle=Scrittura: inattivo
stats.write.throughput.kibs=Scrittura: %.2f kiB/s
stats.write.throughput.mibs=Scrittura: %.2f MiB/s
stats.write.total.data.none=Dati scritti: -
@@ -233,81 +251,89 @@ stats.encr.total.data.none=Dati crittografati: -
stats.encr.total.data.kib=Dati crittografati: %.1f kiB
stats.encr.total.data.mib=Dati crittografati: %.1f MiB
stats.encr.total.data.gib=Dati crittografati: %.1f GiB
-stats.write.accessCount=Totale scritture: %d
+stats.write.accessCount=Scritture totali: %d
# Main Window
main.closeBtn.tooltip=Chiudi
main.minimizeBtn.tooltip=Minimizza
-main.preferencesBtn.tooltip=Impostazioni
+main.preferencesBtn.tooltip=Preferenze
main.debugModeEnabled.tooltip=La modalità di debug è abilitata
-main.donationKeyMissing.tooltip=Per favore considera una donazione
+main.donationKeyMissing.tooltip=Sei pregato di considerare di donare
## Drag 'n' Drop
main.dropZone.dropVault=Aggiungi questa cassaforte
-main.dropZone.unknownDragboardContent=Se vuoi aggiungere una cassaforte, trascinala in questa finestra
+main.dropZone.unknownDragboardContent=Se desideri aggiungere una cassaforte, trascinala a questa finestra
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Clicca qui per aggiungere una cassaforte
main.vaultlist.contextMenu.remove=Rimuovi…
main.vaultlist.contextMenu.lock=Blocca
main.vaultlist.contextMenu.unlock=Sblocca…
main.vaultlist.contextMenu.unlockNow=Sblocca Ora
-main.vaultlist.contextMenu.vaultoptions=Mostra Opzioni Cassaforte
-main.vaultlist.contextMenu.reveal=Rivela Drive
+main.vaultlist.contextMenu.vaultoptions=Mostra le Opzioni della Cassaforte
+main.vaultlist.contextMenu.reveal=Rivela Unità
main.vaultlist.addVaultBtn=Aggiungi Cassaforte
## Vault Detail
### Welcome
-main.vaultDetail.welcomeOnboarding=Grazie per aver scelto Cryptomator per proteggere i tuoi file. Se hai bisogno di assistenza, dai un'occhiata alle guide per iniziare:
+main.vaultDetail.welcomeOnboarding=Grazie per aver scelto Cryptomator per proteggere i tuoi file. Se necessiti d'assistenza, dai un'occhiata alle nostre guide per iniziare:
### Locked
main.vaultDetail.lockedStatus=BLOCCATO
main.vaultDetail.unlockBtn=Sblocca…
-main.vaultDetail.unlockNowBtn=Sblocca adesso
-main.vaultDetail.optionsBtn=Opzioni Cassaforte
+main.vaultDetail.unlockNowBtn=Sblocca Ora
+main.vaultDetail.optionsBtn=Opzioni della Cassaforte
main.vaultDetail.passwordSavedInKeychain=Password salvata
### Unlocked
-main.vaultDetail.unlockedStatus=SBLOCCATO
+main.vaultDetail.unlockedStatus=SBLOCCATA
main.vaultDetail.accessLocation=I contenuti della tua cassaforte sono accessibili qui:
-main.vaultDetail.revealBtn=Visualizza disco
+main.vaultDetail.revealBtn=Rivela Unità
main.vaultDetail.lockBtn=Blocca
main.vaultDetail.bytesPerSecondRead=Lettura:
main.vaultDetail.bytesPerSecondWritten=Scrittura:
main.vaultDetail.throughput.idle=inattivo
main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
-main.vaultDetail.stats=Statistiche Cassaforte
+main.vaultDetail.stats=Statistiche della Cassaforte
### Missing
-main.vaultDetail.missing.info=Cryptomator non ha potuto trovare una cassaforte in questo percorso.
-main.vaultDetail.missing.recheck=Ricontrollare
-main.vaultDetail.missing.remove=Rimuovi dalla Lista Cassaforte…
-main.vaultDetail.missing.changeLocation=Cambia posizione della Cassaforte…
+main.vaultDetail.missing.info=Cryptomator non è riuscito a trovare una cassaforte in questo percorso.
+main.vaultDetail.missing.recheck=Ricontrolla
+main.vaultDetail.missing.remove=Rimuovi dall'Elenco di Cassaforti…
+main.vaultDetail.missing.changeLocation=Cambia la Posizione della Cassaforte…
### Needs Migration
-main.vaultDetail.migrateButton=Aggiorna la cassaforte
-main.vaultDetail.migratePrompt=Prima di potervi accedere la tua cassaforte deve essere aggiornata al nuovo formato
+main.vaultDetail.migrateButton=Aggiorna la Cassaforte
+main.vaultDetail.migratePrompt=La tua cassaforte dev'esser aggiornata a un nuovo formato, prima di potervi accedere
+### Error
+main.vaultDetail.error.info=Si è verificato un errore durante il caricamento della cassaforte dal disco.
+main.vaultDetail.error.reload=Ricarica
+main.vaultDetail.error.windowTitle=Errore nel caricare la cassaforte
# Wrong File Alert
-wrongFileAlert.title=Come Criptare i File
-wrongFileAlert.header.title=Hai provato a cifrare questi file?
-wrongFileAlert.header.lead=A questo scopo, Cryptomator fornisce un volume nel file manager di sistema.
-wrongFileAlert.instruction.0=Per cifrare file, segui questi passi:
+wrongFileAlert.title=Come Crittografare i File
+wrongFileAlert.header.title=Hai tentato di crittografare questi file?
+wrongFileAlert.header.lead=Per questo scopo, Cryptomator fornisce un volume nel gestore dei tuoi file di sistema.
+wrongFileAlert.instruction.0=Per crittografare i file, segui questi passi:
wrongFileAlert.instruction.1=1. Sblocca la tua cassaforte.
-wrongFileAlert.instruction.2=2. Clicca su "Rivela" per aprire il volume nel tuo file manager.
+wrongFileAlert.instruction.2=2. Clicca su "Rivela" per aprire il volume nel gestore dei tuoi file.
wrongFileAlert.instruction.3=3. Aggiungi i tuoi file a questo volume.
wrongFileAlert.link=Per ulteriore assistenza, visita
# Vault Options
## General
-vaultOptions.general=Generali
-vaultOptions.general.vaultName=Nome Cassaforte
-vaultOptions.general.unlockAfterStartup=Sblocca vault all'avvio di Cryptomator
-vaultOptions.general.actionAfterUnlock=Dopo aver sbloccato con successo
+vaultOptions.general=Generale
+vaultOptions.general.vaultName=Nome della Cassaforte
+vaultOptions.general.autoLock.lockAfterTimePart1=Blocca quando inattivo per
+vaultOptions.general.autoLock.lockAfterTimePart2=minuti
+vaultOptions.general.unlockAfterStartup=Sblocca la cassaforte all'avvio di Cryptomator
+vaultOptions.general.actionAfterUnlock=Dopo uno sblocco riuscito
vaultOptions.general.actionAfterUnlock.ignore=Non fare nulla
-vaultOptions.general.actionAfterUnlock.reveal=Visualizza disco
+vaultOptions.general.actionAfterUnlock.reveal=Rivela Unità
vaultOptions.general.actionAfterUnlock.ask=Chiedi
+vaultOptions.general.startHealthCheckBtn=Avvia il Controllo della Salute
+
## Mount
vaultOptions.mount=Montaggio
-vaultOptions.mount.readonly=Sola lettura
-vaultOptions.mount.customMountFlags=Opzioni personalizzate
+vaultOptions.mount.readonly=Sola Lettura
+vaultOptions.mount.customMountFlags=Flag di Montaggio Personalizzati
vaultOptions.mount.winDriveLetterOccupied=occupato
-vaultOptions.mount.mountPoint=Punto di mount
-vaultOptions.mount.mountPoint.auto=Scegli automaticamente una posizione adatta
+vaultOptions.mount.mountPoint=Punto di Montaggio
+vaultOptions.mount.mountPoint.auto=Scegli automaticamente una posizione idonea
vaultOptions.mount.mountPoint.driveLetter=Usa la lettera del drive assegnata
vaultOptions.mount.mountPoint.custom=Percorso personalizzato
vaultOptions.mount.mountPoint.directoryPickerButton=Scegli…
@@ -316,10 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Scegli una directory vuota
vaultOptions.masterkey=Password
vaultOptions.masterkey.changePasswordBtn=Modifica password
vaultOptions.masterkey.forgetSavedPasswordBtn=Dimentica Password Salvata
-vaultOptions.masterkey.recoveryKeyExpanation=Una chiave di recupero è il tuo unico mezzo per ripristinare l'accesso a una cassaforte se perdi la tua password.
+vaultOptions.masterkey.recoveryKeyExplanation=Una chiave di recupero è il tuo unico mezzo per ripristinare l'accesso a una cassaforte se perdi la tua password.
vaultOptions.masterkey.showRecoveryKeyBtn=Visualizza la chiave di recupero
vaultOptions.masterkey.recoverPasswordBtn=Recupera password
-## Auto Lock
+
# Recovery Key
recoveryKey.title=Chiave di recupero
diff --git a/src/main/resources/i18n/strings_ja.properties b/src/main/resources/i18n/strings_ja.properties
index b33491403..c43cfa308 100644
--- a/src/main/resources/i18n/strings_ja.properties
+++ b/src/main/resources/i18n/strings_ja.properties
@@ -13,8 +13,11 @@ generic.button.done=完了
generic.button.next=次へ
generic.button.print=印刷
## Error
-generic.error.title=予期しないエラーが発生しました
-generic.error.instruction=予期しないことが発生しました。下部のエラーテキストとエラーに至った経緯の説明を報告していただけると幸いです。
+generic.error.title=エラー %s
+generic.error.instruction=Cryptomator で予期できない問題が発生しました! 。このエラーの解決方法を検索することができ、まだ報告されていない場合は、報告を行うことができます。
+generic.error.hyperlink.lookup=このエラーを検索する
+generic.error.hyperlink.report=このエラーを報告する
+generic.error.technicalDetails=詳細:
# Defaults
defaults.vault.vaultName=金庫
@@ -32,7 +35,7 @@ traymenu.vault.reveal=表示
addvaultwizard.title=金庫を追加
## Welcome
addvaultwizard.welcome.newButton=新しい金庫を作成
-addvaultwizard.welcome.existingButton=既存の金庫を開く
+addvaultwizard.welcome.existingButton=すでにある金庫を開く
## New
### Name
addvaultwizard.new.nameInstruction=金庫の名前を入力してください
@@ -95,7 +98,7 @@ forgetPassword.information=システムから金庫の保存済みパスワー
forgetPassword.confirmBtn=パスワードを削除
# Unlock
-unlock.title=金庫を解錠
+unlock.title="%s" を解錠
unlock.passwordPrompt="%s" のパスワードを入力してください:
unlock.savePassword=パスワードを記憶させる
unlock.unlockBtn=解錠
@@ -130,24 +133,54 @@ migration.start.confirm=はい。同期が完了しています
migration.run.enterPassword="%s" のパスワードを入力してください
migration.run.startMigrationBtn=金庫を移行
migration.run.progressHint=時間がかかる場合があります...
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" の移行が成功しました。\n金庫を解錠できるようになりました。
migration.success.unlockNow=今すぐ解錠
## Missing file system capabilities
-migration.error.missingFileSystemCapabilities.title=サポートされないファイルタイプ
-migration.error.missingFileSystemCapabilities.description=金庫が不適切なファイルシステムにあるため、移行が開始されませんでした。
-migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=ファイルシステムが長いファイル名をサポートしていません。
-migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=ファイルシステムが長いパスをサポートしていません。
-migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=ファイルシステムによって読み込みが許可されていません。
-migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=ファイルシステムによって書き込みが許可されていません。
+migration.error.missingFileSystemCapabilities.title=サポートされないファイル システム
+migration.error.missingFileSystemCapabilities.description=金庫が不適切なファイル システムにあるため、移行が開始されませんでした。
+migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=ファイル システムが長いファイル名をサポートしていません。
+migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=ファイル システムが長いパスをサポートしていません。
+migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=ファイル システムによって読み込みが許可されていません。
+migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=ファイル システムによって書き込みが許可されていません。
## Impossible
migration.impossible.heading=金庫の移行に失敗しました
migration.impossible.reason=ストレージ場所またはアクセスポイントに互換性がないため、金庫を自動的に移行できません。
migration.impossible.moreInfo=金庫を古いバージョンで開くことは可能です。手動による金庫の移行方法については次をご覧ください:
# Health Check
+## Start
+health.title="%s" の正常性チェック
+health.intro.header=正常性チェック
+health.intro.text=正常性チェックは、金庫内部で修復できる可能性のある問題を収集します。次の点に注意してください:
+health.intro.remarkSync=すべてのデバイスが完全に同期されていることを確認してください。これによってほとんどの問題は解決します。
+health.intro.remarkFix=すべての問題を修復できるわけではありません。
+health.intro.remarkBackup=データが破損しているときは、バックアップからのみ可能です。
+health.intro.affirmation=上記の情報を理解しました。
+## Start Failure
+health.fail.header=金庫の構成を読み込み中にエラーが発生しました
+health.fail.ioError=設定ファイルへのアクセスと読み込み中にエラーが発生しました。
+health.fail.parseError=金庫の構成を解析中にエラーが発生しました。
+health.fail.moreInfo=詳細
+## Check Selection
+health.checkList.description=左のリストを使用してチェックを選択するか、下のボタンで選択してください。
+health.checkList.selectAllButton=すべてのチェックを選択
+health.checkList.deselectAllButton=すべてのチェックを解除
+health.check.runBatchBtn=選択したチェックを実行
## Detail view
-## Checks
+health.check.detail.noSelectedCheck=左のリストを選択して終了した正常性チェックの結果を確認できます。
+health.check.detail.checkScheduled=チェックが予定されています。
+health.check.detail.checkRunning=チェック中です...
+health.check.detail.checkSkipped=実行するチェックが選択されていません。
+health.check.detail.checkFinished=チェックが正常に終了しました。
+health.check.detail.checkFinishedAndFound=実行中のチェックが終了しました。結果を確認してください。
+health.check.detail.checkFailed=エラーが発生したためチェックを終了しました。
+health.check.detail.checkCancelled=チェックがキャンセルされました。
+health.check.exportBtn=結果をエクスポート
+## Fix Application
+health.fix.fixBtn=修正
+health.fix.successTip=正常に修正されました
+health.fix.failTip=修正に失敗しました。詳細はログを参照してください。
# Preferences
preferences.title=設定
@@ -165,10 +198,6 @@ preferences.general.debugLogging=ログを有効にする
preferences.general.debugDirectory=ログ ファイルを表示
preferences.general.autoStart=システム開始時にCryptomatorを起動する
preferences.general.keychainBackend=次を利用してパスワードを保存する
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS のキーチェーンアクセス
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows のデータ保護
preferences.general.interfaceOrientation=インターフェイスの向き
preferences.general.interfaceOrientation.ltr=左から右
preferences.general.interfaceOrientation.rtl=右から左
@@ -187,7 +216,7 @@ preferences.updates.updateAvailable=利用可能なバージョン %s に更新
preferences.contribute=サポートする
preferences.contribute.registeredFor=サポーター証明書が %s に登録されました
preferences.contribute.noCertificate=Cryptomator を支援し、サポーター証明書を受け取りましょう。ライセンスキーに似ていますがフリーソフトを使う寄付者向けのキーです。 ;-)
-preferences.contribute.getCertificate=まだ証明書を手に入れていませんか? 詳細を確認しましょう。
+preferences.contribute.getCertificate=まだ証明書を手に入れていませんか? 詳細はこちらから確認できます。
preferences.contribute.promptText=サポーター証明書をここに張り付けてください
#<-- Add entries for donations and code/translation/documentation contribution -->
@@ -253,7 +282,7 @@ main.vaultDetail.optionsBtn=金庫のオプション
main.vaultDetail.passwordSavedInKeychain=パスワードを保存しました
### Unlocked
main.vaultDetail.unlockedStatus=解錠済み
-main.vaultDetail.accessLocation=アクセス可能な金庫のコンテンツ:
+main.vaultDetail.accessLocation=金庫の内容はこちらからアクセスできます:
main.vaultDetail.revealBtn=ドライブを表示
main.vaultDetail.lockBtn=施錠
main.vaultDetail.bytesPerSecondRead=読み取り:
@@ -261,7 +290,7 @@ main.vaultDetail.bytesPerSecondWritten=書き込み:
main.vaultDetail.throughput.idle=アイドル
main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
-main.vaultDetail.stats=保管庫の統計情報
+main.vaultDetail.stats=金庫の統計情報
### Missing
main.vaultDetail.missing.info=Cryptomator はこのパスの金庫を見つけることができませんでした。
main.vaultDetail.missing.recheck=再確認
@@ -270,6 +299,10 @@ main.vaultDetail.missing.changeLocation=金庫の場所を変更...
### Needs Migration
main.vaultDetail.migrateButton=金庫をアップグレード
main.vaultDetail.migratePrompt=金庫にアクセスする前に、 金庫を新しい形式にアップグレードする必要があります
+### Error
+main.vaultDetail.error.info=ディスクから金庫の読み込み中にエラーが発生しました。
+main.vaultDetail.error.reload=再読み込み
+main.vaultDetail.error.windowTitle=金庫の読み込みエラー
# Wrong File Alert
wrongFileAlert.title=ファイルを暗号化するには
@@ -285,11 +318,15 @@ wrongFileAlert.link=より詳細な手順については、次のページをご
## General
vaultOptions.general=基本設定
vaultOptions.general.vaultName=金庫の名前
+vaultOptions.general.autoLock.lockAfterTimePart1=アイドル時に施錠する
+vaultOptions.general.autoLock.lockAfterTimePart2=分
vaultOptions.general.unlockAfterStartup=Cryptomatorの起動時に金庫を解錠する
vaultOptions.general.actionAfterUnlock=解錠に成功したあと
vaultOptions.general.actionAfterUnlock.ignore=何もしない
vaultOptions.general.actionAfterUnlock.reveal=ドライブを表示
vaultOptions.general.actionAfterUnlock.ask=尋ねる
+vaultOptions.general.startHealthCheckBtn=正常性チェックを開始
+
## Mount
vaultOptions.mount=マウント
vaultOptions.mount.readonly=読み取り専用
@@ -305,10 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=空のディレクトリを
vaultOptions.masterkey=パスワード
vaultOptions.masterkey.changePasswordBtn=パスワードの変更
vaultOptions.masterkey.forgetSavedPasswordBtn=保存したパスワードを削除する
-vaultOptions.masterkey.recoveryKeyExpanation=回復キーはパスワードを忘れてしまった場合でも、金庫へのアクセスを回復する唯一の手段です。
+vaultOptions.masterkey.recoveryKeyExplanation=回復キーはパスワードを忘れてしまった場合でも、金庫へのアクセスを回復する唯一の手段です。
vaultOptions.masterkey.showRecoveryKeyBtn=回復キーを表示
vaultOptions.masterkey.recoverPasswordBtn=パスワードの回復
-## Auto Lock
+
# Recovery Key
recoveryKey.title=回復キー
diff --git a/src/main/resources/i18n/strings_ko.properties b/src/main/resources/i18n/strings_ko.properties
index 8580594af..31e2316ed 100644
--- a/src/main/resources/i18n/strings_ko.properties
+++ b/src/main/resources/i18n/strings_ko.properties
@@ -3,7 +3,7 @@
# Generics
## Button
generic.button.apply=적용
-generic.button.back=뒤로
+generic.button.back=이전
generic.button.cancel=취소
generic.button.change=변경
generic.button.close=닫기
@@ -13,8 +13,9 @@ generic.button.done=완료
generic.button.next=다음
generic.button.print=인쇄
## Error
-generic.error.title=예기치 않은 오류가 발생되었습니다.
-generic.error.instruction=이러한 일은 일어나지 말아야 합니다. 아래의 텍스트와 이 오류를 발생시킨 단계에 대한 설명을 포함하여 제출하여 주십시요.
+generic.error.title=에러 %s
+generic.error.hyperlink.report=에러 보고하기
+generic.error.technicalDetails=세부정보:
# Defaults
defaults.vault.vaultName=Vault
@@ -95,7 +96,7 @@ forgetPassword.information=시스템 키체인에서 이 Vault의 저장된 비
forgetPassword.confirmBtn=비밀번호 분실
# Unlock
-unlock.title=Vault 잠금해제
+unlock.title="%s" 잠금 해제
unlock.passwordPrompt="%s"의 비밀번호를 입력하십시요.
unlock.savePassword=비밀번호 기억
unlock.unlockBtn=잠금해제
@@ -130,7 +131,7 @@ migration.start.confirm=네, 이 Vault는 동기화가 완전히 된 상태입
migration.run.enterPassword="%s"의 비밀번호를 입력하십시요.
migration.run.startMigrationBtn=Vault 마이그레이션
migration.run.progressHint=이 작업은 시간이 조금 소요됩니다.
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" 의 마이그레이션이 성공적으로 완료되었습니다. 이제 Vault를 잠금해제할 수 있습니다.
migration.success.unlockNow=지금 잠금해제
## Missing file system capabilities
@@ -146,8 +147,32 @@ migration.impossible.reason=저장소 위치 또는 접근 지점이 호환되
migration.impossible.moreInfo=Vault를 이전 버전으로 계속 열수 있습니다. Vault를 직접 마이그레이션 하는 설명을 보시려면, 다음을 방문하십시요.
# Health Check
+## Start
+health.title="%s"의 상태 검사
+health.intro.header=상태 검사
+health.intro.text=상태 검사는 Vault의 내부 구조의 문제점을 점검하고 해결할 수 있는 기능입니다. 다음 사항을 유의하시기 바랍니다:
+health.intro.remarkBackup=데이터가 손상된 경우 백업만이 유일한 해결책입니다.
+health.intro.affirmation=나는 위 정보를 읽고 정말 이해했습니다.
+## Start Failure
+health.fail.header=Vault 설정을 불러오는 중 에러 발생
+health.fail.ioError=설정 파일에 접근하는 중 에러가 발생했습니다.
+health.fail.parseError=Vault 설정을 파싱하는 중 에러가 발생했습니다.
+health.fail.moreInfo=더 많은 정보
+## Check Selection
+health.checkList.selectAllButton=모든 항목 선택
+health.checkList.deselectAllButton=모든 항목 선택 해제
+health.check.runBatchBtn=선택된 검사항목 실행
## Detail view
-## Checks
+health.check.detail.noSelectedCheck=결과를 보려면 왼쪽 목록에서 완료된 상태 검사항목을 선택하십시오.
+health.check.detail.checkScheduled=검사가 예약되었습니다.
+health.check.detail.checkRunning=검사가 현재 실행중입니다...
+health.check.detail.checkSkipped=선택된 검사항목이 없습니다.
+health.check.detail.checkFinished=검사가 성공적으로 완료되었습니다.
+health.check.exportBtn=보고서 내보내기
+## Fix Application
+health.fix.fixBtn=문제해결
+health.fix.successTip=문제 해결이 성공적으로 완료되었습니다
+health.fix.failTip=문제 해결 실패, 상세 정보는 로그를 참조하십시요.
# Preferences
preferences.title=환경설정
@@ -165,10 +190,6 @@ preferences.general.debugLogging=디버그 로그기록을 사용하도록 설
preferences.general.debugDirectory=Log 파일 표시
preferences.general.autoStart=시스템 시작 시 Cryptomator 실행
preferences.general.keychainBackend=다음 경로에 비밀번호 저장
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS 키체인 엑세스
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=윈도우 데이터 보호
preferences.general.interfaceOrientation=인터페이스 방향
preferences.general.interfaceOrientation.ltr=왼쪽에서 오른쪽으로
preferences.general.interfaceOrientation.rtl=오른쪽에서 왼쪽으로
@@ -270,6 +291,7 @@ main.vaultDetail.missing.changeLocation=Vault 위치 변경
### Needs Migration
main.vaultDetail.migrateButton=Vault 업그레이드
main.vaultDetail.migratePrompt=Vault에 접근하기 전, 새로운 포멧으로 업그레이드가 필요합니다.
+### Error
# Wrong File Alert
wrongFileAlert.title=파일 암호화 방법
@@ -285,11 +307,15 @@ wrongFileAlert.link=추후 지원을 위해, 다음을 방문하십시요
## General
vaultOptions.general=일반
vaultOptions.general.vaultName=Vault 이름
+vaultOptions.general.autoLock.lockAfterTimePart1=다음 시간동안 유휴상태 시 잠금 :
+vaultOptions.general.autoLock.lockAfterTimePart2=분
vaultOptions.general.unlockAfterStartup=Cryptomator를 시작할 때 Vault 잠금 해제
vaultOptions.general.actionAfterUnlock=성공적으로 잠금해제 후
vaultOptions.general.actionAfterUnlock.ignore=아무 것도 하지 않음
vaultOptions.general.actionAfterUnlock.reveal=드라이브 표시
vaultOptions.general.actionAfterUnlock.ask=요청
+vaultOptions.general.startHealthCheckBtn=상태 검사 시작
+
## Mount
vaultOptions.mount=드라이브 구성
vaultOptions.mount.readonly=읽기 전용
@@ -305,10 +331,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=빈 디렉터리를 선택
vaultOptions.masterkey=비밀번호
vaultOptions.masterkey.changePasswordBtn=비밀번호 변경
vaultOptions.masterkey.forgetSavedPasswordBtn=저장된 비밀번호 삭제
-vaultOptions.masterkey.recoveryKeyExpanation=복구 키는 비밀번호를 잊어버렸을 때, Vault의 접근을 복원 할 수 있는 유일한 방법입니다.
+vaultOptions.masterkey.recoveryKeyExplanation=복구 키는 비밀번호를 잊어버렸을 때, Vault의 접근을 복원 할 수 있는 유일한 방법입니다.
vaultOptions.masterkey.showRecoveryKeyBtn=복구 키 표시
vaultOptions.masterkey.recoverPasswordBtn=비밀번호 복구
-## Auto Lock
+
# Recovery Key
recoveryKey.title=복구 키
diff --git a/src/main/resources/i18n/strings_lv.properties b/src/main/resources/i18n/strings_lv.properties
index ed7da450e..6255b4603 100644
--- a/src/main/resources/i18n/strings_lv.properties
+++ b/src/main/resources/i18n/strings_lv.properties
@@ -13,8 +13,6 @@ generic.button.done=Darīts
generic.button.next=Tālāk
generic.button.print=Drukāt
## Error
-generic.error.title=Radās neparedzēta kļūda
-generic.error.instruction=Šis vēl nav atgadījies. Lūdzu ziņo zemāk redzamo kļūdas tekstu un iekļauj aprakstu, kas noveda pie šīs kļūdas.
# Defaults
@@ -90,7 +88,6 @@ forgetPassword.information=Tas dzēsīs saglabāto glabātuves paroli no jūsu s
forgetPassword.confirmBtn=Aizmirst paroli
# Unlock
-unlock.title=Atslēgt glabātuvi
unlock.passwordPrompt=Ievadiet "%s" paroli:
unlock.unlockBtn=Atslēgt
##
@@ -112,7 +109,7 @@ migration.start.confirm=Jā, mana glabātuve ir pilnībā sinhronizēta
## Run
migration.run.enterPassword=Ievadiet "%s" paroli
migration.run.startMigrationBtn=Migrēt glabātuvi
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" sekmīgi migrēta.\nJūs tagad variet atslēgt jūsu glabātuvi.
migration.success.unlockNow=Atslēgt tagad
## Missing file system capabilities
@@ -125,8 +122,11 @@ migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Nav atļaujas
## Impossible
# Health Check
+## Start
+## Start Failure
+## Check Selection
## Detail view
-## Checks
+## Fix Application
# Preferences
preferences.title=Iestatījumi
@@ -198,6 +198,7 @@ main.vaultDetail.missing.info=Cryptomator šajā ceļā nevarēja atrast glabāt
### Needs Migration
main.vaultDetail.migrateButton=Jaunināt glabātuvi
main.vaultDetail.migratePrompt=Lai jūsu varētu piekļūt glabātuvei to ir nepieciešms jaunināt uz jaunu formātu
+### Error
# Wrong File Alert
wrongFileAlert.title=Kā šifrēt datnes
@@ -215,6 +216,7 @@ vaultOptions.general=Vispārēji
vaultOptions.general.vaultName=Glabātuves nosaukums
vaultOptions.general.unlockAfterStartup=Atslēgt glabātuvi startējot Cryptomator
vaultOptions.general.actionAfterUnlock.reveal=Atklāt disku
+
## Mount
vaultOptions.mount=Montē
vaultOptions.mount.readonly=Tikai lasīt
@@ -229,10 +231,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Izvēlies tukšu mapi
## Master Key
vaultOptions.masterkey=Parole
vaultOptions.masterkey.changePasswordBtn=Mainīt paroli
-vaultOptions.masterkey.recoveryKeyExpanation=Atkopšanas atslēga ir jūsu vienīgais līdzeklis, lai atjaunotu piekļuvi glabātuvei, ja pazaudējat paroli.
+vaultOptions.masterkey.recoveryKeyExplanation=Atkopšanas atslēga ir jūsu vienīgais līdzeklis, lai atjaunotu piekļuvi glabātuvei, ja pazaudējat paroli.
vaultOptions.masterkey.showRecoveryKeyBtn=Rādīt atkopšanas atslēgu
vaultOptions.masterkey.recoverPasswordBtn=Atjaunot paroli
-## Auto Lock
+
# Recovery Key
recoveryKey.title=Atjaunošanas atslēga
diff --git a/src/main/resources/i18n/strings_nb.properties b/src/main/resources/i18n/strings_nb.properties
index cf8ce9de9..d15d7bbd7 100644
--- a/src/main/resources/i18n/strings_nb.properties
+++ b/src/main/resources/i18n/strings_nb.properties
@@ -13,8 +13,6 @@ generic.button.done=Ferdig
generic.button.next=Neste
generic.button.print=Skriv ut
## Error
-generic.error.title=Det oppstod en uventet feil
-generic.error.instruction=Dette skulle ikke ha skjedd. Rapporter feilteksten nedenfor og legg inn en beskrivelse av hvilke trinn som førte til denne feilen.
# Defaults
defaults.vault.vaultName=Hvelv
@@ -44,6 +42,8 @@ addvaultwizard.new.locationPrompt=…
addvaultwizard.new.directoryPickerLabel=Tilpasset lagringssted
addvaultwizard.new.directoryPickerButton=Velg…
addvaultwizard.new.directoryPickerTitle=Velg mappe
+addvaultwizard.new.fileAlreadyExists=En fil eller mappe med det hvelvnavnet finnes allerede
+addvaultwizard.new.locationIsOk=Egnet sted for hvelvet ditt
addvaultwizard.new.invalidName=Ugyldig navn på hvelvet. Vennligst vurder et vanlig mappenavn.
### Password
addvaultwizard.new.createVaultBtn=Opprett hvelv
@@ -91,7 +91,7 @@ forgetPassword.information=Dette vil slette det lagrede passordet til dette hvel
forgetPassword.confirmBtn=Glem passord
# Unlock
-unlock.title=Lås opp hvelvet
+unlock.title=Lås opp "%s"
unlock.passwordPrompt=Skriv inn passordet for "%s":
unlock.savePassword=Husk passord
unlock.unlockBtn=Lås opp
@@ -124,7 +124,7 @@ migration.start.confirm=Ja, hvelvet mitt er fullstendig synkronisert
migration.run.enterPassword=Skriv inn passordet for "%s"
migration.run.startMigrationBtn=Overfør hvelv
migration.run.progressHint=Dette kan ta litt tid…
-## Sucess
+## Success
migration.success.nextStepsInstructions=Vellykket overføring av "%s".\nDu kan nå låse opp hvelvet ditt.
migration.success.unlockNow=Lås opp nå
## Missing file system capabilities
@@ -140,8 +140,16 @@ migration.impossible.reason=Hvelvet kan ikke overføres automatisk fordi lagring
migration.impossible.moreInfo=Hvelvet kan fortsatt åpnes hvis du bruker en eldre versjon. For instruksjoner om hvordan man overfører et hvelv, besøk
# Health Check
+## Start
+health.intro.remarkFix=Ikke alle problemer kan løses.
+## Start Failure
+health.fail.moreInfo=Mer informasjon
+## Check Selection
## Detail view
-## Checks
+## Fix Application
+health.fix.fixBtn=Reparer
+health.fix.successTip=Vellykket reparering
+health.fix.failTip=Repareringen feilet. Se loggen for detaljer
# Preferences
preferences.title=Innstillinger
@@ -159,10 +167,6 @@ preferences.general.debugLogging=Aktiver loggføring av feilsøk
preferences.general.debugDirectory=Vis loggfiler
preferences.general.autoStart=Start Cryptomator ved systemstart
preferences.general.keychainBackend=Lagre passord med
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS nøkkelringtilgang
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection
preferences.general.interfaceOrientation=Grensesnittorientering
preferences.general.interfaceOrientation.ltr=Fra venstre til høyre
preferences.general.interfaceOrientation.rtl=Fra høyre til venstre
@@ -178,6 +182,7 @@ preferences.updates.autoUpdateCheck=Se etter oppdateringer automatisk
preferences.updates.checkNowBtn=Sjekk nå
preferences.updates.updateAvailable=Oppdatering til versjon %s er tilgjengelig.
## Contribution
+preferences.contribute=Støtt oss
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
@@ -224,6 +229,7 @@ main.dropZone.dropVault=Legg til dette hvelvet
main.dropZone.unknownDragboardContent=Hvis du vil legge til et hvelv, kan du dra det til dette vinduet
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klikk her for å legge til et hvelv
+main.vaultlist.contextMenu.remove=Fjern…
main.vaultlist.contextMenu.lock=Lås
main.vaultlist.contextMenu.unlock=Lås opp…
main.vaultlist.contextMenu.unlockNow=Lås opp nå
@@ -257,6 +263,7 @@ main.vaultDetail.missing.changeLocation=Endre hvelvplassering…
### Needs Migration
main.vaultDetail.migrateButton=Oppgrader hvelv
main.vaultDetail.migratePrompt=Hvelvet ditt må oppgraderes til et nytt format før du kan få tilgang til det
+### Error
# Wrong File Alert
wrongFileAlert.title=Slik krypterer du filer
@@ -272,11 +279,13 @@ wrongFileAlert.link=For ytterligere hjelp, besøk
## General
vaultOptions.general=Generelt
vaultOptions.general.vaultName=Navn på hvelvet
+vaultOptions.general.autoLock.lockAfterTimePart2=minutter
vaultOptions.general.unlockAfterStartup=Lås opp hvelvet når du starter Cryptomator
vaultOptions.general.actionAfterUnlock=Etter vellykket opplåsing
vaultOptions.general.actionAfterUnlock.ignore=Ikke gjør noe
vaultOptions.general.actionAfterUnlock.reveal=Gjør enheten synlig
vaultOptions.general.actionAfterUnlock.ask=Spør
+
## Mount
vaultOptions.mount=Montering
vaultOptions.mount.readonly=Skrivebeskyttet
@@ -292,10 +301,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Velg en tom mappe
vaultOptions.masterkey=Passord
vaultOptions.masterkey.changePasswordBtn=Endre passord
vaultOptions.masterkey.forgetSavedPasswordBtn=Glem passord
-vaultOptions.masterkey.recoveryKeyExpanation=En gjenopprettingsnøkkel er den eneste måten å gjenopprette tilgangen til et hvelv på hvis du mister passordet.
+vaultOptions.masterkey.recoveryKeyExplanation=En gjenopprettingsnøkkel er den eneste måten å gjenopprette tilgangen til et hvelv på hvis du mister passordet.
vaultOptions.masterkey.showRecoveryKeyBtn=Vis gjenopprettingsnøkkelen
vaultOptions.masterkey.recoverPasswordBtn=Gjenopprett passord
-## Auto Lock
+
# Recovery Key
recoveryKey.title=Gjenopprettingsnøkkel
diff --git a/src/main/resources/i18n/strings_nl.properties b/src/main/resources/i18n/strings_nl.properties
index 0eea9bb0e..46d997400 100644
--- a/src/main/resources/i18n/strings_nl.properties
+++ b/src/main/resources/i18n/strings_nl.properties
@@ -13,8 +13,11 @@ generic.button.done=Klaar
generic.button.next=Volgende
generic.button.print=Afdrukken
## Error
-generic.error.title=Er is een onverwachte fout opgetreden
-generic.error.instruction=Dit had niet moeten gebeuren. Rapporteer de onderstaande fouttekst en voeg een beschrijving toe van de stappen die tot deze fout hebben geleid.
+generic.error.title=Fout %s
+generic.error.instruction=Oeps! Cryptomator verwachtte niet dat dit zou gebeuren. U kunt bestaande oplossingen opzoeken voor deze fout, of indien er nog geen melding van deze fout is gemaakt mag u dit ook gerust doen.
+generic.error.hyperlink.lookup=Deze fout opzoeken
+generic.error.hyperlink.report=Deze fout melden
+generic.error.technicalDetails=Details:
# Defaults
defaults.vault.vaultName=Kluis
@@ -95,7 +98,7 @@ forgetPassword.information=Dit zal het opgeslagen wachtwoord van deze kluis uit
forgetPassword.confirmBtn=Wachtwoord vergeten
# Unlock
-unlock.title=Kluis ontgrendelen
+unlock.title=Ontgrendel "%s"
unlock.passwordPrompt=Voer wachtwoord voor "%s" in:
unlock.savePassword=Wachtwoord Onthouden
unlock.unlockBtn=Ontgrendel
@@ -130,7 +133,7 @@ migration.start.confirm=Ja, mijn kluis is volledig gesynchroniseerd
migration.run.enterPassword=Voer wachtwoord voor "%s" in
migration.run.startMigrationBtn=Kluis migreren
migration.run.progressHint=Dit kan enige tijd duren…
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" is succesvol gemigreerd.\nU kunt nu uw kluis ontgrendelen.
migration.success.unlockNow=Nu Ontgrendelen
## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=De kluis kan niet automatisch gemigreerd worden omda
migration.impossible.moreInfo=De kluis is nog te openen met een oudere versie. Instructies voor het handmatig migreren van een kluis zijn te vinden op
# Health Check
-health.title=Gezondheidcheck kluis
-health.start.introduction=De gezondheidscheck van de kluis is een verzameling controles om problemen in de interne structuur van uw kluis op te sporen en op te lossen. Houd er rekening mee dat niet alle problemen opgelost zijn. Je hebt het kluiswachtwoord nodig om de controles uit te voeren.
-health.start.configValid=Het lezen en verwerken van het configuratiebestand van de kluis is gelukt. Ga door en selecteer controles.
-health.start.configInvalid=Fout bij het lezen en verwerken van het configuratiebestand van de kluis.
-health.checkList.header=Beschikbare gezondheidscontroles
-health.checkList.selectAllBox=Alles selecteren
+## Start
+health.title=Controle van "%s"
+health.intro.header=Controle
+health.intro.text=Controles zijn er voor het detecteren en indien mogelijk oplossen van problemen met de interne structuur van uw kluis. Houd daarbij rekening met het volgende:
+health.intro.remarkSync=Zorg er voor dat alle apparaten volledig gesynchroniseerd zijn. Dit lost de meeste problemen op.
+health.intro.remarkFix=Niet alle problemen kunnen opgelost worden.
+health.intro.remarkBackup=Als data is beschadigd, kan alleen een back-up helpen.
+health.intro.affirmation=Ik heb de informatie hierboven gelezen en begrepen
+## Start Failure
+health.fail.header=Fout bij het laden van de kluisconfiguratie
+health.fail.ioError=Er is een fout opgetreden tijdens het openen en lezen van het configuratiebestand.
+health.fail.parseError=Er is een fout opgetreden bij het inladen van de kluisconfiguratie.
+health.fail.moreInfo=Meer informatie
+## Check Selection
+health.checkList.description=Selecteer controles in de lijst aan de linkerkant, of gebruik de onderstaande knoppen.
+health.checkList.selectAllButton=Selecteer alle controles
+health.checkList.deselectAllButton=Deselecteer alle controles
health.check.runBatchBtn=Geselecteerde controles uitvoeren
## Detail view
health.check.detail.noSelectedCheck=Voor resultaten selecteert u een voltooide gezondheidscontrole in de linker lijst.
-health.check.detail.header=Resultaten voor: %s
-health.check.detail.taskNotStarted=De controle werd niet geselecteerd om uit te voeren.
-health.check.detail.taskScheduled=De controle is ingepland.
-health.check.detail.taskRunning=De controle wordt momenteel uitgevoerd…
-health.check.detail.taskSucceeded=De controle is succesvol uitgevoerd na %d milliseconden.
-health.check.detail.taskFailed=De controle is afgesloten door een fout.
-health.check.detail.taskCancelled=De controle is geannuleerd.
-health.check.detail.problemCount=%d problemen gevonden en %d onoplosbare fouten.
+health.check.detail.checkScheduled=De controle is ingepland.
+health.check.detail.checkRunning=De controle wordt momenteel uitgevoerd…
+health.check.detail.checkSkipped=De controle was niet geselecteerd om uit te voeren.
+health.check.detail.checkFinished=De controle is succesvol beëindigd.
+health.check.detail.checkFinishedAndFound=De controle is beëindigd. Bekijk alstublieft de resultaten.
+health.check.detail.checkFailed=De controle is afgesloten door een fout.
+health.check.detail.checkCancelled=De controle werd geannuleerd.
health.check.exportBtn=Exporteer rapport
-health.check.fixBtn=Repareren
-## Checks
-health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Map Controle
+## Fix Application
+health.fix.fixBtn=Herstel
+health.fix.successTip=Hersteld
+health.fix.failTip=Herstellen mislukt, zie logboek voor details
# Preferences
preferences.title=Voorkeuren
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Debug logging aanzetten
preferences.general.debugDirectory=Logboekbestanden bekijken
preferences.general.autoStart=Start Cryptomator als het systeem opstart
preferences.general.keychainBackend=Bewaar wachtwoorden met
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome sleutelhanger
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS-sleutelhangertoegang
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows-gegevensbescherming
preferences.general.interfaceOrientation=Interface oriëntatie
preferences.general.interfaceOrientation.ltr=Links naar rechts
preferences.general.interfaceOrientation.rtl=Rechts naar links
@@ -289,6 +299,10 @@ main.vaultDetail.missing.changeLocation=Verander de locatie van de kluis…
### Needs Migration
main.vaultDetail.migrateButton=Kluis upgraden
main.vaultDetail.migratePrompt=Uw kluis moet worden bijgewerkt naar een nieuw formaat, voordat u deze kunt openen
+### Error
+main.vaultDetail.error.info=Er is een fout opgetreden bij het laden van de kluis vanaf de vaste schijf.
+main.vaultDetail.error.reload=Herladen
+main.vaultDetail.error.windowTitle=Fout bij laden van kluis
# Wrong File Alert
wrongFileAlert.title=Hoe bestanden te versleutelen
@@ -304,12 +318,15 @@ wrongFileAlert.link=Voor verdere ondersteuning, bezoek
## General
vaultOptions.general=Algemeen
vaultOptions.general.vaultName=Kluisnaam
+vaultOptions.general.autoLock.lockAfterTimePart1=Vergrendel wanneer inactief voor
+vaultOptions.general.autoLock.lockAfterTimePart2=minuten
vaultOptions.general.unlockAfterStartup=Ontgrendel kluis bij het starten van Cryptomator
vaultOptions.general.actionAfterUnlock=Na een succesvolle ontgrendeling
vaultOptions.general.actionAfterUnlock.ignore=Niets doen
vaultOptions.general.actionAfterUnlock.reveal=Toon Schijf
vaultOptions.general.actionAfterUnlock.ask=Vragen
-vaultOptions.general.healthBtn=Start gezondheidscontrole
+vaultOptions.general.startHealthCheckBtn=Start controle
+
## Mount
vaultOptions.mount=Aankoppelen
vaultOptions.mount.readonly=Alleen-Lezen
@@ -325,10 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Kies een lege map
vaultOptions.masterkey=Wachtwoord
vaultOptions.masterkey.changePasswordBtn=Wijzig wachtwoord
vaultOptions.masterkey.forgetSavedPasswordBtn=Opgeslagen wachtwoord vergeten
-vaultOptions.masterkey.recoveryKeyExpanation=Een herstelsleutel is je enige manier om de toegang tot een kluis te herstellen als je je wachtwoord kwijtraakt.
+vaultOptions.masterkey.recoveryKeyExplanation=Een herstelsleutel is je enige manier om de toegang tot een kluis te herstellen als je je wachtwoord kwijtraakt.
vaultOptions.masterkey.showRecoveryKeyBtn=Toon herstelsleutel
vaultOptions.masterkey.recoverPasswordBtn=Wachtwoord herstellen
-## Auto Lock
+
# Recovery Key
recoveryKey.title=Herstelsleutel
diff --git a/src/main/resources/i18n/strings_nn.properties b/src/main/resources/i18n/strings_nn.properties
index a83b5703a..56be1a0a3 100644
--- a/src/main/resources/i18n/strings_nn.properties
+++ b/src/main/resources/i18n/strings_nn.properties
@@ -13,8 +13,6 @@ generic.button.done=Ferdig
generic.button.next=Neste
generic.button.print=Skriv ut
## Error
-generic.error.title=Eit uventa problem oppstod
-generic.error.instruction=Dette skulle ikkje ha skjedd. Rapporter feilteksten nedanfor og legg inn ei skildring av kva trinn som førte til denne feilen.
# Defaults
@@ -90,7 +88,6 @@ forgetPassword.information=Dette vil sletta det lagra passordet til denne kvelve
forgetPassword.confirmBtn=Gløym passord
# Unlock
-unlock.title=Lås opp kvelven
unlock.passwordPrompt=Skriv inn passordet for "%s":
unlock.unlockBtn=Låse opp
##
@@ -114,7 +111,7 @@ migration.start.confirm=Ja, kvelven min er fullstendig synkronisert
migration.run.enterPassword=Skriv inn passordet for "%s"
migration.run.startMigrationBtn=Migrer kvelv
migration.run.progressHint=Dette kan ta litt tid…
-## Sucess
+## Success
migration.success.nextStepsInstructions=Vellykka migrering av "%s". Du kan no låsa opp kvelven din.
migration.success.unlockNow=Lås opp no
## Missing file system capabilities
@@ -130,8 +127,11 @@ migration.impossible.reason=Kvelven kan ikkje overførast automatisk fordi lagri
migration.impossible.moreInfo=Kvelven kan framleis opnast viss du bruker ein eldre versjon. For instruksjonar om korleis ein overfører ein kvelv, besøk
# Health Check
+## Start
+## Start Failure
+## Check Selection
## Detail view
-## Checks
+## Fix Application
# Preferences
preferences.title=Innstillingar
@@ -208,6 +208,7 @@ main.vaultDetail.missing.recheck=Kontroller igjen
### Needs Migration
main.vaultDetail.migrateButton=Oppgrader kvelv
main.vaultDetail.migratePrompt=Kvelven din må oppgraderast til eit nytt format før du kan få tilgang til det
+### Error
# Wrong File Alert
wrongFileAlert.title=Slik krypterer du filer
@@ -228,6 +229,7 @@ vaultOptions.general.actionAfterUnlock=Etter vellykka opplåsing
vaultOptions.general.actionAfterUnlock.ignore=Ikkje gjer noko
vaultOptions.general.actionAfterUnlock.reveal=Gjer eininga synleg
vaultOptions.general.actionAfterUnlock.ask=Spør
+
## Mount
vaultOptions.mount=Montering
vaultOptions.mount.readonly=Skriveverna
@@ -243,10 +245,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Vel ei tom mappe
vaultOptions.masterkey=Passord
vaultOptions.masterkey.changePasswordBtn=Byt passord
vaultOptions.masterkey.forgetSavedPasswordBtn=Gløym passord
-vaultOptions.masterkey.recoveryKeyExpanation=Ein "retta opp igjen"-nøkkel er den einaste måten å retta opp igjen tilgangen til ein kvelv på viss du mistar passordet.
+vaultOptions.masterkey.recoveryKeyExplanation=Ein "retta opp igjen"-nøkkel er den einaste måten å retta opp igjen tilgangen til ein kvelv på viss du mistar passordet.
vaultOptions.masterkey.showRecoveryKeyBtn=Vis 'Retta opp igjen'-nøkkelen
vaultOptions.masterkey.recoverPasswordBtn=Rett opp igjen passord
-## Auto Lock
+
# Recovery Key
recoveryKey.title='Retta opp igjen'-nøkkel
diff --git a/src/main/resources/i18n/strings_pa.properties b/src/main/resources/i18n/strings_pa.properties
index 52a2d9457..7d9587112 100644
--- a/src/main/resources/i18n/strings_pa.properties
+++ b/src/main/resources/i18n/strings_pa.properties
@@ -13,8 +13,6 @@ generic.button.done=ਮੁਕੰਮਲ
generic.button.next=ਅੱਗੇ
generic.button.print=ਪਰਿੰਟ ਕਰੋ
## Error
-generic.error.title=ਅਣਪਛਾਤੀ ਗਲਤੀ ਵਪਾਰੀ ਹੈ
-generic.error.instruction=ਇਹ ਵਾਪਰਨਾ ਨਹੀਂ ਚਾਹੀਦਾ ਸੀ। ਹੇਠ ਦਿੱਤੀ ਗਲਤੀ ਲਿਖਤ ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ ਅਤੇ ਇਹ ਗਲਤੀ ਹੋਣ ਦੌਰਾਨ ਜਿਹੜੇ ਵੀ ਕਦਮ ਚੁੱਕੇ ਹਨ, ਬਾਰੇ ਵੇਰਵਾ ਦਿਉ।
# Defaults
defaults.vault.vaultName=ਵਾਲਟ
@@ -91,7 +89,6 @@ forgetPassword.information=ਇਹ ਤੁਹਾਡੇ ਸਿਸਟਮ ਦੇ ਕ
forgetPassword.confirmBtn=ਪਾਸਵਰਡ ਭੁੱਲ ਗਏ
# Unlock
-unlock.title=ਵਾਲਟ ਅਣ-ਲਾਕ ਕਰੋ
unlock.passwordPrompt="%s" ਲਈ ਪਾਸਵਰਡ ਦਿਓ:
unlock.savePassword=ਪਾਸਵਰਡ ਯਾਦ ਰੱਖੋ
unlock.unlockBtn=ਅਣ-ਲਾਕ ਕਰੋ
@@ -124,7 +121,7 @@ migration.start.confirm=ਹਾਂ, ਮੇਰਾ ਵਾਲਟ ਪੂਰੀ ਤਰ
migration.run.enterPassword="%s" ਲਈ ਪਾਸਵਰਡ ਦਿਓ
migration.run.startMigrationBtn=ਵਾਲਟ ਮਾਈਗਰੇਟ ਕਰੋ
migration.run.progressHint=ਇਸ ਨੂੰ ਕੁਝ ਵੇਲਾ ਲੱਗ ਸਕਦਾ ਹੈ…
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" ਕਾਮਯਾਬੀ ਨਾਲ ਮਾਈਗਰੇਟ ਕੀਤਾ\nਹੁਣ ਤੁਸੀਂ ਆਪਣੇ ਵਾਲਟ ਨੂੰ ਅਣ-ਲਾਕ ਕਰ ਸਕਦੇ ਹੋ।
migration.success.unlockNow=ਹੁਣੇ ਅਣ-ਲਾਕ ਕਰੋ
## Missing file system capabilities
@@ -140,8 +137,11 @@ migration.impossible.reason=ਵਾਲਟ ਨੂੰ ਆਪਣੇ-ਆਪ ਮਾਈ
migration.impossible.moreInfo=ਵਾਲਟ ਨੂੰ ਅਜੇ ਵੀ ਪੁਰਾਣੇ ਵਰਜ਼ਨ ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਸਕਦਾ ਹੈ। ਵਾਲਟ ਨੂੰ ਖੁਦ ਕਿਵੇਂ ਮਾਈਗਰੇਟ ਕਰੀਏ, ਇਸ ਬਾਰੇ ਹਦਾਇਤਾਂ ਲਈ ਵੇਖੋ
# Health Check
+## Start
+## Start Failure
+## Check Selection
## Detail view
-## Checks
+## Fix Application
# Preferences
preferences.title=ਮੇਰੀ ਪਸੰਦ
@@ -159,10 +159,6 @@ preferences.general.debugLogging=ਡੀਬੱਗ ਲਾਗ ਸਮਰੱਥ ਕ
preferences.general.debugDirectory=ਲਾਗ ਫਾਇਲਾਂ ਦਿਖਾਓ
preferences.general.autoStart=ਸਿਸਟਮ ਸ਼ੁਰੂ ਵੇਲੇ Cryptomator ਚਲਾਓ
preferences.general.keychainBackend=ਪਾਸਵਰਡ ਇਸ ਨਾਲ ਸੰਭਾਲੋ
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=ਗਨੋਮ ਕੀਰਿੰਗ
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=ਕੇਡੀਈ ਵਾਲਟ
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS ਕੀਚੇਨ ਪਹੁੰਚ
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=ਵਿੰਡੋ ਡਾਟਾ ਪਰੋਟੈਕਸ਼ਨ
preferences.general.interfaceOrientation=ਇੰਟਰਟੇਸ ਸਥਿਤੀ
preferences.general.interfaceOrientation.ltr=ਖੱਬੇ ਤੋਂ ਸੱਜਾ
preferences.general.interfaceOrientation.rtl=ਸੱਜੇ ਤੋਂ ਖੱਬਾ
@@ -257,6 +253,7 @@ main.vaultDetail.missing.changeLocation=ਵਾਲਟ ਟਿਕਾਣੇ ਨੂ
### Needs Migration
main.vaultDetail.migrateButton=ਵਾਲਟ ਅੱਪਗਰੇਡ ਕਰੋ
main.vaultDetail.migratePrompt=ਤੁਹਾਡੇ ਵਾਲਟ ਨੂੰ ਵਰਤੇ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਨਵੇਂ ਫਾਰਮੈਟ ਲਈ ਅੱਪਗਰੇਡ ਕਰਨ ਦੀ ਲੋੜ ਹੈ
+### Error
# Wrong File Alert
wrongFileAlert.title=ਫਾਇਲਾਂ ਇੰਕ੍ਰਿਪਟ ਕਿਵੇਂ ਹੁੰਦੀਆਂ ਹਨ
@@ -277,6 +274,7 @@ vaultOptions.general.actionAfterUnlock=ਕਾਮਯਾਬੀ ਨਾਲ ਅਣ-
vaultOptions.general.actionAfterUnlock.ignore=ਕੁਝ ਨਾ ਕਰੋ
vaultOptions.general.actionAfterUnlock.reveal=ਡਰਾਇਵ ਦਿਖਾਓ
vaultOptions.general.actionAfterUnlock.ask=ਪੁੱਛੋ
+
## Mount
vaultOptions.mount=ਮਾਊਂਟ ਕਰਨਾ
vaultOptions.mount.readonly=ਕੇਵਲ ਪੜ੍ਹਨ ਲਈ
@@ -292,10 +290,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=ਖਾਲੀ ਡਾਇਰੈ
vaultOptions.masterkey=ਪਾਸਵਰਡ
vaultOptions.masterkey.changePasswordBtn=ਪਾਸਵਰਡ ਬਦਲੋ
vaultOptions.masterkey.forgetSavedPasswordBtn=ਸੰਭਾਲਿਆ ਪਾਸਵਰਡ ਭੁੱਲੋ
-vaultOptions.masterkey.recoveryKeyExpanation=ਜੇ ਤੁਸੀਂ ਆਪਣਾ ਪਾਸਵਰਡ ਭੁੱਲ ਗਏ ਹੋ ਤਾਂ ਤੁਹਾਡੇ ਵਾਲਟ ਲਈ ਪਹੁੰਚ ਬਹਾਲ ਕਰਨ ਵਾਸਤੇ ਸਿਰਫ਼ ਰਿਕਵਰੀ ਕੁੰਜੀ ਹੀ ਹੈ।
+vaultOptions.masterkey.recoveryKeyExplanation=ਜੇ ਤੁਸੀਂ ਆਪਣਾ ਪਾਸਵਰਡ ਭੁੱਲ ਗਏ ਹੋ ਤਾਂ ਤੁਹਾਡੇ ਵਾਲਟ ਲਈ ਪਹੁੰਚ ਬਹਾਲ ਕਰਨ ਵਾਸਤੇ ਸਿਰਫ਼ ਰਿਕਵਰੀ ਕੁੰਜੀ ਹੀ ਹੈ।
vaultOptions.masterkey.showRecoveryKeyBtn=ਰਿਕਰਵੀ ਕੁੰਜੀ ਦਿਖਾਓ
vaultOptions.masterkey.recoverPasswordBtn=ਪਾਸਵਰਡ ਰਿਕਵਰ ਕਰੋ
-## Auto Lock
+
# Recovery Key
recoveryKey.title=ਰਿਕਵਰੀ ਕੁੰਜੀ
diff --git a/src/main/resources/i18n/strings_pl.properties b/src/main/resources/i18n/strings_pl.properties
index be2a2a4c1..43fac0c82 100644
--- a/src/main/resources/i18n/strings_pl.properties
+++ b/src/main/resources/i18n/strings_pl.properties
@@ -13,8 +13,11 @@ generic.button.done=Gotowe
generic.button.next=Dalej
generic.button.print=Drukuj
## Error
-generic.error.title=Wystąpił nieoczekiwany błąd
-generic.error.instruction=To nie powinno było się zdarzyć. Proszę zgłosić poniższy tekst z błędem i zamieścić opis kroków, które doprowadziły do tego błędu.
+generic.error.title=Błąd %s
+generic.error.instruction=Ups! Cryptomator nie spodziewał się czegoś takiego. Możesz wyszukać istniejące rozwiązania dla tego błędu. Lub, jeśli nie został on jeszcze zgłoszony, możesz sam to zrobić.
+generic.error.hyperlink.lookup=Wyszukaj ten błąd
+generic.error.hyperlink.report=Zgłoś ten błąd
+generic.error.technicalDetails=Szczegóły:
# Defaults
defaults.vault.vaultName=Sejf
@@ -95,7 +98,7 @@ forgetPassword.information=To spowoduje usunięcie zapisanego hasła z systemowe
forgetPassword.confirmBtn=Zapomnij hasło
# Unlock
-unlock.title=Odblokuj sejf
+unlock.title=Odblokuj "%s"
unlock.passwordPrompt=Wprowadź hasło dla "%s":
unlock.savePassword=Zapamiętaj hasło
unlock.unlockBtn=Odblokuj
@@ -130,7 +133,7 @@ migration.start.confirm=Tak, mój sejf jest w pełni zsynchronizowany
migration.run.enterPassword=Wprowadź hasło dla "%s"
migration.run.startMigrationBtn=Aktualizuj sejf
migration.run.progressHint=To może chwilę potrwać…
-## Sucess
+## Success
migration.success.nextStepsInstructions=Aktualizacja "%s" zakończona pomyślnie.\nMożesz już odblokować swój sejf.
migration.success.unlockNow=Odblokuj teraz
## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=Sejf nie może być automatycznie zmigrowany, poniew
migration.impossible.moreInfo=Sejf nadal może być otwarty starszą wersją. Aby uzyskać informacje dotyczące ręcznej migracji sejfu wejdź na
# Health Check
-health.title=Ocena stanu sejfu
-health.start.introduction=Ocena stanu sejfu to zbiór testów wykrywający i ewentualnie rozwiązujący problemy w wewnętrznej strukturze Twojego sejfu. Należy pamiętać, że nie wszystkie błędy da się rozwiązać. Do przeprowadzenia testów wymagane jest hasło sejfu.
-health.start.configValid=Odczyt i przetwarzanie pliku konfiguracyjnego sejfu powiodły się. Przejdź dalej do wyboru testów.
-health.start.configInvalid=Błąd podczas odczytu i przetwarzania pliku konfiguracyjnego sejfu.
-health.checkList.header=Dostępne testy
-health.checkList.selectAllBox=Zaznacz wszystko
+## Start
+health.title=Test spójności "%s"
+health.intro.header=Test spójności
+health.intro.text=Test spójności to zbiór testów do wykrywania i ewentualnego usunięcia problemów z wewnętrzną strukturą Twojego sejfu. Pamiętaj:
+health.intro.remarkSync=Sprawdź czy wszystkie urządzenia są całkowicie zsynchronizowane, to rozwiązuje większość problemów.
+health.intro.remarkFix=Nie wszystkie problemy da się naprawić.
+health.intro.remarkBackup=Jeśli dane są uszkodzone, tylko kopia zapasowa może pomóc.
+health.intro.affirmation=Przeczytałem i zrozumiałem powyższe informacje
+## Start Failure
+health.fail.header=Błąd ładowania konfiguracji sejfu
+health.fail.ioError=Błąd podczas dostępu oraz odczytu pliku konfiguracyjnego.
+health.fail.parseError=Błąd przetwarzania konfiguracji sejfu.
+health.fail.moreInfo=Więcej Informacji
+## Check Selection
+health.checkList.description=Wybierz testy z lewej listy lub użyj przycisków poniżej.
+health.checkList.selectAllButton=Wybierz wszystkie testy
+health.checkList.deselectAllButton=Odznacz wszystkie testy
health.check.runBatchBtn=Uruchom wybrane testy
## Detail view
health.check.detail.noSelectedCheck=Aby sprawdzić wyniki, wybierz test z listy po lewej stronie.
-health.check.detail.header=Wyniki testu %s
-health.check.detail.taskNotStarted=Test nie był wybrany do uruchomienia.
-health.check.detail.taskScheduled=Test będzie uruchomiony.
-health.check.detail.taskRunning=Test jest aktualnie uruchomiony…
-health.check.detail.taskSucceeded=Test zakończony pomyślnie po %d milisekundach.
-health.check.detail.taskFailed=Test zakończony z powodu błędu.
-health.check.detail.taskCancelled=Test został anulowany.
-health.check.detail.problemCount=Jest %d problemów oraz %d nienaprawialnych błędów.
+health.check.detail.checkScheduled=Test będzie uruchomiony.
+health.check.detail.checkRunning=Test jest aktualnie uruchomiony…
+health.check.detail.checkSkipped=Test nie był wybrany do uruchomienia.
+health.check.detail.checkFinished=Test zakończony pomyślnie.
+health.check.detail.checkFinishedAndFound=Test zakończony. Proszę sprawdzić wyniki.
+health.check.detail.checkFailed=Wystąpił błąd, test zakończony.
+health.check.detail.checkCancelled=Test został anulowany.
health.check.exportBtn=Eksportuj raport
-health.check.fixBtn=Napraw
-## Checks
-health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Sprawdź katalog
+## Fix Application
+health.fix.fixBtn=Napraw
+health.fix.successTip=Naprawa udana
+health.fix.failTip=Błąd naprawy, szczegóły w logach
# Preferences
preferences.title=Ustawienia
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Włącz logowanie w trybie debug
preferences.general.debugDirectory=Pokaż pliki logowania
preferences.general.autoStart=Uruchom Cryptomator po uruchomieniu systemu
preferences.general.keychainBackend=Przechowuj hasła za pomocą
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Brelok kluczy Gnome
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=Portfel KDE
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=Dostęp do pęku kluczy macOS
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Ochrona danych w systemie Windows
preferences.general.interfaceOrientation=Układ interfejsu
preferences.general.interfaceOrientation.ltr=Od lewej do prawej
preferences.general.interfaceOrientation.rtl=Od prawej do lewej
@@ -289,6 +299,10 @@ main.vaultDetail.missing.changeLocation=Zmień lokalizację sejfu…
### Needs Migration
main.vaultDetail.migrateButton=Aktualizuj sejf
main.vaultDetail.migratePrompt=Twój sejf musi zostać zaktualizowany do nowego formatu, zanim będziesz mógł go używać
+### Error
+main.vaultDetail.error.info=Wystąpił błąd podczas ładowania sejfu z dysku.
+main.vaultDetail.error.reload=Przeładuj
+main.vaultDetail.error.windowTitle=Błąd ładowania sejfu
# Wrong File Alert
wrongFileAlert.title=Jak szyfrować pliki
@@ -304,12 +318,15 @@ wrongFileAlert.link=Aby uzyskać pomoc, wejdź na
## General
vaultOptions.general=Ogólne
vaultOptions.general.vaultName=Nazwa sejfu
+vaultOptions.general.autoLock.lockAfterTimePart1=Zablokuj w stanie bezczynności po
+vaultOptions.general.autoLock.lockAfterTimePart2=minut
vaultOptions.general.unlockAfterStartup=Odblokuj sejf podczas uruchamiania programu Cryptomator
vaultOptions.general.actionAfterUnlock=Po udanym odblokowaniu
vaultOptions.general.actionAfterUnlock.ignore=Nic nie rób
vaultOptions.general.actionAfterUnlock.reveal=Otwórz lokalizację
vaultOptions.general.actionAfterUnlock.ask=Zapytaj
-vaultOptions.general.healthBtn=Oceń stan sejfu
+vaultOptions.general.startHealthCheckBtn=Rozpocznij Test Spójności
+
## Mount
vaultOptions.mount=Montowanie
vaultOptions.mount.readonly=Tylko do odczytu
@@ -325,13 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Wybierz pusty katalog
vaultOptions.masterkey=Hasło
vaultOptions.masterkey.changePasswordBtn=Zmiana Hasła
vaultOptions.masterkey.forgetSavedPasswordBtn=Zapomnij zapamiętane hasło
-vaultOptions.masterkey.recoveryKeyExpanation=Klucz odzyskiwania jest twoim jedynym sposobem przywrócenia dostępu do sejfu w przypadku utraty hasła.
+vaultOptions.masterkey.recoveryKeyExplanation=Klucz odzyskiwania jest twoim jedynym sposobem przywrócenia dostępu do sejfu w przypadku utraty hasła.
vaultOptions.masterkey.showRecoveryKeyBtn=Wyświetl klucz odzyskiwania
vaultOptions.masterkey.recoverPasswordBtn=Odzyskaj hasło
-## Auto Lock
-vaultOptions.autoLock=Auto-Lock
-vaultOptions.autoLock.lockAfterTimePart1=Zablokuj w stanie bezczynności po
-vaultOptions.autoLock.lockAfterTimePart2=minutach
+
# Recovery Key
recoveryKey.title=Klucz odzyskiwania
diff --git a/src/main/resources/i18n/strings_pt.properties b/src/main/resources/i18n/strings_pt.properties
index a56d32b75..4b2116cf6 100644
--- a/src/main/resources/i18n/strings_pt.properties
+++ b/src/main/resources/i18n/strings_pt.properties
@@ -13,8 +13,6 @@ generic.button.done=Ok
generic.button.next=Seguinte
generic.button.print=Imprimir
## Error
-generic.error.title=Ocorreu um erro inesperado
-generic.error.instruction=Isto não devia ter acontecido. Por favor reporte o texto do erro abaixo e descreva os passos que levaram a este problema.
# Defaults
defaults.vault.vaultName=Cofre
@@ -84,7 +82,6 @@ forgetPassword.title=Esqueci a Senha
forgetPassword.confirmBtn=Esqueci a Senha
# Unlock
-unlock.title=Destrancar Cofre
unlock.passwordPrompt=Insira a senha para "%s":
unlock.unlockBtn=Destrancar
##
@@ -105,14 +102,17 @@ migration.title=Atualizar Cofre
## Run
migration.run.startMigrationBtn=Migrar Cofre
migration.run.progressHint=Isso pode levar algum tempo…
-## Sucess
+## Success
migration.success.unlockNow=Destrancar agora
## Missing file system capabilities
## Impossible
# Health Check
+## Start
+## Start Failure
+## Check Selection
## Detail view
-## Checks
+## Fix Application
# Preferences
preferences.title=Preferências
@@ -160,6 +160,7 @@ main.vaultDetail.missing.info=O Cryptomator não conseguiu encontrar um cofre ne
### Needs Migration
main.vaultDetail.migrateButton=Atualizar Cofre
main.vaultDetail.migratePrompt=O cofre precisa de ser atualizado para um novo formato, antes que possa acessá-lo
+### Error
# Wrong File Alert
wrongFileAlert.title=Como criptografar arquivos
@@ -175,6 +176,7 @@ vaultOptions.general.vaultName=Nome do Cofre
vaultOptions.general.unlockAfterStartup=Destrancar o cofre ao iniciar o Cryptomator
vaultOptions.general.actionAfterUnlock=Após destrancar com sucesso
vaultOptions.general.actionAfterUnlock.ask=Perguntar
+
## Mount
vaultOptions.mount.readonly=Somente leitura
vaultOptions.mount.mountPoint.directoryPickerButton=Escolher…
@@ -182,10 +184,10 @@ vaultOptions.mount.mountPoint.directoryPickerButton=Escolher…
vaultOptions.masterkey=Senha
vaultOptions.masterkey.changePasswordBtn=Alterar Senha
vaultOptions.masterkey.forgetSavedPasswordBtn=Esqueça a senha salva
-vaultOptions.masterkey.recoveryKeyExpanation=Uma chave de recuperação é a única forma de restaurar o acesso a um cofre se perder a senha.
+vaultOptions.masterkey.recoveryKeyExplanation=Uma chave de recuperação é a única forma de restaurar o acesso a um cofre se perder a senha.
vaultOptions.masterkey.showRecoveryKeyBtn=Exibir Chave de Recuperação
vaultOptions.masterkey.recoverPasswordBtn=Recuperar Senha
-## Auto Lock
+
# Recovery Key
recoveryKey.title=Chave de Recuperação
diff --git a/src/main/resources/i18n/strings_pt_BR.properties b/src/main/resources/i18n/strings_pt_BR.properties
index 2ef517721..92329d392 100644
--- a/src/main/resources/i18n/strings_pt_BR.properties
+++ b/src/main/resources/i18n/strings_pt_BR.properties
@@ -13,8 +13,11 @@ generic.button.done=Concluído
generic.button.next=Próximo
generic.button.print=Imprimir
## Error
-generic.error.title=Ocorreu um erro inesperado
-generic.error.instruction=Isso não deveria ter ocorrido. Por favor, reporte o texto do erro abaixo e inclua uma descrição dos passos que levaram a este erro.
+generic.error.title=Erro %s
+generic.error.instruction=Oops! Cryptomator não esperava que isso acontecesse. Você pode procurar soluções existentes para este erro. Ou se isso ainda não foi reportado, fique à vontade para fazê-lo.
+generic.error.hyperlink.lookup=Procure este erro
+generic.error.hyperlink.report=Reportar este erro
+generic.error.technicalDetails=Detalhes:
# Defaults
defaults.vault.vaultName=Cofre
@@ -95,7 +98,7 @@ forgetPassword.information=Isso removerá a senha salva deste cofre do chaveiro
forgetPassword.confirmBtn=Esquecer Senha
# Unlock
-unlock.title=Desbloquear Cofre
+unlock.title=Desbloquear "%s"
unlock.passwordPrompt=Digite a senha para "%s":
unlock.savePassword=Lembrar Senha
unlock.unlockBtn=Desbloquear
@@ -130,7 +133,7 @@ migration.start.confirm=Sim, meu cofre está completamente sincronizado
migration.run.enterPassword=Digite a senha para "%s"
migration.run.startMigrationBtn=Migrar Cofre
migration.run.progressHint=Isso pode levar algum tempo…
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" migrado com sucesso.\nVocê agora pode desbloquear este cofre.
migration.success.unlockNow=Desbloquear Agora
## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=O cofre não pode ser migrado automaticamente porque
migration.impossible.moreInfo=O cofre ainda pode ser aberto com uma versão mais antiga. Para instruções sobre como migrar um cofre manualmente, visite
# Health Check
-health.title=Verificar Saúde do Cofre
-health.start.introduction=A Verificação de Saúde do Cofre contempla um conjunto de validações para detectar e possivelmente corrigir problemas na estrutura interna do seu cofre. Atenção, pois nem todos os problemas podem ser corrigidos. Você precisa da senha do cofre para realizar as verificações.
-health.start.configValid=A leitura e a interpretação do arquivo de configuração do cofre foi realizada com sucesso. Prossiga com a seleção das verificações a realizar.
-health.start.configInvalid=Foi encontrado um erro ao ler e interpretar o arquivo de configuração do cofre.
-health.checkList.header=Verificações de Saúde Disponíveis
-health.checkList.selectAllBox=Selecionar Todas
+## Start
+health.title=Exame de saúde de "%s"
+health.intro.header=Status de saúde
+health.intro.text=O Health Check é uma coleção de verificações para detectar e possivelmente corrigir problemas na estrutura interna do seu cofre. Lembre-se de:
+health.intro.remarkSync=Certifique-se de que todos os dispositivos estejam completamente sincronizados, isso resolve a maioria dos problemas.
+health.intro.remarkFix=Nem todos os problemas podem ser corrigidos.
+health.intro.remarkBackup=Se os dados estiverem corrompidos, apenas um backup poderá ajudar.
+health.intro.affirmation=Eu li e entendi a informação acima
+## Start Failure
+health.fail.header=Erro ao carregar configuração do Cofre
+health.fail.ioError=Ocorreu um erro ao acessar e ler o arquivo de configuração.
+health.fail.parseError=Ocorreu um erro ao analisar a configuração do cofre.
+health.fail.moreInfo=Mais informações
+## Check Selection
+health.checkList.description=Selecione as verificações na lista esquerda ou use os botões abaixo.
+health.checkList.selectAllButton=Selecionar Todas as Verificações
+health.checkList.deselectAllButton=Desfazer seleção de todas as planilhas
health.check.runBatchBtn=Executar as Verificações Selecionadas
## Detail view
health.check.detail.noSelectedCheck=Para obter os resultados, selecione uma verificação de saúde completada na lista à esquerda.
-health.check.detail.header=Resultados de %s
-health.check.detail.taskNotStarted=A verificação de saúde não foi selecionada para ser realizada.
-health.check.detail.taskScheduled=A verificação de saúde do cofre está agendada.
-health.check.detail.taskRunning=A verificação de saúde do cofre está em execução...
-health.check.detail.taskSucceeded=A verificação de saúde do cofre foi concluída com sucesso após %d milissegundos.
-health.check.detail.taskFailed=A verificação de saúde do cofre foi encerrada devido a um erro.
-health.check.detail.taskCancelled=A verificação de saúde do cofre foi cancelada.
-health.check.detail.problemCount=Foram encontrados %d problemas e %d erros irreparáveis.
+health.check.detail.checkScheduled=A verificação está programada.
+health.check.detail.checkRunning=A verificação está atualmente em execução…
+health.check.detail.checkSkipped=A verificação não foi selecionada para ser executada.
+health.check.detail.checkFinished=A verificação foi concluída com sucesso.
+health.check.detail.checkFinishedAndFound=A verificação terminou em execução. Por favor, reveja os resultados.
+health.check.detail.checkFailed=A verificação foi encerrada devido a um erro.
+health.check.detail.checkCancelled=A verificação foi cancelada.
health.check.exportBtn=Exportar Relatório
-health.check.fixBtn=Corrigir
-## Checks
-health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Verificação de Diretório
+## Fix Application
+health.fix.fixBtn=Corrigir
+health.fix.successTip=Consertado com sucesso
+health.fix.failTip=Falha na correção, consulte o log para obter detalhes
# Preferences
preferences.title=Preferências
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Ativar log de debug
preferences.general.debugDirectory=Mostrar arquivos de log
preferences.general.autoStart=Iniciar o Cryptomator durante inicialização do sistema
preferences.general.keychainBackend=Armazenar senhas no
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Keyring do Gnome
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=Carteira KDE
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=Keychain Access do macOS
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Proteção de Dados do Windows
preferences.general.interfaceOrientation=Orientação da interface
preferences.general.interfaceOrientation.ltr=Da esquerda para a direita
preferences.general.interfaceOrientation.rtl=Da direita para a esquerda
@@ -289,6 +299,10 @@ main.vaultDetail.missing.changeLocation=Alterar Localização do Cofre…
### Needs Migration
main.vaultDetail.migrateButton=Atualizar Cofre
main.vaultDetail.migratePrompt=Seu cofre precisa ser atualizado para um novo formato antes de poder acessá-lo
+### Error
+main.vaultDetail.error.info=Ocorreu um erro ao carregar o cofre do disco.
+main.vaultDetail.error.reload=Recarregar
+main.vaultDetail.error.windowTitle=Erro ao carregar cofre
# Wrong File Alert
wrongFileAlert.title=Como Encriptar Arquivos
@@ -304,12 +318,15 @@ wrongFileAlert.link=Para obter assistência, visite
## General
vaultOptions.general=Geral
vaultOptions.general.vaultName=Nome do Cofre
+vaultOptions.general.autoLock.lockAfterTimePart1=Bloquear quando inativo por
+vaultOptions.general.autoLock.lockAfterTimePart2=minutos
vaultOptions.general.unlockAfterStartup=Desbloqueie o cofre ao iniciar o Cryptomator
vaultOptions.general.actionAfterUnlock=Após desbloquear com sucesso
vaultOptions.general.actionAfterUnlock.ignore=Não fazer nada
vaultOptions.general.actionAfterUnlock.reveal=Revelar Volume
vaultOptions.general.actionAfterUnlock.ask=Perguntar
-vaultOptions.general.healthBtn=Iniciar Verificação de Saúde do Cofre
+vaultOptions.general.startHealthCheckBtn=Iniciar Exame de Saúde
+
## Mount
vaultOptions.mount=Montagem
vaultOptions.mount.readonly=Somente Leitura
@@ -325,13 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Escolha um diretório vazio
vaultOptions.masterkey=Senha
vaultOptions.masterkey.changePasswordBtn=Alterar Senha
vaultOptions.masterkey.forgetSavedPasswordBtn=Esquecer a senha salva
-vaultOptions.masterkey.recoveryKeyExpanation=Se você perder a sua senha, a única forma de restaurar acesso a um cofre é através de uma chave de recuperação.
+vaultOptions.masterkey.recoveryKeyExplanation=Se você perder a sua senha, a única forma de restaurar acesso a um cofre é através de uma chave de recuperação.
vaultOptions.masterkey.showRecoveryKeyBtn=Exibir chave de recuperação
vaultOptions.masterkey.recoverPasswordBtn=Recuperar Senha
-## Auto Lock
-vaultOptions.autoLock=Bloqueio automático
-vaultOptions.autoLock.lockAfterTimePart1=Bloquear quando inativo por
-vaultOptions.autoLock.lockAfterTimePart2=minutos
+
# Recovery Key
recoveryKey.title=Chave de recuperação
diff --git a/src/main/resources/i18n/strings_ro.properties b/src/main/resources/i18n/strings_ro.properties
index 64ead470d..064bcfdc2 100644
--- a/src/main/resources/i18n/strings_ro.properties
+++ b/src/main/resources/i18n/strings_ro.properties
@@ -2,82 +2,364 @@
# Generics
## Button
+generic.button.apply=Aplică
+generic.button.back=Înapoi
+generic.button.cancel=Anulează
+generic.button.change=Modifică
+generic.button.close=Închide
+generic.button.copy=Copiază
+generic.button.copied=Copiat!
+generic.button.done=Terminat
+generic.button.next=Următorul
+generic.button.print=Tipărește
## Error
# Defaults
+defaults.vault.vaultName=Seif
# Tray Menu
+traymenu.showMainWindow=Afișează
+traymenu.showPreferencesWindow=Preferințe
+traymenu.lockAllVaults=Blochează toate
+traymenu.quitApplication=Ieșire
+traymenu.vault.unlock=Deblocați
+traymenu.vault.lock=Blocaţi
+traymenu.vault.reveal=Afişare
# Add Vault Wizard
+addvaultwizard.title=Adaugă un seif
## Welcome
+addvaultwizard.welcome.newButton=Creează seif nou
+addvaultwizard.welcome.existingButton=Deschide un seif existent
## New
### Name
+addvaultwizard.new.nameInstruction=Alege un nume pentru seif
+addvaultwizard.new.namePrompt=Nume seif
### Location
+addvaultwizard.new.locationInstruction=Unde ar trebui ca Cryptomator să stocheze fișierele criptate din seiful dumneavoastră?
+addvaultwizard.new.locationLabel=Locație stocare
+addvaultwizard.new.locationPrompt=…
+addvaultwizard.new.directoryPickerLabel=Locație personalizată
+addvaultwizard.new.directoryPickerButton=Alege…
+addvaultwizard.new.directoryPickerTitle=Alege Dosar
+addvaultwizard.new.fileAlreadyExists=Există deja un fișier sau un dosar cu numele seifului
+addvaultwizard.new.locationDoesNotExist=Dosarul în calea specificată nu există sau nu poate fi accesat
+addvaultwizard.new.locationIsNotWritable=Nu există acces la scriere la calea specificată
+addvaultwizard.new.locationIsOk=Locația potrivită pentru seiful dumneavoastră
+addvaultwizard.new.invalidName=Nume seif invalid. Vă rugăm sa luați în considerare un nume de dosar obișnuit.
### Password
+addvaultwizard.new.createVaultBtn=Crează seif
+addvaultwizard.new.generateRecoveryKeyChoice=Nu veți putea accesa datele dvs. fără parolă. Doriți o cheie de recuperare pentru cazul în care vă pierdeți parola?
+addvaultwizard.new.generateRecoveryKeyChoice.yes=Da, vă rog, mai bine sigur decât rău
+addvaultwizard.new.generateRecoveryKeyChoice.no=Nu, mulțumesc, nu îmi voi pierde parola
### Information
+addvault.new.readme.storageLocation.fileName=IMPORTANT.rtf
+addvault.new.readme.storageLocation.1=⚠️ FIȘIERE SEIF ⚠️
+addvault.new.readme.storageLocation.2=Aceasta este locația de stocare a seifului dvs.
+addvault.new.readme.storageLocation.3=Să NU
+addvault.new.readme.storageLocation.4=• modificați fișierele din acest dosar sau
+addvault.new.readme.storageLocation.5=• inserați fișiere destinate criptării în acest director.
+addvault.new.readme.storageLocation.6=Dacă doriți să criptați fișierele și să vizualizați conținutul seifului, faceți următoarele:
+addvault.new.readme.storageLocation.7=1. Adăugați acest seif la Cryptomator.
+addvault.new.readme.storageLocation.8=2. Deblocați seiful în Cryptomator.
+addvault.new.readme.storageLocation.9=3. Deschideți locația de acces făcând clic pe butonul "Reveal".
+addvault.new.readme.storageLocation.10=Dacă aveți nevoie de ajutor, vizitați documentația: %s
+addvault.new.readme.accessLocation.fileName=BINEATIVENIT.rtf
+addvault.new.readme.accessLocation.1=🔐️ UNITATE CRIPTATĂ 🔐️
+addvault.new.readme.accessLocation.2=Aceasta este locația de acces a seifului dvs.
+addvault.new.readme.accessLocation.3=Orice fișier adăugat la acest volum va fi criptat de către Cryptomator. Puteți lucra la el ca pe orice altă unitate/folder. Aceasta este doar o vizualizare decriptată a conținutului său, fișierele sunt criptate tot timpul pe hard disk-ul tău.
+addvault.new.readme.accessLocation.4=Puteți să ștergeți acest fișier.
## Existing
+addvaultwizard.existing.instruction=Alegeți fișierul "masterkey.cryptomator" din seiful dvs. existent.
+addvaultwizard.existing.chooseBtn=Alege…
+addvaultwizard.existing.filePickerTitle=Selectaţi fişierul Masterkey
## Success
+addvaultwizard.success.nextStepsInstructions=Seiful "%s" a fost adăugat.\nTrebuie să deblocați acest seif pentru a accesa sau adăuga conținut. Alternativ, îl puteți debloca în orice moment ulterior.
+addvaultwizard.success.unlockNow=Deblochează acum
# Remove Vault
+removeVault.title=Eliminați seiful
+removeVault.information=Acest lucru va face Cryptomator să uite de acest seif. Îl puteţi adăuga din nou mai târziu. Nici un fişier criptat nu va fi şters din hard disk-ul dvs.
+removeVault.confirmBtn=Eliminați seiful
# Change Password
+changepassword.title=Schimbați parola
+changepassword.enterOldPassword=Introduceți parola curentă pentru "%s"
+changepassword.finalConfirmation=Înțeleg că nu voi putea accesa datele mele dacă îmi uit parola
# Forget Password
+forgetPassword.title=Parolă uitată
+forgetPassword.information=Această acțiune va șterge parola salvată a acestui seif din keychain-ul sistemului de operare.
+forgetPassword.confirmBtn=Parolă uitată
# Unlock
+unlock.title=Deblocare "%s"
+unlock.passwordPrompt=Introduceți parola pentru "%s":
+unlock.savePassword=Memorează parola
+unlock.unlockBtn=Deblocați
##
+unlock.chooseMasterkey.prompt=Nu s-a putut găsi fișierul masterkey pentru acest seif la locația așteptată. Vă rugăm să alegeți manual fișierul cheie.
+unlock.chooseMasterkey.filePickerTitle=Selectaţi fişierul Masterkey
## Success
+unlock.success.message=Deblocat "%s" cu succes! Seiful dvs. este acum accesibil prin unitatea sa virtuală.
+unlock.success.rememberChoice=Ține minte alegerea, nu mai arăta asta din nou
+unlock.success.revealBtn=Dezvăluie unitatea
## Failure
+unlock.error.heading=Imposibil de deblocat seiful
### Invalid Mount Point
+unlock.error.invalidMountPoint.notExisting=Punctul de montare "%s" nu este un dosar, nu este gol sau nu există.
+unlock.error.invalidMountPoint.existing=Punctul de montare "%s" există deja sau dosarul părinte lipsește.
# Lock
## Force
+lock.forced.heading=Blocarea elegantă a eșuat
+lock.forced.message=Blocarea "%s" a fost blocată de operațiile în așteptare sau de fișierele deschise. Puteți forța blocarea acestui seif, dar întreruperea I/O poate duce la pierderea datelor nesalvate.
+lock.forced.confirmBtn=Forțați blocarea
## Failure
+lock.fail.heading=Blocarea seifului a eșuat.
+lock.fail.message=Seiful "%s" nu a putut fi blocat. Asigurați-vă că lucrările nesalvate sunt salvate altundeva și că operațiunile importante de citire/scriere sunt terminate. Pentru a închide seiful omoară procesul Cryptomator.
# Migration
+migration.title=Îmbunătățește seiful
## Start
+migration.start.prompt=Seiful dvs. "%s" trebuie să fie actualizat la un format mai nou. Înainte de a continua, asigurați-vă că nu există sincronizare în așteptare care să afecteze acest seif.
+migration.start.confirm=Da, seiful meu este complet sincronizat
## Run
-## Sucess
+migration.run.enterPassword=Introduceți parola pentru "%s"
+migration.run.startMigrationBtn=Migrează seiful
+migration.run.progressHint=Acest lucru poate dura ceva timp…
+## Success
+migration.success.nextStepsInstructions=Seiful "%s" a fost migrat cu succes.\nAcum puteți debloca seiful dvs.
+migration.success.unlockNow=Deblochează acum
## Missing file system capabilities
+migration.error.missingFileSystemCapabilities.title=Tip de fișier nesuportat
+migration.error.missingFileSystemCapabilities.description=Migrarea nu a fost pornită, deoarece seiful dvs. este localizat pe un sistem de fișiere necorespunzător.
+migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Sistemul de fişiere nu acceptă nume de fişiere lungi.
+migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Sistemul de fișiere nu suportă căi lungi.
+migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Sistemul de fișiere nu permite citirea.
+migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Sistemul de fişiere nu permite scrierea.
## Impossible
+migration.impossible.heading=Imposibil de migrat seiful
+migration.impossible.reason=Seiful nu poate fi migrat automat deoarece locația sa de stocare sau punctul de acces nu este compatibilă.
+migration.impossible.moreInfo=Seiful poate fi deschis în continuare cu o versiune mai veche. Pentru instrucţiuni despre cum să migraţi manual un seif, vizitaţi
# Health Check
+## Start
+health.title=Verificarea de sănătate a "%s"
+health.intro.header=Verificarea stării de sănătate
+health.intro.text=Verificarea stării de sănătate este o colecție de verificări pentru a detecta și eventual a remedia problemele din structura internă a seifului. Vă rugăm să țineți cont de:
+health.intro.remarkSync=Asigură că toate dispozitivele sunt complet sincronizate, acest lucru rezolvă majoritatea problemelor.
+health.intro.remarkFix=Nu toate problemele pot fi rezolvate.
+health.intro.remarkBackup=În cazul în care datele sunt corupte, numai o copie de rezervă poate ajuta.
+health.intro.affirmation=Am citit și am înțeles informațiile de mai sus
+## Start Failure
+health.fail.header=Eroare la încărcarea configurației seifului
+health.fail.ioError=A apărut o eroare la accesarea și citirea fișierului de configurare.
+health.fail.parseError=S-a produs o eroare la analizarea configurației seifului.
+health.fail.moreInfo=Mai multe informații
+## Check Selection
+health.checkList.description=Selectați verificări în lista din stânga sau folosiți butoanele de mai jos.
+health.checkList.selectAllButton=Selectați toate verificările
+health.checkList.deselectAllButton=Deselectați toate verificările
+health.check.runBatchBtn=Execută verificările selectate
## Detail view
-## Checks
+health.check.detail.noSelectedCheck=Pentru rezultate, selectaţi o verificare de sănătate finalizată în lista din stânga.
+health.check.detail.checkScheduled=Verificarea este programată.
+health.check.detail.checkRunning=Verificarea se execută la moment…
+health.check.detail.checkSkipped=Verificarea nu a fost selectată pentru a rula.
+health.check.detail.checkFinished=Verificarea s-a terminat cu succes.
+health.check.detail.checkFinishedAndFound=Verificarea s-a terminat. Vă rugăm să examinați rezultatele.
+health.check.detail.checkFailed=Verificarea a ieșit din cauza unei erori.
+health.check.detail.checkCancelled=Verificarea a fost anulată.
+health.check.exportBtn=Exportare raport
+## Fix Application
+health.fix.fixBtn=Repară
+health.fix.successTip=Remediere reușită
+health.fix.failTip=Remediere eșuată, vezi jurnalul pentru detalii
# Preferences
+preferences.title=Preferințe
## General
+preferences.general=Setări Generale
+preferences.general.theme=Aspect
+preferences.general.theme.automatic=Automat
+preferences.general.theme.light=Luminos
+preferences.general.theme.dark=Întunecat
+preferences.general.unlockThemes=Deblochează modul întunecat
+preferences.general.showMinimizeButton=Afișează butonul de minimizare
+preferences.general.showTrayIcon=Arată tray icon (necesită repornire)
+preferences.general.startHidden=Ascunde fereastra la pornirea Cryptomator
+preferences.general.debugLogging=Activează jurnalul de depanare
+preferences.general.debugDirectory=Dezvăluie fişierele jurnal
+preferences.general.autoStart=Lansați Cryptomator la pornirea sistemului
+preferences.general.keychainBackend=Salvează parolele cu
+preferences.general.interfaceOrientation=Orientarea interfeței
+preferences.general.interfaceOrientation.ltr=De la stânga la dreapta
+preferences.general.interfaceOrientation.rtl=De la dreapta la stânga
## Volume
+preferences.volume=Unitate virtuală
+preferences.volume.type=Tip volum
+preferences.volume.webdav.port=Port WebDAV
+preferences.volume.webdav.scheme=Schema WebDAV
## Updates
+preferences.updates=Actualizări
+preferences.updates.currentVersion=Versiunea actuală: %s
+preferences.updates.autoUpdateCheck=Verificare automată actualizări
+preferences.updates.checkNowBtn=Verifică acum
+preferences.updates.updateAvailable=Actualizare la versiunea %s disponibilă.
## Contribution
+preferences.contribute=Susțineți-ne
+preferences.contribute.registeredFor=Certificat de suporter înregistrat pentru %s
+preferences.contribute.noCertificate=Susțineți Cryptomator și primiți un certificat de suport. E ca o cheie de licență dar pentru persoanele minunate care folosesc software gratuit. ;-)
+preferences.contribute.getCertificate=Nu aveți deja unul? Aflați cum îl puteți obține.
+preferences.contribute.promptText=Lipiți codul certificatului de suporter aici
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
+preferences.about=Despre
# Vault Statistics
+stats.title=Statistici pentru %s
+stats.cacheHitRate=Rata de control cache
## Read
+stats.read.throughput.idle=Citire: inactiv
+stats.read.throughput.kibs=Citire: %.2f kiB/s
+stats.read.throughput.mibs=Citire: %.2f MiB/s
+stats.read.total.data.none=Date citite: -
+stats.read.total.data.kib=Date citite: %.1f kiB
+stats.read.total.data.mib=Date citite: %.1f MiB
+stats.read.total.data.gib=Date citite: %.1f GiB
+stats.decr.total.data.none=Date decriptate: -
+stats.decr.total.data.kib=Date decriptate: %.1f kiB
+stats.decr.total.data.mib=Date decriptate: %.1f MiB
+stats.decr.total.data.gib=Date decriptate: %.1f GiB
+stats.read.accessCount=Total citit: %d
## Write
+stats.write.throughput.idle=Scriere: inactiv
+stats.write.throughput.kibs=Scrie: %.2f kiB/s
+stats.write.throughput.mibs=Scrie: %.2f MiB/s
+stats.write.total.data.none=Date scrise: -
+stats.write.total.data.kib=Date scrise: %.1f kiB
+stats.write.total.data.mib=Date scrise: %.1f MiB
+stats.write.total.data.gib=Date scrise: %.1f GiB
+stats.encr.total.data.none=Date criptate: -
+stats.encr.total.data.kib=Date criptate: %.1f kiB
+stats.encr.total.data.mib=Date criptate: %.1f MiB
+stats.encr.total.data.gib=Date criptate: %.1f GiB
+stats.write.accessCount=Total scrieri: %d
# Main Window
+main.closeBtn.tooltip=Închide
+main.minimizeBtn.tooltip=Minimizează
+main.preferencesBtn.tooltip=Preferințe
+main.debugModeEnabled.tooltip=Modul de depanare este activat
+main.donationKeyMissing.tooltip=Vă rugăm să luați în considerare o donație
## Drag 'n' Drop
+main.dropZone.dropVault=Adaugă acest seif
+main.dropZone.unknownDragboardContent=Dacă doriţi să adăugaţi un seif, trageţi-l în această fereastră
## Vault List
+main.vaultlist.emptyList.onboardingInstruction=Faceți clic aici pentru a adăuga un seif
+main.vaultlist.contextMenu.remove=Elimină…
+main.vaultlist.contextMenu.lock=Blocaţi
+main.vaultlist.contextMenu.unlock=Deblochează…
+main.vaultlist.contextMenu.unlockNow=Deblochează acum
+main.vaultlist.contextMenu.vaultoptions=Arată opțiunile seifului
+main.vaultlist.contextMenu.reveal=Dezvăluie unitatea
+main.vaultlist.addVaultBtn=Adaugă un seif
## Vault Detail
### Welcome
+main.vaultDetail.welcomeOnboarding=Vă mulțumim că ați ales Cryptomator pentru a vă proteja fișierele. Dacă aveți nevoie de asistență, verificați ghidurile noastre de pornire:
### Locked
+main.vaultDetail.lockedStatus=BLOCAT
+main.vaultDetail.unlockBtn=Deblochează…
+main.vaultDetail.unlockNowBtn=Deblochează acum
+main.vaultDetail.optionsBtn=Opțiuni seif
+main.vaultDetail.passwordSavedInKeychain=Parola a fost salvată
### Unlocked
+main.vaultDetail.unlockedStatus=DEBLOCAT
+main.vaultDetail.accessLocation=Conținutul seifului tău este accesibil aici:
+main.vaultDetail.revealBtn=Dezvăluie unitatea
+main.vaultDetail.lockBtn=Blocaţi
+main.vaultDetail.bytesPerSecondRead=Citire:
+main.vaultDetail.bytesPerSecondWritten=Scriere:
+main.vaultDetail.throughput.idle=inactiv
+main.vaultDetail.throughput.kbps=%.1f kiB/s
+main.vaultDetail.throughput.mbps=%.1f MiB/s
+main.vaultDetail.stats=Statistici de seif
### Missing
+main.vaultDetail.missing.info=Cryptomator nu a putut găsi un seif pe această cale.
+main.vaultDetail.missing.recheck=Verifică din nou
+main.vaultDetail.missing.remove=Eliminați din lista de seifuri…
+main.vaultDetail.missing.changeLocation=Schimbați locația seifului…
### Needs Migration
+main.vaultDetail.migrateButton=Îmbunătățește seiful
+main.vaultDetail.migratePrompt=Înainte de a-l putea accesa, seiful dumneavoastră trebuie actualizat la format nou
+### Error
# Wrong File Alert
+wrongFileAlert.title=Cum să criptați fișierele
+wrongFileAlert.header.title=Ați încercat să criptați aceste fișiere?
+wrongFileAlert.header.lead=În acest scop, Cryptomator oferă un volum în managerul de fișiere al sistemului dumneavoastră.
+wrongFileAlert.instruction.0=Pentru a cripta fișierele, urmați acești pași:
+wrongFileAlert.instruction.1=1. Deblocați seiful dvs.
+wrongFileAlert.instruction.2=2. Apăsați pe butonul "Afişare" pentru a deschide volumul în managerul de fișiere.
+wrongFileAlert.instruction.3=3. Adăugați fişierele la acest volum.
+wrongFileAlert.link=Pentru asistență suplimentară, vizitați
# Vault Options
## General
+vaultOptions.general=Setări Generale
+vaultOptions.general.vaultName=Nume seif
+vaultOptions.general.autoLock.lockAfterTimePart1=Blocare când inactiv pentru
+vaultOptions.general.autoLock.lockAfterTimePart2=minute
+vaultOptions.general.unlockAfterStartup=Deblochează seiful la pornirea Cryptomator
+vaultOptions.general.actionAfterUnlock=După deblocarea cu succes
+vaultOptions.general.actionAfterUnlock.ignore=Nu fă nimic
+vaultOptions.general.actionAfterUnlock.reveal=Dezvăluie unitatea
+vaultOptions.general.actionAfterUnlock.ask=Întreabă
+vaultOptions.general.startHealthCheckBtn=Începe verificarea de sănătate
+
## Mount
+vaultOptions.mount=Montare
+vaultOptions.mount.readonly=Doar citire
+vaultOptions.mount.customMountFlags=Atribute de montare personalizate
+vaultOptions.mount.winDriveLetterOccupied=ocupat
+vaultOptions.mount.mountPoint=Punct de montare
+vaultOptions.mount.mountPoint.auto=Alegeţi automat o locaţie potrivită
+vaultOptions.mount.mountPoint.driveLetter=Utilizați litera de unitate atribuită
+vaultOptions.mount.mountPoint.custom=Cale personalizată
+vaultOptions.mount.mountPoint.directoryPickerButton=Alege…
+vaultOptions.mount.mountPoint.directoryPickerTitle=Alegeți un dosar gol
## Master Key
-## Auto Lock
+vaultOptions.masterkey=Parolă
+vaultOptions.masterkey.changePasswordBtn=Schimbați parola
+vaultOptions.masterkey.forgetSavedPasswordBtn=Parolă salvată uitată
+vaultOptions.masterkey.recoveryKeyExplanation=O cheie de recuperare este singurul mijloc de a restabili accesul la un seif în caz că vă pierdeți parola.
+vaultOptions.masterkey.showRecoveryKeyBtn=Afișează cheia de recuperare
+vaultOptions.masterkey.recoverPasswordBtn=Recuperează parola
+
# Recovery Key
+recoveryKey.title=Cheia de recuperare
+recoveryKey.enterPassword.prompt=Introduceți parola pentru a afișa cheia de recuperare pentru "%s:
+recoveryKey.display.message=Următoarea cheie de recuperare poate fi folosită pentru a restabili accesul la "%s":
+recoveryKey.display.StorageHints=Păstrați cheia de recuperare undeva foarte sigur, de ex.\n • Păstrați-o folosind un manager de parole\n • Salvați-o pe un flash USB stick\n • Imprimați-o pe hârtie
+recoveryKey.recover.prompt=Introduceți cheia de recuperare pentru "%s:
+recoveryKey.recover.validKey=Aceasta este o cheie de recuperare validă
+recoveryKey.printout.heading=Cheia de recuperare Cryptomator\n"%s"\n
# New Password
+newPassword.promptText=Introduceți o parolă nouă
+newPassword.reenterPassword=Confirmaţi noua parolă
+newPassword.passwordsMatch=Parolele corespund!
+newPassword.passwordsDoNotMatch=Parolele nu corespund
+passwordStrength.messageLabel.tooShort=Folosiți cel puțin %d caractere
+passwordStrength.messageLabel.0=Foarte slabă
+passwordStrength.messageLabel.1=Slabă
+passwordStrength.messageLabel.2=Acceptabilă
+passwordStrength.messageLabel.3=Puternică
+passwordStrength.messageLabel.4=Foarte puternică
# Quit
+quit.prompt=Părăsiți aplicația? Există seifuri deblocate.
+quit.lockAndQuit=Blocați și ieșiți
diff --git a/src/main/resources/i18n/strings_ru.properties b/src/main/resources/i18n/strings_ru.properties
index cf1387235..5b534159b 100644
--- a/src/main/resources/i18n/strings_ru.properties
+++ b/src/main/resources/i18n/strings_ru.properties
@@ -13,8 +13,11 @@ generic.button.done=Готово
generic.button.next=Далее
generic.button.print=Печать
## Error
-generic.error.title=Неизвестная ошибка
-generic.error.instruction=Этого не должно было произойти. Создайте отчёт об ошибке ниже и опишите, какие шаги к ней привели.
+generic.error.title=Ошибка: %s
+generic.error.instruction=Произошла непредвиденная ситуация. Попробуйте найти уже имеющиеся решения этой ошибки. Если об этой ошибке ещё не сообщали, то сделайте это.
+generic.error.hyperlink.lookup=Найти ошибку
+generic.error.hyperlink.report=Сообщить об ошибке
+generic.error.technicalDetails=Подробности:
# Defaults
defaults.vault.vaultName=Хранилище
@@ -41,7 +44,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=Файл или папка с именем хранилища уже существует
@@ -51,7 +54,7 @@ addvaultwizard.new.locationIsOk=Подходящее расположение д
addvaultwizard.new.invalidName=Неверное имя хранилища. Укажите корректное имя папки.
### Password
addvaultwizard.new.createVaultBtn=Создать хранилище
-addvaultwizard.new.generateRecoveryKeyChoice=Вы не сможете получить доступ к своим данным без пароля. Хотите создать ключ для восстановления на случай потери пароля?
+addvaultwizard.new.generateRecoveryKeyChoice=Вы не сможете получить доступ к своим данным без пароля. Хотите создать ключ для восстановления на случай утери пароля?
addvaultwizard.new.generateRecoveryKeyChoice.yes=Да, лучше предостеречься, чем потом жалеть
addvaultwizard.new.generateRecoveryKeyChoice.no=Нет, спасибо, я не потеряю пароль
### Information
@@ -69,7 +72,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" от имеющегося хранилища.
@@ -87,7 +90,7 @@ removeVault.confirmBtn=Удалить хранилище
# Change Password
changepassword.title=Изменить пароль
changepassword.enterOldPassword=Введите текущий пароль для "%s"
-changepassword.finalConfirmation=Я понимаю, что не смогу получить доступ к своим данным, если забуду пароль
+changepassword.finalConfirmation=Я понимаю, что не смогу получить доступ к данным, если забуду пароль
# Forget Password
forgetPassword.title=Не помню пароль
@@ -95,12 +98,12 @@ forgetPassword.information=Сохранённый пароль от этого
forgetPassword.confirmBtn=Не помню пароль
# Unlock
-unlock.title=Разблокировать хранилище
+unlock.title=Разблокировать "%s"
unlock.passwordPrompt=Введите пароль для "%s"
unlock.savePassword=Запомнить пароль
unlock.unlockBtn=Разблокировать
##
-unlock.chooseMasterkey.prompt=Не удалось найти файл masterkey для этого хранилища в ожидаемом месте. Выберите ключевой файл вручную.
+unlock.chooseMasterkey.prompt=Не удалось найти файл MasterKey для этого хранилища в ожидаемом месте. Выберите ключевой файл вручную.
unlock.chooseMasterkey.filePickerTitle=Выберите файл MasterKey
## Success
unlock.success.message=Разблокировка "%s" успешно выполнена! Доступ в хранилище открыт через его виртуальный диск.
@@ -114,7 +117,7 @@ unlock.error.invalidMountPoint.existing=Точка монтирования %s
# Lock
## Force
-lock.forced.heading=Не удалось выполнить мягкую блокировку
+lock.forced.heading=Ошибка мягкой блокировки
lock.forced.message=Блокировка "%s" невозможна из-за незавершённых операций или открытых файлов. Вы можете заблокировать это хранилище принудительно, однако прерывание ввода-вывода может привести к потере несохранённых данных.
lock.forced.confirmBtn=Принудительная блокировка
## Failure
@@ -124,13 +127,13 @@ lock.fail.message=Хранилище "%s" не удалось заблокиро
# Migration
migration.title=Обновить хранилище
## Start
-migration.start.prompt=Хранилище "%s" нужно преобразовать в более новый формат. Прежде чем продолжить, убедитесь, что нет отложенной синхронизации, которая может повлиять на хранилище.
+migration.start.prompt=Хранилище "%s" нужно преобразовать в новый формат. Прежде чем продолжить, убедитесь, что нет отложенной синхронизации, которая может повлиять на хранилище.
migration.start.confirm=Да, моё хранилище полностью синхронизировано
## Run
migration.run.enterPassword=Введите пароль для "%s"
migration.run.startMigrationBtn=Перенести хранилище
migration.run.progressHint=Это может занять некоторое время…
-## Sucess
+## Success
migration.success.nextStepsInstructions=Перенос "%s" успешно выполнен.\nТеперь можно разблокировать хранилище.
migration.success.unlockNow=Разблокировать
## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=Хранилище не может быть пере
migration.impossible.moreInfo=Хранилище по-прежнему можно открыть в более старой версии. Чтобы узнать, как вручную перенести хранилище, посетите
# Health Check
-health.title=Проверка состояния хранилища
-health.start.introduction=Проверка состояния хранилища это набор проверок для обнаружения и устранения проблем во внутренней структуре хранилища. Обратите внимание, что не все проблемы исправимы. Для проверки необходим пароль хранилища.
-health.start.configValid=Файл конфигурации хранилища успешно прочитан и обработан. Переход к выбору проверок.
-health.start.configInvalid=Ошибка при чтении и разборе файла конфигурации хранилища.
-health.checkList.header=Доступные проверки состояния
-health.checkList.selectAllBox=Выбрать все
+## Start
+health.title=Проверка состояния "%s"
+health.intro.header=Проверка состояния
+health.intro.text=Проверка состояния это набор тестов для обнаружения и, возможно, исправления проблем во внутренней структуре хранилища. Помните:
+health.intro.remarkSync=Убедитесь, что все устройства полностью синхронизированы, это решает большинство проблем.
+health.intro.remarkFix=Не все проблемы могут быть исправлены.
+health.intro.remarkBackup=Если данные повреждены, помочь может только резервная копия.
+health.intro.affirmation=Информация выше мною прочитана и понятна
+## Start Failure
+health.fail.header=Ошибка при загрузке конфигурации хранилища
+health.fail.ioError=Ошибка при доступе и чтении конфигурационного файла.
+health.fail.parseError=Ошибка при разборе конфигурации хранилища.
+health.fail.moreInfo=Подробнее
+## Check Selection
+health.checkList.description=Выберите проверки в списке слева или используйте кнопки ниже.
+health.checkList.selectAllButton=Выбрать все проверки
+health.checkList.deselectAllButton=Отменить выбор всех проверок
health.check.runBatchBtn=Выполнить выбранные проверки
## Detail view
health.check.detail.noSelectedCheck=Для результатов выберите завершённую проверку состояния в списке слева.
-health.check.detail.header=Результаты: %s
-health.check.detail.taskNotStarted=Проверка не была выбрана для запуска.
-health.check.detail.taskScheduled=Проверка запланирована.
-health.check.detail.taskRunning=Проверка выполняется…
-health.check.detail.taskSucceeded=Проверка успешно завершена через %d мс.
-health.check.detail.taskFailed=Проверка завершилась из-за ошибки.
-health.check.detail.taskCancelled=Проверка была отменена.
-health.check.detail.problemCount=Проблем: %d. Неисправимых ошибок: %d.
+health.check.detail.checkScheduled=Проверка запланирована.
+health.check.detail.checkRunning=Проверка выполняется…
+health.check.detail.checkSkipped=Проверка не была выбрана для запуска.
+health.check.detail.checkFinished=Проверка успешно завершена.
+health.check.detail.checkFinishedAndFound=Проверка завершена. Ознакомьтесь с результатами.
+health.check.detail.checkFailed=Проверка прервана из-за ошибки.
+health.check.detail.checkCancelled=Проверка была отменена.
health.check.exportBtn=Экспорт отчёта
-health.check.fixBtn=Исправить
-## Checks
-health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Проверка папок
+## Fix Application
+health.fix.fixBtn=Исправить
+health.fix.successTip=Исправлено
+health.fix.failTip=Не исправлено, подробности в журнале
# Preferences
preferences.title=Настройки
@@ -177,17 +191,13 @@ preferences.general.theme.automatic=Автоматически
preferences.general.theme.light=Светлая
preferences.general.theme.dark=Тёмная
preferences.general.unlockThemes=Разблокировать тёмный режим
-preferences.general.showMinimizeButton=Показать кнопку сворачивания
-preferences.general.showTrayIcon=Показать значок в панели задач (требуется перезапуск)
+preferences.general.showMinimizeButton=Показывать кнопку сворачивания
+preferences.general.showTrayIcon=Показывать значок в панели задач (требуется перезапуск)
preferences.general.startHidden=Скрывать окно при запуске Cryptomator
preferences.general.debugLogging=Вести журнал отладки
preferences.general.debugDirectory=Показать файлы журнала
preferences.general.autoStart=Запускать Cryptomator при старте системы
preferences.general.keychainBackend=Хранение паролей
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Связка ключей Gnome
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=Хранилище ключей KDE
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=Доступ к связке ключей macOS
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Защита данных Windows
preferences.general.interfaceOrientation=Интерфейс
preferences.general.interfaceOrientation.ltr=Слева направо
preferences.general.interfaceOrientation.rtl=Справа налево
@@ -214,10 +224,10 @@ preferences.contribute.promptText=Вставьте сюда код сертиф
preferences.about=О программе
# Vault Statistics
-stats.title=Статистика по %s
+stats.title=Статистика: %s
stats.cacheHitRate=Частота попаданий кэша
## Read
-stats.read.throughput.idle=Чтение: бездействие
+stats.read.throughput.idle=Чтение: -
stats.read.throughput.kibs=Чтение: %.2f КиБ/с
stats.read.throughput.mibs=Чтение: %.2f МиБ/с
stats.read.total.data.none=Прочитано: -
@@ -228,12 +238,12 @@ stats.decr.total.data.none=Расшифровано: -
stats.decr.total.data.kib=Расшифровано: %.1f КиБ
stats.decr.total.data.mib=Расшифровано: %.1f МиБ
stats.decr.total.data.gib=Расшифровано: %.1f ГиБ
-stats.read.accessCount=Всего операций чтения: %d
+stats.read.accessCount=Всего чтений: %d
## Write
-stats.write.throughput.idle=Запись: бездействие
+stats.write.throughput.idle=Запись: -
stats.write.throughput.kibs=Запись: %.2f КиБ/с
stats.write.throughput.mibs=Запись: %.2f МиБ/с
-stats.write.total.data.none=Записано данных: -
+stats.write.total.data.none=Записано: -
stats.write.total.data.kib=Записано: %.1f КиБ
stats.write.total.data.mib=Записано: %.1f МиБ
stats.write.total.data.gib=Записано: %.1f ГиБ
@@ -241,7 +251,7 @@ stats.encr.total.data.none=Зашифровано: -
stats.encr.total.data.kib=Зашифровано: %.1f КиБ
stats.encr.total.data.mib=Зашифровано: %.1f МиБ
stats.encr.total.data.gib=Зашифровано: %.1f ГиБ
-stats.write.accessCount=Всего операций записи: %d
+stats.write.accessCount=Всего записей: %d
# Main Window
main.closeBtn.tooltip=Закрыть
@@ -289,6 +299,10 @@ main.vaultDetail.missing.changeLocation=Изменить расположени
### Needs Migration
main.vaultDetail.migrateButton=Обновить хранилище
main.vaultDetail.migratePrompt=Чтобы получить доступ к хранилищу, его нужно преобразовать в новый формат
+### Error
+main.vaultDetail.error.info=Произошла ошибка при загрузке хранилища с диска.
+main.vaultDetail.error.reload=Перезагрузить
+main.vaultDetail.error.windowTitle=Ошибка загрузки хранилища
# Wrong File Alert
wrongFileAlert.title=Как шифровать файлы
@@ -304,19 +318,22 @@ wrongFileAlert.link=Если нужна помощь, посетите
## General
vaultOptions.general=Общие
vaultOptions.general.vaultName=Имя хранилища
+vaultOptions.general.autoLock.lockAfterTimePart1=Блокировать при бездействии
+vaultOptions.general.autoLock.lockAfterTimePart2=мин
vaultOptions.general.unlockAfterStartup=Разблокировать хранилище при запуске Cryptomator
vaultOptions.general.actionAfterUnlock=После успешной разблокировки
vaultOptions.general.actionAfterUnlock.ignore=Ничего не делать
vaultOptions.general.actionAfterUnlock.reveal=Показать диск
vaultOptions.general.actionAfterUnlock.ask=Спрашивать
-vaultOptions.general.healthBtn=Начать проверку состояния
+vaultOptions.general.startHealthCheckBtn=Начать проверку состояния
+
## Mount
vaultOptions.mount=Монтирование
vaultOptions.mount.readonly=Только чтение
-vaultOptions.mount.customMountFlags=Свои флаги монтирования
+vaultOptions.mount.customMountFlags=Другие флаги монтирования
vaultOptions.mount.winDriveLetterOccupied=занято
vaultOptions.mount.mountPoint=Точка монтирования
-vaultOptions.mount.mountPoint.auto=Автоматически выбирать подходящее расположение
+vaultOptions.mount.mountPoint.auto=Автовыбор подходящего расположения
vaultOptions.mount.mountPoint.driveLetter=Использовать назначенную букву диска
vaultOptions.mount.mountPoint.custom=Свой путь
vaultOptions.mount.mountPoint.directoryPickerButton=Выбрать…
@@ -325,13 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Выберите пустую
vaultOptions.masterkey=Пароль
vaultOptions.masterkey.changePasswordBtn=Изменить пароль
vaultOptions.masterkey.forgetSavedPasswordBtn=Забыть сохранённый пароль
-vaultOptions.masterkey.recoveryKeyExpanation=Ключ восстановления - это единственный способ восстановить доступ к хранилищу при утере пароля.
+vaultOptions.masterkey.recoveryKeyExplanation=При утере пароля восстановить доступ к хранилищу можно только с помощью ключа восстановления.
vaultOptions.masterkey.showRecoveryKeyBtn=Показать ключ восстановления
vaultOptions.masterkey.recoverPasswordBtn=Восстановить пароль
-## Auto Lock
-vaultOptions.autoLock=Автоблок
-vaultOptions.autoLock.lockAfterTimePart1=Блокировать при бездействии
-vaultOptions.autoLock.lockAfterTimePart2=мин
+
# Recovery Key
recoveryKey.title=Ключ восстановления
diff --git a/src/main/resources/i18n/strings_sk.properties b/src/main/resources/i18n/strings_sk.properties
index 4c182ab94..aca55f2dd 100644
--- a/src/main/resources/i18n/strings_sk.properties
+++ b/src/main/resources/i18n/strings_sk.properties
@@ -13,8 +13,11 @@ generic.button.done=Hotovo
generic.button.next=Ďalej
generic.button.print=Tlač
## Error
-generic.error.title=Vyskytla sa neočakávaná chyba
-generic.error.instruction=Toto sa nemalo stať. Nahláste text chyby uvedený nižšie a uveďte popis krokov, ktoré viedli k tejto chybe.
+generic.error.title=Chyba %s
+generic.error.instruction=Ejha! Cryptomator toto neočakával. Môžte nahliadnuť do existujúcich riešení tejto chyby. Alebo v prípade že zatiaľ nebola nahlásená, môžte to slobodne urobiť.
+generic.error.hyperlink.lookup=Vyhľadať túto chybu
+generic.error.hyperlink.report=Nahlásiť túto chybu
+generic.error.technicalDetails=Podrobnosti:
# Defaults
defaults.vault.vaultName=Trezor
@@ -40,9 +43,14 @@ addvaultwizard.new.namePrompt=Názov trezoru
### Location
addvaultwizard.new.locationInstruction=Kde by mal Cryptomator uchovávať šifrované súbory vášho trezoru?
addvaultwizard.new.locationLabel=Umiestnenie úložiska
+addvaultwizard.new.locationPrompt=…
addvaultwizard.new.directoryPickerLabel=Vlastné umiestnenie
addvaultwizard.new.directoryPickerButton=Vybrať…
addvaultwizard.new.directoryPickerTitle=Vybrať adresár
+addvaultwizard.new.fileAlreadyExists=Súbor alebo adresár s menom trezoru už existuje
+addvaultwizard.new.locationDoesNotExist=Adresár na danej ceste neexistuje alebo nie je dostupný
+addvaultwizard.new.locationIsNotWritable=Nie je umožnený zápis na danej ceste
+addvaultwizard.new.locationIsOk=Vhodné umiestnenie pre Váš trezor
addvaultwizard.new.invalidName=Neplatný názov trezoru. Zvážte bežný názov adresára.
### Password
addvaultwizard.new.createVaultBtn=Vytvoriť trezor
@@ -90,18 +98,19 @@ forgetPassword.information=Týmto vymažete uložené heslo tohto trezoru z vá
forgetPassword.confirmBtn=Zabudnuté heslo
# Unlock
-unlock.title=Odomknúť trezor
+unlock.title=Odomknúť "%s"
unlock.passwordPrompt=Zadajte heslo pre "%s":
unlock.savePassword=Odomknúť.uložiťHeslo
unlock.unlockBtn=Odomknúť
##
-unlock.chooseMasterkey.prompt=Nemožno nájsť hlavný kľúčový súbor pre túto peňaženku na jej očakávanom mieste. Prosím zvoľte kľúčový súbor manuálne.
+unlock.chooseMasterkey.prompt=Nemožno nájsť hlavný kľúčový súbor pre tento trezor na jeho očakávanom mieste. Prosím zvoľte kľúčový súbor manuálne.
unlock.chooseMasterkey.filePickerTitle=Zvoľte hlavný kľúčový súbor
## Success
-unlock.success.message=Odomknutie "%s" úspešné! Vaša peňaženka je už prístupná cez jej virtuálny disk.
-unlock.success.revealBtn=Odkry disk
+unlock.success.message=Odomknutie "%s" úspešné! Váš trezor je už prístupný cez jeho virtuálny disk.
+unlock.success.rememberChoice=Zapamätať voľbu, už viac nezobrazovať
+unlock.success.revealBtn=Odkryť disk
## Failure
-unlock.error.heading=Nie je možné odomknúť účet
+unlock.error.heading=Nie je možné odomknúť trezor
### Invalid Mount Point
unlock.error.invalidMountPoint.notExisting=Bod pripojenia "%s" nie je adresár, nie je prázdny alebo neexistuje.
unlock.error.invalidMountPoint.existing=Bod pripojenia "%s" už existuje alebo chýba nadradený adresár.
@@ -109,55 +118,100 @@ unlock.error.invalidMountPoint.existing=Bod pripojenia "%s" už existuje alebo c
# Lock
## Force
lock.forced.heading=Bežné uzamknutie zlyhalo
-lock.forced.message=Zamknutie "%s" bolo zablokované prebiehajúcimi operáciami alebo otvorenými súbormi. Smiete vynútiť uzamknutie tejto peňaženky, ale prerušením I/O môže viesť k strate alebo neuloženiu dát.
+lock.forced.message=Zamknutie "%s" bolo zablokované prebiehajúcimi operáciami alebo otvorenými súbormi. Smiete vynútiť uzamknutie tohto trezoru, ale prerušením I/O môže viesť k strate alebo neuloženiu dát.
lock.forced.confirmBtn=Vynútené uzamknutie
## Failure
-lock.fail.heading=Uzatváranie peňaženky zlyhalo.
-lock.fail.message=Peňaženku "%s" nie je možné uzamknúť. Uistite sa že neuložená páca je uložená inde a dôležité Read/Write operácie sú ukončené. Ináč uzavretím peňaženky, ukončíte proces Cryptomator-a.
+lock.fail.heading=Uzatváranie trezoru zlyhalo.
+lock.fail.message=Trezor "%s" nie je možné uzamknúť. Uistite sa že neuložená páca je uložená inde a dôležité Read/Write operácie sú ukončené. Ináč uzavretím trezoru, ukončíte proces Cryptomator-a.
# Migration
+migration.title=Aktualizácia trezora
## Start
+migration.start.prompt=Váš trezor "%s" vyžaduje aktualizáciu na novší formát. Pred pokračovaním sa uistite že neprebieha synchronizácia ovplyvňujúca tento trezor.
+migration.start.confirm=Áno, môj trezor je plne synchronizovaný
## Run
-## Sucess
+migration.run.enterPassword=Zadajte heslo pre "%s"
+migration.run.startMigrationBtn=Migrovať trezor
+migration.run.progressHint=Toto môže trvať nejaký čas…
+## Success
+migration.success.nextStepsInstructions=Migrované "%s" úspešne.\nTeraz môžte odomknúť Váš trezor.
migration.success.unlockNow=Odomknúť teraz
## Missing file system capabilities
+migration.error.missingFileSystemCapabilities.title=Nepodporovaný súborový systém
+migration.error.missingFileSystemCapabilities.description=Migrácia nezačala, pretože Váš trezor je umiestnený na neadekvátnom súborovom systéme.
+migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Súborový systém nepodporuje dlhé názvy súborov.
+migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Súborový systém nepodporuje dlhé cesty.
+migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Súborový systém neumožňuje čítanie.
+migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Súborový systém neumožňuje zápis.
## Impossible
+migration.impossible.heading=Nie je možná migrácia trezora
+migration.impossible.reason=Trezor nie je možné automaticky migrovať pretože jeho umiestnenie alebo prístupový bod nie je kompatibilný.
+migration.impossible.moreInfo=Trezor je naďalej možné otvátať so staršou verziou. Pre inštrukcie ako manuálne migrovať trezor navštívte
# Health Check
-health.title=Kontrola zdravia peňaženky
-health.start.introduction=Kontrola zdravia peňaženky je súhrn kontrol na detekciu a prípadnú opravu problémov vo vnútornej štruktúre Vášhej peňaženky. Prosím majte na pamäti že nie všetky problémy sú opravitelné. Potrebujete heslo peňaženky k vykonaniu kontrol.
-health.start.configValid=Čítanie a analýza konfigurácie súboru peňaženky bola úspešná. Pokračovať k výberu kontrol.
-health.start.configInvalid=Chyba počas čítania a analýzy konfiguračného súboru peňaženky.
-health.checkList.header=Dostupné kontroly zdravia
-health.checkList.selectAllBox=Označiť všetko
+## Start
+health.title=Kontrola zdravia "%s"
+health.intro.header=Kontrola zdravia
+health.intro.text=Kontrola zdravia je súbor kontrol pre detekciu a možné opravy problémov v internej štrukúre Vášho trezora. Prosím majte na pamäti:
+health.intro.remarkSync=Uistite sa že všetky zariadenia sú úplne synchronizované, toto rieši väčšinu problémov.
+health.intro.remarkFix=Nie všetky problémy sa dajú opraviť.
+health.intro.remarkBackup=Ak sú dáta poškodené, môže pomôcť iba záloha.
+health.intro.affirmation=Čítal som a rozumiem informáciam uvedeným vyššie
+## Start Failure
+health.fail.header=Chyba pri načítaní konfigurácie trezora
+health.fail.ioError=Vyskytla sa chyba počas prístupu a čítania konfiguračného súboru.
+health.fail.parseError=Vyskytla sa chyba počas analýzy konfigurácie trezora.
+health.fail.moreInfo=Viac informácií
+## Check Selection
+health.checkList.description=Vyberte kontroly zo zoznamu vľavo alebo použite tlačítka nižšie.
+health.checkList.selectAllButton=Vybrať všetky kontroly
+health.checkList.deselectAllButton=Zrušiť výber všetkých kontrol
health.check.runBatchBtn=Spustiť vybrané kontroly
## Detail view
health.check.detail.noSelectedCheck=Pre výsledky označte ukončenú kontrolu zdravia v zozname na ľavo.
-health.check.detail.header=Výsledky %s
-health.check.detail.taskNotStarted=Nebola zvolená žiadna kontrola k vykonaniu.
-health.check.detail.taskScheduled=Kontrola bola naplánovaná.
-health.check.detail.taskRunning=Kontrola práve prebieha…
-health.check.detail.taskSucceeded=Kontrola úspešne ukončená po %d milisekundách.
-health.check.detail.taskFailed=Kontrola ukončená z dôvodu chyby.
-health.check.detail.taskCancelled=Kontrola bola zrušená.
-health.check.detail.problemCount=Nájdených %d problémov a %d neopravených chýb.
+health.check.detail.checkScheduled=Kontrola je naplánovaná.
+health.check.detail.checkRunning=Kontrola aktuálne prebieha…
+health.check.detail.checkSkipped=Nebola vybraná žiadna kontrola.
+health.check.detail.checkFinished=Kontrola skončila úspešne.
+health.check.detail.checkFinishedAndFound=Kontrola skončila. Prosím pozrite si jej výsledky.
+health.check.detail.checkFailed=Kontrola skončila kôli chybe.
+health.check.detail.checkCancelled=Kontrola bola zrušená.
health.check.exportBtn=Exportovať správu
-health.check.fixBtn=Opraviť
-## Checks
-health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Kontrola katalógu
+## Fix Application
+health.fix.fixBtn=Opraviť
+health.fix.successTip=Oprava úspešná
+health.fix.failTip=Oprava zlyhala, pre detaily pozrite log-y
# Preferences
preferences.title=Predvoľby
## General
+preferences.general=Hlavné
+preferences.general.theme=Vzhĺad a pocit
preferences.general.theme.automatic=Automaticky
-preferences.general.showMinimizeButton=Predvoľba.hlavná.ukážMinimalizujTlačítko
-preferences.general.showTrayIcon=Predvoľba.hlavná.ukážIkonaSytémovejlišty
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome klúčenka
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE účet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=maccOS reťazový prístup
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows ochrana dát
+preferences.general.theme.light=Svetlý
+preferences.general.theme.dark=Tmavý
+preferences.general.unlockThemes=Odomknúť tmavý mód
+preferences.general.showMinimizeButton=Ukáž minimalizačné tlačidlo
+preferences.general.showTrayIcon=Ukáž ikonu sytémovej lišty (vyžaduje reštart)
+preferences.general.startHidden=Skryť okno počas štartu Cryptomator-a
+preferences.general.debugLogging=Povoliť logovanie chýb
+preferences.general.debugDirectory=Ukázať súbory logov
+preferences.general.autoStart=Spustiť Cryptomator pri štarte systému
+preferences.general.keychainBackend=Uložiť heslá v
+preferences.general.interfaceOrientation=Orientácia rozhrania
+preferences.general.interfaceOrientation.ltr=Zľava do prava
+preferences.general.interfaceOrientation.rtl=Zprava do ľava
## Volume
+preferences.volume=Virtuálny disk
+preferences.volume.type=Typ obsahu
+preferences.volume.webdav.port=WebDAV port
+preferences.volume.webdav.scheme=WebDAV schéma
## Updates
+preferences.updates=Aktualizácie
+preferences.updates.currentVersion=Aktuálna verzia: %s
+preferences.updates.autoUpdateCheck=Automatická kontrola aktualizácii
+preferences.updates.checkNowBtn=Skontroluj teraz
+preferences.updates.updateAvailable=Možnosť aktualizácie na verziu %s.
## Contribution
preferences.contribute=Podporte nás
preferences.contribute.registeredFor=Certifikát podporovateľa registrovaný na %s
@@ -167,6 +221,7 @@ preferences.contribute.promptText=Vlož sem kód certifikátu podporovateľa
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
+preferences.about=O programe
# Vault Statistics
stats.title=Štatistiky pre %s
@@ -200,53 +255,119 @@ stats.write.accessCount=Suma zápisov: %d
# Main Window
main.closeBtn.tooltip=Zavrieť
+main.minimizeBtn.tooltip=Minimalizovať
main.preferencesBtn.tooltip=Predvoľby
main.debugModeEnabled.tooltip=Debagovací mód je aktivovaný
+main.donationKeyMissing.tooltip=Prosím zvážte obdarovanie
## Drag 'n' Drop
+main.dropZone.dropVault=Pridať tento trezor
+main.dropZone.unknownDragboardContent=Ak chcete pridať tento trezor, potiahnite ho do tohto okna
## Vault List
-main.vaultlist.contextMenu.remove=Odstráň…
+main.vaultlist.emptyList.onboardingInstruction=Kliknite sem pre pridanie trezora
+main.vaultlist.contextMenu.remove=Odstrániť…
main.vaultlist.contextMenu.lock=Uzamknúť
main.vaultlist.contextMenu.unlock=Odomknúť…
main.vaultlist.contextMenu.unlockNow=Odomknúť teraz
-main.vaultlist.contextMenu.vaultoptions=Ukáž možnosti peňaženky
+main.vaultlist.contextMenu.vaultoptions=Ukáž možnosti trezora
main.vaultlist.contextMenu.reveal=Odkry disk
main.vaultlist.addVaultBtn=Pridať trezor
## Vault Detail
### Welcome
+main.vaultDetail.welcomeOnboarding=Ďakujeme Vám že ste si zvolili Cryptomator pre ochranu Vaších súborov. Ak potrebujete akúkoľvek pomoc, pozrite si našu príručku ako začať:
### Locked
+main.vaultDetail.lockedStatus=Uzamknutý
main.vaultDetail.unlockBtn=Odomknúť…
main.vaultDetail.unlockNowBtn=Odomknúť teraz
+main.vaultDetail.optionsBtn=Nastavenia trezora
main.vaultDetail.passwordSavedInKeychain=Heslo uložené
### Unlocked
+main.vaultDetail.unlockedStatus=Odomknutý
+main.vaultDetail.accessLocation=Obsah Vášho trezora je dostupný tu:
main.vaultDetail.revealBtn=Odkry disk
main.vaultDetail.lockBtn=Uzamknúť
main.vaultDetail.bytesPerSecondRead=Čítanie:
main.vaultDetail.bytesPerSecondWritten=Zápis:
-main.vaultDetail.stats=Štatistiky účtu
+main.vaultDetail.throughput.idle=nečinný
+main.vaultDetail.throughput.kbps=%.1f kiB/s
+main.vaultDetail.throughput.mbps=%.1f MiB/s
+main.vaultDetail.stats=Štatistiky trezora
### Missing
+main.vaultDetail.missing.info=Cryptomator nevie nájsť trezor na tejto ceste.
main.vaultDetail.missing.recheck=Prekontrolovať
-main.vaultDetail.missing.remove=Odstrániť zo zoznamu peňaženky…
+main.vaultDetail.missing.remove=Odstrániť zo zoznamu trezora…
+main.vaultDetail.missing.changeLocation=Zmeniť umiestnenie trezora…
### Needs Migration
+main.vaultDetail.migrateButton=Aktualizácia trezora
+main.vaultDetail.migratePrompt=Váš trezor vyžaduje aktualizáciu na nový formát predtým ako ho použijete
+### Error
+main.vaultDetail.error.info=Vyskytla sa chyba pri načítavaní trezora z disku.
+main.vaultDetail.error.reload=Znovu načítať
+main.vaultDetail.error.windowTitle=Chyba pri načítavaní trezora
# Wrong File Alert
+wrongFileAlert.title=Ako zašifrovať súbory
+wrongFileAlert.header.title=Pokúšate sa dešifrovať tieto súbory?
+wrongFileAlert.header.lead=Pre tento účel Cryptomator poskytuje zväzok vo Vašom súborovom menežérovi.
+wrongFileAlert.instruction.0=Pre zašifrovanie súborov - postupujte týmito krokmi:
+wrongFileAlert.instruction.1=1. Odomknúť Váš trezor.
+wrongFileAlert.instruction.2=2. Kliknúť na "Odkryť" pre otvorenie zväzku v súborovom menežérovi.
+wrongFileAlert.instruction.3=3. Pridať Vaše súbory do tohto zväzku.
+wrongFileAlert.link=Pre ďalšiu asistenciu, navštívte
# Vault Options
## General
+vaultOptions.general=Hlavné
vaultOptions.general.vaultName=Názov trezoru
+vaultOptions.general.autoLock.lockAfterTimePart1=Uzamknutie po uplynutí nečinnosti
+vaultOptions.general.autoLock.lockAfterTimePart2=minút
+vaultOptions.general.unlockAfterStartup=Odomknúť trezor pri spustení Cryptomator-a
+vaultOptions.general.actionAfterUnlock=Po úspešnom odomknutí
+vaultOptions.general.actionAfterUnlock.ignore=Nič nerob
vaultOptions.general.actionAfterUnlock.reveal=Odkry disk
-vaultOptions.general.healthBtn=Spustiť kontrolu zdravia
+vaultOptions.general.actionAfterUnlock.ask=Opýtať sa
+vaultOptions.general.startHealthCheckBtn=Spustiť kontrolu zdravia
+
## Mount
-vaultOptions.mount.mountPoint.directoryPickerButton=Vybrať…
+vaultOptions.mount=Mapovanie
+vaultOptions.mount.readonly=Len-čítanie
+vaultOptions.mount.customMountFlags=Vlastné parametre mapovania
+vaultOptions.mount.winDriveLetterOccupied=obsadený
+vaultOptions.mount.mountPoint=Bod mapovania
+vaultOptions.mount.mountPoint.auto=Automaticky zvoľ vhodné umiestnenie
+vaultOptions.mount.mountPoint.driveLetter=Použiť pridelené písmeno disku
+vaultOptions.mount.mountPoint.custom=Voliteľná cesta
+vaultOptions.mount.mountPoint.directoryPickerButton=Zvoliť…
+vaultOptions.mount.mountPoint.directoryPickerTitle=Zvoliť prázdny adresár
## Master Key
+vaultOptions.masterkey=Heslo
vaultOptions.masterkey.changePasswordBtn=Zmeniť heslo
vaultOptions.masterkey.forgetSavedPasswordBtn=Zabudnúť uložené heslo
-## Auto Lock
-vaultOptions.autoLock=Automatické-uzamknutie
-vaultOptions.autoLock.lockAfterTimePart1=Uzamknutie po uplynutí
-vaultOptions.autoLock.lockAfterTimePart2=minút
+vaultOptions.masterkey.recoveryKeyExplanation=Kľúč pre obnovu je Vašou jedinou cestou k obnove prístupu do trezoru v prípade straty hesla.
+vaultOptions.masterkey.showRecoveryKeyBtn=Ukázať klúč obnovy
+vaultOptions.masterkey.recoverPasswordBtn=Odkryť heslo
+
# Recovery Key
+recoveryKey.title=Kľúč obnovy
+recoveryKey.enterPassword.prompt=Zadajte Vaše heslo pre zobrazenie kľúča obnovy k "%s":
+recoveryKey.display.message=Nasledujúci kľúč obnovy slúži k prístupu k "%s":
+recoveryKey.display.StorageHints=Uchovávajte ho na bezpečnom mieste, ako napr.:\n- v menežérovi hesiel\n- uložené na USB kľúči\n- vytlačené na papiery
+recoveryKey.recover.prompt=Zadajte Váš kľúč obnovy pre "%s":
+recoveryKey.recover.validKey=Toto je platný kľúč obnovy
+recoveryKey.printout.heading=Kľúč obnovy Cryptomator-a\n "%s"\n
# New Password
+newPassword.promptText=Zadajte nové heslo
+newPassword.reenterPassword=Porvrďte nové heslo
+newPassword.passwordsMatch=Heslá sa zhodujú!
+newPassword.passwordsDoNotMatch=Heslá sa nezhodujú
+passwordStrength.messageLabel.tooShort=Použite minimálne %d znakov
+passwordStrength.messageLabel.0=Veľmi slabé
+passwordStrength.messageLabel.1=Slabé
+passwordStrength.messageLabel.2=Dostačujúce
+passwordStrength.messageLabel.3=Silné
+passwordStrength.messageLabel.4=Veľmi silné
# Quit
+quit.prompt=Ukončiť aplikáciu? Sú tu odomknuté trezory.
+quit.lockAndQuit=Zamknúť a Skončiť
diff --git a/src/main/resources/i18n/strings_sr.properties b/src/main/resources/i18n/strings_sr.properties
index 60fd8910c..3ce8f3f27 100644
--- a/src/main/resources/i18n/strings_sr.properties
+++ b/src/main/resources/i18n/strings_sr.properties
@@ -13,8 +13,6 @@ generic.button.done=Завршено
generic.button.next=Даље
generic.button.print=Штампај
## Error
-generic.error.title=Догодила се неочекивана грешка
-generic.error.instruction=Ово није требало да се догоди. Молимо вас пријавите текст грешке испод и додајте опис корака који су довели до ове грешке.
# Defaults
defaults.vault.vaultName=Сеф
@@ -95,7 +93,6 @@ forgetPassword.information=Ово ће избрисати сачувану ло
forgetPassword.confirmBtn=Заборави лозинку
# Unlock
-unlock.title=Откључавање сефа
unlock.passwordPrompt=Унесите лозинку за "%s":
unlock.savePassword=Запамти лозинку
unlock.unlockBtn=Откључај
@@ -129,7 +126,7 @@ migration.start.confirm=Да, мој сеф је у потпуности син
migration.run.enterPassword=Унесите лозинку за "%s"
migration.run.startMigrationBtn=Преместите сеф
migration.run.progressHint=Ово би могло потрајати…
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" је успешно премештен. Сада можете да откључате ваш сеф.
migration.success.unlockNow=Откључај сада
## Missing file system capabilities
@@ -145,8 +142,11 @@ migration.impossible.reason=Сеф се не може аутоматски пр
migration.impossible.moreInfo=Сеф се и даље може отворити са старијом верзијом. За упутства како ручно преместити сеф, посетите
# Health Check
+## Start
+## Start Failure
+## Check Selection
## Detail view
-## Checks
+## Fix Application
# Preferences
preferences.title=Подешавања
@@ -164,10 +164,6 @@ preferences.general.debugLogging=Омогући евиденцију откла
preferences.general.debugDirectory=Прикажи датотеке евиденције
preferences.general.autoStart=Покрени Cryptomator при покретању система
preferences.general.keychainBackend=Похрани лозинке са
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Keychain Access
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection
preferences.general.interfaceOrientation=Оријентација интерфејса
preferences.general.interfaceOrientation.ltr=Са лева на десно
preferences.general.interfaceOrientation.rtl=Са десна на лево
@@ -269,6 +265,7 @@ main.vaultDetail.missing.changeLocation=Промени локацију сефа
### Needs Migration
main.vaultDetail.migrateButton=Надогради сеф
main.vaultDetail.migratePrompt=Да бисте приступили вашем сефу, он мора бити надограђен на нови формат
+### Error
# Wrong File Alert
wrongFileAlert.title=Како шифровати датотеке
@@ -289,6 +286,7 @@ vaultOptions.general.actionAfterUnlock=Након успешног откључ
vaultOptions.general.actionAfterUnlock.ignore=Не ради ништа
vaultOptions.general.actionAfterUnlock.reveal=Прикажи диск
vaultOptions.general.actionAfterUnlock.ask=Питај
+
## Mount
vaultOptions.mount=Монтирање
vaultOptions.mount.readonly=Само читање
@@ -304,10 +302,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Изаберите праза
vaultOptions.masterkey=Лозинка
vaultOptions.masterkey.changePasswordBtn=Промена лозинке
vaultOptions.masterkey.forgetSavedPasswordBtn=Заборави сачувану лозинку
-vaultOptions.masterkey.recoveryKeyExpanation=Резервни кључ је Ваш једини начин да вратите приступ сефу уколико изгубите лозинку.
+vaultOptions.masterkey.recoveryKeyExplanation=Резервни кључ је Ваш једини начин да вратите приступ сефу уколико изгубите лозинку.
vaultOptions.masterkey.showRecoveryKeyBtn=Прикажи Резервни Кључ
vaultOptions.masterkey.recoverPasswordBtn=Обнови лозинку
-## Auto Lock
+
# Recovery Key
recoveryKey.title=Резервни Кључ
diff --git a/src/main/resources/i18n/strings_sr_Latn.properties b/src/main/resources/i18n/strings_sr_Latn.properties
index 25e54e303..b929cb745 100644
--- a/src/main/resources/i18n/strings_sr_Latn.properties
+++ b/src/main/resources/i18n/strings_sr_Latn.properties
@@ -13,8 +13,6 @@ generic.button.done=Završeno
generic.button.next=Dalje
generic.button.print=Štampaj
## Error
-generic.error.title=Dogodila se neočekivana greška
-generic.error.instruction=Ovo nije trebalo da se dogodi. Molimo vas prijavite tekst greške ispod i dodajte opis koraka koji su doveli do ove greške.
# Defaults
defaults.vault.vaultName=Sef
@@ -95,7 +93,6 @@ forgetPassword.information=Ovo će izbrisati sačuvanu lozinku ovog sefa iz vaš
forgetPassword.confirmBtn=Zaboravi lozinku
# Unlock
-unlock.title=Otključavanje sefa
unlock.passwordPrompt=Unesite lozinku za "%s":
unlock.savePassword=Zapamti lozinku
unlock.unlockBtn=Otključaj
@@ -129,7 +126,7 @@ migration.start.confirm=Da moj sef je u potpunosti sinhronizovan
migration.run.enterPassword=Unesite lozinku za "%s"
migration.run.startMigrationBtn=Premestite sef
migration.run.progressHint=Ovo bi moglo potrajati…
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" je uspešno premešten. Sada možete da otključate vaš šef.
migration.success.unlockNow=Otključaj sada
## Missing file system capabilities
@@ -145,8 +142,11 @@ migration.impossible.reason=Sef se ne može automatski premestiti jer je njegova
migration.impossible.moreInfo=Sef se i dalje može otvoriti sa starijom verzijom. Za uputstva kako ručno premestiti sef, posetite
# Health Check
+## Start
+## Start Failure
+## Check Selection
## Detail view
-## Checks
+## Fix Application
# Preferences
preferences.title=Podešavanja
@@ -164,10 +164,6 @@ preferences.general.debugLogging=Omogući evidenciju otklanjanja grešaka
preferences.general.debugDirectory=Prikaži datoteke evidencije
preferences.general.autoStart=Pokreni Cryptomator pri pokretanju sistema
preferences.general.keychainBackend=Pohrani lozinke sa
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Keychain Access
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection
preferences.general.interfaceOrientation=Orijentacija interfejsa
preferences.general.interfaceOrientation.ltr=Sa leva na desno
preferences.general.interfaceOrientation.rtl=Sa desna na levo
@@ -229,6 +225,7 @@ main.vaultDetail.lockBtn=Zaključaj
### Missing
### Needs Migration
main.vaultDetail.migrateButton=Nadogradi sef
+### Error
# Wrong File Alert
@@ -237,11 +234,12 @@ main.vaultDetail.migrateButton=Nadogradi sef
vaultOptions.general=Opšte
vaultOptions.general.vaultName=Naziv sefa
vaultOptions.general.actionAfterUnlock.reveal=Otvori disk
+
## Mount
vaultOptions.mount.mountPoint.directoryPickerButton=Izaberi…
## Master Key
vaultOptions.masterkey.changePasswordBtn=Promena lozinke
-## Auto Lock
+
# Recovery Key
diff --git a/src/main/resources/i18n/strings_sv.properties b/src/main/resources/i18n/strings_sv.properties
index c9500a200..3f1e53771 100644
--- a/src/main/resources/i18n/strings_sv.properties
+++ b/src/main/resources/i18n/strings_sv.properties
@@ -13,8 +13,11 @@ generic.button.done=Klar
generic.button.next=Nästa
generic.button.print=Skriv ut
## Error
-generic.error.title=Ett oväntat fel uppstod
-generic.error.instruction=Detta borde inte hänt. Vänligen rapportera feltexten nedan och inkludera en beskrivning av vilka steg som ledde till detta fel.
+generic.error.title=Fel: %s
+generic.error.instruction=Hoppsan! Cryptomator stötte på något oväntat. Du kan leta upp befintliga lösningar för detta fel. Om det inte har rapporterats ännu får du gärna rapportera in felet.
+generic.error.hyperlink.lookup=Slå upp detta fel
+generic.error.hyperlink.report=Rapportera fel
+generic.error.technicalDetails=Detaljer:
# Defaults
defaults.vault.vaultName=Valv
@@ -95,7 +98,7 @@ forgetPassword.information=Detta kommer radera det sparade lösenordet för dett
forgetPassword.confirmBtn=Glöm lösenord
# Unlock
-unlock.title=Lås upp valv
+unlock.title=Lås upp "%s"
unlock.passwordPrompt=Ange lösenord för "%s":
unlock.savePassword=Kom ihåg lösenord
unlock.unlockBtn=Lås upp
@@ -130,7 +133,7 @@ migration.start.confirm=Ja, mitt valv är synkroniserat
migration.run.enterPassword=Ange lösenordet för "%s"
migration.run.startMigrationBtn=Migrera valv
migration.run.progressHint=Detta kan ta lite tid…
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" migrerades korrekt.\nDu kan nu låsa upp ditt valv.
migration.success.unlockNow=Lås upp nu
## Missing file system capabilities
@@ -146,8 +149,38 @@ migration.impossible.reason=Valvet kan inte migreras automatiskt eftersom dess l
migration.impossible.moreInfo=Valvet kan fortfarande öppnas med en äldre version. För instruktioner om hur du manuellt migrerar ett valv, besök
# Health Check
+## Start
+health.title=Hälsokontroll av "%s"
+health.intro.header=Hälsokontroll
+health.intro.text=Hälsokontroll är en samling av kontroller för att upptäcka och åtgärda eventuella problem i den interna strukturen i ditt valv. Kom ihåg att:
+health.intro.remarkSync=Se till att alla enheter är helt synkroniserade, detta löser de flesta problem.
+health.intro.remarkFix=Alla problem kan inte åtgärdas.
+health.intro.remarkBackup=Om data är skadad kan endast en tidigare säkerhetskopia hjälpa.
+health.intro.affirmation=Jag har läst och förstått ovanstående information
+## Start Failure
+health.fail.header=Fel vid inläsning av valvkonfiguration
+health.fail.ioError=Ett fel inträffade vid åtkomst till och läsning av konfigurationsfilen.
+health.fail.parseError=Ett fel inträffade vid parsning av valvkonfigurationen.
+health.fail.moreInfo=Mer information
+## Check Selection
+health.checkList.description=Välj kontroller i den vänstra listan eller använd knapparna nedan.
+health.checkList.selectAllButton=Markera alla kontroller
+health.checkList.deselectAllButton=Avmarkera alla kontroller
+health.check.runBatchBtn=Kör valda kontroller
## Detail view
-## Checks
+health.check.detail.noSelectedCheck=Välj en färdig hälsokontroll i den vänstra listan för att se resultat.
+health.check.detail.checkScheduled=Kontrollen är schemalagd.
+health.check.detail.checkRunning=Kontrollen körs för närvarande…
+health.check.detail.checkSkipped=Kontrollen har inte valts att köra.
+health.check.detail.checkFinished=Kontrollen har slutförts.
+health.check.detail.checkFinishedAndFound=Kontrollen är slutförd. Vänligen granska resultatet.
+health.check.detail.checkFailed=Kontrollen avslutades på grund av ett fel.
+health.check.detail.checkCancelled=Kontrollen avbröts.
+health.check.exportBtn=Exportera rapport
+## Fix Application
+health.fix.fixBtn=Åtgärda
+health.fix.successTip=Åtgärden lyckades
+health.fix.failTip=Rättning misslyckades, se logg för detaljer
# Preferences
preferences.title=Inställningar
@@ -165,10 +198,6 @@ preferences.general.debugLogging=Aktivera loggning för felsökning
preferences.general.debugDirectory=Visa loggfiler
preferences.general.autoStart=Starta Cryptomator vid systemstart
preferences.general.keychainBackend=Spara lösenord med
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Keychain Access
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection
preferences.general.interfaceOrientation=Gränssnittsjustering
preferences.general.interfaceOrientation.ltr=Vänster till höger
preferences.general.interfaceOrientation.rtl=Höger till vänster
@@ -270,6 +299,10 @@ main.vaultDetail.missing.changeLocation=Ändra valvets plats…
### Needs Migration
main.vaultDetail.migrateButton=Uppgradera valv
main.vaultDetail.migratePrompt=Ditt valv behöver uppgraderas till ett nytt format innan du kan använda det
+### Error
+main.vaultDetail.error.info=Ett fel inträffade när valvet skulle laddas in.
+main.vaultDetail.error.reload=Ladda om
+main.vaultDetail.error.windowTitle=Fel vid inläsning av valv
# Wrong File Alert
wrongFileAlert.title=Hur man krypterar filer
@@ -285,11 +318,15 @@ wrongFileAlert.link=För ytterligare hjälp, besök
## General
vaultOptions.general=Allmänt
vaultOptions.general.vaultName=Valvnamn
+vaultOptions.general.autoLock.lockAfterTimePart1=Lås när inaktiv i
+vaultOptions.general.autoLock.lockAfterTimePart2=minuter
vaultOptions.general.unlockAfterStartup=Lås upp valvet när Cryptomator startas
vaultOptions.general.actionAfterUnlock=Efter lyckad upplåsning
vaultOptions.general.actionAfterUnlock.ignore=Gör ingenting
vaultOptions.general.actionAfterUnlock.reveal=Visa enhet
vaultOptions.general.actionAfterUnlock.ask=Fråga
+vaultOptions.general.startHealthCheckBtn=Starta hälsokontroll
+
## Mount
vaultOptions.mount=Montering
vaultOptions.mount.readonly=Skrivskyddad
@@ -305,10 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Välj en tom katalog
vaultOptions.masterkey=Lösenord
vaultOptions.masterkey.changePasswordBtn=Ändra lösenord
vaultOptions.masterkey.forgetSavedPasswordBtn=Ta bort sparat lösenord
-vaultOptions.masterkey.recoveryKeyExpanation=En återställningsnyckel är ditt enda sätt att återställa åtkomst till ett valv, om du förlorar ditt lösenord.
+vaultOptions.masterkey.recoveryKeyExplanation=En återställningsnyckel är ditt enda sätt att återställa åtkomst till ett valv om du förlorar ditt lösenord.
vaultOptions.masterkey.showRecoveryKeyBtn=Visa återsällningsnyckel
vaultOptions.masterkey.recoverPasswordBtn=Återställ lösenord
-## Auto Lock
+
# Recovery Key
recoveryKey.title=Återställningsnyckel
diff --git a/src/main/resources/i18n/strings_th.properties b/src/main/resources/i18n/strings_th.properties
index 64ead470d..1b7af9c4d 100644
--- a/src/main/resources/i18n/strings_th.properties
+++ b/src/main/resources/i18n/strings_th.properties
@@ -37,13 +37,16 @@
# Migration
## Start
## Run
-## Sucess
+## Success
## Missing file system capabilities
## Impossible
# Health Check
+## Start
+## Start Failure
+## Check Selection
## Detail view
-## Checks
+## Fix Application
# Preferences
## General
@@ -67,14 +70,16 @@
### Unlocked
### Missing
### Needs Migration
+### Error
# Wrong File Alert
# Vault Options
## General
+
## Mount
## Master Key
-## Auto Lock
+
# Recovery Key
diff --git a/src/main/resources/i18n/strings_tr.properties b/src/main/resources/i18n/strings_tr.properties
index 64529fea8..e36f02d4e 100644
--- a/src/main/resources/i18n/strings_tr.properties
+++ b/src/main/resources/i18n/strings_tr.properties
@@ -9,12 +9,15 @@ generic.button.change=Değiştir
generic.button.close=Kapat
generic.button.copy=Kopyala
generic.button.copied=Kopyalandı!
-generic.button.done=Bitti
-generic.button.next=İleri
+generic.button.done=Tamam
+generic.button.next=Sonraki
generic.button.print=Yazdır
## Error
-generic.error.title=Beklenmedik bir hata oluştu
-generic.error.instruction=Bu olmamalıydı. Lütfen aşağıdaki hata metnini bildirin ve bu hataya neden olan adımların bir açıklamasını ekleyin.
+generic.error.title=Hata: %s
+generic.error.instruction=Uups! Cryptomator bunun olmasını beklemiyordu. Bu hata için mevcut çözümlere bakabilirsiniz. Ya da henüz bildirilmediyse, bunu raporlamaktan çekinmeyin.
+generic.error.hyperlink.lookup=Bu hatayı ara
+generic.error.hyperlink.report=Bu hatayı bildir
+generic.error.technicalDetails=Detaylar:
# Defaults
defaults.vault.vaultName=Kasa
@@ -39,7 +42,7 @@ addvaultwizard.new.nameInstruction=Kasa için bir isim seç
addvaultwizard.new.namePrompt=Kasa Adı
### Location
addvaultwizard.new.locationInstruction=Cryptomator kasanızın şifreli dosyalarını nerede depolasın?
-addvaultwizard.new.locationLabel=Depolama yeri
+addvaultwizard.new.locationLabel=Depolama konumu
addvaultwizard.new.locationPrompt=…
addvaultwizard.new.directoryPickerLabel=Özel Konum
addvaultwizard.new.directoryPickerButton=Seç…
@@ -47,8 +50,8 @@ addvaultwizard.new.directoryPickerTitle=Dizin Seç
addvaultwizard.new.fileAlreadyExists=Kasa adına sahip bir dosya veya dizin zaten mevcut
addvaultwizard.new.locationDoesNotExist=Belirtilen yoldaki bir dizin mevcut değil veya erişilemez
addvaultwizard.new.locationIsNotWritable=Belirtilen yolda yazma erişimi yok
-addvaultwizard.new.locationIsOk=Kasanız için uygun yer
-addvaultwizard.new.invalidName=Geçersiz kasa adı. Lütfen normal bir dizin adı kullanın.
+addvaultwizard.new.locationIsOk=Bu konum, kasanız için uygun
+addvaultwizard.new.invalidName=Kasa adı geçersiz. Lütfen normal bir dizin adı kullanın.
### Password
addvaultwizard.new.createVaultBtn=Kasa Oluştur
addvaultwizard.new.generateRecoveryKeyChoice=Şifreniz olmadan verilerinize erişemeyeceksiniz. Şifrenizi kaybetmeniz durumunda kullanabileceğiniz bir kurtarma anahtarı ister misiniz?
@@ -95,7 +98,7 @@ forgetPassword.information=Bu, bu kasanın kaydedilmiş şifresini sistem anahta
forgetPassword.confirmBtn=Şifreyi Unut
# Unlock
-unlock.title=Kasa Kilidini Aç
+unlock.title="%s" kilidini aç
unlock.passwordPrompt="%s" için şifre girin:
unlock.savePassword=Şifreyi Hatırla
unlock.unlockBtn=Kilidi Aç
@@ -122,7 +125,7 @@ lock.fail.heading=Kasa kilitlenemedi.
lock.fail.message="%s" kasası kilitlenemedi. Kaydedilmemiş çalışmanın başka bir yere kaydedildiğinden ve önemli Okuma / Yazma işlemlerinin tamamlandığından emin olun. Kasayı kapatmak için Cryptomator işlemini sonlandırın.
# Migration
-migration.title=Kasayı Güncelle
+migration.title=Kasayı Yükselt
## Start
migration.start.prompt="%s" kasanızın daha yeni bir biçime güncellenmesi gerekiyor. Devam etmeden önce, bu kasayı etkileyen bekleyen bir senkronizasyon olmadığından emin olun.
migration.start.confirm=Evet, kasam tamamen senkronize edildi
@@ -130,7 +133,7 @@ migration.start.confirm=Evet, kasam tamamen senkronize edildi
migration.run.enterPassword="%s" için şifre girin
migration.run.startMigrationBtn=Kasayı Taşı
migration.run.progressHint=Bu biraz zaman alabilir…
-## Sucess
+## Success
migration.success.nextStepsInstructions="%s" başarıyla taşındı.\nKasanızın kilidini şimdi kaldırabilirsiniz.
migration.success.unlockNow=Kilidi Şimdi Aç
## Missing file system capabilities
@@ -146,8 +149,38 @@ migration.impossible.reason=Depolama konumu veya erişim noktası uyumlu olmadı
migration.impossible.moreInfo=Kasa eski bir sürüm ile halen açılabilir. Kasanın nasıl elle taşınabileceğine dair yönlendirme için ziyaret edin
# Health Check
+## Start
+health.title="%s" Sağlık Kontrolü
+health.intro.header=Sağlık Kontrolü
+health.intro.text=Sağlık Kontrolü, cüzdanınızın iç yapısındaki sorunları algılamak ve muhtemelen bu sorunları düzeltmek için uygulanan bir dizi kontroldür. Lütfen aklınızda bulundurun:
+health.intro.remarkSync=Tüm cihazların tamamen senkronize edildiğinden emin olun, bu çoğu sorunu çözer.
+health.intro.remarkFix=Tüm sorunlar çözülemez.
+health.intro.remarkBackup=Eğer veri bozuksa, sadece yedekleme yardımcı olabilir.
+health.intro.affirmation=Yukarıdaki bilgileri okudum ve anladım
+## Start Failure
+health.fail.header=Cüzdan yapılandırması yüklenirken hata oluştu
+health.fail.ioError=Yapılandırma dosyasına erişilirken ve okunurken bir hata oluştu.
+health.fail.parseError=Kasa yapılandırması ayrıştırılırken bir hata oluştu.
+health.fail.moreInfo=Daha Fazla Bilgi
+## Check Selection
+health.checkList.description=Soldaki listeden kontrolleri seçin veya aşağıdaki düğmeleri kullanın.
+health.checkList.selectAllButton=Tüm Kontrolleri Seç
+health.checkList.deselectAllButton=Tüm Kontrollerin Seçimini Kaldır
+health.check.runBatchBtn=Seçilen Kontrolleri Çalıştır
## Detail view
-## Checks
+health.check.detail.noSelectedCheck=Sonuçlar için sol listeden tamamlanmış bir sağlık kontrolü seçin.
+health.check.detail.checkScheduled=Kontrol planlandı.
+health.check.detail.checkRunning=Kontrol şu anda çalışıyor…
+health.check.detail.checkSkipped=Kontrol çalıştırılmak üzere seçilmedi.
+health.check.detail.checkFinished=Kontrol başarıyla tamamlandı.
+health.check.detail.checkFinishedAndFound=Kontrol işlemi tamamlandı. Lütfen sonuçları inceleyin.
+health.check.detail.checkFailed=Bir hata nedeniyle kontrolden çıkıldı.
+health.check.detail.checkCancelled=Kontrol iptal edildi.
+health.check.exportBtn=Raporu Dışa Aktar
+## Fix Application
+health.fix.fixBtn=Düzelt
+health.fix.successTip=Düzeltme başarılı
+health.fix.failTip=Düzeltme başarısız oldu, ayrıntılar için günlüğe bakın
# Preferences
preferences.title=Seçenekler
@@ -165,10 +198,6 @@ preferences.general.debugLogging=Hata ayıklama günlüğünü etkinleştir
preferences.general.debugDirectory=Kayıt dosyalarını göster
preferences.general.autoStart=Cryptomator'u sistem başlangıcında çalıştır
preferences.general.keychainBackend=Şifreleri şununla depola:
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Cüzdan
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Anahtar Zinciri Erişimi
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Veri Koruması
preferences.general.interfaceOrientation=Arayüz Yönü
preferences.general.interfaceOrientation.ltr=Sola Yaslı
preferences.general.interfaceOrientation.rtl=Sağa Yaslı
@@ -179,7 +208,7 @@ preferences.volume.webdav.port=WebDAV Portu
preferences.volume.webdav.scheme=WebDAV Düzeni
## Updates
preferences.updates=Güncellemeler
-preferences.updates.currentVersion=Şuanki Sürüm: %s
+preferences.updates.currentVersion=Mevcut Sürüm: %s
preferences.updates.autoUpdateCheck=Güncellemeleri otomatik kontrol et
preferences.updates.checkNowBtn=Şimdi Kontrol Et
preferences.updates.updateAvailable=%s sürümüne güncelleme mevcut.
@@ -268,8 +297,12 @@ main.vaultDetail.missing.recheck=Yeniden denetle
main.vaultDetail.missing.remove=Kasa Listesinden Sil…
main.vaultDetail.missing.changeLocation=Kasa Yerini Değiştir…
### Needs Migration
-main.vaultDetail.migrateButton=Kasayı Güncelle
+main.vaultDetail.migrateButton=Kasayı Yükselt
main.vaultDetail.migratePrompt=Kasaya erişmeden önce kasanızın yeni bir formata yükseltilmesi gerekiyor
+### Error
+main.vaultDetail.error.info=Kasa diskten yüklenirken bir hata oluştu.
+main.vaultDetail.error.reload=Tekrar yükle
+main.vaultDetail.error.windowTitle=Kasa yüklenirken hata oluştu
# Wrong File Alert
wrongFileAlert.title=Dosyalar Nasıl Şifrelenir
@@ -285,11 +318,15 @@ wrongFileAlert.link=Daha fazla yardım için, ziyaret edin:
## General
vaultOptions.general=Genel
vaultOptions.general.vaultName=Kasa Adı
+vaultOptions.general.autoLock.lockAfterTimePart1=Boşta olduğunda kilitle
+vaultOptions.general.autoLock.lockAfterTimePart2=dk
vaultOptions.general.unlockAfterStartup=Cryptomator başlatıldığında kasayı aç
vaultOptions.general.actionAfterUnlock=Başarılı kilit açmanın ardından
vaultOptions.general.actionAfterUnlock.ignore=Hiçbir şey yapma
vaultOptions.general.actionAfterUnlock.reveal=Sürücüyü Göster
vaultOptions.general.actionAfterUnlock.ask=Sor
+vaultOptions.general.startHealthCheckBtn=Sağlık Kontrolünü Başlat
+
## Mount
vaultOptions.mount=Bağlantı
vaultOptions.mount.readonly=Salt-Okunur
@@ -305,11 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Boş bir dizin seçin
vaultOptions.masterkey=Şifre
vaultOptions.masterkey.changePasswordBtn=Şifreyi Değiştir
vaultOptions.masterkey.forgetSavedPasswordBtn=Kaydedilen Şifreyi Unut
-vaultOptions.masterkey.recoveryKeyExpanation=Bir kurtarma anahtarı şifrenizi unuttuğunuz takdirde kasanıza ulaşmanın tek yoludur.
+vaultOptions.masterkey.recoveryKeyExplanation=Bir kurtarma anahtarı şifrenizi unuttuğunuz takdirde kasanıza ulaşmanın tek yoludur.
vaultOptions.masterkey.showRecoveryKeyBtn=Kurtarma Anahtarını Göster
vaultOptions.masterkey.recoverPasswordBtn=Parolanızı Kurtarın
-## Auto Lock
-vaultOptions.autoLock.lockAfterTimePart2=dk
+
# Recovery Key
recoveryKey.title=Kurtarma Anahtarı
diff --git a/src/main/resources/i18n/strings_zh.properties b/src/main/resources/i18n/strings_zh.properties
index 1f722d1f2..75eaa62c3 100644
--- a/src/main/resources/i18n/strings_zh.properties
+++ b/src/main/resources/i18n/strings_zh.properties
@@ -13,8 +13,11 @@ generic.button.done=完成
generic.button.next=下一步
generic.button.print=打印
## Error
-generic.error.title=发生一个未知错误
-generic.error.instruction=这本不该发生的,请报告下面的错误文本,并包含导致该错误的操作步骤的描述信息。
+generic.error.title=错误 %s
+generic.error.instruction=糟糕!Cryptomator 未料到会发生这种情况。您可以查找该错误的现有解决方案;或者,如果是新错误,请随时向我们报告。
+generic.error.hyperlink.lookup=查找该错误
+generic.error.hyperlink.report=报告该错误
+generic.error.technicalDetails=详细信息:
# Defaults
defaults.vault.vaultName=保险库
@@ -47,7 +50,7 @@ addvaultwizard.new.directoryPickerTitle=选择目录
addvaultwizard.new.fileAlreadyExists=已存在同名文件或文件夹
addvaultwizard.new.locationDoesNotExist=指定路径中的目录不存在或无法访问
addvaultwizard.new.locationIsNotWritable=没有对指定路径的写入权限
-addvaultwizard.new.locationIsOk=合适的保险库路径
+addvaultwizard.new.locationIsOk=保险库路径合适
addvaultwizard.new.invalidName=无效的保险库名称,请考虑一个常规的目录名称
### Password
addvaultwizard.new.createVaultBtn=创建保险库
@@ -57,7 +60,7 @@ addvaultwizard.new.generateRecoveryKeyChoice.no=不,谢谢。我不会丢失
### Information
addvault.new.readme.storageLocation.fileName=重要.rtf
addvault.new.readme.storageLocation.1=⚠️ 保险库文件 ⚠️
-addvault.new.readme.storageLocation.2=这是你的保险库的保存路径
+addvault.new.readme.storageLocation.2=这是您的保险库的存储路径。
addvault.new.readme.storageLocation.3=请勿
addvault.new.readme.storageLocation.4=• 更改此目录内的任何文件或者
addvault.new.readme.storageLocation.5=• 将任何文件粘贴到此目录内以进行加密
@@ -68,9 +71,9 @@ addvault.new.readme.storageLocation.9=3. 通过点击“显示”按钮打开
addvault.new.readme.storageLocation.10=如果您需要帮助,请阅读文档: %s
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.4=随时可以删除此文件。
+addvault.new.readme.accessLocation.2=这是您的保险库的访问路径。
+addvault.new.readme.accessLocation.3=任何添加到此卷的文件都将被 Cryptomator 加密。您可以像在一般磁盘/文件夹上那样操作它。 这只是对其内容的解密查看,您的文件会在硬盘上一直保持加密。
+addvault.new.readme.accessLocation.4=您可以随时删除此文件。
## Existing
addvaultwizard.existing.instruction=请选择您现有保险库中的 "masterkey.cryptomator" 文件
addvaultwizard.existing.chooseBtn=选择...
@@ -95,7 +98,7 @@ forgetPassword.information=这将从您的系统密钥链中删除此保险库
forgetPassword.confirmBtn=忘记密码
# Unlock
-unlock.title=解锁保险库
+unlock.title=解锁 "%s"
unlock.passwordPrompt=输入 "%s" 的密码
unlock.savePassword=记住密码
unlock.unlockBtn=解锁
@@ -130,7 +133,7 @@ migration.start.confirm=是的,我的保险库已完全同步
migration.run.enterPassword=输入 "%s" 的密码
migration.run.startMigrationBtn=迁移保险库
migration.run.progressHint=这可能需要一些时间…
-## Sucess
+## Success
migration.success.nextStepsInstructions=已成功迁移 "%s"\n您现在可以解锁您的保险库。
migration.success.unlockNow=立即解锁
## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=此保险库不能自动迁移,因为它的存储
migration.impossible.moreInfo=此保险库仍可使用旧版本来打开。关于如何手动迁移保险库的操作指南,请访问
# Health Check
-health.title=保险库健康检查
-health.start.introduction=保险库健康检查包含一系列检查,用于检测和尝试修复保险库内部结构中的问题。请注意,并非所有问题都能修复。需要密码来执行检查
-health.start.configValid=读取并解析保险库配置文件成功,继续选择检查
-health.start.configInvalid=读取和解析保险库配置文件时出错
-health.checkList.header=可用的健康检查
-health.checkList.selectAllBox=全选
+## Start
+health.title=健康检查 "%s"
+health.intro.header=健康检查
+health.intro.text="健康检查" 包含一系列检查,用于检测并尝试修复您保险库内部结构中的问题。请记住:
+health.intro.remarkSync=请确保所有设备完全完成同步,这能解决绝大部分问题
+health.intro.remarkFix=并非所有问题都能够修复
+health.intro.remarkBackup=如果数据损坏,则只能依靠旧备份了
+health.intro.affirmation=我已阅读并理解上述信息
+## Start Failure
+health.fail.header=加载保险库配置时出错
+health.fail.ioError=访问和读取配置文件时出错
+health.fail.parseError=解析保险库配置时出错
+health.fail.moreInfo=更多信息
+## Check Selection
+health.checkList.description=选择左侧列表中的检查或使用下方按钮
+health.checkList.selectAllButton=选择 "检查全部"
+health.checkList.deselectAllButton=取消选择 "检查全部"
health.check.runBatchBtn=运行选中的检查
## Detail view
health.check.detail.noSelectedCheck=要查看结果请在左侧列表中选择一个已完成的健康检查
-health.check.detail.header=%s 的结果
-health.check.detail.taskNotStarted=未选择运行该检查
-health.check.detail.taskScheduled=此为计划检查
-health.check.detail.taskRunning=检查正在运行…
-health.check.detail.taskSucceeded=%d 毫秒后检查成功完成
-health.check.detail.taskFailed=检查由于出错而退出
-health.check.detail.taskCancelled=检查已被取消
-health.check.detail.problemCount=找到 %d 个问题和 %d 个无法修复的错误
+health.check.detail.checkScheduled=此为计划检查
+health.check.detail.checkRunning=检查正在运行…
+health.check.detail.checkSkipped=未选择运行该检查
+health.check.detail.checkFinished=成功完成检查
+health.check.detail.checkFinishedAndFound=检查运行完成,请查看结果
+health.check.detail.checkFailed=检查由于出错而退出
+health.check.detail.checkCancelled=检查已被取消
health.check.exportBtn=导出报告
-health.check.fixBtn=修复
-## Checks
-health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=目录检查
+## Fix Application
+health.fix.fixBtn=修复
+health.fix.successTip=修复成功
+health.fix.failTip=修复失败,请查看日志获取详情
# Preferences
preferences.title=首选项
@@ -184,10 +198,6 @@ preferences.general.debugLogging=启用调试日志
preferences.general.debugDirectory=显示日志文件
preferences.general.autoStart=开机自动启动
preferences.general.keychainBackend=存储密码方式
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE 钱包
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS 钥匙串访问
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows 数据保护
preferences.general.interfaceOrientation=界面方向
preferences.general.interfaceOrientation.ltr=从左到右
preferences.general.interfaceOrientation.rtl=从右到左
@@ -289,6 +299,10 @@ main.vaultDetail.missing.changeLocation=更改保险库位置…
### Needs Migration
main.vaultDetail.migrateButton=升级保险库
main.vaultDetail.migratePrompt=您的保险库需要升级到新格式,然后才能访问
+### Error
+main.vaultDetail.error.info=从磁盘加载保险库时发生错误
+main.vaultDetail.error.reload=重新加载
+main.vaultDetail.error.windowTitle=加载保险库时出错
# Wrong File Alert
wrongFileAlert.title=如何加密文件
@@ -304,12 +318,15 @@ wrongFileAlert.link=如需进一步帮助,请访问
## General
vaultOptions.general=常规
vaultOptions.general.vaultName=保险库名称
+vaultOptions.general.autoLock.lockAfterTimePart1=空闲超时
+vaultOptions.general.autoLock.lockAfterTimePart2=分钟后自动锁定
vaultOptions.general.unlockAfterStartup=启动 Cryptomator 时解锁保险库 (此功能需先勾选保存密码)
vaultOptions.general.actionAfterUnlock=解锁成功后的操作
vaultOptions.general.actionAfterUnlock.ignore=什么也不做
vaultOptions.general.actionAfterUnlock.reveal=显示驱动器
vaultOptions.general.actionAfterUnlock.ask=询问
-vaultOptions.general.healthBtn=开始健康检查
+vaultOptions.general.startHealthCheckBtn=开始健康检查
+
## Mount
vaultOptions.mount=挂载
vaultOptions.mount.readonly=只读
@@ -325,13 +342,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=选择一个空目录
vaultOptions.masterkey=密码
vaultOptions.masterkey.changePasswordBtn=更改密码
vaultOptions.masterkey.forgetSavedPasswordBtn=忘记保存的密码
-vaultOptions.masterkey.recoveryKeyExpanation=忘记密码时,恢复密钥是你恢复保险库访问权限的唯一方式!!!
+vaultOptions.masterkey.recoveryKeyExplanation=忘记密码时,恢复密钥是你恢复保险库访问权限的唯一方式!!!
vaultOptions.masterkey.showRecoveryKeyBtn=显示恢复密钥
vaultOptions.masterkey.recoverPasswordBtn=恢复密码
-## Auto Lock
-vaultOptions.autoLock=自动锁定
-vaultOptions.autoLock.lockAfterTimePart1=空闲超时
-vaultOptions.autoLock.lockAfterTimePart2=分钟后自动锁定
+
# Recovery Key
recoveryKey.title=恢复密钥
diff --git a/src/main/resources/i18n/strings_zh_TW.properties b/src/main/resources/i18n/strings_zh_TW.properties
index 83e88b64b..fff4094e5 100644
--- a/src/main/resources/i18n/strings_zh_TW.properties
+++ b/src/main/resources/i18n/strings_zh_TW.properties
@@ -13,8 +13,6 @@ generic.button.done=完成
generic.button.next=繼續
generic.button.print=列印
## Error
-generic.error.title=發生未知錯誤
-generic.error.instruction=這不應該發生。請回報下方的錯誤訊息,並附上造成這個錯誤的步驟。
# Defaults
defaults.vault.vaultName=加密檔案庫
@@ -95,11 +93,12 @@ forgetPassword.information=這將會從系統鑰匙圈中移除這個加密檔
forgetPassword.confirmBtn=忘記密碼
# Unlock
-unlock.title=解鎖加密檔案庫
+unlock.title=解鎖 %s
unlock.passwordPrompt=輸入 "%s" 的密碼:
unlock.savePassword=記住密碼
unlock.unlockBtn=解鎖
##
+unlock.chooseMasterkey.prompt=無法在其預期位置找到此保管庫的主密鑰文件。請手動選擇密鑰文件。
unlock.chooseMasterkey.filePickerTitle=選擇主金鑰檔案
## Success
unlock.success.message=成功解鎖 "%s"!您現在可以存存取您的加密檔案庫。
@@ -129,7 +128,7 @@ migration.start.confirm=是的,我的加密檔案庫已同步完成
migration.run.enterPassword=輸入 "%s" 的密碼
migration.run.startMigrationBtn=升級加密檔案庫
migration.run.progressHint=這可能需要一點時間…
-## Sucess
+## Success
migration.success.nextStepsInstructions=已成功升級 "%s"。\n您現在可以解鎖您的加密檔案庫了。
migration.success.unlockNow=立即解鎖
## Missing file system capabilities
@@ -145,8 +144,38 @@ migration.impossible.reason=此加密檔案庫無法自動升級,因為它的
migration.impossible.moreInfo=此加密檔案庫仍可被舊版本開啟。如需手動升級加密檔案庫的操作指引,請參照
# Health Check
+## Start
+health.title=對於"%s"的健康檢查
+health.intro.header=健康檢查
+health.intro.text=運行狀況檢查用於檢測並修復保管庫內部結構中的問題。請記住:
+health.intro.remarkSync=確保所有設備完全同步,這可以解決大部分問題。
+health.intro.remarkFix=並非所有問題都可以解決。
+health.intro.remarkBackup=如果數據已損壞,則只有備份才有幫助。
+health.intro.affirmation=我已閱讀並理解上述資訊
+## Start Failure
+health.fail.header=加載Vault配寘時出錯
+health.fail.ioError=訪問和讀取配置文件時發生錯誤。
+health.fail.parseError=分析vault配寘時出錯。
+health.fail.moreInfo=更多信息
+## Check Selection
+health.checkList.description=在左側列表中選擇檢查或使用下面的按鈕。
+health.checkList.selectAllButton=選擇所有選項
+health.checkList.deselectAllButton=取消所有選擇
+health.check.runBatchBtn=運行選定的檢查
## Detail view
-## Checks
+health.check.detail.noSelectedCheck=請在左側清單中選擇已完成的結果運行狀況檢查。
+health.check.detail.checkScheduled=檢查已安排。
+health.check.detail.checkRunning=檢查目前正在運行…
+health.check.detail.checkSkipped=未選擇運行檢查。
+health.check.detail.checkFinished=檢查順利完成。
+health.check.detail.checkFinishedAndFound=檢查結束。請檢查結果。
+health.check.detail.checkFailed=發生錯誤,檢查意外退出。
+health.check.detail.checkCancelled=檢查被取消。
+health.check.exportBtn=匯出報告
+## Fix Application
+health.fix.fixBtn=修復
+health.fix.successTip=修復成功
+health.fix.failTip=修復失敗,詳情請查看日誌
# Preferences
preferences.title=偏好
@@ -164,10 +193,6 @@ preferences.general.debugLogging=啟用除錯日誌
preferences.general.debugDirectory=顯示日誌檔
preferences.general.autoStart=系統啟動時同時啟動 Cryptomator
preferences.general.keychainBackend=儲存密碼使用
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome 鑰匙圈
-preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE 錢包
-preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS 鑰匙圈
-preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows 數據保護
preferences.general.interfaceOrientation=界面排版方向
preferences.general.interfaceOrientation.ltr=由左至右
preferences.general.interfaceOrientation.rtl=由右至左
@@ -269,6 +294,7 @@ main.vaultDetail.missing.changeLocation=更改加密檔案庫位置…
### Needs Migration
main.vaultDetail.migrateButton=升級加密檔案庫
main.vaultDetail.migratePrompt=您必須先更新加密檔案庫才能存取內容
+### Error
# Wrong File Alert
wrongFileAlert.title=如何加密檔案
@@ -284,11 +310,15 @@ wrongFileAlert.link=如需進一步協助協助,請參照
## General
vaultOptions.general=一般
vaultOptions.general.vaultName=加密檔案庫名稱
+vaultOptions.general.autoLock.lockAfterTimePart1=空閒時鎖定
+vaultOptions.general.autoLock.lockAfterTimePart2=分鐘
vaultOptions.general.unlockAfterStartup=啟動 Cryptomator 時解鎖加密檔案庫
vaultOptions.general.actionAfterUnlock=成功解鎖後
vaultOptions.general.actionAfterUnlock.ignore=無動作
vaultOptions.general.actionAfterUnlock.reveal=顯示磁碟
vaultOptions.general.actionAfterUnlock.ask=詢問
+vaultOptions.general.startHealthCheckBtn=開始健康檢查
+
## Mount
vaultOptions.mount=掛載
vaultOptions.mount.readonly=唯讀
@@ -304,10 +334,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=選取一個空的資料夾
vaultOptions.masterkey=密碼
vaultOptions.masterkey.changePasswordBtn=變更密碼
vaultOptions.masterkey.forgetSavedPasswordBtn=清除已存密碼
-vaultOptions.masterkey.recoveryKeyExpanation=復原金鑰僅用於在您遺失密碼時恢復存取能力。
+vaultOptions.masterkey.recoveryKeyExplanation=復原金鑰僅用於在您遺失密碼時恢復存取能力。
vaultOptions.masterkey.showRecoveryKeyBtn=顯示復原金鑰
vaultOptions.masterkey.recoverPasswordBtn=重置密碼
-## Auto Lock
+
# Recovery Key
recoveryKey.title=復原金鑰
diff --git a/src/main/resources/img/select-masterkey-mac-dark.png b/src/main/resources/img/select-masterkey-mac-dark.png
new file mode 100644
index 000000000..0f1f62a04
Binary files /dev/null and b/src/main/resources/img/select-masterkey-mac-dark.png differ
diff --git a/src/main/resources/img/select-masterkey-mac-dark@2x.png b/src/main/resources/img/select-masterkey-mac-dark@2x.png
new file mode 100644
index 000000000..db81bf652
Binary files /dev/null and b/src/main/resources/img/select-masterkey-mac-dark@2x.png differ
diff --git a/src/main/resources/img/select-masterkey-mac.png b/src/main/resources/img/select-masterkey-mac.png
index c5aacd82f..355814840 100644
Binary files a/src/main/resources/img/select-masterkey-mac.png and b/src/main/resources/img/select-masterkey-mac.png differ
diff --git a/src/main/resources/img/select-masterkey-mac@2x.png b/src/main/resources/img/select-masterkey-mac@2x.png
new file mode 100644
index 000000000..672de4822
Binary files /dev/null and b/src/main/resources/img/select-masterkey-mac@2x.png differ
diff --git a/src/main/resources/img/select-masterkey-win.png b/src/main/resources/img/select-masterkey-win.png
index 81d29214d..d933c9fb6 100644
Binary files a/src/main/resources/img/select-masterkey-win.png and b/src/main/resources/img/select-masterkey-win.png differ
diff --git a/src/main/resources/img/select-masterkey-win@2x.png b/src/main/resources/img/select-masterkey-win@2x.png
new file mode 100644
index 000000000..4de5a0f12
Binary files /dev/null and b/src/main/resources/img/select-masterkey-win@2x.png differ
diff --git a/src/main/resources/img/tray_icon_mac.png b/src/main/resources/img/tray_icon_mac.png
new file mode 100755
index 000000000..b0f2c7894
Binary files /dev/null and b/src/main/resources/img/tray_icon_mac.png differ
diff --git a/src/main/resources/img/tray_icon_mac@2x.png b/src/main/resources/img/tray_icon_mac@2x.png
new file mode 100755
index 000000000..a6cdd32b9
Binary files /dev/null and b/src/main/resources/img/tray_icon_mac@2x.png differ
diff --git a/src/main/resources/img/tray_icon_mac_black.png b/src/main/resources/img/tray_icon_mac_black.png
deleted file mode 100644
index 42d6aad40..000000000
Binary files a/src/main/resources/img/tray_icon_mac_black.png and /dev/null differ
diff --git a/src/main/resources/img/tray_icon_mac_black@2x.png b/src/main/resources/img/tray_icon_mac_black@2x.png
deleted file mode 100644
index c93a96579..000000000
Binary files a/src/main/resources/img/tray_icon_mac_black@2x.png and /dev/null differ
diff --git a/src/main/resources/img/tray_icon_mac_white.png b/src/main/resources/img/tray_icon_mac_white.png
deleted file mode 100644
index d178cd017..000000000
Binary files a/src/main/resources/img/tray_icon_mac_white.png and /dev/null differ
diff --git a/src/main/resources/img/tray_icon_mac_white@2x.png b/src/main/resources/img/tray_icon_mac_white@2x.png
deleted file mode 100644
index 8c721bbce..000000000
Binary files a/src/main/resources/img/tray_icon_mac_white@2x.png and /dev/null differ
diff --git a/src/main/resources/license/THIRD-PARTY.txt b/src/main/resources/license/THIRD-PARTY.txt
index 6f06bbb39..e58486ddd 100644
--- a/src/main/resources/license/THIRD-PARTY.txt
+++ b/src/main/resources/license/THIRD-PARTY.txt
@@ -13,18 +13,16 @@ along with this program. If not, see http://www.gnu.org/licenses/.
Cryptomator uses 43 third-party dependencies under the following licenses:
Apache License v2.0:
- - jffi (com.github.jnr:jffi:1.2.23 - http://github.com/jnr/jffi)
+ - jffi (com.github.jnr:jffi:1.3.5 - http://github.com/jnr/jffi)
- jnr-a64asm (com.github.jnr:jnr-a64asm:1.0.0 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-a64asm)
- - jnr-constants (com.github.jnr:jnr-constants:0.9.15 - http://github.com/jnr/jnr-constants)
- - jnr-ffi (com.github.jnr:jnr-ffi:2.1.12 - http://github.com/jnr/jnr-ffi)
- - Gson (com.google.code.gson:gson:2.8.7 - https://github.com/google/gson/gson)
- - Dagger (com.google.dagger:dagger:2.37 - https://github.com/google/dagger)
+ - jnr-constants (com.github.jnr:jnr-constants:0.10.2 - http://github.com/jnr/jnr-constants)
+ - jnr-ffi (com.github.jnr:jnr-ffi:2.2.7 - http://github.com/jnr/jnr-ffi)
+ - Gson (com.google.code.gson:gson:2.8.8 - https://github.com/google/gson/gson)
+ - Dagger (com.google.dagger:dagger:2.39 - https://github.com/google/dagger)
- Guava InternalFutureFailureAccess and InternalFutures (com.google.guava:failureaccess:1.0.1 - https://github.com/google/guava/failureaccess)
- - Guava: Google Core Libraries for Java (com.google.guava:guava:30.1.1-jre - https://github.com/google/guava/guava)
+ - Guava: Google Core Libraries for Java (com.google.guava:guava:31.0-jre - https://github.com/google/guava)
- Apache Commons CLI (commons-cli:commons-cli:1.4 - http://commons.apache.org/proper/commons-cli/)
- javax.inject (javax.inject:javax.inject:1 - http://code.google.com/p/atinject/)
- - Java Native Access (net.java.dev.jna:jna:5.7.0 - https://github.com/java-native-access/jna)
- - Java Native Access Platform (net.java.dev.jna:jna-platform:5.7.0 - https://github.com/java-native-access/jna)
- Apache Commons Lang (org.apache.commons:commons-lang3:3.12.0 - https://commons.apache.org/proper/commons-lang/)
- Apache HttpCore (org.apache.httpcomponents:httpcore:4.4.14 - http://hc.apache.org/httpcomponents-core-ga)
- Jackrabbit WebDAV Library (org.apache.jackrabbit:jackrabbit-webdav:2.21.5 - http://jackrabbit.apache.org/jackrabbit-webdav/)
@@ -38,12 +36,15 @@ Cryptomator uses 43 third-party dependencies under the following licenses:
- Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:10.0.6 - https://eclipse.org/jetty/jetty-webapp)
- Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:10.0.6 - https://eclipse.org/jetty/jetty-xml)
- Jetty :: Servlet API and Schemas for JPMS and OSGi (org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.6 - https://eclipse.org/jetty/jetty-servlet-api)
- BSD:
- - asm (org.ow2.asm:asm:7.1 - http://asm.ow2.org/)
- - asm-analysis (org.ow2.asm:asm-analysis:7.1 - http://asm.ow2.org/)
- - asm-commons (org.ow2.asm:asm-commons:7.1 - http://asm.ow2.org/)
- - asm-tree (org.ow2.asm:asm-tree:7.1 - http://asm.ow2.org/)
- - asm-util (org.ow2.asm:asm-util:7.1 - http://asm.ow2.org/)
+ Apache-2.0:
+ - Java Native Access (net.java.dev.jna:jna:5.9.0 - https://github.com/java-native-access/jna)
+ - Java Native Access Platform (net.java.dev.jna:jna-platform:5.9.0 - https://github.com/java-native-access/jna)
+ BSD-3-Clause:
+ - asm (org.ow2.asm:asm:9.2 - http://asm.ow2.io/)
+ - asm-analysis (org.ow2.asm:asm-analysis:9.2 - http://asm.ow2.io/)
+ - asm-commons (org.ow2.asm:asm-commons:9.2 - http://asm.ow2.io/)
+ - asm-tree (org.ow2.asm:asm-tree:9.2 - http://asm.ow2.io/)
+ - asm-util (org.ow2.asm:asm-util:9.2 - http://asm.ow2.io/)
Eclipse Public License - Version 1.0:
- Jetty :: Servlet API and Schemas for JPMS and OSGi (org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.6 - https://eclipse.org/jetty/jetty-servlet-api)
Eclipse Public License - Version 2.0:
@@ -57,30 +58,31 @@ Cryptomator uses 43 third-party dependencies under the following licenses:
- Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:10.0.6 - https://eclipse.org/jetty/jetty-webapp)
- Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:10.0.6 - https://eclipse.org/jetty/jetty-xml)
Eclipse Public License - v 1.0:
- - Logback Classic Module (ch.qos.logback:logback-classic:1.2.3 - http://logback.qos.ch/logback-classic)
- - Logback Core Module (ch.qos.logback:logback-core:1.2.3 - http://logback.qos.ch/logback-core)
+ - Logback Classic Module (ch.qos.logback:logback-classic:1.2.6 - http://logback.qos.ch/logback-classic)
+ - Logback Core Module (ch.qos.logback:logback-core:1.2.6 - http://logback.qos.ch/logback-core)
Eclipse Public License - v 2.0:
- - jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
+ - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
GNU Lesser General Public License:
- - Logback Classic Module (ch.qos.logback:logback-classic:1.2.3 - http://logback.qos.ch/logback-classic)
- - Logback Core Module (ch.qos.logback:logback-core:1.2.3 - http://logback.qos.ch/logback-core)
+ - Logback Classic Module (ch.qos.logback:logback-classic:1.2.6 - http://logback.qos.ch/logback-classic)
+ - Logback Core Module (ch.qos.logback:logback-core:1.2.6 - http://logback.qos.ch/logback-core)
GPLv2:
- - jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
+ - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
GPLv2+CE:
- - javafx-base (org.openjfx:javafx-base:16 - https://openjdk.java.net/projects/openjfx/javafx-base/)
- - javafx-controls (org.openjfx:javafx-controls:16 - https://openjdk.java.net/projects/openjfx/javafx-controls/)
- - javafx-fxml (org.openjfx:javafx-fxml:16 - https://openjdk.java.net/projects/openjfx/javafx-fxml/)
- - javafx-graphics (org.openjfx:javafx-graphics:16 - https://openjdk.java.net/projects/openjfx/javafx-graphics/)
+ - javafx-base (org.openjfx:javafx-base:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-base/)
+ - javafx-controls (org.openjfx:javafx-controls:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-controls/)
+ - javafx-fxml (org.openjfx:javafx-fxml:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-fxml/)
+ - javafx-graphics (org.openjfx:javafx-graphics:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-graphics/)
LGPL 2.1:
- - jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
- - Java Native Access (net.java.dev.jna:jna:5.7.0 - https://github.com/java-native-access/jna)
- - Java Native Access Platform (net.java.dev.jna:jna-platform:5.7.0 - https://github.com/java-native-access/jna)
+ - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
+ LGPL-2.1-or-later:
+ - Java Native Access (net.java.dev.jna:jna:5.9.0 - https://github.com/java-native-access/jna)
+ - Java Native Access Platform (net.java.dev.jna:jna-platform:5.9.0 - https://github.com/java-native-access/jna)
MIT License:
- - java jwt (com.auth0:java-jwt:3.18.1 - https://github.com/auth0/java-jwt)
+ - java jwt (com.auth0:java-jwt:3.18.2 - https://github.com/auth0/java-jwt)
- jnr-x86asm (com.github.jnr:jnr-x86asm:1.0.2 - http://github.com/jnr/jnr-x86asm)
- - jnr-fuse (com.github.serceman:jnr-fuse:0.5.5 - https://github.com/SerCeMan/jnr-fuse)
+ - jnr-fuse (com.github.serceman:jnr-fuse:0.5.7 - https://github.com/SerCeMan/jnr-fuse)
- zxcvbn4j (com.nulab-inc:zxcvbn:1.5.2 - https://github.com/nulab/zxcvbn4j)
- - SLF4J API Module (org.slf4j:slf4j-api:1.7.31 - http://www.slf4j.org)
+ - SLF4J API Module (org.slf4j:slf4j-api:1.7.32 - http://www.slf4j.org)
The BSD 2-Clause License:
- EasyBind (com.tobiasdiez:easybind:2.2 - https://github.com/tobiasdiez/EasyBind)
diff --git a/src/test/java/org/cryptomator/common/ErrorCodeTest.java b/src/test/java/org/cryptomator/common/ErrorCodeTest.java
new file mode 100644
index 000000000..ebe6d90ce
--- /dev/null
+++ b/src/test/java/org/cryptomator/common/ErrorCodeTest.java
@@ -0,0 +1,203 @@
+package org.cryptomator.common;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Splitter;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.converter.ConvertWith;
+import org.junit.jupiter.params.converter.SimpleArgumentConverter;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.mockito.Mockito;
+
+public class ErrorCodeTest {
+
+ private final StackTraceElement foo = new StackTraceElement("ErrorCodeTest", "foo", null, 0);
+ private final StackTraceElement bar = new StackTraceElement("ErrorCodeTest", "bar", null, 0);
+ private final StackTraceElement baz = new StackTraceElement("ErrorCodeTest", "baz", null, 0);
+ private final Exception fooException = Mockito.mock(NullPointerException.class, "fooException");
+
+ @Test
+ @DisplayName("same exception leads to same error code")
+ public void testDeterministicErrorCode() {
+ Mockito.doReturn(new StackTraceElement[]{foo, bar, baz}).when(fooException).getStackTrace();
+ var code1 = ErrorCode.of(fooException);
+ var code2 = ErrorCode.of(fooException);
+
+ Assertions.assertEquals(code1.toString(), code2.toString());
+ }
+
+ @Test
+ @DisplayName("three error code segments change independently")
+ public void testErrorCodeSegments() {
+ Exception fooBarException = Mockito.mock(IndexOutOfBoundsException.class, "fooBarException");
+ Mockito.doReturn(new StackTraceElement[]{foo, foo, foo}).when(fooBarException).getStackTrace();
+ Mockito.doReturn(fooException).when(fooBarException).getCause();
+ Mockito.doReturn(new StackTraceElement[]{bar, bar, bar, foo, foo, foo}).when(fooException).getStackTrace();
+
+ var code = ErrorCode.of(fooBarException);
+
+ Assertions.assertNotEquals(code.throwableCode(), code.rootCauseCode());
+ Assertions.assertNotEquals(code.rootCauseCode(), code.methodCode());
+ }
+
+ @DisplayName("commonSuffixLength()")
+ @ParameterizedTest
+ @CsvSource({"1 2 3, 1 2 3, 3", "1 2 3, 0 2 3, 2", "1 2 3 4, 3 4, 2", "1 2 3 4, 5 6, 0", "1 2 3 4 5 6,, 0",})
+ public void commonSuffixLength1(@ConvertWith(IntegerArrayConverter.class) Integer[] set, @ConvertWith(IntegerArrayConverter.class) Integer[] subset, int expected) {
+ var result = ErrorCode.commonSuffixLength(set, subset);
+
+ Assertions.assertEquals(expected, result);
+ }
+
+ @DisplayName("commonSuffixLength() with too short array")
+ @ParameterizedTest
+ @CsvSource({"1 2, 3 4 5 6", ",1 2 3 4 5 6",})
+ public void commonSuffixLength2(@ConvertWith(IntegerArrayConverter.class) Integer[] set, @ConvertWith(IntegerArrayConverter.class) Integer[] subset) {
+ Assertions.assertThrows(IllegalArgumentException.class, () -> {
+ ErrorCode.commonSuffixLength(set, subset);
+ });
+ }
+
+ @Test
+ @DisplayName("countTopmostFrames() with partially overlapping suffix")
+ public void testCountTopmostFrames1() {
+ var allFrames = new StackTraceElement[]{foo, bar, baz, bar, foo};
+ var bottomFrames = new StackTraceElement[]{baz, bar, foo};
+
+ int result = ErrorCode.countTopmostFrames(allFrames, bottomFrames);
+
+ Assertions.assertEquals(2, result);
+ }
+
+ @Test
+ @DisplayName("countTopmostFrames() without overlapping suffix")
+ public void testCountTopmostFrames2() {
+ var allFrames = new StackTraceElement[]{foo, foo, foo};
+ var bottomFrames = new StackTraceElement[]{bar, bar, bar};
+
+ int result = ErrorCode.countTopmostFrames(allFrames, bottomFrames);
+
+ Assertions.assertEquals(3, result);
+ }
+
+ @Test
+ @DisplayName("countUniqueFrames() fully overlapping")
+ public void testCountUniqueFrames3() {
+ var allFrames = new StackTraceElement[]{foo, bar, baz};
+ var bottomFrames = new StackTraceElement[]{foo, bar, baz};
+
+ int result = ErrorCode.countTopmostFrames(allFrames, bottomFrames);
+
+ Assertions.assertEquals(0, result);
+ }
+
+ @DisplayName("when different exception with same root cause")
+ @Nested
+ public class DifferentExceptionWithSameRootCause {
+
+ private final Exception fooBarException = Mockito.mock(IllegalArgumentException.class, "fooBarException");
+ private final Exception fooBazException = Mockito.mock(IndexOutOfBoundsException.class, "fooBazException");
+
+ private ErrorCode code1;
+ private ErrorCode code2;
+
+ @BeforeEach
+ public void setup() {
+ Mockito.doReturn(new StackTraceElement[]{baz, bar, foo}).when(fooException).getStackTrace();
+ Mockito.doReturn(new StackTraceElement[]{foo}).when(fooBarException).getStackTrace();
+ Mockito.doReturn(new StackTraceElement[]{foo}).when(fooBazException).getStackTrace();
+ Mockito.doReturn(fooException).when(fooBarException).getCause();
+ Mockito.doReturn(fooException).when(fooBazException).getCause();
+ this.code1 = ErrorCode.of(fooBarException);
+ this.code2 = ErrorCode.of(fooBazException);
+ }
+
+ @Test
+ @DisplayName("error codes are different")
+ public void testDifferentCodes() {
+ Assertions.assertNotEquals(code1.toString(), code2.toString());
+ }
+
+ @Test
+ @DisplayName("throwableCodes are different")
+ public void testDifferentThrowableCodes() {
+ Assertions.assertNotEquals(code1.throwableCode(), code2.throwableCode());
+ }
+
+ @Test
+ @DisplayName("rootCauseCodes are equal")
+ public void testSameRootCauseCodes() {
+ Assertions.assertEquals(code1.rootCauseCode(), code2.rootCauseCode());
+ }
+
+ @Test
+ @DisplayName("methodCode are equal")
+ public void testSameMethodCodes() {
+ Assertions.assertEquals(code1.methodCode(), code2.methodCode());
+ }
+
+ }
+
+ @DisplayName("when same exception with different call stacks")
+ @Nested
+ public class SameExceptionDifferentCallStack {
+
+ private final Exception barException = Mockito.mock(NullPointerException.class, "barException");
+
+ private ErrorCode code1;
+ private ErrorCode code2;
+
+ @BeforeEach
+ public void setup() {
+ Mockito.doReturn(new StackTraceElement[]{foo, bar, baz}).when(fooException).getStackTrace();
+ Mockito.doReturn(new StackTraceElement[]{foo, baz, bar}).when(barException).getStackTrace();
+ this.code1 = ErrorCode.of(fooException);
+ this.code2 = ErrorCode.of(barException);
+ }
+
+ @Test
+ @DisplayName("error codes are different")
+ public void testDifferentCodes() {
+ Assertions.assertNotEquals(code1.toString(), code2.toString());
+ }
+
+ @Test
+ @DisplayName("throwableCodes are different")
+ public void testDifferentThrowableCodes() {
+ Assertions.assertNotEquals(code1.throwableCode(), code2.throwableCode());
+ }
+
+ @Test
+ @DisplayName("rootCauseCodes are different")
+ public void testSameRootCauseCodes() {
+ Assertions.assertNotEquals(code1.rootCauseCode(), code2.rootCauseCode());
+ }
+
+ @Test
+ @DisplayName("methodCode are equal")
+ public void testSameMethodCodes() {
+ Assertions.assertEquals(code1.methodCode(), code2.methodCode());
+ }
+
+ }
+
+ public static class IntegerArrayConverter extends SimpleArgumentConverter {
+
+ @Override
+ protected Integer[] convert(Object source, Class> targetType) {
+ if (source == null) {
+ return new Integer[0];
+ } else if (source instanceof String s && Integer[].class.isAssignableFrom(targetType)) {
+ return Splitter.on(CharMatcher.inRange('0', '9').negate()).splitToStream(s).map(Integer::valueOf).toArray(Integer[]::new);
+ } else {
+ throw new IllegalArgumentException("Conversion from " + source.getClass() + " to " + targetType + " not supported.");
+ }
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/test/java/org/cryptomator/common/keychain/MapKeychainAccess.java b/src/test/java/org/cryptomator/common/keychain/MapKeychainAccess.java
index 1b2bedfce..dbffae92e 100644
--- a/src/test/java/org/cryptomator/common/keychain/MapKeychainAccess.java
+++ b/src/test/java/org/cryptomator/common/keychain/MapKeychainAccess.java
@@ -14,6 +14,11 @@ class MapKeychainAccess implements KeychainAccessProvider {
private final Map map = new HashMap<>();
+ @Override
+ public String displayName() {
+ return getClass().getName();
+ }
+
@Override
public void storePassphrase(String key, CharSequence passphrase) {
char[] pw = new char[passphrase.length()];