mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-14 16:51:28 +00:00
Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1cc0b0728d | ||
|
|
7e7d5e46d3 | ||
|
|
5625525b21 | ||
|
|
b8fa226163 | ||
|
|
2b44f0ee9f | ||
|
|
b1ea21809b | ||
|
|
8def0b2060 | ||
|
|
2f61964758 | ||
|
|
2668299131 | ||
|
|
a7de849800 | ||
|
|
c66a8d0cfe | ||
|
|
efa7f78ffd | ||
|
|
57c858351d | ||
|
|
c3e48934b2 | ||
|
|
06b8c7cdf4 | ||
|
|
cbf677a51c | ||
|
|
923e58ba18 | ||
|
|
65c12d7ae1 | ||
|
|
8e324ef0eb | ||
|
|
29a0336bf4 | ||
|
|
44fc6761e3 | ||
|
|
a4ef082bc4 | ||
|
|
1272279b96 |
14
.idea/compiler.xml
generated
14
.idea/compiler.xml
generated
@@ -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>
|
||||
|
||||
10
.idea/runConfigurations/Cryptomator_Linux.xml
generated
Normal file
10
.idea/runConfigurations/Cryptomator_Linux.xml
generated
Normal 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="~/.config/Cryptomator/settings.json" -Dcryptomator.ipcPortPath="~/.config/Cryptomator/ipcPort.bin" -Dcryptomator.logDir="~/.local/share/Cryptomator/logs" -Dcryptomator.mountPointsDir="~/.local/share/Cryptomator/mnt" -Xss20m -Xmx512m" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.idea/runConfigurations/Cryptomator_Windows.xml
generated
Normal file
10
.idea/runConfigurations/Cryptomator_Windows.xml
generated
Normal 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="~/AppData/Roaming/Cryptomator/settings.json" -Dcryptomator.ipcPortPath="~/AppData/Roaming/Cryptomator/ipcPort.bin" -Dcryptomator.logDir="~/AppData/Roaming/Cryptomator" -Dcryptomator.keychainPath="~/AppData/Roaming/Cryptomator/keychain.json" -Xss2m -Xmx512m" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.idea/runConfigurations/Cryptomator_macOS.xml
generated
10
.idea/runConfigurations/Cryptomator_macOS.xml
generated
@@ -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="~/Library/Application Support/Cryptomator/settings.json" -Dcryptomator.ipcPortPath="~/Library/Application Support/Cryptomator/ipcPort.bin" -Dcryptomator.logDir="~/Library/Logs/Cryptomator" -Dcryptomator.mountPointsDir="/Volumes/"" />
|
||||
<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="~/Library/Application Support/Cryptomator/settings.json" -Dcryptomator.ipcPortPath="~/Library/Application Support/Cryptomator/ipcPort.bin" -Dcryptomator.logDir="~/Library/Logs/Cryptomator" -Dcryptomator.mountPointsDir="/Volumes/" -Xss2m -Xmx512m" />
|
||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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> {
|
||||
|
||||
|
||||
@@ -76,6 +76,7 @@ class VaultSettingsJsonAdapter {
|
||||
default:
|
||||
LOG.warn("Unsupported vault setting found in JSON: " + name);
|
||||
in.skipValue();
|
||||
break;
|
||||
}
|
||||
}
|
||||
in.endObject();
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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})
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
26
main/pom.xml
26
main/pom.xml
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
|
||||
@@ -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 が有効です。
|
||||
@@ -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 키가 활성화 되어있습니다.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
|
||||
@@ -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 включен.
|
||||
@@ -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.
|
||||
@@ -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 = Сховище успішно створено.
|
||||
|
||||
@@ -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 = 大写锁定被激活
|
||||
Reference in New Issue
Block a user