mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-15 17:21:27 +00:00
Compare commits
66 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94af8bd15a | ||
|
|
4712c4f593 | ||
|
|
42c856fc6f | ||
|
|
3618c4b8db | ||
|
|
bb681fa6d9 | ||
|
|
22e3840caa | ||
|
|
461ec3ca43 | ||
|
|
8aa3da14a4 | ||
|
|
670d4a165c | ||
|
|
9a9b19e6e2 | ||
|
|
206ba4c69a | ||
|
|
1702c6a243 | ||
|
|
8d2fe2fc03 | ||
|
|
4864eb3204 | ||
|
|
5721b63135 | ||
|
|
c99e0ea656 | ||
|
|
b1dc983d6b | ||
|
|
808223d58e | ||
|
|
4d5f6cbb52 | ||
|
|
fcdbc7a6cc | ||
|
|
113b745050 | ||
|
|
e4cde7f66f | ||
|
|
f6c834fee2 | ||
|
|
96990788d9 | ||
|
|
c204ed2601 | ||
|
|
b882296c19 | ||
|
|
186ed5c115 | ||
|
|
db29513376 | ||
|
|
0469e99baa | ||
|
|
37fcae8f0e | ||
|
|
2902479fc1 | ||
|
|
5ef7a3e76d | ||
|
|
041ce2504c | ||
|
|
8db889dbf5 | ||
|
|
a869fc219d | ||
|
|
002935af60 | ||
|
|
f3db7722b1 | ||
|
|
169014ef62 | ||
|
|
32d9e37708 | ||
|
|
57ee96a739 | ||
|
|
72f2bf4c42 | ||
|
|
b8b2265f9d | ||
|
|
56db682571 | ||
|
|
3b690dfc6e | ||
|
|
243c74b0cb | ||
|
|
a9a983d7ed | ||
|
|
880260d467 | ||
|
|
07e5e18d4d | ||
|
|
9e243daffa | ||
|
|
3ec2d4b701 | ||
|
|
3eee522897 | ||
|
|
408d16fabf | ||
|
|
830941755b | ||
|
|
84cc81ec40 | ||
|
|
a8b76a6914 | ||
|
|
c9f560eb04 | ||
|
|
8993b3584b | ||
|
|
93048647f5 | ||
|
|
75e35ca0e1 | ||
|
|
9205bafc56 | ||
|
|
4a9dd7f175 | ||
|
|
8d0c370f5a | ||
|
|
200e8f7b79 | ||
|
|
467e87813d | ||
|
|
5b2af73c50 | ||
|
|
a40847a280 |
113
.github/workflows/build.yml
vendored
Normal file
113
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,113 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
[push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build and Test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 14
|
||||
- uses: actions/cache@v1
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-maven-
|
||||
- name: Ensure to use tagged version
|
||||
run: mvn versions:set --file main/pom.xml -DnewVersion=${GITHUB_REF##*/} # use shell parameter expansion to strip of 'refs/tags'
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
- name: Build and Test
|
||||
run: mvn -B install --file main/pom.xml -Pcoverage
|
||||
- name: Run Codacy Coverage Reporter
|
||||
run: |
|
||||
curl -o ~/codacy-coverage-reporter.jar https://repo.maven.apache.org/maven2/com/codacy/codacy-coverage-reporter/7.1.0/codacy-coverage-reporter-7.1.0-assembly.jar
|
||||
$JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/commons/target/site/jacoco/jacoco.xml --partial
|
||||
$JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/keychain/target/site/jacoco/jacoco.xml --partial
|
||||
$JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/ui/target/site/jacoco/jacoco.xml --partial
|
||||
$JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/launcher/target/site/jacoco/jacoco.xml --partial
|
||||
$JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar final
|
||||
env:
|
||||
CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
||||
- name: Assemble Buildkit
|
||||
run: mvn -B package -DskipTests --file main/pom.xml --resume-from=buildkit -Prelease
|
||||
- name: Upload buildkit-linux.zip
|
||||
uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: buildkit-linux.zip
|
||||
path: main/buildkit/target/buildkit-linux.zip
|
||||
- name: Upload buildkit-mac.zip
|
||||
uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: buildkit-mac.zip
|
||||
path: main/buildkit/target/buildkit-mac.zip
|
||||
- name: Upload buildkit-win.zip
|
||||
uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: buildkit-win.zip
|
||||
path: main/buildkit/target/buildkit-win.zip
|
||||
|
||||
release:
|
||||
name: Draft a Release on GitHub Releases
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
steps:
|
||||
- name: Download buildkit-linux.zip
|
||||
uses: actions/download-artifact@v1
|
||||
with:
|
||||
name: buildkit-linux.zip
|
||||
path: .
|
||||
- name: Download buildkit-mac.zip
|
||||
uses: actions/download-artifact@v1
|
||||
with:
|
||||
name: buildkit-mac.zip
|
||||
path: .
|
||||
- name: Download buildkit-win.zip
|
||||
uses: actions/download-artifact@v1
|
||||
with:
|
||||
name: buildkit-win.zip
|
||||
path: .
|
||||
- name: Create Release
|
||||
id: create_release
|
||||
uses: actions/create-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: ${{ github.ref }}
|
||||
release_name: ${{ github.ref }}
|
||||
body: |
|
||||
:construction: Work in Progress
|
||||
draft: true
|
||||
prerelease: false
|
||||
- name: Upload buildkit-linux.zip to GitHub Releases
|
||||
uses: actions/upload-release-asset@v1.0.1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||
asset_path: buildkit-linux.zip
|
||||
asset_name: buildkit-linux.zip
|
||||
asset_content_type: application/zip
|
||||
- name: Upload buildkit-mac.zip to GitHub Releases
|
||||
uses: actions/upload-release-asset@v1.0.1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||
asset_path: buildkit-mac.zip
|
||||
asset_name: buildkit-mac.zip
|
||||
asset_content_type: application/zip
|
||||
- name: Upload buildkit-win.zip to GitHub Releases
|
||||
uses: actions/upload-release-asset@v1.0.1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||
asset_path: buildkit-win.zip
|
||||
asset_name: buildkit-win.zip
|
||||
asset_content_type: application/zip
|
||||
2
.idea/compiler.xml
generated
2
.idea/compiler.xml
generated
@@ -32,9 +32,9 @@
|
||||
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0.jar" />
|
||||
</processorPath>
|
||||
<module name="keychain" />
|
||||
<module name="launcher" />
|
||||
<module name="commons" />
|
||||
<module name="ui" />
|
||||
<module name="launcher" />
|
||||
</profile>
|
||||
</annotationProcessing>
|
||||
</component>
|
||||
|
||||
30
.idea/jarRepositories.xml
generated
Normal file
30
.idea/jarRepositories.xml
generated
Normal file
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="RemoteRepositoriesConfiguration">
|
||||
<remote-repository>
|
||||
<option name="id" value="bintray" />
|
||||
<option name="name" value="Bintray JCenter" />
|
||||
<option name="url" value="https://jcenter.bintray.com" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="central" />
|
||||
<option name="name" value="Maven Central Repository" />
|
||||
<option name="url" value="https://repo.maven.apache.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="central" />
|
||||
<option name="name" value="Maven Central repository" />
|
||||
<option name="url" value="https://repo1.maven.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="jcenter" />
|
||||
<option name="name" value="jcenter" />
|
||||
<option name="url" value="https://jcenter.bintray.com" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="jboss.community" />
|
||||
<option name="name" value="JBoss Community repository" />
|
||||
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
|
||||
</remote-repository>
|
||||
</component>
|
||||
</project>
|
||||
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -8,7 +8,7 @@
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="false" project-jdk-name="11" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_14" default="false" project-jdk-name="14" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
3
.idea/runConfigurations/Cryptomator_macOS.xml
generated
3
.idea/runConfigurations/Cryptomator_macOS.xml
generated
@@ -1,5 +1,8 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Cryptomator macOS" type="Application" factoryName="Application">
|
||||
<envs>
|
||||
<env name="LD_LIBRARY_PATH" value="/usr/local/lib" />
|
||||
</envs>
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="launcher" />
|
||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"package": {
|
||||
"name": "buildkit",
|
||||
"repo": "cryptomator",
|
||||
"subject": "cryptomator"
|
||||
},
|
||||
"version": {
|
||||
"name": "$TRAVIS_TAG",
|
||||
"desc": "Cryptomator version $TRAVIS_TAG",
|
||||
"released": "$TODAY",
|
||||
"vcs_tag": "$TRAVIS_TAG",
|
||||
"gpgSign": true
|
||||
},
|
||||
"files":
|
||||
[
|
||||
{"includePattern": "main/buildkit/target/(buildkit-[a-z]+\\.zip)", "uploadPattern": "/$TRAVIS_TAG/$1"}
|
||||
],
|
||||
"publish": true
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"package": {
|
||||
"name": "buildkit",
|
||||
"repo": "cryptomator",
|
||||
"subject": "cryptomator"
|
||||
},
|
||||
"version": {
|
||||
"name": "snapshot"
|
||||
},
|
||||
"files":
|
||||
[
|
||||
{"includePattern": "main/buildkit/target/(buildkit-[a-z]+\\.zip)", "uploadPattern": "/snapshot/$1", "matrixParams": {"override": 1}}
|
||||
],
|
||||
"publish": true
|
||||
}
|
||||
65
.travis.yml
65
.travis.yml
@@ -1,65 +0,0 @@
|
||||
dist: bionic
|
||||
language: java
|
||||
sudo: false
|
||||
jdk:
|
||||
- openjdk11
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.m2
|
||||
env:
|
||||
global:
|
||||
- secure: "HftEaabMmWn5GwKFKksUkOcelc3Mn7xazwAEy+4d4gL1+F8VhID/6DCK7nas+afUymWnxTano8Rv4Ci5MWryNkNkTH+FUPWmF3xWezc3hajSyS7RB92IZ8VPetl4Fo8UI1WwM5apDEaugalPxkIf8a7N+lpG5X/Gpumwzo3Be3w=" # BINTRAY_API_KEY
|
||||
- secure: "oWFgRTVP6lyTa7qVxlvkpm20MtVc3BtmsNXQJS6bfg2A0o/iCQMNx7OD59BaafCLGRKvCcJVESiC8FlSylVMS7CDSyYu0gg70NUiIuHp4NBM5inFWYCy/PdQsCTzr5uvNG+rMFQpMFRaCV0FrfM3tLondcVkhsHL68l93Xoexx4=" # CODACY_PROJECT_TOKEN
|
||||
- secure: "zJxgytA2Ks5Xzv+7kUaUq+EBFNQw9Qec63lcMJVuXVWczjL16nKW1EzzV515ag+OWL46z3lEPForDhufw0VtFnNmaX68jkO0mp01eLrHApc1llN2Y/U8GBXfNNazN4+Kom4H+z/AO+wJr8EsKMMUczCdQ3APgd9uVI0hzXw/Z3M=" # GITHUB_API_KEY
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- haveged
|
||||
install:
|
||||
# - curl -o $HOME/.m2/settings.xml https://gist.githubusercontent.com/cryptobot/cf5fbd909c4782aaeeeb7c7f4a1a43da/raw/e60ee486e34ee0c79f89f947abe2c83b4290c6bb/settings.xml
|
||||
- mvn -fmain/pom.xml clean install -DskipTests -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN org.codehaus.mojo:versions-maven-plugin:help dependency:go-offline -Pcoverage,release # "clean install" needed until we can exclude artifacts currently in the reactor, see https://maven.apache.org/plugins/maven-dependency-plugin/go-offline-mojo.html#excludeReactor and https://issues.apache.org/jira/browse/MDEP-568
|
||||
before_script:
|
||||
- |
|
||||
if [[ -n "$TRAVIS_TAG" ]]; then
|
||||
mvn -fmain/pom.xml org.codehaus.mojo:versions-maven-plugin:set -DnewVersion=$TRAVIS_TAG
|
||||
else
|
||||
mvn -fmain/pom.xml org.codehaus.mojo:versions-maven-plugin:set -DnewVersion=SNAPSHOT-$(echo $TRAVIS_COMMIT | head -c7)
|
||||
fi
|
||||
script:
|
||||
- mvn --update-snapshots -fmain/pom.xml clean test verify -Pcoverage
|
||||
after_success:
|
||||
- curl -o ~/codacy-coverage-reporter.jar https://repo.maven.apache.org/maven2/com/codacy/codacy-coverage-reporter/7.1.0/codacy-coverage-reporter-7.1.0-assembly.jar
|
||||
- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/commons/target/site/jacoco/jacoco.xml --partial
|
||||
- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/keychain/target/site/jacoco/jacoco.xml --partial
|
||||
- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/ui/target/site/jacoco/jacoco.xml --partial
|
||||
- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar report -l Java -r main/launcher/target/site/jacoco/jacoco.xml --partial
|
||||
- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter.jar final
|
||||
before_deploy:
|
||||
- mvn -fmain/pom.xml package -Prelease -DskipTests
|
||||
- export TODAY=`date +'%Y-%m-%d'`; envsubst '$TRAVIS_TAG $TODAY' < .travis-deploy-release.tmpl.json > .travis-deploy-release.json
|
||||
deploy:
|
||||
- provider: bintray # SNAPSHOTS
|
||||
file: .travis-deploy-snapshot.json
|
||||
user: cryptobot
|
||||
key: $BINTRAY_API_KEY
|
||||
skip_cleanup: true
|
||||
on:
|
||||
repo: cryptomator/cryptomator
|
||||
branch: develop
|
||||
- provider: bintray # RELEASES
|
||||
file: .travis-deploy-release.json
|
||||
user: cryptobot
|
||||
key: $BINTRAY_API_KEY
|
||||
skip_cleanup: true
|
||||
on:
|
||||
repo: cryptomator/cryptomator
|
||||
tags: true
|
||||
- provider: releases
|
||||
api_key: $GITHUB_API_KEY
|
||||
file_glob: true
|
||||
file:
|
||||
- "main/buildkit/target/buildkit-*.zip"
|
||||
skip_cleanup: true
|
||||
on:
|
||||
repo: cryptomator/cryptomator
|
||||
tags: true
|
||||
12
README.md
12
README.md
@@ -1,6 +1,6 @@
|
||||
[](https://cryptomator.org/)
|
||||
|
||||
[](https://travis-ci.org/cryptomator/cryptomator)
|
||||
[](https://github.com/cryptomator/cryptomator/actions?query=workflow%3ABuild)
|
||||
[](https://snyk.io/test/github/cryptomator/cryptomator?targetFile=main%2Fpom.xml)
|
||||
[](https://www.codacy.com/app/cryptomator/cryptomator?utm_source=github.com&utm_medium=referral&utm_content=cryptomator/cryptomator&utm_campaign=Badge_Grade)
|
||||
[](http://twitter.com/Cryptomator)
|
||||
@@ -15,6 +15,10 @@ Cryptomator is provided free of charge as an open-source project despite the hig
|
||||
- [One-time or recurring donation via Cryptomator's website.](https://cryptomator.org/#donate)
|
||||
- [Become a sponsor via Cryptomator's sponsors website.](https://cryptomator.org/sponsors/)
|
||||
|
||||
### Gold Sponsors
|
||||
|
||||
[<img src="https://cryptomator.org/img/sponsors/geewhiz.svg" alt="gee-whiz" height="96">](https://www.gee-whiz.de/)
|
||||
|
||||
### Silver Sponsors
|
||||
|
||||
[](https://thebestvpn.com/)
|
||||
@@ -37,7 +41,7 @@ Download native binaries of Cryptomator on [cryptomator.org](https://cryptomator
|
||||
- File names get encrypted
|
||||
- Folder structure gets obfuscated
|
||||
- Use as many vaults in your Dropbox as you want, each having individual passwords
|
||||
- One thousand commits for the security of your data!! :tada:
|
||||
- Two thousand commits for the security of your data!! :tada:
|
||||
|
||||
### Privacy
|
||||
|
||||
@@ -55,13 +59,13 @@ Download native binaries of Cryptomator on [cryptomator.org](https://cryptomator
|
||||
|
||||
### Security Architecture
|
||||
|
||||
For more information on the security details visit [cryptomator.org](https://cryptomator.org/architecture/).
|
||||
For more information on the security details visit [cryptomator.org](https://docs.cryptomator.org/en/latest/security/architecture/).
|
||||
|
||||
## Building
|
||||
|
||||
### Dependencies
|
||||
|
||||
* JDK 11 (we recommend to use the latest version)
|
||||
* JDK 14 (e.g. adoptopenjdk)
|
||||
* Maven 3
|
||||
* Optional: OS-dependent build tools for native packaging (see [Windows](https://github.com/cryptomator/cryptomator-win), [OS X](https://github.com/cryptomator/cryptomator-osx), [Linux](https://github.com/cryptomator/builder-containers))
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.5.0</version>
|
||||
<version>1.5.2</version>
|
||||
</parent>
|
||||
<artifactId>buildkit</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.5.0</version>
|
||||
<version>1.5.2</version>
|
||||
</parent>
|
||||
<artifactId>commons</artifactId>
|
||||
<name>Cryptomator Commons</name>
|
||||
|
||||
@@ -10,7 +10,9 @@ package org.cryptomator.common.settings;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonParseException;
|
||||
import com.google.gson.JsonParser;
|
||||
import org.cryptomator.common.Environment;
|
||||
import org.cryptomator.common.LazyInitializer;
|
||||
import org.slf4j.Logger;
|
||||
@@ -77,12 +79,15 @@ public class SettingsProvider implements Supplier<Settings> {
|
||||
LOG.debug("Attempting to load settings from {}", path);
|
||||
try (InputStream in = Files.newInputStream(path, StandardOpenOption.READ); //
|
||||
Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) {
|
||||
Settings settings = gson.fromJson(reader, Settings.class);
|
||||
if (settings == null) {
|
||||
throw new IOException("Unexpected EOF");
|
||||
JsonElement json = JsonParser.parseReader(reader);
|
||||
if (json.isJsonObject()) {
|
||||
Settings settings = gson.fromJson(json, Settings.class);
|
||||
LOG.info("Settings loaded from {}", path);
|
||||
return Stream.of(settings);
|
||||
} else {
|
||||
LOG.warn("Invalid json file {}", path);
|
||||
return Stream.empty();
|
||||
}
|
||||
LOG.info("Settings loaded from {}", path);
|
||||
return Stream.of(settings);
|
||||
} catch (NoSuchFileException e) {
|
||||
return Stream.empty();
|
||||
} catch (IOException e) {
|
||||
|
||||
@@ -9,23 +9,20 @@ import com.google.common.base.Strings;
|
||||
import com.google.common.io.BaseEncoding;
|
||||
import javafx.beans.Observable;
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.IntegerProperty;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.SimpleBooleanProperty;
|
||||
import javafx.beans.property.SimpleIntegerProperty;
|
||||
import javafx.beans.property.SimpleObjectProperty;
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.fxmisc.easybind.EasyBind;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Random;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* The settings specific to a single vault.
|
||||
@@ -38,6 +35,7 @@ public class VaultSettings {
|
||||
public static final boolean DEFAULT_USES_INDIVIDUAL_MOUNTPATH = false;
|
||||
public static final boolean DEFAULT_USES_READONLY_MODE = false;
|
||||
public static final String DEFAULT_MOUNT_FLAGS = "";
|
||||
public static final int DEFAULT_FILENAME_LENGTH_LIMIT = -1;
|
||||
|
||||
private static final Random RNG = new Random();
|
||||
|
||||
@@ -51,6 +49,7 @@ public class VaultSettings {
|
||||
private final StringProperty individualMountPath = new SimpleStringProperty();
|
||||
private final BooleanProperty usesReadOnlyMode = new SimpleBooleanProperty(DEFAULT_USES_READONLY_MODE);
|
||||
private final StringProperty mountFlags = new SimpleStringProperty(DEFAULT_MOUNT_FLAGS);
|
||||
private final IntegerProperty filenameLengthLimit = new SimpleIntegerProperty(DEFAULT_FILENAME_LENGTH_LIMIT);
|
||||
|
||||
public VaultSettings(String id) {
|
||||
this.id = Objects.requireNonNull(id);
|
||||
@@ -59,7 +58,7 @@ public class VaultSettings {
|
||||
}
|
||||
|
||||
Observable[] observables() {
|
||||
return new Observable[]{path, mountName, winDriveLetter, unlockAfterStartup, revealAfterMount, usesIndividualMountPath, individualMountPath, usesReadOnlyMode, mountFlags};
|
||||
return new Observable[]{path, mountName, winDriveLetter, unlockAfterStartup, revealAfterMount, usesIndividualMountPath, individualMountPath, usesReadOnlyMode, mountFlags, filenameLengthLimit};
|
||||
}
|
||||
|
||||
private void deriveMountNameFromPath(Path path) {
|
||||
@@ -146,6 +145,10 @@ public class VaultSettings {
|
||||
public StringProperty mountFlags() {
|
||||
return mountFlags;
|
||||
}
|
||||
|
||||
public IntegerProperty filenameLengthLimit() {
|
||||
return filenameLengthLimit;
|
||||
}
|
||||
|
||||
/* Hashcode/Equals */
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ class VaultSettingsJsonAdapter {
|
||||
out.name("individualMountPath").value(value.individualMountPath().get());
|
||||
out.name("usesReadOnlyMode").value(value.usesReadOnlyMode().get());
|
||||
out.name("mountFlags").value(value.mountFlags().get());
|
||||
out.name("filenameLengthLimit").value(value.filenameLengthLimit().get());
|
||||
out.endObject();
|
||||
}
|
||||
|
||||
@@ -43,6 +44,7 @@ class VaultSettingsJsonAdapter {
|
||||
boolean usesIndividualMountPath = VaultSettings.DEFAULT_USES_INDIVIDUAL_MOUNTPATH;
|
||||
boolean usesReadOnlyMode = VaultSettings.DEFAULT_USES_READONLY_MODE;
|
||||
String mountFlags = VaultSettings.DEFAULT_MOUNT_FLAGS;
|
||||
int filenameLengthLimit = VaultSettings.DEFAULT_FILENAME_LENGTH_LIMIT;
|
||||
|
||||
in.beginObject();
|
||||
while (in.hasNext()) {
|
||||
@@ -78,6 +80,9 @@ class VaultSettingsJsonAdapter {
|
||||
case "mountFlags":
|
||||
mountFlags = in.nextString();
|
||||
break;
|
||||
case "filenameLengthLimit":
|
||||
filenameLengthLimit = in.nextInt();
|
||||
break;
|
||||
default:
|
||||
LOG.warn("Unsupported vault setting found in JSON: " + name);
|
||||
in.skipValue();
|
||||
@@ -96,6 +101,7 @@ class VaultSettingsJsonAdapter {
|
||||
vaultSettings.individualMountPath().set(individualMountPath);
|
||||
vaultSettings.usesReadOnlyMode().set(usesReadOnlyMode);
|
||||
vaultSettings.mountFlags().set(mountFlags);
|
||||
vaultSettings.filenameLengthLimit().set(filenameLengthLimit);
|
||||
return vaultSettings;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,12 +21,15 @@ import org.cryptomator.cryptofs.CryptoFileSystem;
|
||||
import org.cryptomator.cryptofs.CryptoFileSystemProperties;
|
||||
import org.cryptomator.cryptofs.CryptoFileSystemProperties.FileSystemFlags;
|
||||
import org.cryptomator.cryptofs.CryptoFileSystemProvider;
|
||||
import org.cryptomator.cryptofs.common.Constants;
|
||||
import org.cryptomator.cryptofs.common.FileSystemCapabilityChecker;
|
||||
import org.cryptomator.cryptolib.api.CryptoException;
|
||||
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Provider;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.NoSuchFileException;
|
||||
@@ -51,6 +54,7 @@ public class Vault {
|
||||
private final StringBinding defaultMountFlags;
|
||||
private final AtomicReference<CryptoFileSystem> cryptoFileSystem;
|
||||
private final ObjectProperty<VaultState> state;
|
||||
private final ObjectProperty<Exception> lastKnownException;
|
||||
private final VaultStats stats;
|
||||
private final StringBinding displayableName;
|
||||
private final StringBinding displayablePath;
|
||||
@@ -59,18 +63,20 @@ public class Vault {
|
||||
private final BooleanBinding unlocked;
|
||||
private final BooleanBinding missing;
|
||||
private final BooleanBinding needsMigration;
|
||||
private final BooleanBinding unknownError;
|
||||
private final StringBinding accessPoint;
|
||||
private final BooleanBinding accessPointPresent;
|
||||
|
||||
private volatile Volume volume;
|
||||
|
||||
@Inject
|
||||
Vault(VaultSettings vaultSettings, Provider<Volume> volumeProvider, @DefaultMountFlags StringBinding defaultMountFlags, AtomicReference<CryptoFileSystem> cryptoFileSystem, ObjectProperty<VaultState> state, VaultStats stats) {
|
||||
Vault(VaultSettings vaultSettings, Provider<Volume> volumeProvider, @DefaultMountFlags StringBinding defaultMountFlags, AtomicReference<CryptoFileSystem> cryptoFileSystem, ObjectProperty<VaultState> state, @Named("lastKnownException") ObjectProperty<Exception> lastKnownException, VaultStats stats) {
|
||||
this.vaultSettings = vaultSettings;
|
||||
this.volumeProvider = volumeProvider;
|
||||
this.defaultMountFlags = defaultMountFlags;
|
||||
this.cryptoFileSystem = cryptoFileSystem;
|
||||
this.state = state;
|
||||
this.lastKnownException = lastKnownException;
|
||||
this.stats = stats;
|
||||
this.displayableName = Bindings.createStringBinding(this::getDisplayableName, vaultSettings.path());
|
||||
this.displayablePath = Bindings.createStringBinding(this::getDisplayablePath, vaultSettings.path());
|
||||
@@ -79,6 +85,7 @@ public class Vault {
|
||||
this.unlocked = Bindings.createBooleanBinding(this::isUnlocked, state);
|
||||
this.missing = Bindings.createBooleanBinding(this::isMissing, state);
|
||||
this.needsMigration = Bindings.createBooleanBinding(this::isNeedsMigration, state);
|
||||
this.unknownError = Bindings.createBooleanBinding(this::isUnknownError, state);
|
||||
this.accessPoint = Bindings.createStringBinding(this::getAccessPoint, state);
|
||||
this.accessPointPresent = this.accessPoint.isNotEmpty();
|
||||
}
|
||||
@@ -96,10 +103,19 @@ public class Vault {
|
||||
if (vaultSettings.usesReadOnlyMode().get()) {
|
||||
flags.add(FileSystemFlags.READONLY);
|
||||
}
|
||||
if (vaultSettings.filenameLengthLimit().get() == -1) {
|
||||
LOG.debug("Determining file name length limitations...");
|
||||
int limit = new FileSystemCapabilityChecker().determineSupportedFileNameLength(getPath());
|
||||
vaultSettings.filenameLengthLimit().set(limit);
|
||||
LOG.info("Storing file name length limit of {}", limit);
|
||||
}
|
||||
assert vaultSettings.filenameLengthLimit().get() > 0;
|
||||
CryptoFileSystemProperties fsProps = CryptoFileSystemProperties.cryptoFileSystemProperties() //
|
||||
.withPassphrase(passphrase) //
|
||||
.withFlags(flags) //
|
||||
.withMasterkeyFilename(MASTERKEY_FILENAME) //
|
||||
.withMaxPathLength(vaultSettings.filenameLengthLimit().get() + Constants.MAX_ADDITIONAL_PATH_LENGTH) //
|
||||
.withMaxNameLength(vaultSettings.filenameLengthLimit().get()) //
|
||||
.build();
|
||||
return CryptoFileSystemProvider.newFileSystem(getPath(), fsProps);
|
||||
}
|
||||
@@ -149,6 +165,18 @@ public class Vault {
|
||||
state.setValue(value);
|
||||
}
|
||||
|
||||
public ObjectProperty<Exception> lastKnownExceptionProperty() {
|
||||
return lastKnownException;
|
||||
}
|
||||
|
||||
public Exception getLastKnownException() {
|
||||
return lastKnownException.get();
|
||||
}
|
||||
|
||||
public void setLastKnownException(Exception e) {
|
||||
lastKnownException.setValue(e);
|
||||
}
|
||||
|
||||
public BooleanBinding lockedProperty() {
|
||||
return locked;
|
||||
}
|
||||
@@ -189,6 +217,14 @@ public class Vault {
|
||||
return state.get() == VaultState.NEEDS_MIGRATION;
|
||||
}
|
||||
|
||||
public BooleanBinding unknownErrorProperty() {
|
||||
return unknownError;
|
||||
}
|
||||
|
||||
public boolean isUnknownError() {
|
||||
return state.get() == VaultState.ERROR;
|
||||
}
|
||||
|
||||
public StringBinding displayableNameProperty() {
|
||||
return displayableName;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,9 @@ import org.cryptomator.common.settings.VaultSettings;
|
||||
|
||||
import dagger.Subcomponent;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.inject.Named;
|
||||
|
||||
@PerVault
|
||||
@Subcomponent(modules = {VaultModule.class})
|
||||
public interface VaultComponent {
|
||||
@@ -25,6 +28,9 @@ public interface VaultComponent {
|
||||
@BindsInstance
|
||||
Builder initialVaultState(VaultState vaultState);
|
||||
|
||||
@BindsInstance
|
||||
Builder initialErrorCause(@Nullable @Named("lastKnownException") Exception initialErrorCause);
|
||||
|
||||
VaultComponent build();
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,8 @@ import org.cryptomator.common.settings.Settings;
|
||||
import org.cryptomator.common.settings.VaultSettings;
|
||||
import org.cryptomator.cryptofs.CryptoFileSystemProvider;
|
||||
import org.cryptomator.cryptofs.migration.Migrators;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
@@ -29,7 +31,9 @@ import static org.cryptomator.common.Constants.MASTERKEY_FILENAME;
|
||||
|
||||
@Singleton
|
||||
public class VaultListManager {
|
||||
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(VaultListManager.class);
|
||||
|
||||
private final VaultComponent.Builder vaultComponentBuilder;
|
||||
private final ObservableList<Vault> vaultList;
|
||||
|
||||
@@ -37,7 +41,7 @@ public class VaultListManager {
|
||||
public VaultListManager(VaultComponent.Builder vaultComponentBuilder, Settings settings) {
|
||||
this.vaultComponentBuilder = vaultComponentBuilder;
|
||||
this.vaultList = FXCollections.observableArrayList(Vault::observables);
|
||||
|
||||
|
||||
addAll(settings.getDirectories());
|
||||
vaultList.addListener(new VaultListChangeListener(settings.getDirectories()));
|
||||
}
|
||||
@@ -47,53 +51,55 @@ public class VaultListManager {
|
||||
}
|
||||
|
||||
public Vault add(Path pathToVault) throws NoSuchFileException {
|
||||
if (!CryptoFileSystemProvider.containsVault(pathToVault, MASTERKEY_FILENAME)) {
|
||||
throw new NoSuchFileException(pathToVault.toString(), null, "Not a vault directory");
|
||||
Path normalizedPathToVault = pathToVault.normalize().toAbsolutePath();
|
||||
if (!CryptoFileSystemProvider.containsVault(normalizedPathToVault, MASTERKEY_FILENAME)) {
|
||||
throw new NoSuchFileException(normalizedPathToVault.toString(), null, "Not a vault directory");
|
||||
}
|
||||
Optional<Vault> alreadyExistingVault = get(pathToVault);
|
||||
Optional<Vault> alreadyExistingVault = get(normalizedPathToVault);
|
||||
if (alreadyExistingVault.isPresent()) {
|
||||
return alreadyExistingVault.get();
|
||||
} else {
|
||||
VaultSettings vaultSettings = VaultSettings.withRandomId();
|
||||
vaultSettings.path().set(pathToVault);
|
||||
vaultSettings.path().set(normalizedPathToVault);
|
||||
Vault newVault = create(vaultSettings);
|
||||
vaultList.add(newVault);
|
||||
return newVault;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void addAll(Collection<VaultSettings> vaultSettings) {
|
||||
Collection<Vault> vaults = vaultSettings.stream().map(this::create).collect(Collectors.toList());
|
||||
vaultList.addAll(vaults);
|
||||
}
|
||||
|
||||
|
||||
private Optional<Vault> get(Path vaultPath) {
|
||||
return vaultList.stream().filter(v -> {
|
||||
try {
|
||||
return Files.isSameFile(vaultPath, v.getPath());
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
}
|
||||
}).findAny();
|
||||
assert vaultPath.isAbsolute();
|
||||
assert vaultPath.normalize().equals(vaultPath);
|
||||
return vaultList.stream() //
|
||||
.filter(v -> vaultPath.equals(v.getPath())) //
|
||||
.findAny();
|
||||
}
|
||||
|
||||
private Vault create(VaultSettings vaultSettings) {
|
||||
VaultState vaultState = determineVaultState(vaultSettings.path().get());
|
||||
VaultComponent comp = vaultComponentBuilder.vaultSettings(vaultSettings).initialVaultState(vaultState).build();
|
||||
return comp.vault();
|
||||
VaultComponent.Builder compBuilder = vaultComponentBuilder.vaultSettings(vaultSettings);
|
||||
try {
|
||||
VaultState vaultState = determineVaultState(vaultSettings.path().get());
|
||||
compBuilder.initialVaultState(vaultState);
|
||||
} catch (IOException e) {
|
||||
LOG.warn("Failed to determine vault state for " + vaultSettings.path().get(), e);
|
||||
compBuilder.initialVaultState(VaultState.ERROR);
|
||||
compBuilder.initialErrorCause(e);
|
||||
}
|
||||
return compBuilder.build().vault();
|
||||
}
|
||||
|
||||
public static VaultState determineVaultState(Path pathToVault) {
|
||||
try {
|
||||
if (!CryptoFileSystemProvider.containsVault(pathToVault, MASTERKEY_FILENAME)) {
|
||||
return VaultState.MISSING;
|
||||
} else if (Migrators.get().needsMigration(pathToVault, MASTERKEY_FILENAME)) {
|
||||
return VaultState.NEEDS_MIGRATION;
|
||||
} else {
|
||||
return VaultState.LOCKED;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
return VaultState.ERROR;
|
||||
public static VaultState determineVaultState(Path pathToVault) throws IOException {
|
||||
if (!CryptoFileSystemProvider.containsVault(pathToVault, MASTERKEY_FILENAME)) {
|
||||
return VaultState.MISSING;
|
||||
} else if (Migrators.get().needsMigration(pathToVault, MASTERKEY_FILENAME)) {
|
||||
return VaultState.NEEDS_MIGRATION;
|
||||
} else {
|
||||
return VaultState.LOCKED;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ import org.cryptomator.cryptofs.CryptoFileSystem;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.inject.Named;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
@@ -46,6 +48,14 @@ public class VaultModule {
|
||||
return new SimpleObjectProperty<>(initialState);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Named("lastKnownException")
|
||||
@PerVault
|
||||
public ObjectProperty<Exception> provideLastKnownException(@Named("lastKnownException") @Nullable Exception initialErrorCause) {
|
||||
return new SimpleObjectProperty<>(initialErrorCause);
|
||||
}
|
||||
|
||||
|
||||
@Provides
|
||||
public Volume provideVolume(Settings settings, WebDavVolume webDavVolume, FuseVolume fuseVolume, DokanyVolume dokanyVolume) {
|
||||
VolumeImpl preferredImpl = settings.preferredVolumeImpl().get();
|
||||
|
||||
@@ -41,16 +41,13 @@ public class VaultStats {
|
||||
}
|
||||
|
||||
private void vaultStateChanged(@SuppressWarnings("unused") Observable observable) {
|
||||
switch (state.get()) {
|
||||
case UNLOCKED:
|
||||
assert fs.get() != null;
|
||||
LOG.debug("start recording stats");
|
||||
updateService.restart();
|
||||
break;
|
||||
default:
|
||||
LOG.debug("stop recording stats");
|
||||
updateService.cancel();
|
||||
break;
|
||||
if (VaultState.UNLOCKED.equals(state.get())) {
|
||||
assert fs.get() != null;
|
||||
LOG.debug("start recording stats");
|
||||
updateService.restart();
|
||||
} else {
|
||||
LOG.debug("stop recording stats");
|
||||
updateService.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -43,17 +43,10 @@ public interface Volume {
|
||||
}
|
||||
|
||||
static VolumeImpl[] getCurrentSupportedAdapters() {
|
||||
return Stream.of(VolumeImpl.values()).filter(impl -> {
|
||||
switch (impl) {
|
||||
case WEBDAV:
|
||||
return WebDavVolume.isSupportedStatic();
|
||||
case DOKANY:
|
||||
return DokanyVolume.isSupportedStatic();
|
||||
case FUSE:
|
||||
return FuseVolume.isSupportedStatic();
|
||||
default:
|
||||
return false;//throw new IllegalStateException("Adapter not implemented.");
|
||||
}
|
||||
return Stream.of(VolumeImpl.values()).filter(impl -> switch (impl) {
|
||||
case WEBDAV -> WebDavVolume.isSupportedStatic();
|
||||
case DOKANY -> DokanyVolume.isSupportedStatic();
|
||||
case FUSE -> FuseVolume.isSupportedStatic();
|
||||
}).toArray(VolumeImpl[]::new);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,8 +7,6 @@ package org.cryptomator.common.vaults;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import org.apache.commons.lang3.SystemUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
@@ -22,12 +20,11 @@ import java.util.stream.StreamSupport;
|
||||
@Singleton
|
||||
public final class WindowsDriveLetters {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(WindowsDriveLetters.class);
|
||||
private static final Set<String> A_TO_Z;
|
||||
private static final Set<String> C_TO_Z;
|
||||
|
||||
static {
|
||||
try (IntStream stream = IntStream.rangeClosed('A', 'Z')) {
|
||||
A_TO_Z = stream.mapToObj(i -> String.valueOf((char) i)).collect(Collectors.toSet());
|
||||
try (IntStream stream = IntStream.rangeClosed('C', 'Z')) {
|
||||
C_TO_Z = stream.mapToObj(i -> String.valueOf((char) i)).collect(Collectors.toSet());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +33,7 @@ public final class WindowsDriveLetters {
|
||||
}
|
||||
|
||||
public Set<String> getAllDriveLetters() {
|
||||
return A_TO_Z;
|
||||
return C_TO_Z;
|
||||
}
|
||||
|
||||
public Set<String> getOccupiedDriveLetters() {
|
||||
@@ -44,12 +41,12 @@ public final class WindowsDriveLetters {
|
||||
return Set.of();
|
||||
} else {
|
||||
Iterable<Path> rootDirs = FileSystems.getDefault().getRootDirectories();
|
||||
return StreamSupport.stream(rootDirs.spliterator(), false).map(p -> p.toString().substring(0,1)).collect(Collectors.toSet());
|
||||
return StreamSupport.stream(rootDirs.spliterator(), false).map(p -> p.toString().substring(0, 1)).collect(Collectors.toSet());
|
||||
}
|
||||
}
|
||||
|
||||
public Set<String> getAvailableDriveLetters() {
|
||||
return Sets.difference(A_TO_Z, getOccupiedDriveLetters());
|
||||
return Sets.difference(C_TO_Z, getOccupiedDriveLetters());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@ package org.cryptomator.common.settings;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@@ -34,4 +36,16 @@ public class SettingsJsonAdapterTest {
|
||||
Assertions.assertEquals(VolumeImpl.FUSE, settings.preferredVolumeImpl().get());
|
||||
}
|
||||
|
||||
@ParameterizedTest(name = "fromJson() should throw IOException for input: {0}")
|
||||
@ValueSource(strings = {
|
||||
"",
|
||||
"<html>",
|
||||
"{invalidjson}"
|
||||
})
|
||||
public void testDeserializeMalformed(String input) {
|
||||
Assertions.assertThrows(IOException.class, () -> {
|
||||
adapter.fromJson(input);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.5.0</version>
|
||||
<version>1.5.2</version>
|
||||
</parent>
|
||||
<artifactId>keychain</artifactId>
|
||||
<name>System Keychain Access</name>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.5.0</version>
|
||||
<version>1.5.2</version>
|
||||
</parent>
|
||||
<artifactId>launcher</artifactId>
|
||||
<name>Cryptomator Launcher</name>
|
||||
|
||||
10
main/pom.xml
10
main/pom.xml
@@ -3,7 +3,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.5.0</version>
|
||||
<version>1.5.2</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>Cryptomator</name>
|
||||
|
||||
@@ -24,11 +24,11 @@
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
|
||||
<!-- cryptomator dependencies -->
|
||||
<cryptomator.cryptofs.version>1.9.5</cryptomator.cryptofs.version>
|
||||
<cryptomator.cryptofs.version>1.9.9</cryptomator.cryptofs.version>
|
||||
<cryptomator.jni.version>2.2.2</cryptomator.jni.version>
|
||||
<cryptomator.fuse.version>1.2.3</cryptomator.fuse.version>
|
||||
<cryptomator.dokany.version>1.1.13</cryptomator.dokany.version>
|
||||
<cryptomator.webdav.version>1.0.10</cryptomator.webdav.version>
|
||||
<cryptomator.dokany.version>1.1.14</cryptomator.dokany.version>
|
||||
<cryptomator.webdav.version>1.0.11</cryptomator.webdav.version>
|
||||
|
||||
<!-- 3rd party dependencies -->
|
||||
<javafx.version>14</javafx.version>
|
||||
@@ -331,7 +331,7 @@
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<configuration>
|
||||
<release>11</release>
|
||||
<release>14</release>
|
||||
<annotationProcessorPaths>
|
||||
<path>
|
||||
<groupId>com.google.dagger</groupId>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.5.0</version>
|
||||
<version>1.5.2</version>
|
||||
</parent>
|
||||
<artifactId>ui</artifactId>
|
||||
<name>Cryptomator GUI</name>
|
||||
|
||||
@@ -21,10 +21,11 @@ abstract class ErrorModule {
|
||||
static FXMLLoaderFactory provideFxmlLoaderFactory(Map<Class<? extends FxController>, Provider<FxController>> factories, DefaultSceneFactory sceneFactory, ResourceBundle resourceBundle) {
|
||||
return new FXMLLoaderFactory(factories, sceneFactory, resourceBundle);
|
||||
}
|
||||
|
||||
|
||||
@Provides
|
||||
@Named("stackTrace")
|
||||
static String provideStackTrace(Throwable cause) {
|
||||
// TODO deduplicate VaultDetailUnknownErrorController.java
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
cause.printStackTrace(new PrintStream(baos));
|
||||
return baos.toString(StandardCharsets.UTF_8);
|
||||
|
||||
@@ -13,6 +13,7 @@ public enum FxmlFile {
|
||||
FORGET_PASSWORD("/fxml/forget_password.fxml"), //
|
||||
MAIN_WINDOW("/fxml/main_window.fxml"), //
|
||||
MIGRATION_CAPABILITY_ERROR("/fxml/migration_capability_error.fxml"), //
|
||||
MIGRATION_IMPOSSIBLE("/fxml/migration_impossible.fxml"),
|
||||
MIGRATION_RUN("/fxml/migration_run.fxml"), //
|
||||
MIGRATION_START("/fxml/migration_start.fxml"), //
|
||||
MIGRATION_SUCCESS("/fxml/migration_success.fxml"), //
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.cryptomator.ui.controls;
|
||||
|
||||
import javafx.beans.Observable;
|
||||
import javafx.beans.binding.Bindings;
|
||||
import javafx.beans.property.StringProperty;
|
||||
import javafx.geometry.Pos;
|
||||
@@ -55,19 +56,24 @@ public class NiceSecurePasswordField extends StackPane {
|
||||
passwordField.revealPasswordProperty().bind(revealPasswordButton.selectedProperty());
|
||||
|
||||
getChildren().addAll(passwordField, iconContainer);
|
||||
disabledProperty().addListener(this::disabledChanged);
|
||||
}
|
||||
|
||||
private FontAwesome5Icon getRevealPasswordGlyph() {
|
||||
return revealPasswordButton.isSelected() ? FontAwesome5Icon.EYE_SLASH : FontAwesome5Icon.EYE;
|
||||
}
|
||||
|
||||
private void disabledChanged(@SuppressWarnings("unused") Observable observable) {
|
||||
revealPasswordButton.setSelected(false);
|
||||
}
|
||||
|
||||
/* Passthrough */
|
||||
|
||||
@Override
|
||||
public void requestFocus() {
|
||||
passwordField.requestFocus();
|
||||
}
|
||||
|
||||
|
||||
public String getText() {
|
||||
return passwordField.getText();
|
||||
}
|
||||
|
||||
@@ -22,6 +22,8 @@ import javafx.scene.control.TextField;
|
||||
import javafx.scene.input.DragEvent;
|
||||
import javafx.scene.input.Dragboard;
|
||||
import javafx.scene.input.KeyCode;
|
||||
import javafx.scene.input.KeyCodeCombination;
|
||||
import javafx.scene.input.KeyCombination;
|
||||
import javafx.scene.input.KeyEvent;
|
||||
import javafx.scene.input.TransferMode;
|
||||
|
||||
@@ -43,6 +45,7 @@ public class SecurePasswordField extends TextField {
|
||||
private static final int GROW_BUFFER_SIZE = 50;
|
||||
private static final String DEFAULT_PLACEHOLDER = "●";
|
||||
private static final String STYLE_CLASS = "secure-password-field";
|
||||
private static final KeyCodeCombination SHORTCUT_BACKSPACE = new KeyCodeCombination(KeyCode.BACK_SPACE, KeyCombination.SHORTCUT_DOWN);
|
||||
|
||||
private final String placeholderChar;
|
||||
private final BooleanProperty capsLocked = new SimpleBooleanProperty();
|
||||
@@ -74,12 +77,10 @@ public class SecurePasswordField extends TextField {
|
||||
}
|
||||
|
||||
public Object queryAccessibleAttribute(AccessibleAttribute attribute, Object... parameters) {
|
||||
switch(attribute) {
|
||||
case TEXT:
|
||||
return null;
|
||||
default:
|
||||
return super.queryAccessibleAttribute(attribute, parameters);
|
||||
}
|
||||
return switch (attribute) {
|
||||
case TEXT -> null;
|
||||
default -> super.queryAccessibleAttribute(attribute, parameters);
|
||||
};
|
||||
}
|
||||
|
||||
private void handleDragOver(DragEvent event) {
|
||||
@@ -101,6 +102,8 @@ public class SecurePasswordField extends TextField {
|
||||
private void handleKeyEvent(KeyEvent e) {
|
||||
if (e.getCode() == KeyCode.CAPS) {
|
||||
updateCapsLocked();
|
||||
} else if (SHORTCUT_BACKSPACE.match(e)) {
|
||||
swipe();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,13 +6,9 @@ import dagger.Provides;
|
||||
import dagger.multibindings.IntoMap;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.input.KeyCode;
|
||||
import javafx.scene.input.KeyCodeCombination;
|
||||
import javafx.scene.input.KeyCombination;
|
||||
import javafx.stage.Stage;
|
||||
import javafx.stage.StageStyle;
|
||||
import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent;
|
||||
import org.cryptomator.ui.common.DefaultSceneFactory;
|
||||
import org.cryptomator.ui.common.FXMLLoaderFactory;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.common.FxControllerKey;
|
||||
@@ -87,7 +83,7 @@ abstract class MainWindowModule {
|
||||
@IntoMap
|
||||
@FxControllerKey(VaultDetailController.class)
|
||||
abstract FxController bindVaultDetailController(VaultDetailController controller);
|
||||
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(WelcomeController.class)
|
||||
@@ -102,7 +98,7 @@ abstract class MainWindowModule {
|
||||
@IntoMap
|
||||
@FxControllerKey(VaultDetailUnlockedController.class)
|
||||
abstract FxController bindVaultDetailUnlockedController(VaultDetailUnlockedController controller);
|
||||
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(VaultDetailMissingVaultController.class)
|
||||
@@ -113,11 +109,15 @@ abstract class MainWindowModule {
|
||||
@FxControllerKey(VaultDetailNeedsMigrationController.class)
|
||||
abstract FxController bindVaultDetailNeedsMigrationController(VaultDetailNeedsMigrationController controller);
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(VaultDetailUnknownErrorController.class)
|
||||
abstract FxController bindVaultDetailUnknownErrorController(VaultDetailUnknownErrorController controller);
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(VaultListCellController.class)
|
||||
abstract FxController bindVaultListCellController(VaultListCellController controller);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -31,16 +31,12 @@ public class VaultDetailController implements FxController {
|
||||
}
|
||||
|
||||
private FontAwesome5Icon getGlyphForVaultState(VaultState state) {
|
||||
switch (state) {
|
||||
case LOCKED:
|
||||
return FontAwesome5Icon.LOCK;
|
||||
case PROCESSING:
|
||||
return FontAwesome5Icon.SPINNER;
|
||||
case UNLOCKED:
|
||||
return FontAwesome5Icon.LOCK_OPEN;
|
||||
default:
|
||||
return FontAwesome5Icon.EXCLAMATION_TRIANGLE;
|
||||
}
|
||||
return switch (state) {
|
||||
case LOCKED -> FontAwesome5Icon.LOCK;
|
||||
case PROCESSING -> FontAwesome5Icon.SPINNER;
|
||||
case UNLOCKED -> FontAwesome5Icon.LOCK_OPEN;
|
||||
case NEEDS_MIGRATION, MISSING, ERROR -> FontAwesome5Icon.EXCLAMATION_TRIANGLE;
|
||||
};
|
||||
}
|
||||
|
||||
@FXML
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
package org.cryptomator.ui.mainwindow;
|
||||
|
||||
import javafx.beans.binding.Binding;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.fxmisc.easybind.EasyBind;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
@MainWindowScoped
|
||||
public class VaultDetailUnknownErrorController implements FxController {
|
||||
|
||||
private final Binding<String> stackTrace;
|
||||
|
||||
@Inject
|
||||
public VaultDetailUnknownErrorController(ObjectProperty<Vault> vault) {
|
||||
this.stackTrace = EasyBind.select(vault).selectObject(Vault::lastKnownExceptionProperty).map(this::provideStackTrace).orElse("");
|
||||
}
|
||||
|
||||
private String provideStackTrace(Throwable cause) {
|
||||
// TODO deduplicate ErrorModule.java
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
cause.printStackTrace(new PrintStream(baos));
|
||||
return baos.toString(StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
/* Getter/Setter */
|
||||
|
||||
public Binding<String> stackTraceProperty() {
|
||||
return stackTrace;
|
||||
}
|
||||
|
||||
public String getStackTrace() {
|
||||
return stackTrace.getValue();
|
||||
}
|
||||
}
|
||||
@@ -3,9 +3,9 @@ package org.cryptomator.ui.mainwindow;
|
||||
import javafx.beans.binding.Binding;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.SimpleObjectProperty;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.common.vaults.VaultState;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.ui.controls.FontAwesome5Icon;
|
||||
import org.fxmisc.easybind.EasyBind;
|
||||
|
||||
@@ -23,16 +23,12 @@ public class VaultListCellController implements FxController {
|
||||
}
|
||||
|
||||
private FontAwesome5Icon getGlyphForVaultState(VaultState state) {
|
||||
switch (state) {
|
||||
case LOCKED:
|
||||
return FontAwesome5Icon.LOCK;
|
||||
case PROCESSING:
|
||||
return FontAwesome5Icon.SPINNER;
|
||||
case UNLOCKED:
|
||||
return FontAwesome5Icon.LOCK_OPEN;
|
||||
default:
|
||||
return FontAwesome5Icon.EXCLAMATION_TRIANGLE;
|
||||
}
|
||||
return switch (state) {
|
||||
case LOCKED -> FontAwesome5Icon.LOCK;
|
||||
case PROCESSING -> FontAwesome5Icon.SPINNER;
|
||||
case UNLOCKED -> FontAwesome5Icon.LOCK_OPEN;
|
||||
case NEEDS_MIGRATION, MISSING, ERROR -> FontAwesome5Icon.EXCLAMATION_TRIANGLE;
|
||||
};
|
||||
}
|
||||
|
||||
/* Getter/Setter */
|
||||
|
||||
@@ -18,6 +18,7 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.io.IOException;
|
||||
|
||||
@MainWindowScoped
|
||||
public class VaultListController implements FxController {
|
||||
@@ -65,17 +66,18 @@ public class VaultListController implements FxController {
|
||||
}
|
||||
VaultState reportedState = newValue.getState();
|
||||
switch (reportedState) {
|
||||
case LOCKED:
|
||||
case NEEDS_MIGRATION:
|
||||
case MISSING:
|
||||
VaultState determinedState = VaultListManager.determineVaultState(newValue.getPath());
|
||||
newValue.setState(determinedState);
|
||||
case LOCKED, NEEDS_MIGRATION, MISSING:
|
||||
try {
|
||||
VaultState determinedState = VaultListManager.determineVaultState(newValue.getPath());
|
||||
newValue.setState(determinedState);
|
||||
} catch (IOException e) {
|
||||
LOG.warn("Failed to determine vault state for " + newValue.getPath(), e);
|
||||
newValue.setState(VaultState.ERROR);
|
||||
newValue.setLastKnownException(e);
|
||||
}
|
||||
break;
|
||||
case ERROR:
|
||||
case UNLOCKED:
|
||||
case PROCESSING:
|
||||
default:
|
||||
// no-op
|
||||
case ERROR, UNLOCKED, PROCESSING:
|
||||
break; // no-op
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
package org.cryptomator.ui.migration;
|
||||
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.stage.Stage;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.fxapp.FxApplication;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
public class MigrationImpossibleController implements FxController {
|
||||
|
||||
private static final String HELP_URI = "https://docs.cryptomator.org/en/1.5/help/manual-migration/";
|
||||
|
||||
private final FxApplication fxApplication;
|
||||
private final Stage window;
|
||||
private final Vault vault;
|
||||
|
||||
@Inject
|
||||
MigrationImpossibleController(FxApplication fxApplication, @MigrationWindow Stage window, @MigrationWindow Vault vault) {
|
||||
this.fxApplication = fxApplication;
|
||||
this.window = window;
|
||||
this.vault = vault;
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void close() {
|
||||
window.close();
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void getMigrationHelp() {
|
||||
fxApplication.getHostServices().showDocument(HELP_URI);
|
||||
}
|
||||
|
||||
/* Getter/Setters */
|
||||
|
||||
public Vault getVault() {
|
||||
return vault;
|
||||
}
|
||||
|
||||
public String getHelpUri() {
|
||||
return HELP_URI;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -83,6 +83,13 @@ abstract class MigrationModule {
|
||||
return fxmlLoaders.createScene("/fxml/migration_capability_error.fxml");
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxmlScene(FxmlFile.MIGRATION_IMPOSSIBLE)
|
||||
@MigrationScoped
|
||||
static Scene provideMigrationImpossibleScene(@MigrationWindow FXMLLoaderFactory fxmlLoaders) {
|
||||
return fxmlLoaders.createScene("/fxml/migration_impossible.fxml");
|
||||
}
|
||||
|
||||
// ------------------
|
||||
|
||||
@Binds
|
||||
@@ -104,5 +111,9 @@ abstract class MigrationModule {
|
||||
@IntoMap
|
||||
@FxControllerKey(MigrationCapabilityErrorController.class)
|
||||
abstract FxController bindMigrationCapabilityErrorController(MigrationCapabilityErrorController controller);
|
||||
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(MigrationImpossibleController.class)
|
||||
abstract FxController bindMigrationImpossibleController(MigrationImpossibleController controller);
|
||||
}
|
||||
|
||||
@@ -16,8 +16,10 @@ import javafx.scene.control.ContentDisplay;
|
||||
import javafx.stage.Stage;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.common.vaults.VaultState;
|
||||
import org.cryptomator.cryptofs.FileNameTooLongException;
|
||||
import org.cryptomator.cryptofs.common.FileSystemCapabilityChecker;
|
||||
import org.cryptomator.cryptofs.migration.Migrators;
|
||||
import org.cryptomator.cryptofs.migration.api.MigrationContinuationListener;
|
||||
import org.cryptomator.cryptofs.migration.api.MigrationProgressListener;
|
||||
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
|
||||
import org.cryptomator.keychain.KeychainAccess;
|
||||
@@ -58,6 +60,7 @@ public class MigrationRunController implements FxController {
|
||||
private final ErrorComponent.Builder errorComponent;
|
||||
private final Lazy<Scene> startScene;
|
||||
private final Lazy<Scene> successScene;
|
||||
private final Lazy<Scene> impossibleScene;
|
||||
private final ObjectBinding<ContentDisplay> migrateButtonContentDisplay;
|
||||
private final Lazy<Scene> capabilityErrorScene;
|
||||
private final BooleanProperty migrationButtonDisabled;
|
||||
@@ -66,7 +69,8 @@ public class MigrationRunController implements FxController {
|
||||
public NiceSecurePasswordField passwordField;
|
||||
|
||||
@Inject
|
||||
public MigrationRunController(@MigrationWindow Stage window, @MigrationWindow Vault vault, ExecutorService executor, ScheduledExecutorService scheduler, Optional<KeychainAccess> keychainAccess, @Named("capabilityErrorCause") ObjectProperty<FileSystemCapabilityChecker.Capability> missingCapability, @FxmlScene(FxmlFile.MIGRATION_START) Lazy<Scene> startScene, @FxmlScene(FxmlFile.MIGRATION_SUCCESS) Lazy<Scene> successScene, @FxmlScene(FxmlFile.MIGRATION_CAPABILITY_ERROR) Lazy<Scene> capabilityErrorScene, ErrorComponent.Builder errorComponent) {
|
||||
public MigrationRunController(@MigrationWindow Stage window, @MigrationWindow Vault vault, ExecutorService executor, ScheduledExecutorService scheduler, Optional<KeychainAccess> keychainAccess, @Named("capabilityErrorCause") ObjectProperty<FileSystemCapabilityChecker.Capability> missingCapability, @FxmlScene(FxmlFile.MIGRATION_START) Lazy<Scene> startScene, @FxmlScene(FxmlFile.MIGRATION_SUCCESS) Lazy<Scene> successScene, @FxmlScene(FxmlFile.MIGRATION_CAPABILITY_ERROR) Lazy<Scene> capabilityErrorScene, @FxmlScene(FxmlFile.MIGRATION_IMPOSSIBLE) Lazy<Scene> impossibleScene, ErrorComponent.Builder errorComponent) {
|
||||
|
||||
this.window = window;
|
||||
this.vault = vault;
|
||||
this.executor = executor;
|
||||
@@ -80,6 +84,7 @@ public class MigrationRunController implements FxController {
|
||||
this.capabilityErrorScene = capabilityErrorScene;
|
||||
this.migrationButtonDisabled = new SimpleBooleanProperty();
|
||||
this.migrationProgress = new SimpleDoubleProperty(volatileMigrationProgress);
|
||||
this.impossibleScene = impossibleScene;
|
||||
}
|
||||
|
||||
public void initialize() {
|
||||
@@ -99,6 +104,7 @@ public class MigrationRunController implements FxController {
|
||||
LOG.info("Migrating vault {}", vault.getPath());
|
||||
CharSequence password = passwordField.getCharacters();
|
||||
vault.setState(VaultState.PROCESSING);
|
||||
passwordField.setDisable(true);
|
||||
ScheduledFuture<?> progressSyncTask = scheduler.scheduleAtFixedRate(() -> {
|
||||
Platform.runLater(() -> {
|
||||
migrationProgress.set(volatileMigrationProgress);
|
||||
@@ -106,7 +112,7 @@ public class MigrationRunController implements FxController {
|
||||
}, 0, MIGRATION_PROGRESS_UPDATE_MILLIS, TimeUnit.MILLISECONDS);
|
||||
Tasks.create(() -> {
|
||||
Migrators migrators = Migrators.get();
|
||||
migrators.migrate(vault.getPath(), MASTERKEY_FILENAME, password, this::migrationProgressChanged);
|
||||
migrators.migrate(vault.getPath(), MASTERKEY_FILENAME, password, this::migrationProgressChanged, this::migrationRequiresInput);
|
||||
return migrators.needsMigration(vault.getPath(), MASTERKEY_FILENAME);
|
||||
}).onSuccess(needsAnotherMigration -> {
|
||||
if (needsAnotherMigration) {
|
||||
@@ -120,38 +126,44 @@ public class MigrationRunController implements FxController {
|
||||
}
|
||||
}).onError(InvalidPassphraseException.class, e -> {
|
||||
Animations.createShakeWindowAnimation(window).play();
|
||||
passwordField.setDisable(false);
|
||||
passwordField.selectAll();
|
||||
passwordField.requestFocus();
|
||||
vault.setState(VaultState.NEEDS_MIGRATION);
|
||||
}).onError(FileSystemCapabilityChecker.MissingCapabilityException.class, e -> {
|
||||
LOG.error("Underlying file system not supported.", e);
|
||||
vault.setState(VaultState.ERROR);
|
||||
vault.setState(VaultState.NEEDS_MIGRATION);
|
||||
missingCapability.set(e.getMissingCapability());
|
||||
window.setScene(capabilityErrorScene.get());
|
||||
}).onError(FileNameTooLongException.class, e -> {
|
||||
LOG.error("Migration failed because the underlying file system does not support long filenames.", e);
|
||||
vault.setState(VaultState.NEEDS_MIGRATION);
|
||||
errorComponent.cause(e).window(window).returnToScene(startScene.get()).build().showErrorScene();
|
||||
window.setScene(impossibleScene.get());
|
||||
}).onError(Exception.class, e -> { // including RuntimeExceptions
|
||||
LOG.error("Migration failed for technical reasons.", e);
|
||||
vault.setState(VaultState.NEEDS_MIGRATION);
|
||||
errorComponent.cause(e).window(window).returnToScene(startScene.get()).build().showErrorScene();
|
||||
}).andFinally(() -> {
|
||||
passwordField.setDisable(false);
|
||||
progressSyncTask.cancel(true);
|
||||
}).runOnce(executor);
|
||||
}
|
||||
|
||||
// Called by a background task. We can not directly modify observable properties from here
|
||||
private void migrationProgressChanged(MigrationProgressListener.ProgressState state, double progress) {
|
||||
switch (state) {
|
||||
case INITIALIZING:
|
||||
volatileMigrationProgress = -1.0;
|
||||
break;
|
||||
case MIGRATING:
|
||||
volatileMigrationProgress = progress;
|
||||
break;
|
||||
case FINALIZING:
|
||||
volatileMigrationProgress = 1.0;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("Unexpted state " + state);
|
||||
}
|
||||
volatileMigrationProgress = switch (state) {
|
||||
case INITIALIZING -> -1.0;
|
||||
case MIGRATING -> progress;
|
||||
case FINALIZING -> 1.0;
|
||||
};
|
||||
}
|
||||
|
||||
private MigrationContinuationListener.ContinuationResult migrationRequiresInput(MigrationContinuationListener.ContinuationEvent event) {
|
||||
//TODO: creating a new scene seems a little over the top, maybe stick to this scene
|
||||
// my suggestion is to make this quick and dirty by setting some elements unmanaged and invisible and afterwards activate them again
|
||||
// otherwise: We need a more abstract runController which has two subviews (run and halted), see mainWindow for example
|
||||
return MigrationContinuationListener.ContinuationResult.PROCEED;
|
||||
}
|
||||
|
||||
private void loadStoredPassword() {
|
||||
@@ -191,12 +203,10 @@ public class MigrationRunController implements FxController {
|
||||
}
|
||||
|
||||
public ContentDisplay getMigrateButtonContentDisplay() {
|
||||
switch (vault.getState()) {
|
||||
case PROCESSING:
|
||||
return ContentDisplay.LEFT;
|
||||
default:
|
||||
return ContentDisplay.TEXT_ONLY;
|
||||
}
|
||||
return switch (vault.getState()) {
|
||||
case PROCESSING -> ContentDisplay.LEFT;
|
||||
default -> ContentDisplay.TEXT_ONLY;
|
||||
};
|
||||
}
|
||||
|
||||
public ReadOnlyDoubleProperty migrationProgressProperty() {
|
||||
|
||||
@@ -49,21 +49,14 @@ public class PreferencesController implements FxController {
|
||||
}
|
||||
|
||||
private Tab getTabToSelect(SelectedPreferencesTab selectedTab) {
|
||||
switch (selectedTab) {
|
||||
case UPDATES:
|
||||
return updatesTab;
|
||||
case VOLUME:
|
||||
return volumeTab;
|
||||
case DONATION_KEY:
|
||||
return donationKeyTab;
|
||||
case GENERAL:
|
||||
return generalTab;
|
||||
case ABOUT:
|
||||
return aboutTab;
|
||||
case ANY:
|
||||
default:
|
||||
return updateAvailable.get() ? updatesTab : generalTab;
|
||||
}
|
||||
return switch (selectedTab) {
|
||||
case UPDATES -> updatesTab;
|
||||
case VOLUME -> volumeTab;
|
||||
case DONATION_KEY -> donationKeyTab;
|
||||
case GENERAL -> generalTab;
|
||||
case ABOUT -> aboutTab;
|
||||
case ANY -> updateAvailable.get() ? updatesTab : generalTab;
|
||||
};
|
||||
}
|
||||
|
||||
private void selectedTabChanged() {
|
||||
|
||||
@@ -29,12 +29,10 @@ class TrayImageFactory {
|
||||
MacApplicationUiInterfaceStyle interfaceStyle = macFunctions.map(MacFunctions::uiAppearance) //
|
||||
.map(MacApplicationUiAppearance::getCurrentInterfaceStyle) //
|
||||
.orElse(MacApplicationUiInterfaceStyle.LIGHT);
|
||||
switch (interfaceStyle) {
|
||||
case DARK:
|
||||
return "/tray_icon_mac_white.png";
|
||||
default:
|
||||
return "/tray_icon_mac_black.png";
|
||||
}
|
||||
return switch (interfaceStyle) {
|
||||
case DARK -> "/tray_icon_mac_white.png";
|
||||
case LIGHT -> "/tray_icon_mac_black.png";
|
||||
};
|
||||
}
|
||||
|
||||
private String getWinOrLinuxResourceName() {
|
||||
|
||||
@@ -4,7 +4,6 @@ import dagger.Lazy;
|
||||
import javafx.beans.binding.Bindings;
|
||||
import javafx.beans.binding.ObjectBinding;
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.ReadOnlyBooleanProperty;
|
||||
import javafx.beans.property.SimpleBooleanProperty;
|
||||
import javafx.concurrent.Task;
|
||||
@@ -30,7 +29,6 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import java.nio.file.DirectoryNotEmptyException;
|
||||
import java.nio.file.NotDirectoryException;
|
||||
import java.util.Arrays;
|
||||
@@ -75,7 +73,7 @@ public class UnlockController implements FxController {
|
||||
if (keychainAccess.isPresent()) {
|
||||
loadStoredPassword();
|
||||
} else {
|
||||
savePassword.setDisable(true);
|
||||
savePassword.setSelected(false);
|
||||
}
|
||||
unlockButtonDisabled.bind(vault.stateProperty().isNotEqualTo(VaultState.LOCKED).or(passwordField.textProperty().isEmpty()));
|
||||
}
|
||||
@@ -90,9 +88,11 @@ public class UnlockController implements FxController {
|
||||
public void unlock() {
|
||||
LOG.trace("UnlockController.unlock()");
|
||||
CharSequence password = passwordField.getCharacters();
|
||||
|
||||
|
||||
Task<Vault> task = vaultService.createUnlockTask(vault, password);
|
||||
passwordField.setDisable(true);
|
||||
task.setOnSucceeded(event -> {
|
||||
passwordField.setDisable(false);
|
||||
if (keychainAccess.isPresent() && savePassword.isSelected()) {
|
||||
try {
|
||||
keychainAccess.get().storePassphrase(vault.getId(), password);
|
||||
@@ -105,12 +105,12 @@ public class UnlockController implements FxController {
|
||||
window.setScene(successScene.get());
|
||||
});
|
||||
task.setOnFailed(event -> {
|
||||
passwordField.setDisable(false);
|
||||
if (task.getException() instanceof InvalidPassphraseException) {
|
||||
Animations.createShakeWindowAnimation(window).play();
|
||||
passwordField.selectAll();
|
||||
passwordField.requestFocus();
|
||||
} else if (task.getException() instanceof NotDirectoryException
|
||||
|| task.getException() instanceof DirectoryNotEmptyException) {
|
||||
} else if (task.getException() instanceof NotDirectoryException || task.getException() instanceof DirectoryNotEmptyException) {
|
||||
LOG.error("Unlock failed. Mount point not an empty directory: {}", task.getException().getMessage());
|
||||
window.setScene(invalidMountPointScene.get());
|
||||
} else {
|
||||
@@ -174,12 +174,10 @@ public class UnlockController implements FxController {
|
||||
}
|
||||
|
||||
public ContentDisplay getUnlockButtonState() {
|
||||
switch (vault.getState()) {
|
||||
case PROCESSING:
|
||||
return ContentDisplay.LEFT;
|
||||
default:
|
||||
return ContentDisplay.TEXT_ONLY;
|
||||
}
|
||||
return switch (vault.getState()) {
|
||||
case PROCESSING -> ContentDisplay.LEFT;
|
||||
default -> ContentDisplay.TEXT_ONLY;
|
||||
};
|
||||
}
|
||||
|
||||
public ReadOnlyBooleanProperty unlockButtonDisabledProperty() {
|
||||
@@ -189,4 +187,8 @@ public class UnlockController implements FxController {
|
||||
public boolean isUnlockButtonDisabled() {
|
||||
return unlockButtonDisabled.get();
|
||||
}
|
||||
|
||||
public boolean isKeychainAccessAvailable() {
|
||||
return keychainAccess.isPresent();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import javafx.scene.Scene;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.stage.Modality;
|
||||
import javafx.stage.Stage;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.ui.common.DefaultSceneFactory;
|
||||
import org.cryptomator.ui.common.FXMLLoaderFactory;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
@@ -35,9 +36,9 @@ abstract class UnlockModule {
|
||||
@Provides
|
||||
@UnlockWindow
|
||||
@UnlockScoped
|
||||
static Stage provideStage(ResourceBundle resourceBundle, @Named("windowIcons") List<Image> windowIcons) {
|
||||
static Stage provideStage(@UnlockWindow Vault vault, @Named("windowIcons") List<Image> windowIcons) {
|
||||
Stage stage = new Stage();
|
||||
stage.setTitle(resourceBundle.getString("unlock.title"));
|
||||
stage.setTitle(vault.getDisplayableName());
|
||||
stage.setResizable(false);
|
||||
stage.initModality(Modality.APPLICATION_MODAL);
|
||||
stage.getIcons().addAll(windowIcons);
|
||||
|
||||
@@ -854,7 +854,7 @@
|
||||
.progress-bar > .bar {
|
||||
-fx-background-color: CONTROL_PRIMARY_BG_NORMAL;
|
||||
-fx-background-radius: 4px;
|
||||
-fx-padding: 0.5em;
|
||||
-fx-padding: 1em 0.5em;
|
||||
}
|
||||
|
||||
.progress-bar:indeterminate > .bar {
|
||||
|
||||
@@ -853,7 +853,7 @@
|
||||
.progress-bar > .bar {
|
||||
-fx-background-color: CONTROL_PRIMARY_BG_NORMAL;
|
||||
-fx-background-radius: 4px;
|
||||
-fx-padding: 0.5em;
|
||||
-fx-padding: 1em 0.5em;
|
||||
}
|
||||
|
||||
.progress-bar:indeterminate > .bar {
|
||||
|
||||
52
main/ui/src/main/resources/fxml/migration_impossible.fxml
Normal file
52
main/ui/src/main/resources/fxml/migration_impossible.fxml
Normal file
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ButtonBar?>
|
||||
<?import javafx.scene.control.Hyperlink?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.shape.Circle?>
|
||||
<?import javafx.scene.text.Text?>
|
||||
<?import javafx.scene.text.TextFlow?>
|
||||
<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
|
||||
<VBox xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
fx:controller="org.cryptomator.ui.migration.MigrationImpossibleController"
|
||||
minWidth="400"
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
<HBox spacing="12" alignment="CENTER_LEFT" VBox.vgrow="ALWAYS">
|
||||
<StackPane alignment="CENTER" HBox.hgrow="NEVER">
|
||||
<Circle styleClass="glyph-icon-red" radius="24"/>
|
||||
<FontAwesome5IconView styleClass="glyph-icon-white" glyph="TIMES" glyphSize="24"/>
|
||||
</StackPane>
|
||||
<VBox spacing="6">
|
||||
<Label styleClass="label-large" text="%migration.impossible.heading"/>
|
||||
<Label text="%migration.impossible.reason" wrapText="true" HBox.hgrow="ALWAYS"/>
|
||||
<TextFlow>
|
||||
<Text text="%migration.impossible.moreInfo"/>
|
||||
<Text text=" "/>
|
||||
<Hyperlink styleClass="hyperlink-underline" text="docs.cryptomator.org" wrapText="true" onAction="#getMigrationHelp"/>
|
||||
<Text text="."/>
|
||||
</TextFlow>
|
||||
</VBox>
|
||||
</HBox>
|
||||
|
||||
<VBox alignment="BOTTOM_CENTER" VBox.vgrow="ALWAYS">
|
||||
<ButtonBar buttonMinWidth="120" buttonOrder="+C">
|
||||
<buttons>
|
||||
<!-- Button text="Try again" ButtonBar.buttonData="to do" onAction="#retry" / also add button to button bar order-->
|
||||
<Button text="%generic.button.close" ButtonBar.buttonData="CANCEL_CLOSE" cancelButton="true" onAction="#close"/>
|
||||
</buttons>
|
||||
</ButtonBar>
|
||||
</VBox>
|
||||
</VBox>
|
||||
@@ -3,6 +3,7 @@
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ButtonBar?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.ProgressBar?>
|
||||
<?import javafx.scene.control.ProgressIndicator?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
@@ -19,17 +20,20 @@
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
<children>
|
||||
<VBox spacing="6">
|
||||
<VBox spacing="6" visible="${!controller.vault.processing}" managed="${!controller.vault.processing}">
|
||||
<FormattedLabel format="%migration.run.enterPassword" arg1="${controller.vault.displayableName}" wrapText="true"/>
|
||||
<NiceSecurePasswordField fx:id="passwordField"/>
|
||||
</VBox>
|
||||
|
||||
<ProgressBar progress="${controller.migrationProgress}" prefWidth="Infinity" visible="${controller.vault.processing}"/>
|
||||
<VBox spacing="6" visible="${controller.vault.processing}" managed="${controller.vault.processing}">
|
||||
<Label text="%migration.run.progressHint" wrapText="true"/>
|
||||
<ProgressBar progress="${controller.migrationProgress}" prefWidth="Infinity"/>
|
||||
</VBox>
|
||||
|
||||
<VBox alignment="BOTTOM_CENTER" VBox.vgrow="ALWAYS">
|
||||
<ButtonBar buttonMinWidth="120" buttonOrder="B+X">
|
||||
<buttons>
|
||||
<Button text="%generic.button.back" ButtonBar.buttonData="BACK_PREVIOUS" cancelButton="true" onAction="#back"/>
|
||||
<Button text="%generic.button.back" ButtonBar.buttonData="BACK_PREVIOUS" cancelButton="true" onAction="#back" disable="${controller.vault.processing}"/>
|
||||
<Button text="%migration.run.startMigrationBtn" ButtonBar.buttonData="NEXT_FORWARD" defaultButton="true" onAction="#migrate" contentDisplay="${controller.migrateButtonContentDisplay}"
|
||||
disable="${controller.migrationButtonDisabled}">
|
||||
<graphic>
|
||||
|
||||
@@ -22,13 +22,13 @@
|
||||
<VBox spacing="6">
|
||||
<FormattedLabel format="%unlock.passwordPrompt" arg1="${controller.vault.displayableName}" wrapText="true"/>
|
||||
<NiceSecurePasswordField fx:id="passwordField"/>
|
||||
<CheckBox fx:id="savePassword" text="%unlock.savePassword" onAction="#didClickSavePasswordCheckbox"/>
|
||||
<CheckBox fx:id="savePassword" text="%unlock.savePassword" onAction="#didClickSavePasswordCheckbox" disable="${controller.vault.processing}" visible="${controller.keychainAccessAvailable}"/>
|
||||
</VBox>
|
||||
|
||||
<VBox alignment="BOTTOM_CENTER" VBox.vgrow="ALWAYS">
|
||||
<ButtonBar buttonMinWidth="120" buttonOrder="+CI">
|
||||
<buttons>
|
||||
<Button text="%generic.button.cancel" ButtonBar.buttonData="CANCEL_CLOSE" cancelButton="true" onAction="#cancel"/>
|
||||
<Button text="%generic.button.cancel" ButtonBar.buttonData="CANCEL_CLOSE" cancelButton="true" onAction="#cancel" disable="${controller.vault.processing}"/>
|
||||
<Button text="%unlock.unlockBtn" ButtonBar.buttonData="FINISH" defaultButton="true" onAction="#unlock" contentDisplay="${controller.unlockButtonState}" disable="${controller.unlockButtonDisabled}">
|
||||
<graphic>
|
||||
<ProgressIndicator progress="-1" prefWidth="12" prefHeight="12"/>
|
||||
|
||||
@@ -52,5 +52,6 @@
|
||||
<fx:include VBox.vgrow="ALWAYS" source="vault_detail_unlocked.fxml" visible="${controller.vault.unlocked}" managed="${controller.vault.unlocked}"/>
|
||||
<fx:include VBox.vgrow="ALWAYS" source="vault_detail_missing.fxml" visible="${controller.vault.missing}" managed="${controller.vault.missing}"/>
|
||||
<fx:include VBox.vgrow="ALWAYS" source="vault_detail_needsmigration.fxml" visible="${controller.vault.needsMigration}" managed="${controller.vault.needsMigration}"/>
|
||||
<fx:include VBox.vgrow="ALWAYS" source="vault_detail_unknownerror.fxml" visible="${controller.vault.unknownError}" managed="${controller.vault.unknownError}"/>
|
||||
</children>
|
||||
</VBox>
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.TextArea?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<VBox xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
fx:controller="org.cryptomator.ui.mainwindow.VaultDetailUnknownErrorController"
|
||||
alignment="CENTER"
|
||||
spacing="24">
|
||||
<children>
|
||||
<Label text="%generic.error.title" wrapText="true"/>
|
||||
<Label text="%generic.error.instruction" wrapText="true"/>
|
||||
|
||||
<TextArea VBox.vgrow="ALWAYS" text="${controller.stackTrace}" prefRowCount="5" editable="false"/>
|
||||
</children>
|
||||
</VBox>
|
||||
@@ -13,8 +13,8 @@
|
||||
<ImageView VBox.vgrow="ALWAYS" fitHeight="128" preserveRatio="true" smooth="true" cache="true">
|
||||
<Image url="/bot.png"/>
|
||||
</ImageView>
|
||||
|
||||
<TextFlow prefWidth="-Infinity" visible="${controller.noVaultPresent}" managed="${controller.noVaultPresent}">
|
||||
|
||||
<TextFlow styleClass="text-flow" prefWidth="-Infinity" visible="${controller.noVaultPresent}" managed="${controller.noVaultPresent}">
|
||||
<Text text="%main.vaultDetail.welcomeOnboarding"/>
|
||||
<Text text=" "/>
|
||||
<Hyperlink text="docs.cryptomator.org" styleClass="hyperlink-underline" onAction="#visitGettingStartedGuide"/>
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
<Label text="%wrongFileAlert.instruction.2" wrapText="true"/>
|
||||
<Label text="%wrongFileAlert.instruction.3" wrapText="true"/>
|
||||
</VBox>
|
||||
<TextFlow>
|
||||
<TextFlow styleClass="text-flow">
|
||||
<Text text="%wrongFileAlert.link"/>
|
||||
<Text text=" "/>
|
||||
<Hyperlink styleClass="hyperlink-underline" text="docs.cryptomator.org" onAction="#openDocumentation"/>
|
||||
|
||||
@@ -108,6 +108,7 @@ migration.start.confirm=Yes, my vault is fully synced
|
||||
## Run
|
||||
migration.run.enterPassword=Enter the password for "%s"
|
||||
migration.run.startMigrationBtn=Migrate Vault
|
||||
migration.run.progressHint=This might take some time…
|
||||
## Sucess
|
||||
migration.success.nextStepsInstructions=Migrated "%s" successfully.\nYou can now unlock your vault.
|
||||
migration.success.unlockNow=Unlock Now
|
||||
@@ -116,6 +117,12 @@ migration.error.missingFileSystemCapabilities.title=Unsupported File System
|
||||
migration.error.missingFileSystemCapabilities.description=Migration was not started, because your vault is located on an inadequate file system.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=The file system does not support long file names.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=The file system does not support long paths.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=The file system does not allow to be read.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=The file system does not allow to be written to.
|
||||
## Impossible
|
||||
migration.impossible.heading=Unable to migrate vault
|
||||
migration.impossible.reason=The vault cannot be automatically migrated because its storage location or access point is not compatible.
|
||||
migration.impossible.moreInfo=The vault can still be opened with an older version. For instructions on how to manually migrate a vault, visit
|
||||
|
||||
# Preferences
|
||||
preferences.title=Preferences
|
||||
@@ -191,7 +198,7 @@ wrongFileAlert.instruction.0=To encrypt files, follow these steps:
|
||||
wrongFileAlert.instruction.1=1. Unlock your vault.
|
||||
wrongFileAlert.instruction.2=2. Click on "Reveal" to open the volume in your file manager.
|
||||
wrongFileAlert.instruction.3=3. Add your files to this volume.
|
||||
wrongFileAlert.link=For futher assistance, visit
|
||||
wrongFileAlert.link=For further assistance, visit
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
|
||||
@@ -190,7 +190,7 @@ wrongFileAlert.instruction.0=لتشفير الملفات، قم باتباع ا
|
||||
wrongFileAlert.instruction.1=1. فتح المخزن الخاص بك.
|
||||
wrongFileAlert.instruction.2=2. انقر على "إظهار" لفتح المجلد في مدير الملفات الخاص بك.
|
||||
wrongFileAlert.instruction.3=3. أضف ملفاتك إلى هذا المجلد.
|
||||
wrongFileAlert.link=للحصول على مساعدة اضافية، قم بزيارة
|
||||
wrongFileAlert.link=لمزيد من المساعدة، قم بزيارة
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
|
||||
243
main/ui/src/main/resources/i18n/strings_ca.properties
Normal file
243
main/ui/src/main/resources/i18n/strings_ca.properties
Normal file
@@ -0,0 +1,243 @@
|
||||
# Locale Specific CSS files such as CJK, RTL,...
|
||||
|
||||
# Generics
|
||||
## Button
|
||||
generic.button.apply=Aplica
|
||||
generic.button.back=Enrere
|
||||
generic.button.cancel=Cancel·la
|
||||
generic.button.change=Canvia
|
||||
generic.button.close=Tanca
|
||||
generic.button.copy=Copia
|
||||
generic.button.copied=Copiat!
|
||||
generic.button.done=Fet
|
||||
generic.button.next=Següent
|
||||
generic.button.print=Imprimeix
|
||||
## Error
|
||||
generic.error.title=S'ha produït un error inesperat
|
||||
generic.error.instruction=Això no hauria d'haver passat. Si us plau, informeu del text de l'error i inclogueu una descripció de quins passos han dut a aquest error.
|
||||
|
||||
# Tray Menu
|
||||
traymenu.showMainWindow=Mostra
|
||||
traymenu.showPreferencesWindow=Preferències
|
||||
traymenu.lockAllVaults=Bloqueja tot
|
||||
traymenu.quitApplication=Surt
|
||||
traymenu.vault.unlock=Desbloqueja
|
||||
traymenu.vault.lock=Bloqueja
|
||||
traymenu.vault.reveal=Mostra
|
||||
|
||||
# Add Vault Wizard
|
||||
addvaultwizard.title=Afegir una caixa forta
|
||||
## Welcome
|
||||
addvaultwizard.welcome.newButton=Crea una caixa forta nova
|
||||
addvaultwizard.welcome.existingButton=Obri una caixa forta existent
|
||||
## New
|
||||
### Name
|
||||
addvaultwizard.new.nameInstruction=Introduiu el nom de la caixa forta
|
||||
addvaultwizard.new.namePrompt=Nom de la caixa forta
|
||||
### Location
|
||||
addvaultwizard.new.locationInstruction=On deu emmagatzemar Cryptomator els fitxers xifrats de la vostra caixa forta?
|
||||
addvaultwizard.new.locationLabel=Ubicació de l'emmagatzematge
|
||||
addvaultwizard.new.locationPrompt=…
|
||||
addvaultwizard.new.directoryPickerLabel=Ubicació personalitzada
|
||||
addvaultwizard.new.directoryPickerButton=Trieu…
|
||||
addvaultwizard.new.directoryPickerTitle=Seleccioneu el directori
|
||||
addvaultwizard.new.fileAlreadyExists=No es pot crear una caixa forta en aquest camí perquè ja hi ha algun objecte.
|
||||
addvaultwizard.new.invalidName=El nom de la caixa forta no és vàlid. Si us plau, escribiu un mom de directori amb caràcters estàndard.
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=Crea la caixa forta
|
||||
addvaultwizard.new.generateRecoveryKeyChoice=No podreu accedir a les vostres dades sense la contrasenya. Voleu crear una clau de recuperació en cas perdre la vostra contrasenya?
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.yes=Sí, si us plau. Val més prevenir que guarir.
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.no=No, gràcies. No predré la meva contrasenya
|
||||
### Information
|
||||
addvault.new.readme.storageLocation.fileName=IMPORTANT.rtf
|
||||
addvault.new.readme.storageLocation.1=⚠️ FITXERS DE LA CAIXA FORTA ⚠️
|
||||
addvault.new.readme.storageLocation.2=Aquesta és la ubicació d'emmagatzematge de la vostra caixa forta.
|
||||
addvault.new.readme.storageLocation.3=NO
|
||||
addvault.new.readme.storageLocation.4=• modifiqueu cap fitxer dins d'aquest directori ni
|
||||
addvault.new.readme.storageLocation.5=• enganxeu cap fitxer a xifrar en aquest directori.
|
||||
addvault.new.readme.storageLocation.6=Si voleu xifrar fitxers i veure el contigut de la caixa forta, feu el següent:
|
||||
addvault.new.readme.storageLocation.7=1. Afegiu aquesta caixa forta a Cryptomator.
|
||||
addvault.new.readme.storageLocation.8=2. Desbloquejeu la caixa forta enCryptomator.
|
||||
addvault.new.readme.storageLocation.9=3. Feu click damunt del botó "Mostra" per obrir la ubicació d'accès.
|
||||
addvault.new.readme.storageLocation.10=Si us cal ajuda, llegiu la documentació: %s
|
||||
addvault.new.readme.accessLocation.fileName=BENVINGUTS.rtf
|
||||
addvault.new.readme.accessLocation.1=🔐️ VOLUM XIFRAT 🔐️
|
||||
addvault.new.readme.accessLocation.2=Aquesta és la ubicació d'accès de la vostra caixa forta.
|
||||
addvault.new.readme.accessLocation.3=Cryptomator xifra tots els fitxers afegits a aquest volum. Podeu treballar en aquest volum com en qualsevol altra unitat o carpeta. La vista mostra el contingut desxifrat però els fitxers sempre estan xifrats en el vostre disc dur.
|
||||
addvault.new.readme.accessLocation.4=Pots esborrar aquest fitxer si vols.
|
||||
## Existing
|
||||
addvaultwizard.existing.instruction=Seleccioneu el fitxer "masterkey.cryptomator" de la vostra caixa forta.
|
||||
addvaultwizard.existing.chooseBtn=Trieu…
|
||||
addvaultwizard.existing.filePickerTitle=Seleccioneu el fitxer Masterkey
|
||||
## Success
|
||||
addvaultwizard.success.nextStepsInstructions=S'ha afegit la caixa forta "%s".\nHeu de desbloquejar-la si voleu accedir-hi o afegir nou contingut. També podeu desbloquejar-la en qualsevol altre moment.
|
||||
addvaultwizard.success.unlockNow=Desbloqueja ara
|
||||
|
||||
# Remove Vault
|
||||
removeVault.title=Elimina la caixa forta
|
||||
removeVault.information=Cryptomator simplement deixarà de mostrar la caixa forta. Podeu tornar a afegir-la més endavant. Cap fitxer xifrat serà eliminat del disc dur.
|
||||
removeVault.confirmBtn=Elimina la caixa forta
|
||||
|
||||
# Change Password
|
||||
changepassword.title=Canvia la contrasenya
|
||||
changepassword.enterOldPassword=Introduïu la contrasenya actual per a "%s"
|
||||
changepassword.finalConfirmation=Entenc que no podré accedir les meves dades si oblido la meva contrasenya
|
||||
|
||||
# Forget Password
|
||||
forgetPassword.title=He oblidat la contrasenya
|
||||
forgetPassword.information=Això eliminarà la contrasenya desada d'aquesta caixa forta del vostre clauer.
|
||||
forgetPassword.confirmBtn=He oblidat la contrasenya
|
||||
|
||||
# Unlock
|
||||
unlock.title=Desbloquejar la caixa forta
|
||||
unlock.passwordPrompt=Introduïu la contrasenya de "%s":
|
||||
unlock.savePassword=Recorda la contrasenya
|
||||
unlock.unlockBtn=Desbloqueja
|
||||
## Success
|
||||
unlock.success.message="%s" s'ha desbloquejat correctament! Ja es pot accedir a la caixa forta.
|
||||
unlock.success.revealBtn=Mostra la caixa forta
|
||||
## Invalid Mount Point
|
||||
unlock.error.invalidMountPoint=El punt de muntatge no és un directori buit: %s
|
||||
|
||||
# Migration
|
||||
migration.title=Actualitza la caixa forta
|
||||
## Start
|
||||
migration.start.prompt=La vostra caixa forta "%s" ha de ser actualitzada a un format més nou. Abans de continuar, assegureu-vos de que no hi haja cap sincronització pendent que puga afectar a aquesta caixa forta.
|
||||
migration.start.confirm=Sí, la meua caixa forta està completament sicronitzada
|
||||
## Run
|
||||
migration.run.enterPassword=Introduïu la contrasenya per a "%s"
|
||||
migration.run.startMigrationBtn=Migrar la caixa forta
|
||||
## Sucess
|
||||
migration.success.nextStepsInstructions="%s" s'ha migrat correctament.\nJa podeu desbloquejar la vostra caixa forta.
|
||||
migration.success.unlockNow=Desbloqueja ara
|
||||
## Missing file system capabilities
|
||||
migration.error.missingFileSystemCapabilities.title=El sistema de fitxers no és admès
|
||||
migration.error.missingFileSystemCapabilities.description=La migració no s'ha iniciat perquè la vostra caixa forta es troba en un sistema de fitxers no compatible.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=El sistema de fitxers no suporta noms de fitxers llargs.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=El sistema de fitxers no suporta camins llargs.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=El sistema de fitxers no permet la lectura.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=El sistema de fitxers no permet l'escriptura.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Preferències
|
||||
## General
|
||||
preferences.general=General
|
||||
preferences.general.theme=Apariència
|
||||
preferences.general.unlockThemes=Desbloqueja el tema fosc
|
||||
preferences.general.startHidden=Amaga la finestra al iniciar Cryptomator
|
||||
preferences.general.debugLogging=Habilita el registre de depuració
|
||||
preferences.general.autoStart=Executa Cryptomator en engegar el sistema
|
||||
preferences.general.interfaceOrientation=Orientació de la interfície
|
||||
preferences.general.interfaceOrientation.ltr=Esquerra a dreta
|
||||
preferences.general.interfaceOrientation.rtl=Dreta a esquerra
|
||||
## Volume
|
||||
preferences.volume=Unitat virtual
|
||||
preferences.volume.type=Tipus de volum
|
||||
preferences.volume.webdav.port=Port WebDAV
|
||||
preferences.volume.webdav.scheme=Esquema WebDAV
|
||||
## Updates
|
||||
preferences.updates=Actualitzacions
|
||||
preferences.updates.currentVersion=Versió actual: %s
|
||||
preferences.updates.autoUpdateCheck=Comprova automàticament si hi ha actualitzacions
|
||||
preferences.updates.checkNowBtn=Comprova-ho ara
|
||||
preferences.updates.updateAvailable=L'actualització a la versió %s es troba disponible.
|
||||
## Donation Key
|
||||
preferences.donationKey=Donacions
|
||||
preferences.donationKey.registeredFor=Registrat per %s
|
||||
preferences.donationKey.noDonationKey=No s'ha trobar una clau de donació vàlida. És sembla a una clau de llicència però per gent meravellosa qui utilitza programari lliure. ;-)
|
||||
preferences.donationKey.getDonationKey=Obtingau una clau de donació
|
||||
## About
|
||||
preferences.about=Quant a
|
||||
|
||||
# Main Window
|
||||
main.closeBtn.tooltip=Tanca
|
||||
main.minimizeBtn.tooltip=Minimitza
|
||||
main.preferencesBtn.tooltip=Preferències
|
||||
main.donationKeyMissing.tooltip=Si us plau, considereu fer una donació
|
||||
## Drag 'n' Drop
|
||||
main.dropZone.dropVault=Afegeix aquesta caixa forta
|
||||
main.dropZone.unknownDragboardContent=Si voleu afegir una caixa forta, arrossegueu-la a aquesta finestra
|
||||
## Vault List
|
||||
main.vaultlist.emptyList.onboardingInstruction=Feu clic aquí per afegir una caixa forta
|
||||
main.vaultlist.contextMenu.remove=Elimina la caixa forta
|
||||
main.vaultlist.addVaultBtn=Afegir una caixa forta
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Gràcies per escollir Cryptomator per protegir els vostres fitxers. Si vos cal ajuda, llegiu les nostres guies per donar els Primers passos:
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=BLOQUEJADA
|
||||
main.vaultDetail.unlockBtn=Desbloqueja
|
||||
main.vaultDetail.optionsBtn=Opcions de la caixa forta
|
||||
### Unlocked
|
||||
main.vaultDetail.unlockedStatus=DESBLOQUEJADA
|
||||
main.vaultDetail.accessLocation=Els continguts de la vostra caixa forta són accessibles aquí:
|
||||
main.vaultDetail.revealBtn=Mostra la unitat
|
||||
main.vaultDetail.lockBtn=Bloqueja
|
||||
main.vaultDetail.bytesPerSecondRead=lectura:
|
||||
main.vaultDetail.bytesPerSecondWritten=escriptura:
|
||||
main.vaultDetail.throughput.idle=inactiu
|
||||
main.vaultDetail.throughput.kbps=%.1f kiB/s
|
||||
main.vaultDetail.throughput.mbps=%.1f MiB/s
|
||||
### Missing
|
||||
main.vaultDetail.missing.info=Cryptomator no ha trobat una caixa forta en aquest camí.
|
||||
### Needs Migration
|
||||
main.vaultDetail.migrateButton=Actualitza la caixa forta
|
||||
main.vaultDetail.migratePrompt=Per accedir a la vostra caixa forta abans cal actualitzar-la al nou format
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.title=Com xifrar fitxers
|
||||
wrongFileAlert.header.title=Heu intentat xifrar aquests fitxers?
|
||||
wrongFileAlert.header.lead=Per aconseguir tal fi, Cryptomator crea un volum en el vostre gestor de fitxers del sistema.
|
||||
wrongFileAlert.instruction.0=Sigau aquests pasos per xifrar fitxers:
|
||||
wrongFileAlert.instruction.1=1. Desbloquejeu la caixa forta.
|
||||
wrongFileAlert.instruction.2=2. Feu clic en "Mostrar" per obrir el volum en el vostre gestor de fitxers.
|
||||
wrongFileAlert.instruction.3=3. Afegiu fitxers al volum.
|
||||
wrongFileAlert.link=Per rebre assistència, visiteu
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
vaultOptions.general=General
|
||||
vaultOptions.general.unlockAfterStartup=Desbloqueja la caixa forta al iniciar Cryptomator
|
||||
## Mount
|
||||
vaultOptions.mount=Muntatge
|
||||
vaultOptions.mount.readonly=Només lectura
|
||||
vaultOptions.mount.driveName=Nom de la unitat
|
||||
vaultOptions.mount.customMountFlags=Senyaladors de muntatge personalitzats
|
||||
vaultOptions.mount.winDriveLetterOccupied=ocupat
|
||||
vaultOptions.mount.mountPoint=Punt de muntatge
|
||||
vaultOptions.mount.mountPoint.auto=Tria automàticament una ubicació adequada
|
||||
vaultOptions.mount.mountPoint.driveLetter=Utilitza la lletra de la unitat assignada
|
||||
vaultOptions.mount.mountPoint.custom=Camí personalitzat
|
||||
vaultOptions.mount.mountPoint.directoryPickerButton=Trieu…
|
||||
vaultOptions.mount.mountPoint.directoryPickerTitle=Esculliu un directori buit
|
||||
## Master Key
|
||||
vaultOptions.masterkey=Contrasenya
|
||||
vaultOptions.masterkey.changePasswordBtn=Canvi de contrasenya
|
||||
vaultOptions.masterkey.recoveryKeyExpanation=La clau de recuperació és l'unic mitjà de restaurar l'accès a la caixa forta en cas de perdre la contrasenya.
|
||||
vaultOptions.masterkey.showRecoveryKeyBtn=Mostra la clau de recuperació
|
||||
vaultOptions.masterkey.recoverPasswordBtn=Recupera la contrasenya
|
||||
|
||||
# Recovery Key
|
||||
recoveryKey.title=Clau de recuperació
|
||||
recoveryKey.enterPassword.prompt=Introduïu la vostra clau per mostrar la clau de recuperació de "%s":
|
||||
recoveryKey.display.message=Utilitzeu la següent clau de recuperació per restaurar l'accès a "%s":
|
||||
recoveryKey.display.StorageHints=Conserveu-la en un lloc molt segur. P. ex.:\n • Emmagatzemeu-la utilitzant un gestor de claus\n • Deseu-la en una memòria USB\n • Imprimiu-la en paper
|
||||
recoveryKey.recover.prompt=Introduïu la vostra clau de recuperació de "%s":
|
||||
recoveryKey.recover.validKey=La clau de recuperació és vàlida
|
||||
recoveryKey.printout.heading=Clau de recuperació de Cryptomator\n"%s"\n
|
||||
|
||||
# New Password
|
||||
newPassword.promptText=Introdueix una contrasenya nova
|
||||
newPassword.reenterPassword=Confirma la nova contrasenya
|
||||
newPassword.passwordsMatch=Les contrasenyes coincideixen!
|
||||
newPassword.passwordsDoNotMatch=Les contrasenyes no coincideixen
|
||||
passwordStrength.messageLabel.tooShort=Cal un mínim de %d caràcters
|
||||
passwordStrength.messageLabel.0=Molt poc segura
|
||||
passwordStrength.messageLabel.1=Poc segura
|
||||
passwordStrength.messageLabel.2=Suficient
|
||||
passwordStrength.messageLabel.3=Segura
|
||||
passwordStrength.messageLabel.4=Molt segura
|
||||
|
||||
# Quit
|
||||
quit.prompt=Sortir de l'aplicació? Hi ha voltes debloquejades.
|
||||
quit.lockAndQuit=Bloqueja i surt
|
||||
@@ -59,6 +59,7 @@ addvault.new.readme.storageLocation.6=Pokud chcete zašifrovat soubory a zobrazi
|
||||
addvault.new.readme.storageLocation.7=1. Přidejte tento trezor do Cryptomator.
|
||||
addvault.new.readme.storageLocation.8=2. Odemkněte trezor v Cryptomator.
|
||||
addvault.new.readme.storageLocation.9=3. Otevřete umístění přístupu kliknutím na tlačítko "Reveal".
|
||||
addvault.new.readme.storageLocation.10=Pokud potřebujete pomoc, navštivte dokumentaci: %s
|
||||
addvault.new.readme.accessLocation.fileName=VÍTEJ.rtf
|
||||
addvault.new.readme.accessLocation.1=🔐️ ZAŠIFROVANÁ JEDNOTKA 🔐️
|
||||
addvault.new.readme.accessLocation.2=Toto je místo přístupu vašeho trezoru.
|
||||
@@ -80,6 +81,7 @@ removeVault.confirmBtn=Odstranit trezor
|
||||
# Change Password
|
||||
changepassword.title=Změnit heslo
|
||||
changepassword.enterOldPassword=Zadejte současné heslo pro "%s"
|
||||
changepassword.finalConfirmation=Chápu, že pokud zapomenu své heslo, nebudu mít přístup k mým datům
|
||||
|
||||
# Forget Password
|
||||
forgetPassword.title=Zapomenout heslo
|
||||
@@ -113,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=Nepodporovaný souborový sy
|
||||
migration.error.missingFileSystemCapabilities.description=Migrace nebyla zahájena, protože váš trezor je umístěn na nedostatečném souborovém systému.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Souborový systém nepodporuje dlouhá jména souborů.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Souborový systém nepodporuje dlouhé cesty.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Souborový systém neumožňuje čtení.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Souborový systém neumožňuje zápis.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Nastavení
|
||||
@@ -143,6 +147,7 @@ preferences.donationKey.registeredFor=Registrováno na: %s
|
||||
preferences.donationKey.noDonationKey=Nebyl nalezen žádný platný darovací klíč. Je to jako licenční klíč, ale pro úžasné lidi využívající software zadarmo. ;-)
|
||||
preferences.donationKey.getDonationKey=Získat darovací klíč
|
||||
## About
|
||||
preferences.about=O aplikaci
|
||||
|
||||
# Main Window
|
||||
main.closeBtn.tooltip=Zavřít
|
||||
@@ -153,7 +158,7 @@ main.donationKeyMissing.tooltip=Prosím, zvažte darování
|
||||
main.dropZone.dropVault=Přidat tento trezor
|
||||
main.dropZone.unknownDragboardContent=Pokud chcete přidat trezor, přetáhněte jej do tohoto okna
|
||||
## Vault List
|
||||
main.vaultlist.emptyList.onboardingInstruction=Klikněte sem pro přidání nového trezoru
|
||||
main.vaultlist.emptyList.onboardingInstruction=Klikněte zde pro přidání nového trezoru
|
||||
main.vaultlist.contextMenu.remove=Odstranit trezor
|
||||
main.vaultlist.addVaultBtn=Přidat trezor
|
||||
## Vault Detail
|
||||
@@ -180,6 +185,14 @@ main.vaultDetail.migrateButton=Upgrade trezoru
|
||||
main.vaultDetail.migratePrompt=Váš trezor musí být aktualizován na nový formát, než k němu budete mít přístup
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.title=Jak šifrovat soubory
|
||||
wrongFileAlert.header.title=Pokusili jste se tyto soubory zašifrovat?
|
||||
wrongFileAlert.header.lead=Pro tento účel Cryptomator vytvoří jednotku ve vašem systémovém správci souborů.
|
||||
wrongFileAlert.instruction.0=Pro zašifrování souborů postupujte následovně:
|
||||
wrongFileAlert.instruction.1=1. Odemkni svůj trezor.
|
||||
wrongFileAlert.instruction.2=2. Klikněte na "Zobrazit" pro otevření jednotky ve správci souborů.
|
||||
wrongFileAlert.instruction.3=3. Přidejte své soubory do této jednotky.
|
||||
wrongFileAlert.link=Pro další informace navštivte
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
@@ -190,10 +203,10 @@ vaultOptions.mount=Připojení
|
||||
vaultOptions.mount.readonly=Pouze pro čtení
|
||||
vaultOptions.mount.driveName=Jméno jednotky
|
||||
vaultOptions.mount.customMountFlags=Vlastní parametry
|
||||
vaultOptions.mount.winDriveLetterOccupied=obsazené
|
||||
vaultOptions.mount.winDriveLetterOccupied=obsazeno
|
||||
vaultOptions.mount.mountPoint=Přípojný bod
|
||||
vaultOptions.mount.mountPoint.auto=Automaticky vybrat vhodné místo
|
||||
vaultOptions.mount.mountPoint.driveLetter=Použít přiřazené písmeno
|
||||
vaultOptions.mount.mountPoint.driveLetter=Použít zvolenou jednotku
|
||||
vaultOptions.mount.mountPoint.custom=Vlastní cesta
|
||||
vaultOptions.mount.mountPoint.directoryPickerButton=Vybrat...
|
||||
vaultOptions.mount.mountPoint.directoryPickerTitle=Vyberte prázdný adresář
|
||||
|
||||
@@ -115,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=Nicht unterstütztes Dateisy
|
||||
migration.error.missingFileSystemCapabilities.description=Die Migration wurde nicht gestartet, da sich dein Tresor auf einem ungeeigneten Dateisystem befindet.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Das Dateisystem unterstützt keine langen Dateinamen.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Das Dateisystem unterstützt keine langen Pfadnamen.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Das Dateisystem lässt keine Lesevorgänge zu.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Das Dateisystem lässt keine Schreibvorgänge zu.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Einstellungen
|
||||
@@ -143,7 +145,7 @@ preferences.updates.updateAvailable=Update auf Version %s verfügbar.
|
||||
preferences.donationKey=Spende
|
||||
preferences.donationKey.registeredFor=Registriert für %s
|
||||
preferences.donationKey.noDonationKey=Kein gültiger Spendenschlüssel gefunden. Er ist wie ein Lizenzschlüssel, aber für tolle Leute, die freie Software verwenden. ;-)
|
||||
preferences.donationKey.getDonationKey=Einen Spendenschlüssel erhalten
|
||||
preferences.donationKey.getDonationKey=Hol dir einen Spendenschlüssel
|
||||
## About
|
||||
preferences.about=Über
|
||||
|
||||
@@ -151,7 +153,7 @@ preferences.about=Über
|
||||
main.closeBtn.tooltip=Schließen
|
||||
main.minimizeBtn.tooltip=Minimieren
|
||||
main.preferencesBtn.tooltip=Einstellungen
|
||||
main.donationKeyMissing.tooltip=Bitte denke über eine Spende nach
|
||||
main.donationKeyMissing.tooltip=Zieh bitte eine Spende in Betracht
|
||||
## Drag 'n' Drop
|
||||
main.dropZone.dropVault=Diesen Tresor hinzufügen
|
||||
main.dropZone.unknownDragboardContent=Wenn Sie einen Tresor hinzufügen möchten, ziehen Sie ihn in dieses Fenster
|
||||
@@ -161,7 +163,7 @@ main.vaultlist.contextMenu.remove=Tresor entfernen
|
||||
main.vaultlist.addVaultBtn=Tresor hinzufügen
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Danke, dass du zum Schützen deiner Dateien Cryptomator gewählt hast. Falls du Hilfe brauchst, schau dir unsere Anleitungen an:
|
||||
main.vaultDetail.welcomeOnboarding=Danke, dass du zum Schutz deiner Dateien Cryptomator gewählt hast. Falls du Hilfe brauchst, schau dir unsere Anleitungen an:
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=GESPERRT
|
||||
main.vaultDetail.unlockBtn=Entsperren
|
||||
@@ -180,7 +182,7 @@ main.vaultDetail.throughput.mbps=%.1f MiB/s
|
||||
main.vaultDetail.missing.info=Mit diesem Pfad konnte Cryptomator keinen Tresor finden.
|
||||
### Needs Migration
|
||||
main.vaultDetail.migrateButton=Tresor aktualisieren
|
||||
main.vaultDetail.migratePrompt=Dein Tresor muss auf ein neues Format aktualisiert werden, bevor Du auf ihn zugreifen kannst
|
||||
main.vaultDetail.migratePrompt=Dein Tresor muss auf ein neues Format aktualisiert werden, bevor du auf ihn zugreifen kannst
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.title=Verschlüsseln von Dateien
|
||||
@@ -190,12 +192,12 @@ wrongFileAlert.instruction.0=Folge diesen Schritten, um Dateien zu verschlüssel
|
||||
wrongFileAlert.instruction.1=1. Entsperre deinen Tresor.
|
||||
wrongFileAlert.instruction.2=2. Klicke auf „Anzeigen“, um das Laufwerk in deinem Dateimanager zu öffnen.
|
||||
wrongFileAlert.instruction.3=3. Füge deine Dateien diesem Laufwerk hinzu.
|
||||
wrongFileAlert.link=Für weitere Hilfe besuche
|
||||
wrongFileAlert.link=Für weitere Unterstützung besuche
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
vaultOptions.general=Allgemein
|
||||
vaultOptions.general.unlockAfterStartup=Tresor beim Starten von Cryptomator entsperren
|
||||
vaultOptions.general.unlockAfterStartup=Tresor beim Start von Cryptomator entsperren
|
||||
## Mount
|
||||
vaultOptions.mount=Laufwerk
|
||||
vaultOptions.mount.readonly=Schreibgeschützt
|
||||
|
||||
@@ -115,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=Sistema de archivos no sopor
|
||||
migration.error.missingFileSystemCapabilities.description=La migración no se inició porque la bóveda se encuentra en un sistema de archivos inadecuado.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=El sistema de archivos no soporta nombres largos.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=El sistema de archivos no soporta rutas largas.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=El sistema de archivos no permite la lectura.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=El sistema de archivos no permite la escritura.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Preferencias
|
||||
@@ -190,7 +192,7 @@ wrongFileAlert.instruction.0=Para cifrar archivos, seguir estos pasos:
|
||||
wrongFileAlert.instruction.1=1. Desbloquear la bóveda.
|
||||
wrongFileAlert.instruction.2=2. Hacer clic en "Revelar" para abrir el volumen en el administrador de archivos.
|
||||
wrongFileAlert.instruction.3=3. Añadir los archivos a este volumen.
|
||||
wrongFileAlert.link=Para más ayuda, visitar
|
||||
wrongFileAlert.link=Para más ayuda, visite
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
|
||||
@@ -115,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=Système de fichiers non pri
|
||||
migration.error.missingFileSystemCapabilities.description=La migration n'a pas débuté car votre coffre se trouve dans un système de fichiers inapproprié.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Ce système de fichiers ne prend pas en charge les noms de fichiers longs.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Ce système de fichiers ne prend pas en charge les chemins d'accès longs.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Le système de fichiers ne permet pas d'être lu.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Le système de fichiers ne permet pas l'écriture.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Préférences
|
||||
@@ -190,7 +192,7 @@ wrongFileAlert.instruction.0=Pour chiffrer des fichiers, suivez ces étapes :
|
||||
wrongFileAlert.instruction.1=1. Déverrouillez votre coffre.
|
||||
wrongFileAlert.instruction.2=2. Cliquez sur "Révéler" pour ouvrir le volume dans votre gestionnaire de fichiers.
|
||||
wrongFileAlert.instruction.3=3. Ajoutez vos fichiers à ce volume.
|
||||
wrongFileAlert.link=Pour plus d'assistance, visitez
|
||||
wrongFileAlert.link=Pour toute aide supplémentaire, visitez
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
|
||||
@@ -58,6 +58,7 @@ unlock.unlockBtn=अनलॉक करें
|
||||
## Invalid Mount Point
|
||||
|
||||
# Migration
|
||||
migration.title=वाउल्ट को अपग्रेड करें
|
||||
## Start
|
||||
## Run
|
||||
## Sucess
|
||||
@@ -65,12 +66,14 @@ unlock.unlockBtn=अनलॉक करें
|
||||
|
||||
# Preferences
|
||||
## General
|
||||
preferences.general=सामान्य
|
||||
## Volume
|
||||
## Updates
|
||||
## Donation Key
|
||||
## About
|
||||
|
||||
# Main Window
|
||||
main.closeBtn.tooltip=बंद करें
|
||||
## Drag 'n' Drop
|
||||
## Vault List
|
||||
main.vaultlist.addVaultBtn=वाउल्ट डालें
|
||||
@@ -88,6 +91,7 @@ main.vaultDetail.migrateButton=वाउल्ट को अपग्रेड
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.instruction.1=अपना वाउल्ट खोलें।
|
||||
wrongFileAlert.link=और मदद लिए, यह जाएं
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
|
||||
@@ -115,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=File System non supportato
|
||||
migration.error.missingFileSystemCapabilities.description=La migrazione non è stata avviata perché la cassaforte è situata su un file system inadeguato.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Il file system non supporta nomi di file lunghi.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Il file system non supporta percorsi lunghi.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Il file system non consente di essere letto.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Il file system non consente di essere scritto.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Impostazioni
|
||||
|
||||
@@ -52,7 +52,7 @@ addvaultwizard.new.generateRecoveryKeyChoice.no=いいえ、パスワードを
|
||||
addvault.new.readme.storageLocation.fileName=IMPORTANT.rtf
|
||||
addvault.new.readme.storageLocation.1=⚠️ 金庫ファイル ⚠️
|
||||
addvault.new.readme.storageLocation.2=ここは金庫のストレージ場所です。
|
||||
addvault.new.readme.storageLocation.3=しないでください:
|
||||
addvault.new.readme.storageLocation.3=次のことをしないでください:
|
||||
addvault.new.readme.storageLocation.4=• このディレクトリ内のファイルを変更
|
||||
addvault.new.readme.storageLocation.5=• このディレクトリに暗号化するファイルを張り付け。
|
||||
addvault.new.readme.storageLocation.6=ファイルを暗号化したり金庫の内容を確認するには、次の方法に従ってください:
|
||||
@@ -115,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=サポートされないフ
|
||||
migration.error.missingFileSystemCapabilities.description=金庫が不適切なファイルシステムにあるため、移行が開始されませんでした。
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=ファイルシステムが長いファイル名をサポートしていません。
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=ファイルシステムが長いパスをサポートしていません。
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=ファイルシステムによって読み込みが許可されていません。
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=ファイルシステムによって書き込みが許可されていません。
|
||||
|
||||
# Preferences
|
||||
preferences.title=設定
|
||||
|
||||
@@ -81,6 +81,7 @@ removeVault.confirmBtn=Vault 제거
|
||||
# Change Password
|
||||
changepassword.title=비밀번호 변경
|
||||
changepassword.enterOldPassword="%s"의 비밀번호를 입력하여 주십시요.
|
||||
changepassword.finalConfirmation=비밀번호를 잊어버리면, 데이터에 접근할 수 없음을 이해했습니다.
|
||||
|
||||
# Forget Password
|
||||
forgetPassword.title=비밀번호 분실
|
||||
@@ -183,6 +184,8 @@ main.vaultDetail.migratePrompt=Vault에 접근하기 전, 새로운 포멧으로
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.title=파일 암호화 방법
|
||||
wrongFileAlert.header.title=이 파일들을 암호화하려고 하십니까?
|
||||
wrongFileAlert.header.lead=이 목적을 위해, Cryptomator는 파일 관리자에 볼륨을 제공합니다.
|
||||
wrongFileAlert.instruction.0=파일을 암호화 하려면, 다음의 3단계를 따르십시요:
|
||||
wrongFileAlert.instruction.1=1. Vault의 잠금해제
|
||||
wrongFileAlert.instruction.2=2. 파일 관리자에서 열람된 볼륨의 "표시" 버튼 클릭
|
||||
|
||||
243
main/ui/src/main/resources/i18n/strings_lv.properties
Normal file
243
main/ui/src/main/resources/i18n/strings_lv.properties
Normal file
@@ -0,0 +1,243 @@
|
||||
# Locale Specific CSS files such as CJK, RTL,...
|
||||
|
||||
# Generics
|
||||
## Button
|
||||
generic.button.apply=Pielietot
|
||||
generic.button.back=Atpakaļ
|
||||
generic.button.cancel=Atcelt
|
||||
generic.button.change=Mainīt
|
||||
generic.button.close=Aizvērt
|
||||
generic.button.copy=Kopēt
|
||||
generic.button.copied=Nokopēts!
|
||||
generic.button.done=Darīts
|
||||
generic.button.next=Tālāk
|
||||
generic.button.print=Drukāt
|
||||
## Error
|
||||
generic.error.title=Radās neparedzēta kļūda
|
||||
generic.error.instruction=Šis vēl nav atgadījies. Lūdzu ziņo zemāk redzamo kļūdas tekstu un iekļauj aprakstu, kas noveda pie šīs kļūdas.
|
||||
|
||||
# Tray Menu
|
||||
traymenu.showMainWindow=Rādīt
|
||||
traymenu.showPreferencesWindow=Iestatījumi
|
||||
traymenu.lockAllVaults=Aizslēgt visu
|
||||
traymenu.quitApplication=Iziet
|
||||
traymenu.vault.unlock=Atslēgt
|
||||
traymenu.vault.lock=Aizslēgt
|
||||
traymenu.vault.reveal=Atklāt
|
||||
|
||||
# Add Vault Wizard
|
||||
addvaultwizard.title=Pievienot glabātuvi
|
||||
## Welcome
|
||||
addvaultwizard.welcome.newButton=Izveidot jaunu glabātuvi
|
||||
addvaultwizard.welcome.existingButton=Atvērt esošu glabātuvi
|
||||
## New
|
||||
### Name
|
||||
addvaultwizard.new.nameInstruction=Izvēlies glabātuves nosaukumu
|
||||
addvaultwizard.new.namePrompt=Glabātuves nosaukums
|
||||
### Location
|
||||
addvaultwizard.new.locationInstruction=Kur Cryptomator vajadzētu glabāt jūsu glabātuves šifrētos failus?
|
||||
addvaultwizard.new.locationLabel=Krātuves atrašanās vieta
|
||||
addvaultwizard.new.locationPrompt=…
|
||||
addvaultwizard.new.directoryPickerLabel=Pielāgota atrašanās vieta
|
||||
addvaultwizard.new.directoryPickerButton=Izvēlies...
|
||||
addvaultwizard.new.directoryPickerTitle=Izvēlēties mapi
|
||||
addvaultwizard.new.fileAlreadyExists=Glabātuvi nevar izveidot šajā ceļā, jo kāds objekts jau pastāv.
|
||||
addvaultwizard.new.invalidName=Nederīgs glabātuves nosaukums. Lūdzu izvēlieties vienkāršu mapes nosaukumu.
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=Izveidot glabātuvi
|
||||
addvaultwizard.new.generateRecoveryKeyChoice=Jūs nevarēsiet piekļūt saviem datiem bez paroles. Vai vēlaties atkopšanas atslēgu gadījumam, kad esat pazaudējis paroli?
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.yes=Jā, lūdzu, labāk droši nekā nekā
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.no=Nē, paldies, es nezaudēšu savu paroli
|
||||
### Information
|
||||
addvault.new.readme.storageLocation.fileName=IMPORTANT.rtf
|
||||
addvault.new.readme.storageLocation.1=⚠️ GLABĀTUVES DATNES ⚠️
|
||||
addvault.new.readme.storageLocation.2=Šī ir jūsu glabātuves atrašanās vieta.
|
||||
addvault.new.readme.storageLocation.3=Nekādā gadījumā
|
||||
addvault.new.readme.storageLocation.4=mainīt visas datnes šajā mapē vai
|
||||
addvault.new.readme.storageLocation.5=ielīmējiet visas datnes šifrēšanai šajā mapē.
|
||||
addvault.new.readme.storageLocation.6=Ja vēlaties šifrēt datnes un skatīt glabātuves saturu, rīkojieties šādi:
|
||||
addvault.new.readme.storageLocation.7=Pievienot šo glabātuvi Cryptomator.
|
||||
addvault.new.readme.storageLocation.8=Atslēgt glabātuvi ar Cryptomator.
|
||||
addvault.new.readme.storageLocation.9=Atveriet piekļuves vietu, noklikšķinot uz pogas "Atklāt".
|
||||
addvault.new.readme.storageLocation.10=Ja hums ir nepieciešama palīdzība, apmeklējiet dokumentāciju: %s
|
||||
addvault.new.readme.accessLocation.fileName=WELCOME.rtf
|
||||
addvault.new.readme.accessLocation.1=🔐️ ŠIFRĒTS SĒJUMS 🔐️
|
||||
addvault.new.readme.accessLocation.2=Šī ir jūsu glabātuves piekļuves vieta.
|
||||
addvault.new.readme.accessLocation.3=Visas šeit pievienotās datnes tiks šifrētas ar Cryptomator. Jūs variet ar to strādāt kā ar jebkuru citu disku/mapi. Šis it tikai atšifrēts satura skats, jūsu dati diskā visu laiku ir šifrēti.
|
||||
addvault.new.readme.accessLocation.4=Jūs variet droši noņemt šo datni.
|
||||
## Existing
|
||||
addvaultwizard.existing.instruction=Izvēlieties "masterkey.cryptomator" datni no jūsu esošās glabātuves.
|
||||
addvaultwizard.existing.chooseBtn=Izvēlies...
|
||||
addvaultwizard.existing.filePickerTitle=Atlasīt galveno atslēgas datni
|
||||
## Success
|
||||
addvaultwizard.success.nextStepsInstructions=Pievienota "%s" glabātuve.\nlai piekļūtu vai pievienotu datus, jums šo glabātuvi ir jāatslēdz. Vai arī jūs to variet atslēgt vēlāk jebkurā laikā.
|
||||
addvaultwizard.success.unlockNow=Atslēgt tagad
|
||||
|
||||
# Remove Vault
|
||||
removeVault.title=Noņemt glabātuvi
|
||||
removeVault.information=Šis tikai liks Cryptomator aizmirst šo glabātuvi. Jūs to variet pievienot vēlāk atkārtoti. Nekādi šifrētie dati no diska netiks dzēsti.
|
||||
removeVault.confirmBtn=Noņemt glabātuvi
|
||||
|
||||
# Change Password
|
||||
changepassword.title=Mainīt paroli
|
||||
changepassword.enterOldPassword=Ievadiet "%s" pašreizējo paroli
|
||||
changepassword.finalConfirmation=Es saprotu, ka paroles aizmiršanas gadījumā, es vairs nevarēšu piekļūt saviem datiem
|
||||
|
||||
# Forget Password
|
||||
forgetPassword.title=Aizmirst paroli
|
||||
forgetPassword.information=Tas dzēsīs saglabāto glabātuves paroli no jūsu sistēmas atslēgu krātuves.
|
||||
forgetPassword.confirmBtn=Aizmirst paroli
|
||||
|
||||
# Unlock
|
||||
unlock.title=Atslēgt glabātuvi
|
||||
unlock.passwordPrompt=Ievadiet "%s" paroli:
|
||||
unlock.savePassword=Saglabāt paroli
|
||||
unlock.unlockBtn=Atslēgt
|
||||
## Success
|
||||
unlock.success.message="%s" sekmīgi atslēgts! Jūsu glabātuve tagad ir pieejama.
|
||||
unlock.success.revealBtn=Atklāt glabātuvi
|
||||
## Invalid Mount Point
|
||||
unlock.error.invalidMountPoint=Montēšanas vieta nav tukša mape: %s
|
||||
|
||||
# Migration
|
||||
migration.title=Jaunināt glabātuvi
|
||||
## Start
|
||||
migration.start.prompt=Jūsu "%s" glabātuvi nepieciešams atjaunināt uz jaunu formātu. Pirms turpiniet, pārliecinieties, ka nav aktīva šīs glabātuves sinhronizācija.
|
||||
migration.start.confirm=Jā, mana glabātuve ir pilnībā sinhronizēta
|
||||
## Run
|
||||
migration.run.enterPassword=Ievadiet "%s" paroli
|
||||
migration.run.startMigrationBtn=Migrēt glabātuvi
|
||||
## Sucess
|
||||
migration.success.nextStepsInstructions="%s" sekmīgi migrēta.\nJūs tagad variet atslēgt jūsu glabātuvi.
|
||||
migration.success.unlockNow=Atslēgt tagad
|
||||
## Missing file system capabilities
|
||||
migration.error.missingFileSystemCapabilities.title=Neatbalstīta datņu sistēma
|
||||
migration.error.missingFileSystemCapabilities.description=Migrācija netika uzsāta, jo jūsu glabātuve atrodās neadekvātā datņu sistēmā.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Datņu sistēma neatbalsta garus datņu nosaukumus.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Datņu sistēma neatbalsta garus ceļu nosaukumus.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Nav atļaujas lasīt no datņu sistēmas.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Nav atļaujas rakstīt datņu sistēmā.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Iestatījumi
|
||||
## General
|
||||
preferences.general=Vispārēji
|
||||
preferences.general.theme=Izskats
|
||||
preferences.general.unlockThemes=Iespējot tumšo režīmu
|
||||
preferences.general.startHidden=Paslēpt logu, kad startē Cryptomator
|
||||
preferences.general.debugLogging=Iespējot atkļūdošanas žurnalēšanu
|
||||
preferences.general.autoStart=Palaist Cryptomator pie sistēmas startēšanas
|
||||
preferences.general.interfaceOrientation=Saskarnes orientācija
|
||||
preferences.general.interfaceOrientation.ltr=Kreisā uz labo
|
||||
preferences.general.interfaceOrientation.rtl=Labā uz kreiso
|
||||
## Volume
|
||||
preferences.volume=Virtuāls disks
|
||||
preferences.volume.type=Sējuma tips
|
||||
preferences.volume.webdav.port=WebDAV ports
|
||||
preferences.volume.webdav.scheme=WebDAV shēma
|
||||
## Updates
|
||||
preferences.updates=Atjauninājumi
|
||||
preferences.updates.currentVersion=Pašreizējā versija: %s
|
||||
preferences.updates.autoUpdateCheck=Automātiski pārbaudīt atjauninājumus
|
||||
preferences.updates.checkNowBtn=Pārbaudīt tagad
|
||||
preferences.updates.updateAvailable=Pieejams atjauninājums uz versiju %s.
|
||||
## Donation Key
|
||||
preferences.donationKey=Ziedojums
|
||||
preferences.donationKey.registeredFor=Reģistrēts uz %s
|
||||
preferences.donationKey.noDonationKey=Nav atrasta derīga ziedojuma atslēga. Tā ir kā licences atslēga , bet priekš satriecošiem cilvēkiem, kas izmanto bezmaksas programmatūru. ;-)
|
||||
preferences.donationKey.getDonationKey=Iegūt ziedojuma atslēgu
|
||||
## About
|
||||
preferences.about=Par lietotni
|
||||
|
||||
# Main Window
|
||||
main.closeBtn.tooltip=Aizvērt
|
||||
main.minimizeBtn.tooltip=Minimizēt
|
||||
main.preferencesBtn.tooltip=Iestatījumi
|
||||
main.donationKeyMissing.tooltip=Lūdzu apsveriet iespēju ziedot
|
||||
## Drag 'n' Drop
|
||||
main.dropZone.dropVault=Pievienot šo glabātuvi
|
||||
main.dropZone.unknownDragboardContent=Ja jūs vēlaties pievienot glabātuvi, velciet to uz šo logu
|
||||
## Vault List
|
||||
main.vaultlist.emptyList.onboardingInstruction=Spied šeit, lai pievienotu glabātuvi
|
||||
main.vaultlist.contextMenu.remove=Noņemt glabātuvi
|
||||
main.vaultlist.addVaultBtn=Pievienot glabātuvi
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Paldies, ka izvēlējāties Cryptomator lai aizsargātu jūsu datus. Ja jums nepieciešama palīdzība, iepazīstieties ar mūsu darba sākšanas ceļvežiem:
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=AIZSLĒGTS
|
||||
main.vaultDetail.unlockBtn=Atslēgt
|
||||
main.vaultDetail.optionsBtn=Glabātuves opcijas
|
||||
### Unlocked
|
||||
main.vaultDetail.unlockedStatus=ATSLĒGTS
|
||||
main.vaultDetail.accessLocation=Jūsu glabātuves saturs ir pieejams šeit:
|
||||
main.vaultDetail.revealBtn=Atklāt disku
|
||||
main.vaultDetail.lockBtn=Aizslēgt
|
||||
main.vaultDetail.bytesPerSecondRead=nolasīts:
|
||||
main.vaultDetail.bytesPerSecondWritten=ierakstīts:
|
||||
main.vaultDetail.throughput.idle=dīkstāvē
|
||||
main.vaultDetail.throughput.kbps=%.1f kiB/s
|
||||
main.vaultDetail.throughput.mbps=%.1f MiB/s
|
||||
### Missing
|
||||
main.vaultDetail.missing.info=Cryptomator šajā ceļā nevarēja atrast glabātuvi.
|
||||
### Needs Migration
|
||||
main.vaultDetail.migrateButton=Jaunināt glabātuvi
|
||||
main.vaultDetail.migratePrompt=Lai jūsu varētu piekļūt glabātuvei to ir nepieciešms jaunināt uz jaunu formātu
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.title=Kā šifrēt datnes
|
||||
wrongFileAlert.header.title=Vai jūs mēģinājāt šifrēt šīs datnes?
|
||||
wrongFileAlert.header.lead=Šim nolūkam Cryptomator jūsu sistēmas datņu pārvaldniekā nodrošina sējumus.
|
||||
wrongFileAlert.instruction.0=Lai šifrētu datnes, sekojiet šiem soļiem:
|
||||
wrongFileAlert.instruction.1=1. Atslēdziet jūsu glabātuvi.
|
||||
wrongFileAlert.instruction.2=2. Spiediet uz "Atklāt", lai atvērtu sējumu jūsu datņu pārvaldniekā.
|
||||
wrongFileAlert.instruction.3=Šim sējumam pievienojiet jūsu datnes.
|
||||
wrongFileAlert.link=Lai iegūtu turpmāku palīdzību, apmeklējiet
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
vaultOptions.general=Vispārēji
|
||||
vaultOptions.general.unlockAfterStartup=Atslēgt glabātuvi startējot Cryptomator
|
||||
## Mount
|
||||
vaultOptions.mount=Montē
|
||||
vaultOptions.mount.readonly=Tikai lasīt
|
||||
vaultOptions.mount.driveName=Diska nosaukums
|
||||
vaultOptions.mount.customMountFlags=Pielāgoti montēšanas parametri
|
||||
vaultOptions.mount.winDriveLetterOccupied=aizņemts
|
||||
vaultOptions.mount.mountPoint=Montēšanas vieta
|
||||
vaultOptions.mount.mountPoint.auto=Automātiski izvēlieties piemērotu vietu
|
||||
vaultOptions.mount.mountPoint.driveLetter=Izmantot piešķirtu diska burtu
|
||||
vaultOptions.mount.mountPoint.custom=Pielāgots ceļš
|
||||
vaultOptions.mount.mountPoint.directoryPickerButton=Izvēlies...
|
||||
vaultOptions.mount.mountPoint.directoryPickerTitle=Izvēlies tukšu mapi
|
||||
## Master Key
|
||||
vaultOptions.masterkey=Parole
|
||||
vaultOptions.masterkey.changePasswordBtn=Mainīt paroli
|
||||
vaultOptions.masterkey.recoveryKeyExpanation=Atkopšanas atslēga ir jūsu vienīgais līdzeklis, lai atjaunotu piekļuvi glabātuvei, ja pazaudējat paroli.
|
||||
vaultOptions.masterkey.showRecoveryKeyBtn=Rādīt atkopšanas atslēgu
|
||||
vaultOptions.masterkey.recoverPasswordBtn=Atjaunot paroli
|
||||
|
||||
# Recovery Key
|
||||
recoveryKey.title=Atjaunošanas atslēga
|
||||
recoveryKey.enterPassword.prompt=Lai parādītu "%s" atjaunošanas atslēgu, ievadiet paroli:
|
||||
recoveryKey.display.message=Šī atjaunošanas atslēga var tikt izmantota, lai atjaunotu "%s":
|
||||
recoveryKey.display.StorageHints=Glabājiet to drošā vietā, piemēram:\n • Uzglabājiet to, izmantojot paroļu pārvaldnieku\n • Saglabājiet to USB zibatmiņā\n • Izdrukājiet to uz papīra
|
||||
recoveryKey.recover.prompt=Ievadiet "%s" atjaunošanas atslēgu:
|
||||
recoveryKey.recover.validKey=Šī ir derīga atjaunošanas atslēga
|
||||
recoveryKey.printout.heading=Cryptomator atjaunošanas atslēga\n"%s" \n
|
||||
|
||||
# New Password
|
||||
newPassword.promptText=Ievadiet jauno paroli
|
||||
newPassword.reenterPassword=Apstipriniet jauno paroli
|
||||
newPassword.passwordsMatch=Parole sakrīt!
|
||||
newPassword.passwordsDoNotMatch=Paroles nesakrīt
|
||||
passwordStrength.messageLabel.tooShort=Izmantojiet vismaz %d burtus
|
||||
passwordStrength.messageLabel.0=Ļoti vāja
|
||||
passwordStrength.messageLabel.1=Vāja
|
||||
passwordStrength.messageLabel.2=Vidēja
|
||||
passwordStrength.messageLabel.3=Stipra
|
||||
passwordStrength.messageLabel.4=Ļoti stipra
|
||||
|
||||
# Quit
|
||||
quit.prompt=Aizvērt lietotni? Ir atslēgtas glabātuves.
|
||||
quit.lockAndQuit=Aizslēgt un aizvērt
|
||||
@@ -28,11 +28,11 @@ traymenu.vault.reveal=Gjør synlig
|
||||
# Add Vault Wizard
|
||||
addvaultwizard.title=Legg til hvelv
|
||||
## Welcome
|
||||
addvaultwizard.welcome.newButton=Lag nytt hvelv
|
||||
addvaultwizard.welcome.existingButton=Åpne eksisterende hvelv
|
||||
addvaultwizard.welcome.newButton=Lag et nytt hvelv
|
||||
addvaultwizard.welcome.existingButton=Åpne et eksisterende hvelv
|
||||
## New
|
||||
### Name
|
||||
addvaultwizard.new.nameInstruction=Velg et navn for hvelvet
|
||||
addvaultwizard.new.nameInstruction=Velg et navn på hvelvet
|
||||
addvaultwizard.new.namePrompt=Navn på hvelvet
|
||||
### Location
|
||||
addvaultwizard.new.locationInstruction=Hvor skal Cryptomator lagre de krypterte filene dine?
|
||||
@@ -115,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=Filsystemet er ikke støttet
|
||||
migration.error.missingFileSystemCapabilities.description=Overføringen ble ikke startet fordi hvelvet ditt ligger i et mangelfullt filsystem.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Filsystemet støtter ikke lange filnavn.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Filsystemet støtter ikke lange søkestier.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Filsystemet tillater ikke lesing.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Filsystemet tillater ikke å bli skrevet på.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Innstillinger
|
||||
|
||||
@@ -28,11 +28,11 @@ traymenu.vault.reveal=Gjer synleg
|
||||
# Add Vault Wizard
|
||||
addvaultwizard.title=Legg til kvelv
|
||||
## Welcome
|
||||
addvaultwizard.welcome.newButton=Opprett ny kvelv
|
||||
addvaultwizard.welcome.existingButton=Opne eksisterande kvelv
|
||||
addvaultwizard.welcome.newButton=Opprett ein ny kvelv
|
||||
addvaultwizard.welcome.existingButton=Opn ein eksisterande kvelv
|
||||
## New
|
||||
### Name
|
||||
addvaultwizard.new.nameInstruction=Vel eit namn for kvelven
|
||||
addvaultwizard.new.nameInstruction=Vel eit namn på kvelven
|
||||
addvaultwizard.new.namePrompt=Namn på kvelven
|
||||
### Location
|
||||
addvaultwizard.new.locationInstruction=Kvar skal Cryptomator lagra dei krypterte filene i kvelven din?
|
||||
@@ -115,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=Filsystemet er ikkje støtta
|
||||
migration.error.missingFileSystemCapabilities.description=Migreringen vart ikkje starta fordi kvelven din ligg i eit mangelfullt filsystem.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Filsystemet støttar ikkje lange filnamn.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Filsystemet støttar ikkje lange søkastiar.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Filsystemet tillèt ikkje å bli lese.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Filsystemet tillèt ikkje å bli skrive på.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Innstillingar
|
||||
|
||||
@@ -115,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=Sistema de arquivos não sup
|
||||
migration.error.missingFileSystemCapabilities.description=A migração não foi iniciada porque o seu cofre está localizado em um sistema de arquivos inadequado.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=O sistema de arquivos não suporta arquivos com nome longo.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=O sistema de arquivos não suporta caminhos longos.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=O sistema de arquivos não permite leitura.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=O sistema de arquivos não permite ser gravado.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Preferências
|
||||
|
||||
@@ -7,14 +7,14 @@ generic.button.back=Назад
|
||||
generic.button.cancel=Отмена
|
||||
generic.button.change=Изменить
|
||||
generic.button.close=Закрыть
|
||||
generic.button.copy=Копировать
|
||||
generic.button.copy=Скопировать
|
||||
generic.button.copied=Скопировано!
|
||||
generic.button.done=Готово
|
||||
generic.button.next=Далее
|
||||
generic.button.print=Распечатать
|
||||
## Error
|
||||
generic.error.title=Произошла непредвиденная ошибка
|
||||
generic.error.instruction=Этого не должно было произойти. Пожалуйста, создайте отчет об ошибке ниже и опишите, какие шаги к ней привели.
|
||||
generic.error.instruction=Этого не должно было произойти. Создайте отчёт об ошибке ниже и опишите, какие шаги к ней привели.
|
||||
|
||||
# Tray Menu
|
||||
traymenu.showMainWindow=Показать
|
||||
@@ -38,7 +38,7 @@ addvaultwizard.new.namePrompt=Имя хранилища
|
||||
addvaultwizard.new.locationInstruction=Где Cryptomator должен хранить зашифрованные файлы вашего хранилища?
|
||||
addvaultwizard.new.locationLabel=Место хранения
|
||||
addvaultwizard.new.locationPrompt=…
|
||||
addvaultwizard.new.directoryPickerLabel=Пользовательское расположение
|
||||
addvaultwizard.new.directoryPickerLabel=Своё расположение
|
||||
addvaultwizard.new.directoryPickerButton=Выбрать…
|
||||
addvaultwizard.new.directoryPickerTitle=Выберите каталог
|
||||
addvaultwizard.new.fileAlreadyExists=Хранилище не может быть создано по этому пути, потому что некоторые объекты уже существуют.
|
||||
@@ -46,7 +46,7 @@ addvaultwizard.new.invalidName=Неверное имя хранилища. Ук
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=Создать хранилище
|
||||
addvaultwizard.new.generateRecoveryKeyChoice=Вы не сможете получить доступ к своим данным без пароля. Хотите создать ключ для восстановления на случай потери пароля?
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.yes=Да, пожалуй, лучше так, чем потом сожалеть
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.yes=Да, лучше предостеречься, чем потом жалеть
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.no=Нет, спасибо, я не потеряю свой пароль
|
||||
### Information
|
||||
addvault.new.readme.storageLocation.fileName=ВАЖНО.rtf
|
||||
@@ -55,7 +55,7 @@ addvault.new.readme.storageLocation.2=Это место, где находитс
|
||||
addvault.new.readme.storageLocation.3=НЕТ
|
||||
addvault.new.readme.storageLocation.4=• изменяйте любые файлы в этой папке или
|
||||
addvault.new.readme.storageLocation.5=• добавляйте в эту папку любые файлы для шифрования.
|
||||
addvault.new.readme.storageLocation.6=Если вы хотите зашифровать файлы и просмотреть содержимое хранилища, сделайте следующее:
|
||||
addvault.new.readme.storageLocation.6=Чтобы зашифровать файлы и просмотреть содержимое хранилища, сделайте следующее:
|
||||
addvault.new.readme.storageLocation.7=1. Добавьте это хранилище в Cryptomator.
|
||||
addvault.new.readme.storageLocation.8=2. Разблокируйте хранилище в Cryptomator.
|
||||
addvault.new.readme.storageLocation.9=3. Откройте место доступа, нажав кнопку "Показать".
|
||||
@@ -63,7 +63,7 @@ addvault.new.readme.storageLocation.10=Если вам нужна помощь,
|
||||
addvault.new.readme.accessLocation.fileName=ПРИВЕТСТВИЕ.rtf
|
||||
addvault.new.readme.accessLocation.1=🔐️ ЗАШИФРОВАННЫЙ ТОМ 🔐️
|
||||
addvault.new.readme.accessLocation.2=Это место доступа к вашему хранилищу.
|
||||
addvault.new.readme.accessLocation.3=Любые файлы, добавленные в этот том, будут зашифрованы Cryptomator. Вы можете работать с ним, как с любым другим диском/папкой. Здесь отображается только расшифрованное содержимое тома, ваши файлы остаются зашифрованными на жестком диске постоянно.
|
||||
addvault.new.readme.accessLocation.3=Любые файлы, добавленные в этот том, будут зашифрованы Cryptomator. Вы можете работать с ним как с любым другим диском/папкой. Здесь отображается только расшифрованное содержимое тома, ваши файлы остаются зашифрованными на жёстком диске постоянно.
|
||||
addvault.new.readme.accessLocation.4=Этот файл можно удалить.
|
||||
## Existing
|
||||
addvaultwizard.existing.instruction=Выберите файл "masterkey.cryptomator" из имеющегося хранилища.
|
||||
@@ -85,7 +85,7 @@ changepassword.finalConfirmation=Я понимаю, что не смогу по
|
||||
|
||||
# Forget Password
|
||||
forgetPassword.title=Не помню пароль
|
||||
forgetPassword.information=Это удалит сохраненный пароль от этого хранилища из вашего хранилища ключей.
|
||||
forgetPassword.information=Сохранённый пароль от этого хранилища будет удалён из вашей связки ключей.
|
||||
forgetPassword.confirmBtn=Не помню пароль
|
||||
|
||||
# Unlock
|
||||
@@ -102,8 +102,8 @@ unlock.error.invalidMountPoint=Точка монтирования - не пус
|
||||
# Migration
|
||||
migration.title=Обновить хранилище
|
||||
## Start
|
||||
migration.start.prompt=Хранилище "%s" нужно обновить до более нового формата. Прежде чем продолжить, убедитесь, что нет отложенной синхронизации, которая может повлиять на хранилище.
|
||||
migration.start.confirm=Да, мое хранилище полностью синхронизировано
|
||||
migration.start.prompt=Хранилище "%s" нужно преобразовать в более новый формат. Прежде чем продолжить, убедитесь, что нет отложенной синхронизации, которая может повлиять на хранилище.
|
||||
migration.start.confirm=Да, моё хранилище полностью синхронизировано
|
||||
## Run
|
||||
migration.run.enterPassword=Введите пароль для "%s"
|
||||
migration.run.startMigrationBtn=Перенести хранилище
|
||||
@@ -115,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=Неподдерживаем
|
||||
migration.error.missingFileSystemCapabilities.description=Миграция не была запущена, так как хранилище находится в ненадлежащей файловой системе.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Файловая система не поддерживает длинные имена файлов.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Файловая система не поддерживает длинные пути.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Файловая система не разрешает чтение.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Файловая система не разрешает запись.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Настройки
|
||||
@@ -125,7 +127,7 @@ preferences.general.unlockThemes=Разблокировать тёмный ре
|
||||
preferences.general.startHidden=Скрывать окно при запуске Cryptomator
|
||||
preferences.general.debugLogging=Вести журнал отладки
|
||||
preferences.general.autoStart=Запускать Cryptomator при старте системы
|
||||
preferences.general.interfaceOrientation=Ориентация интерфейса
|
||||
preferences.general.interfaceOrientation=Интерфейс
|
||||
preferences.general.interfaceOrientation.ltr=Слева направо
|
||||
preferences.general.interfaceOrientation.rtl=Справа налево
|
||||
## Volume
|
||||
@@ -151,7 +153,7 @@ preferences.about=О программе
|
||||
main.closeBtn.tooltip=Закрыть
|
||||
main.minimizeBtn.tooltip=Свернуть
|
||||
main.preferencesBtn.tooltip=Настройки
|
||||
main.donationKeyMissing.tooltip=Пожалуйста, обдумайте возможность поддержать приложение
|
||||
main.donationKeyMissing.tooltip=Мы будем рады финансовой помощи
|
||||
## Drag 'n' Drop
|
||||
main.dropZone.dropVault=Добавить это хранилище
|
||||
main.dropZone.unknownDragboardContent=Если вы хотите добавить хранилище, перетащите его в это окно
|
||||
@@ -161,7 +163,7 @@ main.vaultlist.contextMenu.remove=Удалить хранилище
|
||||
main.vaultlist.addVaultBtn=Добавить хранилище
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Спасибо, что выбрали Cryptomator для защиты ваших файлов. Если вам нужна помощь, ознакомьтесь с нашими руководствами по началу работы:
|
||||
main.vaultDetail.welcomeOnboarding=Благодарим за выбор Cryptomator для защиты ваших файлов. Если требуется помощь, ознакомьтесь с документацией по началу работы:
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=ЗАБЛОКИРОВАНО
|
||||
main.vaultDetail.unlockBtn=Разблокировать
|
||||
@@ -180,15 +182,15 @@ main.vaultDetail.throughput.mbps=%.1f МиБ/с
|
||||
main.vaultDetail.missing.info=Cryptomator не смог найти хранилище по этому пути.
|
||||
### Needs Migration
|
||||
main.vaultDetail.migrateButton=Обновить хранилище
|
||||
main.vaultDetail.migratePrompt=Хранилище должно быть обновлено до нового формата, прежде чем вы сможете получить к нему доступ
|
||||
main.vaultDetail.migratePrompt=Чтобы получить доступ к хранилищу, его нужно преобразовать в новый формат
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.title=Как шифровать файлы
|
||||
wrongFileAlert.header.title=Вы пытались зашифровать эти файлы?
|
||||
wrongFileAlert.header.lead=Для этого Cryptomator создает том в системном файловом менеджере.
|
||||
wrongFileAlert.instruction.0=Чтобы зашифровать файлы, выполните следующие действия:
|
||||
wrongFileAlert.header.lead=Для этого Cryptomator создаёт том в системном диспетчере файлов.
|
||||
wrongFileAlert.instruction.0=Чтобы зашифровать файлы, выполните следующее:
|
||||
wrongFileAlert.instruction.1=1. Разблокируйте хранилище.
|
||||
wrongFileAlert.instruction.2=2. Нажмите кнопку " Показать", чтобы открыть том в файловом менеджере.
|
||||
wrongFileAlert.instruction.2=2. Нажмите кнопку "Показать", чтобы открыть том в диспетчере файлов.
|
||||
wrongFileAlert.instruction.3=3. Добавьте файлы в этот том.
|
||||
wrongFileAlert.link=Если нужна помощь, посетите
|
||||
|
||||
@@ -205,13 +207,13 @@ vaultOptions.mount.winDriveLetterOccupied=занято
|
||||
vaultOptions.mount.mountPoint=Точка монтирования
|
||||
vaultOptions.mount.mountPoint.auto=Автоматически выбирать подходящую
|
||||
vaultOptions.mount.mountPoint.driveLetter=Использовать назначенную букву диска
|
||||
vaultOptions.mount.mountPoint.custom=Пользовательский путь
|
||||
vaultOptions.mount.mountPoint.custom=Свой путь
|
||||
vaultOptions.mount.mountPoint.directoryPickerButton=Выбрать…
|
||||
vaultOptions.mount.mountPoint.directoryPickerTitle=Выберите пустую папку
|
||||
## Master Key
|
||||
vaultOptions.masterkey=Пароль
|
||||
vaultOptions.masterkey.changePasswordBtn=Изменить пароль
|
||||
vaultOptions.masterkey.recoveryKeyExpanation=Ключ восстановления - это единственный способ восстановить доступ к хранилищу в случае утери пароля.
|
||||
vaultOptions.masterkey.recoveryKeyExpanation=Ключ восстановления - это единственный способ восстановить доступ к хранилищу при утере пароля.
|
||||
vaultOptions.masterkey.showRecoveryKeyBtn=Показать ключ восстановления
|
||||
vaultOptions.masterkey.recoverPasswordBtn=Восстановить пароль
|
||||
|
||||
@@ -237,5 +239,5 @@ passwordStrength.messageLabel.3=Сильный
|
||||
passwordStrength.messageLabel.4=Очень сильный
|
||||
|
||||
# Quit
|
||||
quit.prompt=Выйти из приложения? Есть разблокированные хранилища.
|
||||
quit.prompt=Выйти из приложения? Есть незаблокированные хранилища.
|
||||
quit.lockAndQuit=Заблокировать и выйти
|
||||
|
||||
130
main/ui/src/main/resources/i18n/strings_sk.properties
Normal file
130
main/ui/src/main/resources/i18n/strings_sk.properties
Normal file
@@ -0,0 +1,130 @@
|
||||
# Locale Specific CSS files such as CJK, RTL,...
|
||||
|
||||
# Generics
|
||||
## Button
|
||||
generic.button.apply=Použiť
|
||||
generic.button.back=Späť
|
||||
generic.button.cancel=Zrušiť
|
||||
generic.button.change=Zmeniť
|
||||
generic.button.close=Zavrieť
|
||||
generic.button.copy=Kopírovať
|
||||
generic.button.copied=Skopírované!
|
||||
generic.button.done=Hotovo
|
||||
generic.button.next=Ďalej
|
||||
generic.button.print=Tlač
|
||||
## Error
|
||||
generic.error.title=Vyskytla sa neočakávaná chyba
|
||||
generic.error.instruction=Toto sa nemalo stať. Nahláste text chyby uvedený nižšie a uveďte popis krokov, ktoré viedli k tejto chybe.
|
||||
|
||||
# Tray Menu
|
||||
traymenu.showMainWindow=Zobraziť
|
||||
traymenu.showPreferencesWindow=Predvoľby
|
||||
traymenu.lockAllVaults=Zamknúť všetky
|
||||
traymenu.quitApplication=Ukončiť
|
||||
traymenu.vault.unlock=Odomknúť
|
||||
traymenu.vault.lock=Uzamknúť
|
||||
traymenu.vault.reveal=Odkryť
|
||||
|
||||
# Add Vault Wizard
|
||||
addvaultwizard.title=Pridať trezor
|
||||
## Welcome
|
||||
addvaultwizard.welcome.newButton=Vytvoriť nový trezor
|
||||
addvaultwizard.welcome.existingButton=Otvoriť existujúci trezor
|
||||
## New
|
||||
### Name
|
||||
addvaultwizard.new.nameInstruction=Zvoľte názov pre trezor
|
||||
addvaultwizard.new.namePrompt=Názov trezoru
|
||||
### Location
|
||||
addvaultwizard.new.locationInstruction=Kde by mal Cryptomator uchovávať šifrované súbory vášho trezoru?
|
||||
addvaultwizard.new.locationLabel=Umiestnenie úložiska
|
||||
addvaultwizard.new.directoryPickerLabel=Vlastné umiestnenie
|
||||
addvaultwizard.new.directoryPickerButton=Vybrať…
|
||||
addvaultwizard.new.directoryPickerTitle=Vybrať adresár
|
||||
addvaultwizard.new.fileAlreadyExists=Na tejto ceste nie je možné vytvoriť trezor, pretože niektorý objekt už existuje.
|
||||
addvaultwizard.new.invalidName=Neplatný názov trezoru. Zvážte bežný názov adresára.
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=Vytvoriť trezor
|
||||
addvaultwizard.new.generateRecoveryKeyChoice=Bez hesla nebudete mať prístup k svojim údajom. Chcete obnovovací kľúč pre prípad straty hesla?
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.yes=Áno, prosím, istota je istota
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.no=Nie, ďakujem, nestratím svoje heslo
|
||||
### Information
|
||||
addvault.new.readme.storageLocation.fileName=Dôležité.rtf
|
||||
addvault.new.readme.storageLocation.1=⚠️ SÚBORY TREZORU ⚠️
|
||||
addvault.new.readme.storageLocation.2=Toto je umiestnenie úložiska vášho trezoru.
|
||||
addvault.new.readme.storageLocation.3=NEVYKONÁVAJTE
|
||||
addvault.new.readme.storageLocation.4=zmeniť akékoľvek súbory v tomto adresári alebo
|
||||
addvault.new.readme.storageLocation.5=vložiť do tohto adresára akékoľvek súbory na šifrovanie.
|
||||
addvault.new.readme.storageLocation.6=Ak chcete šifrovať súbory a zobraziť obsah trezoru, postupujte takto:
|
||||
addvault.new.readme.storageLocation.7=1. Pridajte tento trezor do Cryptomatoru.
|
||||
addvault.new.readme.storageLocation.8=2. Odomknite trezor v Cryptomatore.
|
||||
addvault.new.readme.storageLocation.9=3. Otvorte prístupové miesto kliknutím na tlačidlo „Odkryť“.
|
||||
addvault.new.readme.storageLocation.10=Ak potrebujete pomoc, navštívte dokumentáciu: %s
|
||||
addvault.new.readme.accessLocation.fileName=VITAJTE.rtf
|
||||
addvault.new.readme.accessLocation.1=🔐️ ZAŠIFROVANÝ ZVÄZOK 🔐️
|
||||
addvault.new.readme.accessLocation.2=Toto je prístupové miesto vášho trezoru.
|
||||
addvault.new.readme.accessLocation.3=Všetky súbory pridané do tohto zväzku budú šifrované programom Cryptomator. Môžete na tom pracovať ako na akomkoľvek inom disku / priečinku. Toto je iba dešifrované zobrazenie jeho obsahu, vaše súbory zostávajú stále šifrované na pevnom disku.
|
||||
addvault.new.readme.accessLocation.4=Tento súbor môžete kedykoľvek odstrániť.
|
||||
## Existing
|
||||
addvaultwizard.existing.instruction=Vyberte súbor „masterkey.cryptomator“ existujúceho trezoru.
|
||||
addvaultwizard.existing.chooseBtn=Vybrať…
|
||||
## Success
|
||||
addvaultwizard.success.nextStepsInstructions=Pridaný trezor "%s".\nAk chcete získať prístup alebo pridať obsah, musíte tento trezor odomknúť. Prípadne ju môžete odomknúť kedykoľvek neskôr.
|
||||
addvaultwizard.success.unlockNow=Odomknúť teraz
|
||||
|
||||
# Remove Vault
|
||||
removeVault.title=Odstrániť trezor
|
||||
removeVault.information=To spôsobí, že Cryptomator iba zabudne na tento trezor. Môžete ho pridať znova neskôr. Z pevného disku sa neodstránia žiadne šifrované súbory.
|
||||
removeVault.confirmBtn=Odstrániť trezor
|
||||
|
||||
# Change Password
|
||||
|
||||
# Forget Password
|
||||
|
||||
# Unlock
|
||||
unlock.unlockBtn=Odomknúť
|
||||
## Success
|
||||
## Invalid Mount Point
|
||||
|
||||
# Migration
|
||||
## Start
|
||||
## Run
|
||||
## Sucess
|
||||
migration.success.unlockNow=Odomknúť teraz
|
||||
## Missing file system capabilities
|
||||
|
||||
# Preferences
|
||||
preferences.title=Predvoľby
|
||||
## General
|
||||
## Volume
|
||||
## Updates
|
||||
## Donation Key
|
||||
## About
|
||||
|
||||
# Main Window
|
||||
main.preferencesBtn.tooltip=Predvoľby
|
||||
## Drag 'n' Drop
|
||||
## Vault List
|
||||
main.vaultlist.contextMenu.remove=Odstrániť trezor
|
||||
main.vaultlist.addVaultBtn=Pridať trezor
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
### Locked
|
||||
main.vaultDetail.unlockBtn=Odomknúť
|
||||
### Unlocked
|
||||
main.vaultDetail.lockBtn=Uzamknúť
|
||||
### Missing
|
||||
### Needs Migration
|
||||
|
||||
# Wrong File Alert
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
## Mount
|
||||
vaultOptions.mount.mountPoint.directoryPickerButton=Vybrať…
|
||||
## Master Key
|
||||
|
||||
# Recovery Key
|
||||
|
||||
# New Password
|
||||
|
||||
# Quit
|
||||
@@ -50,7 +50,7 @@ addvaultwizard.new.generateRecoveryKeyChoice.yes=Ja tack. För säkerhets skull
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.no=Nej tack. Här slarvas inga lösenord bort
|
||||
### Information
|
||||
addvault.new.readme.storageLocation.fileName=VIKTIGT.rtf
|
||||
addvault.new.readme.storageLocation.1=⚠️ VALV FILER ⚠️
|
||||
addvault.new.readme.storageLocation.1=⚠️ VALVFILER ⚠️
|
||||
addvault.new.readme.storageLocation.2=Detta är ditt valvs lagringsplats.
|
||||
addvault.new.readme.storageLocation.3=INTE
|
||||
addvault.new.readme.storageLocation.4=• ändra någon fil i denna katalog eller
|
||||
@@ -58,7 +58,7 @@ addvault.new.readme.storageLocation.5=• klistra in filer för kryptering i den
|
||||
addvault.new.readme.storageLocation.6=Om du vill kryptera filer och se innehållet i valvet, gör följande:
|
||||
addvault.new.readme.storageLocation.7=1. Lägg till detta valv till Cryptomator.
|
||||
addvault.new.readme.storageLocation.8=2. Lås upp valvet i Cryptomator.
|
||||
addvault.new.readme.storageLocation.9=3. Öppna åtkomstplatsen genom att klicka på "Visa" knappen.
|
||||
addvault.new.readme.storageLocation.9=3. Öppna åtkomstplatsen genom att klicka på "Visa"-knappen.
|
||||
addvault.new.readme.storageLocation.10=Om du behöver hjälp, läs dokumentationen: %s
|
||||
addvault.new.readme.accessLocation.fileName=WELCOME.rtf
|
||||
addvault.new.readme.accessLocation.1=\\fs\\qc 🔐️ KRYPTERAD VOLYM 🔐️
|
||||
@@ -115,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=Filsystemet stöds ej
|
||||
migration.error.missingFileSystemCapabilities.description=Migreringen startades inte, eftersom ditt valv ligger på ett ogiltigt filsystem.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Filsystemet har inte stöd för långa filnamn.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Filsystemet har inte stöd för långa filnamn.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Filsystemet tillåter inte att läsas.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Filsystemet tillåter inte att skrivas till.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Inställningar
|
||||
@@ -190,7 +192,7 @@ wrongFileAlert.instruction.0=För att kryptera filer, följ dessa steg:
|
||||
wrongFileAlert.instruction.1=1. Lås upp ditt valv.
|
||||
wrongFileAlert.instruction.2=2. Klicka på "Visa" för att öppna volymen i din filhanterare.
|
||||
wrongFileAlert.instruction.3=3. Lägg till dina filer i denna volym.
|
||||
wrongFileAlert.link=För mer hjälp, besök
|
||||
wrongFileAlert.link=För ytterligare hjälp, besök
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
|
||||
@@ -59,6 +59,7 @@ addvault.new.readme.storageLocation.6=Dosyaları şifrelemek ve kasanın içeri
|
||||
addvault.new.readme.storageLocation.7=1. Bu kasayı Cryptomator'a ekleyin.
|
||||
addvault.new.readme.storageLocation.8=2. Cryptomator'da kasanın kilidini açın.
|
||||
addvault.new.readme.storageLocation.9=3. "Göster" düğmesini tıklayarak erişim konumunu açın.
|
||||
addvault.new.readme.storageLocation.10=Yardım lazımsa, belgeleri ziyaret edin: %s
|
||||
addvault.new.readme.accessLocation.fileName=WELCOME.rtf
|
||||
addvault.new.readme.accessLocation.1=🔐️ ŞİFRELENMİŞ BİRİM 🔐️
|
||||
addvault.new.readme.accessLocation.2=Burası kasanızın erişim konumudur.
|
||||
@@ -80,6 +81,7 @@ removeVault.confirmBtn=Kasayı Sil
|
||||
# Change Password
|
||||
changepassword.title=Şifreyi Değiştir
|
||||
changepassword.enterOldPassword="%s" için şuanki şifreyi gir
|
||||
changepassword.finalConfirmation=Şifremi unutursam verilerime ulaşamayacağımın farkındayım
|
||||
|
||||
# Forget Password
|
||||
forgetPassword.title=Şifreyi Unut
|
||||
@@ -113,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=Desteklenmeyen Dosya Sistemi
|
||||
migration.error.missingFileSystemCapabilities.description=Kasanız desteklenmeyen bir dosya sisteminde bulunduğundan taşıma başlatılmadı.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Dosya sistemi, uzun belge adlarını desteklemiyor.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Dosya sistemi, uzun yolları desteklemiyor.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Dosya sistemi okunmaya izin vermiyor.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Dosya sistemi yazılmaya izin vermiyor.
|
||||
|
||||
# Preferences
|
||||
preferences.title=Seçenekler
|
||||
@@ -143,6 +147,7 @@ preferences.donationKey.registeredFor=%s için kaydedildi
|
||||
preferences.donationKey.noDonationKey=Geçerli bir bağış anahtarı bulunamadı. Bu anahtar, lisans anahtarı gibidir ama ücretsiz uygulama kullanan muhteşem insanlar içindir ;-)
|
||||
preferences.donationKey.getDonationKey=Bir bağış anahtarı al
|
||||
## About
|
||||
preferences.about=Hakkında
|
||||
|
||||
# Main Window
|
||||
main.closeBtn.tooltip=Kapat
|
||||
@@ -180,6 +185,14 @@ main.vaultDetail.migrateButton=Kasayı Güncelle
|
||||
main.vaultDetail.migratePrompt=Kasaya erişmeden önce kasanızın yeni bir formata yükseltilmesi gerekiyor
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.title=Dosyalar Nasıl Şifrelenir
|
||||
wrongFileAlert.header.title=Bu dosyaları şifrelemeye çalıştınız mı?
|
||||
wrongFileAlert.header.lead=Bu amaçla, Cryptomator sistem dosya yöneticinizde bir birim oluşturur.
|
||||
wrongFileAlert.instruction.0=Dosyaları şifrelemek için, şu adımları izleyin:
|
||||
wrongFileAlert.instruction.1=1. Kasanızın kilidini açın.
|
||||
wrongFileAlert.instruction.2=2. "Sürücüyü Göster"e basarak birimi dosya yöneticinizde açın.
|
||||
wrongFileAlert.instruction.3=3. Dosyalarınızı bu birime ekleyin.
|
||||
wrongFileAlert.link=Daha fazla yardım için, ziyaret edin:
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
@@ -211,6 +224,7 @@ recoveryKey.display.message=Aşağıdaki kurtarma anahtarı "%s" kasasına eriş
|
||||
recoveryKey.display.StorageHints=Bunu çok güvenli bir yerde saklayın, örneğin:\n • Şifre yöneticisi kullanarak depolayın\n • USB flash belleğe kaydedin\n • Bir sayfaya yazdırın
|
||||
recoveryKey.recover.prompt="%s" için kurtarma anahtarınızı girin:
|
||||
recoveryKey.recover.validKey=Bu geçerli bir kurtarma anahtarı
|
||||
recoveryKey.printout.heading=Cryptomator Kurtarma Anahtarı\n"%s"\n
|
||||
|
||||
# New Password
|
||||
newPassword.promptText=Yeni bir şifre girin
|
||||
|
||||
@@ -115,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=不支持的文件系统
|
||||
migration.error.missingFileSystemCapabilities.description=迁移未开始,因为您的保险库在一个不适当的文件系统中
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=此文件系统不支持长文件名
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=此文件系统不支持长路径
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=文件系统不允许读取访问
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=文件系统不允许写入
|
||||
|
||||
# Preferences
|
||||
preferences.title=首选项
|
||||
@@ -122,9 +124,9 @@ preferences.title=首选项
|
||||
preferences.general=常规
|
||||
preferences.general.theme=界面外观
|
||||
preferences.general.unlockThemes=解锁暗黑模式
|
||||
preferences.general.startHidden=启动Cryptomator时隐藏窗口
|
||||
preferences.general.startHidden=最小化启动 Cryptomator 到系统托盘
|
||||
preferences.general.debugLogging=启用调试日志
|
||||
preferences.general.autoStart=开机运行Cryptomator
|
||||
preferences.general.autoStart=开机运行 Cryptomator
|
||||
preferences.general.interfaceOrientation=界面方向
|
||||
preferences.general.interfaceOrientation.ltr=从左到右
|
||||
preferences.general.interfaceOrientation.rtl=从右到左
|
||||
@@ -142,7 +144,7 @@ preferences.updates.updateAvailable=可更新到版本 %s
|
||||
## Donation Key
|
||||
preferences.donationKey=捐赠
|
||||
preferences.donationKey.registeredFor=已注册给 %s
|
||||
preferences.donationKey.noDonationKey=找不到有效的捐赠密钥,它相当于一个专门给使用免费软件的帅哥美女的许可证密钥。;-)
|
||||
preferences.donationKey.noDonationKey=找不到有效的捐赠密钥,它相当于一个专门给使用免费软件的帅哥美女的许可证密钥 ;-)
|
||||
preferences.donationKey.getDonationKey=获取一个捐赠密钥
|
||||
## About
|
||||
preferences.about=关于
|
||||
@@ -195,7 +197,7 @@ wrongFileAlert.link=如需进一步帮助,请访问
|
||||
# Vault Options
|
||||
## General
|
||||
vaultOptions.general=常规
|
||||
vaultOptions.general.unlockAfterStartup=启动Cryptomator时解锁保险库
|
||||
vaultOptions.general.unlockAfterStartup=启动 Cryptomator 时解锁保险库 (此功能需先勾选保存密码)
|
||||
## Mount
|
||||
vaultOptions.mount=挂载
|
||||
vaultOptions.mount.readonly=只读
|
||||
|
||||
@@ -115,6 +115,8 @@ migration.error.missingFileSystemCapabilities.title=不支援的檔案系統
|
||||
migration.error.missingFileSystemCapabilities.description=因您的加密檔案庫位於不支援的檔案系統中,升級並未開始。
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=檔案系統不支援長檔名
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=檔案系統不支援長路徑名
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=此檔案系統不允許讀取。
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=此檔案系統不允許寫入。
|
||||
|
||||
# Preferences
|
||||
preferences.title=偏好
|
||||
@@ -190,7 +192,7 @@ wrongFileAlert.instruction.0=請依下列步驟加密檔案:
|
||||
wrongFileAlert.instruction.1=1. 解鎖您的加密檔案庫。
|
||||
wrongFileAlert.instruction.2=2. 點擊「顯示」可在檔案總管中檢視磁區。
|
||||
wrongFileAlert.instruction.3=3. 把您的檔案加入磁區。
|
||||
wrongFileAlert.link=如果需要進一步的協助,請前往
|
||||
wrongFileAlert.link=如需進一步協助協助,請前往
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
|
||||
@@ -11,7 +11,7 @@ GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see http://www.gnu.org/licenses/.
|
||||
|
||||
Cryptomator uses 49 third-party dependencies under the following licenses:
|
||||
Cryptomator uses 50 third-party dependencies under the following licenses:
|
||||
Apache License v2.0:
|
||||
- HKDF-RFC5869 (at.favre.lib:hkdf:1.0.2 - https://github.com/patrickfav/hkdf)
|
||||
- jffi (com.github.jnr:jffi:1.2.23 - http://github.com/jnr/jffi)
|
||||
@@ -32,15 +32,16 @@ Cryptomator uses 49 third-party dependencies under the following licenses:
|
||||
- Java Native Access (net.java.dev.jna:jna:5.1.0 - https://github.com/java-native-access/jna)
|
||||
- Java Native Access Platform (net.java.dev.jna:jna-platform:5.1.0 - https://github.com/java-native-access/jna)
|
||||
- Apache Commons Lang (org.apache.commons:commons-lang3:3.9 - http://commons.apache.org/proper/commons-lang/)
|
||||
- Jackrabbit WebDAV Library (org.apache.jackrabbit:jackrabbit-webdav:2.19.0 - http://jackrabbit.apache.org/jackrabbit-webdav/)
|
||||
- Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Apache HttpCore (org.apache.httpcomponents:httpcore:4.4.13 - http://hc.apache.org/httpcomponents-core-ga)
|
||||
- Jackrabbit WebDAV Library (org.apache.jackrabbit:jackrabbit-webdav:2.21.0 - http://jackrabbit.apache.org/jackrabbit-webdav/)
|
||||
- Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
BSD:
|
||||
- asm (org.ow2.asm:asm:7.1 - http://asm.ow2.org/)
|
||||
- asm-analysis (org.ow2.asm:asm-analysis:7.1 - http://asm.ow2.org/)
|
||||
@@ -48,14 +49,14 @@ Cryptomator uses 49 third-party dependencies under the following licenses:
|
||||
- asm-tree (org.ow2.asm:asm-tree:7.1 - http://asm.ow2.org/)
|
||||
- asm-util (org.ow2.asm:asm-util:7.1 - http://asm.ow2.org/)
|
||||
Eclipse Public License - Version 1.0:
|
||||
- Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.17.v20190418 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
- Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.28.v20200408 - http://www.eclipse.org/jetty)
|
||||
Eclipse Public License - v 2.0:
|
||||
- jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
|
||||
GPLv2:
|
||||
|
||||
Reference in New Issue
Block a user