+
- [Jameson Lopp](https://www.lopp.net/)
---
diff --git a/dist/linux/debian/changelog b/dist/linux/debian/changelog
index 84a9756f9..2c7606733 100644
--- a/dist/linux/debian/changelog
+++ b/dist/linux/debian/changelog
@@ -1,4 +1,4 @@
-cryptomator (${PPA_VERSION}) focal; urgency=low
+cryptomator (${PPA_VERSION}) bionic; urgency=low
* Full changelog can be found on https://github.com/cryptomator/cryptomator/releases
diff --git a/dist/mac/dmg/.gitignore b/dist/mac/dmg/.gitignore
index 738927994..c186170c9 100644
--- a/dist/mac/dmg/.gitignore
+++ b/dist/mac/dmg/.gitignore
@@ -1,3 +1,4 @@
# created during build
runtime/
-*.app/
+dmg/
+*.dmg
diff --git a/dist/mac/dmg/build.sh b/dist/mac/dmg/build.sh
index 6051e6f4c..b8d17cbe0 100755
--- a/dist/mac/dmg/build.sh
+++ b/dist/mac/dmg/build.sh
@@ -16,13 +16,14 @@ shift "$((OPTIND-1))"
# prepare working dir and variables
cd $(dirname $0)
-rm -rf runtime *.app
+rm -rf runtime dmg
REVISION_NO=`git rev-list --count HEAD`
VERSION_NO=`mvn -f../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout | sed -rn 's/.*([0-9]+\.[0-9]+\.[0-9]+).*/\1/p'`
# check preconditions
if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi
command -v mvn >/dev/null 2>&1 || { echo >&2 "mvn not found."; exit 1; }
+command -v create-dmg >/dev/null 2>&1 || { echo >&2 "create-dmg not found."; exit 1; }
if [ -n "${CODESIGN_IDENTITY}" ]; then
command -v codesign >/dev/null 2>&1 || { echo >&2 "codesign not found. Fix by 'xcode-select --install'."; exit 1; }
if [[ ! `security find-identity -v -p codesigning | grep -w "${CODESIGN_IDENTITY}"` ]]; then echo "Given codesign identity is invalid."; exit 1; fi
@@ -59,6 +60,7 @@ ${JAVA_HOME}/bin/jpackage \
--java-options "-Dcryptomator.appVersion=\"${VERSION_NO}\"" \
--app-version "${VERSION_NO}" \
--java-options "-Dfile.encoding=\"utf-8\"" \
+ --java-options "-Dapple.awt.enableTemplateImages=true" \
--java-options "-Dcryptomator.logDir=\"~/Library/Logs/Cryptomator\"" \
--java-options "-Dcryptomator.pluginDir=\"~/Library/Application Support/Cryptomator/Plugins\"" \
--java-options "-Dcryptomator.settingsPath=\"~/Library/Application Support/Cryptomator/settings.json\"" \
@@ -94,3 +96,27 @@ if [ -n "${CODESIGN_IDENTITY}" ]; then
echo "Codesigning Cryptomator.app..."
codesign --force --deep --entitlements ../Cryptomator.entitlements -o runtime -s ${CODESIGN_IDENTITY} Cryptomator.app
fi
+
+# prepare dmg contents
+mkdir dmg
+mv Cryptomator.app dmg
+cp resources/macFUSE.webloc dmg
+
+# create dmg
+create-dmg \
+ --volname Cryptomator \
+ --volicon "resources/Cryptomator-Volume.icns" \
+ --background "resources/Cryptomator-background.tiff" \
+ --window-pos 400 100 \
+ --window-size 640 694 \
+ --icon-size 128 \
+ --icon "Cryptomator.app" 128 245 \
+ --hide-extension "Cryptomator.app" \
+ --icon "macFUSE.webloc" 320 501 \
+ --hide-extension "macFUSE.webloc" \
+ --app-drop-link 512 245 \
+ --eula "resources/license.rtf" \
+ --icon ".background" 128 758 \
+ --icon ".fseventsd" 320 758 \
+ --icon ".VolumeIcon.icns" 512 758 \
+ Cryptomator-${VERSION_NO}.dmg dmg
diff --git a/dist/win/.gitignore b/dist/win/.gitignore
new file mode 100644
index 000000000..2b66ddbed
--- /dev/null
+++ b/dist/win/.gitignore
@@ -0,0 +1,3 @@
+runtime
+Cryptomator
+installer
\ No newline at end of file
diff --git a/dist/win/build.bat b/dist/win/build.bat
new file mode 100644
index 000000000..8ca9183b4
--- /dev/null
+++ b/dist/win/build.bat
@@ -0,0 +1,2 @@
+@echo off
+powershell -NoLogo -NoExit -ExecutionPolicy Unrestricted -Command .\build.ps1
\ No newline at end of file
diff --git a/dist/win/build.ps1 b/dist/win/build.ps1
new file mode 100644
index 000000000..8ed5d9193
--- /dev/null
+++ b/dist/win/build.ps1
@@ -0,0 +1,90 @@
+# check preconditions
+if ((Get-Command "git" -ErrorAction SilentlyContinue) -eq $null)
+{
+ Write-Host "Unable to find git.exe in your PATH (try: choco install git)"
+ exit 1
+}
+if ((Get-Command "mvn" -ErrorAction SilentlyContinue) -eq $null)
+{
+ Write-Host "Unable to find mvn.cmd in your PATH (try: choco install maven)"
+ exit 1
+}
+
+$buildDir = Split-Path -Parent $PSCommandPath
+$version = $(mvn -f $buildDir/../../pom.xml help:evaluate -Dexpression="project.version" -q -DforceStdout)
+$semVerNo = $version -replace '(\d\.\d\.\d).*','$1'
+$revisionNo = $(git rev-list --count HEAD)
+
+Write-Output "`$version=$version"
+Write-Output "`$semVerNo=$semVerNo"
+Write-Output "`$revisionNo=$revisionNo"
+Write-Output "`$buildDir=$buildDir"
+Write-Output "`$Env:JAVA_HOME=$Env:JAVA_HOME"
+
+# compile
+&mvn -B -f $buildDir/../../pom.xml clean package -DskipTests -Pwin
+Copy-Item "$buildDir\..\..\target\cryptomator-*.jar" -Destination "$buildDir\..\..\target\mods"
+
+# add runtime
+& "$Env:JAVA_HOME\bin\jlink" `
+ --verbose `
+ --output runtime `
+ --module-path "$Env:JAVA_HOME/jmods" `
+ --add-modules java.base,java.desktop,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,jdk.unsupported,jdk.crypto.ec,jdk.accessibility `
+ --no-header-files `
+ --no-man-pages `
+ --strip-debug `
+ --compress=1
+
+# create app dir
+& "$Env:JAVA_HOME\bin\jpackage" `
+ --verbose `
+ --type app-image `
+ --runtime-image runtime `
+ --input ../../target/libs `
+ --module-path ../../target/mods `
+ --module org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator `
+ --dest . `
+ --name Cryptomator `
+ --vendor "Skymatic GmbH" `
+ --copyright "(C) 2016 - 2021 Skymatic GmbH" `
+ --java-options "-Xss5m" `
+ --java-options "-Xmx256m" `
+ --java-options "-Dcryptomator.appVersion=`"$semVerNo`"" `
+ --app-version "$semVerNo.$revisionNo" `
+ --java-options "-Dfile.encoding=`"utf-8`"" `
+ --java-options "-Dcryptomator.logDir=`"~/AppData/Roaming/Cryptomator`"" `
+ --java-options "-Dcryptomator.pluginDir=`"~/AppData/Roaming/Cryptomator/Plugins`"" `
+ --java-options "-Dcryptomator.settingsPath=`"~/AppData/Roaming/Cryptomator/settings.json`"" `
+ --java-options "-Dcryptomator.ipcSocketPath=`"~/AppData/Roaming/Cryptomator/ipc.socket`"" `
+ --java-options "-Dcryptomator.keychainPath=`"~/AppData/Roaming/Cryptomator/keychain.json`"" `
+ --java-options "-Dcryptomator.mountPointsDir=`"~/Cryptomator`"" `
+ --java-options "-Dcryptomator.showTrayIcon=true" `
+ --java-options "-Dcryptomator.buildNumber=`"msi-$revisionNo`"" `
+ --resource-dir resources `
+ --icon resources/Cryptomator.ico
+
+# patch app dir
+Copy-Item "contrib\*" -Destination "Cryptomator"
+attrib -r "Cryptomator\Cryptomator.exe"
+
+# create .msi bundle
+$Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources"
+& "$Env:JAVA_HOME\bin\jpackage" `
+ --verbose `
+ --type msi `
+ --win-upgrade-uuid bda45523-42b1-4cae-9354-a45475ed4775 `
+ --app-image Cryptomator `
+ --dest installer `
+ --name Cryptomator `
+ --vendor "Skymatic GmbH" `
+ --copyright "(C) 2016 - 2021 Skymatic GmbH" `
+ --app-version "$semVerNo" `
+ --win-menu `
+ --win-dir-chooser `
+ --win-shortcut-prompt `
+ --win-update-url "https:\\cryptomator.org" `
+ --win-menu-group Cryptomator `
+ --resource-dir resources `
+ --license-file resources/license.rtf `
+ --file-associations resources/FAvaultFile.properties
\ No newline at end of file
diff --git a/dist/win/contrib/patchWebDAV.bat b/dist/win/contrib/patchWebDAV.bat
new file mode 100644
index 000000000..e31249831
--- /dev/null
+++ b/dist/win/contrib/patchWebDAV.bat
@@ -0,0 +1,3 @@
+@echo off
+cd %~dp0
+powershell -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -Command .\patchWebDAV.ps1
\ No newline at end of file
diff --git a/dist/win/contrib/patchWebDAV.ps1 b/dist/win/contrib/patchWebDAV.ps1
new file mode 100644
index 000000000..51b063560
--- /dev/null
+++ b/dist/win/contrib/patchWebDAV.ps1
@@ -0,0 +1,61 @@
+#Requires -RunAsAdministrator
+
+# Adds for address 127.0.0.1 the 'cryptomator-vault' alias to the hosts file
+function Add-AliasToHost {
+ $sysdir = [Environment]::SystemDirectory
+ $hostsFile = "$sysdir\drivers\etc\hosts"
+ $aliasLine = '127.0.0.1 cryptomator-vault'
+
+ foreach ($line in Get-Content $hostsFile) {
+ if ($line -eq $aliasLine){
+ return
+ }
+ }
+
+ Add-Content -Path $hostsFile -Encoding ascii -Value "`r`n$aliasLine"
+}
+
+
+# Sets in the registry the webclient file size limit to the maximum value
+function Set-WebDAVFileSizeLimit {
+ # Set variables to indicate value and key to set
+ $RegistryPath = 'HKLM:\SYSTEM\CurrentControlSet\Services\WebClient\Parameters'
+ $Name = 'FileSizeLimitInBytes'
+ $Value = '0xffffffff'
+
+ # Create the key if it does not exist
+ If (-NOT (Test-Path $RegistryPath)) {
+ New-Item -Path $RegistryPath -Force | Out-Null
+ }
+
+ # Now set the value
+ New-ItemProperty -Path $RegistryPath -Name $Name -Value $Value -PropertyType DWORD -Force | Out-Null
+}
+
+
+# Changes the network provider order such that the builtin Windows webclient is always first
+function Edit-ProviderOrder {
+ $RegistryPath = 'HKLM:\SYSTEM\CurrentControlSet\Control\NetworkProvider\HwOrder'
+ $Name = 'ProviderOrder'
+ $WebClientString = 'webclient'
+
+ $CurrentOrder = (Get-ItemProperty $RegistryPath $Name).$Name
+
+ $OrderWithoutWebclientArray = $CurrentOrder -split ',' | Where-Object {$_ -ne $WebClientString}
+ $WebClientArray = @($WebClientString)
+
+ $UpdatedOrder = ($WebClientArray + $OrderWithoutWebclientArray) -join ","
+ New-ItemProperty -Path $RegistryPath -Name $Name -Value $UpdatedOrder -PropertyType String -Force | Out-Null
+}
+
+
+Add-AliasToHost
+Write-Output 'Ensured alias exists in hosts file'
+
+Set-WebDAVFileSizeLimit
+Write-Output 'Set WebDAV file size limit'
+
+Edit-ProviderOrder
+Write-Output 'Ensured correct provider order'
+
+exit 0
diff --git a/dist/win/resources/main.wxs b/dist/win/resources/main.wxs
index cd9677a1c..4954e1ea8 100644
--- a/dist/win/resources/main.wxs
+++ b/dist/win/resources/main.wxs
@@ -124,6 +124,9 @@
+
+
+
@@ -153,6 +156,8 @@
JP_DOWNGRADABLE_FOUND
+
+ NOT Installed OR REINSTALL
diff --git a/pom.xml b/pom.xml
index a14ecd291..0ad640f72 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0org.cryptomatorcryptomator
- 1.6.3
+ 1.6.4Cryptomator Desktop App
@@ -27,8 +27,8 @@
com.github.serceman,com.github.jnr,org.ow2.asm,net.java.dev.jna,org.apache.jackrabbit,org.apache.httpcomponents,de.swiesend,org.purejava,com.github.hypfvieh
- 2.1.1
- 1.0.0
+ 2.3.0
+ 1.1.0-beta11.0.01.0.01.0.1
@@ -37,16 +37,16 @@
1.2.6
- 17.0.0.1
+ 17.0.13.12.03.18.22.231.0-jre
- 2.39
- 2.8.8
+ 2.40.3
+ 2.8.91.5.21.7.32
- 1.2.6
+ 1.2.75.8.1
diff --git a/src/main/java/org/cryptomator/common/keychain/KeychainManager.java b/src/main/java/org/cryptomator/common/keychain/KeychainManager.java
index c97d0e9c9..d6adadfe4 100644
--- a/src/main/java/org/cryptomator/common/keychain/KeychainManager.java
+++ b/src/main/java/org/cryptomator/common/keychain/KeychainManager.java
@@ -49,6 +49,12 @@ public class KeychainManager implements KeychainAccessProvider {
setPassphraseStored(key, true);
}
+ @Override
+ public void storePassphrase(String key, String displayName, CharSequence passphrase) throws KeychainAccessException {
+ getKeychainOrFail().storePassphrase(key, displayName, passphrase);
+ setPassphraseStored(key, true);
+ }
+
@Override
public char[] loadPassphrase(String key) throws KeychainAccessException {
char[] passphrase = getKeychainOrFail().loadPassphrase(key);
@@ -70,6 +76,14 @@ public class KeychainManager implements KeychainAccessProvider {
}
}
+ @Override
+ public void changePassphrase(String key, String displayName, CharSequence passphrase) throws KeychainAccessException {
+ if (isPassphraseStored(key)) {
+ getKeychainOrFail().changePassphrase(key, displayName, passphrase);
+ setPassphraseStored(key, true);
+ }
+ }
+
@Override
public boolean isSupported() {
return keychain.getValue() != null;
diff --git a/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java b/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java
index 54519f21f..c715f0466 100644
--- a/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java
+++ b/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java
@@ -2,7 +2,7 @@ package org.cryptomator.ui.changepassword;
import org.cryptomator.common.keychain.KeychainManager;
import org.cryptomator.common.vaults.Vault;
-import org.cryptomator.cryptofs.common.MasterkeyBackupHelper;
+import org.cryptomator.cryptofs.common.BackupHelper;
import org.cryptomator.cryptolib.api.CryptoException;
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.common.MasterkeyFileAccess;
@@ -83,7 +83,7 @@ public class ChangePasswordController implements FxController {
Path masterkeyPath = vault.getPath().resolve(MASTERKEY_FILENAME);
byte[] oldMasterkeyBytes = Files.readAllBytes(masterkeyPath);
byte[] newMasterkeyBytes = masterkeyFileAccess.changePassphrase(oldMasterkeyBytes, oldPassphrase, newPassphrase);
- Path backupKeyPath = vault.getPath().resolve(MASTERKEY_FILENAME + MasterkeyBackupHelper.generateFileIdSuffix(oldMasterkeyBytes) + MASTERKEY_BACKUP_SUFFIX);
+ Path backupKeyPath = vault.getPath().resolve(MASTERKEY_FILENAME + BackupHelper.generateFileIdSuffix(oldMasterkeyBytes) + MASTERKEY_BACKUP_SUFFIX);
Files.move(masterkeyPath, backupKeyPath, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE);
Files.write(masterkeyPath, newMasterkeyBytes, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE);
LOG.info("Successfully changed password for {}", vault.getDisplayName());
@@ -102,7 +102,7 @@ public class ChangePasswordController implements FxController {
private void updatePasswordInSystemkeychain() {
if (keychain.isSupported() && !keychain.isLocked()) {
try {
- keychain.changePassphrase(vault.getId(), newPasswordController.passwordField.getCharacters());
+ keychain.changePassphrase(vault.getId(), vault.getDisplayName(), newPasswordController.passwordField.getCharacters());
LOG.info("Successfully updated password in system keychain for {}", vault.getDisplayName());
} catch (KeychainAccessException e) {
LOG.error("Failed to update password in system keychain.", e);
diff --git a/src/main/java/org/cryptomator/ui/common/ErrorController.java b/src/main/java/org/cryptomator/ui/common/ErrorController.java
index c75df26ce..a2204fae3 100644
--- a/src/main/java/org/cryptomator/ui/common/ErrorController.java
+++ b/src/main/java/org/cryptomator/ui/common/ErrorController.java
@@ -1,5 +1,6 @@
package org.cryptomator.ui.common;
+import org.cryptomator.common.Environment;
import org.cryptomator.common.ErrorCode;
import org.cryptomator.common.Nullable;
@@ -25,7 +26,11 @@ public class ErrorController implements FxController {
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 = """
+ OS: %s / %s
+ App: %s / %s
+
+
""";
@@ -34,16 +39,18 @@ public class ErrorController implements FxController {
private final ErrorCode errorCode;
private final Scene previousScene;
private final Stage window;
+ private final Environment environment;
private BooleanProperty copiedDetails = new SimpleBooleanProperty();
@Inject
- ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window) {
+ ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment) {
this.application = application;
this.stackTrace = stackTrace;
this.errorCode = errorCode;
this.previousScene = previousScene;
this.window = window;
+ this.environment = environment;
}
@FXML
@@ -67,7 +74,12 @@ public class ErrorController implements FxController {
@FXML
public void reportError() {
var title = URLEncoder.encode(getErrorCode(), StandardCharsets.UTF_8);
- var body = URLEncoder.encode(REPORT_BODY_TEMPLATE, StandardCharsets.UTF_8);
+ var enhancedTemplate = String.format(REPORT_BODY_TEMPLATE, //
+ System.getProperty("os.name"), //
+ System.getProperty("os.version"), //
+ environment.getAppVersion().orElse("undefined"), //
+ environment.getBuildNumber().orElse("undefined"));
+ var body = URLEncoder.encode(enhancedTemplate, StandardCharsets.UTF_8);
application.getHostServices().showDocument(REPORT_URL_FORMAT.formatted(title, body));
}
diff --git a/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java b/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java
index f0c199648..4eba62552 100644
--- a/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java
+++ b/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java
@@ -16,7 +16,11 @@ public class UserInteractionLock {
private volatile E state;
public UserInteractionLock(E initialValue) {
- state = initialValue;
+ this.state = initialValue;
+ }
+
+ public synchronized void reset(E value) {
+ this.state = value;
}
public void interacted(E result) {
diff --git a/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingFinisher.java b/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingFinisher.java
index 8eda41cd0..44d7ebfb0 100644
--- a/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingFinisher.java
+++ b/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingFinisher.java
@@ -47,7 +47,7 @@ class MasterkeyFileLoadingFinisher {
private void savePasswordToSystemkeychain() {
if (keychain.isSupported()) {
try {
- keychain.storePassphrase(vault.getId(), CharBuffer.wrap(enteredPassword.get()));
+ keychain.storePassphrase(vault.getId(), vault.getDisplayName(), CharBuffer.wrap(enteredPassword.get()));
} catch (KeychainAccessException e) {
LOG.error("Failed to store passphrase in system keychain.", e);
}
diff --git a/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingStrategy.java b/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingStrategy.java
index 39db1cc04..1fa7dd986 100644
--- a/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingStrategy.java
+++ b/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingStrategy.java
@@ -3,6 +3,7 @@ package org.cryptomator.ui.keyloading.masterkeyfile;
import com.google.common.base.Preconditions;
import dagger.Lazy;
import org.cryptomator.common.vaults.Vault;
+import org.cryptomator.cryptofs.common.BackupHelper;
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.api.Masterkey;
import org.cryptomator.cryptolib.api.MasterkeyLoadingFailedException;
@@ -20,6 +21,7 @@ import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.Window;
+import java.io.IOException;
import java.net.URI;
import java.nio.CharBuffer;
import java.nio.file.Files;
@@ -61,14 +63,24 @@ public class MasterkeyFileLoadingStrategy implements KeyLoadingStrategy {
@Override
public Masterkey loadKey(URI keyId) throws MasterkeyLoadingFailedException {
Preconditions.checkArgument(SCHEME.equalsIgnoreCase(keyId.getScheme()), "Only supports keys with scheme " + SCHEME);
-
try {
Path filePath = vault.getPath().resolve(keyId.getSchemeSpecificPart());
if (!Files.exists(filePath)) {
filePath = getAlternateMasterkeyFilePath();
}
CharSequence passphrase = getPassphrase();
- return masterkeyFileAccess.load(filePath, passphrase);
+ var masterkey = masterkeyFileAccess.load(filePath, passphrase);
+ //backup
+ if (filePath.startsWith(vault.getPath())) {
+ try {
+ BackupHelper.attemptBackup(filePath);
+ } catch (IOException e) {
+ LOG.warn("Unable to create backup for masterkey file.");
+ }
+ } else {
+ LOG.info("Masterkey file not stored inside vault. Not creating a backup.");
+ }
+ return masterkey;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new UnlockCancelledException("Unlock interrupted", e);
diff --git a/src/main/java/org/cryptomator/ui/lock/LockForcedController.java b/src/main/java/org/cryptomator/ui/lock/LockForcedController.java
index 8d4ce32d3..c3a452acc 100644
--- a/src/main/java/org/cryptomator/ui/lock/LockForcedController.java
+++ b/src/main/java/org/cryptomator/ui/lock/LockForcedController.java
@@ -35,7 +35,13 @@ public class LockForcedController implements FxController {
}
@FXML
- public void confirmForcedLock() {
+ public void retry() {
+ forceLockDecisionLock.interacted(LockModule.ForceLockDecision.RETRY);
+ window.close();
+ }
+
+ @FXML
+ public void force() {
forceLockDecisionLock.interacted(LockModule.ForceLockDecision.FORCE);
window.close();
}
@@ -54,4 +60,8 @@ public class LockForcedController implements FxController {
return vault.getDisplayName();
}
+ public boolean isForceSupported() {
+ return vault.supportsForcedUnmount();
+ }
+
}
diff --git a/src/main/java/org/cryptomator/ui/lock/LockModule.java b/src/main/java/org/cryptomator/ui/lock/LockModule.java
index 160dcf6fb..d1eb5f189 100644
--- a/src/main/java/org/cryptomator/ui/lock/LockModule.java
+++ b/src/main/java/org/cryptomator/ui/lock/LockModule.java
@@ -28,6 +28,7 @@ abstract class LockModule {
enum ForceLockDecision {
CANCEL,
+ RETRY,
FORCE;
}
diff --git a/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java b/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java
index 73b4844b9..00b25c507 100644
--- a/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java
+++ b/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java
@@ -51,20 +51,26 @@ public class LockWorkflow extends Task {
@Override
protected Void call() throws Volume.VolumeException, InterruptedException, LockNotCompletedException {
- try {
- vault.lock(false);
- } catch (Volume.VolumeException | LockNotCompletedException e) {
- LOG.debug("Regular lock of {} failed.", vault.getDisplayName(), e);
- var decision = askUserForAction();
- switch (decision) {
- case FORCE -> vault.lock(true);
- case CANCEL -> cancel(false);
- }
- }
+ lock(false);
return null;
}
+ private void lock(boolean forced) throws InterruptedException {
+ try {
+ vault.lock(forced);
+ } catch (Volume.VolumeException | LockNotCompletedException e) {
+ LOG.info("Locking {} failed (forced: {}).", vault.getDisplayName(), forced, e);
+ var decision = askUserForAction();
+ switch (decision) {
+ case RETRY -> lock(false);
+ case FORCE -> lock(true);
+ case CANCEL -> cancel(false);
+ }
+ }
+ }
+
private LockModule.ForceLockDecision askUserForAction() throws InterruptedException {
+ forceLockDecisionLock.reset(null);
// show forcedLock dialogue ...
Platform.runLater(() -> {
lockWindow.setScene(lockForcedScene.get());
diff --git a/src/main/java/org/cryptomator/ui/preferences/SupporterCertificateController.java b/src/main/java/org/cryptomator/ui/preferences/SupporterCertificateController.java
index 02b8bab91..db2554d67 100644
--- a/src/main/java/org/cryptomator/ui/preferences/SupporterCertificateController.java
+++ b/src/main/java/org/cryptomator/ui/preferences/SupporterCertificateController.java
@@ -34,10 +34,10 @@ public class SupporterCertificateController implements FxController {
public void initialize() {
supporterCertificateField.setText(licenseHolder.getLicenseKey().orElse(null));
supporterCertificateField.textProperty().addListener(this::registrationKeyChanged);
- supporterCertificateField.setTextFormatter(new TextFormatter<>(this::checkVaultNameLength));
+ supporterCertificateField.setTextFormatter(new TextFormatter<>(this::removeWhitespaces));
}
- private TextFormatter.Change checkVaultNameLength(TextFormatter.Change change) {
+ private TextFormatter.Change removeWhitespaces(TextFormatter.Change change) {
if (change.isContentChange()) {
var strippedText = CharMatcher.whitespace().removeFrom(change.getText());
change.setText(strippedText);
diff --git a/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java b/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java
index c078c718b..311f5746e 100644
--- a/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java
+++ b/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java
@@ -2,7 +2,7 @@ package org.cryptomator.ui.recoverykey;
import com.google.common.base.Preconditions;
import com.google.common.hash.Hashing;
-import org.cryptomator.cryptofs.common.MasterkeyBackupHelper;
+import org.cryptomator.cryptofs.common.BackupHelper;
import org.cryptomator.cryptolib.api.CryptoException;
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.api.Masterkey;
@@ -86,7 +86,7 @@ public class RecoveryKeyFactory {
if (Files.exists(masterkeyPath)) {
byte[] oldMasterkeyBytes = Files.readAllBytes(masterkeyPath);
// TODO: deduplicate with ChangePasswordController:
- Path backupKeyPath = vaultPath.resolve(MASTERKEY_FILENAME + MasterkeyBackupHelper.generateFileIdSuffix(oldMasterkeyBytes) + MASTERKEY_BACKUP_SUFFIX);
+ Path backupKeyPath = vaultPath.resolve(MASTERKEY_FILENAME + BackupHelper.generateFileIdSuffix(oldMasterkeyBytes) + MASTERKEY_BACKUP_SUFFIX);
Files.move(masterkeyPath, backupKeyPath, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE);
}
masterkeyFileAccess.persist(masterkey, masterkeyPath, newPassword);
diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/GeneralVaultOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/GeneralVaultOptionsController.java
index a35b108d9..633797820 100644
--- a/src/main/java/org/cryptomator/ui/vaultoptions/GeneralVaultOptionsController.java
+++ b/src/main/java/org/cryptomator/ui/vaultoptions/GeneralVaultOptionsController.java
@@ -47,7 +47,7 @@ public class GeneralVaultOptionsController implements FxController {
public void initialize() {
vaultName.textProperty().set(vault.getVaultSettings().displayName().get());
vaultName.focusedProperty().addListener(this::trimVaultNameOnFocusLoss);
- vaultName.setTextFormatter(new TextFormatter<>(this::removeWhitespaces));
+ vaultName.setTextFormatter(new TextFormatter<>(this::checkVaultNameLength));
unlockOnStartupCheckbox.selectedProperty().bindBidirectional(vault.getVaultSettings().unlockAfterStartup());
actionAfterUnlockChoiceBox.getItems().addAll(WhenUnlocked.values());
actionAfterUnlockChoiceBox.valueProperty().bindBidirectional(vault.getVaultSettings().actionAfterUnlock());
@@ -63,7 +63,7 @@ public class GeneralVaultOptionsController implements FxController {
}
}
- private TextFormatter.Change removeWhitespaces(TextFormatter.Change change) {
+ private TextFormatter.Change checkVaultNameLength(TextFormatter.Change change) {
if (change.isContentChange() && change.getControlNewText().length() > VAULTNAME_TRUNCATE_THRESHOLD) {
return null; // reject any change that would lead to a text exceeding threshold
} else {
diff --git a/src/main/resources/fxml/lock_forced.fxml b/src/main/resources/fxml/lock_forced.fxml
index 4596af119..b0b5baa63 100644
--- a/src/main/resources/fxml/lock_forced.fxml
+++ b/src/main/resources/fxml/lock_forced.fxml
@@ -33,11 +33,11 @@
-
+
-
-
+
+
diff --git a/src/main/resources/i18n/strings.properties b/src/main/resources/i18n/strings.properties
index 1cb5eb0b8..7b17fa791 100644
--- a/src/main/resources/i18n/strings.properties
+++ b/src/main/resources/i18n/strings.properties
@@ -118,9 +118,10 @@ unlock.error.invalidMountPoint.existing=Mount point "%s" already exists or paren
# Lock
## Force
-lock.forced.heading=Graceful lock failed
+lock.forced.heading=Lock failed
lock.forced.message=Locking "%s" was blocked by pending operations or open files. You can force lock this vault, however interrupting I/O may result in the loss of unsaved data.
-lock.forced.confirmBtn=Force Lock
+lock.forced.retryBtn=Retry
+lock.forced.forceBtn=Force Lock
## Failure
lock.fail.heading=Locking vault failed.
lock.fail.message=Vault "%s" could not be locked. Ensure unsaved work is saved elsewhere and important Read/Write operations are finished. In order to close the vault, kill the Cryptomator process.
diff --git a/src/main/resources/i18n/strings_ar.properties b/src/main/resources/i18n/strings_ar.properties
index c640ec7a5..a10658b48 100644
--- a/src/main/resources/i18n/strings_ar.properties
+++ b/src/main/resources/i18n/strings_ar.properties
@@ -108,9 +108,8 @@ unlock.error.invalidMountPoint.existing=نقطة/مجلد التحميل موج
# Lock
## Force
-lock.forced.heading=فشل عملية القفل
lock.forced.message=تم حظر قفل "%s" بواسطة العمليات المعلقة أو الملفات المفتوحة. يمكنك فرض قفل هذا المخزن، ولكن مقاطعة عمليات الادخال والاخراج I/O قد تؤدي لفقدان البيانات غير المحفوظة.
-lock.forced.confirmBtn=فرض القفل
+lock.forced.retryBtn=اعد المحاولة
## Failure
lock.fail.heading=فشلت عملية اقفال الخزنة.
lock.fail.message=فشل عملية قفل %s". تأكد من حفظ العمل غير المحفوظ في مكان آخر وأن العمليات الهامة للقراءة/الكتابة قد انتهت. من أجل إغلاق المخزن، اقتل تطبيق Cryptomator.
diff --git a/src/main/resources/i18n/strings_bs.properties b/src/main/resources/i18n/strings_bs.properties
index 28f61dc95..e336ff9d3 100644
--- a/src/main/resources/i18n/strings_bs.properties
+++ b/src/main/resources/i18n/strings_bs.properties
@@ -108,9 +108,7 @@ unlock.error.invalidMountPoint.existing=Tačka povezivanja "%s" već postoji ili
# Lock
## Force
-lock.forced.heading=Zaključavanje nije uspjelo
lock.forced.message=Zaključavanje "%s" blokirano je operacijama na čekanju ili otvorenim datotekama. Možete prisilno zaključati ovaj sef, međutim prekid U / I-a može rezultirati gubitkom nespremljenih podataka.
-lock.forced.confirmBtn=Prisilno zaključaj
## Failure
lock.fail.heading=Zaključavanje sefa nije uspjelo.
lock.fail.message=Sef "%s" nije moguće zaključati. Osigurajte da je nespremljeni rad sačuvan negdje drugdje i da su važne operacije čitanja / pisanja završene. Da biste zatvorili sef, zaustavite Cryptomator proces.
diff --git a/src/main/resources/i18n/strings_ca.properties b/src/main/resources/i18n/strings_ca.properties
index e70eac4a9..520b7d073 100644
--- a/src/main/resources/i18n/strings_ca.properties
+++ b/src/main/resources/i18n/strings_ca.properties
@@ -75,7 +75,9 @@ addvault.new.readme.accessLocation.2=Aquesta és la ubicació d'accès de la vos
addvault.new.readme.accessLocation.3=Cryptomator xifra tots els fitxers afegits a aquest volum. Podeu treballar en aquest volum com en qualsevol altra unitat o carpeta. La vista mostra el contingut desxifrat però els fitxers sempre estan xifrats en el vostre disc dur.
addvault.new.readme.accessLocation.4=Pots esborrar aquest fitxer si vols.
## Existing
+addvaultwizard.existing.instruction=Selecciona el fitxer "vault.cryptomator" de la teva caixa forta. Si només existeix un fitxer anomenat "masterkey.cryptomator", selecciona aquest.
addvaultwizard.existing.chooseBtn=Trieu…
+addvaultwizard.existing.filePickerTitle=Selecciona el fitxer de la Caixa forta
## Success
addvaultwizard.success.nextStepsInstructions=S'ha afegit la caixa forta "%s".\nHeu de desbloquejar-la si voleu accedir-hi o afegir nou contingut. També podeu desbloquejar-la en qualsevol altre moment.
addvaultwizard.success.unlockNow=Desbloqueja ara
@@ -115,9 +117,10 @@ unlock.error.invalidMountPoint.existing=El punt de muntatge o la carpeta ja exis
# Lock
## Force
-lock.forced.heading=Ha fallat el blocatge
+lock.forced.heading=El bloqueig ha fallat
lock.forced.message=No s'ha blocat "%s" perquè hi ha operacions pendents o fitxers oberts. Podeu forçar-ne el blocatge però heu de saber que interrompre l'entrada/sortida pot produir la pèrdua de dades.
-lock.forced.confirmBtn=Força el blocatge
+lock.forced.retryBtn=Reintenta
+lock.forced.forceBtn=Forçar bloqueig
## Failure
lock.fail.heading=Ha fallat el blocatge de la caixa forta.
lock.fail.message=La caixa forta "%s" no s'ha pogut blocar. Assegureu-vos que el treball s'ha desat en algun altre lloc i que les operacions de lectura/escriptura han acabat. Per tal de tancar la caixa, mateu el procés Cryptomator.
diff --git a/src/main/resources/i18n/strings_cs.properties b/src/main/resources/i18n/strings_cs.properties
index d88e84d91..5bac326e1 100644
--- a/src/main/resources/i18n/strings_cs.properties
+++ b/src/main/resources/i18n/strings_cs.properties
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Připojovací bod %s již existuje nebo
# Lock
## Force
-lock.forced.heading=Běžné uzamčení selhalo
+lock.forced.heading=Zamknutí se nezdařilo
lock.forced.message=Uzamčení "%s" bylo zablokováno nevyřízenými operacemi nebo otevřenými soubory. Můžete vynutit uzamčení tohoto trezoru, ale přerušení I/O může mít za následek ztrátu neuložených dat.
-lock.forced.confirmBtn=Přesto uzamknout
+lock.forced.retryBtn=Opakovat
+lock.forced.forceBtn=Přesto uzamknout
## Failure
lock.fail.heading=Uzamčení trezoru selhalo.
lock.fail.message=Trezor "%s" nelze uzamknout. Ujistěte se, že je neuložená práce uložena jinde a že jsou dokončeny důležité operace čtení/zápis. Za účelem uzavření trezoru ukončte proces Cryptomatoru.
@@ -301,6 +302,7 @@ 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
main.vaultDetail.error.reload=Obnovit
+main.vaultDetail.error.windowTitle=Chyba při načítání trezoru
# Wrong File Alert
wrongFileAlert.title=Jak šifrovat soubory
diff --git a/src/main/resources/i18n/strings_de.properties b/src/main/resources/i18n/strings_de.properties
index e39a84ec8..fa5551619 100644
--- a/src/main/resources/i18n/strings_de.properties
+++ b/src/main/resources/i18n/strings_de.properties
@@ -75,7 +75,7 @@ addvault.new.readme.accessLocation.2=Dies ist der Zugangsort deines Tresors.
addvault.new.readme.accessLocation.3=Alle zu diesem Laufwerk hinzugefügten Dateien werden von Cryptomator verschlüsselt. Du kannst mit diesem arbeiten wie mit jedem anderen Laufwerk bzw. Ordner. Dies ist lediglich eine unverschlüsselte Ansicht des Laufwerkinhalts; auf deiner Festplatte bleiben deine Dateien weiterhin verschlüsselt.
addvault.new.readme.accessLocation.4=Diese Datei kannst du löschen.
## Existing
-addvaultwizard.existing.instruction=Wähle die Datei "vault.cryptomator" deines bestehenden Tresors aus. Falls nur eine Datei mit der Bezeichnung "masterkey.cryptomator" vorhanden sein sollte, nutze stattdessen diese.
+addvaultwizard.existing.instruction=Wähle die Datei "vault.cryptomator" deines bestehenden Tresors aus. Falls nur eine Datei mit der Bezeichnung "masterkey.cryptomator" vorhanden ist, nutze stattdessen diese.
addvaultwizard.existing.chooseBtn=Durchsuchen…
addvaultwizard.existing.filePickerTitle=Tresor Datei auswählen
## Success
@@ -119,7 +119,8 @@ unlock.error.invalidMountPoint.existing=Einhängepunkt/Ordner bereits vorhanden
## Force
lock.forced.heading=Sperren fehlgeschlagen
lock.forced.message=Aufgrund von Zugriffen laufender Prozesse oder geöffneter Dateien konnte „%s“ nicht gesperrt werden. Du kannst das Sperren dieses Tresors erzwingen, allerdings kann dies zum Verlust ungespeicherter Daten führen.
-lock.forced.confirmBtn=Sperren erzwingen
+lock.forced.retryBtn=Wiederholen
+lock.forced.forceBtn=Sperren erzwingen
## Failure
lock.fail.heading=Tresor konnte nicht gesperrt werden.
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.
@@ -191,7 +192,7 @@ preferences.general.theme.automatic=Automatisch
preferences.general.theme.light=Hell
preferences.general.theme.dark=Dunkel
preferences.general.unlockThemes=Dunklen Modus freischalten
-preferences.general.showMinimizeButton=Minimieren-Schaltfläche anzeigen
+preferences.general.showMinimizeButton=Schaltfläche zum Minimieren anzeigen
preferences.general.showTrayIcon=Symbol im Infobereich anzeigen (Neustart erforderlich)
preferences.general.startHidden=Cryptomator im Hintergrund starten
preferences.general.debugLogging=Diagnoseprotokoll aktivieren
diff --git a/src/main/resources/i18n/strings_el.properties b/src/main/resources/i18n/strings_el.properties
index 0f5596391..756530597 100644
--- a/src/main/resources/i18n/strings_el.properties
+++ b/src/main/resources/i18n/strings_el.properties
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Το σημείο/φάκελος προ
# Lock
## Force
-lock.forced.heading=Το κανονικό κλείδωμα απέτυχε
+lock.forced.heading=Το κλείδωμα απέτυχε
lock.forced.message=Το κλείδωμα "%s" μπλοκαρίστηκε από εκκρεμείς διεργασίες ή ανοιχτά αρχεία. Μπορείτε να εξαναγκάσετε το κλείδωμα του vault, αλλά η διακοπή Ι/Ο ενδέχεται να οδηγήσει σε απώλεια μη αποθηκευμένων δεδομένων.
-lock.forced.confirmBtn=Εξαναγκασμένο κλείδωμα
+lock.forced.retryBtn=Επανάληψη
+lock.forced.forceBtn=Εξαναγκασμός Κλειδώματος
## Failure
lock.fail.heading=Το κλείδωμα του vault απέτυχε.
lock.fail.message=Το Vault "%s" δεν κλειδώθηκε. Εξασφαλίστε την αποθήκευση της εργασίας σε άλλο σημείο και πως οι σημαντικές διεργασίας Ανάγνωσης/Εγγραφής έχουν ολοκληρωθεί. Για να κλείσετε το vault, τερματίστε τη διεργασία του Cryptomator.
diff --git a/src/main/resources/i18n/strings_es.properties b/src/main/resources/i18n/strings_es.properties
index 3ed2961bf..cb3d9d3e7 100644
--- a/src/main/resources/i18n/strings_es.properties
+++ b/src/main/resources/i18n/strings_es.properties
@@ -117,17 +117,18 @@ unlock.error.invalidMountPoint.existing=El punto de montaje/carpeta ya existe o
# Lock
## Force
-lock.forced.heading=Bloqueo automático fallido
+lock.forced.heading=Error al bloquear
lock.forced.message=El bloqueo de "%s" fue bloqueado por operaciones pendientes o archivos abiertos. Puede forzar el bloqueo de esta bóveda, sin embargo, interrumpir la I/O puede provocar la pérdida de datos no guardados.
-lock.forced.confirmBtn=Forzar bloqueo
+lock.forced.retryBtn=Reintentar
+lock.forced.forceBtn=Forzar bloqueo
## Failure
lock.fail.heading=Falló al bloquear la bóveda.
lock.fail.message=No se pudo bloquear la bóveda "%s". Asegúrese de que el trabajo no guardado se ha guardado en otro lugar y las operaciones de lectura/escritura importantes han finalizado. Para cerrar la bóveda termine el proceso de Cryptomator.
# Migration
-migration.title=Mejorar bóveda
+migration.title=Actualizar bóveda
## Start
-migration.start.prompt=La bóveda "%s" necesita ser actualizada a un formato más nuevo. Antes de continuar, asegurarse de que no haya ninguna sincronización pendiente afectando esta bóveda.
+migration.start.prompt=La bóveda "%s" necesita ser actualizada a un formato más nuevo. Antes de continuar, asegúrese de que no haya ninguna sincronización pendiente afectando esta bóveda.
migration.start.confirm=Sí, mi bóveda está sincronizada
## Run
migration.run.enterPassword=Ingresar la contraseña para "%s"
diff --git a/src/main/resources/i18n/strings_fil.properties b/src/main/resources/i18n/strings_fil.properties
index 9ad4d8b1f..9f2a7767f 100644
--- a/src/main/resources/i18n/strings_fil.properties
+++ b/src/main/resources/i18n/strings_fil.properties
@@ -68,6 +68,7 @@ unlock.unlockBtn=I-unlock
# Lock
## Force
+lock.forced.retryBtn=Subukan muli
## Failure
# Migration
diff --git a/src/main/resources/i18n/strings_fr.properties b/src/main/resources/i18n/strings_fr.properties
index 12894f2e9..6a6a4d90d 100644
--- a/src/main/resources/i18n/strings_fr.properties
+++ b/src/main/resources/i18n/strings_fr.properties
@@ -72,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 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.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 en permanence.
addvault.new.readme.accessLocation.4=Vous pouvez supprimer ce fichier.
## Existing
addvaultwizard.existing.instruction=Choisissez le fichier "vault.cryptomator" de votre coffre existant. S'il existe seulement un fichier "masterkey.cryptomator", sélectionnez celui-ci.
@@ -93,7 +93,7 @@ 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=Oublier le mot de passe
+forgetPassword.title=Mot de passe oublié
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
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Le point de montage/le répertoire exist
# Lock
## Force
-lock.forced.heading=Le verrouillage normal a échoué
+lock.forced.heading=Échec du verrouillage
lock.forced.message=Le verrouillage de «%s» a été bloqué par des opérations en attente ou des fichiers ouverts. Vous pouvez forcer le verrouillage de ce coffre, mais l'interruption d'E/S peut entraîner la perte de données non enregistrées.
-lock.forced.confirmBtn=Forcer le verrouillage
+lock.forced.retryBtn=Réessayer
+lock.forced.forceBtn=Forcer le verrouillage
## Failure
lock.fail.heading=Le verrouillage du coffre a échoué.
lock.fail.message=Le coffre-fort "%s" n'a pas pu être verrouillé. Assurez-vous que le travail non sauvegardé est sauvegardé ailleurs et que les opérations importantes de lecture/écriture sont bien terminées. Pour fermer le coffre-fort, tuez le processus Cryptomator.
diff --git a/src/main/resources/i18n/strings_he.properties b/src/main/resources/i18n/strings_he.properties
new file mode 100644
index 000000000..2a4d51e6c
--- /dev/null
+++ b/src/main/resources/i18n/strings_he.properties
@@ -0,0 +1,156 @@
+# Locale Specific CSS files such as CJK, RTL,...
+
+# Generics
+## Button
+generic.button.apply=החל
+generic.button.back=חזור
+generic.button.cancel=ביטול
+generic.button.change=שנה
+generic.button.close=סגור
+generic.button.copy=העתק
+generic.button.copied=הועתק!
+generic.button.done=סיום
+generic.button.next=המשך
+generic.button.print=הדפס
+## Error
+generic.error.title=שגיאה %s
+generic.error.instruction=אופס! Cryptomator לא ציפה שזה יקרה. את/ה יכול/ה לחפש פתרונות קיימים לשגיאה זו. או שבמקרה והשגיאה לא דווחה עדיין, תרגיש/י בנוח לעשות זאת.
+generic.error.hyperlink.lookup=חפש שגיאה זו
+generic.error.hyperlink.report=דווח על שגיאה זו
+generic.error.technicalDetails=פרטים:
+
+# Defaults
+defaults.vault.vaultName=כספת
+
+# Tray Menu
+traymenu.showMainWindow=הצג
+traymenu.showPreferencesWindow=העדפות
+traymenu.lockAllVaults=נעל הכל
+traymenu.quitApplication=צא
+traymenu.vault.unlock=בטל נעילה
+traymenu.vault.lock=נעילה
+traymenu.vault.reveal=חשוף
+
+# Add Vault Wizard
+addvaultwizard.title=הוסף כספת
+## Welcome
+addvaultwizard.welcome.newButton=צור כספת חדשה
+addvaultwizard.welcome.existingButton=פתח כספת קיימת
+## New
+### Name
+addvaultwizard.new.nameInstruction=בחר שם עבור הכספת שלך
+addvaultwizard.new.namePrompt=שם הכספת
+### Location
+addvaultwizard.new.locationInstruction=היכן Cryptomator צריך לשמור את הקבצים המוצפנים של הכספת שלך?
+addvaultwizard.new.locationLabel=מיקום אחסון
+addvaultwizard.new.directoryPickerLabel=מיקום מותאם אישית
+addvaultwizard.new.directoryPickerButton=בחר...
+addvaultwizard.new.directoryPickerTitle=בחירת ספרייה
+addvaultwizard.new.fileAlreadyExists=שם הקובץ או שם התיקייה עם שם הכספת כבר קיים
+addvaultwizard.new.locationDoesNotExist=מחיצה בנתיב הנקוב לא קיימת או אין אפשרות לקבל אליה גישה
+addvaultwizard.new.locationIsNotWritable=אין הרשאת כתיבה בנתיב הנקוב
+addvaultwizard.new.locationIsOk=מיקום מתאים לכספת שלך
+addvaultwizard.new.invalidName=שם כספת שגוי. אנא שקול שם מחיצה רגיל.
+### Password
+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=⚠️ קבצי כספת ⚠️
+addvault.new.readme.storageLocation.2=זהו מיקום אחסון לכספת שלך.
+addvault.new.readme.storageLocation.3=אל
+addvault.new.readme.storageLocation.4=תשנה קבצים במחיצה זו או
+addvault.new.readme.storageLocation.5=תדביק קבצים כלשהם להצפנה במחיצה זו.
+addvault.new.readme.storageLocation.6=אם תרצה להצפין קבצים ולצפות בתוכן של הכספת, עשה את הבא:
+addvault.new.readme.storageLocation.7=1. הוסף כספת זו ל-Cryptomator.
+addvault.new.readme.storageLocation.8=2. בטל נעילת כספת ב-Cryptomator.
+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=תרגיש/י בנוח להסיר את הקובץ הזה.
+## Existing
+addvaultwizard.existing.chooseBtn=בחר...
+## Success
+
+# Remove Vault
+
+# Change Password
+
+# Forget Password
+
+# Unlock
+unlock.unlockBtn=בטל נעילה
+##
+## Success
+## Failure
+### Invalid Mount Point
+
+# Lock
+## Force
+## Failure
+
+# Migration
+## Start
+## Run
+## Success
+## Missing file system capabilities
+## Impossible
+
+# Health Check
+## Start
+## Start Failure
+## Check Selection
+## Detail view
+## Fix Application
+
+# Preferences
+preferences.title=העדפות
+## General
+## Volume
+## Updates
+## Contribution
+#<-- Add entries for donations and code/translation/documentation contribution -->
+
+## About
+
+# Vault Statistics
+## Read
+## Write
+
+# Main Window
+main.closeBtn.tooltip=סגור
+main.preferencesBtn.tooltip=העדפות
+## Drag 'n' Drop
+## Vault List
+main.vaultlist.contextMenu.lock=נעילה
+main.vaultlist.addVaultBtn=הוסף כספת
+## Vault Detail
+### Welcome
+### Locked
+### Unlocked
+main.vaultDetail.lockBtn=נעילה
+### Missing
+### Needs Migration
+### Error
+
+# Wrong File Alert
+
+# Vault Options
+## General
+vaultOptions.general.vaultName=שם הכספת
+
+## Mount
+vaultOptions.mount.mountPoint.directoryPickerButton=בחר...
+## Master Key
+
+
+# Recovery Key
+
+# New Password
+
+# Quit
diff --git a/src/main/resources/i18n/strings_hi.properties b/src/main/resources/i18n/strings_hi.properties
index e0a4455d0..26fe68bda 100644
--- a/src/main/resources/i18n/strings_hi.properties
+++ b/src/main/resources/i18n/strings_hi.properties
@@ -75,6 +75,7 @@ unlock.unlockBtn=अनलॉक करें
# Lock
## Force
+lock.forced.retryBtn=पुन: प्रयास करें
## Failure
# Migration
diff --git a/src/main/resources/i18n/strings_hu.properties b/src/main/resources/i18n/strings_hu.properties
index 4368c9ef9..ff18ab346 100644
--- a/src/main/resources/i18n/strings_hu.properties
+++ b/src/main/resources/i18n/strings_hu.properties
@@ -13,6 +13,11 @@ generic.button.done=Kész
generic.button.next=Következő
generic.button.print=Nyomtatás
## Error
+generic.error.title=Hiba: %s
+generic.error.instruction=Upsz! A Cryptomator nem számított rá, hogy ez megtörténik. Keressen meglévő megoldást erre a hibára. Vagy ha még nem jelentették, bátran tegye ezt meg.
+generic.error.hyperlink.lookup=Hiba okának keresése
+generic.error.hyperlink.report=Hiba jelentése
+generic.error.technicalDetails=Részletek:
# Defaults
defaults.vault.vaultName=Széf
@@ -38,9 +43,14 @@ addvaultwizard.new.namePrompt=A széf neve
### Location
addvaultwizard.new.locationInstruction=Hova mentse a Cryptomator a széf titkosított fájljait?
addvaultwizard.new.locationLabel=Tárolási hely
+addvaultwizard.new.locationPrompt=…
addvaultwizard.new.directoryPickerLabel=Egyedi hely
addvaultwizard.new.directoryPickerButton=Választás…
addvaultwizard.new.directoryPickerTitle=Könyvtár kiválasztása
+addvaultwizard.new.fileAlreadyExists=Már létezik fájl/könyvtár ezzel a trezornévvel
+addvaultwizard.new.locationDoesNotExist=A megadott elérési úton lévő könyvtár nem létezik, vagy nem érhető el
+addvaultwizard.new.locationIsNotWritable=Nincs írási hozzáférés a megadott elérési úthoz
+addvaultwizard.new.locationIsOk=Megfelelő hely a trezornak
addvaultwizard.new.invalidName=Érvénytelen széf elnevezés. Kérjük vegye figyelembe a szabályos könyvtárelnevezésre vonatkozó szabályokat.
### Password
addvaultwizard.new.createVaultBtn=Új széf létrehozása
@@ -65,7 +75,9 @@ addvault.new.readme.accessLocation.2=Ez a széf hozzáférési helye.
addvault.new.readme.accessLocation.3=Bármilyen, a kötethez hozzáadott fájl titkosításra kerül a Cryptomator által. Úgy dolgozhat vele, mint minden más meghajtóval/mappával. Ez az egyetlen dekódolt tartalmi nézet. A fájlai folyamatosan titkosítva maradnak a merevlemezén.
addvault.new.readme.accessLocation.4=Bátran eltávolíthatja ezt a fájlt.
## Existing
+addvaultwizard.existing.instruction=Válassza ki a "vault.cryptomatotor" fájlt a meglévő tárolóhoz. Ha csak egy "masterkey.cryptomatotor" nevű fájl létezik, válassza azt.
addvaultwizard.existing.chooseBtn=Kiválaszt…
+addvaultwizard.existing.filePickerTitle=Trezor fájl kiválasztása
## Success
addvaultwizard.success.nextStepsInstructions=Széf létrehozva "%s".\nA tartalom eléréséhez, vagy hozzáadásához fel kell oldania a széfet. Alternatív megoldásként később bármikor feloldhatja.
addvaultwizard.success.unlockNow=Azonnali feloldás
@@ -86,11 +98,15 @@ forgetPassword.information=Eltávolítja a széf mentett jelszavát a rendszere
forgetPassword.confirmBtn=Jelszó elfelejtése
# Unlock
+unlock.title="%s" feloldása
unlock.passwordPrompt=Írja be a jelszavát a következő széfhez "%s":
+unlock.savePassword=Jelszó megjegyzése
unlock.unlockBtn=Feloldás
##
+unlock.chooseMasterkey.prompt=Nem található a tároló kulcsfájlja a várt helyen. Kérjük válassza ki a kulcsfájlt manuálisan.
unlock.chooseMasterkey.filePickerTitle=Mesterkulcs fájl kiválasztása
## Success
+unlock.success.message="%s" sikreresen feloldásra került! Mostmár hozzáférhet a virtuális trezorhoz.
unlock.success.rememberChoice=Jegyezze meg a választást és ne mutassa többet
unlock.success.revealBtn=Széf megjelenítése
## Failure
@@ -101,7 +117,11 @@ unlock.error.invalidMountPoint.existing=A csatolási pont "%s" már létezik vag
# Lock
## Force
+lock.forced.message=A „%s” zárolását függőben lévő műveletek vagy megnyitott fájlok blokkolták. Kényszerítheti a tároló zárolását, bár az I/O megszakítása a nem mentett adatok elvesztéséhez vezethet.
+lock.forced.retryBtn=Újra
## Failure
+lock.fail.heading=Zárolás sikertelen.
+lock.fail.message=A "%s" tárolót nem lehetett zárolni. Győződjön meg arról, hogy a nem mentett munkát máshová menti, és a fontos olvasási/írási műveletek befejeződtek. A trezor bezárásához szakítsa meg a Cryptomator folyamatot.
# Migration
migration.title=Széf frissítése
@@ -129,7 +149,18 @@ migration.impossible.moreInfo=A széf továbbra is megnyitható marad egy régeb
# Health Check
## Start
+health.title="%s" állapotellenőrzése
+health.intro.header=Állapotfelmérés
+health.intro.text=Az állapotfelmérés olyan ellenőrzéscsomag, amely felderíti és esetlegesen kijavítja a trezor belső szerkezetében fellépő problémákat. Kérjük, ne feledje:
+health.intro.remarkSync=Győződjön meg arról, hogy minden eszköz teljesen szinkronizálva van, ez megoldja a legtöbb problémát.
+health.intro.remarkFix=Nem minden probléma javítható.
+health.intro.remarkBackup=Ha az adatok sérültek, csak a biztonsági mentés segíthet.
+health.intro.affirmation=Elolvastam és megértettem a fenti információkat
## Start Failure
+health.fail.header=Hiba a Trezor konfiguráció betöltésekor
+health.fail.ioError=Hiba történt a konfigurációs fájl elérése és olvasása közben.
+health.fail.parseError=Hiba történt a tároló konfigurációjának elemzése közben.
+health.fail.moreInfo=További infó
## Check Selection
## Detail view
## Fix Application
@@ -238,6 +269,8 @@ main.vaultDetail.missing.changeLocation=A széf helyének megváltoztatása…
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
+main.vaultDetail.error.reload=Újratöltés
+main.vaultDetail.error.windowTitle=Hiba az adatok betöltése közben
# Wrong File Alert
wrongFileAlert.title=Hogyan lehet fájlokat titkosítani
diff --git a/src/main/resources/i18n/strings_id.properties b/src/main/resources/i18n/strings_id.properties
index 8c1bc51f0..8b4d9e8df 100644
--- a/src/main/resources/i18n/strings_id.properties
+++ b/src/main/resources/i18n/strings_id.properties
@@ -13,6 +13,11 @@ generic.button.done=Selesai
generic.button.next=Lanjut
generic.button.print=Cetak
## Error
+generic.error.title=Kesalahan %s
+generic.error.instruction=Ups! Cryptomator tidak mengharapkan ini terjadi. Anda dapat mencari solusi yang ada untuk kesalahan ini. Atau jika belum dilaporkan, jangan ragu untuk melakukannya.
+generic.error.hyperlink.lookup=Cari kesalahan
+generic.error.hyperlink.report=Laporkan kesalahan
+generic.error.technicalDetails=Rincian:
# Defaults
defaults.vault.vaultName=Brankas
@@ -70,7 +75,9 @@ addvault.new.readme.accessLocation.2=Ini adalah lokasi akses brankas kamu.
addvault.new.readme.accessLocation.3=File yang ditambahkan ke volume ini akan dienkripsi oleh Cryptomator. Anda dapat mempergunakan isi vault seperti dalam folder lain. Saat ini Anda sedang mengakses tampilan versi dekripsi, file Anda selalu terenkripsi di dalam cakram keras Anda.
addvault.new.readme.accessLocation.4=Anda dapat menghapus file ini.
## Existing
+addvaultwizard.existing.instruction=Pilih file "vault.cryptomator" Anda dari vault yang ada. Jika hanya ada file bernama "masterkey.cryptomator", pilih file tersebut.
addvaultwizard.existing.chooseBtn=Pilih…
+addvaultwizard.existing.filePickerTitle=Pilih File Vault
## Success
addvaultwizard.success.nextStepsInstructions=Vault "%s" telah dibuat.\nAnda harus membuka kunci vault ini untuk mengakses atau menambahkan konten. Anda juga dapat membuka kunci vault ini kapan saja di kemudian hari.
addvaultwizard.success.unlockNow=Buka Kunci Sekarang
@@ -91,6 +98,7 @@ forgetPassword.information=Kata sandi vault yang tersimpan akan dihapus dari key
forgetPassword.confirmBtn=Lupa Kata Sandi
# Unlock
+unlock.title=Membuka "%s"
unlock.passwordPrompt=Masukkan kata sandi untuk "%s":
unlock.savePassword=Simpan Kata Sandi
unlock.unlockBtn=Buka Gembok
@@ -109,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Poin mount "%s" sudah ada atau folder in
# Lock
## Force
-lock.forced.heading=Gagal mengunci secara normal
+lock.forced.heading=Gagal mengunci
lock.forced.message=Penguncian "%s" terblokir oleh operasi yang sedang berjalan atau file yang masih terbuka. Anda dapat mengunci paksa vault ini, namun ada kemungkinan mengganggu I/O akan menghilangkan data yang belum disimpan.
-lock.forced.confirmBtn=Kunci Paksa
+lock.forced.retryBtn=Coba lagi
+lock.forced.forceBtn=Kunci Paksa
## Failure
lock.fail.heading=Gagal mengunci vault.
lock.fail.message=Vault "%s" tidak dapat dikunci. Pastikan bahwa file yang belum tersimpan telah disimpan di lokasi lain, dan operasi Baca/Tulis yang penting telah selesai. Untuk menutup vault ini, matikan proses Cryptomator.
@@ -142,13 +151,37 @@ migration.impossible.moreInfo=Vault dapat dibuka dengan program versi lebih lama
# Health Check
## Start
+health.title=Pemeriksaan Kesehatan "%s"
+health.intro.header=Pemeriksaan Kesehatan
+health.intro.text=Pemeriksaan Kesehatan adalah kumpulan pemeriksaan untuk mendeteksi dan mungkin memperbaiki masalah dalam struktur internal brankas Anda. Harap diingat:
+health.intro.remarkSync=Pastikan semua perangkat disinkronkan sepenuhnya, ini menyelesaikan sebagian besar masalah.
+health.intro.remarkFix=Tidak semua masalah bisa diperbaiki.
+health.intro.remarkBackup=Jika data rusak, hanya cadangan yang dapat membantu.
+health.intro.affirmation=Saya telah membaca dan memahami informasi di atas
## Start Failure
+health.fail.header=Kesalahan saat memuat Konfigurasi Vault
+health.fail.ioError=Terjadi kesalahan saat mengakses dan membaca file konfigurasi.
+health.fail.parseError=Terjadi kesalahan saat mengurai konfigurasi vault.
+health.fail.moreInfo=Info Selengkapnya
## Check Selection
+health.checkList.description=Centang daftar di bagian kiri atau gunakan tombol di bawah.
+health.checkList.selectAllButton=Centang Semua
+health.checkList.deselectAllButton=Jangan Centang Semua
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.checkScheduled=Pemeriksaan dijadwalkan.
+health.check.detail.checkRunning=Saat ini pemeriksaan sedang berjalan…
+health.check.detail.checkSkipped=Pemeriksaan tidak dipilih untuk dijalankan.
+health.check.detail.checkFinished=Pemeriksaan berhasil diselesaikan.
+health.check.detail.checkFinishedAndFound=Pemeriksaan selesai berjalan. Harap tinjau hasilnya.
+health.check.detail.checkFailed=Pemeriksaan terhenti karena terjadi kesalahan.
+health.check.detail.checkCancelled=Pemeriksaan dibatalkan.
health.check.exportBtn=Ekspor Laporan
## Fix Application
+health.fix.fixBtn=Perbaiki
+health.fix.successTip=Perbaikan berhasil
+health.fix.failTip=Perbaikan gagal, lihat log untuk detailnya
# Preferences
preferences.title=Preferensi
@@ -183,54 +216,153 @@ preferences.updates.updateAvailable=Pembaharuan ke versi %s tersedia.
## Contribution
preferences.contribute=Dukung Kami
preferences.contribute.registeredFor=Sertifikat pendukung terdaftar untuk %s
+preferences.contribute.noCertificate=Dukung Cryptomator dan terima sertifikat pendukung. Ini seperti kunci lisensi tetapi untuk orang-orang hebat yang menggunakan perangkat lunak gratis. ;-)
+preferences.contribute.getCertificate=Belum punya? Pelajari bagaimana Anda bisa mendapatkannya.
+preferences.contribute.promptText=Tempel kode sertifikat pendukung di sini
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
+preferences.about=Tentang
# Vault Statistics
+stats.title=Statistik untuk %s
+stats.cacheHitRate=Tingkat Hit Cache
## Read
+stats.read.throughput.idle=Read: idle
+stats.read.throughput.kibs=Read: %.2f kiB/s
+stats.read.throughput.mibs=Read: %.2f MiB/s
+stats.read.total.data.none=Data read: -
+stats.read.total.data.kib=Data read: %.1f kiB
+stats.read.total.data.mib=Data read: %.1f MiB
+stats.read.total.data.gib=Data read: %.1f GiB
+stats.decr.total.data.none=Data decrypted: -
+stats.decr.total.data.kib=Data decrypted: %.1f kiB
+stats.decr.total.data.mib=Data decrypted: %.1f MiB
+stats.decr.total.data.gib=Data decrypted: %.1f GiB
+stats.read.accessCount=Total reads: %d
## Write
+stats.write.throughput.idle=Write: idle
+stats.write.throughput.kibs=Write: %.2f kiB/s
+stats.write.throughput.mibs=Write: %.2f MiB/s
+stats.write.total.data.none=Data tertulis: -
+stats.write.total.data.kib=Data tertulis: %.1f kiB
+stats.write.total.data.mib=Data tertulis: %.1f MiB
+stats.write.total.data.gib=Data tertulis: %.1f GiB
+stats.encr.total.data.none=Data terenkripsi: -
+stats.encr.total.data.kib=Data terenkripsi: %.1f kiB
+stats.encr.total.data.mib=Data terenkripsi: %.1f MiB
+stats.encr.total.data.gib=Data terenkripsi: %.1f GiB
+stats.write.accessCount=Total menulis: %d
# Main Window
main.closeBtn.tooltip=Tutup
+main.minimizeBtn.tooltip=Minimalkan
main.preferencesBtn.tooltip=Preferensi
+main.debugModeEnabled.tooltip=Mode Debug diaktifkan
+main.donationKeyMissing.tooltip=Pertimbangjan untuk donasi
## Drag 'n' Drop
+main.dropZone.dropVault=Tambah vault ini
+main.dropZone.unknownDragboardContent=Jika Anda ingin menambahkan vault, seret ke jendela ini
## Vault List
+main.vaultlist.emptyList.onboardingInstruction=Klik untuk tambah vault
+main.vaultlist.contextMenu.remove=Hapus…
main.vaultlist.contextMenu.lock=Gembok
+main.vaultlist.contextMenu.unlock=Membuka…
main.vaultlist.contextMenu.unlockNow=Buka Kunci Sekarang
+main.vaultlist.contextMenu.vaultoptions=Tampilkan Opsi Vault
main.vaultlist.contextMenu.reveal=Buka Drive
main.vaultlist.addVaultBtn=Tambah Brankas
## Vault Detail
### Welcome
+main.vaultDetail.welcomeOnboarding=Terima kasih telah memilih Cryptomator untuk melindungi file Anda. Jika Anda memerlukan bantuan, lihat panduan awal kami:
### Locked
+main.vaultDetail.lockedStatus=TERKUNCI
+main.vaultDetail.unlockBtn=Membuka…
main.vaultDetail.unlockNowBtn=Buka Kunci Sekarang
+main.vaultDetail.optionsBtn=Opsi Vault
+main.vaultDetail.passwordSavedInKeychain=Kata Sandi tersimpan
### Unlocked
+main.vaultDetail.unlockedStatus=TERBUKA
+main.vaultDetail.accessLocation=Konten vault Anda dapat diakses di sini:
main.vaultDetail.revealBtn=Buka Drive
main.vaultDetail.lockBtn=Gembok
+main.vaultDetail.bytesPerSecondRead=Read:
+main.vaultDetail.bytesPerSecondWritten=Write:
+main.vaultDetail.throughput.idle=idle
+main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/detik
main.vaultDetail.stats=Statistik Vault
### Missing
+main.vaultDetail.missing.info=Cryptomator tidak dapat menemukan vault di path ini.
+main.vaultDetail.missing.recheck=Periksa kembali
+main.vaultDetail.missing.remove=Hapus dari Daftar Vault…
+main.vaultDetail.missing.changeLocation=Ganti Lokasi Vault…
### Needs Migration
main.vaultDetail.migrateButton=Tingkatkan Vault
+main.vaultDetail.migratePrompt=Vault Anda perlu ditingkatkan ke format baru, sebelum Anda dapat mengaksesnya
### Error
+main.vaultDetail.error.info=Terjadi kesalahan saat memuat vault dari disk.
+main.vaultDetail.error.reload=Muat Ulang
+main.vaultDetail.error.windowTitle=Terjadi kesalahan saat memuat vault
# Wrong File Alert
+wrongFileAlert.title=Cara Mengenkripsi File
+wrongFileAlert.header.title=Apakah Anda mencoba mengenkripsi file-file ini?
+wrongFileAlert.header.lead=Untuk itu, Cryptomator menyediakan volume di sistem file manager Anda.
+wrongFileAlert.instruction.0=Untuk mengenkripsi file, ikuti langkah-langkah berikut:
+wrongFileAlert.instruction.1=1. Membuka vault Anda.
+wrongFileAlert.instruction.2=Klik "Reveal" untuk membuka volume di file manager Anda.
+wrongFileAlert.instruction.3=3. Tambahkan file Anda ke volume ini.
+wrongFileAlert.link=Untuk bantuan lebih lanjut, kunjungi
# Vault Options
## General
vaultOptions.general=Umum
vaultOptions.general.vaultName=Nama Brankas
+vaultOptions.general.autoLock.lockAfterTimePart1=Kunci saat idle untuk
+vaultOptions.general.autoLock.lockAfterTimePart2=menit
+vaultOptions.general.unlockAfterStartup=Buka vault saat memulai Cryptomator
+vaultOptions.general.actionAfterUnlock=Setelah berhasil membuka
+vaultOptions.general.actionAfterUnlock.ignore=Biarkan
vaultOptions.general.actionAfterUnlock.reveal=Buka Drive
+vaultOptions.general.actionAfterUnlock.ask=Tanya
+vaultOptions.general.startHealthCheckBtn=Mulai Pemeriksaan Kesehatan
## Mount
+vaultOptions.mount=Pemasangan
+vaultOptions.mount.readonly=Read-Only
+vaultOptions.mount.customMountFlags=Custom Mount Flags
+vaultOptions.mount.winDriveLetterOccupied=terisi
+vaultOptions.mount.mountPoint=Titik Pasang
+vaultOptions.mount.mountPoint.auto=Secara otomatis memilih lokasi yang sesuai
+vaultOptions.mount.mountPoint.driveLetter=Gunakan huruf drive yang ditetapkan
+vaultOptions.mount.mountPoint.custom=Path khusus
vaultOptions.mount.mountPoint.directoryPickerButton=Pilih…
+vaultOptions.mount.mountPoint.directoryPickerTitle=Pilih direktori kosong
## Master Key
+vaultOptions.masterkey=Kata Sandi
vaultOptions.masterkey.changePasswordBtn=Ubah Kata Sandi
+vaultOptions.masterkey.forgetSavedPasswordBtn=Lupa Kata Sandi
+vaultOptions.masterkey.recoveryKeyExplanation=Kunci pemulihan adalah satu-satunya cara Anda untuk memulihkan akses ke vault jika Anda kehilangan kata sandi.
+vaultOptions.masterkey.showRecoveryKeyBtn=Tampilkan Kunci Pemulihan
+vaultOptions.masterkey.recoverPasswordBtn=Pemulihan Kata Sandi
# Recovery Key
+recoveryKey.title=Kunci Pemulihan
+recoveryKey.enterPassword.prompt=Masukkan kata sandi untuk menampilkan kunci pemulikan untuk "%s":
+recoveryKey.display.message=Kunci pemulihan berikut dapat digunakan untuk memulihkan akses ke "%s":
+recoveryKey.display.StorageHints=Simpan di tempat yang sangat aman, misal.:\n • Simpan menggunakan password manager\n • Simpan di USB\n • cetak di kertas
+recoveryKey.recover.prompt=Masukkan kunci pemulihan untuk "%s":
+recoveryKey.recover.validKey=Ini adalah kunci pemulihan yang valid
+recoveryKey.printout.heading=Kunci Pemulihan Cryptomator\n"%s"\n
# New Password
+newPassword.promptText=Masukkan kata sandi baru
+newPassword.reenterPassword=Konfirmasi kata sandi baru
+newPassword.passwordsMatch=Kasmta Sandi sesuai!
+newPassword.passwordsDoNotMatch=Kata Sandi tidak sesuai
+passwordStrength.messageLabel.tooShort=Gunakan minimal %d characters
passwordStrength.messageLabel.0=Sangat lemah
passwordStrength.messageLabel.1=Lemah
passwordStrength.messageLabel.2=Cukup
diff --git a/src/main/resources/i18n/strings_it.properties b/src/main/resources/i18n/strings_it.properties
index 9fe88f563..51adc6e18 100644
--- a/src/main/resources/i18n/strings_it.properties
+++ b/src/main/resources/i18n/strings_it.properties
@@ -75,7 +75,9 @@ addvault.new.readme.accessLocation.2=Questa è la posizione d'accesso della tua
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 "vault.cryptomator" della tua cassaforte. Se esiste solo un file chiamato "masterkey.cryptomator", allora scegli quello.
addvaultwizard.existing.chooseBtn=Scegli…
+addvaultwizard.existing.filePickerTitle=Seleziona file cassaforte
## Success
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
@@ -115,9 +117,8 @@ unlock.error.invalidMountPoint.existing=Il punto di montaggio "%s" esiste già o
# Lock
## Force
-lock.forced.heading=Blocco normale fallito
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
+lock.forced.retryBtn=Riprova
## Failure
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.
diff --git a/src/main/resources/i18n/strings_ja.properties b/src/main/resources/i18n/strings_ja.properties
index b0947bf2f..dfda53a95 100644
--- a/src/main/resources/i18n/strings_ja.properties
+++ b/src/main/resources/i18n/strings_ja.properties
@@ -75,7 +75,9 @@ addvault.new.readme.accessLocation.2=ここは金庫のアクセス先です。
addvault.new.readme.accessLocation.3=このボリュームに追加したファイルは Cryptomator によって暗号化されます。一般的なドライブ/フォルダー上のように作業することができます。ここでは復号したコンテンツのビューにすぎず、ファイルは常にハードドライブ上で暗号化されています。
addvault.new.readme.accessLocation.4=このファイルはいつでも削除できます。
## Existing
+addvaultwizard.existing.instruction=すでにある金庫の "vault.cryptomator" ファイルを選択してください。"masterkey.cryptomator" という名前のファイルだけが存在する場合は、このファイルを代わりに選択してください。
addvaultwizard.existing.chooseBtn=選択...
+addvaultwizard.existing.filePickerTitle=金庫のファイルを選択
## Success
addvaultwizard.success.nextStepsInstructions=金庫 "%s" を追加しました。\n金庫にアクセスしたり、コンテンツを追加したりするには、金庫を解錠する必要があります。あるいは、後で解錠することが可能です。
addvaultwizard.success.unlockNow=今すぐ解錠
@@ -115,9 +117,10 @@ unlock.error.invalidMountPoint.existing=マウント ポイント "%s" が既に
# Lock
## Force
-lock.forced.heading=正常な施錠に失敗しました
+lock.forced.heading=施錠に失敗
lock.forced.message=保留中の操作または、開かれたファイルによって、"%s" の施錠が中断されました。この金庫を強制的に施錠することはできますが、I/O を中断すると保存されていないデータを失う可能性があります。
-lock.forced.confirmBtn=強制施錠
+lock.forced.retryBtn=再試行
+lock.forced.forceBtn=強制的に施錠
## Failure
lock.fail.heading=金庫の施錠に失敗しました。
lock.fail.message=金庫 "%s" を施錠できませんでした。保存されていないデータがほかの場所に保存され、重要な読み込み/書き込み操作が完了していることを確認してください。金庫を閉じるには、Cryptomator のプロセスを強制終了してください。
diff --git a/src/main/resources/i18n/strings_ko.properties b/src/main/resources/i18n/strings_ko.properties
index 8c8f581c0..63b1d9111 100644
--- a/src/main/resources/i18n/strings_ko.properties
+++ b/src/main/resources/i18n/strings_ko.properties
@@ -113,9 +113,8 @@ unlock.error.invalidMountPoint.existing=구성지점/폴더가 이미 존재하
# Lock
## Force
-lock.forced.heading=정상적인 잠금을 실패하였습니다.
lock.forced.message=대기 중인 작동이나 파일이 열려있어 "%s"를 잠그는데 실패하였습니다. 이 Vault를 강제로 잠글 수 있으나, 입/출력의 중단은 저장되지 않은 데이터의 유실을 초래할 수 있습니다.
-lock.forced.confirmBtn=강제 잠금
+lock.forced.retryBtn=재시도
## Failure
lock.fail.heading=Vault 잠금에 실패하였습니다.
lock.fail.message="%s" Vault를 잠글 수 없습니다. 저장되지 않은 작업이 다른 곳에 저장된 것과 중요한 읽기/쓰기 동작이 완료되었는지 확인 하십시요. Vault를 닫기 위해, Cryptomator 프로세스를 강제로 종료 하십시요.
diff --git a/src/main/resources/i18n/strings_nb.properties b/src/main/resources/i18n/strings_nb.properties
index 278b0a397..9a3fb5fe5 100644
--- a/src/main/resources/i18n/strings_nb.properties
+++ b/src/main/resources/i18n/strings_nb.properties
@@ -106,9 +106,8 @@ unlock.error.invalidMountPoint.existing=Monteringspunktet "%s" finnes enten alle
# Lock
## Force
-lock.forced.heading=Låsingen mislyktes
lock.forced.message=Låsing "%s" ble blokkert av ventende operasjoner eller åpne filer. Du kan tvinge låsing av dette hvelvet, men avbrytelse av I/O kan føre til tap av ulagrede data.
-lock.forced.confirmBtn=Tving låsing
+lock.forced.retryBtn=Prøv igjen
## Failure
lock.fail.heading=Låsing av hvelvet mislyktes.
lock.fail.message=Hvelvet "%s" kunne ikke låses. Forsikre deg om at ulagrede arbeider lagres andre steder, og at viktige lese/skrive-operasjoner er fullført. For å lukke hvelvet må du avbryte Cryptomatorprosessen.
diff --git a/src/main/resources/i18n/strings_nl.properties b/src/main/resources/i18n/strings_nl.properties
index 74279a24b..0f95c1619 100644
--- a/src/main/resources/i18n/strings_nl.properties
+++ b/src/main/resources/i18n/strings_nl.properties
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Koppelpunt "%s" bestaat reeds of de bove
# Lock
## Force
-lock.forced.heading=De kluis kon niet op een gecontroleerde manier vergrendeld worden
+lock.forced.heading=Vergrendelen mislukt
lock.forced.message=Het vergrendelen van "%s" werd voorkomen door lopende processen of geopende bestanden. U kunt de vergrendeling op deze kluis forceren, maar dit kan leiden tot het verlies van niet-opgeslagen gegevens.
-lock.forced.confirmBtn=Forceer vergrendeling
+lock.forced.retryBtn=Opnieuw proberen
+lock.forced.forceBtn=Forceer vergrendeling
## Failure
lock.fail.heading=Kluis kan niet vergrendeld worden.
lock.fail.message=Kluis "%s" kan niet vergrendeld worden. Zorg ervoor dat u uw niet-opgeslagen werk ergens anders opslaat en belangrijke lees-/schrijfbewerkingen hebt voltooid. Om de kluis te sluiten, beëindigt u het Cryptomator-proces.
diff --git a/src/main/resources/i18n/strings_pa.properties b/src/main/resources/i18n/strings_pa.properties
index dd4587076..394ab7355 100644
--- a/src/main/resources/i18n/strings_pa.properties
+++ b/src/main/resources/i18n/strings_pa.properties
@@ -103,9 +103,7 @@ unlock.error.invalidMountPoint.existing="%s" ਮਾਊਂਟ ਪੁਆਇੰਟ
# Lock
## Force
-lock.forced.heading=ਸਧਾਰਨ ਲਾਕ ਕਰਨਾ ਅਸਫ਼ਲ ਹੈ
lock.forced.message=ਬਾਕੀ ਰਹਿੰਦੀਆਂ ਕਾਰਵਾਈਆਂ ਜਾਂ ਫ਼ਾਈਲਾਂ ਖੁੱਲ੍ਹਣ ਕਰਕੇ "%s" ਲਾਕ ਕਰਨ ਨੂੰ ਰੋਕਿਆ ਗਿਆ ਹੈ। ਤੁਸੀਂ ਇਸ ਵਾਲਟ ਨੂੰ ਧੱਕੇ ਨਾਲ ਲਾਕ ਕਰ ਸਕਦੇ ਹੋ, ਪਰ I/O ਵਿੱਚ ਰੁਕਾਵਟ ਪਾਉਣ ਨਾਲ ਨਾ-ਸੰਭਾਲਿਆ ਡਾਟਾ ਖਤਮ ਹੋ ਜਾ ਸਕਦਾ ਹੈ।
-lock.forced.confirmBtn=ਧੱਕੇ ਨਾਲ ਲਾਕ ਕਰੋ
## Failure
lock.fail.heading=ਵਾਲਟ ਲਾਕ ਕਰਨਾ ਅਸਫ਼ਲ ਹੈ।
lock.fail.message=ਵਾਲਟ "%s" ਨੂੰ ਲਾਕ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਨਾ-ਸੰਭਾਲੇ ਕੰਮ ਨੂੰ ਹੋਰ ਥਾਂ ਸੰਭਾਲ ਲਿਆ ਹੈ ਅਤੇ ਖਾਸ ਪੜ੍ਹਨ/ਲਿਖਣ ਕਾਰਵਾਈਆਂ ਪੂਰੀਆਂ ਹੋਈਆਂ ਹਨ। ਵਾਲਟ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ Cryptomator ਕਾਰਵਾਈ ਨੂੰ ਖਤਮ ਕਰੋ।
diff --git a/src/main/resources/i18n/strings_pl.properties b/src/main/resources/i18n/strings_pl.properties
index 331f30916..e823d166f 100644
--- a/src/main/resources/i18n/strings_pl.properties
+++ b/src/main/resources/i18n/strings_pl.properties
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Punkt montowania już istnieje lub braku
# Lock
## Force
-lock.forced.heading=Blokada nie powiodła się
+lock.forced.heading=Nieudana próba blokady
lock.forced.message=Zamknięcie "%s" zostało zablokowane przez oczekujące operacje lub otwarte pliki. Możesz wymusić zamknięcie tego sejfu, ale może to spowodować utratę niezapisanych danych.
-lock.forced.confirmBtn=Wymuś zablokowanie
+lock.forced.retryBtn=Ponów
+lock.forced.forceBtn=Wymuś blokowanie
## Failure
lock.fail.heading=Błąd blokowania sejfu.
lock.fail.message=Nie można zablokować sejfu "%s". Zapisz wszelkie zmiany w bezpiecznym miejscu i upewnij się, że nie ma żadnych ważnych oczekujących operacji odczytu/zapisu. W celu zamknięcia sejfu ubij Cryptomator.
diff --git a/src/main/resources/i18n/strings_pt.properties b/src/main/resources/i18n/strings_pt.properties
index 7305e0f11..5f60e7025 100644
--- a/src/main/resources/i18n/strings_pt.properties
+++ b/src/main/resources/i18n/strings_pt.properties
@@ -13,6 +13,11 @@ generic.button.done=Ok
generic.button.next=Seguinte
generic.button.print=Imprimir
## Error
+generic.error.title=Erro %s
+generic.error.instruction=Opa! Cryptomator não esperava que isto acontecesse. Pode procurar as soluções existentes para este erro. Ou se ainda não tiver sido relatado, sinta-se à vontade para o fazer.
+generic.error.hyperlink.lookup=Procure este erro
+generic.error.hyperlink.report=Relatar este erro
+generic.error.technicalDetails=Detalhes:
# Defaults
defaults.vault.vaultName=Cofre
@@ -43,6 +48,9 @@ addvaultwizard.new.directoryPickerLabel=Outro Local
addvaultwizard.new.directoryPickerButton=Escolher…
addvaultwizard.new.directoryPickerTitle=Selecionar diretório
addvaultwizard.new.fileAlreadyExists=Aviso: Já existe um Ficheiro ou Diretório com o mesmo nome
+addvaultwizard.new.locationDoesNotExist=Um diretório no caminho especificado não existe ou não pode ser acessado
+addvaultwizard.new.locationIsNotWritable=Sem acesso de escrita no caminho especificado
+addvaultwizard.new.locationIsOk=Localização adequada para o seu cofre
addvaultwizard.new.invalidName=Nome de cofre inválido. Por favor considere um nome de diretório regular.
### Password
addvaultwizard.new.createVaultBtn=Criar Cofre
@@ -53,6 +61,9 @@ addvaultwizard.new.generateRecoveryKeyChoice.no=Não obrigado, não vou perder a
addvault.new.readme.storageLocation.fileName=IMPORTANTE.rtf
addvault.new.readme.storageLocation.1=⚠ ARQUIVOS DO COFRE ⚠
addvault.new.readme.storageLocation.2=Este é o local de armazenamento do seu cofre.
+addvault.new.readme.storageLocation.3=NÃO FAÇA
+addvault.new.readme.storageLocation.4=- alterar quaisquer ficheiros dentro deste directório ou
+addvault.new.readme.storageLocation.5=- colar quaisquer ficheiros para encriptação neste directório.
addvault.new.readme.storageLocation.6=Se deseja criptografar arquivos e visualizar o conteúdo do cofre, faça o seguinte:
addvault.new.readme.storageLocation.7=1. Adicione este cofre ao Cryptomator.
addvault.new.readme.storageLocation.8=2. Desbloqueie o cofre no Cryptomator.
@@ -60,6 +71,7 @@ addvault.new.readme.storageLocation.9=3. Abra o local de acesso clicando no bot
addvault.new.readme.storageLocation.10=Se precisar de ajuda, visite a documentação: %s
addvault.new.readme.accessLocation.fileName=BEM-VINDO.rtf
addvault.new.readme.accessLocation.1=🔐 VOLUME CRIPTOGRAFADO 🔐
+addvault.new.readme.accessLocation.2=Este é o local de acesso do seu cofre.
addvault.new.readme.accessLocation.4=Sinta-se livre para remover este ficheiro.
## Existing
addvaultwizard.existing.chooseBtn=Escolher…
@@ -92,7 +104,9 @@ unlock.success.rememberChoice=Lembrar escolha, não mostrar isto novamente
# Lock
## Force
-lock.forced.confirmBtn=Forçar Bloqueio
+lock.forced.heading=Cadeado falhou\nOr\nBloqueio falhou
+lock.forced.retryBtn=Tente novamente
+lock.forced.forceBtn=Forçar bloqueio
## Failure
# Migration
diff --git a/src/main/resources/i18n/strings_pt_BR.properties b/src/main/resources/i18n/strings_pt_BR.properties
index be7ecb16c..bd19fa5bf 100644
--- a/src/main/resources/i18n/strings_pt_BR.properties
+++ b/src/main/resources/i18n/strings_pt_BR.properties
@@ -75,7 +75,9 @@ addvault.new.readme.accessLocation.2=Este é o local de acesso ao seu cofre.
addvault.new.readme.accessLocation.3=Todos os arquivos adicionados a este volume serão encriptados pelo Cryptomator. Você pode trabalhar nele tal como em qualquer outra unidade/pasta. Esta é apenas uma visão desencriptada do seu conteúdo, seus arquivos ficam encriptados em seu disco rígido o tempo todo.
addvault.new.readme.accessLocation.4=Sinta-se livre para apagar este arquivo.
## Existing
+addvaultwizard.existing.instruction=Escolha o arquivo "vault.cryptomator" do seu cofre existente. Se existir apenas um arquivo chamado "masterkey.cryptomator", selecione outro.
addvaultwizard.existing.chooseBtn=Selecionar…
+addvaultwizard.existing.filePickerTitle=Selecionar arquivo do Cofre
## Success
addvaultwizard.success.nextStepsInstructions=Cofre "%s" adicionado.\nVocê precisa desbloquear este cofre para acessar ou adicionar conteúdo. Você também pode desbloqueá-lo a qualquer momento.
addvaultwizard.success.unlockNow=Desbloquear Agora
@@ -115,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Ponto de montagem/pasta já existe ou a
# Lock
## Force
-lock.forced.heading=Bloqueio normal falhou
+lock.forced.heading=Bloqueio falhou
lock.forced.message=Trancar "%s" foi bloqueado por operações pendentes ou arquivos abertos. Você pode forçar o bloqueio deste cofre, no entanto, a interrupção pode resultar em perda de dados não salvos.
-lock.forced.confirmBtn=Forçar Bloqueio
+lock.forced.retryBtn=Tentar Novamente
+lock.forced.forceBtn=Forçar Bloqueio
## Failure
lock.fail.heading=O bloqueio do cofre falhou.
lock.fail.message=Cofre "%s" não pôde ser bloqueado. Certifique-se de que o trabalho não salvo está salvo em outro lugar e que operações de Leitura/Escrita importantes sejam concluídas. Para fechar o cofre, encerre o processo do Cryptomator.
diff --git a/src/main/resources/i18n/strings_ro.properties b/src/main/resources/i18n/strings_ro.properties
index 9276f89aa..2663460b0 100644
--- a/src/main/resources/i18n/strings_ro.properties
+++ b/src/main/resources/i18n/strings_ro.properties
@@ -110,9 +110,8 @@ unlock.error.invalidMountPoint.existing=Punctul de montare "%s" există deja sau
# 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
+lock.forced.retryBtn=Încercați din nou
## 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.
diff --git a/src/main/resources/i18n/strings_ru.properties b/src/main/resources/i18n/strings_ru.properties
index e1f6a3475..22b529478 100644
--- a/src/main/resources/i18n/strings_ru.properties
+++ b/src/main/resources/i18n/strings_ru.properties
@@ -14,8 +14,8 @@ generic.button.next=Далее
generic.button.print=Печать
## Error
generic.error.title=Ошибка: %s
-generic.error.instruction=Произошла непредвиденная ситуация. Попробуйте найти уже имеющиеся решения этой ошибки. Если об этой ошибке ещё не сообщали, то сделайте это.
-generic.error.hyperlink.lookup=Найти ошибку
+generic.error.instruction=Ой! Криптоматор не ожидал, что так произойдет. Вы можете поискать существующие решения этой ошибки. Или если об этом еще не сообщалось, не стесняйтесь сделать это.
+generic.error.hyperlink.lookup=Искать ошибку
generic.error.hyperlink.report=Сообщить об ошибке
generic.error.technicalDetails=Подробности:
@@ -95,7 +95,7 @@ changepassword.finalConfirmation=Я понимаю, что не смогу по
# Forget Password
forgetPassword.title=Не помню пароль
forgetPassword.information=Сохранённый пароль от этого хранилища будет удалён из вашей связки ключей.
-forgetPassword.confirmBtn=Не помню пароль
+forgetPassword.confirmBtn=Забыть сохранённый пароль
# Unlock
unlock.title=Разблокировать "%s"
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Точка монтирования %s
# Lock
## Force
-lock.forced.heading=Ошибка мягкой блокировки
+lock.forced.heading=Не удалось заблокировать
lock.forced.message=Блокировка "%s" невозможна из-за незавершённых операций или открытых файлов. Вы можете заблокировать это хранилище принудительно, однако прерывание ввода-вывода может привести к потере несохранённых данных.
-lock.forced.confirmBtn=Принудительная блокировка
+lock.forced.retryBtn=Повторить
+lock.forced.forceBtn=Принудительная блокировка
## Failure
lock.fail.heading=Не удалось заблокировать хранилище.
lock.fail.message=Хранилище "%s" не удалось заблокировать. Убедитесь, что несохранённые данные сохранены в другом месте и завершены важные операции чтения/записи. Чтобы закрыть хранилище, завершите процесс Cryptomator.
diff --git a/src/main/resources/i18n/strings_sk.properties b/src/main/resources/i18n/strings_sk.properties
index 6223320c1..ac52f4a22 100644
--- a/src/main/resources/i18n/strings_sk.properties
+++ b/src/main/resources/i18n/strings_sk.properties
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Bod pripojenia "%s" už existuje alebo c
# Lock
## Force
-lock.forced.heading=Bežné uzamknutie zlyhalo
+lock.forced.heading=Uzamknutie zlyhalo
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
+lock.forced.retryBtn=Skúsiť znovu
+lock.forced.forceBtn=Vynútené uzamknutie
## Failure
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.
diff --git a/src/main/resources/i18n/strings_sr.properties b/src/main/resources/i18n/strings_sr.properties
index 3e7183746..f01d76a67 100644
--- a/src/main/resources/i18n/strings_sr.properties
+++ b/src/main/resources/i18n/strings_sr.properties
@@ -108,9 +108,7 @@ unlock.error.invalidMountPoint.existing=Тачка везивања "%s" већ
# Lock
## Force
-lock.forced.heading=Нормално закључавање није успело
lock.forced.message=Закључавање "%s" је блокирано операцијама на чекању или отвореним датотекама. Можете присилно закључати овај сеф, међутим прекид "I/O" операција може резултирати губитком несачуваних података.
-lock.forced.confirmBtn=Присилно закључај
## Failure
lock.fail.heading=Закључавање сефа није успело.
lock.fail.message=Сеф "%s" није могуће закључати. Будите сигурни да је несачувани рад сачуван негде другде и да су важне операције читања/писања завршене. Како бисте затворили сеф, зауставите Cryptomator процес у систему.
diff --git a/src/main/resources/i18n/strings_sr_Latn.properties b/src/main/resources/i18n/strings_sr_Latn.properties
index 2b681e4a5..83b9161a9 100644
--- a/src/main/resources/i18n/strings_sr_Latn.properties
+++ b/src/main/resources/i18n/strings_sr_Latn.properties
@@ -108,9 +108,7 @@ unlock.error.invalidMountPoint.existing=Tačka vezivanja "%s" već postoji ili j
# Lock
## Force
-lock.forced.heading=Normalno zaključavanje nije uspelo
lock.forced.message=Zaključavanje "%s" je blokirano operacijama na čekanju ili otvorenim datotekama. Možete prisilno zaključati ovaj sef, međutim prekid "I/O" operacija može rezultirati gubitkom nesačuvanih podataka.
-lock.forced.confirmBtn=Prisilno zaključaj
## Failure
lock.fail.heading=Zaključavanje sefa nije uspelo.
lock.fail.message=Sef "%s" nije moguće zaključati. Budite sigurni da je nesačuvani rad sačuvan negde drugde i da su važne operacije čitanja/pisanja završene. Kako biste zatvorili sef, zaustavite Cryptomator proces u sistemu.
diff --git a/src/main/resources/i18n/strings_sv.properties b/src/main/resources/i18n/strings_sv.properties
index 2831a9cba..547a8b8fa 100644
--- a/src/main/resources/i18n/strings_sv.properties
+++ b/src/main/resources/i18n/strings_sv.properties
@@ -75,7 +75,9 @@ addvault.new.readme.accessLocation.2=Detta är ditt valvs åtkomstplats.
addvault.new.readme.accessLocation.3=Alla filer som läggs till denna volym kommer att krypteras av Cryptomator. Du kan arbeta med dem som i vilken annan enhet/mapp som helst. Detta är bara en dekrypterad vy av dess innehåll, dina filer förblir krypterade på din hårddisk hela tiden.
addvault.new.readme.accessLocation.4=Du kan ta bort denna fil.
## Existing
+addvaultwizard.existing.instruction=Välj filen "vault.cryptomator" i ditt befintliga valv. Om det endast finns en fil som heter "masterkey.cryptomator", välj den istället.
addvaultwizard.existing.chooseBtn=Välj…
+addvaultwizard.existing.filePickerTitle=Välj valvfil
## Success
addvaultwizard.success.nextStepsInstructions=Lade till valv "%s".\nDu måste låsa upp detta valv för att komma åt eller lägga till innehåll. Du kan även låsa upp det vid ett senare tillfälle.
addvaultwizard.success.unlockNow=Lås upp nu
@@ -115,9 +117,8 @@ unlock.error.invalidMountPoint.existing=Monteringspunkten "%s" finns redan eller
# Lock
## Force
-lock.forced.heading=Normal låsning misslyckades
lock.forced.message=Låsning av "%s" förhindras av pågående operationer eller öppna filer. Du kan tvinga låsning av detta valv, men det kan resultera i förlust av osparade data.
-lock.forced.confirmBtn=Tvinga låsning
+lock.forced.retryBtn=Försök igen
## Failure
lock.fail.heading=Låsning av valv misslyckades.
lock.fail.message=Valvet "%s" kunde inte låsas. Se till att osparat arbete sparas någon annanstans och viktiga läs- och skrivfunktioner är klara. För att stänga valvet, avsluta Cryptomator-processen.
diff --git a/src/main/resources/i18n/strings_ta.properties b/src/main/resources/i18n/strings_ta.properties
new file mode 100644
index 000000000..6b5ea4bc9
--- /dev/null
+++ b/src/main/resources/i18n/strings_ta.properties
@@ -0,0 +1,89 @@
+# Locale Specific CSS files such as CJK, RTL,...
+
+# Generics
+## Button
+## Error
+
+# Defaults
+
+# Tray Menu
+
+# Add Vault Wizard
+## Welcome
+## New
+### Name
+### Location
+### Password
+### Information
+## Existing
+## Success
+
+# Remove Vault
+
+# Change Password
+
+# Forget Password
+
+# Unlock
+##
+## Success
+## Failure
+### Invalid Mount Point
+
+# Lock
+## Force
+lock.forced.retryBtn=மீண்டும் முயற்சிக்கவும்
+## Failure
+
+# Migration
+## Start
+## Run
+## Success
+## Missing file system capabilities
+## Impossible
+
+# Health Check
+## Start
+## Start Failure
+## Check Selection
+## Detail view
+## Fix Application
+
+# Preferences
+## General
+## Volume
+## Updates
+## Contribution
+#<-- Add entries for donations and code/translation/documentation contribution -->
+
+## About
+
+# Vault Statistics
+## Read
+## Write
+
+# Main Window
+## Drag 'n' Drop
+## Vault List
+## Vault Detail
+### Welcome
+### Locked
+### Unlocked
+### Missing
+### Needs Migration
+### Error
+
+# Wrong File Alert
+
+# Vault Options
+## General
+
+## Mount
+## Master Key
+
+
+# Recovery Key
+
+# New Password
+
+# Quit
diff --git a/src/main/resources/i18n/strings_te.properties b/src/main/resources/i18n/strings_te.properties
new file mode 100644
index 000000000..e2ce80d76
--- /dev/null
+++ b/src/main/resources/i18n/strings_te.properties
@@ -0,0 +1,89 @@
+# Locale Specific CSS files such as CJK, RTL,...
+
+# Generics
+## Button
+## Error
+
+# Defaults
+
+# Tray Menu
+
+# Add Vault Wizard
+## Welcome
+## New
+### Name
+### Location
+### Password
+### Information
+## Existing
+## Success
+
+# Remove Vault
+
+# Change Password
+
+# Forget Password
+
+# Unlock
+##
+## Success
+## Failure
+### Invalid Mount Point
+
+# Lock
+## Force
+lock.forced.retryBtn=మళ్ళీ చేయండి
+## Failure
+
+# Migration
+## Start
+## Run
+## Success
+## Missing file system capabilities
+## Impossible
+
+# Health Check
+## Start
+## Start Failure
+## Check Selection
+## Detail view
+## Fix Application
+
+# Preferences
+## General
+## Volume
+## Updates
+## Contribution
+#<-- Add entries for donations and code/translation/documentation contribution -->
+
+## About
+
+# Vault Statistics
+## Read
+## Write
+
+# Main Window
+## Drag 'n' Drop
+## Vault List
+## Vault Detail
+### Welcome
+### Locked
+### Unlocked
+### Missing
+### Needs Migration
+### Error
+
+# Wrong File Alert
+
+# Vault Options
+## General
+
+## Mount
+## Master Key
+
+
+# Recovery Key
+
+# New Password
+
+# Quit
diff --git a/src/main/resources/i18n/strings_tr.properties b/src/main/resources/i18n/strings_tr.properties
index 906356704..ecb4fff5f 100644
--- a/src/main/resources/i18n/strings_tr.properties
+++ b/src/main/resources/i18n/strings_tr.properties
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Bağlama noktası / klasör zaten var ve
# Lock
## Force
-lock.forced.heading=Normal kilitleme başarısız oldu
+lock.forced.heading=Kilitleme başarısız
lock.forced.message="%s" nin kilitlenmesi, bekleyen işlemler veya açık dosyalar tarafından engellendi. Bu kasayı zorla kilitleyebilirsiniz, ancak G/Ç'nin kesilmesi kaydedilmemiş verilerin kaybına neden olabilir.
-lock.forced.confirmBtn=Kilitlemeyi Zorla
+lock.forced.retryBtn=Yeniden dene
+lock.forced.forceBtn=Kilitlemeye zorla
## Failure
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.
diff --git a/src/main/resources/i18n/strings_uk.properties b/src/main/resources/i18n/strings_uk.properties
index 1b7af9c4d..ff6e674e8 100644
--- a/src/main/resources/i18n/strings_uk.properties
+++ b/src/main/resources/i18n/strings_uk.properties
@@ -2,20 +2,56 @@
# Generics
## Button
+generic.button.apply=Застосувати
+generic.button.back=Назад
+generic.button.cancel=Відмінити
+generic.button.change=Змінити
+generic.button.close=Закрити
+generic.button.copy=Копіювати
+generic.button.copied=Скопійовано!
+generic.button.done=Готово
+generic.button.next=Далі
+generic.button.print=Друкувати
## Error
+generic.error.title=Помилка %s
+generic.error.instruction=Ой! Cryptomator не очікував, що таке трапиться. Ви можете знайти існуючі рішення цієї помилки. Або, якщо про це ще не повідомили, то не соромтеся зробити це.
+generic.error.hyperlink.lookup=Дізнатися більше про цю помилку
+generic.error.hyperlink.report=Повідомити про помилку
+generic.error.technicalDetails=Докладно:
# Defaults
+defaults.vault.vaultName=Сховище
# Tray Menu
+traymenu.showMainWindow=Показати
+traymenu.showPreferencesWindow=Властивості
+traymenu.lockAllVaults=Заблокувати все
+traymenu.quitApplication=Вийти
+traymenu.vault.unlock=Розблокувати
+traymenu.vault.lock=Заблокувати
+traymenu.vault.reveal=Показати
# Add Vault Wizard
+addvaultwizard.title=Додати сховище
## Welcome
+addvaultwizard.welcome.newButton=Створити нове сховище
+addvaultwizard.welcome.existingButton=Відкрити існуюче сховище
## New
### Name
+addvaultwizard.new.nameInstruction=Оберіть назву для сховища
+addvaultwizard.new.namePrompt=Назва сховища
### Location
+addvaultwizard.new.locationInstruction=Де Cryptomator має зберігати зашифровані файли вашого сховища?
+addvaultwizard.new.locationLabel=Розташування сховища
+addvaultwizard.new.locationPrompt=…
+addvaultwizard.new.directoryPickerLabel=Власне розташування
+addvaultwizard.new.directoryPickerButton=Обрати…
+addvaultwizard.new.directoryPickerTitle=Оберіть директорію
+addvaultwizard.new.fileAlreadyExists=Файл чи папка з іменем сховища вже існує
### Password
### Information
## Existing
+addvaultwizard.existing.chooseBtn=Обрати…
## Success
# Remove Vault
@@ -25,6 +61,7 @@
# Forget Password
# Unlock
+unlock.unlockBtn=Розблокувати
##
## Success
## Failure
@@ -32,6 +69,9 @@
# Lock
## Force
+lock.forced.heading=Помилка блокування
+lock.forced.retryBtn=Повторити
+lock.forced.forceBtn=Примусове блокування
## Failure
# Migration
@@ -49,6 +89,7 @@
## Fix Application
# Preferences
+preferences.title=Властивості
## General
## Volume
## Updates
@@ -62,12 +103,17 @@
## Write
# Main Window
+main.closeBtn.tooltip=Закрити
+main.preferencesBtn.tooltip=Властивості
## Drag 'n' Drop
## Vault List
+main.vaultlist.contextMenu.lock=Заблокувати
+main.vaultlist.addVaultBtn=Додати сховище
## Vault Detail
### Welcome
### Locked
### Unlocked
+main.vaultDetail.lockBtn=Заблокувати
### Missing
### Needs Migration
### Error
@@ -76,8 +122,10 @@
# Vault Options
## General
+vaultOptions.general.vaultName=Назва сховища
## Mount
+vaultOptions.mount.mountPoint.directoryPickerButton=Обрати…
## Master Key
diff --git a/src/main/resources/i18n/strings_zh.properties b/src/main/resources/i18n/strings_zh.properties
index 184254e34..fbd2fa861 100644
--- a/src/main/resources/i18n/strings_zh.properties
+++ b/src/main/resources/i18n/strings_zh.properties
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=挂载点 "%s" 已存在或缺少父文
# Lock
## Force
-lock.forced.heading=常规锁定失败
+lock.forced.heading=锁定失败
lock.forced.message=锁定 "%s" 被挂起的操作或使用中的文件中断。您可以强制锁定此保险库,不过请注意打断 I/O 可能导致未保存的数据丢失
-lock.forced.confirmBtn=强制锁定
+lock.forced.retryBtn=重试
+lock.forced.forceBtn=强制锁定
## Failure
lock.fail.heading=锁定保险库失败
lock.fail.message=保险库 "%s" 无法锁定。请确保在其他地方保存未保存的工作,以及重要的 "读/写" 操作已完成。为了顺利关闭保险库,请查杀 Cryptomator 进程
diff --git a/src/main/resources/i18n/strings_zh_TW.properties b/src/main/resources/i18n/strings_zh_TW.properties
index c79b9c28f..cf77ffbbe 100644
--- a/src/main/resources/i18n/strings_zh_TW.properties
+++ b/src/main/resources/i18n/strings_zh_TW.properties
@@ -117,9 +117,8 @@ unlock.error.invalidMountPoint.existing=掛載點已經存在或上層資料夾
# Lock
## Force
-lock.forced.heading=正常鎖定失敗
lock.forced.message=仍有未完成的操作或開啟中的檔案以致無法鎖定 "%s"。您可以強制鎖定這個加密檔案庫,不過中斷讀寫可能會導致資料遺失或未被儲存。
-lock.forced.confirmBtn=強制鎖定
+lock.forced.retryBtn=重試
## Failure
lock.fail.heading=鎖定加密檔案庫失敗。
lock.fail.message=加密檔案庫 "%s" 無法被鎖定。請確保未存檔的工作已儲存在別的地方以及重要的讀寫工作都已經完成。請強制結束 Cryptomator 以關閉加密檔案庫。
diff --git a/src/main/resources/license/THIRD-PARTY.txt b/src/main/resources/license/THIRD-PARTY.txt
index dc72e661d..dac878ab9 100644
--- a/src/main/resources/license/THIRD-PARTY.txt
+++ b/src/main/resources/license/THIRD-PARTY.txt
@@ -17,8 +17,7 @@ Cryptomator uses 40 third-party dependencies under the following licenses:
- 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.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)
+ - Dagger (com.google.dagger:dagger:2.40.3 - 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:31.0-jre - https://github.com/google/guava)
- Apache Commons CLI (commons-cli:commons-cli:1.4 - http://commons.apache.org/proper/commons-cli/)
@@ -34,6 +33,7 @@ Cryptomator uses 40 third-party dependencies under the following licenses:
- Jetty :: Utilities (org.eclipse.jetty:jetty-util:10.0.6 - https://eclipse.org/jetty/jetty-util)
- 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)
Apache-2.0:
+ - Gson (com.google.code.gson:gson:2.8.9 - https://github.com/google/gson/gson)
- 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:
@@ -52,20 +52,20 @@ Cryptomator uses 40 third-party dependencies under the following licenses:
- Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:10.0.6 - https://eclipse.org/jetty/jetty-servlet)
- Jetty :: Utilities (org.eclipse.jetty:jetty-util:10.0.6 - https://eclipse.org/jetty/jetty-util)
Eclipse Public License - v 1.0:
- - 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)
+ - Logback Classic Module (ch.qos.logback:logback-classic:1.2.7 - http://logback.qos.ch/logback-classic)
+ - Logback Core Module (ch.qos.logback:logback-core:1.2.7 - http://logback.qos.ch/logback-core)
Eclipse Public License - v 2.0:
- 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.6 - http://logback.qos.ch/logback-classic)
- - Logback Core Module (ch.qos.logback:logback-core:1.2.6 - http://logback.qos.ch/logback-core)
+ - Logback Classic Module (ch.qos.logback:logback-classic:1.2.7 - http://logback.qos.ch/logback-classic)
+ - Logback Core Module (ch.qos.logback:logback-core:1.2.7 - http://logback.qos.ch/logback-core)
GPLv2:
- 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: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/)
+ - javafx-base (org.openjfx:javafx-base:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-base/)
+ - javafx-controls (org.openjfx:javafx-controls:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-controls/)
+ - javafx-fxml (org.openjfx:javafx-fxml:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-fxml/)
+ - javafx-graphics (org.openjfx:javafx-graphics:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-graphics/)
LGPL 2.1:
- 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: