Compare commits

...

23 Commits
1.4.6 ... 1.4.8

Author SHA1 Message Date
Sebastian Stenzel
1cc0b0728d Merge branch 'release/1.4.8' 2019-04-24 14:00:50 +02:00
Tobias Hagemann
7e7d5e46d3 Updated localizations 2019-04-24 13:29:04 +02:00
Sebastian Stenzel
5625525b21 Preparing 1.4.8 2019-04-24 13:00:02 +02:00
Sebastian Stenzel
b8fa226163 Updated dokany-nio-adapter to 1.1.7, required by #783 2019-04-24 12:58:29 +02:00
Unknown
2b44f0ee9f updated IDE config
[ci skip]
2019-04-24 12:49:35 +02:00
Sebastian Stenzel
b1ea21809b Updated CryptoFS to 1.8.1, fixes #875 2019-04-24 11:05:00 +02:00
Tobias Hagemann
8def0b2060 Fixed localization 2019-04-12 16:09:38 +02:00
Tobias Hagemann
2f61964758 Updated localizations 2019-04-12 14:35:13 +02:00
Sebastian Stenzel
2668299131 Merge branch 'master' into develop 2019-04-12 13:33:35 +02:00
Sebastian Stenzel
a7de849800 Merge branch 'release/1.4.7' 2019-04-12 13:33:00 +02:00
Sebastian Stenzel
c66a8d0cfe Preparing 1.4.7 2019-04-12 13:24:27 +02:00
Sebastian Stenzel
efa7f78ffd Added IDE run configuration
[ci skip]
2019-04-12 13:20:42 +02:00
Sebastian Stenzel
57c858351d Further dependency updates 2019-04-12 12:42:12 +02:00
Sebastian Stenzel
c3e48934b2 fixes #862, fixes #853 2019-04-12 12:40:27 +02:00
Sebastian Stenzel
06b8c7cdf4 Fixes #866 2019-04-12 12:19:54 +02:00
Sebastian Stenzel
cbf677a51c Fixes #776, fixes #791, fixes #837 2019-04-12 12:17:27 +02:00
Sebastian Stenzel
923e58ba18 Simplified I/O graph calculation, reusing datapoints (might be a fix for #827, might also be related to #284) 2019-04-08 17:28:22 +02:00
infeo
65c12d7ae1 fixes #847 2019-04-03 16:56:44 +02:00
Sebastian Stenzel
8e324ef0eb code quality [ci skip] 2019-03-27 09:08:18 +01:00
Sebastian Stenzel
29a0336bf4 code quality [ci skip] 2019-03-27 08:50:20 +01:00
Sebastian Stenzel
44fc6761e3 fixes #858 2019-03-19 15:02:48 +01:00
Armin Schrenk
a4ef082bc4 fixes #854 2019-03-14 11:12:25 +01:00
Tobias Hagemann
1272279b96 Merge branch 'master' into develop 2019-03-01 15:02:37 +01:00
40 changed files with 357 additions and 391 deletions

14
.idea/compiler.xml generated
View File

@@ -7,26 +7,26 @@
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<processorPath useClasspath="false">
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-compiler/2.20/dagger-compiler-2.20.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger/2.20/dagger-2.20.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-compiler/2.22.1/dagger-compiler-2.22.1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger/2.22.1/dagger-2.22.1.jar" />
<entry name="$MAVEN_REPOSITORY$/javax/inject/javax.inject/1/javax.inject-1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-producers/2.20/dagger-producers-2.20.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-producers/2.22.1/dagger-producers-2.22.1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/guava/guava/25.0-jre/guava-25.0-jre.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar" />
<entry name="$MAVEN_REPOSITORY$/org/checkerframework/checker-compat-qual/2.5.3/checker-compat-qual-2.5.3.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.1.3/error_prone_annotations-2.1.3.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.jar" />
<entry name="$MAVEN_REPOSITORY$/org/codehaus/mojo/animal-sniffer-annotations/1.14/animal-sniffer-annotations-1.14.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-spi/2.20/dagger-spi-2.20.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-spi/2.22.1/dagger-spi-2.22.1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/squareup/javapoet/1.11.1/javapoet-1.11.1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar" />
<entry name="$MAVEN_REPOSITORY$/com/squareup/javapoet/1.11.1/javapoet-1.11.1.jar" />
<entry name="$MAVEN_REPOSITORY$/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar" />
</processorPath>
<module name="commons" />
<module name="keychain" />
<module name="launcher" />
<module name="commons" />
<module name="ui" />
<module name="launcher" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel>

View File

@@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Cryptomator Linux" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
<module name="launcher" />
<option name="VM_PARAMETERS" value="-Djdk.gtk.version=2 -Duser.language=en -Dcryptomator.settingsPath=&quot;~/.config/Cryptomator/settings.json&quot; -Dcryptomator.ipcPortPath=&quot;~/.config/Cryptomator/ipcPort.bin&quot; -Dcryptomator.logDir=&quot;~/.local/share/Cryptomator/logs&quot; -Dcryptomator.mountPointsDir=&quot;~/.local/share/Cryptomator/mnt&quot; -Xss20m -Xmx512m" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

View File

@@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Cryptomator Windows" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
<module name="launcher" />
<option name="VM_PARAMETERS" value="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/AppData/Roaming/Cryptomator/settings.json&quot; -Dcryptomator.ipcPortPath=&quot;~/AppData/Roaming/Cryptomator/ipcPort.bin&quot; -Dcryptomator.logDir=&quot;~/AppData/Roaming/Cryptomator&quot; -Dcryptomator.keychainPath=&quot;~/AppData/Roaming/Cryptomator/keychain.json&quot; -Xss2m -Xmx512m" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

View File

@@ -2,14 +2,8 @@
<configuration default="false" name="Cryptomator macOS" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
<module name="launcher" />
<option name="VM_PARAMETERS" value="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/Library/Application Support/Cryptomator/settings.json&quot; -Dcryptomator.ipcPortPath=&quot;~/Library/Application Support/Cryptomator/ipcPort.bin&quot; -Dcryptomator.logDir=&quot;~/Library/Logs/Cryptomator&quot; -Dcryptomator.mountPointsDir=&quot;/Volumes/&quot;" />
<option name="WORKING_DIRECTORY" value="$MAVEN_REPOSITORY$" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.cryptomator.launcher.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<option name="VM_PARAMETERS" value="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/Library/Application Support/Cryptomator/settings.json&quot; -Dcryptomator.ipcPortPath=&quot;~/Library/Application Support/Cryptomator/ipcPort.bin&quot; -Dcryptomator.logDir=&quot;~/Library/Logs/Cryptomator&quot; -Dcryptomator.mountPointsDir=&quot;/Volumes/&quot; -Xss2m -Xmx512m" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<method v="2">
<option name="Make" enabled="true" />
</method>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.cryptomator</groupId>
<artifactId>main</artifactId>
<version>1.4.6</version>
<version>1.4.8</version>
</parent>
<artifactId>buildkit</artifactId>
<packaging>pom</packaging>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.cryptomator</groupId>
<artifactId>main</artifactId>
<version>1.4.6</version>
<version>1.4.8</version>
</parent>
<artifactId>commons</artifactId>
<name>Cryptomator Commons</name>

View File

@@ -80,6 +80,7 @@ public class SettingsJsonAdapter extends TypeAdapter<Settings> {
default:
LOG.warn("Unsupported vault setting found in JSON: " + name);
in.skipValue();
break;
}
}
in.endObject();

View File

@@ -8,6 +8,16 @@
*******************************************************************************/
package org.cryptomator.common.settings;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.cryptomator.common.Environment;
import org.cryptomator.common.LazyInitializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -16,8 +26,6 @@ import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
@@ -30,20 +38,6 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Stream;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.Environment;
import org.cryptomator.common.LazyInitializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@Singleton
public class SettingsProvider implements Provider<Settings> {

View File

@@ -76,6 +76,7 @@ class VaultSettingsJsonAdapter {
default:
LOG.warn("Unsupported vault setting found in JSON: " + name);
in.skipValue();
break;
}
}
in.endObject();

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.cryptomator</groupId>
<artifactId>main</artifactId>
<version>1.4.6</version>
<version>1.4.8</version>
</parent>
<artifactId>keychain</artifactId>
<name>System Keychain Access</name>

View File

@@ -15,19 +15,17 @@ import org.junit.jupiter.api.io.TempDir;
import org.mockito.Mockito;
import org.mockito.stubbing.Answer;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Optional;
import java.util.stream.Stream;
public class WindowsProtectedKeychainAccessTest {
private Path keychainPath;
private WindowsProtectedKeychainAccess keychain;
@BeforeEach
public void setup(@TempDir Path tempDir) throws IOException {
keychainPath = tempDir.resolve("keychainfile.tmp");
public void setup(@TempDir Path tempDir) {
Path keychainPath = tempDir.resolve("keychainfile.tmp");
Environment env = Mockito.mock(Environment.class);
Mockito.when(env.getKeychainPath()).thenReturn(Stream.of(keychainPath));
WinFunctions winFunctions = Mockito.mock(WinFunctions.class);
@@ -40,7 +38,7 @@ public class WindowsProtectedKeychainAccessTest {
}
@Test
public void testStoreAndLoad() throws IOException {
public void testStoreAndLoad() {
String storedPw1 = "topSecret";
String storedPw2 = "bottomSecret";
keychain.storePassphrase("myPassword", storedPw1);

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.cryptomator</groupId>
<artifactId>main</artifactId>
<version>1.4.6</version>
<version>1.4.8</version>
</parent>
<artifactId>launcher</artifactId>
<name>Cryptomator Launcher</name>

View File

@@ -6,7 +6,6 @@
package org.cryptomator.launcher;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.stage.Stage;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.logging.DebugMode;
@@ -20,7 +19,6 @@ import javax.inject.Named;
import javax.inject.Singleton;
import java.io.IOException;
import java.util.Optional;
import java.util.concurrent.CountDownLatch;
@Singleton
public class Cryptomator {
@@ -56,14 +54,35 @@ public class Cryptomator {
private int run(String[] args) {
logConfig.init();
LOG.info("Starting Cryptomator {} on {} {} ({})", applicationVersion.orElse("SNAPSHOT"), SystemUtils.OS_NAME, SystemUtils.OS_VERSION, SystemUtils.OS_ARCH);
debugMode.initialize();
if (sendArgsToRunningInstance(args)) {
LOG.info("Found running application instance. Shutting down...");
return 0;
/*
* Attempts to create an IPC connection to a running Cryptomator instance and sends it the given args.
* If no external process could be reached, the args will be handled by the loopback IPC endpoint.
*/
try (IpcFactory.IpcEndpoint endpoint = ipcFactory.create()) {
endpoint.getRemote().handleLaunchArgs(args); // if we are the server, getRemote() returns self.
if (endpoint.isConnectedToRemote()) {
LOG.info("Found running application instance. Shutting down...");
return 2;
} else {
LOG.debug("Did not find running application instance. Launching GUI...");
return runGuiApplication();
}
} catch (IOException e) {
LOG.error("Failed to initiate inter-process communication.", e);
return runGuiApplication();
}
}
/**
* Launches the JavaFX application and waits until shutdown is requested.
* @return Nonzero exit code in case of an error.
*/
private int runGuiApplication() {
try {
runGuiApplication();
CleanShutdownPerformer.registerShutdownHook();
Application.launch(MainApp.class);
LOG.info("Shutting down...");
return 0;
} catch (Throwable e) {
@@ -72,37 +91,6 @@ public class Cryptomator {
}
}
/**
* Attempts to create an IPC connection to a running Cryptomator instance and sends it the given args.
* If no external process could be reached, the args will be handled by the loopback IPC endpoint.
*
* @param args Arguments to send to the instance (if possible)
* @return <code>true</code> if a different process could be reached, <code>false</code> otherwise.
*/
private boolean sendArgsToRunningInstance(String[] args) {
try (IpcFactory.IpcEndpoint endpoint = ipcFactory.create()) {
endpoint.getRemote().handleLaunchArgs(args); // if we are the server, getRemote() returns self.
return endpoint.isConnectedToRemote();
} catch (IOException e) {
LOG.error("Failed to initiate inter-process communication.", e);
return false;
}
}
/**
* Launches the JavaFX application and waits until shutdown is requested.
*/
private void runGuiApplication() {
debugMode.initialize();
CleanShutdownPerformer.registerShutdownHook();
Application.launch(MainApp.class);
// Platform.startup(() -> {
// assert Platform.isFxApplicationThread();
// FxApplication app = CRYPTOMATOR_COMPONENT.fxApplicationComponent().application();
// app.start();
// });
}
// We need a separate FX Application class, until we can use the module system. See https://stackoverflow.com/q/54756176/4014509
public static class MainApp extends Application {

View File

@@ -2,13 +2,9 @@ package org.cryptomator.launcher;
import dagger.Component;
import org.cryptomator.common.CommonsModule;
import org.cryptomator.common.Environment;
import org.cryptomator.logging.DebugMode;
import org.cryptomator.logging.LoggerModule;
import javax.inject.Named;
import javax.inject.Singleton;
import java.util.Optional;
@Singleton
@Component(modules = {CryptomatorModule.class, CommonsModule.class, LoggerModule.class})

View File

@@ -6,9 +6,15 @@
*******************************************************************************/
package org.cryptomator.launcher;
import org.cryptomator.ui.model.AppLaunchEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import java.awt.Desktop;
import java.awt.desktop.OpenFilesEvent;
import java.awt.desktop.QuitStrategy;
import java.io.File;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
@@ -17,17 +23,8 @@ import java.nio.file.Path;
import java.util.Arrays;
import java.util.Objects;
import java.util.concurrent.BlockingQueue;
import java.util.function.Function;
import java.util.stream.Stream;
import org.cryptomator.ui.model.AppLaunchEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
@Singleton
class FileOpenRequestHandler {

View File

@@ -10,7 +10,6 @@ import dagger.Subcomponent;
import javafx.application.Application;
import javafx.stage.Stage;
import org.cryptomator.common.FxApplicationScoped;
import org.cryptomator.logging.DebugMode;
import org.cryptomator.ui.controllers.ViewControllerLoader;
import javax.inject.Named;

View File

@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.cryptomator</groupId>
<artifactId>main</artifactId>
<version>1.4.6</version>
<version>1.4.8</version>
<packaging>pom</packaging>
<name>Cryptomator</name>
@@ -25,29 +25,29 @@
<!-- dependency versions -->
<cryptomator.cryptolib.version>1.2.1</cryptomator.cryptolib.version>
<cryptomator.cryptofs.version>1.7.0</cryptomator.cryptofs.version>
<cryptomator.cryptofs.version>1.8.1</cryptomator.cryptofs.version>
<cryptomator.jni.version>2.0.0</cryptomator.jni.version>
<cryptomator.fuse.version>1.1.1</cryptomator.fuse.version>
<cryptomator.dokany.version>1.1.3</cryptomator.dokany.version>
<cryptomator.fuse.version>1.1.2</cryptomator.fuse.version>
<cryptomator.dokany.version>1.1.7</cryptomator.dokany.version>
<cryptomator.webdav.version>1.0.9</cryptomator.webdav.version>
<javafx.version>11.0.2</javafx.version>
<javafx.version>12</javafx.version>
<commons-io.version>2.6</commons-io.version>
<commons-lang3.version>3.8.1</commons-lang3.version>
<easybind.version>1.0.3</easybind.version>
<guava.version>27.0-jre</guava.version>
<dagger.version>2.20</dagger.version>
<guava.version>27.1-jre</guava.version>
<dagger.version>2.22.1</dagger.version>
<gson.version>2.8.5</gson.version>
<slf4j.version>1.7.25</slf4j.version>
<slf4j.version>1.7.26</slf4j.version>
<logback.version>1.2.3</logback.version>
<junit.jupiter.version>5.4.0</junit.jupiter.version>
<mockito.version>2.24.0</mockito.version>
<hamcrest.version>1.3</hamcrest.version>
<junit.jupiter.version>5.4.2</junit.jupiter.version>
<mockito.version>2.27.0</mockito.version>
<hamcrest.version>2.1</hamcrest.version>
</properties>
<repositories>
@@ -212,7 +212,7 @@
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<artifactId>hamcrest</artifactId>
<version>${hamcrest.version}</version>
</dependency>
<dependency>
@@ -236,7 +236,7 @@
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<artifactId>hamcrest</artifactId>
<scope>test</scope>
</dependency>
<dependency>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.cryptomator</groupId>
<artifactId>main</artifactId>
<version>1.4.6</version>
<version>1.4.8</version>
</parent>
<artifactId>ui</artifactId>
<name>Cryptomator GUI</name>

View File

@@ -14,7 +14,6 @@ import javafx.beans.binding.Binding;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.FxApplicationScoped;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.SettingsProvider;
import org.cryptomator.frontend.webdav.WebDavServer;
import org.cryptomator.keychain.KeychainModule;
import org.cryptomator.ui.controllers.ViewControllerModule;

View File

@@ -9,27 +9,9 @@
*******************************************************************************/
package org.cryptomator.ui.controllers;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.Objects;
import java.util.Optional;
import javax.inject.Inject;
import javafx.beans.Observable;
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException;
import org.cryptomator.ui.controls.SecPasswordField;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.ui.util.PasswordStrengthUtil;
import org.fxmisc.easybind.EasyBind;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.Observable;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.event.ActionEvent;
@@ -41,6 +23,21 @@ import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Region;
import javafx.scene.text.Text;
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException;
import org.cryptomator.ui.controls.SecPasswordField;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.ui.util.PasswordStrengthUtil;
import org.fxmisc.easybind.EasyBind;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.Objects;
import java.util.Optional;
public class ChangePasswordController implements ViewController {
@@ -113,7 +110,7 @@ public class ChangePasswordController implements ViewController {
passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription));
}
private void passwordsChanged(Observable observable) {
private void passwordsChanged(@SuppressWarnings("unused") Observable observable) {
boolean oldPasswordEmpty = oldPasswordField.getCharacters().length() == 0;
boolean newPasswordEmpty = newPasswordField.getCharacters().length() == 0;
boolean passwordsEqual = newPasswordField.getCharacters().equals(retypePasswordField.getCharacters());

View File

@@ -9,16 +9,17 @@
******************************************************************************/
package org.cryptomator.ui.controllers;
import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.util.Objects;
import java.util.Optional;
import javax.inject.Inject;
import javafx.application.Platform;
import javafx.beans.Observable;
import javafx.beans.property.IntegerProperty;
import javafx.beans.value.ObservableIntegerValue;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Region;
import org.cryptomator.ui.controls.SecPasswordField;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
@@ -27,17 +28,11 @@ import org.fxmisc.easybind.EasyBind;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javafx.application.Platform;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Region;
import javax.inject.Inject;
import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.util.Objects;
import java.util.Optional;
public class InitializeController implements ViewController {
@@ -101,7 +96,7 @@ public class InitializeController implements ViewController {
passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription));
}
private void passwordsChanged(Observable observable) {
private void passwordsChanged(@SuppressWarnings("unused") Observable observable) {
boolean passwordsEmpty = passwordField.getCharacters().length() == 0;
boolean passwordsEqual = passwordField.getCharacters().equals(retypePasswordField.getCharacters());
okButton.setDisable(passwordsEmpty || !passwordsEqual);

View File

@@ -20,7 +20,6 @@ import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.geometry.Side;
import javafx.scene.Parent;
@@ -52,11 +51,11 @@ import org.cryptomator.ui.controls.DirectoryListCell;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.AppLaunchEvent;
import org.cryptomator.ui.model.AutoUnlocker;
import org.cryptomator.ui.model.upgrade.UpgradeStrategies;
import org.cryptomator.ui.model.upgrade.UpgradeStrategy;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.ui.model.VaultFactory;
import org.cryptomator.ui.model.VaultList;
import org.cryptomator.ui.model.upgrade.UpgradeStrategies;
import org.cryptomator.ui.model.upgrade.UpgradeStrategy;
import org.cryptomator.ui.util.DialogBuilderUtil;
import org.cryptomator.ui.util.Tasks;
import org.fxmisc.easybind.EasyBind;
@@ -220,12 +219,12 @@ public class MainController implements ViewController {
private void gracefulShutdown() {
vaults.filtered(Vault.NOT_LOCKED).forEach(Vault::prepareForShutdown);
if (!vaults.filtered(Vault.NOT_LOCKED).isEmpty()) {
mainWindow.show(); // to keep the application open
ButtonType tryAgainButtonType = new ButtonType(localization.getString("main.gracefulShutdown.button.tryAgain"));
ButtonType forceShutdownButtonType = new ButtonType(localization.getString("main.gracefulShutdown.button.forceShutdown"));
Alert gracefulShutdownDialog = DialogBuilderUtil.buildGracefulShutdownDialog(
localization.getString("main.gracefulShutdown.dialog.title"), localization.getString("main.gracefulShutdown.dialog.header"), localization.getString("main.gracefulShutdown.dialog.content"),
forceShutdownButtonType, ButtonType.CANCEL, forceShutdownButtonType, tryAgainButtonType);
Optional<ButtonType> choice = gracefulShutdownDialog.showAndWait();
choice.ifPresent(btnType -> {
if (tryAgainButtonType.equals(btnType)) {
@@ -233,7 +232,11 @@ public class MainController implements ViewController {
} else if (forceShutdownButtonType.equals(btnType)) {
Platform.runLater(Platform::exit);
} else {
return;
if (!vaults.filtered(Vault.NOT_LOCKED).isEmpty()) {
showUnlockedView(vaults.get(0), false); //if there are still unlocked vaults, show one of them
} else {
showUnlockView(UnlockController.State.UNLOCKING); //otherwise show any vault
}
}
});
} else {
@@ -271,7 +274,7 @@ public class MainController implements ViewController {
// ****************************************
@FXML
private void didClickAddVault(ActionEvent event) {
private void didClickAddVault() {
if (addVaultContextMenu.isShowing()) {
addVaultContextMenu.hide();
} else {
@@ -280,7 +283,7 @@ public class MainController implements ViewController {
}
@FXML
private void didClickCreateNewVault(ActionEvent event) {
private void didClickCreateNewVault() {
final FileChooser fileChooser = new FileChooser();
final File file = fileChooser.showSaveDialog(mainWindow);
if (file == null) {
@@ -313,7 +316,7 @@ public class MainController implements ViewController {
}
@FXML
private void didClickAddExistingVaults(ActionEvent event) {
private void didClickAddExistingVaults() {
final FileChooser fileChooser = new FileChooser();
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Cryptomator Masterkey", "*.cryptomator"));
final List<File> files = fileChooser.showOpenMultipleDialog(mainWindow);
@@ -356,7 +359,7 @@ public class MainController implements ViewController {
}
@FXML
private void didClickRemoveSelectedEntry(ActionEvent e) {
private void didClickRemoveSelectedEntry() {
Alert confirmDialog = DialogBuilderUtil.buildConfirmationDialog( //
localization.getString("main.directoryList.remove.confirmation.title"), //
localization.getString("main.directoryList.remove.confirmation.header"), //
@@ -375,12 +378,12 @@ public class MainController implements ViewController {
}
@FXML
private void didClickChangePassword(ActionEvent e) {
private void didClickChangePassword() {
showChangePasswordView();
}
@FXML
private void didClickShowSettings(ActionEvent e) {
private void didClickShowSettings() {
toggleShowSettings();
}

View File

@@ -130,7 +130,7 @@ public class SettingsController implements ViewController {
}
@FXML
private void changePort(ActionEvent evt) {
private void changePort() {
assert isPortValid() : "Button must be disabled, if port is invalid.";
try {
int port = Integer.parseInt(portField.getText());
@@ -143,11 +143,8 @@ public class SettingsController implements ViewController {
private boolean isPortValid() {
try {
int port = Integer.parseInt(portField.getText());
if (port == 0 || port >= Settings.MIN_PORT && port <= Settings.MAX_PORT) {
return true;
} else {
return false;
}
return port == 0 // choose port automatically
|| port >= Settings.MIN_PORT && port <= Settings.MAX_PORT; // port within range
} catch (NumberFormatException e) {
return false;
}
@@ -159,7 +156,7 @@ public class SettingsController implements ViewController {
}
}
private void setVisibilityGvfsElements(Observable obs, Object oldValue, Object newValue) {
private void setVisibilityGvfsElements(@SuppressWarnings("unused") Observable obs, @SuppressWarnings("unused")Object oldValue, Object newValue) {
prefGvfsSchemeLabel.setVisible(SystemUtils.IS_OS_LINUX && ((VolumeImpl) newValue).getDisplayName().equals("WebDAV"));
prefGvfsScheme.setVisible(SystemUtils.IS_OS_LINUX && ((VolumeImpl) newValue).getDisplayName().equals("WebDAV"));
}

View File

@@ -13,7 +13,6 @@ import com.google.common.base.Strings;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Parent;
import javafx.scene.control.Alert;
@@ -287,7 +286,7 @@ public class UnlockController implements ViewController {
// ****************************************
@FXML
public void didClickDownloadsLink(ActionEvent event) {
public void didClickDownloadsLink() {
app.getHostServices().showDocument("https://cryptomator.org/downloads/#allVersions");
}
@@ -296,7 +295,7 @@ public class UnlockController implements ViewController {
// ****************************************
@FXML
private void didClickAdvancedOptionsButton(ActionEvent event) {
private void didClickAdvancedOptionsButton() {
messageText.setText(null);
advancedOptions.setVisible(!advancedOptions.isVisible());
if (advancedOptions.isVisible()) {
@@ -312,7 +311,7 @@ public class UnlockController implements ViewController {
}
}
private void mountNameDidChange(ObservableValue<? extends String> property, String oldValue, String newValue) {
private void mountNameDidChange(@SuppressWarnings("unused") ObservableValue<? extends String> property, @SuppressWarnings("unused")String oldValue, String newValue) {
// newValue is guaranteed to be a-z0-9_, see #filterAlphanumericKeyEvents
if (newValue.isEmpty()) {
mountName.setText(vault.getMountName());
@@ -321,7 +320,8 @@ public class UnlockController implements ViewController {
}
}
public void didClickChooseCustomMountPoint(ActionEvent actionEvent) {
@FXML
public void didClickChooseCustomMountPoint() {
DirectoryChooser dirChooser = new DirectoryChooser();
File file = dirChooser.showDialog(mainWindow);
if (file != null) {
@@ -372,7 +372,7 @@ public class UnlockController implements ViewController {
}
}
private void winDriveLetterDidChange(ObservableValue<? extends Character> property, Character oldValue, Character newValue) {
private void winDriveLetterDidChange(@SuppressWarnings("unused") ObservableValue<? extends Character> property, @SuppressWarnings("unused") Character oldValue, Character newValue) {
vault.setWinDriveLetter(newValue);
}
@@ -396,7 +396,7 @@ public class UnlockController implements ViewController {
// ****************************************
@FXML
private void didClickSavePasswordCheckbox(ActionEvent event) {
private void didClickSavePasswordCheckbox() {
if (!savePassword.isSelected() && hasStoredPassword()) {
Alert confirmDialog = DialogBuilderUtil.buildConfirmationDialog( //
localization.getString("unlock.savePassword.delete.confirmation.title"), //
@@ -427,7 +427,7 @@ public class UnlockController implements ViewController {
// ****************************************
@FXML
private void didClickUnlockButton(ActionEvent event) {
private void didClickUnlockButton() {
advancedOptions.setDisable(true);
advancedOptions.setVisible(false);
advancedOptionsButton.setText(localization.getString("unlock.button.advancedOptions.show"));
@@ -441,9 +441,10 @@ public class UnlockController implements ViewController {
keychainAccess.get().storePassphrase(vault.getId(), password);
}
}).onSuccess(() -> {
messageText.setText(null);
messageText.setText("");
downloadsPageLink.setVisible(false);
listener.ifPresent(lstnr -> lstnr.didUnlock(vault));
passwordField.swipe();
}).onError(InvalidPassphraseException.class, e -> {
messageText.setText(localization.getString("unlock.errorMessage.wrongPassword"));
passwordField.selectAll();
@@ -473,9 +474,6 @@ public class UnlockController implements ViewController {
LOG.error("Unlock failed for technical reasons.", e);
messageText.setText(localization.getString("unlock.errorMessage.unlockFailed"));
}).andFinally(() -> {
if (!savePassword.isSelected()) {
passwordField.swipe();
}
advancedOptions.setDisable(false);
progressIndicator.setVisible(false);
progressText.setText(null);

View File

@@ -2,16 +2,12 @@
* Copyright (c) 2014, 2017 Sebastian Stenzel
* All rights reserved.
* This program and the accompanying materials are made available under the terms of the accompanying LICENSE file.
*
*
* Contributors:
* Sebastian Stenzel - initial API and implementation
******************************************************************************/
package org.cryptomator.ui.controllers;
import javax.inject.Inject;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
@@ -42,6 +38,10 @@ import org.fxmisc.easybind.EasyBind;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import static java.lang.String.format;
public class UnlockedController implements ViewController {
@@ -49,7 +49,7 @@ public class UnlockedController implements ViewController {
private static final Logger LOG = LoggerFactory.getLogger(UnlockedController.class);
private static final int IO_SAMPLING_STEPS = 100;
private static final double IO_SAMPLING_INTERVAL = 0.25;
private static final double IO_SAMPLING_INTERVAL = 0.5;
private final Localization localization;
private final ExecutorService executor;
@@ -103,7 +103,7 @@ public class UnlockedController implements ViewController {
}
@FXML
private void didClickLockVault(ActionEvent event) {
private void didClickLockVault() {
regularLockVault(this::lockVaultSucceeded);
}
@@ -156,7 +156,7 @@ public class UnlockedController implements ViewController {
}
@FXML
private void didClickMoreOptions(ActionEvent event) {
private void didClickMoreOptions() {
if (moreOptionsMenu.isShowing()) {
moreOptionsMenu.hide();
} else {
@@ -166,7 +166,7 @@ public class UnlockedController implements ViewController {
}
@FXML
private void didClickRevealVault(ActionEvent event) {
private void didClickRevealVault() {
revealVault(vault.get());
}
@@ -211,43 +211,42 @@ public class UnlockedController implements ViewController {
private class IoSamplingAnimationHandler implements EventHandler<ActionEvent> {
private static final double BYTES_TO_MEGABYTES_FACTOR = 1.0 / IO_SAMPLING_INTERVAL / 1024.0 / 1024.0;
private static final double SMOOTHING_FACTOR = 0.3;
private static final long EFFECTIVELY_ZERO = 100000; // 100kb
private final Series<Number, Number> decryptedBytes;
private final Series<Number, Number> encryptedBytes;
private int step = 0;
private long oldDecBytes = 0;
private long oldEncBytes = 0;
public IoSamplingAnimationHandler(Series<Number, Number> decryptedBytes, Series<Number, Number> encryptedBytes) {
this.decryptedBytes = decryptedBytes;
this.encryptedBytes = encryptedBytes;
// initialize data once and change value of datapoints later:
for (int i = 0; i < IO_SAMPLING_STEPS; i++) {
decryptedBytes.getData().add(new Data<>(i, 0));
encryptedBytes.getData().add(new Data<>(i, 0));
}
xAxis.setLowerBound(0);
xAxis.setUpperBound(IO_SAMPLING_STEPS);
}
@Override
public void handle(ActionEvent event) {
step++;
// move all values one step:
for (int i = 0; i < IO_SAMPLING_STEPS - 1; i++) {
int j = i + 1;
Number tmp = decryptedBytes.getData().get(j).getYValue();
decryptedBytes.getData().get(i).setYValue(tmp);
tmp = encryptedBytes.getData().get(j).getYValue();
encryptedBytes.getData().get(i).setYValue(tmp);
}
// add latest value:
final long decBytes = vault.get().pollBytesRead();
final double smoothedDecBytes = oldDecBytes + SMOOTHING_FACTOR * (decBytes - oldDecBytes);
final double smoothedDecMb = smoothedDecBytes * BYTES_TO_MEGABYTES_FACTOR;
oldDecBytes = smoothedDecBytes > EFFECTIVELY_ZERO ? (long) smoothedDecBytes : 0l;
decryptedBytes.getData().add(new Data<Number, Number>(step, smoothedDecMb));
if (decryptedBytes.getData().size() > IO_SAMPLING_STEPS) {
decryptedBytes.getData().remove(0);
}
final double decMb = decBytes * BYTES_TO_MEGABYTES_FACTOR;
final long encBytes = vault.get().pollBytesWritten();
final double smoothedEncBytes = oldEncBytes + SMOOTHING_FACTOR * (encBytes - oldEncBytes);
final double smoothedEncMb = smoothedEncBytes * BYTES_TO_MEGABYTES_FACTOR;
oldEncBytes = smoothedEncBytes > EFFECTIVELY_ZERO ? (long) smoothedEncBytes : 0l;
encryptedBytes.getData().add(new Data<Number, Number>(step, smoothedEncMb));
if (encryptedBytes.getData().size() > IO_SAMPLING_STEPS) {
encryptedBytes.getData().remove(0);
}
xAxis.setLowerBound(step - IO_SAMPLING_STEPS);
xAxis.setUpperBound(step);
final double encMb = encBytes * BYTES_TO_MEGABYTES_FACTOR;
decryptedBytes.getData().get(IO_SAMPLING_STEPS - 1).setYValue(decMb);
encryptedBytes.getData().get(IO_SAMPLING_STEPS - 1).setYValue(encMb);
}
}
@@ -269,6 +268,7 @@ public class UnlockedController implements ViewController {
@FunctionalInterface
interface LockListener {
void didLock(UnlockedController ctrl);
}

View File

@@ -16,7 +16,6 @@ import javax.inject.Inject;
import java.io.IOException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.DirectoryStream;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.NotDirectoryException;
import java.nio.file.Path;

View File

@@ -18,7 +18,6 @@ import javafx.beans.property.SimpleObjectProperty;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.LazyInitializer;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.cryptofs.CryptoFileSystem;
import org.cryptomator.cryptofs.CryptoFileSystemProperties;
@@ -52,9 +51,7 @@ public class Vault {
public static final Predicate<Vault> NOT_LOCKED = hasState(State.LOCKED).negate();
private static final Logger LOG = LoggerFactory.getLogger(Vault.class);
private static final String MASTERKEY_FILENAME = "masterkey.cryptomator";
private static final String LOCALHOST_ALIAS = "cryptomator-vault";
private final Settings settings;
private final VaultSettings vaultSettings;
private final Provider<Volume> volumeProvider;
private final AtomicReference<CryptoFileSystem> cryptoFileSystem = new AtomicReference<>();
@@ -67,8 +64,7 @@ public class Vault {
}
@Inject
Vault(Settings settings, VaultSettings vaultSettings, Provider<Volume> volumeProvider) {
this.settings = settings;
Vault(VaultSettings vaultSettings, Provider<Volume> volumeProvider) {
this.vaultSettings = vaultSettings;
this.volumeProvider = volumeProvider;
}

View File

@@ -7,22 +7,17 @@
Contributors:
Sebastian Stenzel - initial API and implementation
-->
<?import java.net.URL?>
<?import java.lang.String?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.chart.LineChart?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.control.ContextMenu?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.ToggleButton?>
<?import javafx.scene.control.ContextMenu?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>
<VBox fx:controller="org.cryptomator.ui.controllers.UnlockedController" fx:id="root" prefWidth="400.0" prefHeight="400.0" spacing="6.0" xmlns:fx="http://javafx.com/fxml" cacheShape="true" cache="true">
<fx:define>

View File

@@ -116,11 +116,11 @@ main.gracefulShutdown.dialog.content = Jeden nebo více trezorů je stále v pou
main.gracefulShutdown.button.tryAgain = Zkusit znovu
main.gracefulShutdown.button.forceShutdown = Vynutit vypnutí
unlock.pendingMessage.unlocking = Odemykání trezoru…
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory
ctrl.secPasswordField.nonPrintableChars = Password contains control characters.\nRecommendation\: Remove them to ensure compatibility with other clients.
ctrl.secPasswordField.capsLocked = Caps Lock is activated.
unlock.failedDialog.title = Odemknutí se nezdařilo
unlock.failedDialog.header = Odemknutí se nezdařilo
unlock.failedDialog.content.mountPathNonExisting = Přípojný bod neexistuje.
unlock.failedDialog.content.mountPathNotEmpty = Přípojný bod není prázdný.
unlock.label.useReadOnlyMode = Pouze pro čtení
unlock.label.chooseMountPath = Zvolte prázdnou složku
ctrl.secPasswordField.nonPrintableChars = Heslo obsahuje řídící znaky.\nDoporučení\: Odeberete je kvůli kompatibilitě s ostatními klienty.
ctrl.secPasswordField.capsLocked = Je zapnutá klávesa Caps Lock.

View File

@@ -97,7 +97,7 @@ settings.webdav.port.label = WebDAV-Port
settings.webdav.port.prompt = 0 \= automatische Auswahl
settings.webdav.port.apply = Anwenden
settings.webdav.prefGvfsScheme.label = WebDAV URL Schema
settings.volume.label = Laufwerkseinbindung *
settings.volume.label = Laufwerkseinbindung
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Der Tresor wurde erfolgreich erstellt.

View File

@@ -4,7 +4,6 @@ main.emptyListInstructions = Haga clic aquí para añadir una caja fuerte
# should it be imperative?
main.directoryList.contextMenu.remove = Eliminar de la lista
main.directoryList.contextMenu.changePassword = Cambiar la contraseña
# Fuzzy
main.addDirectory.contextMenu.new = Crear una nueva caja fuerte
main.addDirectory.contextMenu.open = Abrir una caja fuerte existente
# welcome.fxml
@@ -100,7 +99,7 @@ settings.webdav.port.label = Puerto WebDAV
settings.webdav.port.prompt = 0 \= Elige automáticamente
settings.webdav.port.apply = Aplicar
settings.webdav.prefGvfsScheme.label = Esquema de WebDAV
settings.volume.label = Método de montaje *
settings.volume.label = Método de montaje
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = La caja fuerte fue creada exitosamente.
@@ -117,11 +116,11 @@ main.gracefulShutdown.dialog.content = Una o más cajas fuertes están siendo ut
main.gracefulShutdown.button.tryAgain = Intente de nuevo
main.gracefulShutdown.button.forceShutdown = Forzar apagado
unlock.pendingMessage.unlocking = Desbloqueando la caja fuerte...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
ctrl.secPasswordField.nonPrintableChars = Password contains control characters.\nRecommendation\: Remove them to ensure compatibility with other clients.
ctrl.secPasswordField.capsLocked = Caps Lock is activated.
unlock.failedDialog.title = Falló el desbloqueo
unlock.failedDialog.header = Falló el desbloqueo
unlock.failedDialog.content.mountPathNonExisting = El punto de montaje no existe.
unlock.failedDialog.content.mountPathNotEmpty = El punto de montaje no está vacío.
unlock.label.useReadOnlyMode = Sólo lectura
unlock.label.chooseMountPath = Elija un directorio vacío...
ctrl.secPasswordField.nonPrintableChars = La contraseña contiene caracteres de control.\nRecomendación\: elimínelos para asegurar la compatibilidad con otros clientes.
ctrl.secPasswordField.capsLocked = Las mayúsculas están activadas.

View File

@@ -97,7 +97,7 @@ settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Scelta automatica
settings.webdav.port.apply = Applica
settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode *
settings.volume.label = Mount-Methode
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vaul creato con successo.

View File

@@ -91,13 +91,13 @@ unlock.errorMessage.unlockFailed = 施錠に失敗しました。詳細をログ
upgrade.version5toX.title = 金庫のバージョンをアップグレード
upgrade.version5toX.msg = この金庫を新しいバージョンに移行する必要があります。\n進行する前に同期が完了していることをご確認ください。
main.createVault.nonEmptyDir.title = 金庫の作成が失敗しました
main.createVault.nonEmptyDir.header = 空ではないディレクトリが選択されました
main.createVault.nonEmptyDir.content = 選択されたディレクトリ既にファイルを含んでいます(隠れている可能性があります)。金庫は空のディレクトのみに作れます。
main.createVault.nonEmptyDir.header = 選択したディレクトリが空ではありません
main.createVault.nonEmptyDir.content = 選択たディレクトリには、既にファイルがあります (非表示になっている可能性があります)。金庫は空のディレクトリにのみ作成可能です。
settings.webdav.port.label = WebDAV ポート
settings.webdav.port.prompt = 0 \= 自動的に選択
settings.webdav.port.apply = 適用
settings.webdav.prefGvfsScheme.label = WebDAV スキーム
settings.volume.label = マウント方法 *
settings.volume.label = マウント方法
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = 金庫が正常に作成されました。
@@ -106,19 +106,19 @@ unlock.successLabel.upgraded = Cryptomator が正常にアップグレードさ
unlock.label.useOwnMountPath = カスタムマウントポイントを使う
welcome.askForUpdateCheck.dialog.title = アップデート確認
welcome.askForUpdateCheck.dialog.header = 統合アップデート確認を有効にしますか?
welcome.askForUpdateCheck.dialog.content = おすすめ\: アップデート確認を有効にして、常にすべてのセキュリティパッチが適されたCryptomatorを維持してください。\n設定はいつでも変えられます。
welcome.askForUpdateCheck.dialog.content = 推奨事項\: 更新プログラムのチェックを有効にして、常にすべてのセキュリティ パッチが適された Cryptomator の最新バージョンを利用してください。\n\nこの設定はいつでも設定から変更できます。
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = 金庫のロックに失敗しました。
main.gracefulShutdown.dialog.header = 金庫が使用中です。
main.gracefulShutdown.dialog.content = 金庫が複数のプログラムによって使用されています。Cryptomatorが正しく終了できるようにプログラムを閉じてから、もう一度やり直してください。\nこれでうまくいかない場合、Cryptomatorを強制的に終了できますが、データの損失発生しかねないためお勧めできません。
main.gracefulShutdown.dialog.content = 金庫が複数のプログラムによって使用されています。Cryptomator を正常に終了できるようにプログラムを閉じてから、もう一度やり直してください。\n\n閉じなくても Cryptomator を強制的に終了することはできますが、データの損失発生しかねないためお勧めできません。
main.gracefulShutdown.button.tryAgain = やり直す
main.gracefulShutdown.button.forceShutdown = 強制終了
unlock.pendingMessage.unlocking = 金庫を施錠中...
unlock.failedDialog.title = 錠に失敗しました
unlock.failedDialog.header = 錠に失敗しました
unlock.pendingMessage.unlocking = 金庫を解錠しています...
unlock.failedDialog.title = 錠に失敗しました
unlock.failedDialog.header = 錠に失敗しました
unlock.failedDialog.content.mountPathNonExisting = マウントポイントが存在しません。
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
ctrl.secPasswordField.nonPrintableChars = Password contains control characters.\nRecommendation\: Remove them to ensure compatibility with other clients.
ctrl.secPasswordField.capsLocked = Caps Lock is activated.
unlock.failedDialog.content.mountPathNotEmpty = マウントポイントが空ではありません。
unlock.label.useReadOnlyMode = 読み取り専用
unlock.label.chooseMountPath = 空のディレクトリを選択...
ctrl.secPasswordField.nonPrintableChars = パスワードに制御文字が含まれています。\n推奨事項\: 他のクライアントとの互換性のために、制御文字は削除してください。
ctrl.secPasswordField.capsLocked = Caps Lock が有効です。

View File

@@ -97,7 +97,7 @@ settings.webdav.port.label = WebDAV 포트
settings.webdav.port.prompt = 0 \= 자동으로 선택
settings.webdav.port.apply = 적용
settings.webdav.prefGvfsScheme.label = WebDAV 스킴
settings.volume.label = 마운트-방법 *
settings.volume.label = 마운트-방법
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = 보관함이 성공적으로 생성되었습니다.
@@ -118,7 +118,7 @@ unlock.failedDialog.title = 잠금 해제 실패
unlock.failedDialog.header = 잠금 해제 실패
unlock.failedDialog.content.mountPathNonExisting = 마운트 지점이 존재하지 않습니다.
unlock.failedDialog.content.mountPathNotEmpty = 마운트 지점이 비어있지 않습니다.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
ctrl.secPasswordField.nonPrintableChars = Password contains control characters.\nRecommendation\: Remove them to ensure compatibility with other clients.
ctrl.secPasswordField.capsLocked = Caps Lock is activated.
unlock.label.useReadOnlyMode = 읽기 전용
unlock.label.chooseMountPath = 빈 디렉토리 선택
ctrl.secPasswordField.nonPrintableChars = 패스워드에 특수문자가 포함되어 있습니다.\n권장사항 \: 다른 클라이언트와의 호환성을 보증하기 위해 해당하는 문자를 제거하시기 바랍니다.
ctrl.secPasswordField.capsLocked = Caps Lock 키가 활성화 되어있습니다.

View File

@@ -13,7 +13,7 @@ initialize.label.password = Parole
initialize.label.retypePassword = Atkārto paroli
initialize.button.ok = Izveidot glabātuvi
initialize.messageLabel.alreadyInitialized = Glabātuve jau ir inicializēta
initialize.messageLabel.initializationFailed = Nevarēja inicializēt glabātuvi. Sīkākai informācijai skati žurnālu.
initialize.messageLabel.initializationFailed = Nevarēja inicializēt glabātuvi. Sīkāku informāciju skaties žurnālā.
# notfound.fxml
notfound.label = Nevar atrast glabātuvi. Vai tā ir pārvietota?
# upgrade.fxml
@@ -69,7 +69,7 @@ main.directoryList.remove.confirmation.title = Noņemt glabātuvi
main.directoryList.remove.confirmation.header = Vai tiešām vēlie noņemt šo glabātuvi?
main.directoryList.remove.confirmation.content = Glabātuve tiks noņemta tikai no saraksta. Lai to dzēstu pilnībā, lūdzu nodzēs to no datņu sistēmas.
upgrade.version3to4.msg = Šī glabātuve ir jāmigrē uz jaunāku formāta versiju. Sifrētie mapju nosaukumi tiks atjaunināti. Pirms palaišanas lūdzu pārliecinies, ka ir pabeigusies sinhronizācija.
upgrade.version3to4.err.io = Migrācija neizdevās dēļ I/O izņēmuma. Sīkākai informācijai skati žurnālu.
upgrade.version3to4.err.io = Migrācija neizdevās dēļ I/O izņēmuma. Sīkāku informāciju skaties žurnālā.
# upgrade.fxml
upgrade.confirmation.label = Jā, esmu pārliecinājies, ka sinhronizācija ir pabeigta.
unlock.label.savePassword = Saglabāt paroli
@@ -82,44 +82,44 @@ upgrade.version3dropBundleExtension.title = Glabātuves 3 versijas atjauninājum
upgrade.version3to4.title = Glabātuves versijas 3 uz 4 atjauninājums
upgrade.version4to5.title = Glabātuves versijas 4 uz 5 atjauninājums
upgrade.version4to5.msg = Šo glabātuvi nepieciešams migrēt uz jaunāku versiju.\nŠifrētās datnes tiks atjauninātas.\nPirms apstiprini, pārliecinies, ka ir beigusies sinhronizācija.\n\nPiezīme\: Visām datnēm modificēšanas datums tiks izmainīts uz šodienas datumu.
upgrade.version4to5.err.io = Migrācijas kļīda dēļ I/O izņēmuma. Sīkāku informāciju skaties žurnālā.
unlock.label.revealAfterMount = Reveal Drive
unlocked.lock.force.confirmation.title = Locking of %1$s failed
unlocked.lock.force.confirmation.header = Do you want to force locking?
unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost.
unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental)
unlock.errorMessage.unlockFailed = Unlock failed. See log file for details.
upgrade.version5toX.title = Vault Version Upgrade
upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding.
main.createVault.nonEmptyDir.title = Creating vault failed
main.createVault.nonEmptyDir.header = Chosen directory is not empty
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically
settings.webdav.port.apply = Apply
settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Preferred Volume Type
upgrade.version4to5.err.io = Migrācijas kļūda dēļ I/O izņēmuma. Sīkāku informāciju skaties žurnālā.
unlock.label.revealAfterMount = Atklāt disku
unlocked.lock.force.confirmation.title = %1$s aizslēgšana neizdevās
unlocked.lock.force.confirmation.header = Vai jūs vēlaties piespiest aizslēgšanu?
unlocked.lock.force.confirmation.content = Tas varētu notikt, jo citas programmas joprojām izmanto glabātuves datnes vai arī ir kādas citas problēmas.\n\nProgrammas, kuras turpina izmantot datnes var nedarboties korekti un dati, kas nav ierakstīti glabātuvē, var tikt pazaudēti.
unlock.label.unlockAfterStartup = Automātiski atslēgt pie startēšanas (eksperimentāls)
unlock.errorMessage.unlockFailed = Atslēgšana neizdevās. Sīkāku informāciju skaties žurnālā.
upgrade.version5toX.title = Glabātuves versijas atjaunināšana
upgrade.version5toX.msg = Šo glabātuvi nepieciešams migrēt uz jaunāku versiju.\nLūdzu pārliecinieties, ka ir pabeigts sinhronizācijas process.
main.createVault.nonEmptyDir.title = Glabātuves izveide neizdevās
main.createVault.nonEmptyDir.header = Izvēlētā mape nav tukša
main.createVault.nonEmptyDir.content = Izvēlētā mape jau satur datnes (iespējams paslēptas). Glabātuve var tikt izveidota tikai tukšā mapē.
settings.webdav.port.label = WebDAV ports
settings.webdav.port.prompt = 0 \= izvēlās automātiski
settings.webdav.port.apply = Pielietot
settings.webdav.prefGvfsScheme.label = WebDAV shēma
settings.volume.label = Vēlamais sējuma tips
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Vault was successfully upgraded.
unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
unlock.successLabel.vaultCreated = Glabātuve tika veiksmīgi izveidota.
unlock.successLabel.passwordChanged = Parole tika veiksmīgi nomainīta.
unlock.successLabel.upgraded = Glabātuve tika veiksmīgi atjaunināta.
unlock.label.useOwnMountPath = Izmantot citu montēšanas vietu
welcome.askForUpdateCheck.dialog.title = Atjauninājuma pārbaude
welcome.askForUpdateCheck.dialog.header = Ieslēgt integrēto atjauninājumu pārbaudi?
welcome.askForUpdateCheck.dialog.content = Rekomendācija\: Ieslēdziet atjauninājumu pārbaudi, lai vienmēr esiet drošs, ka instalēta jaunākā Cryptomator versija ar visiem drošības ielāpiem.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try Again
main.gracefulShutdown.button.forceShutdown = Force Shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
ctrl.secPasswordField.nonPrintableChars = Password contains control characters.\nRecommendation\: Remove them to ensure compatibility with other clients.
ctrl.secPasswordField.capsLocked = Caps Lock is activated.
main.gracefulShutdown.dialog.title = Glabātuve(s) aizslēgšana neizdevās
main.gracefulShutdown.dialog.header = Izmantotā(s) glabātuve(s)
main.gracefulShutdown.dialog.content = Vienu vai vairākas glabātuves joprojām izmanto citas programmas. Lūdzu, aizveriet tās, lai ļautu Cryptomator pareizi aizvērties, tad mēģiniet vēlreiz.\n\nJa tas nedarbojas, Cryptomator var piespiedu aizvērt, taču tas var izraisīt datu zudumu un nav ieteicams.
main.gracefulShutdown.button.tryAgain = Mēģini vēlreiz
main.gracefulShutdown.button.forceShutdown = Piespiest izslēgšanu
unlock.pendingMessage.unlocking = Atslēdz glabātuvi...
unlock.failedDialog.title = Atslēgšana neizdevās
unlock.failedDialog.header = Atslēgšana neizdevās
unlock.failedDialog.content.mountPathNonExisting = Montēšanas vieta neeksistē.
unlock.failedDialog.content.mountPathNotEmpty = Montēšanas vieta nav tukša.
unlock.label.useReadOnlyMode = Tikai lasīt
unlock.label.chooseMountPath = Izvēlieties tukšu mapi...
ctrl.secPasswordField.nonPrintableChars = Parole satur kontroles rakstzīmes.\nRekomentācija\: Noņemiet tās, lai nodrošinātu saderību ar citiem klientiem.
ctrl.secPasswordField.capsLocked = Caps Lock ir aktivizēts.

View File

@@ -97,7 +97,7 @@ settings.webdav.port.label = WebDAV Porta
settings.webdav.port.prompt = 0 \= Escolher automaticamente
settings.webdav.port.apply = Aplicar
settings.webdav.prefGvfsScheme.label = WebDAV Esquema
settings.volume.label = Método de Montagem *
settings.volume.label = Método de Montagem
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Cofre foi criado com sucesso.

View File

@@ -65,8 +65,8 @@ tray.infoMsg.msg.osx = Cryptomator всё ещё работает. Выйдит
initialize.messageLabel.passwordStrength.0 = Очень слабый
initialize.messageLabel.passwordStrength.1 = Слабый
initialize.messageLabel.passwordStrength.2 = Приемлемый
initialize.messageLabel.passwordStrength.3 = Стойкий
initialize.messageLabel.passwordStrength.4 = Очень стойкий
initialize.messageLabel.passwordStrength.3 = Сложный
initialize.messageLabel.passwordStrength.4 = Очень сложный
initialize.label.doNotForget = ВАЖНО\: Если вы забудете свой пароль, то восстановить данные будет невозможно.
main.directoryList.remove.confirmation.title = Удаление хранилища
main.directoryList.remove.confirmation.header = Вы действительно хотите удалить это хранилище?
@@ -104,7 +104,7 @@ settings.webdav.port.label = Порт WebDAV
settings.webdav.port.prompt = 0 \= автовыбор
settings.webdav.port.apply = Применить
settings.webdav.prefGvfsScheme.label = Схема WebDAV
settings.volume.label = Метод монтирования*
settings.volume.label = Метод монтирования
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Хранилище успешно создано.
@@ -120,12 +120,12 @@ main.gracefulShutdown.dialog.header = Используемые хранилищ
main.gracefulShutdown.dialog.content = Одно или несколько хранилищ всё ещё используются другими программами. Закройте их, чтобы Cryptomator мог корректно завершить работу, и повторите попытку.\n\nЕсли это не поможет, Cryptomator может завершить работу принудительно, но с риском потери данных, и потому это не рекомендуется.
main.gracefulShutdown.button.tryAgain = Попробовать снова
main.gracefulShutdown.button.forceShutdown = Принудительно завершить работу
unlock.pendingMessage.unlocking = Открываем хранилеще
unlock.pendingMessage.unlocking = Открываем хранилище...
unlock.failedDialog.title = Разблокировка не удалась
unlock.failedDialog.header = Разблокировка не удалась\n
unlock.failedDialog.content.mountPathNonExisting = Точка монтирования не существует
unlock.failedDialog.content.mountPathNotEmpty = Точка монтирования не пуста
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
ctrl.secPasswordField.nonPrintableChars = Password contains control characters.\nRecommendation\: Remove them to ensure compatibility with other clients.
ctrl.secPasswordField.capsLocked = Caps Lock is activated.
unlock.failedDialog.header = Разблокировка не удалась
unlock.failedDialog.content.mountPathNonExisting = Точка монтирования не существует.
unlock.failedDialog.content.mountPathNotEmpty = Точка монтирования не пуста.
unlock.label.useReadOnlyMode = Только для чтения
unlock.label.chooseMountPath = Выберите пустую папку...
ctrl.secPasswordField.nonPrintableChars = Пароль содержит управляющие символы.\nРекомендация\: Удалите их для совместимости с другими платформами.
ctrl.secPasswordField.capsLocked = Caps Lock включен.

View File

@@ -1,49 +1,49 @@
app.name = Cryptomator
# main.fxml
main.emptyListInstructions = Kasa eklemek için tıkla
main.emptyListInstructions = Kasa eklemek için buraya tıkla
main.directoryList.contextMenu.remove = Listeden sil
main.directoryList.contextMenu.changePassword = Şifreyi değiştir
main.addDirectory.contextMenu.new = Yeni bir kasa yarat
main.addDirectory.contextMenu.open = Var olan kasayı aç
main.directoryList.contextMenu.changePassword = Şifreyi Değiştir
main.addDirectory.contextMenu.new = Yeni Bir Kasa Oluştur
main.addDirectory.contextMenu.open = Var Olan Kasayı Aç
# welcome.fxml
welcome.checkForUpdates.label.currentlyChecking = Güncellemeler kontrol ediliyor...
welcome.newVersionMessage = Sürüm %1$s indirilebilir.\nŞu anki sürüm\: %2$s
# initialize.fxml
initialize.label.password = Şifre
initialize.label.retypePassword = Şifre (tekrar)
initialize.button.ok = Kasa oluştur
initialize.messageLabel.alreadyInitialized = Kasa çoktan başlatıldı
initialize.messageLabel.initializationFailed = Kasa başlatılamadı. Detaylar için log dosyasına bakın.
initialize.button.ok = Kasa Oluştur
initialize.messageLabel.alreadyInitialized = Kasa zaten başlatıldı
initialize.messageLabel.initializationFailed = Kasa başlatılamadı. Detaylar için günlük dosyasına bakın.
# notfound.fxml
notfound.label = Kasa bulunamadı. Yeri değişmiş olabilir mi ?
# upgrade.fxml
upgrade.button = Kasayı yükselt.
upgrade.button = Kasayı Yükselt
upgrade.version3dropBundleExtension.msg = Bu kasanın yeni formata geçirilmesi gerekmekte. "%1$s" ismi "%2$s" olarak değiştirilecek. Devam etmeden önce senkronizasyonun bittiğine emin olun.
upgrade.version3dropBundleExtension.err.alreadyExists = Otomatik format değiştirme sırasında hata. "%s" zaten bulunmakta.
upgrade.version3dropBundleExtension.err.alreadyExists = Otomatik taşıma sırasında hata oluştu. "%s" zaten bulunmakta.
# unlock.fxml
unlock.label.password = Şifre
unlock.label.mountName = Sürücü ismi
unlock.label.winDriveLetter = Sürücü konumu
unlock.label.mountName = Sürücü Adı
unlock.label.winDriveLetter = Sürücü Konumu
unlock.label.downloadsPageLink = Tüm Cryptomator sürümleri
unlock.label.advancedHeading = Gelişmiş seçenekler
unlock.button.unlock = Kasayı aç
unlock.button.advancedOptions.show = Daha fazla seçenek
unlock.button.advancedOptions.hide = Daha az seçenek
unlock.label.advancedHeading = Gelişmiş Seçenekler
unlock.button.unlock = Kasayı Aç
unlock.button.advancedOptions.show = Daha Fazla Seçenek
unlock.button.advancedOptions.hide = Daha Az Seçenek
unlock.choicebox.winDriveLetter.auto = Otomatik ata
unlock.errorMessage.wrongPassword = Yanlış şifre
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = Desteklenmeyen kasa. Bu kasa daha eski bir Cryptomator sürümü ile oluşturulmuş.
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = Desteklenmeyen kasa. Bu kasa daha yeni bir Cryptomator sürümü ile oluşturulmuş.
# change_password.fxml
changePassword.label.oldPassword = Eski şifre
changePassword.label.newPassword = Yeni şifre
changePassword.label.retypePassword = Yeni şifre (tekrar)
changePassword.label.oldPassword = Eski Şifre
changePassword.label.newPassword = Yeni Şifre
changePassword.label.retypePassword = Yeni Şifre (tekrar)
changePassword.label.downloadsPageLink = Tüm Cryptomator sürümleri
changePassword.button.change = Şifreyi değiştir
changePassword.button.change = Şifreyi Değiştir
changePassword.errorMessage.wrongPassword = Yanlış şifre
changePassword.errorMessage.decryptionFailed = Şifre çözme başarısız
# unlocked.fxml
unlocked.button.lock = Kasayı kilitle
unlocked.moreOptions.reveal = Sürücüyü göster
unlocked.button.lock = Kasayı Kilitle
unlocked.moreOptions.reveal = Sürücüyü Göster
unlocked.label.revealFailed = Komut başarısız
unlocked.label.unmountFailed = Sürücü çıkarma başarısız
unlocked.label.statsEncrypted = şifrelenmiş
@@ -55,7 +55,7 @@ settings.checkForUpdates.label = Güncellemeleri denetle
# tray icon
tray.menu.open = Aç
tray.menu.quit = Çıkış
tray.infoMsg.title = Hala çalışıyor
tray.infoMsg.title = Hala Çalışıyor
tray.infoMsg.msg = Cryptomator hala çalışıyor. Bildirim simgesi ile çıkış yapın.
tray.infoMsg.msg.osx = Cryptomator hala çalışıyor. Menü bar simgesi ile çıkış yapın.
initialize.messageLabel.passwordStrength.0 = Çok zayıf
@@ -68,57 +68,57 @@ main.directoryList.remove.confirmation.title = Kasayı Sil
main.directoryList.remove.confirmation.header = Kasayı silmek istediğinize emin misiniz ?
main.directoryList.remove.confirmation.content = Kasa yalnızca listeden silinecek. Tamamen silmek için dosya sisteminizden dosyaları elle siliniz.
upgrade.version3to4.msg = Bu kasanın yeni formata geçirilmesi gerekmekte. Şifreli klasör isimleri güncellenecek. Devam etmeden önce senkronizasyonun bittiğine emin olun.
upgrade.version3to4.err.io = Format değiştirme işlemi I/O Hatası dolayısı ile başarısız oldu. Detaylar için log dosyasına bakın
upgrade.version3to4.err.io = Format değiştirme işlemi G/Ç Hatası dolayısı ile başarısız oldu. Detaylar için günlük dosyasına bakın
# upgrade.fxml
upgrade.confirmation.label = Yes, I've made sure that synchronization has finished
unlock.label.savePassword = Save Password
unlock.errorMessage.unauthenticVersionMac = Could not authenticate version MAC.
unlock.savePassword.delete.confirmation.title = Delete Saved Password
unlock.savePassword.delete.confirmation.header = Do you really want to delete the saved password of this vault?
unlock.savePassword.delete.confirmation.content = The saved password of this vault will be immediately deleted from your system keychain. If you'd like to save your password again, you'd have to unlock your vault with the "Save Password" option enabled.
settings.debugMode.label = Debug Mode
upgrade.version3dropBundleExtension.title = Vault Version 3 Upgrade (Drop Bundle Extension)
upgrade.version3to4.title = Vault Version 3 to 4 Upgrade
upgrade.version4to5.title = Vault Version 4 to 5 Upgrade
upgrade.version4to5.msg = This vault needs to be migrated to a newer format.\nEncrypted files will be updated.\nPlease make sure synchronization has finished before proceeding.\n\nNote\: Modification date of all files will be changed to the current date/time in the process.
upgrade.version4to5.err.io = Migration failed due to an I/O Exception. See log file for details.
unlock.label.revealAfterMount = Reveal Drive
unlocked.lock.force.confirmation.title = Locking of %1$s failed
unlocked.lock.force.confirmation.header = Do you want to force locking?
unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost.
unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental)
unlock.errorMessage.unlockFailed = Unlock failed. See log file for details.
upgrade.version5toX.title = Vault Version Upgrade
upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding.
main.createVault.nonEmptyDir.title = Creating vault failed
main.createVault.nonEmptyDir.header = Chosen directory is not empty
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically
settings.webdav.port.apply = Apply
settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Preferred Volume Type
upgrade.confirmation.label = Evet, senkronizasyonun bittiğine eminim
unlock.label.savePassword = Şifreyi Kaydet
unlock.errorMessage.unauthenticVersionMac = MAC versiyonu doğrulanamadı
unlock.savePassword.delete.confirmation.title = Kayıtlı Şifreyi Sil
unlock.savePassword.delete.confirmation.header = Bu kasanın şifresini gerçekten silmek istiyor musun?
unlock.savePassword.delete.confirmation.content = Bu kasa için kayıtlı şifre sisteminizden silindi. Eğer şifrenizi tekrar kaydetmek isterseniz, kasanızın şifresini açarken "Şifreyi Kaydet" seçeneğini aktif edebilirsiniz.
settings.debugMode.label = Hata Ayıklama Modu
upgrade.version3dropBundleExtension.title = Kasa Sürüm 3 Yükseltmesi (Bundle Uzantısı Kaldırıldı)
upgrade.version3to4.title = Kasa Sürüm 3'ten 4'e Yükseltmesi
upgrade.version4to5.title = Kasa Sürüm 4'ten 5'e Yükseltmesi\n
upgrade.version4to5.msg = Bu kasanın daha yeni formata geçirilmesi gerekiyor.\nŞifrelenmiş dosyalar güncellenebilir.\nLütfen bu işlemden önce senkronizasyonun bittiğine emin olun.\n\nNot\: Tüm dosyalar için değiştirme tarihi şuan ki işlem tarihi olacak.
upgrade.version4to5.err.io = Yeni formata geçilirken G/Ç Hatası oluştu. Detaylar için günlük dosyasına bakın.
unlock.label.revealAfterMount = Sürücüyü Göster
unlocked.lock.force.confirmation.title = Kilitlemenin %1$s sırasında hata oluştu.
unlocked.lock.force.confirmation.header = Zorla kilitlemek istiyor musun?
unlocked.lock.force.confirmation.content = Bunun nedeni, diğer programların kasadaki dosyalara hala erişiyor olmaları veya başka bir sorun oluşması olabilir.\n\nHala dosyalara erişen programlar düzgün çalışmayabilir ve bu programlar tarafından henüz yazılmamış veriler kaybolabilir.\n
unlock.label.unlockAfterStartup = Başlangıçta Otomatik Kilit Aç (Deneysel)
unlock.errorMessage.unlockFailed = Kilit açma hatalı. Detaylar için günlük dosyasına bakın.
upgrade.version5toX.title = Kasa Versiyonu Yükseltme
upgrade.version5toX.msg = Bu kasanın daha yeni formata geçirilmesi gerekiyor.\nŞifrelenmiş dosyalar güncellenebilir.\nLütfen bu işlemden önce senkronizasyonun bittiğine emin olun.
main.createVault.nonEmptyDir.title = Kasa oluşturma hatası
main.createVault.nonEmptyDir.header = Seçtiğiniz klasör boş değil
main.createVault.nonEmptyDir.content = Seçtiğiniz klasör hali hazırda başka dosyalar içeriyor (gizli olabilir). Yeni bir kasa sadece boş klasör içerisine oluşturulabilir.
settings.webdav.port.label = WebDAV Portu
settings.webdav.port.prompt = 0 \= Otomatik Seç
settings.webdav.port.apply = Uygula
settings.webdav.prefGvfsScheme.label = WebDAV Şeması
settings.volume.label = Tercih Edilen Bölüm Türü
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Vault was successfully upgraded.
unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
unlock.successLabel.vaultCreated = Kasa başarıyla oluşturuldu.
unlock.successLabel.passwordChanged = Şifre başarıyla değiştirildi.
unlock.successLabel.upgraded = Kasa başarıyla yükseltildi.
unlock.label.useOwnMountPath = Özel Bağlantı Noktası Kullan
welcome.askForUpdateCheck.dialog.title = Güncelleme kontrolü
welcome.askForUpdateCheck.dialog.header = Entegre güncelleme kontrolü etkinleştirilsin mi?
welcome.askForUpdateCheck.dialog.content = Önerilen\: Yüklü tüm güvenlik yamalarıyla birlikte en yeni Cryptomator sürümüne sahip olduğunuzdan emin olmak için güncelleme kontrolünü etkinleştirin.\n\nBunu istediğiniz zaman ayarların içinden değiştirebilirsiniz.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try Again
main.gracefulShutdown.button.forceShutdown = Force Shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
ctrl.secPasswordField.nonPrintableChars = Password contains control characters.\nRecommendation\: Remove them to ensure compatibility with other clients.
ctrl.secPasswordField.capsLocked = Caps Lock is activated.
main.gracefulShutdown.dialog.title = Kasa(lar) kilitlenemedi
main.gracefulShutdown.dialog.header = Kasa(lar) kullanımda
main.gracefulShutdown.dialog.content = Bir veya daha fazla kasa hala başka programlar tarafından kullanılıyor. Lütfen Cryptomator'ın düzgün bir şekilde kapanmasını sağlamak için kapatın, ardından tekrar deneyin.\n\nBu işe yaramazsa, Cryptomator zorla kapatılabilir, ancak bu veri kaybına neden olabilir ve önerilmemektedir.
main.gracefulShutdown.button.tryAgain = Tekrar Dene
main.gracefulShutdown.button.forceShutdown = Zorla Kapat
unlock.pendingMessage.unlocking = Kasa kilidi açılıyor...
unlock.failedDialog.title = Kilitleme hatalı
unlock.failedDialog.header = Kilitleme hatalı
unlock.failedDialog.content.mountPathNonExisting = Bağlantı noktası mevcut değil.
unlock.failedDialog.content.mountPathNotEmpty = Bağlantı noktası boş değil.
unlock.label.useReadOnlyMode = Salt Okunur
unlock.label.chooseMountPath = Boş klasör seçin...
ctrl.secPasswordField.nonPrintableChars = Parola kontrol karakterlerini içeriyor.\nÖneri\: Diğer cihazlara uyumluluğu sağlamak için bunları kaldırın.
ctrl.secPasswordField.capsLocked = Büyük Harf etkin.

View File

@@ -97,7 +97,7 @@ settings.webdav.port.label = Порт WebDAV
settings.webdav.port.prompt = 0 \= автовибір
settings.webdav.port.apply = Застосувати
settings.webdav.prefGvfsScheme.label = Схема WebDAV\n
settings.volume.label = Метод монтування*
settings.volume.label = Метод монтування
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Сховище успішно створено.

View File

@@ -121,5 +121,5 @@ unlock.failedDialog.content.mountPathNonExisting = 挂载点不存在。
unlock.failedDialog.content.mountPathNotEmpty = 挂载点非空。
unlock.label.useReadOnlyMode = 只读
unlock.label.chooseMountPath = 选择空目录...
ctrl.secPasswordField.nonPrintableChars = Password contains control characters.\nRecommendation\: Remove them to ensure compatibility with other clients.
ctrl.secPasswordField.capsLocked = Caps Lock is activated.
ctrl.secPasswordField.nonPrintableChars = 密码包含控制字符。\n建议\:删除它们,以确保与其他客户机兼容。
ctrl.secPasswordField.capsLocked = 大写锁定被激活