Compare commits

..
101 Commits
Author SHA1 Message Date
Sebastian Stenzel f16c3d5110 updated build config 2019-02-15 16:00:59 +01:00
Sebastian Stenzel e1930505d1 updated build config 2019-02-15 15:46:44 +01:00
Sebastian Stenzel 757549919c updated CI config 2019-02-15 15:32:26 +01:00
Sebastian Stenzel 0257802bb0 Merge branch 'openjdk11' into develop 2019-02-15 15:22:00 +01:00
Sebastian Stenzel 5cb4b403cd updated travis-to-bintray upload config 2019-02-15 15:15:26 +01:00
Sebastian Stenzel 8831df9242 Removed creation of fat jar for now. 2019-02-15 14:45:12 +01:00
Sebastian Stenzel 2229a56831 Merge branch 'master' into develop
# Conflicts:
#	main/ant-kit/pom.xml
#	main/commons/pom.xml
#	main/keychain/pom.xml
#	main/launcher/pom.xml
#	main/pom.xml
#	main/uber-jar/pom.xml
#	main/ui/pom.xml
2019-02-15 08:45:05 +01:00
Sebastian Stenzel c3370a8388 Merge branch 'hotfix/1.4.4' 2019-02-15 08:43:57 +01:00
Sebastian Stenzel 1175a114ec bumping version number [ci skip] 2019-02-15 08:41:20 +01:00
Sebastian Stenzel 3374dbf9a5 Fixes #825, fixes #823 2019-02-15 08:39:31 +01:00
Sebastian Stenzel 26aee9e42c create os-dependent buildkit.zip with all java resources required to build a self-contained package 2019-02-14 18:20:11 +01:00
Sebastian Stenzel ab82874013 Merge branch 'develop' into openjdk11
# Conflicts:
#	main/pom.xml
2019-02-14 18:12:10 +01:00
Sebastian Stenzel 39f1da105e Merge branch 'master' into develop
[ci skip]
2019-02-12 14:19:43 +01:00
Sebastian Stenzel 207bfee6e5 Merge branch 'release/1.4.3' 2019-02-12 14:19:14 +01:00
Sebastian Stenzel d08f3d03d0 preparing 1.4.3 2019-02-12 14:18:12 +01:00
Sebastian Stenzel a88bd81347 reverted change from previous commit 2019-02-12 14:13:45 +01:00
Sebastian Stenzel 8e2d2b899e moved ui control logic from initializer to setVault, removed readonly mode from windows 2019-02-12 13:59:38 +01:00
Tobias Hagemann 3b4870a98a Updated localizations 2019-02-12 13:33:19 +01:00
Sebastian Stenzel ef5eabdb79 Updated SecPasswordField, which will now no longer store passwords in Strings but rather in char[].
Affects #409
2019-02-12 12:02:09 +01:00
Sebastian Stenzel f52b2f323a empty custom mount point checks 2019-02-12 11:01:22 +01:00
Tobias Hagemann 7e60e5606c Updated custom mount point layout 2019-02-12 01:56:35 +01:00
Sebastian Stenzel 8e2fa082cc improved cleanup after unmounting and support for force-unmounting fuse volumes 2019-02-11 15:55:09 +01:00
Sebastian Stenzel d8ef402607 Merge branch 'feature/375-readonly' into develop
fixes #375
2019-02-11 15:41:23 +01:00
Sebastian Stenzel 748f1be0c5 fixes #757 2019-02-11 15:40:04 +01:00
Sebastian Stenzel 608d54a8f2 fixes #810 2019-02-11 15:35:00 +01:00
Sebastian Stenzel 50b167e28f improved logging in case of "java.lang.IllegalStateException: Mount failed: Cannot assign a drive letter or mount point. Probably already used by another volume." (#806) 2019-02-11 13:28:38 +01:00
Sebastian Stenzel b7d06783dd Dokany-specific amendment for #752 2019-02-11 13:21:55 +01:00
Sebastian StenzelandGitHub 5ef3d23970 Merge pull request #817 from Gregvh/feature/375-readonly
Unlock vault with readonly flag if requested (fixes #375)
2019-02-08 17:38:13 +01:00
Gregvh 200a195f3b Unlock vault with readonly flag if requested 2019-02-08 15:39:09 +01:00
Sebastian Stenzel db0aceefdf Merge branch 'develop' into feature/375-readonly
# Conflicts:
#	main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java
#	main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java
#	main/ui/src/main/resources/fxml/unlock.fxml
2019-02-08 15:28:40 +01:00
Sebastian Stenzel 492e986608 Custom mount point now selected via DirectoryChooser. Fixes #762 2019-02-08 12:32:00 +01:00
Sebastian Stenzel 98cab7e4d8 Delete automatically generated mount point after locking, attempt to fix #773 2019-01-31 15:38:05 +01:00
Sebastian Stenzel 384c9de7aa disabled spell checks [ci skip] 2019-01-31 15:37:20 +01:00
Sebastian Stenzel 528005a623 fixes #752 2019-01-31 15:37:01 +01:00
Tobias Hagemann c78d4c2d0e Updated localizations, added Catalan 2019-01-27 14:57:03 +01:00
Sebastian Stenzel c8e9201692 Merge branch 'master' into develop 2019-01-17 13:06:26 +01:00
Sebastian Stenzel 536da2621a Merge branch 'release/1.4.2' 2019-01-17 13:02:58 +01:00
Sebastian Stenzel 6167eeecb4 Preparing 1.4.2 2019-01-17 13:00:36 +01:00
Sebastian Stenzel 9cc873a344 No longer assigning drive letters A-C to fix problems with older Dokany versions 2019-01-17 11:38:48 +01:00
Sebastian Stenzel b539590d7a updated IDE settings and removed duplicate gitignore [ci skip] 2019-01-17 11:07:01 +01:00
Tobias Hagemann 5209bef1a9 Merge branch 'master' into develop 2019-01-16 16:55:53 +01:00
Tobias Hagemann ee5505362c Merge branch 'release/1.4.1' 2019-01-16 16:50:44 +01:00
Tobias Hagemann 82f388d420 Preparing 1.4.1 2019-01-16 16:38:37 +01:00
Tobias Hagemann 70e733f341 Updated localizations 2019-01-16 16:27:00 +01:00
Tobias Hagemann 3af5d5f267 Repositioned messageText in unlock, updated "unlock.pendingMessage.unlocking" copy 2019-01-16 16:23:03 +01:00
Sebastian Stenzel 28bf9e2ab1 fixes #732 2019-01-16 16:10:11 +01:00
Sebastian Stenzel 2f3a576de9 Renewed BINTRAY_API_KEY [ci skip] 2019-01-16 16:02:52 +01:00
Armin SchrenkandSebastian Stenzel bbe1ef3dbc Feature/custom mount point generalizing (#797)
* changing naming of individual mout path property

* adding input/output for the new custom mount points

* ui integration of custom mount point

* removing unused variable

* Improving UX

* Simplify mountPathProperty and implement its usage

* reverting renaming of Properties concerning the usage of own mount point (rescheduled for 1.5.0)

* changing displayed message when no mount path given

* fixing ui error

* applying suggestion of comment https://github.com/cryptomator/cryptomator/pull/797/files/7338fda41858942ee17daf436979e2a69114a108#r248254180
2019-01-16 15:08:00 +01:00
Tobias Hagemann 078a127182 Shortened "welcome.askForUpdateCheck.dialog.content" copy 2019-01-16 14:15:26 +01:00
Tobias Hagemann 240bf122dd Hide "check for updates" indicator by default 2019-01-16 14:00:32 +01:00
Sebastian Stenzel f2f8f9b28c added intellij project configuration 2019-01-15 13:15:38 +01:00
Sebastian Stenzel af03e0d73d updated dagger [ci skip] 2019-01-15 13:07:39 +01:00
Sebastian StenzelandGitHub 7844078203 Merge pull request #784 from jellemdekker/bugfix/771_abort_graceful_shutdown_dialog
Added a Cancel button to the graceful shutdown-dialog
2019-01-14 13:05:40 +01:00
Armin Schrenk da62a22faf fixes #750 2019-01-09 17:59:41 +01:00
Armin Schrenk c36a1a4aef closes #711 2019-01-09 17:58:23 +01:00
Armin Schrenk 86d8599d07 Merge branch 'develop' into openjdk11 2019-01-09 16:07:47 +01:00
Armin Schrenk f760347d9d fixes #787 2019-01-09 15:28:05 +01:00
Armin Schrenk 8fc647eb2b Updating Apache Commons libraries 2019-01-09 15:26:02 +01:00
jellemdekker 69b1bf5a26 Added a Cancel button to the graceful shutdown-dialog. Fixes issue #771. 2018-12-22 12:53:42 +01:00
Sebastian Stenzel 6951edac96 fixes #770 2018-12-05 18:22:48 +01:00
Sebastian Stenzel 76c84b34e9 bumped version 2018-11-05 10:46:39 +01:00
Sebastian Stenzel 1362720011 Merge branch 'master' into develop
[ci skip]
2018-10-31 16:21:48 +01:00
Sebastian Stenzel 3f15352ebf Merge branch 'release/1.4.0-rc1' 2018-10-31 16:21:09 +01:00
Sebastian Stenzel fdedee49d3 Preparing 1.4.0-rc1 2018-10-31 16:20:42 +01:00
Sebastian Stenzel b506493c13 updated localization 2018-10-31 16:17:20 +01:00
Sebastian Stenzel bc09f28120 updating dependencies
fixes #742, fixes #705
2018-10-31 16:03:37 +01:00
Sebastian Stenzel eba0935900 attempting to downgrade to oracle jdk 9 because of stupid jdk 10 deprecation 2018-10-31 15:56:18 +01:00
Armin Schrenk 744225cf7a changing build to jdk11 2018-10-31 15:51:00 +01:00
Armin Schrenk 54f2667e45 openjdk 11 migration 2018-10-31 15:50:05 +01:00
Armin Schrenk 050a6e6a57 use jdk 10 for 1.4.0 release 2018-10-31 15:22:00 +01:00
Armin Schrenk dbcb407a7c updating travis config 2018-10-31 14:41:30 +01:00
Armin Schrenk b1acdf9e61 fixex #738 2018-10-31 14:13:03 +01:00
Armin Schrenk 9c6a0b3e0c readjust columns in settings dialogue 2018-10-31 13:36:52 +01:00
Sebastian Stenzel f6df442948 Merge branch 'master' into develop
[ci skip]
2018-10-15 14:37:05 +02:00
Sebastian Stenzel 29038a679f Merge branch 'release/1.4.0-beta3' 2018-10-15 14:36:27 +02:00
Sebastian Stenzel 2e042423d0 Preparing 1.4.0-beta3 2018-10-15 14:35:34 +02:00
Sebastian Stenzel e08c2b7dc3 updated dependencies 2018-10-11 00:31:22 +02:00
infeo d5d0589dec changing description of own mount point usage 2018-10-10 12:34:23 +02:00
infeo a760edcab9 fixing settings bug under linux 2018-10-05 18:31:38 +02:00
infeo a759455473 removing testsetting 2018-10-05 17:53:10 +02:00
Armin Schrenk 50d2f16f71 fixing ui bug: setting fields did not disappeared with mount adapter change 2018-10-05 17:42:35 +02:00
infeo 8afa09007b aligning webdav port number textfield 2018-10-04 16:12:07 +02:00
Sebastian StenzelandGitHub fccd02a7e8 Merge pull request #730 from Gregvh/read-only-setting
Add read-only option to the advanced settings (references #375)
2018-10-04 10:05:16 +02:00
Gregvh 7e46957bcb Add read-only option to the advanced settings 2018-10-03 11:30:44 +02:00
infeo 194f373c08 changes spelling of the word dokany 2018-10-01 23:12:51 +02:00
Sebastian Stenzel 5f11e1aa8b Next attempt to provide a solution for #656. 2018-09-17 22:39:46 +02:00
Sebastian Stenzel 0ac1b406b7 tmp fix from https://github.com/cryptomator/cryptomator/pull/29 apparently no longer needed with latest JDK. 2018-09-17 22:38:35 +02:00
Sebastian Stenzel ade2db7cc0 attempt to correctly size the UI (#656) 2018-09-16 14:46:50 +02:00
Sebastian StenzelandGitHub eb911aeb6c Merge pull request #690 from jellemdekker/feature/230-graceful-quit
Implemented graceful shutdown confirmation dialog, fixes #230.
2018-08-21 18:15:02 +02:00
jellemdekker a58259d4f0 As per feedback on PR #690: refactored if-statement. 2018-08-21 15:27:32 +02:00
jellemdekker 963a731202 As per feedback on PR #690: redid line wrapping, refactored signature for dialog builder method to include a default button, and the default button for the graceful shutdown dialog is now 'Force shutdown'. 2018-08-21 15:26:10 +02:00
Tobias Hagemann 5ea0fc4b6f updated localizations [ci skip] 2018-08-08 23:42:54 +02:00
Sebastian Stenzel 4becdf7e1e now publishing ant-kit to bintray instead of github releases 2018-07-23 23:21:10 +02:00
Sebastian Stenzel 8ab8798381 jdk_switcher no longer needed, since codacy-coverage-reporter should now support jdk 10 (see https://github.com/codacy/codacy-coverage-reporter/issues/83) 2018-07-23 21:01:43 +02:00
Sebastian Stenzel c3f8fa1662 code refinements 2018-07-19 18:13:19 +02:00
infeo 59d019f34a fixes #700 2018-07-19 15:40:45 +02:00
infeo ee99e9994e closes #695 2018-07-17 18:36:30 +02:00
infeo 019b7ac643 refactoring inconsistent method in vault class 2018-07-17 18:18:23 +02:00
infeo 7392a99da5 small ui fix: text for using individual mount path is not shown completely 2018-07-17 18:17:27 +02:00
Sebastian Stenzel e909269ae0 Merge tag '1.4.0-beta2' into develop
1.4.0-beta2
2018-07-12 15:22:42 +02:00
jellemdekker 0ddd6d767d Implemented confirmation dialog when graceful shutdown of Cryptomator fails, so that the user can try again or opt to shutdown forcefully. 2018-07-09 16:42:53 +02:00
75 changed files with 1812 additions and 1180 deletions
+8 -10
View File
@@ -9,15 +9,13 @@
.settings .settings
.project .project
.classpath .classpath
# Maven #
target/ target/
test-output/
# IntelliJ Settings Files # # IntelliJ Settings Files (https://intellij-support.jetbrains.com/hc/en-us/articles/206544839-How-to-manage-projects-under-Version-Control-Systems) #
.idea/ .idea/**/workspace.xml
out/ .idea/**/tasks.xml
.idea_modules/ .idea/dictionaries
*.iws .idea/**/libraries/
*.iml *.iml
# Temporary file created by test launcher
main/launcher/.ipcPort.tmp
Generated
+1
View File
@@ -0,0 +1 @@
Cryptomator
+51
View File
@@ -0,0 +1,51 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<option name="OTHER_INDENT_OPTIONS">
<value>
<option name="USE_TAB_CHARACTER" value="true" />
</value>
</option>
<option name="LINE_SEPARATOR" value="&#10;" />
<option name="RIGHT_MARGIN" value="220" />
<option name="FORMATTER_TAGS_ENABLED" value="true" />
<JavaCodeStyleSettings>
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="30" />
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="10" />
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
<value />
</option>
<option name="JD_ALIGN_PARAM_COMMENTS" value="false" />
<option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false" />
</JavaCodeStyleSettings>
<codeStyleSettings language="Groovy">
<indentOptions>
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="HTML">
<indentOptions>
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JAVA">
<option name="KEEP_LINE_BREAKS" value="false" />
<option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" />
<option name="KEEP_SIMPLE_BLOCKS_IN_ONE_LINE" value="true" />
<option name="KEEP_SIMPLE_METHODS_IN_ONE_LINE" value="true" />
<option name="KEEP_SIMPLE_LAMBDAS_IN_ONE_LINE" value="true" />
<indentOptions>
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JSON">
<indentOptions>
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="XML">
<indentOptions>
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</component>
+5
View File
@@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>
+33
View File
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Annotation profile for Cryptomator" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<processorPath useClasspath="false">
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-compiler/2.20/dagger-compiler-2.20.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger/2.20/dagger-2.20.jar" />
<entry name="$MAVEN_REPOSITORY$/javax/inject/javax.inject/1/javax.inject-1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-producers/2.20/dagger-producers-2.20.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/guava/guava/25.0-jre/guava-25.0-jre.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar" />
<entry name="$MAVEN_REPOSITORY$/org/checkerframework/checker-compat-qual/2.5.3/checker-compat-qual-2.5.3.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.1.3/error_prone_annotations-2.1.3.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.jar" />
<entry name="$MAVEN_REPOSITORY$/org/codehaus/mojo/animal-sniffer-annotations/1.14/animal-sniffer-annotations-1.14.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-spi/2.20/dagger-spi-2.20.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar" />
<entry name="$MAVEN_REPOSITORY$/com/squareup/javapoet/1.11.1/javapoet-1.11.1.jar" />
<entry name="$MAVEN_REPOSITORY$/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar" />
</processorPath>
<module name="commons" />
<module name="keychain" />
<module name="launcher" />
<module name="ui" />
</profile>
</annotationProcessing>
</component>
</project>
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM">
<file url="file://$PROJECT_DIR$/main" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/main/buildkit" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/main/commons" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/main/keychain" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/main/launcher" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/main/ui" charset="UTF-8" />
</component>
</project>
+10
View File
@@ -0,0 +1,10 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
<option name="processCode" value="true" />
<option name="processLiterals" value="true" />
<option name="processComments" value="true" />
</inspection_tool>
</profile>
</component>
+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/main/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="false" project-jdk-name="11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
Generated
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
+19
View File
@@ -0,0 +1,19 @@
{
"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
}
+15
View File
@@ -0,0 +1,15 @@
{
"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
}
+19 -66
View File
@@ -1,101 +1,54 @@
language: java language: java
sudo: false sudo: false
jdk: jdk:
- oraclejdk10 - openjdk11
branches:
except:
- continuous # To avoid infinite loops, as this tag is created by this Travis config
cache: cache:
directories: directories:
- $HOME/.m2 - $HOME/.m2
env: env:
global: global:
- secure: "IfYURwZaDWuBDvyn47n0k1Zod/IQw1FF+CS5nnV08Q+NfC3vGGJMwV8m59XnbfwnWGxwvCaAbk4qP6s6+ijgZNKkvgfFMo3rfTok5zt43bIqgaFOANYV+OC/1c59gYD6ZUxhW5iNgMgU3qdsRtJuwSmfkVv/jKyLGfAbS4kN8BA=" # COVERITY_SCAN_TOKEN - secure: "HftEaabMmWn5GwKFKksUkOcelc3Mn7xazwAEy+4d4gL1+F8VhID/6DCK7nas+afUymWnxTano8Rv4Ci5MWryNkNkTH+FUPWmF3xWezc3hajSyS7RB92IZ8VPetl4Fo8UI1WwM5apDEaugalPxkIf8a7N+lpG5X/Gpumwzo3Be3w=" # BINTRAY_API_KEY
- secure: "lV9OwUbHMrMpLUH1CY+Z4puLDdFXytudyPlG1eGRsesdpuG6KM3uQVz6uAtf6lrU8DRbMM/T7ML+PmvQ4UoPPYLdLxESLLBat2qUPOIVBOhTSlCc7I0DmGy04CSvkeMy8dPaQC0ukgNiR7zwoNzfcpGRN/U9S8tziDruuHoZSrg=" # BINTRAY_API_KEY
- secure: "oWFgRTVP6lyTa7qVxlvkpm20MtVc3BtmsNXQJS6bfg2A0o/iCQMNx7OD59BaafCLGRKvCcJVESiC8FlSylVMS7CDSyYu0gg70NUiIuHp4NBM5inFWYCy/PdQsCTzr5uvNG+rMFQpMFRaCV0FrfM3tLondcVkhsHL68l93Xoexx4=" # CODACY_PROJECT_TOKEN - secure: "oWFgRTVP6lyTa7qVxlvkpm20MtVc3BtmsNXQJS6bfg2A0o/iCQMNx7OD59BaafCLGRKvCcJVESiC8FlSylVMS7CDSyYu0gg70NUiIuHp4NBM5inFWYCy/PdQsCTzr5uvNG+rMFQpMFRaCV0FrfM3tLondcVkhsHL68l93Xoexx4=" # CODACY_PROJECT_TOKEN
- secure: "zJxgytA2Ks5Xzv+7kUaUq+EBFNQw9Qec63lcMJVuXVWczjL16nKW1EzzV515ag+OWL46z3lEPForDhufw0VtFnNmaX68jkO0mp01eLrHApc1llN2Y/U8GBXfNNazN4+Kom4H+z/AO+wJr8EsKMMUczCdQ3APgd9uVI0hzXw/Z3M=" # GITHUB_API_KEY - secure: "zJxgytA2Ks5Xzv+7kUaUq+EBFNQw9Qec63lcMJVuXVWczjL16nKW1EzzV515ag+OWL46z3lEPForDhufw0VtFnNmaX68jkO0mp01eLrHApc1llN2Y/U8GBXfNNazN4+Kom4H+z/AO+wJr8EsKMMUczCdQ3APgd9uVI0hzXw/Z3M=" # GITHUB_API_KEY
- secure: "PiH/o9MLOyPdjIwECIEfj3TuUxx7QB0CIs3o1WXjqb1PbDdHDbQyvswYit6xDw9NrJp/A+ov2k00jq+n+8fLTSd4AY21y5WiJN/ccCTWUuUiFhGxOyM37aeWAPAn4rUp7D7o8jLxEdpGZAfglIzaz+GCEQYxfV/w3FDwztViXgQ=" # GPG_PASSPHRASE
addons: addons:
apt: apt:
packages: packages:
- haveged - haveged
coverity_scan:
project:
name: "cryptomator/cryptomator"
notification_email: sebastian.stenzel@cryptomator.org
build_command: "mvn -fmain/pom.xml clean test -DskipTests"
branch_pattern: release.*
install: install:
- curl -o $HOME/.m2/settings.xml https://gist.githubusercontent.com/cryptobot/cf5fbd909c4782aaeeeb7c7f4a1a43da/raw/e60ee486e34ee0c79f89f947abe2c83b4290c6bb/settings.xml - curl -o $HOME/.m2/settings.xml https://gist.githubusercontent.com/cryptobot/cf5fbd909c4782aaeeeb7c7f4a1a43da/raw/e60ee486e34ee0c79f89f947abe2c83b4290c6bb/settings.xml
- mvn -fmain/pom.xml clean install -DskipTests 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 - mvn -fmain/pom.xml clean install -DskipTests 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
script: script:
- mvn --update-snapshots -fmain/pom.xml clean test verify -Pcoverage - mvn --update-snapshots -fmain/pom.xml clean test verify -Pcoverage
after_success:
- curl -o ~/codacy-coverage-reporter.jar https://oss.sonatype.org/service/local/repositories/releases/content/com/codacy/codacy-coverage-reporter/4.0.2/codacy-coverage-reporter-4.0.2-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: before_deploy:
- |
if [[ $TRAVIS_BRANCH == "develop" ]] && [[ $TRAVIS_PULL_REQUEST == "false" ]]; then
CONTINUOUS_RELEASE_URL=`curl -s https://api.github.com/repos/cryptomator/cryptomator/releases/tags/continuous | jq -re '.url'`
echo "Existing continuous release: ${CONTINUOUS_RELEASE_URL}"
if [[ $CONTINUOUS_RELEASE_URL == http* ]]; then
curl -u cryptobot:$GITHUB_API_KEY -X DELETE $CONTINUOUS_RELEASE_URL
fi
fi
- | - |
if [[ -n "$TRAVIS_TAG" ]]; then if [[ -n "$TRAVIS_TAG" ]]; then
mvn -fmain/pom.xml org.codehaus.mojo:versions-maven-plugin:set -DnewVersion=$TRAVIS_TAG mvn -fmain/pom.xml org.codehaus.mojo:versions-maven-plugin:set -DnewVersion=$TRAVIS_TAG
elif [[ $TRAVIS_BRANCH == "develop" ]] && [[ $TRAVIS_PULL_REQUEST == "false" ]]; then elif [[ $TRAVIS_BRANCH == "develop" ]] && [[ $TRAVIS_PULL_REQUEST == "false" ]]; then
mvn -fmain/pom.xml org.codehaus.mojo:versions-maven-plugin:set -DnewVersion=SNAPSHOT-$(echo $TRAVIS_COMMIT | head -c7) mvn -fmain/pom.xml org.codehaus.mojo:versions-maven-plugin:set -DnewVersion=SNAPSHOT-$(echo $TRAVIS_COMMIT | head -c7)
git tag -f continuous
git remote add gh https://cryptobot:${GITHUB_API_KEY}@github.com/cryptomator/cryptomator.git
git push -f gh continuous
git remote remove gh
fi fi
- mvn -fmain/pom.xml clean package -Prelease -DskipTests - mvn -fmain/pom.xml clean package -Prelease -DskipTests
- gpg --import 34C80F11.gpg - export TODAY=`date +'%Y-%m-%d'`; envsubst '$TRAVIS_TAG $TODAY' < .travis-deploy-release.tmpl.json > .travis-deploy-release.json
- gpg --detach-sign -a -u 34C80F11 --batch --passphrase ${GPG_PASSPHRASE} main/ant-kit/target/antkit.zip
deploy: deploy:
- provider: releases # CONTINUOUS - provider: bintray # SNAPSHOTS
prerelease: true file: .travis-deploy-snapshot.json
api-key: $GITHUB_API_KEY user: cryptobot
tag_name: continuous key: $BINTRAY_API_KEY
overwrite: true
file_glob: true
file:
- "main/uber-jar/target/Cryptomator-*.jar"
- "main/ant-kit/target/antkit.zip"
- "main/ant-kit/target/antkit.zip.asc"
skip_cleanup: true skip_cleanup: true
name: Cryptomator continuous build
body: Automatically built on $(date +'%F %T %Z').
on: on:
repo: cryptomator/cryptomator repo: cryptomator/cryptomator
branch: develop branch: develop
condition: $TRAVIS_TAG = '' - provider: bintray # RELEASES
- provider: releases # RELEASE file: .travis-deploy-release.json
prerelease: false user: cryptobot
api_key: $GITHUB_API_KEY key: $BINTRAY_API_KEY
file:
- "main/uber-jar/target/Cryptomator-$TRAVIS_TAG.jar"
- "main/ant-kit/target/antkit.zip"
- "main/ant-kit/target/antkit.zip.asc"
skip_cleanup: true skip_cleanup: true
on: on:
repo: cryptomator/cryptomator repo: cryptomator/cryptomator
tags: true tags: true
- provider: script
script: "curl -X POST -u cryptobot:${BINTRAY_API_KEY} -H 'Content-Type: application/json' -d '{\"name\": \"${TRAVIS_TAG}\", \"vcs_tag\": \"${TRAVIS_TAG}\"}' https://api.bintray.com/packages/cryptomator/cryptomator/cryptomator-win/versions"
on:
repo: cryptomator/cryptomator
tags: true
- provider: script
script: "curl -X POST -u cryptobot:${BINTRAY_API_KEY} -H 'Content-Type: application/json' -d '{\"name\": \"${TRAVIS_TAG}\", \"vcs_tag\": \"${TRAVIS_TAG}\"}' https://api.bintray.com/packages/cryptomator/cryptomator/cryptomator-osx/versions"
on:
repo: cryptomator/cryptomator
tags: true
after_script:
- jdk_switcher use oraclejdk8
- curl -o ~/codacy-coverage-reporter-assembly-latest.jar https://oss.sonatype.org/service/local/repositories/releases/content/com/codacy/codacy-coverage-reporter/4.0.1/codacy-coverage-reporter-4.0.1-assembly.jar
- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter-assembly-latest.jar report -l Java -r main/commons/target/site/jacoco/jacoco.xml --partial
- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter-assembly-latest.jar report -l Java -r main/keychain/target/site/jacoco/jacoco.xml --partial
- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter-assembly-latest.jar report -l Java -r main/ui/target/site/jacoco/jacoco.xml --partial
- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter-assembly-latest.jar report -l Java -r main/launcher/target/site/jacoco/jacoco.xml --partial
- $JAVA_HOME/bin/java -jar ~/codacy-coverage-reporter-assembly-latest.jar final
-57
View File
@@ -1,57 +0,0 @@
-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: GnuPG v1
lQc+BFdtLXQBEACzObgsAnfD2JInQ2J7BDv0kARpfDLaNIbQJxdnSUZxJk7yOGge
64juAzkIDBq4jE5fy3ErZCHaEceDj/mVaAvIlygrQ5KZGzFCi9dZXWjKW/VBvVm0
hPUbr0NWTEMnZSXCAL03L1LVjHjfSMRAwl9gClwlff9eKW8gVIG+2gww+wQO0xnY
y6DO6xEtfxxz+hoHsygEDh+qpONSoffEWhoTdn6qh6jJ72sOi6azGqFA30mxWM6i
YNp3zrH0q8IrjS1KqzaVg7frfeok5CtPZCgdfDNBDZA/Dfbu1BxpRWEleDMLJ6zz
lh4MIKC6RqDLjkzpygP+r7XKPve/hJ6nhH9FQZqASlrjn8KheaOcLqRgScDmC9Bq
VbxgieBUpVfjj8KclxiQh51jYHPIp/1QIgwvGEY5R1Wb8QzLnNkIxWzLDKzAG5XB
F1jb5JMmwoK9dwv+X9jiPh/xZpu6dh/5o13NQoSS6/p7AdlRXyDiaNtij0VOP1Jt
UlSCPp01peyLlKr8cDdI1UQadYpbmOzMplDKD2Yf+QSiyYdIYPPrfn8tNUyhbZH8
jATI26l1ctL133Gd9o0SYoBleNPNiQqhk9T0AcaOHujQDH/dM0+9c5w/zgPkDFpQ
S/uMFEq4yMok4AARd8qBRATrGYL2sFtB4HKEXtQw/SlaaGL41EJyvpZnbwARAQAB
/gMDAoX3Q3p+1aU3YKQDwxMDDPerrO0eT7bUGdo9A3usVEHSZ/uG2hcIHYpgW/j3
nNmaoLVDEgkbpPub7tlCr6+e26J53otqYXmLSWxx0jmFGivSVRi6nyZz+HUKObCE
qi70z3fEZ8rdL6Rj24UnIHvu+9RvoW8GeoNZoy7G/hC60mPSQUvU0DE9NfMUiZVx
nxXqLlR/rwOOIMmW5FFPCFRe18oRuLZ/+AcN+COjciGE3Fj7fpCybc2rKHKsKIO9
OkMYhuHZSSxjh8Dsfaen7XOwp5S+UashEhV5d9NaSvpEgdCtH+JwAHrXOlJrUU4x
faRkJsFoej6DXdRL/vr91d2eB60A5Qtg3H+/9n/TQW/Low487h/j6Lod6JxoeYKj
L+UmIGprSn4WZYwJiLfBB/v3T33e4cHGwMiGyU4aR8KhMsv5c8UmgDqpFkeY7Sqw
accRDujoaIZviSlPgLG7UneqVk8+WR4LFtCwKXFyObTpx9JyzPYUgIj49WzHDAK+
TnYJROiC+HGetaRRG0lSS6o6eoBe+YXBl0y84+htQ8YPojDdOZ68tNbfrWKbbxG7
uOWquP30+Z+J8tlL/3o4cK3x9rYNkroreR1dA9He9Jev3/z3GzuuZAmLSIRlh6Cd
yPbn1kOfEl3L03Ty5sriJwSgdindDm3wiem0E+lkUSIYvrGnCVOPTZsTqe9+0DJz
KW5bzzIJRaCylT0ec9GTSqGvMIpqoFH8yuf5k0w0pkjhLUqDEKxgnvn2lp79eKjn
W22VHecGv98867IS7Y150ch6YSHCAcfT2D2LFD8B9NmSI3ue8BOwfq5nLEtGYmyb
+PBHKUGxU77xlaywVyxA451ok/3plg9fiGwCU605zdpAfoO1TToIi9/m3EDoJ6iv
rmV+Ox9O30W7B5hdHNgt4Lkf1LmQNatokzTcKjNIOJiWpQLgu619tMEEtIuHE7rF
lQZsVBYLHpmAZo1oQ5AqCQXlTdAp6l/ZzSh2sU5dATAxAy3hCM8zs2AawBrr9jdP
Xsj1A5aSQN/V4cbRg0VS4C0i/Z5t3Q2r+casMv3KCe+4wIwfkzeMPxRCzC4svMvp
FjnwbBUi+I3PvrOpFtIQo0hXM5wNZFujqR2nR6A+NcvfDyM30UaAs8KeSDvrDZrk
bt4W4NOfDxJrQLEeej9lMuZdI1SaoRFM2C8DO1045FKcGBeQWj5rfG9szbF2Bjp5
ZXY7yJiBi4bnl7FlJbcB6yO1N21wDmzfULx7XyyNAxQNyfId0Mcd6QKgNBsHnWsq
YPxfyCuP21G4Rhfg+Dsp4N5EUdczKFfAz+JyMkLp902OE+dM6y8Qim5HgLWsfKnO
5A6O18um2aMSSC01hmSZB6bAVH2yF66K+eBp2B1QkStNOKBel4xM0XmXfPfSxyrF
+cjTtyThstjZWUGCujGCmNyvN49/ouMkLLvLrKcN/ecZN6+ZsJokIdo1KJ2RPNbm
2I5lEKh3piZLMAim5aWQClS+GfF9UVR1jpGisQlw//cE8Afax1XASOaAiXWa7PzR
dss9SfASndOjWiB2FAyDsvqtn5vyDE/1UQHxkyNZyrA8IhPk5ytn7WTz+rczM6ZQ
cME1EMdwBVsftS/S/oTDRX9ms/78QLMbBA7qB+aQ5atQGvsV9TrIWeAv2AlYa/f7
3AFhPPY1XmmhNo1IwHQmVMoUFCI73X8LZnHHIXVV6zyGFfC/+2EwFu/c1wm9y2ct
wvHXLSm1cQNAFvSSNMeeLhpXImy1UFwbUulYZ44d//zQtDZDcnlwdG9ib3QgKFJl
bGVhc2UgTWFuYWdlcikgPHJlbGVhc2VzQGNyeXB0b21hdG9yLm9yZz6JAj4EEwEC
ACgFAldtLXQCGwMFCQWjmoAGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEFCc
nWM0yA8RW44P/2tDxJz5Ps4xYRIZie2gXZuK0Q6mpQATYX+5IZyAPBUdO5PmvwnI
CWI4uGxosJxtM9eL6iiOMIN6cxQdOMDQtdmeOW/CYM731TjtSNseIre/8Kc4O9uE
JxeeoT3Os7QUNUHMxLhfAI1gaJcYsSAJqvmLpiyOoH20n7FVxKv8B4JqG9b4zK8H
Ol9oQXMnfZA9XIYciOE2EpVD4xLg2+v4qbFaLM86ogA6xjdsImD+HqMO0icnh+Vo
Bf2EiwUieWemX6kBh37zuoQWWX1O+9BWvJ0Rk8xDWUM6dGU7Z/+cwXzz7UuXOxWT
YQlYLLgaC8HexyhrDAkOvcKOQpBYQIL0etovhzc1ZIrhBJeVE/5XsxdbLzc+adqB
SXhtrKeROklyyxaZng3nhNWGeIjPfBwXCXD7w/vbdX5KWIBhQg35s+sN3rnY099p
7eYmNS5+C/x/iTNi5rZpOKw7tvTMZxWXANYDBbfxEhecLF0C/K2oR7pelUIVGdJD
XprHXJj12FmCsfIRzbbJ7pLUy8wVDZBVjcKqo4Z4zlVDrISo74MD/hs91SWwa86f
aAt44g1aWKjXcqXjNvgKGe1GIadp6qjQT1z5kw/mg0xp0s2Plq12Z05q0zv38kcj
ynE4o6vDZcXMBHF02jH8QknXfhvQRyq/CHaQoV9pATCvuJBLML9udRd4
=BRSB
-----END PGP PRIVATE KEY BLOCK-----
-1
View File
@@ -1 +0,0 @@
/target/
-99
View File
@@ -1,99 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.cryptomator</groupId>
<artifactId>main</artifactId>
<version>1.4.0-beta2</version>
</parent>
<artifactId>ant-kit</artifactId>
<packaging>pom</packaging>
<name>Cryptomator Ant Build Kit</name>
<description>Builds a package that can be built with Ant locally</description>
<dependencies>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>launcher</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- copy libraries to target/libs/: -->
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-libs</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- copy resources to target/: -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}</outputDirectory>
<escapeString>\</escapeString>
<encoding>UTF-8</encoding>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>build.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>logback.xml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<!-- create antkit.zip: -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
<appendAssemblyId>false</appendAssemblyId>
<finalName>antkit</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>
-52
View File
@@ -1,52 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="Cryptomator" default="create-jar" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">
<taskdef uri="javafx:com.sun.javafx.tools.ant" resource="com/sun/javafx/tools/ant/antlib.xml" classpath="\${java.class.path}:\${java.home}/lib/ant-javafx.jar:." />
<!-- Define application to build -->
<fx:application id="Cryptomator" name="Cryptomator" version="${project.version}" mainClass="org.cryptomator.launcher.Cryptomator" />
<!-- Print build environment properties -->
<target name="check-env">
<echoproperties/>
</target>
<!-- Create main application jar -->
<target name="create-jar" depends="check-env">
<fx:jar destfile="antbuild/Cryptomator-${project.version}.jar">
<fx:application refid="Cryptomator" />
<fx:fileset dir="libs" includes="launcher-${project.version}.jar" />
<fx:resources>
<fx:fileset dir="libs" type="jar" includes="*.jar" excludes="launcher-${project.version}.jar" />
</fx:resources>
<fx:manifest>
<fx:attribute name="Implementation-Vendor" value="cryptomator.org" />
<fx:attribute name="Implementation-Title" value="Cryptomator"/>
<fx:attribute name="Implementation-Version" value="${project.version}" />
</fx:manifest>
</fx:jar>
</target>
<!-- Create Image -->
<target name="image" depends="create-jar">
<fx:deploy nativeBundles="image" outdir="antbuild" verbose="true">
<fx:application refid="Cryptomator" />
<fx:info title="Cryptomator" vendor="cryptomator.org" copyright="cryptomator.org" license="GPL" category="Utility"/>
<fx:platform j2se="10">
<fx:property name="logback.configurationFile" value="\${antbuild.logback.configurationFile}" />
<fx:property name="cryptomator.settingsPath" value="\${antbuild.cryptomator.settingsPath}" />
<fx:property name="cryptomator.ipcPortPath" value="\${antbuild.cryptomator.ipcPortPath}" />
<fx:property name="cryptomator.keychainPath" value="\${antbuild.cryptomator.keychainPath}"/>
<fx:jvmarg value="-Xss2m"/>
<fx:jvmarg value="-Xmx512m"/>
</fx:platform>
<fx:resources>
<fx:fileset dir="antbuild" type="jar" includes="Cryptomator-${project.version}.jar" />
<fx:fileset dir="libs" type="jar" includes="*.jar" excludes="launcher-${project.version}.jar"/>
</fx:resources>
<fx:permissions elevated="false" />
<fx:preferences install="true" />
<fx:bundleArgument arg="dropinResourcesRoot" value="\${antbuild.dropinResourcesRoot}"/>
</fx:deploy>
</target>
</project>
@@ -15,24 +15,11 @@
<outputDirectory>libs</outputDirectory> <outputDirectory>libs</outputDirectory>
</fileSet> </fileSet>
<fileSet> <fileSet>
<directory>target/fixed-binaries</directory> <directory>target/linux-libs</directory>
<filtered>false</filtered>
<outputDirectory>fixed-binaries</outputDirectory>
<fileMode>755</fileMode>
</fileSet>
<fileSet>
<directory>target/package</directory>
<filtered>false</filtered>
<outputDirectory>package</outputDirectory>
</fileSet>
<fileSet>
<directory>target</directory>
<includes> <includes>
<include>build.xml</include> <include>*.jar</include>
<include>logback.xml</include>
</includes> </includes>
<filtered>false</filtered> <outputDirectory>libs</outputDirectory>
<outputDirectory>.</outputDirectory>
</fileSet> </fileSet>
</fileSets> </fileSets>
</assembly> </assembly>
+25
View File
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<id>tarball</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>target/libs</directory>
<includes>
<include>*.jar</include>
</includes>
<outputDirectory>libs</outputDirectory>
</fileSet>
<fileSet>
<directory>target/mac-libs</directory>
<includes>
<include>*.jar</include>
</includes>
<outputDirectory>libs</outputDirectory>
</fileSet>
</fileSets>
</assembly>
+25
View File
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<id>tarball</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>target/libs</directory>
<includes>
<include>*.jar</include>
</includes>
<outputDirectory>libs</outputDirectory>
</fileSet>
<fileSet>
<directory>target/win-libs</directory>
<includes>
<include>*.jar</include>
</includes>
<outputDirectory>libs</outputDirectory>
</fileSet>
</fileSets>
</assembly>
+129
View File
@@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.cryptomator</groupId>
<artifactId>main</artifactId>
<version>1.5.0-SNAPSHOT</version>
</parent>
<artifactId>buildkit</artifactId>
<packaging>pom</packaging>
<name>Cryptomator Build Kit</name>
<description>Builds a package that can be built with Ant locally</description>
<dependencies>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>launcher</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- copy libraries to target/libs/: -->
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-libs</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
<excludeClassifiers>linux,mac,win</excludeClassifiers>
</configuration>
</execution>
<execution>
<id>copy-linux-libs</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/linux-libs</outputDirectory>
<includeGroupIds>org.openjfx</includeGroupIds>
<classifier>linux</classifier>
</configuration>
</execution>
<execution>
<id>copy-mac-libs</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/mac-libs</outputDirectory>
<includeGroupIds>org.openjfx</includeGroupIds>
<classifier>mac</classifier>
</configuration>
</execution>
<execution>
<id>copy-win-libs</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/win-libs</outputDirectory>
<includeGroupIds>org.openjfx</includeGroupIds>
<classifier>win</classifier>
</configuration>
</execution>
</executions>
</plugin>
<!-- create buildkit.zip: -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>assemble-linux</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>assembly-linux.xml</descriptor>
</descriptors>
<appendAssemblyId>false</appendAssemblyId>
<finalName>buildkit-linux</finalName>
</configuration>
</execution>
<execution>
<id>assemble-mac</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>assembly-mac.xml</descriptor>
</descriptors>
<appendAssemblyId>false</appendAssemblyId>
<finalName>buildkit-mac</finalName>
</configuration>
</execution>
<execution>
<id>assemble-win</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>assembly-win.xml</descriptor>
</descriptors>
<appendAssemblyId>false</appendAssemblyId>
<finalName>buildkit-win</finalName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
+7 -1
View File
@@ -4,13 +4,19 @@
<parent> <parent>
<groupId>org.cryptomator</groupId> <groupId>org.cryptomator</groupId>
<artifactId>main</artifactId> <artifactId>main</artifactId>
<version>1.4.0-beta2</version> <version>1.5.0-SNAPSHOT</version>
</parent> </parent>
<artifactId>commons</artifactId> <artifactId>commons</artifactId>
<name>Cryptomator Commons</name> <name>Cryptomator Commons</name>
<description>Shared utilities</description> <description>Shared utilities</description>
<dependencies> <dependencies>
<!-- JavaFx -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
</dependency>
<!-- Libs --> <!-- Libs -->
<dependency> <dependency>
<groupId>com.google.guava</groupId> <groupId>com.google.guava</groupId>
@@ -5,16 +5,7 @@
*******************************************************************************/ *******************************************************************************/
package org.cryptomator.common.settings; package org.cryptomator.common.settings;
import java.nio.ByteBuffer; import com.google.common.base.Strings;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.Base64;
import java.util.Objects;
import java.util.UUID;
import org.apache.commons.lang3.StringUtils;
import org.fxmisc.easybind.EasyBind;
import javafx.beans.Observable; import javafx.beans.Observable;
import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty; import javafx.beans.property.ObjectProperty;
@@ -22,12 +13,27 @@ import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty; 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.Objects;
import java.util.Optional;
import java.util.UUID;
/**
* The settings specific to a single vault.
* TODO: Change the name of individualMountPath and its derivatives to customMountPath
*/
public class VaultSettings { public class VaultSettings {
public static final boolean DEFAULT_UNLOCK_AFTER_STARTUP = false; public static final boolean DEFAULT_UNLOCK_AFTER_STARTUP = false;
public static final boolean DEFAULT_REAVEAL_AFTER_MOUNT = true; public static final boolean DEFAULT_REAVEAL_AFTER_MOUNT = true;
public static final boolean DEFAULT_USES_INDIVIDUAL_MOUNTPATH = false; public static final boolean DEFAULT_USES_INDIVIDUAL_MOUNTPATH = false;
public static final boolean DEFAULT_USES_READONLY_MODE = false;
private final String id; private final String id;
private final ObjectProperty<Path> path = new SimpleObjectProperty<>(); private final ObjectProperty<Path> path = new SimpleObjectProperty<>();
@@ -37,6 +43,7 @@ public class VaultSettings {
private final BooleanProperty revealAfterMount = new SimpleBooleanProperty(DEFAULT_REAVEAL_AFTER_MOUNT); private final BooleanProperty revealAfterMount = new SimpleBooleanProperty(DEFAULT_REAVEAL_AFTER_MOUNT);
private final BooleanProperty usesIndividualMountPath = new SimpleBooleanProperty(DEFAULT_USES_INDIVIDUAL_MOUNTPATH); private final BooleanProperty usesIndividualMountPath = new SimpleBooleanProperty(DEFAULT_USES_INDIVIDUAL_MOUNTPATH);
private final StringProperty individualMountPath = new SimpleStringProperty(); private final StringProperty individualMountPath = new SimpleStringProperty();
private final BooleanProperty usesReadOnlyMode = new SimpleBooleanProperty(DEFAULT_USES_READONLY_MODE);
public VaultSettings(String id) { public VaultSettings(String id) {
this.id = Objects.requireNonNull(id); this.id = Objects.requireNonNull(id);
@@ -45,7 +52,7 @@ public class VaultSettings {
} }
Observable[] observables() { Observable[] observables() {
return new Observable[]{path, mountName, winDriveLetter, unlockAfterStartup, revealAfterMount, usesIndividualMountPath, individualMountPath}; return new Observable[]{path, mountName, winDriveLetter, unlockAfterStartup, revealAfterMount, usesIndividualMountPath, individualMountPath, usesReadOnlyMode};
} }
private void deriveMountNameFromPath(Path path) { private void deriveMountNameFromPath(Path path) {
@@ -128,6 +135,18 @@ public class VaultSettings {
return individualMountPath; return individualMountPath;
} }
public Optional<String> getIndividualMountPath() {
if (usesIndividualMountPath.get()) {
return Optional.ofNullable(Strings.emptyToNull(individualMountPath.get()));
} else {
return Optional.empty();
}
}
public BooleanProperty usesReadOnlyMode() {
return usesReadOnlyMode;
}
/* Hashcode/Equals */ /* Hashcode/Equals */
@Override @Override
@@ -5,14 +5,13 @@
*******************************************************************************/ *******************************************************************************/
package org.cryptomator.common.settings; package org.cryptomator.common.settings;
import java.io.IOException; import com.google.gson.stream.JsonReader;
import java.nio.file.Paths; import com.google.gson.stream.JsonWriter;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.google.gson.stream.JsonReader; import java.io.IOException;
import com.google.gson.stream.JsonWriter; import java.nio.file.Paths;
class VaultSettingsJsonAdapter { class VaultSettingsJsonAdapter {
@@ -27,8 +26,8 @@ class VaultSettingsJsonAdapter {
out.name("unlockAfterStartup").value(value.unlockAfterStartup().get()); out.name("unlockAfterStartup").value(value.unlockAfterStartup().get());
out.name("revealAfterMount").value(value.revealAfterMount().get()); out.name("revealAfterMount").value(value.revealAfterMount().get());
out.name("usesIndividualMountPath").value(value.usesIndividualMountPath().get()); out.name("usesIndividualMountPath").value(value.usesIndividualMountPath().get());
//TODO: should this always be written? ( because it could contain metadata, which the user does not want to save!) out.name("individualMountPath").value(value.individualMountPath().get()); //TODO: should this always be written? ( because it could contain metadata, which the user may not want to save!)
out.name("individualMountPath").value(value.individualMountPath().get()); out.name("usesReadOnlyMode").value(value.usesReadOnlyMode().get());
out.endObject(); out.endObject();
} }
@@ -41,6 +40,7 @@ class VaultSettingsJsonAdapter {
boolean unlockAfterStartup = VaultSettings.DEFAULT_UNLOCK_AFTER_STARTUP; boolean unlockAfterStartup = VaultSettings.DEFAULT_UNLOCK_AFTER_STARTUP;
boolean revealAfterMount = VaultSettings.DEFAULT_REAVEAL_AFTER_MOUNT; boolean revealAfterMount = VaultSettings.DEFAULT_REAVEAL_AFTER_MOUNT;
boolean usesIndividualMountPath = VaultSettings.DEFAULT_USES_INDIVIDUAL_MOUNTPATH; boolean usesIndividualMountPath = VaultSettings.DEFAULT_USES_INDIVIDUAL_MOUNTPATH;
boolean usesReadOnlyMode = VaultSettings.DEFAULT_USES_READONLY_MODE;
in.beginObject(); in.beginObject();
while (in.hasNext()) { while (in.hasNext()) {
@@ -70,6 +70,9 @@ class VaultSettingsJsonAdapter {
case "individualMountPath": case "individualMountPath":
individualMountPath = in.nextString(); individualMountPath = in.nextString();
break; break;
case "usesReadOnlyMode":
usesReadOnlyMode = in.nextBoolean();
break;
default: default:
LOG.warn("Unsupported vault setting found in JSON: " + name); LOG.warn("Unsupported vault setting found in JSON: " + name);
in.skipValue(); in.skipValue();
@@ -85,6 +88,7 @@ class VaultSettingsJsonAdapter {
vaultSettings.revealAfterMount().set(revealAfterMount); vaultSettings.revealAfterMount().set(revealAfterMount);
vaultSettings.usesIndividualMountPath().set(usesIndividualMountPath); vaultSettings.usesIndividualMountPath().set(usesIndividualMountPath);
vaultSettings.individualMountPath().set(individualMountPath); vaultSettings.individualMountPath().set(individualMountPath);
vaultSettings.usesReadOnlyMode().set(usesReadOnlyMode);
return vaultSettings; return vaultSettings;
} }
@@ -5,7 +5,7 @@ import java.util.Arrays;
public enum VolumeImpl { public enum VolumeImpl {
WEBDAV("WebDAV"), WEBDAV("WebDAV"),
FUSE("FUSE"), FUSE("FUSE"),
DOKANY("DOKANY"); DOKANY("Dokany");
private String displayName; private String displayName;
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<groupId>org.cryptomator</groupId> <groupId>org.cryptomator</groupId>
<artifactId>main</artifactId> <artifactId>main</artifactId>
<version>1.4.0-beta2</version> <version>1.5.0-SNAPSHOT</version>
</parent> </parent>
<artifactId>keychain</artifactId> <artifactId>keychain</artifactId>
<name>System Keychain Access</name> <name>System Keychain Access</name>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<groupId>org.cryptomator</groupId> <groupId>org.cryptomator</groupId>
<artifactId>main</artifactId> <artifactId>main</artifactId>
<version>1.4.0-beta2</version> <version>1.5.0-SNAPSHOT</version>
</parent> </parent>
<artifactId>launcher</artifactId> <artifactId>launcher</artifactId>
<name>Cryptomator Launcher</name> <name>Cryptomator Launcher</name>
@@ -5,25 +5,23 @@
*******************************************************************************/ *******************************************************************************/
package org.cryptomator.launcher; package org.cryptomator.launcher;
import javafx.application.Application;
import javafx.stage.Stage;
import org.cryptomator.ui.controllers.MainController; import org.cryptomator.ui.controllers.MainController;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
public class MainApplication extends Application { public class MainApplication extends Application {
private static final Logger LOG = LoggerFactory.getLogger(MainApplication.class); private static final Logger LOG = LoggerFactory.getLogger(MainApplication.class);
private Stage primaryStage; private Stage primaryStage;
@Override @Override
public void start(Stage primaryStage) throws Exception { public void start(Stage primaryStage) {
LOG.info("JavaFX application started."); LOG.info("JavaFX application started.");
this.primaryStage = primaryStage; this.primaryStage = primaryStage;
setupFXMLClassLoader(); primaryStage.setMinWidth(652.0);
primaryStage.setMinHeight(440.0);
LauncherModule launcherModule = new LauncherModule(this, primaryStage); LauncherModule launcherModule = new LauncherModule(this, primaryStage);
LauncherComponent launcherComponent = DaggerLauncherComponent.builder() // LauncherComponent launcherComponent = DaggerLauncherComponent.builder() //
@@ -34,30 +32,14 @@ public class MainApplication extends Application {
MainController mainCtrl = launcherComponent.fxmlLoader().load("/fxml/main.fxml"); MainController mainCtrl = launcherComponent.fxmlLoader().load("/fxml/main.fxml");
mainCtrl.initStage(primaryStage); mainCtrl.initStage(primaryStage);
primaryStage.show(); primaryStage.show();
} }
@Override @Override
public void stop() throws Exception { public void stop() {
assert primaryStage != null; assert primaryStage != null;
primaryStage.hide(); primaryStage.hide();
LOG.info("JavaFX application stopped."); LOG.info("JavaFX application stopped.");
} }
// fix discussed in https://github.com/cryptomator/cryptomator/pull/29
private void setupFXMLClassLoader() {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
FXMLLoader.setDefaultClassLoader(contextClassLoader);
Platform.runLater(() -> {
/*
* This fixes a bug on OSX where the magic file open handler leads to no context class loader being set in the AppKit (event)
* thread if the application is not started opening a file.
*/
if (Thread.currentThread().getContextClassLoader() == null) {
Thread.currentThread().setContextClassLoader(contextClassLoader);
}
});
}
} }
+34 -22
View File
@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.cryptomator</groupId> <groupId>org.cryptomator</groupId>
<artifactId>main</artifactId> <artifactId>main</artifactId>
<version>1.4.0-beta2</version> <version>1.5.0-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>Cryptomator</name> <name>Cryptomator</name>
@@ -24,20 +24,22 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- dependency versions --> <!-- dependency versions -->
<cryptomator.cryptolib.version>1.2.0</cryptomator.cryptolib.version> <cryptomator.cryptolib.version>1.2.1</cryptomator.cryptolib.version>
<cryptomator.cryptofs.version>1.5.2</cryptomator.cryptofs.version> <cryptomator.cryptofs.version>1.7.0</cryptomator.cryptofs.version>
<cryptomator.jni.version>2.0.0</cryptomator.jni.version> <cryptomator.jni.version>2.0.0</cryptomator.jni.version>
<cryptomator.fuse.version>0.1.5</cryptomator.fuse.version> <cryptomator.fuse.version>1.1.0</cryptomator.fuse.version>
<cryptomator.dokany.version>0.1.2</cryptomator.dokany.version> <cryptomator.dokany.version>1.1.3</cryptomator.dokany.version>
<cryptomator.webdav.version>1.0.4</cryptomator.webdav.version> <cryptomator.webdav.version>1.0.7</cryptomator.webdav.version>
<commons-io.version>2.5</commons-io.version> <javafx.version>11.0.2</javafx.version>
<commons-lang3.version>3.6</commons-lang3.version>
<commons-io.version>2.6</commons-io.version>
<commons-lang3.version>3.8.1</commons-lang3.version>
<easybind.version>1.0.3</easybind.version> <easybind.version>1.0.3</easybind.version>
<guava.version>25.1-jre</guava.version> <guava.version>27.0-jre</guava.version>
<dagger.version>2.16</dagger.version> <dagger.version>2.20</dagger.version>
<gson.version>2.8.5</gson.version> <gson.version>2.8.5</gson.version>
<slf4j.version>1.7.25</slf4j.version> <slf4j.version>1.7.25</slf4j.version>
@@ -45,7 +47,7 @@
<junit.version>4.12</junit.version> <junit.version>4.12</junit.version>
<junit.hierarchicalrunner.version>4.12.1</junit.hierarchicalrunner.version> <junit.hierarchicalrunner.version>4.12.1</junit.hierarchicalrunner.version>
<mockito.version>2.19.0</mockito.version> <mockito.version>2.23.0</mockito.version>
<hamcrest.version>1.3</hamcrest.version> <!-- keep in sync with version required by JUnit --> <hamcrest.version>1.3</hamcrest.version> <!-- keep in sync with version required by JUnit -->
</properties> </properties>
@@ -122,6 +124,23 @@
<version>${cryptomator.jni.version}</version> <version>${cryptomator.jni.version}</version>
</dependency> </dependency>
<!-- JavaFX -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>${javafx.version}</version>
</dependency>
<!-- Logging --> <!-- Logging -->
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
@@ -249,8 +268,7 @@
<profile> <profile>
<id>release</id> <id>release</id>
<modules> <modules>
<module>uber-jar</module> <module>buildkit</module>
<module>ant-kit</module>
</modules> </modules>
</profile> </profile>
<profile> <profile>
@@ -288,7 +306,7 @@
<plugin> <plugin>
<groupId>org.jacoco</groupId> <groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId> <artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.1</version> <version>0.8.2</version>
<executions> <executions>
<execution> <execution>
<id>prepare-agent</id> <id>prepare-agent</id>
@@ -315,15 +333,9 @@
<plugins> <plugins>
<plugin> <plugin>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version> <version>3.8.0</version>
<configuration> <configuration>
<source>10</source> <release>11</release>
<target>10</target>
<release>10</release>
<compilerArgs>
<arg>--add-modules</arg>
<arg>jdk.incubator.httpclient</arg>
</compilerArgs>
<annotationProcessorPaths> <annotationProcessorPaths>
<path> <path>
<groupId>com.google.dagger</groupId> <groupId>com.google.dagger</groupId>
-48
View File
@@ -1,48 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.cryptomator</groupId>
<artifactId>main</artifactId>
<version>1.4.0-beta2</version>
</parent>
<artifactId>uber-jar</artifactId>
<name>Single über jar with all dependencies</name>
<dependencies>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>launcher</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>Cryptomator-${project.version}</finalName>
<createDependencyReducedPom>false</createDependencyReducedPom>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>org.cryptomator.launcher.Cryptomator</Main-Class>
<Implementation-Version>${project.version}</Implementation-Version>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</plugin>
</plugins>
</build>
</project>
@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE xml>
<!-- log config used during unit tests and starts from IDE. For production please specify -Dlogback.configurationFile=/path/to/config -->
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.cryptomator" level="DEBUG" />
<logger name="org.eclipse.jetty" level="INFO" />
<logger name="org.eclipse.jetty.server.Server" level="INFO" />
<logger name="org.apache" level="INFO" />
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
+11 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<groupId>org.cryptomator</groupId> <groupId>org.cryptomator</groupId>
<artifactId>main</artifactId> <artifactId>main</artifactId>
<version>1.4.0-beta2</version> <version>1.5.0-SNAPSHOT</version>
</parent> </parent>
<artifactId>ui</artifactId> <artifactId>ui</artifactId>
<name>Cryptomator GUI</name> <name>Cryptomator GUI</name>
@@ -46,6 +46,16 @@
<artifactId>cryptolib</artifactId> <artifactId>cryptolib</artifactId>
</dependency> </dependency>
<!-- JavaFx -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
</dependency>
<!-- EasyBind --> <!-- EasyBind -->
<dependency> <dependency>
<groupId>org.fxmisc.easybind</groupId> <groupId>org.fxmisc.easybind</groupId>
@@ -16,6 +16,7 @@ import java.util.Optional;
import javax.inject.Inject; import javax.inject.Inject;
import javafx.beans.Observable;
import org.cryptomator.cryptolib.api.InvalidPassphraseException; import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException; import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException;
import org.cryptomator.ui.controls.SecPasswordField; import org.cryptomator.ui.controls.SecPasswordField;
@@ -48,7 +49,7 @@ public class ChangePasswordController implements ViewController {
private final Application app; private final Application app;
private final PasswordStrengthUtil strengthRater; private final PasswordStrengthUtil strengthRater;
private final Localization localization; private final Localization localization;
private final IntegerProperty passwordStrength = new SimpleIntegerProperty(); // 0-4 private final IntegerProperty passwordStrength = new SimpleIntegerProperty(-1); // 0-4
private Optional<ChangePasswordListener> listener = Optional.empty(); private Optional<ChangePasswordListener> listener = Optional.empty();
private Vault vault; private Vault vault;
@@ -100,11 +101,9 @@ public class ChangePasswordController implements ViewController {
@Override @Override
public void initialize() { public void initialize() {
BooleanBinding oldPasswordIsEmpty = oldPasswordField.textProperty().isEmpty(); oldPasswordField.textProperty().addListener(this::passwordsChanged);
BooleanBinding newPasswordIsEmpty = newPasswordField.textProperty().isEmpty(); newPasswordField.textProperty().addListener(this::passwordsChanged);
BooleanBinding passwordsDiffer = newPasswordField.textProperty().isNotEqualTo(retypePasswordField.textProperty()); retypePasswordField.textProperty().addListener(this::passwordsChanged);
changePasswordButton.disableProperty().bind(oldPasswordIsEmpty.or(newPasswordIsEmpty.or(passwordsDiffer)));
passwordStrength.bind(EasyBind.map(newPasswordField.textProperty(), strengthRater::computeRate));
passwordStrengthLevel0.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(0), strengthRater::getBackgroundWithStrengthColor)); passwordStrengthLevel0.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(0), strengthRater::getBackgroundWithStrengthColor));
passwordStrengthLevel1.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(1), strengthRater::getBackgroundWithStrengthColor)); passwordStrengthLevel1.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(1), strengthRater::getBackgroundWithStrengthColor));
@@ -114,6 +113,14 @@ public class ChangePasswordController implements ViewController {
passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription)); passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription));
} }
private void passwordsChanged(Observable observable) {
boolean oldPasswordEmpty = oldPasswordField.getCharacters().length() == 0;
boolean newPasswordEmpty = newPasswordField.getCharacters().length() == 0;
boolean passwordsEqual = newPasswordField.getCharacters().equals(retypePasswordField.getCharacters());
changePasswordButton.setDisable(oldPasswordEmpty || newPasswordEmpty || !passwordsEqual);
passwordStrength.set(strengthRater.computeRate(newPasswordField.getCharacters().toString()));
}
@Override @Override
public Parent getRoot() { public Parent getRoot() {
return root; return root;
@@ -16,6 +16,9 @@ import java.util.Optional;
import javax.inject.Inject; import javax.inject.Inject;
import javafx.beans.Observable;
import javafx.beans.property.IntegerProperty;
import javafx.beans.value.ObservableIntegerValue;
import org.cryptomator.ui.controls.SecPasswordField; import org.cryptomator.ui.controls.SecPasswordField;
import org.cryptomator.ui.l10n.Localization; import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault; import org.cryptomator.ui.model.Vault;
@@ -42,7 +45,7 @@ public class InitializeController implements ViewController {
private final Localization localization; private final Localization localization;
private final PasswordStrengthUtil strengthRater; private final PasswordStrengthUtil strengthRater;
private ObservableValue<Integer> passwordStrength; // 0-4 private IntegerProperty passwordStrength = new SimpleIntegerProperty(-1); // strengths: 0-4
private Optional<InitializationListener> listener = Optional.empty(); private Optional<InitializationListener> listener = Optional.empty();
private Vault vault; private Vault vault;
@@ -87,10 +90,8 @@ public class InitializeController implements ViewController {
@Override @Override
public void initialize() { public void initialize() {
BooleanBinding passwordIsEmpty = passwordField.textProperty().isEmpty(); passwordField.textProperty().addListener(this::passwordsChanged);
BooleanBinding passwordsDiffer = passwordField.textProperty().isNotEqualTo(retypePasswordField.textProperty()); retypePasswordField.textProperty().addListener(this::passwordsChanged);
okButton.disableProperty().bind(passwordIsEmpty.or(passwordsDiffer));
passwordStrength = EasyBind.map(passwordField.textProperty(), strengthRater::computeRate);
passwordStrengthLevel0.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(0), strengthRater::getBackgroundWithStrengthColor)); passwordStrengthLevel0.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(0), strengthRater::getBackgroundWithStrengthColor));
passwordStrengthLevel1.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(1), strengthRater::getBackgroundWithStrengthColor)); passwordStrengthLevel1.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(1), strengthRater::getBackgroundWithStrengthColor));
@@ -100,6 +101,13 @@ public class InitializeController implements ViewController {
passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription)); passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription));
} }
private void passwordsChanged(Observable observable) {
boolean passwordsEmpty = passwordField.getCharacters().length() == 0;
boolean passwordsEqual = passwordField.getCharacters().equals(retypePasswordField.getCharacters());
okButton.setDisable(passwordsEmpty || !passwordsEqual);
passwordStrength.set(strengthRater.computeRate(passwordField.getCharacters().toString()));
}
@Override @Override
public Parent getRoot() { public Parent getRoot() {
return root; return root;
@@ -2,7 +2,7 @@
* Copyright (c) 2014, 2017 Sebastian Stenzel * Copyright (c) 2014, 2017 Sebastian Stenzel
* All rights reserved. * All rights reserved.
* This program and the accompanying materials are made available under the terms of the accompanying LICENSE file. * This program and the accompanying materials are made available under the terms of the accompanying LICENSE file.
* *
* Contributors: * Contributors:
* Sebastian Stenzel - initial API and implementation * Sebastian Stenzel - initial API and implementation
* Jean-Noël Charon - confirmation dialog on vault removal * Jean-Noël Charon - confirmation dialog on vault removal
@@ -110,7 +110,7 @@ public class MainController implements ViewController {
@Inject @Inject
public MainController(@Named("mainWindow") Stage mainWindow, ExecutorService executorService, @Named("fileOpenRequests") BlockingQueue<Path> fileOpenRequests, ExitUtil exitUtil, Localization localization, public MainController(@Named("mainWindow") Stage mainWindow, ExecutorService executorService, @Named("fileOpenRequests") BlockingQueue<Path> fileOpenRequests, ExitUtil exitUtil, Localization localization,
VaultFactory vaultFactoy, ViewControllerLoader viewControllerLoader, UpgradeStrategies upgradeStrategies, VaultList vaults, AutoUnlocker autoUnlocker) { VaultFactory vaultFactoy, ViewControllerLoader viewControllerLoader, UpgradeStrategies upgradeStrategies, VaultList vaults, AutoUnlocker autoUnlocker) {
this.mainWindow = mainWindow; this.mainWindow = mainWindow;
this.executorService = executorService; this.executorService = executorService;
this.fileOpenRequests = fileOpenRequests; this.fileOpenRequests = fileOpenRequests;
@@ -217,7 +217,26 @@ public class MainController implements ViewController {
private void gracefulShutdown() { private void gracefulShutdown() {
vaults.filtered(Vault.NOT_LOCKED).forEach(Vault::prepareForShutdown); vaults.filtered(Vault.NOT_LOCKED).forEach(Vault::prepareForShutdown);
Platform.runLater(Platform::exit); if (!vaults.filtered(Vault.NOT_LOCKED).isEmpty()) {
ButtonType tryAgainButtonType = new ButtonType(localization.getString("main.gracefulShutdown.button.tryAgain"));
ButtonType forceShutdownButtonType = new ButtonType(localization.getString("main.gracefulShutdown.button.forceShutdown"));
Alert gracefulShutdownDialog = DialogBuilderUtil.buildGracefulShutdownDialog(
localization.getString("main.gracefulShutdown.dialog.title"), localization.getString("main.gracefulShutdown.dialog.header"), localization.getString("main.gracefulShutdown.dialog.content"),
forceShutdownButtonType, ButtonType.CANCEL, forceShutdownButtonType, tryAgainButtonType);
Optional<ButtonType> choice = gracefulShutdownDialog.showAndWait();
choice.ifPresent(btnType -> {
if (tryAgainButtonType.equals(btnType)) {
gracefulShutdown();
} else if (forceShutdownButtonType.equals(btnType)) {
Platform.runLater(Platform::exit);
} else {
return;
}
});
} else {
Platform.runLater(Platform::exit);
}
} }
private void loadFont(String resourcePath) { private void loadFont(String resourcePath) {
@@ -314,7 +333,7 @@ public class MainController implements ViewController {
/** /**
* adds the given directory or selects it if it is already in the list of directories. * adds the given directory or selects it if it is already in the list of directories.
* *
* @param path to a vault directory or masterkey file * @param path to a vault directory or masterkey file
*/ */
public void addVault(final Path path, boolean select) { public void addVault(final Path path, boolean select) {
@@ -415,7 +434,13 @@ public class MainController implements ViewController {
} }
private void didPressKeyOnRoot(KeyEvent event) { private void didPressKeyOnRoot(KeyEvent event) {
if ((event.isMetaDown() || event.isControlDown()) && event.getCode().isDigitKey()) { boolean triggered;
if (SystemUtils.IS_OS_MAC) {
triggered = event.isMetaDown();
} else {
triggered = event.isControlDown() && !event.isAltDown();
}
if (triggered && event.getCode().isDigitKey()) {
int digit = Integer.valueOf(event.getText()); int digit = Integer.valueOf(event.getText());
switch (digit) { switch (digit) {
case 0: { case 0: {
@@ -8,17 +8,13 @@
******************************************************************************/ ******************************************************************************/
package org.cryptomator.ui.controllers; package org.cryptomator.ui.controllers;
import java.util.Optional;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import com.google.common.base.CharMatcher; import com.google.common.base.CharMatcher;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import javafx.beans.Observable;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.Group;
import javafx.scene.Parent; import javafx.scene.Parent;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.CheckBox; import javafx.scene.control.CheckBox;
@@ -26,13 +22,18 @@ import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent; import javafx.scene.input.KeyEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.util.StringConverter; import javafx.util.StringConverter;
import org.apache.commons.lang3.SystemUtils; import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.settings.VolumeImpl;
import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.VolumeImpl;
import org.cryptomator.ui.l10n.Localization; import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Volume;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import java.util.Optional;
@Singleton @Singleton
public class SettingsController implements ViewController { public class SettingsController implements ViewController {
@@ -48,16 +49,13 @@ public class SettingsController implements ViewController {
this.localization = localization; this.localization = localization;
this.settings = settings; this.settings = settings;
this.applicationVersion = applicationVersion; this.applicationVersion = applicationVersion;
this.webdavSettings = new Group();
} }
@FXML @FXML
private CheckBox checkForUpdatesCheckbox; private CheckBox checkForUpdatesCheckbox;
@FXML private Group webdavSettings;
private GridPane webdavVolume;
@FXML
private GridPane fuseVolume;
@FXML @FXML
private Label portFieldLabel; private Label portFieldLabel;
@@ -93,18 +91,21 @@ public class SettingsController implements ViewController {
checkForUpdatesCheckbox.setSelected(settings.checkForUpdates().get() && !areUpdatesManagedExternally()); checkForUpdatesCheckbox.setSelected(settings.checkForUpdates().get() && !areUpdatesManagedExternally());
//NIOADAPTER //NIOADAPTER
volume.getItems().addAll(getSupportedAdapters()); volume.getItems().addAll(Volume.getCurrentSupportedAdapters());
volume.setValue(settings.preferredVolumeImpl().get()); volume.setValue(settings.preferredVolumeImpl().get());
volume.setConverter(new NioAdapterImplStringConverter()); volume.setConverter(new NioAdapterImplStringConverter());
volume.valueProperty().addListener(this::setVisibilityGvfsElements);
//WEBDAV //WEBDAV
webdavVolume.visibleProperty().bind(volume.valueProperty().isEqualTo(VolumeImpl.WEBDAV)); webdavSettings.visibleProperty().bind(volume.valueProperty().isEqualTo(VolumeImpl.WEBDAV));
webdavVolume.managedProperty().bind(webdavVolume.visibleProperty()); webdavSettings.managedProperty().bind(webdavSettings.visibleProperty());
prefGvfsScheme.managedProperty().bind(webdavVolume.visibleProperty()); prefGvfsScheme.managedProperty().bind(webdavSettings.visibleProperty());
prefGvfsSchemeLabel.managedProperty().bind(webdavVolume.visibleProperty()); prefGvfsSchemeLabel.managedProperty().bind(webdavSettings.visibleProperty());
portFieldLabel.managedProperty().bind(webdavVolume.visibleProperty()); portFieldLabel.managedProperty().bind(webdavSettings.visibleProperty());
changePortButton.managedProperty().bind(webdavVolume.visibleProperty()); portFieldLabel.visibleProperty().bind(webdavSettings.visibleProperty());
portField.managedProperty().bind(webdavVolume.visibleProperty()); changePortButton.managedProperty().bind(webdavSettings.visibleProperty());
portField.managedProperty().bind(webdavSettings.visibleProperty());
portField.visibleProperty().bind(webdavSettings.visibleProperty());
portField.setText(String.valueOf(settings.port().intValue())); portField.setText(String.valueOf(settings.port().intValue()));
portField.addEventFilter(KeyEvent.KEY_TYPED, this::filterNumericKeyEvents); portField.addEventFilter(KeyEvent.KEY_TYPED, this::filterNumericKeyEvents);
changePortButton.visibleProperty().bind(settings.port().asString().isNotEqualTo(portField.textProperty())); changePortButton.visibleProperty().bind(settings.port().asString().isNotEqualTo(portField.textProperty()));
@@ -115,10 +116,6 @@ public class SettingsController implements ViewController {
prefGvfsSchemeLabel.setVisible(SystemUtils.IS_OS_LINUX); prefGvfsSchemeLabel.setVisible(SystemUtils.IS_OS_LINUX);
prefGvfsScheme.setVisible(SystemUtils.IS_OS_LINUX); prefGvfsScheme.setVisible(SystemUtils.IS_OS_LINUX);
//FUSE
fuseVolume.visibleProperty().bind(volume.valueProperty().isEqualTo(VolumeImpl.FUSE));
fuseVolume.managedProperty().bind(fuseVolume.visibleProperty());
debugModeCheckbox.setSelected(settings.debugMode().get()); debugModeCheckbox.setSelected(settings.debugMode().get());
settings.checkForUpdates().bind(checkForUpdatesCheckbox.selectedProperty()); settings.checkForUpdates().bind(checkForUpdatesCheckbox.selectedProperty());
@@ -127,11 +124,6 @@ public class SettingsController implements ViewController {
settings.debugMode().bind(debugModeCheckbox.selectedProperty()); settings.debugMode().bind(debugModeCheckbox.selectedProperty());
} }
private VolumeImpl[] getSupportedAdapters() {
// TODO: filter depending on supported drivers
return VolumeImpl.values();
}
@Override @Override
public Parent getRoot() { public Parent getRoot() {
return root; return root;
@@ -167,6 +159,11 @@ public class SettingsController implements ViewController {
} }
} }
private void setVisibilityGvfsElements(Observable obs, Object oldValue, Object newValue) {
prefGvfsSchemeLabel.setVisible(SystemUtils.IS_OS_LINUX && ((VolumeImpl) newValue).getDisplayName().equals("WebDAV"));
prefGvfsScheme.setVisible(SystemUtils.IS_OS_LINUX && ((VolumeImpl) newValue).getDisplayName().equals("WebDAV"));
}
private boolean areUpdatesManagedExternally() { private boolean areUpdatesManagedExternally() {
return Boolean.parseBoolean(System.getProperty("cryptomator.updatesManagedExternally", "false")); return Boolean.parseBoolean(System.getProperty("cryptomator.updatesManagedExternally", "false"));
} }
@@ -8,21 +8,9 @@
******************************************************************************/ ******************************************************************************/
package org.cryptomator.ui.controllers; package org.cryptomator.ui.controllers;
import javax.inject.Inject;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import com.google.common.base.CharMatcher; import com.google.common.base.CharMatcher;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import javafx.application.Application; import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
@@ -41,6 +29,8 @@ import javafx.scene.input.KeyEvent;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.scene.text.Text; import javafx.scene.text.Text;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import javafx.util.StringConverter; import javafx.util.StringConverter;
import org.apache.commons.lang3.CharUtils; import org.apache.commons.lang3.CharUtils;
import org.apache.commons.lang3.SystemUtils; import org.apache.commons.lang3.SystemUtils;
@@ -49,7 +39,6 @@ import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.common.settings.VolumeImpl; import org.cryptomator.common.settings.VolumeImpl;
import org.cryptomator.cryptolib.api.InvalidPassphraseException; import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException; import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException;
import org.cryptomator.frontend.webdav.ServerLifecycleException;
import org.cryptomator.keychain.KeychainAccess; import org.cryptomator.keychain.KeychainAccess;
import org.cryptomator.ui.controls.SecPasswordField; import org.cryptomator.ui.controls.SecPasswordField;
import org.cryptomator.ui.l10n.Localization; import org.cryptomator.ui.l10n.Localization;
@@ -62,6 +51,19 @@ import org.fxmisc.easybind.Subscription;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Named;
import java.io.File;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.NotDirectoryException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
public class UnlockController implements ViewController { public class UnlockController implements ViewController {
private static final Logger LOG = LoggerFactory.getLogger(UnlockController.class); private static final Logger LOG = LoggerFactory.getLogger(UnlockController.class);
@@ -72,6 +74,7 @@ public class UnlockController implements ViewController {
.precomputed(); .precomputed();
private final Application app; private final Application app;
private final Stage mainWindow;
private final Localization localization; private final Localization localization;
private final WindowsDriveLetters driveLetters; private final WindowsDriveLetters driveLetters;
private final ChangeListener<Character> driveLetterChangeListener = this::winDriveLetterDidChange; private final ChangeListener<Character> driveLetterChangeListener = this::winDriveLetterDidChange;
@@ -83,8 +86,9 @@ public class UnlockController implements ViewController {
private Subscription vaultSubs = Subscription.EMPTY; private Subscription vaultSubs = Subscription.EMPTY;
@Inject @Inject
public UnlockController(Application app, Localization localization, WindowsDriveLetters driveLetters, Optional<KeychainAccess> keychainAccess, Settings settings, ExecutorService executor) { public UnlockController(Application app, @Named("mainWindow") Stage mainWindow, Localization localization, WindowsDriveLetters driveLetters, Optional<KeychainAccess> keychainAccess, Settings settings, ExecutorService executor) {
this.app = app; this.app = app;
this.mainWindow = mainWindow;
this.localization = localization; this.localization = localization;
this.driveLetters = driveLetters; this.driveLetters = driveLetters;
this.keychainAccess = keychainAccess; this.keychainAccess = keychainAccess;
@@ -120,19 +124,13 @@ public class UnlockController implements ViewController {
private ChoiceBox<Character> winDriveLetter; private ChoiceBox<Character> winDriveLetter;
@FXML @FXML
private CheckBox useOwnMountPath; private CheckBox useCustomMountPoint;
@FXML @FXML
private HBox mountPathBox; private HBox customMountPoint;
@FXML @FXML
private Label mountPathLabel; private Label customMountPointLabel;
@FXML
private TextField mountPath;
@FXML
private Button changeMountPathButton;
@FXML @FXML
private ProgressIndicator progressIndicator; private ProgressIndicator progressIndicator;
@@ -152,6 +150,9 @@ public class UnlockController implements ViewController {
@FXML @FXML
private CheckBox unlockAfterStartup; private CheckBox unlockAfterStartup;
@FXML
private CheckBox useReadOnlyMode;
@Override @Override
public void initialize() { public void initialize() {
advancedOptions.managedProperty().bind(advancedOptions.visibleProperty()); advancedOptions.managedProperty().bind(advancedOptions.visibleProperty());
@@ -161,36 +162,19 @@ public class UnlockController implements ViewController {
savePassword.setDisable(!keychainAccess.isPresent()); savePassword.setDisable(!keychainAccess.isPresent());
unlockAfterStartup.disableProperty().bind(savePassword.disabledProperty().or(savePassword.selectedProperty().not())); unlockAfterStartup.disableProperty().bind(savePassword.disabledProperty().or(savePassword.selectedProperty().not()));
mountPathLabel.setVisible(false); customMountPoint.visibleProperty().bind(useCustomMountPoint.selectedProperty());
mountPathBox.visibleProperty().bind(mountPathLabel.visibleProperty()); customMountPoint.managedProperty().bind(useCustomMountPoint.selectedProperty());
mountPathBox.managedProperty().bind(mountPathLabel.managedProperty()); winDriveLetter.setConverter(new WinDriveLetterLabelConverter());
mountPath.visibleProperty().bind(mountPathLabel.visibleProperty());
mountPath.managedProperty().bind(mountPathLabel.managedProperty());
changeMountPathButton.visibleProperty().bind(mountPathLabel.visibleProperty());
changeMountPathButton.managedProperty().bind(mountPathLabel.managedProperty());
if (SystemUtils.IS_OS_WINDOWS) { if (!SystemUtils.IS_OS_WINDOWS) {
winDriveLetter.setConverter(new WinDriveLetterLabelConverter());
useOwnMountPath.setVisible(false);
useOwnMountPath.setManaged(false);
mountPathLabel.setManaged(false);
//dirty cheat
mountPathBox.setMouseTransparent(true);
} else {
winDriveLetterLabel.setVisible(false); winDriveLetterLabel.setVisible(false);
winDriveLetterLabel.setManaged(false); winDriveLetterLabel.setManaged(false);
winDriveLetter.setVisible(false); winDriveLetter.setVisible(false);
winDriveLetter.setManaged(false); winDriveLetter.setManaged(false);
if (VolumeImpl.WEBDAV.equals(settings.preferredVolumeImpl().get())) {
useOwnMountPath.setVisible(false);
useOwnMountPath.setManaged(false);
mountPathLabel.setManaged(false);
}
} }
changeMountPathButton.disableProperty().bind(Bindings.createBooleanBinding(this::isDirVaild, mountPath.textProperty()).not());
} }
@Override @Override
public Parent getRoot() { public Parent getRoot() {
return root; return root;
@@ -225,20 +209,18 @@ public class UnlockController implements ViewController {
winDriveLetter.getItems().addAll(driveLetters.getAvailableDriveLetters()); winDriveLetter.getItems().addAll(driveLetters.getAvailableDriveLetters());
winDriveLetter.getItems().sort(new WinDriveLetterComparator()); winDriveLetter.getItems().sort(new WinDriveLetterComparator());
winDriveLetter.valueProperty().addListener(driveLetterChangeListener); winDriveLetter.valueProperty().addListener(driveLetterChangeListener);
chooseSelectedDriveLetter();
} }
downloadsPageLink.setVisible(false); downloadsPageLink.setVisible(false);
messageText.setText(null); messageText.setText(null);
mountName.setText(vault.getMountName()); mountName.setText(vault.getMountName());
if (SystemUtils.IS_OS_WINDOWS) {
chooseSelectedDriveLetter();
}
savePassword.setSelected(false); savePassword.setSelected(false);
// auto-fill pw from keychain: // auto-fill pw from keychain:
if (keychainAccess.isPresent()) { if (keychainAccess.isPresent()) {
char[] storedPw = keychainAccess.get().loadPassphrase(vault.getId()); char[] storedPw = keychainAccess.get().loadPassphrase(vault.getId());
if (storedPw != null) { if (storedPw != null) {
savePassword.setSelected(true); savePassword.setSelected(true);
passwordField.setText(new String(storedPw)); passwordField.setPassword(storedPw);
passwordField.selectRange(storedPw.length, storedPw.length); passwordField.selectRange(storedPw.length, storedPw.length);
Arrays.fill(storedPw, ' '); Arrays.fill(storedPw, ' ');
} }
@@ -246,18 +228,59 @@ public class UnlockController implements ViewController {
VaultSettings vaultSettings = vault.getVaultSettings(); VaultSettings vaultSettings = vault.getVaultSettings();
unlockAfterStartup.setSelected(savePassword.isSelected() && vaultSettings.unlockAfterStartup().get()); unlockAfterStartup.setSelected(savePassword.isSelected() && vaultSettings.unlockAfterStartup().get());
revealAfterMount.setSelected(vaultSettings.revealAfterMount().get()); revealAfterMount.setSelected(vaultSettings.revealAfterMount().get());
useOwnMountPath.setSelected(vaultSettings.usesIndividualMountPath().get());
// WEBDAV-dependent controls:
if (VolumeImpl.WEBDAV.equals(settings.preferredVolumeImpl().get())) {
useCustomMountPoint.setVisible(false);
useCustomMountPoint.setManaged(false);
} else {
useCustomMountPoint.setVisible(true);
useCustomMountPoint.setSelected(vaultSettings.usesIndividualMountPath().get());
if (Strings.isNullOrEmpty(vaultSettings.individualMountPath().get())) {
customMountPointLabel.setText(localization.getString("unlock.label.chooseMountPath"));
} else {
customMountPointLabel.setText(displayablePath(vaultSettings.individualMountPath().getValueSafe()));
}
}
// DOKANY-dependent controls:
if (VolumeImpl.DOKANY.equals(settings.preferredVolumeImpl().get())) {
winDriveLetter.visibleProperty().bind(useCustomMountPoint.selectedProperty().not());
winDriveLetter.managedProperty().bind(useCustomMountPoint.selectedProperty().not());
winDriveLetterLabel.visibleProperty().bind(useCustomMountPoint.selectedProperty().not());
winDriveLetterLabel.managedProperty().bind(useCustomMountPoint.selectedProperty().not());
// readonly not yet supported by dokany
useReadOnlyMode.setSelected(false);
useReadOnlyMode.setVisible(false);
useReadOnlyMode.setManaged(false);
} else {
useReadOnlyMode.setSelected(vaultSettings.usesReadOnlyMode().get());
}
// OS-dependent controls:
if (SystemUtils.IS_OS_WINDOWS) {
winDriveLetter.visibleProperty().bind(useCustomMountPoint.selectedProperty().not());
winDriveLetter.managedProperty().bind(useCustomMountPoint.selectedProperty().not());
winDriveLetterLabel.visibleProperty().bind(useCustomMountPoint.selectedProperty().not());
winDriveLetterLabel.managedProperty().bind(useCustomMountPoint.selectedProperty().not());
}
vaultSubs = vaultSubs.and(EasyBind.subscribe(unlockAfterStartup.selectedProperty(), vaultSettings.unlockAfterStartup()::set)); vaultSubs = vaultSubs.and(EasyBind.subscribe(unlockAfterStartup.selectedProperty(), vaultSettings.unlockAfterStartup()::set));
vaultSubs = vaultSubs.and(EasyBind.subscribe(revealAfterMount.selectedProperty(), vaultSettings.revealAfterMount()::set)); vaultSubs = vaultSubs.and(EasyBind.subscribe(revealAfterMount.selectedProperty(), vaultSettings.revealAfterMount()::set));
vaultSubs = vaultSubs.and(EasyBind.subscribe(useOwnMountPath.selectedProperty(), vaultSettings.usesIndividualMountPath()::set)); vaultSubs = vaultSubs.and(EasyBind.subscribe(useCustomMountPoint.selectedProperty(), vaultSettings.usesIndividualMountPath()::set));
vaultSubs = vaultSubs.and(EasyBind.subscribe(useReadOnlyMode.selectedProperty(), vaultSettings.usesReadOnlyMode()::set));
changeMountPathButton.visibleProperty().bind( }
vaultSettings.individualMountPath().isNotEqualTo(mountPath.textProperty())
);
mountPath.textProperty().setValue(vaultSettings.individualMountPath().getValueSafe());
mountPathLabel.visibleProperty().bind(useOwnMountPath.selectedProperty());
private String displayablePath(String path) {
Path homeDir = Paths.get(SystemUtils.USER_HOME);
Path p = Paths.get(path);
if (p.startsWith(homeDir)) {
Path relativePath = homeDir.relativize(p);
String homePrefix = SystemUtils.IS_OS_WINDOWS ? "~\\" : "~/";
return homePrefix + relativePath.toString();
} else {
return p.toString();
}
} }
// **************************************** // ****************************************
@@ -284,28 +307,6 @@ public class UnlockController implements ViewController {
} }
} }
@FXML
private void didClickchangeMountPathButton(ActionEvent event) {
assert isDirVaild();
vault.setMountPath(mountPath.getText());
}
private boolean isDirVaild() {
try {
if (!mountPath.textProperty().isEmpty().get()) {
Path p = Paths.get(mountPath.textProperty().get());
return Files.isDirectory(p) && Files.isReadable(p) && Files.isWritable(p) && Files.isExecutable(p);
} else {
return false;
}
} catch (InvalidPathException e) {
LOG.info("Invalid path");
return false;
}
}
private void filterAlphanumericKeyEvents(KeyEvent t) { private void filterAlphanumericKeyEvents(KeyEvent t) {
if (!Strings.isNullOrEmpty(t.getCharacter()) && !ALPHA_NUMERIC_MATCHER.matchesAllOf(t.getCharacter())) { if (!Strings.isNullOrEmpty(t.getCharacter()) && !ALPHA_NUMERIC_MATCHER.matchesAllOf(t.getCharacter())) {
t.consume(); t.consume();
@@ -321,6 +322,15 @@ public class UnlockController implements ViewController {
} }
} }
public void didClickChooseCustomMountPoint(ActionEvent actionEvent) {
DirectoryChooser dirChooser = new DirectoryChooser();
File file = dirChooser.showDialog(mainWindow);
if (file != null) {
customMountPointLabel.setText(displayablePath(file.toString()));
vault.setCustomMountPath(file.toString());
}
}
/** /**
* Converts 'C' to "C:" to translate between model and GUI. * Converts 'C' to "C:" to translate between model and GUI.
*/ */
@@ -331,7 +341,7 @@ public class UnlockController implements ViewController {
if (letter == null) { if (letter == null) {
return localization.getString("unlock.choicebox.winDriveLetter.auto"); return localization.getString("unlock.choicebox.winDriveLetter.auto");
} else { } else {
return Character.toString(letter) + ":"; return letter + ":";
} }
} }
@@ -420,10 +430,12 @@ public class UnlockController implements ViewController {
@FXML @FXML
private void didClickUnlockButton(ActionEvent event) { private void didClickUnlockButton(ActionEvent event) {
advancedOptions.setDisable(true); advancedOptions.setDisable(true);
advancedOptions.setVisible(false);
progressIndicator.setVisible(true); progressIndicator.setVisible(true);
CharSequence password = passwordField.getCharacters(); CharSequence password = passwordField.getCharacters();
Tasks.create(() -> { Tasks.create(() -> {
messageText.setText(localization.getString("unlock.pendingMessage.unlocking"));
vault.unlock(password); vault.unlock(password);
if (keychainAccess.isPresent() && savePassword.isSelected()) { if (keychainAccess.isPresent() && savePassword.isSelected()) {
keychainAccess.get().storePassphrase(vault.getId(), password); keychainAccess.get().storePassphrase(vault.getId(), password);
@@ -447,12 +459,19 @@ public class UnlockController implements ViewController {
} else if (e.getDetectedVersion() == Integer.MAX_VALUE) { } else if (e.getDetectedVersion() == Integer.MAX_VALUE) {
messageText.setText(localization.getString("unlock.errorMessage.unauthenticVersionMac")); messageText.setText(localization.getString("unlock.errorMessage.unauthenticVersionMac"));
} }
}).onError(ServerLifecycleException.class, e -> { }).onError(NotDirectoryException.class, e -> {
LOG.error("Unlock failed. Mount point not a directory: {}", e.getMessage());
advancedOptions.setVisible(true);
messageText.setText(null);
showUnlockFailedErrorDialog("unlock.failedDialog.content.mountPathNonExisting");
}).onError(DirectoryNotEmptyException.class, e -> {
LOG.error("Unlock failed. Mount point not empty: {}", e.getMessage());
advancedOptions.setVisible(true);
messageText.setText(null);
showUnlockFailedErrorDialog("unlock.failedDialog.content.mountPathNotEmpty");
}).onError(Exception.class, e -> { // including RuntimeExceptions
LOG.error("Unlock failed for technical reasons.", e); LOG.error("Unlock failed for technical reasons.", e);
messageText.setText(localization.getString("unlock.errorMessage.unlockFailed")); messageText.setText(localization.getString("unlock.errorMessage.unlockFailed"));
}).onError(Exception.class, e -> {
LOG.error("Unlock failed for technical reasons.", e);
messageText.setText(localization.getString("unlock.errorMessage.unlockFailed"));
}).andFinally(() -> { }).andFinally(() -> {
if (!savePassword.isSelected()) { if (!savePassword.isSelected()) {
passwordField.swipe(); passwordField.swipe();
@@ -462,6 +481,14 @@ public class UnlockController implements ViewController {
}).runOnce(executor); }).runOnce(executor);
} }
private void showUnlockFailedErrorDialog(String localizableContentKey) {
String title = localization.getString("unlock.failedDialog.title");
String header = localization.getString("unlock.failedDialog.header");
String content = localization.getString(localizableContentKey);
Alert alert = DialogBuilderUtil.buildErrorDialog(title, header, content, ButtonType.OK);
alert.show();
}
/* callback */ /* callback */
public void setListener(UnlockListener listener) { public void setListener(UnlockListener listener) {
@@ -477,9 +504,9 @@ public class UnlockController implements ViewController {
/* state */ /* state */
public enum State { public enum State {
UNLOCKING(null), UNLOCKING(null), //
INITIALIZED("unlock.successLabel.vaultCreated"), INITIALIZED("unlock.successLabel.vaultCreated"), //
PASSWORD_CHANGED("unlock.successLabel.passwordChanged"), PASSWORD_CHANGED("unlock.successLabel.passwordChanged"), //
UPGRADED("unlock.successLabel.upgraded"); UPGRADED("unlock.successLabel.upgraded");
private Optional<String> successMessage; private Optional<String> successMessage;
@@ -2,25 +2,35 @@
* Copyright (c) 2014, 2017 Sebastian Stenzel * Copyright (c) 2014, 2017 Sebastian Stenzel
* All rights reserved. * All rights reserved.
* This program and the accompanying materials are made available under the terms of the accompanying LICENSE file. * This program and the accompanying materials are made available under the terms of the accompanying LICENSE file.
* *
* Contributors: * Contributors:
* Sebastian Stenzel - initial API and implementation * Sebastian Stenzel - initial API and implementation
******************************************************************************/ ******************************************************************************/
package org.cryptomator.ui.controls; package org.cryptomator.ui.controls;
import java.util.Arrays; import com.google.common.base.Strings;
import javafx.scene.control.PasswordField; import javafx.scene.control.PasswordField;
import javafx.scene.input.DragEvent; import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard; import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode; import javafx.scene.input.TransferMode;
import java.nio.CharBuffer;
import java.util.Arrays;
/** /**
* Compromise in security. While the text can be swiped, any access to the {@link #getText()} method will create a copy of the String in the heap. * Patched PasswordField that doesn't create String copies of the password in memory. Instead the password is stored in a char[] that can be swiped.
*
* @implNote Since {@link #setText(String)} is final, we can not override its behaviour. For that reason you should not use the {@link #textProperty()} for anything else than display purposes.
*/ */
public class SecPasswordField extends PasswordField { public class SecPasswordField extends PasswordField {
private static final char SWIPE_CHAR = ' '; private static final char SWIPE_CHAR = ' ';
private static final int INITIAL_BUFFER_SIZE = 50;
private static final int GROW_BUFFER_SIZE = 50;
private static final String PLACEHOLDER = "*";
private char[] content = new char[INITIAL_BUFFER_SIZE];
private int length = 0;
public SecPasswordField() { public SecPasswordField() {
this.onDragOverProperty().set(this::handleDragOver); this.onDragOverProperty().set(this::handleDragOver);
@@ -43,26 +53,54 @@ public class SecPasswordField extends PasswordField {
event.consume(); event.consume();
} }
@Override
public void replaceText(int start, int end, String text) {
int removed = end - start;
int added = text.length();
this.length += added - removed;
growContentIfNeeded();
text.getChars(0, text.length(), content, start);
String placeholderString = Strings.repeat(PLACEHOLDER, text.length());
super.replaceText(start, end, placeholderString);
}
private void growContentIfNeeded() {
if (this.length > content.length) {
char[] newContent = new char[content.length + GROW_BUFFER_SIZE];
System.arraycopy(content, 0, newContent, 0, content.length);
swipe();
this.content = newContent;
}
}
/** /**
* {@link #getContent()} uses a StringBuilder, which in turn is backed by a char[]. * Creates a CharSequence by wrapping the password characters.
* The delete operation of AbstractStringBuilder closes the gap, that forms by deleting chars, by moving up the following chars. *
* <br/> * @return A character sequence backed by the SecPasswordField's buffer (not a copy).
* Imagine the following example with <code>pass</code> being the password, <code>x</code> being the swipe char and <code>'</code> being the offset of the char array: * @implNote The CharSequence will not copy the backing char[].
* <ol> * Therefore any mutation to the SecPasswordField's content will mutate or eventually swipe the returned CharSequence.
* <li>Append filling chars to the end of the password: <code>passxxxx'</code></li> * @see #swipe()
* <li>Delete first 4 chars. Internal implementation will then copy subsequent chars to the position, where the deletion occured: <code>xxxx'xxxx</code></li> */
* <li>Delete first 4 chars again, as we appended 4 chars in step 1: <code>'xxxxxx</code></li> @Override
* </ol> public CharSequence getCharacters() {
return CharBuffer.wrap(content, 0, length);
}
public void setPassword(char[] password) {
swipe();
content = Arrays.copyOf(password, password.length);
length = password.length;
String placeholderString = Strings.repeat(PLACEHOLDER, password.length);
setText(placeholderString);
}
/**
* Destroys the stored password by overriding each character with a different character.
*/ */
public void swipe() { public void swipe() {
final int pwLength = this.getContent().length(); Arrays.fill(content, SWIPE_CHAR);
final char[] fillingChars = new char[pwLength];
Arrays.fill(fillingChars, SWIPE_CHAR);
this.getContent().insert(pwLength, new String(fillingChars), false);
this.getContent().delete(0, pwLength, true);
this.getContent().delete(0, pwLength, true);
// previous text has now been overwritten. but we still need to update the text to trigger some property bindings:
this.clear();
} }
} }
@@ -1,16 +1,29 @@
package org.cryptomator.ui.model; package org.cryptomator.ui.model;
import javax.inject.Inject; import com.google.common.base.Strings;
import java.util.Iterator;
import java.util.concurrent.ExecutorService;
import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.cryptofs.CryptoFileSystem; import org.cryptomator.cryptofs.CryptoFileSystem;
import org.cryptomator.frontend.dokany.Mount; import org.cryptomator.frontend.dokany.Mount;
import org.cryptomator.frontend.dokany.MountFactory; import org.cryptomator.frontend.dokany.MountFactory;
import org.cryptomator.frontend.dokany.MountFailedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import java.io.IOException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.NotDirectoryException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
public class DokanyVolume implements Volume { public class DokanyVolume implements Volume {
private static final Logger LOG = LoggerFactory.getLogger(DokanyVolume.class);
private static final String FS_TYPE_NAME = "Cryptomator File System"; private static final String FS_TYPE_NAME = "Cryptomator File System";
private final VaultSettings vaultSettings; private final VaultSettings vaultSettings;
@@ -25,36 +38,52 @@ public class DokanyVolume implements Volume {
this.windowsDriveLetters = windowsDriveLetters; this.windowsDriveLetters = windowsDriveLetters;
} }
@Override @Override
public boolean isSupported() { public boolean isSupported() {
return MountFactory.isApplicable(); return DokanyVolume.isSupportedStatic();
} }
//TODO: Drive letter 'A' as mount point is invalid in dokany. maybe we should do already here something against it
@Override @Override
public void mount(CryptoFileSystem fs) throws VolumeException { public void mount(CryptoFileSystem fs) throws VolumeException, IOException {
char driveLetter; Path mountPath = getMountPoint();
if (!vaultSettings.winDriveLetter().getValueSafe().equals("")) { String mountName = vaultSettings.mountName().get();
driveLetter = vaultSettings.winDriveLetter().get().charAt(0); try {
this.mount = mountFactory.mount(fs.getPath("/"), mountPath, mountName, FS_TYPE_NAME);
} catch (MountFailedException e) {
if (vaultSettings.getIndividualMountPath().isPresent()) {
LOG.warn("Failed to mount vault into {}. Is this directory currently accessed by another process (e.g. Windows Explorer)?", mountPath);
}
throw new VolumeException("Unable to mount Filesystem", e);
}
}
private Path getMountPoint() throws VolumeException, IOException {
Optional<String> optionalCustomMountPoint = vaultSettings.getIndividualMountPath();
if (optionalCustomMountPoint.isPresent()) {
Path customMountPoint = Paths.get(optionalCustomMountPoint.get());
checkProvidedMountPoint(customMountPoint);
return customMountPoint;
} else if (!Strings.isNullOrEmpty(vaultSettings.winDriveLetter().get())) {
return Paths.get(vaultSettings.winDriveLetter().get().charAt(0) + ":\\");
} else { } else {
//auto assign drive letter //auto assign drive letter
//TODO: can we assume the we have at least one free drive letter? if (!windowsDriveLetters.getAvailableDriveLetters().isEmpty()) {
return Paths.get(windowsDriveLetters.getAvailableDriveLetters().iterator().next() + ":\\");
//this is a temporary fix for 'A' being an invalid drive letter
if(!windowsDriveLetters.getAvailableDriveLetters().isEmpty()){
Iterator<Character> winDriveLetterIt = windowsDriveLetters.getAvailableDriveLetters().iterator();
do{
driveLetter = winDriveLetterIt.next();
}while (winDriveLetterIt.hasNext() && driveLetter == 65);
// if (!windowsDriveLetters.getAvailableDriveLetters().isEmpty()) {
// driveLetter = windowsDriveLetters.getAvailableDriveLetters().iterator().next();
} else { } else {
throw new VolumeException("No free drive letter available."); throw new VolumeException("No free drive letter available.");
} }
} }
String mountName = vaultSettings.mountName().get(); }
this.mount = mountFactory.mount(fs.getPath("/"), driveLetter, mountName, FS_TYPE_NAME);
private void checkProvidedMountPoint(Path mountPoint) throws IOException {
if (!Files.isDirectory(mountPoint)) {
throw new NotDirectoryException(mountPoint.toString());
}
try (DirectoryStream<Path> ds = Files.newDirectoryStream(mountPoint)) {
if (ds.iterator().hasNext()) {
throw new DirectoryNotEmptyException(mountPoint.toString());
}
}
} }
@Override @Override
@@ -69,4 +98,8 @@ public class DokanyVolume implements Volume {
public void unmount() { public void unmount() {
mount.close(); mount.close();
} }
public static boolean isSupportedStatic() {
return MountFactory.isApplicable();
}
} }
@@ -1,14 +1,5 @@
package org.cryptomator.ui.model; package org.cryptomator.ui.model;
import java.io.IOException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.inject.Inject;
import org.apache.commons.lang3.SystemUtils; import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.cryptofs.CryptoFileSystem; import org.cryptomator.cryptofs.CryptoFileSystem;
@@ -20,66 +11,86 @@ import org.cryptomator.frontend.fuse.mount.Mount;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import java.io.IOException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.DirectoryStream;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.NotDirectoryException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
public class FuseVolume implements Volume { public class FuseVolume implements Volume {
private static final Logger LOG = LoggerFactory.getLogger(FuseVolume.class); private static final Logger LOG = LoggerFactory.getLogger(FuseVolume.class);
/** // TODO: dont use fixed Strings and rather set them in some system environment variables in the cryptomator installer and load those!
* TODO: dont use fixed Strings and rather set them in some system environment variables in the cryptomator installer and load those!
*/
private static final String DEFAULT_MOUNTROOTPATH_MAC = System.getProperty("user.home") + "/Library/Application Support/Cryptomator"; private static final String DEFAULT_MOUNTROOTPATH_MAC = System.getProperty("user.home") + "/Library/Application Support/Cryptomator";
private static final String DEFAULT_MOUNTROOTPATH_LINUX = System.getProperty("user.home") + "/.Cryptomator"; private static final String DEFAULT_MOUNTROOTPATH_LINUX = System.getProperty("user.home") + "/.Cryptomator";
private static final int MAX_TMPMOUNTPOINT_CREATION_RETRIES = 10;
private final VaultSettings vaultSettings; private final VaultSettings vaultSettings;
private Mount fuseMnt; private Mount fuseMnt;
private Path mountPath; private Path mountPoint;
private boolean extraDirCreated; private boolean createdTemporaryMountPoint;
@Inject @Inject
public FuseVolume(VaultSettings vaultSettings) { public FuseVolume(VaultSettings vaultSettings) {
this.vaultSettings = vaultSettings; this.vaultSettings = vaultSettings;
this.extraDirCreated = false;
} }
@Override @Override
public void mount(CryptoFileSystem fs) throws IOException, FuseNotSupportedException, VolumeException { public void mount(CryptoFileSystem fs) throws IOException, FuseNotSupportedException, VolumeException {
String mountPath; Optional<String> optionalCustomMountPoint = vaultSettings.getIndividualMountPath();
if (vaultSettings.usesIndividualMountPath().get()) { if (optionalCustomMountPoint.isPresent()) {
//specific path given Path customMountPoint = Paths.get(optionalCustomMountPoint.get());
mountPath = vaultSettings.individualMountPath().get(); checkProvidedMountPoint(customMountPoint);
this.mountPoint = customMountPoint;
this.createdTemporaryMountPoint = false;
LOG.debug("Successfully checked custom mount point: {}", mountPoint);
} else { } else {
//choose default path & create extra directory this.mountPoint = createTemporaryMountPoint();
mountPath = createDirIfNotExist(SystemUtils.IS_OS_MAC ? DEFAULT_MOUNTROOTPATH_MAC : DEFAULT_MOUNTROOTPATH_LINUX, vaultSettings.mountName().get()); this.createdTemporaryMountPoint = true;
extraDirCreated = true; LOG.debug("Successfully created mount point: {}", mountPoint);
} }
this.mountPath = Paths.get(mountPath).toAbsolutePath();
mount(fs.getPath("/")); mount(fs.getPath("/"));
} }
private String createDirIfNotExist(String prefix, String dirName) throws IOException { private void checkProvidedMountPoint(Path mountPoint) throws IOException {
Path p = Paths.get(prefix, dirName + vaultSettings.getId()); if (!Files.isDirectory(mountPoint)) {
if (Files.isDirectory(p)) { throw new NotDirectoryException(mountPoint.toString());
try(DirectoryStream<Path> emptyCheck = Files.newDirectoryStream(p)){
if(emptyCheck.iterator().hasNext()){
throw new DirectoryNotEmptyException("Mount point is not empty.");
}
else {
LOG.info("Directory already exists and is empty. Using it as mount point.");
return p.toString();
}
}
} else {
Files.createDirectory(p);
return p.toString();
} }
try (DirectoryStream<Path> ds = Files.newDirectoryStream(mountPoint)) {
if (ds.iterator().hasNext()) {
throw new DirectoryNotEmptyException(mountPoint.toString());
}
}
}
private Path createTemporaryMountPoint() throws IOException {
Path parent = Paths.get(SystemUtils.IS_OS_MAC ? DEFAULT_MOUNTROOTPATH_MAC : DEFAULT_MOUNTROOTPATH_LINUX);
String basename = vaultSettings.getId();
for (int i = 0; i < MAX_TMPMOUNTPOINT_CREATION_RETRIES; i++) {
try {
Path mountPath = parent.resolve(basename + "_" + i);
Files.createDirectory(mountPath);
return mountPath;
} catch (FileAlreadyExistsException e) {
continue;
}
}
LOG.error("Failed to create mount path at {}/{}_x. Giving up after {} attempts.", parent, basename, MAX_TMPMOUNTPOINT_CREATION_RETRIES);
throw new FileAlreadyExistsException(parent.toString() + "/" + basename);
} }
private void mount(Path root) throws VolumeException { private void mount(Path root) throws VolumeException {
try { try {
EnvironmentVariables envVars = EnvironmentVariables.create() EnvironmentVariables envVars = EnvironmentVariables.create() //
.withMountName(vaultSettings.mountName().getValue()) .withMountName(vaultSettings.mountName().getValue()) //
.withMountPath(mountPath) .withMountPath(mountPoint) //
.build(); .build();
this.fuseMnt = FuseMountFactory.getMounter().mount(root, envVars); this.fuseMnt = FuseMountFactory.getMounter().mount(root, envVars);
} catch (CommandFailedException e) { } catch (CommandFailedException e) {
@@ -92,33 +103,55 @@ public class FuseVolume implements Volume {
try { try {
fuseMnt.revealInFileManager(); fuseMnt.revealInFileManager();
} catch (CommandFailedException e) { } catch (CommandFailedException e) {
LOG.info("Revealing the vault in file manger failed: " + e.getMessage()); LOG.debug("Revealing the vault in file manger failed: " + e.getMessage());
throw new VolumeException(e); throw new VolumeException(e);
} }
} }
@Override @Override
public synchronized void unmount() throws VolumeException { public boolean supportsForcedUnmount() {
return true;
}
@Override
public synchronized void unmountForced() throws VolumeException {
try { try {
fuseMnt.unmountForced();
fuseMnt.close(); fuseMnt.close();
} catch (CommandFailedException e) { } catch (CommandFailedException e) {
throw new VolumeException(e); throw new VolumeException(e);
} }
cleanup(); deleteTemporaryMountPoint();
} }
private void cleanup() { @Override
if (extraDirCreated) { public synchronized void unmount() throws VolumeException {
try {
fuseMnt.unmount();
fuseMnt.close();
} catch (CommandFailedException e) {
throw new VolumeException(e);
}
deleteTemporaryMountPoint();
}
private void deleteTemporaryMountPoint() {
if (createdTemporaryMountPoint) {
try { try {
Files.delete(mountPath); Files.delete(mountPoint);
LOG.debug("Successfully deleted mount point: {}", mountPoint);
} catch (IOException e) { } catch (IOException e) {
LOG.warn("Could not delete mounting directory:" + e.getMessage()); LOG.warn("Could not delete mount point: {}", e.getMessage());
} }
} }
} }
@Override @Override
public boolean isSupported() { public boolean isSupported() {
return FuseVolume.isSupportedStatic();
}
public static boolean isSupportedStatic() {
return (SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) && FuseMountFactory.isFuseSupported(); return (SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) && FuseMountFactory.isFuseSupported();
} }
@@ -5,8 +5,8 @@
*******************************************************************************/ *******************************************************************************/
package org.cryptomator.ui.model; package org.cryptomator.ui.model;
import static java.nio.charset.StandardCharsets.UTF_8; import javax.inject.Inject;
import javax.inject.Singleton;
import java.io.IOException; import java.io.IOException;
import java.nio.file.FileVisitOption; import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult; import java.nio.file.FileVisitResult;
@@ -19,11 +19,7 @@ import java.util.EnumSet;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.inject.Inject; import com.google.common.io.BaseEncoding;
import javax.inject.Singleton;
import org.apache.commons.codec.binary.Base32;
import org.apache.commons.codec.binary.BaseNCodec;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.cryptomator.cryptolib.Cryptors; import org.cryptomator.cryptolib.Cryptors;
import org.cryptomator.cryptolib.api.Cryptor; import org.cryptomator.cryptolib.api.Cryptor;
@@ -32,6 +28,8 @@ import org.cryptomator.ui.l10n.Localization;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import static java.nio.charset.StandardCharsets.UTF_8;
/** /**
* Contains the collective knowledge of all creatures who were alive during the development of vault format 3. * Contains the collective knowledge of all creatures who were alive during the development of vault format 3.
* This class uses no external classes from the crypto or shortening layer by purpose, so we don't need legacy code inside these. * This class uses no external classes from the crypto or shortening layer by purpose, so we don't need legacy code inside these.
@@ -50,7 +48,7 @@ class UpgradeVersion3to4 extends UpgradeStrategy {
private static final String NEW_FOLDER_PREFIX = "0"; private static final String NEW_FOLDER_PREFIX = "0";
private final MessageDigest sha1 = MessageDigestSupplier.SHA1.get(); private final MessageDigest sha1 = MessageDigestSupplier.SHA1.get();
private final BaseNCodec base32 = new Base32(); private final BaseEncoding base32 = BaseEncoding.base32();
@Inject @Inject
public UpgradeVersion3to4(Localization localization) { public UpgradeVersion3to4(Localization localization) {
@@ -155,7 +153,7 @@ class UpgradeVersion3to4 extends UpgradeStrategy {
String oldLongName = new String(Files.readAllBytes(oldMetadataFile), UTF_8); String oldLongName = new String(Files.readAllBytes(oldMetadataFile), UTF_8);
if (oldLongName.endsWith(OLD_FOLDER_SUFFIX)) { if (oldLongName.endsWith(OLD_FOLDER_SUFFIX)) {
String newLongName = NEW_FOLDER_PREFIX + StringUtils.removeEnd(oldLongName, OLD_FOLDER_SUFFIX); String newLongName = NEW_FOLDER_PREFIX + StringUtils.removeEnd(oldLongName, OLD_FOLDER_SUFFIX);
String newCanonicalBase32 = base32.encodeAsString(sha1.digest(newLongName.getBytes(UTF_8))); String newCanonicalBase32 = base32.encode(sha1.digest(newLongName.getBytes(UTF_8)));
String newCanonicalName = newCanonicalBase32 + LONG_FILENAME_EXT; String newCanonicalName = newCanonicalBase32 + LONG_FILENAME_EXT;
Path newMetadataFile = metadataDir.resolve(newCanonicalName.substring(0, 2)).resolve(newCanonicalName.substring(2, 4)).resolve(newCanonicalName); Path newMetadataFile = metadataDir.resolve(newCanonicalName.substring(0, 2)).resolve(newCanonicalName.substring(2, 4)).resolve(newCanonicalName);
String newName = newCanonicalBase32 + oldNameSuffix + LONG_FILENAME_EXT; String newName = newCanonicalBase32 + oldNameSuffix + LONG_FILENAME_EXT;
@@ -8,26 +8,13 @@
*******************************************************************************/ *******************************************************************************/
package org.cryptomator.ui.model; package org.cryptomator.ui.model;
import java.io.IOException; import com.google.common.base.Strings;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Predicate;
import javax.inject.Inject;
import javax.inject.Provider;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.Observable; import javafx.beans.Observable;
import javafx.beans.binding.Binding; import javafx.beans.binding.Binding;
import javafx.beans.property.ObjectProperty; import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.StringProperty;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils; import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.LazyInitializer; import org.cryptomator.common.LazyInitializer;
@@ -35,6 +22,7 @@ import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.cryptofs.CryptoFileSystem; import org.cryptomator.cryptofs.CryptoFileSystem;
import org.cryptomator.cryptofs.CryptoFileSystemProperties; import org.cryptomator.cryptofs.CryptoFileSystemProperties;
import org.cryptomator.cryptofs.CryptoFileSystemProperties.FileSystemFlags;
import org.cryptomator.cryptofs.CryptoFileSystemProvider; import org.cryptomator.cryptofs.CryptoFileSystemProvider;
import org.cryptomator.cryptolib.api.CryptoException; import org.cryptomator.cryptolib.api.CryptoException;
import org.cryptomator.cryptolib.api.InvalidPassphraseException; import org.cryptomator.cryptolib.api.InvalidPassphraseException;
@@ -43,6 +31,21 @@ import org.fxmisc.easybind.EasyBind;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Provider;
import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.NotDirectoryException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Predicate;
@PerVault @PerVault
public class Vault { public class Vault {
@@ -79,9 +82,13 @@ public class Vault {
} }
private CryptoFileSystem unlockCryptoFileSystem(CharSequence passphrase) throws NoSuchFileException, IOException, InvalidPassphraseException, CryptoException { private CryptoFileSystem unlockCryptoFileSystem(CharSequence passphrase) throws NoSuchFileException, IOException, InvalidPassphraseException, CryptoException {
List<FileSystemFlags> flags = new ArrayList<>();
if (vaultSettings.usesReadOnlyMode().get()) {
flags.add(FileSystemFlags.READONLY);
}
CryptoFileSystemProperties fsProps = CryptoFileSystemProperties.cryptoFileSystemProperties() // CryptoFileSystemProperties fsProps = CryptoFileSystemProperties.cryptoFileSystemProperties() //
.withPassphrase(passphrase) // .withPassphrase(passphrase) //
.withFlags() // .withFlags(flags) //
.withMasterkeyFilename(MASTERKEY_FILENAME) // .withMasterkeyFilename(MASTERKEY_FILENAME) //
.build(); .build();
return CryptoFileSystemProvider.newFileSystem(getPath(), fsProps); return CryptoFileSystemProvider.newFileSystem(getPath(), fsProps);
@@ -102,6 +109,9 @@ public class Vault {
public synchronized void unlock(CharSequence passphrase) throws CryptoException, IOException, Volume.VolumeException { public synchronized void unlock(CharSequence passphrase) throws CryptoException, IOException, Volume.VolumeException {
Platform.runLater(() -> state.set(State.PROCESSING)); Platform.runLater(() -> state.set(State.PROCESSING));
try { try {
if (vaultSettings.usesIndividualMountPath().get() && Strings.isNullOrEmpty(vaultSettings.individualMountPath().get())) {
throw new NotDirectoryException("");
}
CryptoFileSystem fs = getCryptoFileSystem(passphrase); CryptoFileSystem fs = getCryptoFileSystem(passphrase);
volume = volumeProvider.get(); volume = volumeProvider.get();
volume.mount(fs); volume.mount(fs);
@@ -239,11 +249,11 @@ public class Vault {
return vaultSettings.mountName().get(); return vaultSettings.mountName().get();
} }
public StringProperty getMountPathProperty() { public String getCustomMountPath() {
return vaultSettings.individualMountPath(); return vaultSettings.individualMountPath().getValueSafe();
} }
public void setMountPath(String mountPath) { public void setCustomMountPath(String mountPath) {
vaultSettings.individualMountPath().set(mountPath); vaultSettings.individualMountPath().set(mountPath);
} }
@@ -1,8 +1,10 @@
package org.cryptomator.ui.model; package org.cryptomator.ui.model;
import org.cryptomator.common.settings.VolumeImpl;
import org.cryptomator.cryptofs.CryptoFileSystem; import org.cryptomator.cryptofs.CryptoFileSystem;
import java.io.IOException; import java.io.IOException;
import java.util.stream.Stream;
/** /**
* Takes a Volume and usess it to mount an unlocked vault * Takes a Volume and usess it to mount an unlocked vault
@@ -11,12 +13,12 @@ public interface Volume {
/** /**
* Checks in constant time whether this volume type is supported on the system running Cryptomator. * Checks in constant time whether this volume type is supported on the system running Cryptomator.
*
* @return true if this volume can be mounted * @return true if this volume can be mounted
*/ */
boolean isSupported(); boolean isSupported();
/** /**
*
* @param fs * @param fs
* @throws IOException * @throws IOException
*/ */
@@ -36,6 +38,21 @@ public interface Volume {
throw new VolumeException("Operation not supported."); throw new VolumeException("Operation not supported.");
} }
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.");
}
}).toArray(VolumeImpl[]::new);
}
/** /**
* Exception thrown when a volume-specific command such as mount/unmount/reveal failed. * Exception thrown when a volume-specific command such as mount/unmount/reveal failed.
*/ */
@@ -116,11 +116,16 @@ public class WebDavVolume implements Volume {
@Override @Override
public boolean isSupported() { public boolean isSupported() {
return true; return WebDavVolume.isSupportedStatic();
} }
@Override @Override
public boolean supportsForcedUnmount() { public boolean supportsForcedUnmount() {
return mount != null && mount.forced().isPresent(); return mount != null && mount.forced().isPresent();
} }
public static boolean isSupportedStatic() {
return true;
}
} }
@@ -22,11 +22,11 @@ import org.apache.commons.lang3.SystemUtils;
@Singleton @Singleton
public final class WindowsDriveLetters { public final class WindowsDriveLetters {
private static final Set<Character> A_TO_Z; private static final Set<Character> D_TO_Z;
static { static {
try (IntStream stream = IntStream.rangeClosed('A', 'Z')) { try (IntStream stream = IntStream.rangeClosed('D', 'Z')) {
A_TO_Z = stream.mapToObj(i -> (char) i).collect(Collectors.toSet()); D_TO_Z = stream.mapToObj(i -> (char) i).collect(Collectors.toSet());
} }
} }
@@ -45,7 +45,7 @@ public final class WindowsDriveLetters {
public Set<Character> getAvailableDriveLetters() { public Set<Character> getAvailableDriveLetters() {
Set<Character> occupiedDriveLetters = getOccupiedDriveLetters(); Set<Character> occupiedDriveLetters = getOccupiedDriveLetters();
Predicate<Character> isOccupiedDriveLetter = occupiedDriveLetters::contains; Predicate<Character> isOccupiedDriveLetter = occupiedDriveLetters::contains;
return A_TO_Z.stream().filter(isOccupiedDriveLetter.negate()).collect(Collectors.toSet()); return D_TO_Z.stream().filter(isOccupiedDriveLetter.negate()).collect(Collectors.toSet());
} }
} }
@@ -38,6 +38,10 @@ public class DialogBuilderUtil {
return buildDialog(title, header, content, Alert.AlertType.CONFIRMATION, defaultButton, ButtonType.YES, ButtonType.NO); return buildDialog(title, header, content, Alert.AlertType.CONFIRMATION, defaultButton, ButtonType.YES, ButtonType.NO);
} }
public static Alert buildGracefulShutdownDialog(String title, String header, String content, ButtonType defaultButton, ButtonType... buttons) {
return buildDialog(title, header, content, Alert.AlertType.WARNING, defaultButton, buttons);
}
private static Alert buildDialog(String title, String header, String content, Alert.AlertType type, ButtonType defaultButton, ButtonType... buttons) { private static Alert buildDialog(String title, String header, String content, Alert.AlertType type, ButtonType defaultButton, ButtonType... buttons) {
Text contentText = new Text(content); Text contentText = new Text(content);
contentText.setWrappingWidth(360.0); contentText.setWrappingWidth(360.0);
+10 -17
View File
@@ -7,7 +7,6 @@
Contributors: Contributors:
Sebastian Stenzel - initial API and implementation Sebastian Stenzel - initial API and implementation
--> -->
<?import java.net.URL?>
<?import javafx.scene.layout.GridPane?> <?import javafx.scene.layout.GridPane?>
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.layout.ColumnConstraints?> <?import javafx.scene.layout.ColumnConstraints?>
@@ -27,8 +26,8 @@
</padding> </padding>
<columnConstraints> <columnConstraints>
<ColumnConstraints percentWidth="38.2"/> <ColumnConstraints percentWidth="45.00"/>
<ColumnConstraints percentWidth="61.8"/> <ColumnConstraints percentWidth="55.00"/>
</columnConstraints> </columnConstraints>
<children> <children>
@@ -45,21 +44,15 @@
<ChoiceBox GridPane.rowIndex="2" GridPane.columnIndex="1" fx:id="volume" cacheShape="true" cache="true" /> <ChoiceBox GridPane.rowIndex="2" GridPane.columnIndex="1" fx:id="volume" cacheShape="true" cache="true" />
<!-- Row 3 Alt 1--> <!-- Row 3 Alt 1-->
<GridPane fx:id="webdavVolume" vgap="12.0" hgap="12.0" GridPane.rowIndex="3" GridPane.columnIndex="0" GridPane.columnSpan="2" visible="true" cacheShape="true" cache="true"> <Label fx:id="portFieldLabel" GridPane.rowIndex="3" GridPane.columnIndex="0" text="%settings.webdav.port.label" cacheShape="true" cache="true" />
<Label fx:id="portFieldLabel" GridPane.rowIndex="3" GridPane.columnIndex="0" text="%settings.webdav.port.label" cacheShape="true" cache="true" /> <HBox GridPane.rowIndex="3" GridPane.columnIndex="1" spacing="6.0">
<HBox GridPane.rowIndex="3" GridPane.columnIndex="1" spacing="6.0"> <TextField fx:id="portField" cacheShape="true" cache="true" promptText="%settings.webdav.port.prompt" />
<TextField fx:id="portField" cacheShape="true" cache="true" promptText="%settings.webdav.port.prompt" /> <Button text="%settings.webdav.port.apply" fx:id="changePortButton" onAction="#changePort"/>
<Button text="%settings.webdav.port.apply" fx:id="changePortButton" onAction="#changePort"/> </HBox>
</HBox>
<!-- Row 4 --> <!-- Row 4 -->
<Label GridPane.rowIndex="4" GridPane.columnIndex="0" fx:id="prefGvfsSchemeLabel" text="%settings.webdav.prefGvfsScheme.label" cacheShape="true" cache="true" /> <Label GridPane.rowIndex="4" GridPane.columnIndex="0" fx:id="prefGvfsSchemeLabel" text="%settings.webdav.prefGvfsScheme.label" cacheShape="true" cache="true" />
<ChoiceBox GridPane.rowIndex="4" GridPane.columnIndex="1" fx:id="prefGvfsScheme" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" /> <ChoiceBox GridPane.rowIndex="4" GridPane.columnIndex="1" fx:id="prefGvfsScheme" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" />
</GridPane>
<!-- Row 3 Alt 2-->
<GridPane fx:id="fuseVolume" vgap="12.0" hgap="12.0" GridPane.rowIndex="3" GridPane.columnIndex="0" GridPane.columnSpan="2" visible="false" cacheShape="true" cache="true">
</GridPane>
</children> </children>
</GridPane> </GridPane>
+40 -40
View File
@@ -7,29 +7,25 @@
Contributors: Contributors:
Sebastian Stenzel - initial API and implementation Sebastian Stenzel - initial API and implementation
--> -->
<?import java.net.URL?>
<?import java.lang.String?> <?import javafx.geometry.Insets?>
<?import org.cryptomator.ui.controls.SecPasswordField?> <?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.control.Hyperlink?>
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.control.ProgressIndicator?> <?import javafx.scene.control.ProgressIndicator?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.text.TextFlow?>
<?import javafx.scene.control.Hyperlink?>
<?import javafx.scene.text.Text?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.control.Separator?> <?import javafx.scene.control.Separator?>
<?import javafx.scene.control.ChoiceBox?> <?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.Text?>
<?import javafx.scene.text.TextFlow?>
<?import org.cryptomator.ui.controls.SecPasswordField?>
<GridPane fx:controller="org.cryptomator.ui.controllers.UnlockController" fx:id="root" vgap="12.0" hgap="12.0" prefWidth="400.0" xmlns:fx="http://javafx.com/fxml" cacheShape="true" cache="true"> <GridPane fx:controller="org.cryptomator.ui.controllers.UnlockController" fx:id="root" vgap="12.0" hgap="12.0" prefWidth="400.0" xmlns:fx="http://javafx.com/fxml" cacheShape="true" cache="true">
<padding> <padding>
<Insets top="24.0" right="12.0" bottom="24.0" left="12.0" /> <Insets top="24.0" right="12.0" bottom="24.0" left="12.0" />
</padding> </padding>
<columnConstraints> <columnConstraints>
<ColumnConstraints percentWidth="38.2"/> <ColumnConstraints percentWidth="38.2"/>
<ColumnConstraints percentWidth="61.8"/> <ColumnConstraints percentWidth="61.8"/>
@@ -45,7 +41,7 @@
<Button fx:id="advancedOptionsButton" text="%unlock.button.advancedOptions.show" prefWidth="150.0" onAction="#didClickAdvancedOptionsButton" cacheShape="true" cache="true" /> <Button fx:id="advancedOptionsButton" text="%unlock.button.advancedOptions.show" prefWidth="150.0" onAction="#didClickAdvancedOptionsButton" cacheShape="true" cache="true" />
<Button fx:id="unlockButton" text="%unlock.button.unlock" defaultButton="true" prefWidth="150.0" onAction="#didClickUnlockButton" disable="true" cacheShape="true" cache="true" /> <Button fx:id="unlockButton" text="%unlock.button.unlock" defaultButton="true" prefWidth="150.0" onAction="#didClickUnlockButton" disable="true" cacheShape="true" cache="true" />
</HBox> </HBox>
<!-- Row 3 --> <!-- Row 3 -->
<Label fx:id="successMessage" cacheShape="true" cache="true" visible="true" GridPane.rowIndex="3" GridPane.columnIndex="0" GridPane.columnSpan="2"/> <Label fx:id="successMessage" cacheShape="true" cache="true" visible="true" GridPane.rowIndex="3" GridPane.columnIndex="0" GridPane.columnSpan="2"/>
@@ -54,12 +50,12 @@
<padding> <padding>
<Insets top="24.0" /> <Insets top="24.0" />
</padding> </padding>
<columnConstraints> <columnConstraints>
<ColumnConstraints percentWidth="38.2"/> <ColumnConstraints percentWidth="38.2"/>
<ColumnConstraints percentWidth="61.8"/> <ColumnConstraints percentWidth="61.8"/>
</columnConstraints> </columnConstraints>
<!-- Row 3.0 --> <!-- Row 3.0 -->
<Separator GridPane.rowIndex="0" GridPane.columnIndex="0" GridPane.columnSpan="2" cacheShape="true" cache="true"/> <Separator GridPane.rowIndex="0" GridPane.columnIndex="0" GridPane.columnSpan="2" cacheShape="true" cache="true"/>
<HBox alignment="CENTER" prefWidth="400.0" GridPane.rowIndex="0" GridPane.columnIndex="0" GridPane.columnSpan="2" cacheShape="true" cache="true"> <HBox alignment="CENTER" prefWidth="400.0" GridPane.rowIndex="0" GridPane.columnIndex="0" GridPane.columnSpan="2" cacheShape="true" cache="true">
@@ -69,50 +65,54 @@
</padding> </padding>
</Label> </Label>
</HBox> </HBox>
<!-- Row 3.1 --> <!-- Row 3.1 -->
<CheckBox GridPane.rowIndex="1" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="savePassword" text="%unlock.label.savePassword" onAction="#didClickSavePasswordCheckbox" cacheShape="true" cache="true" /> <CheckBox GridPane.rowIndex="1" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="savePassword" text="%unlock.label.savePassword" onAction="#didClickSavePasswordCheckbox" cacheShape="true" cache="true" />
<!-- Row 3.2 --> <!-- Row 3.2 -->
<CheckBox GridPane.rowIndex="2" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="unlockAfterStartup" text="%unlock.label.unlockAfterStartup" cacheShape="true" cache="true" /> <CheckBox GridPane.rowIndex="2" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="unlockAfterStartup" text="%unlock.label.unlockAfterStartup" cacheShape="true" cache="true" />
<!-- Row 3.3 --> <!-- Row 3.3 -->
<Label GridPane.rowIndex="3" GridPane.columnIndex="0" text="%unlock.label.mountName" cacheShape="true" cache="true" /> <Label GridPane.rowIndex="3" GridPane.columnIndex="0" text="%unlock.label.mountName" cacheShape="true" cache="true" />
<TextField GridPane.rowIndex="3" GridPane.columnIndex="1" fx:id="mountName" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" /> <TextField GridPane.rowIndex="3" GridPane.columnIndex="1" fx:id="mountName" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" />
<!-- Row 3.4 --> <!-- Row 3.4 -->
<CheckBox GridPane.rowIndex="4" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="revealAfterMount" text="%unlock.label.revealAfterMount" cacheShape="true" cache="true" /> <CheckBox GridPane.rowIndex="4" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="revealAfterMount" text="%unlock.label.revealAfterMount" cacheShape="true" cache="true" />
<!-- Row 3.5 Alt1 -->
<Label GridPane.rowIndex="5" GridPane.columnIndex="0" fx:id="winDriveLetterLabel" text="%unlock.label.winDriveLetter" cacheShape="true" cache="true" />
<ChoiceBox GridPane.rowIndex="5" GridPane.columnIndex="1" fx:id="winDriveLetter" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" />
<!-- Row 3.5 Alt2 --> <!-- Row 3.5 -->
<CheckBox GridPane.rowIndex="5" GridPane.columnIndex="0" fx:id="useOwnMountPath" text="%unlock.label.useOwnMountPath" cacheShape="true" cache="true" /> <CheckBox GridPane.rowIndex="5" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="useReadOnlyMode" text="%unlock.label.useReadOnlyMode" cacheShape="true" cache="true" />
<Label GridPane.rowIndex="6" GridPane.columnIndex="0" fx:id="mountPathLabel" text="%unlock.label.mountPath" cacheShape="true" cache="true" /> <!-- Row 3.6 -->
<CheckBox GridPane.rowIndex="6" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="useCustomMountPoint" text="%unlock.label.useOwnMountPath" cacheShape="true" cache="true" />
<HBox GridPane.rowIndex="6" GridPane.columnIndex="1" fx:id="mountPathBox" spacing="6.0"> <!-- Row 3.7 Alt1 -->
<TextField fx:id="mountPath" cacheShape="true" cache="true" /> <Label GridPane.rowIndex="7" GridPane.columnIndex="0" fx:id="winDriveLetterLabel" text="%unlock.label.winDriveLetter" cacheShape="true" cache="true" />
<Button text="%unlock.label.mountPathButton" fx:id="changeMountPathButton" onAction="#didClickchangeMountPathButton"/> <ChoiceBox GridPane.rowIndex="7" GridPane.columnIndex="1" fx:id="winDriveLetter" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" />
<!-- Row 3.7 Alt2 -->
<HBox fx:id="customMountPoint" GridPane.rowIndex="7" GridPane.columnIndex="0" GridPane.columnSpan="2" spacing="6" alignment="BASELINE_LEFT" cacheShape="true" cache="true">
<padding>
<Insets left="20.0" />
</padding>
<Label HBox.hgrow="ALWAYS" fx:id="customMountPointLabel" textOverrun="LEADING_ELLIPSIS" cacheShape="true" cache="true" />
<Button HBox.hgrow="NEVER" minWidth="-Infinity" text="&#xf434;" styleClass="ionicons" onAction="#didClickChooseCustomMountPoint" focusTraversable="true" cacheShape="true" cache="true" />
</HBox> </HBox>
</GridPane> </GridPane>
<!-- Row 4 --> <!-- Row 4 -->
<TextFlow GridPane.rowIndex="4" GridPane.columnIndex="0" GridPane.columnSpan="2" cacheShape="true" cache="true"> <TextFlow GridPane.rowIndex="4" GridPane.columnIndex="0" GridPane.columnSpan="2" cacheShape="true" cache="true">
<GridPane.margin> <GridPane.margin>
<Insets top="24.0"/> <Insets top="24.0"/>
</GridPane.margin> </GridPane.margin>
<children> <children>
<Text fx:id="messageText" cache="true" />
<Hyperlink fx:id="downloadsPageLink" text="%unlock.label.downloadsPageLink" visible="false" onAction="#didClickDownloadsLink" cacheShape="true" cache="true" /> <Hyperlink fx:id="downloadsPageLink" text="%unlock.label.downloadsPageLink" visible="false" onAction="#didClickDownloadsLink" cacheShape="true" cache="true" />
</children> </children>
</TextFlow> </TextFlow>
<!-- Row 5--> <!-- Row 5 -->
<ProgressIndicator progress="-1" fx:id="progressIndicator" GridPane.rowIndex="5" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.halignment="CENTER" cacheShape="true" cache="true" cacheHint="SPEED" /> <VBox GridPane.rowIndex="5" GridPane.columnIndex="0" GridPane.columnSpan="2" spacing="12.0" alignment="CENTER" cacheShape="true" cache="true">
<ProgressIndicator progress="-1" fx:id="progressIndicator" cacheShape="true" cache="true" cacheHint="SPEED" />
<Text fx:id="messageText" cache="true" />
</VBox>
</children> </children>
</GridPane> </GridPane>
+4 -7
View File
@@ -7,31 +7,28 @@
Contributors: Contributors:
Sebastian Stenzel - initial API and implementation Sebastian Stenzel - initial API and implementation
--> -->
<?import java.net.URL?>
<?import javafx.scene.image.ImageView?> <?import javafx.scene.image.ImageView?>
<?import javafx.scene.image.Image?> <?import javafx.scene.image.Image?>
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.control.Hyperlink?> <?import javafx.scene.control.Hyperlink?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.ProgressIndicator?> <?import javafx.scene.control.ProgressIndicator?>
<?import javafx.scene.control.Button?>
<VBox fx:controller="org.cryptomator.ui.controllers.WelcomeController" fx:id="root" prefWidth="400.0" prefHeight="400.0" spacing="24.0" alignment="CENTER" xmlns:fx="http://javafx.com/fxml" cacheShape="true" cache="true"> <VBox fx:controller="org.cryptomator.ui.controllers.WelcomeController" fx:id="root" prefWidth="400.0" prefHeight="400.0" spacing="24.0" alignment="CENTER" xmlns:fx="http://javafx.com/fxml" cacheShape="true" cache="true">
<VBox fx:id="checkForUpdatesContainer" spacing="6.0" alignment="CENTER" cacheShape="true" cache="true" prefHeight="64.0"> <VBox fx:id="checkForUpdatesContainer" spacing="6.0" alignment="CENTER" cacheShape="true" cache="true" prefHeight="64.0">
<HBox alignment="CENTER" spacing="5.0" cacheShape="true" cache="true"> <HBox alignment="CENTER" spacing="5.0" cacheShape="true" cache="true">
<Label fx:id="checkForUpdatesStatus" cacheShape="true" cache="true" /> <Label fx:id="checkForUpdatesStatus" cacheShape="true" cache="true" />
<ProgressIndicator fx:id="checkForUpdatesIndicator" progress="-1" prefWidth="15.0" prefHeight="15.0" cacheShape="true" cache="true" cacheHint="SPEED" /> <ProgressIndicator fx:id="checkForUpdatesIndicator" progress="-1" prefWidth="15.0" prefHeight="15.0" visible="false" cacheShape="true" cache="true" cacheHint="SPEED" />
</HBox> </HBox>
<Hyperlink wrapText="true" textAlignment="CENTER" fx:id="updateLink" onAction="#didClickUpdateLink" cacheShape="true" cache="true" disable="true" /> <Hyperlink wrapText="true" textAlignment="CENTER" fx:id="updateLink" onAction="#didClickUpdateLink" cacheShape="true" cache="true" disable="true" />
</VBox> </VBox>
<ImageView fitHeight="200.0" preserveRatio="true" smooth="true" cache="true" style="-fx-background-color: green;"> <ImageView fitHeight="200.0" preserveRatio="true" smooth="true" cache="true" style="-fx-background-color: green;">
<Image url="/bot_welcome.png"/> <Image url="/bot_welcome.png"/>
</ImageView> </ImageView>
<VBox prefHeight="64.0"/> <VBox prefHeight="64.0"/>
</VBox> </VBox>
+19 -8
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = فشل فك التشفير
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = اغلاق المحفظة unlocked.button.lock = اغلاق المحفظة
unlocked.moreOptions.reveal = Reveal Drive unlocked.moreOptions.reveal = Reveal Drive
unlocked.moreOptions.copyUrl = نسخ رابط ويب داف ( WebDAV )
unlocked.label.revealFailed = Command failed unlocked.label.revealFailed = Command failed
unlocked.label.unmountFailed = Ejecting drive failed unlocked.label.unmountFailed = Ejecting drive failed
unlocked.label.statsEncrypted = مشفر unlocked.label.statsEncrypted = مشفر
@@ -86,29 +85,41 @@ upgrade.version3to4.title = Vault Version 3 to 4 Upgrade
upgrade.version4to5.title = Vault Version 4 to 5 Upgrade upgrade.version4to5.title = Vault Version 4 to 5 Upgrade
upgrade.version4to5.msg = This vault needs to be migrated to a newer format.\nEncrypted files will be updated.\nPlease make sure synchronization has finished before proceeding.\n\nNote\: Modification date of all files will be changed to the current date/time in the process. upgrade.version4to5.msg = This vault needs to be migrated to a newer format.\nEncrypted files will be updated.\nPlease make sure synchronization has finished before proceeding.\n\nNote\: Modification date of all files will be changed to the current date/time in the process.
upgrade.version4to5.err.io = Migration failed due to an I/O Exception. See log file for details. upgrade.version4to5.err.io = Migration failed due to an I/O Exception. See log file for details.
unlock.label.mountAfterUnlock = Mount Drive
unlock.label.revealAfterMount = Reveal Drive unlock.label.revealAfterMount = Reveal Drive
unlocked.lock.force.confirmation.title = Locking of %1$s failed unlocked.lock.force.confirmation.title = Locking of %1$s failed
unlocked.lock.force.confirmation.header = Do you want to force locking? unlocked.lock.force.confirmation.header = Do you want to force locking?
unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost. unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost.
unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental) unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental)
unlock.errorMessage.unlockFailed = Unlock failed. See log file for details. unlock.errorMessage.unlockFailed = Unlock failed. See log file for details.
unlocked.moreOptions.mount = Mount Drive
unlocked.moreOptions.unmount = Eject Drive
upgrade.version5toX.title = Vault Version Upgrade upgrade.version5toX.title = Vault Version Upgrade
upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding. upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding.
main.createVault.nonEmptyDir.title = Creating vault failed main.createVault.nonEmptyDir.title = Creating vault failed
main.createVault.nonEmptyDir.header = Chosen directory is not empty main.createVault.nonEmptyDir.header = Chosen directory is not empty
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory. main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
unlock.label.mountPath = Mount Path
unlock.label.mountPathButton = Apply
settings.webdav.port.label = WebDAV Port settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.port.prompt = 0 \= Choose automatically
settings.webdav.port.apply = Apply settings.webdav.port.apply = Apply
settings.webdav.prefGvfsScheme.label = WebDAV Scheme settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode * settings.volume.label = Preferred Volume Type
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try again
main.gracefulShutdown.button.forceShutdown = Force shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+30 -19
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = Неуспешно декрипт
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Заключване на Сейфа unlocked.button.lock = Заключване на Сейфа
unlocked.moreOptions.reveal = Покажи диска unlocked.moreOptions.reveal = Покажи диска
unlocked.moreOptions.copyUrl = Копиране адреса на WebDAV
unlocked.label.revealFailed = Командата е неуспешна unlocked.label.revealFailed = Командата е неуспешна
unlocked.label.unmountFailed = Изваждането на диска е неуспешно unlocked.label.unmountFailed = Изваждането на диска е неуспешно
unlocked.label.statsEncrypted = криптирано unlocked.label.statsEncrypted = криптирано
@@ -57,7 +56,7 @@ settings.checkForUpdates.label = Проверка за обновления
settings.requiresRestartLabel = * Криптоматор трябва да се рестартира settings.requiresRestartLabel = * Криптоматор трябва да се рестартира
# tray icon # tray icon
tray.menu.open = Отворяне tray.menu.open = Отворяне
tray.menu.quit = Излизане tray.menu.quit = Изход
tray.infoMsg.title = Все още върви tray.infoMsg.title = Все още върви
tray.infoMsg.msg = Криптоматор все още върви. Излезте от иконата в трея. tray.infoMsg.msg = Криптоматор все още върви. Излезте от иконата в трея.
tray.infoMsg.msg.osx = Криптоматор все още върви. Излезте от иконата в менюто. tray.infoMsg.msg.osx = Криптоматор все още върви. Излезте от иконата в менюто.
@@ -86,29 +85,41 @@ upgrade.version3to4.title = Обновяване на сейф от 3-та до
upgrade.version4to5.title = Обновяване на сейф от 4-та до 5-та версия upgrade.version4to5.title = Обновяване на сейф от 4-та до 5-та версия
upgrade.version4to5.msg = Този сейф трябва да бъде променен към по-нов формат.\nКриптираните файлове ще бъдат обновени.\nМоля, проверете дали сихронизацията е приключила преди да продължите.\n\nЗабележка\: Датата на промяна на всички файлове ще бъде обновена до момента. upgrade.version4to5.msg = Този сейф трябва да бъде променен към по-нов формат.\nКриптираните файлове ще бъдат обновени.\nМоля, проверете дали сихронизацията е приключила преди да продължите.\n\nЗабележка\: Датата на промяна на всички файлове ще бъде обновена до момента.
upgrade.version4to5.err.io = Преместването провалено поради грешка в диска. Вижте лог файла за детайли. upgrade.version4to5.err.io = Преместването провалено поради грешка в диска. Вижте лог файла за детайли.
unlock.label.mountAfterUnlock = Закачане на диска
unlock.label.revealAfterMount = Показване на диска unlock.label.revealAfterMount = Показване на диска
unlocked.lock.force.confirmation.title = Заключването на %1$s провалено unlocked.lock.force.confirmation.title = Заключването на %1$s провалено
unlocked.lock.force.confirmation.header = Желаете ли принудително заключване? unlocked.lock.force.confirmation.header = Желаете ли принудително заключване?
unlocked.lock.force.confirmation.content = Това е може би защото други програми все още използват файловете в сейфа или защото има някакъв друг проблем.\n\nПрограмите, имащи достъп до файловете, може да не работят правилно и информацията, незаписана от тези програми, може да бъде изгубена. unlocked.lock.force.confirmation.content = Това е може би защото други програми все още използват файловете в сейфа или защото има някакъв друг проблем.\n\nПрограмите, имащи достъп до файловете, може да не работят правилно и информацията, незаписана от тези програми, може да бъде изгубена.
unlock.label.unlockAfterStartup = Автоматично отключване при стартиране (Експериментално) unlock.label.unlockAfterStartup = Автоматично отключване при стартиране (Експериментално)
unlock.errorMessage.unlockFailed = Грешка при отключване. Вижте лог файла за детайли. unlock.errorMessage.unlockFailed = Грешка при отключване. Вижте лог файла за детайли.
unlocked.moreOptions.mount = Закачане на диск
unlocked.moreOptions.unmount = Изваждане на диск
upgrade.version5toX.title = Обновяване на версията на сейфа upgrade.version5toX.title = Обновяване на версията на сейфа
upgrade.version5toX.msg = Този сейф трябва да бъде обновен до по-нов формат.\nМоля, уверете се, че сихронизацията е приключила, преди да продължите. upgrade.version5toX.msg = Този сейф трябва да бъде обновен до по-нов формат.\nМоля, уверете се, че сихронизацията е приключила, преди да продължите.
main.createVault.nonEmptyDir.title = Creating vault failed main.createVault.nonEmptyDir.title = Неуспешно създаване на сейф
main.createVault.nonEmptyDir.header = Chosen directory is not empty main.createVault.nonEmptyDir.header = Избраната директория не е празна
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory. main.createVault.nonEmptyDir.content = Избраната директория съдържа файлове /може би скрити/. Сейфът може да бъде създаден само в празна директория
unlock.label.mountPath = Mount Path settings.webdav.port.label = WebCAM порт
unlock.label.mountPathButton = Apply settings.webdav.port.prompt = 0 \= Автоматично избиране
settings.webdav.port.label = WebDAV Port settings.webdav.port.apply = Приложи
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.prefGvfsScheme.label = WebDAV схема
settings.webdav.port.apply = Apply settings.volume.label = Метод за точка
settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = Предпазител
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Сейфът беше създаден успешно
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Паролата беше сменена успешно
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Криптоматор беше обновен
unlock.label.useOwnMountPath = Използвайте собствена точка за монтиране
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try again
main.gracefulShutdown.button.forceShutdown = Force shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
@@ -0,0 +1,125 @@
app.name = Cryptomator
# main.fxml
main.emptyListInstructions = Feu click ací per afegir una caixa forta
main.directoryList.contextMenu.remove = Elimina de la llista
main.directoryList.contextMenu.changePassword = Canvia la contrasenya
main.addDirectory.contextMenu.new = Crea una caixa forta nova
main.addDirectory.contextMenu.open = Obri una caixa forta existent
# welcome.fxml
welcome.checkForUpdates.label.currentlyChecking = Comprovant actualitzacions
welcome.newVersionMessage = La versió %1$s és disponible per descarregar.\nLa versió actual és %2$s.
# initialize.fxml
initialize.label.password = Contrasenya
initialize.label.retypePassword = Torneu a escriure la contrasenya
initialize.button.ok = Crea una caixa forta
initialize.messageLabel.alreadyInitialized = La caixa forta ja està inicialitzada
initialize.messageLabel.initializationFailed = No s'ha pogut inicialitzar la caixa forta. Consulteu l'arxiu de registre per a més informació.
# notfound.fxml
notfound.label = No s'ha trobat la caixa forta. S'ha mogut a altre lloc?
# upgrade.fxml
upgrade.button = Actualitza la caixa forta
upgrade.version3dropBundleExtension.msg = Esta caixa forta es deu actualitzar a un format més modern.\nEs va a canviar el nom de "%1$s" a "%2$s".\nAssegureu-vos de que la sincronització ha acabat abans d'iniciar el procés.
upgrade.version3dropBundleExtension.err.alreadyExists = Error en la migració automàtica.\n"%s" ja existeix.
# unlock.fxml
unlock.label.password = Contrasenya
unlock.label.mountName = Nom de la unitat
unlock.label.winDriveLetter = Lletra de la unitat
unlock.label.downloadsPageLink = Totes les versions de Cryptomator
unlock.label.advancedHeading = Opcions avançades
unlock.button.unlock = Debloqueja la caixa forta
unlock.button.advancedOptions.show = Més opcions
unlock.button.advancedOptions.hide = Menys opcions
unlock.choicebox.winDriveLetter.auto = Assigna automàticament
unlock.errorMessage.wrongPassword = Contrasenya incorrecta
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = La caixa forta no és compatible. Aquesta caixa forta s'ha creat amb una versió anterior de Cryptomator.
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = La caixa forta no és compatible. Aquesta caixa forta s'ha creat amb una versió més nova de Cryptomator.
unlock.messageLabel.startServerFailed = S'ha produït un error en iniciar el servidor WebDAV.
# change_password.fxml
changePassword.label.oldPassword = Contrasenya antiga
changePassword.label.newPassword = Contrasenya nova
changePassword.label.retypePassword = Torneu a escriure la contrasenya
changePassword.label.downloadsPageLink = Totes les versions de Cryptomator
changePassword.button.change = Canvia la contrasenya
changePassword.errorMessage.wrongPassword = Contrasenya incorrecta
changePassword.errorMessage.decryptionFailed = Ha fallat el desencriptatge
# unlocked.fxml
unlocked.button.lock = Bloqueja la caixa forta
unlocked.moreOptions.reveal = Mostra la unitat
unlocked.label.revealFailed = L'ordre ha fallat
unlocked.label.unmountFailed = Error al expulsar la unidad
unlocked.label.statsEncrypted = xifrat
unlocked.label.statsDecrypted = desxifrat
unlocked.ioGraph.yAxis.label = Velocitat de transferència de dades (MiB/s)
# settings.fxml
settings.version.label = Versió %s
settings.checkForUpdates.label = Comprova si hi ha actualitzacions
settings.requiresRestartLabel = És necessari reiniciar * Cryptomator
# tray icon
tray.menu.open = Obri
tray.menu.quit = Surt
tray.infoMsg.title = Encara s'està executant
tray.infoMsg.msg = Cryptomator encara està executant-se. Sortiu des de la icona de la safata.
tray.infoMsg.msg.osx = Cryptomator encara està executant-se. Sortiu des de la icona de la barra de menú
initialize.messageLabel.passwordStrength.0 = Molt dèbil
initialize.messageLabel.passwordStrength.1 = Dèbil
initialize.messageLabel.passwordStrength.2 = Acceptable
initialize.messageLabel.passwordStrength.3 = Forta
initialize.messageLabel.passwordStrength.4 = Molt forta
initialize.label.doNotForget = IMPORTANT\: No hi ha manera de recuperar les dades si oblideu la contrasenya.
main.directoryList.remove.confirmation.title = Suprimeix la caixa forta
main.directoryList.remove.confirmation.header = ¿Esteu segur que voleu suprimir aquesta caixa forta?
main.directoryList.remove.confirmation.content = La caixa forta només es suprimeix de la llista. Per tal de eliminar-la permanentment esborreu la caixa forta del vostre sistema de fitxers.
upgrade.version3to4.msg = S'ha de migrar la caixa forta a un format més nou.\nS'actualitzaran els noms xifrats de les carpetes.\nAssegureu-vos que la sincronització ha acabat abans de continuar.
upgrade.version3to4.err.io = Error en la migració degut a una excepció de E/S. Comproveu el registre per veure'n els detalls.\n
# upgrade.fxml
upgrade.confirmation.label = Sí, m'he assegurat que la sincronització hagi acabat
unlock.label.savePassword = Desa la contrasenya
unlock.errorMessage.unauthenticVersionMac = No s'ha pogut autenticar la versió de MAC.
unlocked.label.mountFailed = Ha fallat el muntatge de la unitat
unlock.savePassword.delete.confirmation.title = Elimina la contrasenya desada
unlock.savePassword.delete.confirmation.header = Esteu segur que voleu eliminar la contrasenya desada d'aquesta unitat?
unlock.savePassword.delete.confirmation.content = La contrasenya desada d'aquesta caixa forta va a ser eliminada inmediatament del clauer del seu sistema. Si voleu tornar a desar la contrasenya haureu de tornar a desbloquejar la vostra caixa forta i activar l'opció "Desa la contrasenya".
settings.debugMode.label = Mode de depuració *
upgrade.version3dropBundleExtension.title = Actualitza la caixa forta a la versió 3 (Drop Bundle Extension)
upgrade.version3to4.title = Actualitza la caixa forta de la versió 3 a la 4
upgrade.version4to5.title = Actualitza la caixa forta de la versió 4 a la 5
upgrade.version4to5.msg = S'ha de migrar la caixa forta a un format més nou.\nS'actualitzaran els fitxers xifrats.\nAssegureu-vos que la sincronització ha acabat abans de continuar.\n\nNota\: la data de modificació de tots els fitxers es canviarà a la data/hora del procés.
upgrade.version4to5.err.io = La migració ha fallat a causa d'una excepció d'E/S. Comproveu el registre per veure'n els detalls.
unlock.label.revealAfterMount = Mostra la unitat
unlocked.lock.force.confirmation.title = Ha fallat el bloqueig de %1$s
unlocked.lock.force.confirmation.header = Voleu forçar el bloqueig?
unlocked.lock.force.confirmation.content = Això pot ser perquè altres programes encara estan accedint als fitxers de la caixa forta o perquè s'ha produït un altre problema.\n\nEls programes què encara estan accedint als fitxers poden funcionar incorrectament i les dades què aquests programes no hagin escrit es poden perdre.
unlock.label.unlockAfterStartup = Desbloqueig automàtic al iniciar (experimental)
unlock.errorMessage.unlockFailed = Ha fallat el desbloqueig. Comproveu el registre per veure'n els detalls.
upgrade.version5toX.title = Actualització de la versió de la caixa forta
upgrade.version5toX.msg = S'ha de migrar la caixa forta a un format més nou.\nAssegureu-vos que la sincronització ha acabat abans de continuar.
main.createVault.nonEmptyDir.title = Ha fallat la creació de la caixa forta
main.createVault.nonEmptyDir.header = El directori seleccionat no és buit
main.createVault.nonEmptyDir.content = Hi ha fitxers (possibement ocults) al directori seleccionat. Només es pot crear una caixa forta a un directori buit.
settings.webdav.port.label = Port WebDAV
settings.webdav.port.prompt = 0 \= Tria automàticament
settings.webdav.port.apply = Aplica
settings.webdav.prefGvfsScheme.label = Esquema de WebDAV
settings.volume.label = Tipus de volum preferit
settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = La caixa forta s'ha creat correctament.
unlock.successLabel.passwordChanged = La contrasenya s'ha canviat correctament.
unlock.successLabel.upgraded = Cryptomator s'ha actualitzat correctament.
unlock.label.useOwnMountPath = Utilitza un punt de muntatge personalitzat
welcome.askForUpdateCheck.dialog.title = Comprovació d'actualizacions
welcome.askForUpdateCheck.dialog.header = Activo la comprovació automàtica d'actualitzacions?
welcome.askForUpdateCheck.dialog.content = Recomanat\: Activa la comprovació d'actualitzacions per assegurar-vos que sempre teniu la darrera versió de Cryptomator instal·lada amb totes les actualitzacions de seguretat.\n\nPodeu canviar aquesta opció des de la configuració en qualsevol moment.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Ha fallat el bloqueig de la caixa(es) forta(es)
main.gracefulShutdown.dialog.header = La caixa(es) forta(es) és(són) en ús
main.gracefulShutdown.dialog.content = Hi ha programes encara estan utilitzant una caixa forta o més d'una. Tanqueu-los per permetre que Cryptomator es tanqui correctament i, a continuació, torneu-ho a intentar.\n\nSi això no funciona, es pot forçar l'aturada de Cryptomator tot i que no es recomana, donç pot comportar pèrdua de dades.
main.gracefulShutdown.button.tryAgain = Torna-ho a intentar
main.gracefulShutdown.button.forceShutdown = Força l'aturada
unlock.pendingMessage.unlocking = La caixa forta s'està desbloquejant...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+26 -15
View File
@@ -1,6 +1,6 @@
app.name = Cryptomator app.name = Cryptomator
# main.fxml # main.fxml
main.emptyListInstructions = Trezor přidáte kliknutím sem main.emptyListInstructions = Trezor přidáte kliknutím zde\n
main.directoryList.contextMenu.remove = Odstranit ze seznamu main.directoryList.contextMenu.remove = Odstranit ze seznamu
main.directoryList.contextMenu.changePassword = Změnit heslo main.directoryList.contextMenu.changePassword = Změnit heslo
main.addDirectory.contextMenu.new = Vytvořit nový trezor main.addDirectory.contextMenu.new = Vytvořit nový trezor
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = Nepodařilo se rozšifrovat
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Uzamknout trezor unlocked.button.lock = Uzamknout trezor
unlocked.moreOptions.reveal = Odkrýt jednotku unlocked.moreOptions.reveal = Odkrýt jednotku
unlocked.moreOptions.copyUrl = Zkopírovat WebDAV odkaz
unlocked.label.revealFailed = Vykonání příkazu se nezdařilo unlocked.label.revealFailed = Vykonání příkazu se nezdařilo
unlocked.label.unmountFailed = Odpojení jednotky se nezdařilo unlocked.label.unmountFailed = Odpojení jednotky se nezdařilo
unlocked.label.statsEncrypted = zašifrováno unlocked.label.statsEncrypted = zašifrováno
@@ -88,29 +87,41 @@ upgrade.version3to4.title = Aktualizace trezoru z verze 3 na 4
upgrade.version4to5.title = Aktualizace trezoru z verze 4 na 5 upgrade.version4to5.title = Aktualizace trezoru z verze 4 na 5
upgrade.version4to5.msg = Tento trezor je třeba aktualizovat na novější formát.\nZašifrované soubory budou aktualizovány.\nNež budete pokračovat ověřte, že synchronizace byla dokončena.\n\nPozn.\: Datum úpravy bude v rámci toho u všech dotčených souborů změněn na aktuální datum a čas. upgrade.version4to5.msg = Tento trezor je třeba aktualizovat na novější formát.\nZašifrované soubory budou aktualizovány.\nNež budete pokračovat ověřte, že synchronizace byla dokončena.\n\nPozn.\: Datum úpravy bude v rámci toho u všech dotčených souborů změněn na aktuální datum a čas.
upgrade.version4to5.err.io = Převod se nezdařil kvůli chybě na vstupu nebo výstupu. Podrobnosti naleznete v souboru se záznamem událostí (log). upgrade.version4to5.err.io = Převod se nezdařil kvůli chybě na vstupu nebo výstupu. Podrobnosti naleznete v souboru se záznamem událostí (log).
unlock.label.mountAfterUnlock = Připojit (mount) jednotku
unlock.label.revealAfterMount = Odkrýt jednotku unlock.label.revealAfterMount = Odkrýt jednotku
unlocked.lock.force.confirmation.title = Zamykání %1$s se nezdařilo unlocked.lock.force.confirmation.title = Zamykání %1$s se nezdařilo
unlocked.lock.force.confirmation.header = Chcete vynutit uzamčení? unlocked.lock.force.confirmation.header = Chcete vynutit uzamčení?
unlocked.lock.force.confirmation.content = Toto může být způsobeno tím, že ostatní aplikace stále ještě přistupují k souborům v trezoru nebo došlo k nějakému jinému problému.\n\nMůže se ovšem stát, že aplikace které stáje ještě pracují se soubory z trezoru to nemusí ustát a může dojít ke ztrátě ještě neuložených dat. unlocked.lock.force.confirmation.content = Toto může být způsobeno tím, že ostatní aplikace stále ještě přistupují k souborům v trezoru nebo došlo k nějakému jinému problému.\n\nMůže se ovšem stát, že aplikace které stáje ještě pracují se soubory z trezoru to nemusí ustát a může dojít ke ztrátě ještě neuložených dat.
unlock.label.unlockAfterStartup = Automatické odemknutí při spuštění (experimentální) unlock.label.unlockAfterStartup = Automatické odemknutí při spuštění (experimentální)
unlock.errorMessage.unlockFailed = Odemknutí se nezdařilo. Podrobnosti naleznete v souboru se záznamem událostí (log). unlock.errorMessage.unlockFailed = Odemknutí se nezdařilo. Podrobnosti naleznete v souboru se záznamem událostí (log).
unlocked.moreOptions.mount = Připojit jednotku
unlocked.moreOptions.unmount = Odpojit jednotku
upgrade.version5toX.title = Aktualizace verze trezoru upgrade.version5toX.title = Aktualizace verze trezoru
upgrade.version5toX.msg = Tento trezor je třeba aktualizovat na novější formát.\nNež budete pokračovat ověřte, že byla dokončena synchronizace. upgrade.version5toX.msg = Tento trezor je třeba aktualizovat na novější formát.\nNež budete pokračovat ověřte, že byla dokončena synchronizace.
main.createVault.nonEmptyDir.title = Vytvoření trezoru se nezdařilo main.createVault.nonEmptyDir.title = Vytvoření trezoru se nezdařilo
main.createVault.nonEmptyDir.header = Zvolená složka není prázdná main.createVault.nonEmptyDir.header = Zvolená složka není prázdná
main.createVault.nonEmptyDir.content = Zvolená složka už obsahuje soubory (možná skryté). Trezor je možné vytvořit pouze v prázdné složce. main.createVault.nonEmptyDir.content = Zvolená složka už obsahuje soubory (možná skryté). Trezor je možné vytvořit pouze v prázdné složce.
unlock.label.mountPath = Mount Path settings.webdav.port.label = Port WebDAV
unlock.label.mountPathButton = Apply settings.webdav.port.prompt = 0 \= zvolit automaticky
settings.webdav.port.label = WebDAV Port settings.webdav.port.apply = Použít
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.prefGvfsScheme.label = WebDAV schéma
settings.webdav.port.apply = Apply settings.volume.label = Způsob připojení (mount)
settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Trezor byl úspěšně vytvořen.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Heslo bylo úspěšně změněno.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator byl úspěšně povýšen na novou verzi.
unlock.label.useOwnMountPath = Použít vlastní přípojný bod
welcome.askForUpdateCheck.dialog.title = Zjišťování aktualizací
welcome.askForUpdateCheck.dialog.header = Zjišťovat automaticky nové verze?
welcome.askForUpdateCheck.dialog.content = Ke zjištění aktualizací, Cryptomator stáhne aktuální verzi z instalačních serverů a zobrazí nápovědu, když je k dispozici novější verze, než je nainstalovaná.\n\nDoporučujeme zapnout zjišťování aktualizací a zajistit tak, že vždy budete mít nejnovější verzi Cryptomator, se všemi opravami zabezpečení nainstalovanými. Pokud automatické zjišťování nezapnete, je možné ručně stahovat nejnovější verzi z https\://cryptomator.org/downloads/.\n\nToto nastavení je možné kdykoli změnit v nastavení aplikace.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Zamčení trezorů se nezdařilo
main.gracefulShutdown.dialog.header = Trezory v používání
main.gracefulShutdown.dialog.content = Jeden nebo více trezorů je stále v používání ostatními programy. Ukončete je aby se Cryptomator mohl správně vypnout a zkuste to znovu.\n\nPokud to nezabere, Cryptomator je možné vypnout vynuceně, ale to může vést ke ztrátě dat a není proto doporučeno.
main.gracefulShutdown.button.tryAgain = Zkusit znovu
main.gracefulShutdown.button.forceShutdown = Vynutit vypnutí
unlock.pendingMessage.unlocking = Odemykání trezoru…
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+19 -8
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = Dekryptering fejlede
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Lås Vault unlocked.button.lock = Lås Vault
unlocked.moreOptions.reveal = Vis drev unlocked.moreOptions.reveal = Vis drev
unlocked.moreOptions.copyUrl = Kopier WebDAV URL
unlocked.label.revealFailed = Kommando fejlede unlocked.label.revealFailed = Kommando fejlede
unlocked.label.unmountFailed = Afmontering af drev fejlede unlocked.label.unmountFailed = Afmontering af drev fejlede
unlocked.label.statsEncrypted = Krypteret unlocked.label.statsEncrypted = Krypteret
@@ -86,29 +85,41 @@ upgrade.version3to4.title = Vault Version 3 til 4 Opgradering
upgrade.version4to5.title = Vault Version 4 til 5 Opgradering upgrade.version4to5.title = Vault Version 4 til 5 Opgradering
upgrade.version4to5.msg = Denne Vault skal migreres til et nyere format.\nDe krypterede filer vil blive opdateret.\nVent venligst til al synkronisering er gennemført, inden du fortsætter.\n\nNote\: Denne proces vil påvirke ændringsdato og -tidspunkt for samtlige filer. upgrade.version4to5.msg = Denne Vault skal migreres til et nyere format.\nDe krypterede filer vil blive opdateret.\nVent venligst til al synkronisering er gennemført, inden du fortsætter.\n\nNote\: Denne proces vil påvirke ændringsdato og -tidspunkt for samtlige filer.
upgrade.version4to5.err.io = Migrering fejlede pga. en I/O fejl. Se logfilen for yderligere detaljer. upgrade.version4to5.err.io = Migrering fejlede pga. en I/O fejl. Se logfilen for yderligere detaljer.
unlock.label.mountAfterUnlock = Monter drev
unlock.label.revealAfterMount = Vis drev unlock.label.revealAfterMount = Vis drev
unlocked.lock.force.confirmation.title = Locking of %1$s failed unlocked.lock.force.confirmation.title = Locking of %1$s failed
unlocked.lock.force.confirmation.header = Do you want to force locking? unlocked.lock.force.confirmation.header = Do you want to force locking?
unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost. unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost.
unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental) unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental)
unlock.errorMessage.unlockFailed = Unlock failed. See log file for details. unlock.errorMessage.unlockFailed = Unlock failed. See log file for details.
unlocked.moreOptions.mount = Mount Drive
unlocked.moreOptions.unmount = Eject Drive
upgrade.version5toX.title = Vault Version Upgrade upgrade.version5toX.title = Vault Version Upgrade
upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding. upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding.
main.createVault.nonEmptyDir.title = Creating vault failed main.createVault.nonEmptyDir.title = Creating vault failed
main.createVault.nonEmptyDir.header = Chosen directory is not empty main.createVault.nonEmptyDir.header = Chosen directory is not empty
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory. main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
unlock.label.mountPath = Mount Path
unlock.label.mountPathButton = Apply
settings.webdav.port.label = WebDAV Port settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.port.prompt = 0 \= Choose automatically
settings.webdav.port.apply = Apply settings.webdav.port.apply = Apply
settings.webdav.prefGvfsScheme.label = WebDAV Scheme settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode * settings.volume.label = Preferred Volume Type
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try again
main.gracefulShutdown.button.forceShutdown = Force shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+23 -12
View File
@@ -7,7 +7,7 @@ main.addDirectory.contextMenu.new = Tresor erstellen
main.addDirectory.contextMenu.open = Tresor öffnen main.addDirectory.contextMenu.open = Tresor öffnen
# welcome.fxml # welcome.fxml
welcome.checkForUpdates.label.currentlyChecking = Prüfe auf Updates... welcome.checkForUpdates.label.currentlyChecking = Prüfe auf Updates...
welcome.newVersionMessage = Version %1$s kann heruntergeladen werden.\nMomentane Version %2$s. welcome.newVersionMessage = Version %1$s kann heruntergeladen werden.\nInstallierte Version %2$s.
# initialize.fxml # initialize.fxml
initialize.label.password = Passwort initialize.label.password = Passwort
initialize.label.retypePassword = Passwort bestätigen initialize.label.retypePassword = Passwort bestätigen
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = Entschlüsselung fehlgeschlagen
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Tresor sperren unlocked.button.lock = Tresor sperren
unlocked.moreOptions.reveal = Laufwerk anzeigen unlocked.moreOptions.reveal = Laufwerk anzeigen
unlocked.moreOptions.copyUrl = WebDAV-URL kopieren
unlocked.label.revealFailed = Befehl fehlgeschlagen unlocked.label.revealFailed = Befehl fehlgeschlagen
unlocked.label.unmountFailed = Trennen des Laufwerks fehlgeschlagen unlocked.label.unmountFailed = Trennen des Laufwerks fehlgeschlagen
unlocked.label.statsEncrypted = verschlüsselt unlocked.label.statsEncrypted = verschlüsselt
@@ -86,29 +85,41 @@ upgrade.version3to4.title = Upgrade Tresor-Version 3 zu 4
upgrade.version4to5.title = Upgrade Tresor-Version 4 zu 5 upgrade.version4to5.title = Upgrade Tresor-Version 4 zu 5
upgrade.version4to5.msg = Dieser Tresor muss auf ein neueres Format aktualisiert werden.\nVerschlüsselte Dateien werden dabei aktualisiert.\nStellen Sie sicher, dass keine Synchronisation stattfindet, bevor Sie fortfahren.\n\nHinweis\: Beim Upgrade wird das Änderungsdatum aller Dateien auf das aktuelle Datum geändert. upgrade.version4to5.msg = Dieser Tresor muss auf ein neueres Format aktualisiert werden.\nVerschlüsselte Dateien werden dabei aktualisiert.\nStellen Sie sicher, dass keine Synchronisation stattfindet, bevor Sie fortfahren.\n\nHinweis\: Beim Upgrade wird das Änderungsdatum aller Dateien auf das aktuelle Datum geändert.
upgrade.version4to5.err.io = Migration aufgrund eines I/O-Fehlers fehlgeschlagen.\nWeitere Informationen in der Log-Datei. upgrade.version4to5.err.io = Migration aufgrund eines I/O-Fehlers fehlgeschlagen.\nWeitere Informationen in der Log-Datei.
unlock.label.mountAfterUnlock = Laufwerk verbinden
unlock.label.revealAfterMount = Laufwerk anzeigen unlock.label.revealAfterMount = Laufwerk anzeigen
unlocked.lock.force.confirmation.title = Sperren von %1$s fehlgeschlagen unlocked.lock.force.confirmation.title = Sperren von %1$s fehlgeschlagen
unlocked.lock.force.confirmation.header = Möchten Sie das Sperren erzwingen? unlocked.lock.force.confirmation.header = Möchten Sie das Sperren erzwingen?
unlocked.lock.force.confirmation.content = Dies kann passieren, wenn andere Programme weiterhin auf Dateien im Tresor zugreifen. Oder es ist ein anderes Problem aufgetreten.\n\nProgramme, die weiterhin auf die Dateien zugreifen, könnten nicht mehr richtig funktionieren, oder Daten, die durch diese Programme noch nicht geschrieben wurden, könnten verloren gehen. unlocked.lock.force.confirmation.content = Dies kann passieren, wenn andere Programme weiterhin auf Dateien im Tresor zugreifen. Oder es ist ein anderes Problem aufgetreten.\n\nProgramme, die weiterhin auf die Dateien zugreifen, könnten nicht mehr richtig funktionieren, oder Daten, die durch diese Programme noch nicht geschrieben wurden, könnten verloren gehen.
unlock.label.unlockAfterStartup = Automatisch entsperren beim Start (Experimentell) unlock.label.unlockAfterStartup = Automatisch entsperren beim Start (Experimentell)
unlock.errorMessage.unlockFailed = Entsperren fehlgeschlagen. Siehe Log-Datei für Details. unlock.errorMessage.unlockFailed = Entsperren fehlgeschlagen. Siehe Log-Datei für Details.
unlocked.moreOptions.mount = Laufwerk verbinden
unlocked.moreOptions.unmount = Laufwerk auswerfen
upgrade.version5toX.title = Upgrade Tresor-Version 5 zu X upgrade.version5toX.title = Upgrade Tresor-Version 5 zu X
upgrade.version5toX.msg = Dieser Tresor muss auf ein neueres Format aktualisiert werden.\nStellen Sie sicher, dass keine Synchronisation stattfindet, bevor Sie fortfahren. upgrade.version5toX.msg = Dieser Tresor muss auf ein neueres Format aktualisiert werden.\nStellen Sie sicher, dass keine Synchronisation stattfindet, bevor Sie fortfahren.
main.createVault.nonEmptyDir.title = Erstellung des Tresors fehlgeschlagen main.createVault.nonEmptyDir.title = Erstellung des Tresors fehlgeschlagen
main.createVault.nonEmptyDir.header = Ausgewählter Ordner ist nicht leer main.createVault.nonEmptyDir.header = Ausgewählter Ordner ist nicht leer
main.createVault.nonEmptyDir.content = Der ausgewählte Ordner enthält bereits Dateien (möglicherweise unsichtbar). Ein Tresor kann nur innerhalb eines leeren Ordners erstellt werden. main.createVault.nonEmptyDir.content = Der ausgewählte Ordner enthält bereits Dateien (möglicherweise unsichtbar). Ein Tresor kann nur innerhalb eines leeren Ordners erstellt werden.
unlock.label.mountPath = Verzeichnis settings.webdav.port.label = WebDAV-Port
unlock.label.mountPathButton = Anwenden
settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= automatische Auswahl settings.webdav.port.prompt = 0 \= automatische Auswahl
settings.webdav.port.apply = Anwenden settings.webdav.port.apply = Anwenden
settings.webdav.prefGvfsScheme.label = WebDAV URL Schema settings.webdav.prefGvfsScheme.label = WebDAV URL Schema
settings.volume.label = Laufwerkseinbindung settings.volume.label = Laufwerkseinbindung *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Der Tresor wurde erfolgreich erstellt.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Das Passwort wurde erfolgreich geändert.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Das Cryptomator Upgrade wurde erfolgreich abgeschlossen.
unlock.label.useOwnMountPath = Eigenes Laufwerksverzeichnis nutzen
welcome.askForUpdateCheck.dialog.title = Auf Updates prüfen
welcome.askForUpdateCheck.dialog.header = Eingebaute Update-Prüfung aktivieren?
welcome.askForUpdateCheck.dialog.content = Empfehlung\: Aktivieren Sie die Update-Prüfung, um sicherzustellen, dass Sie stets die neueste Cryptomator-Version mit allen Sicherheits-Patches verwenden.\n\nDiese Einstellung können Sie jederzeit im Einstellungs-Menü ändern.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Sperren des Tresors gescheitert
main.gracefulShutdown.dialog.header = Tresor in Gebrauch
main.gracefulShutdown.dialog.content = Ein oder mehrere Tresore werden noch von anderen Programmen genutzt. Bitte schliessen Sie die Programme um es Cryptomator zu ermöglichen richtig herunter zu fahren. Versuchen Sie es danach erneut.\n\nFalls dies nicht klappt, kann Cryptomator das Beenden erzwingen. Dies kann zu einem Datenverlust führen und ist nicht empfohlen.
main.gracefulShutdown.button.tryAgain = Versuchen Sie es erneut
main.gracefulShutdown.button.forceShutdown = Herunterfahren erzwingen
unlock.pendingMessage.unlocking = Entsperre Tresor...
unlock.failedDialog.title = Entsperren fehlgeschlagen
unlock.failedDialog.header = Entsperren fehlgeschlagen
unlock.failedDialog.content.mountPathNonExisting = Laufwerksverzeichnis existiert nicht.
unlock.failedDialog.content.mountPathNotEmpty = Laufwerksverzeichnis ist nicht leer.
unlock.label.useReadOnlyMode = Nur lesend
unlock.label.chooseMountPath = Leeren Ordner auswählen…
+16 -4
View File
@@ -19,13 +19,18 @@ main.directoryList.remove.confirmation.content=The vault will only be removed fr
main.createVault.nonEmptyDir.title=Creating vault failed main.createVault.nonEmptyDir.title=Creating vault failed
main.createVault.nonEmptyDir.header=Chosen directory is not empty main.createVault.nonEmptyDir.header=Chosen directory is not empty
main.createVault.nonEmptyDir.content=The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory. main.createVault.nonEmptyDir.content=The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
main.gracefulShutdown.dialog.title=Locking vault(s) failed
main.gracefulShutdown.dialog.header=Vault(s) in use
main.gracefulShutdown.dialog.content=One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain=Try again
main.gracefulShutdown.button.forceShutdown=Force shutdown
# welcome.fxml # welcome.fxml
welcome.checkForUpdates.label.currentlyChecking=Checking for Updates... welcome.checkForUpdates.label.currentlyChecking=Checking for Updates...
welcome.newVersionMessage=Version %1$s can be downloaded.\nThis is %2$s. welcome.newVersionMessage=Version %1$s can be downloaded.\nThis is %2$s.
welcome.askForUpdateCheck.dialog.title=Update check welcome.askForUpdateCheck.dialog.title=Update check
welcome.askForUpdateCheck.dialog.header=Enable the integrated update check? welcome.askForUpdateCheck.dialog.header=Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content=To check for updates, Cryptomator will fetch the current version from the Cryptomator servers and display a hint to you if a newer version is available.\n\nWe recommend to enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed. If you do not enable the update check you may check and download the current version from https://cryptomator.org/downloads/.\n\nYou can change this at any time from within the settings. welcome.askForUpdateCheck.dialog.content=Recommended: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
# initialize.fxml # initialize.fxml
initialize.label.password=Password initialize.label.password=Password
@@ -68,10 +73,10 @@ unlock.label.savePassword=Save Password
unlock.label.mountName=Drive Name unlock.label.mountName=Drive Name
unlock.label.unlockAfterStartup=Auto-Unlock on Start (Experimental) unlock.label.unlockAfterStartup=Auto-Unlock on Start (Experimental)
unlock.label.revealAfterMount=Reveal Drive unlock.label.revealAfterMount=Reveal Drive
unlock.label.useReadOnlyMode=Read-Only
unlock.label.winDriveLetter=Drive Letter unlock.label.winDriveLetter=Drive Letter
unlock.label.useOwnMountPath=Use own Mount point unlock.label.useOwnMountPath=Use Custom Mount Point
unlock.label.mountPath=Mount Path unlock.label.chooseMountPath=Choose empty directory…
unlock.label.mountPathButton=Apply
unlock.label.downloadsPageLink=All Cryptomator versions unlock.label.downloadsPageLink=All Cryptomator versions
unlock.label.advancedHeading=Advanced Options unlock.label.advancedHeading=Advanced Options
unlock.button.unlock=Unlock Vault unlock.button.unlock=Unlock Vault
@@ -81,6 +86,7 @@ unlock.savePassword.delete.confirmation.title=Delete Saved Password
unlock.savePassword.delete.confirmation.header=Do you really want to delete the saved password of this vault? unlock.savePassword.delete.confirmation.header=Do you really want to delete the saved password of this vault?
unlock.savePassword.delete.confirmation.content=The saved password of this vault will be immediately deleted from your system keychain. If you'd like to save your password again, you'd have to unlock your vault with the "Save Password" option enabled. unlock.savePassword.delete.confirmation.content=The saved password of this vault will be immediately deleted from your system keychain. If you'd like to save your password again, you'd have to unlock your vault with the "Save Password" option enabled.
unlock.choicebox.winDriveLetter.auto=Assign automatically unlock.choicebox.winDriveLetter.auto=Assign automatically
unlock.pendingMessage.unlocking=Unlocking vault...
unlock.errorMessage.wrongPassword=Wrong password unlock.errorMessage.wrongPassword=Wrong password
unlock.errorMessage.unlockFailed=Unlock failed. See log file for details. unlock.errorMessage.unlockFailed=Unlock failed. See log file for details.
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware=Unsupported vault. This vault has been created with an older version of Cryptomator. unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware=Unsupported vault. This vault has been created with an older version of Cryptomator.
@@ -91,6 +97,12 @@ unlock.successLabel.vaultCreated=Vault was successfully created.
unlock.successLabel.passwordChanged=Password was successfully changed. unlock.successLabel.passwordChanged=Password was successfully changed.
unlock.successLabel.upgraded=Cryptomator was successfully upgraded. unlock.successLabel.upgraded=Cryptomator was successfully upgraded.
unlock.failedDialog.title=Unlock failed
unlock.failedDialog.header=Unlock failed
unlock.failedDialog.content.mountPathNonExisting=Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty=Mount point is not empty.
# change_password.fxml # change_password.fxml
changePassword.label.oldPassword=Old Password changePassword.label.oldPassword=Old Password
changePassword.label.newPassword=New Password changePassword.label.newPassword=New Password
+32 -20
View File
@@ -4,6 +4,7 @@ main.emptyListInstructions = Haga clic aquí para añadir una caja fuerte
# should it be imperative? # should it be imperative?
main.directoryList.contextMenu.remove = Eliminar de la lista main.directoryList.contextMenu.remove = Eliminar de la lista
main.directoryList.contextMenu.changePassword = Cambiar la contraseña main.directoryList.contextMenu.changePassword = Cambiar la contraseña
# Fuzzy
main.addDirectory.contextMenu.new = Crear una nueva caja fuerte main.addDirectory.contextMenu.new = Crear una nueva caja fuerte
main.addDirectory.contextMenu.open = Abrir una caja fuerte existente main.addDirectory.contextMenu.open = Abrir una caja fuerte existente
# welcome.fxml # welcome.fxml
@@ -47,11 +48,10 @@ changePassword.errorMessage.decryptionFailed = Error en el descifrado
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Bloquear caja fuerte unlocked.button.lock = Bloquear caja fuerte
unlocked.moreOptions.reveal = Revelar unidad unlocked.moreOptions.reveal = Revelar unidad
unlocked.moreOptions.copyUrl = Copiar URL de WebDAV
unlocked.label.revealFailed = La orden ha fallado unlocked.label.revealFailed = La orden ha fallado
unlocked.label.unmountFailed = Error al expulsar la unidad unlocked.label.unmountFailed = Error al expulsar la unidad
unlocked.label.statsEncrypted = cifrado unlocked.label.statsEncrypted = encriptado
unlocked.label.statsDecrypted = descifrado unlocked.label.statsDecrypted = desencriptado
unlocked.ioGraph.yAxis.label = Rendimiento (MiB/s) unlocked.ioGraph.yAxis.label = Rendimiento (MiB/s)
# settings.fxml # settings.fxml
settings.version.label = Versión %s settings.version.label = Versión %s
@@ -86,31 +86,43 @@ settings.debugMode.label = Modo depuración *
upgrade.version3dropBundleExtension.title = Actualizar caja fuerte a la versión 3 (Drop Bundle Extension) upgrade.version3dropBundleExtension.title = Actualizar caja fuerte a la versión 3 (Drop Bundle Extension)
upgrade.version3to4.title = Actualizar caja fuerte de versión 3 a 4 upgrade.version3to4.title = Actualizar caja fuerte de versión 3 a 4
upgrade.version4to5.title = Actualizar caja fuerte de versión 4 a 5 upgrade.version4to5.title = Actualizar caja fuerte de versión 4 a 5
upgrade.version4to5.msg = Esta caja fuerte tiene que ser migrada a un formato más moderno.\nLos archivos cifrados se actualizarán.\nAsegúrese de que la sincronización ha terminado antes de iniciar el proceso.\n\nNota\: las fechas de modificación de todos los archivos, se cambiarán a la fecha actual. upgrade.version4to5.msg = Esta caja fuerte tiene que ser migrada a un formato más moderno.\nLos archivos encriptados se actualizarán.\nAsegúrese de que la sincronización ha terminado antes de iniciar el proceso.\n\nNota\: las fechas de modificación de todos los archivos, se cambiarán a la fecha actual.
upgrade.version4to5.err.io = Error en la migración debido a una excepción E/S. Consulte el archivo de registro para más información. upgrade.version4to5.err.io = Error en la migración debido a una excepción E/S. Consulte el archivo de registro para más información.
unlock.label.mountAfterUnlock = Montar unidad
unlock.label.revealAfterMount = Revelar unidad unlock.label.revealAfterMount = Revelar unidad
unlocked.lock.force.confirmation.title = Error al bloquear %1$s unlocked.lock.force.confirmation.title = Error al bloquear %1$s
unlocked.lock.force.confirmation.header = ¿Quiere forzar el bloqueo? unlocked.lock.force.confirmation.header = ¿Quiere forzar el bloqueo?
unlocked.lock.force.confirmation.content = Esto puede ser debido a que otros programas estén todavía accediendo a la caja fuerte o porque se ha producido algún otro problema.\n\nLos programas que estén todavía accediendo a los archivos pueden no funcionar correctamente y se pueden perder los datos pendientes de escribir por estos programas. unlocked.lock.force.confirmation.content = Esto puede ser debido a que otros programas estén todavía accediendo a la caja fuerte o porque se ha producido algún otro problema.\n\nLos programas que estén todavía accediendo a los archivos pueden no funcionar correctamente y se pueden perder los datos pendientes de escribir por estos programas.
unlock.label.unlockAfterStartup = Autodesbloqueo al arrancar (experimental) unlock.label.unlockAfterStartup = Autodesbloqueo al arrancar (experimental)
unlock.errorMessage.unlockFailed = Error al desbloquear. Consulte el archivo de registro para más información. unlock.errorMessage.unlockFailed = Error al desbloquear. Consulte el archivo de registro para más información.
unlocked.moreOptions.mount = Montar unidad
unlocked.moreOptions.unmount = Expulsar unidad
upgrade.version5toX.title = Actualizar la versión de la caja fuerte upgrade.version5toX.title = Actualizar la versión de la caja fuerte
upgrade.version5toX.msg = Esta caja fuerte debe ser migrada a un formato más moderno.\nAsegúrese de que la sincronización ha terminado antes de iniciar el proceso. upgrade.version5toX.msg = Esta caja fuerte debe ser migrada a un formato más moderno.\nAsegúrese de que la sincronización ha terminado antes de iniciar el proceso.
main.createVault.nonEmptyDir.title = Creating vault failed main.createVault.nonEmptyDir.title = Error en la creación de la bóveda
main.createVault.nonEmptyDir.header = Chosen directory is not empty main.createVault.nonEmptyDir.header = El directorio elegido no está vacío
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory. main.createVault.nonEmptyDir.content = El directorio seleccionado ya contiene archivos (posiblemente ocultos). Una bóveda sólo puede crearse en un directorio vacío.
unlock.label.mountPath = Mount Path settings.webdav.port.label = Puerto WebDAV
unlock.label.mountPathButton = Apply settings.webdav.port.prompt = 0 \= Elige automáticamente
settings.webdav.port.label = WebDAV Port settings.webdav.port.apply = Aplicar
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.prefGvfsScheme.label = Esquema de WebDAV
settings.webdav.port.apply = Apply settings.volume.label = Método de montaje *
settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = La caja fuerte fue creada exitosamente.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = La contraseña ha sido cambiada con éxito.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator fue actualizado exitosamente.
unlock.label.useOwnMountPath = Usar Punto de montaje propio
welcome.askForUpdateCheck.dialog.title = Buscar actualización
welcome.askForUpdateCheck.dialog.header = ¿Habilitar la búsqueda de actualizaciones automática?
welcome.askForUpdateCheck.dialog.content = Para buscar actualizaciones, Cryptomator buscará la versión actual en los servidores de Cryptomator y le mostrará una sugerencia si hay una versión más nueva disponible.\n\nRecomendamos habilitar la comprobación de actualización para asegurarse siempre de que tiene instalada la versión más reciente de Cryptomator, con todos los parches de seguridad. Si no habilita la verificación de actualización, puede verificar y descargar la versión actual desde https\://cryptomator.org/downloads/.\n\nPuede cambiar esto en cualquier momento desde dentro de la configuración.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = No fue posible cerrar la(s) caja(s) fuerte(s)
main.gracefulShutdown.dialog.header = Caja(s) Fuertes(s) en uso
main.gracefulShutdown.dialog.content = Una o más cajas fuertes están siendo utilizadas por otros programas. Por favor ciérrelos para permitir a Cryptomator cerrarse adecuadamente, e intente de nuevo.\n\nSi esto no funciona, Cryptomator puede cerrarse forzosamente, pero esta vía puede provocar pérdida de información y no es recomendada.
main.gracefulShutdown.button.tryAgain = Intente de nuevo
main.gracefulShutdown.button.forceShutdown = Forzar apagado
unlock.pendingMessage.unlocking = Desbloqueando la caja fuerte...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+26 -15
View File
@@ -46,7 +46,6 @@ changePassword.errorMessage.decryptionFailed = Echec du déchiffrement
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Verrouiller le coffre-fort unlocked.button.lock = Verrouiller le coffre-fort
unlocked.moreOptions.reveal = Voir le lecteur unlocked.moreOptions.reveal = Voir le lecteur
unlocked.moreOptions.copyUrl = Copier l'URL WebDAV
unlocked.label.revealFailed = Echec de la commande unlocked.label.revealFailed = Echec de la commande
unlocked.label.unmountFailed = Echec de l'éjection du lecteur unlocked.label.unmountFailed = Echec de l'éjection du lecteur
# Crypter n'existe pas en français. # Crypter n'existe pas en français.
@@ -89,29 +88,41 @@ upgrade.version3to4.title = Mise à jour de la version du coffre-fort (v3 à v4)
upgrade.version4to5.title = Mise à jour de la version du coffre-fort (v4 à v5) upgrade.version4to5.title = Mise à jour de la version du coffre-fort (v4 à v5)
upgrade.version4to5.msg = Ce coffre-fort doit être migré vers un format plus récent.\nLes fichiers chiffrés seront mis à jour.\nVeuillez vérifier que la synchronisation est terminée avant de commencer.\n\nNote \: la date de modification des fichiers sera mise à jour avec la date courante. upgrade.version4to5.msg = Ce coffre-fort doit être migré vers un format plus récent.\nLes fichiers chiffrés seront mis à jour.\nVeuillez vérifier que la synchronisation est terminée avant de commencer.\n\nNote \: la date de modification des fichiers sera mise à jour avec la date courante.
upgrade.version4to5.err.io = La migration a échoué à cause d'une erreur d'entrée/sortie. Vérifiez le fichier de log pour plus de détails. upgrade.version4to5.err.io = La migration a échoué à cause d'une erreur d'entrée/sortie. Vérifiez le fichier de log pour plus de détails.
unlock.label.mountAfterUnlock = Monter le lecteur
unlock.label.revealAfterMount = Voir le lecteur unlock.label.revealAfterMount = Voir le lecteur
unlocked.lock.force.confirmation.title = Le verrouillage de %1$s a échoué unlocked.lock.force.confirmation.title = Le verrouillage de %1$s a échoué
unlocked.lock.force.confirmation.header = Voulez-vous forcer le verrouillage ? unlocked.lock.force.confirmation.header = Voulez-vous forcer le verrouillage ?
unlocked.lock.force.confirmation.content = D'autres programmes sont peut être en train d'accéder à des fichiers dans le coffre-fort ou un autre problème s'est produit.\n\nLes programmes accédant encore aux fichiers pourraient ne pas fonctionner normalement et les données pas encore sauvegardées par ces programmes pourraient être perdues. unlocked.lock.force.confirmation.content = D'autres programmes sont peut être en train d'accéder à des fichiers dans le coffre-fort ou un autre problème s'est produit.\n\nLes programmes accédant encore aux fichiers pourraient ne pas fonctionner normalement et les données pas encore sauvegardées par ces programmes pourraient être perdues.
unlock.label.unlockAfterStartup = Déverouiller automatiquement au démarrage (experimental) unlock.label.unlockAfterStartup = Déverouiller automatiquement au démarrage (experimental)
unlock.errorMessage.unlockFailed = Le déverouillage a échoué. Référez-vous au fichier log pour plus de détails. unlock.errorMessage.unlockFailed = Le déverouillage a échoué. Référez-vous au fichier log pour plus de détails.
unlocked.moreOptions.mount = Monter le disque
unlocked.moreOptions.unmount = Ejecter le disque
upgrade.version5toX.title = Mise à jour du coffre-fort upgrade.version5toX.title = Mise à jour du coffre-fort
upgrade.version5toX.msg = Ce coffre-fort doit être converti dans un format plus récent. \nVeuillez-vous assurez que la synchronisation est achevée avant de continuer. upgrade.version5toX.msg = Ce coffre-fort doit être converti dans un format plus récent. \nVeuillez-vous assurez que la synchronisation est achevée avant de continuer.
main.createVault.nonEmptyDir.title = Echec de création du coffre-fort main.createVault.nonEmptyDir.title = Echec de création du coffre-fort
main.createVault.nonEmptyDir.header = Le répertoire sélectionné n'est pas vide main.createVault.nonEmptyDir.header = Le répertoire sélectionné n'est pas vide
main.createVault.nonEmptyDir.content = Le répertoire sélectionné contient déjà des fichiers (potentiellement cachés). Un coffre-fort ne peut être créé que dans un répertoire vide. main.createVault.nonEmptyDir.content = Le répertoire sélectionné contient déjà des fichiers (potentiellement cachés). Un coffre-fort ne peut être créé que dans un répertoire vide.
unlock.label.mountPath = Mount Path settings.webdav.port.label = Port de WebDAV
unlock.label.mountPathButton = Apply settings.webdav.port.prompt = 0 \= choisir automatiquement
settings.webdav.port.label = WebDAV Port settings.webdav.port.apply = Appliquer
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.prefGvfsScheme.label = stratagème webdav
settings.webdav.port.apply = Apply settings.volume.label = méthode de montage
settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = limite
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Le coffre-fort a été créé avec succès
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Le mot de passe a été changé avec succès
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator a été mise à jour avec succès
unlock.label.useOwnMountPath = Utiliser son propre point de montage
welcome.askForUpdateCheck.dialog.title = vérification de la mise à jour
welcome.askForUpdateCheck.dialog.header = Activer le contrôle de mise à jour intégré ?
welcome.askForUpdateCheck.dialog.content = Pour vérifier les mises à jour, Cryptomator récupère la version actuelle sur les serveurs Cryptomator et vous donne un aperçu si une nouvelle version est disponible.\n\nNous vous recommandons d'activer la vérification de mise à jour pour vous assurer que vous avez toujours la dernière version de Cryptomator, avec tous les correctifs de sécurité, installés. Si vous n'activez pas le contrôle de mise à jour, vous pouvez vérifier et télécharger la version actuelle à partir de https\://cryptomator.org/downloads/.\n\nVous pouvez le modifier à tout moment à partir des paramètres.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Échec en fermant le coffre-fort.
main.gracefulShutdown.dialog.header = Coffre-fort est en cours d'utilisation.
main.gracefulShutdown.dialog.content = Un ou plusieurs coffre-forts sont en cours d'utilisation par d'autres logiciels. S'il vous plait, fermer-les pour permettre à Cryptomator de finir proprement.\n\nSi ça ne marche pas, Cryptomator peut fermer par force, mais cela peut résulter d'une perte de vos fichiers (non recommandé).
main.gracefulShutdown.button.tryAgain = Réessayez
main.gracefulShutdown.button.forceShutdown = Arrêt forcé
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+36 -25
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = A titkosítás feloldása meghíu
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Széf lezárása unlocked.button.lock = Széf lezárása
unlocked.moreOptions.reveal = Meghajtó felfedése unlocked.moreOptions.reveal = Meghajtó felfedése
unlocked.moreOptions.copyUrl = WebDAV URL másolása
unlocked.label.revealFailed = Parancs meghíusúlt unlocked.label.revealFailed = Parancs meghíusúlt
unlocked.label.unmountFailed = Meghajtó leválasztása sikertelen unlocked.label.unmountFailed = Meghajtó leválasztása sikertelen
unlocked.label.statsEncrypted = titkosított unlocked.label.statsEncrypted = titkosított
@@ -75,7 +74,7 @@ upgrade.version3to4.err.io = Migráció meghíusúlt egy I/O kivétel miatt. Ké
# upgrade.fxml # upgrade.fxml
upgrade.confirmation.label = Igen, meggyőződtem a szinkronizáció befejeztéről upgrade.confirmation.label = Igen, meggyőződtem a szinkronizáció befejeztéről
unlock.label.savePassword = Jelszó mentése unlock.label.savePassword = Jelszó mentése
unlock.errorMessage.unauthenticVersionMac = Could not authenticate version MAC. unlock.errorMessage.unauthenticVersionMac = Nem lehet a MAC verziót azonosítani.
unlocked.label.mountFailed = Meghajtó csatlakoztatása sikertelen unlocked.label.mountFailed = Meghajtó csatlakoztatása sikertelen
unlock.savePassword.delete.confirmation.title = Mentett jelszó törlése unlock.savePassword.delete.confirmation.title = Mentett jelszó törlése
unlock.savePassword.delete.confirmation.header = Biztosan el akarod távolítani a széfhez tartozó mentett jelszót? unlock.savePassword.delete.confirmation.header = Biztosan el akarod távolítani a széfhez tartozó mentett jelszót?
@@ -86,29 +85,41 @@ upgrade.version3to4.title = Széf verziófrissítése 3-ról 4-re
upgrade.version4to5.title = Széf verziófrissítése 4-ről 5-re upgrade.version4to5.title = Széf verziófrissítése 4-ről 5-re
upgrade.version4to5.msg = Ennek a széfnek egy újabb formátumra való migrációja szükséges. A titkosított könyvtárnevek frissítve lesznek. Kérlek, győződj meg a szinkronizáció befejeztéről mielőtt továbblépnél.\n\nMegjegyzés\: A összes fájl módosításának dátuma az aktuális időre fog módosulni upgrade.version4to5.msg = Ennek a széfnek egy újabb formátumra való migrációja szükséges. A titkosított könyvtárnevek frissítve lesznek. Kérlek, győződj meg a szinkronizáció befejeztéről mielőtt továbblépnél.\n\nMegjegyzés\: A összes fájl módosításának dátuma az aktuális időre fog módosulni
upgrade.version4to5.err.io = Migráció meghíusúlt egy I/O kivétel miatt. Kérlek nézd meg a naplófájlt a további részletekért. upgrade.version4to5.err.io = Migráció meghíusúlt egy I/O kivétel miatt. Kérlek nézd meg a naplófájlt a további részletekért.
unlock.label.mountAfterUnlock = Mount Drive unlock.label.revealAfterMount = Meghajtó megnyitása
unlock.label.revealAfterMount = Reveal Drive unlocked.lock.force.confirmation.title = Sikertelen lezárás a következőnél\: %1$s
unlocked.lock.force.confirmation.title = Locking of %1$s failed unlocked.lock.force.confirmation.header = Szeretné erőltetni a lezárást?
unlocked.lock.force.confirmation.header = Do you want to force locking? unlocked.lock.force.confirmation.content = Ez amiatt lehet, mert más programok még mindig használják a széfben lévő fájlokat vagy valamilyen egyéb probléma lépett fel.\n\nA programok, amik használják ezeket a fájlokat, nem működhetnek megfelelően vagy akár adatvesztés is előfordulhat.
unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost. unlock.label.unlockAfterStartup = Automatikus feloldás indításnál (kísérleti funkció)
unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental) unlock.errorMessage.unlockFailed = A feloldás nem sikerült. Nézze meg a naplófájlokat.
unlock.errorMessage.unlockFailed = Unlock failed. See log file for details. upgrade.version5toX.title = Széf verziófrissítés
unlocked.moreOptions.mount = Mount Drive upgrade.version5toX.msg = A széf új verzióra történő migrációja szükséges.\nKérlek győződj meg a szinkronizáció befejeztéről, mielőtt más műveletet végeznél.
unlocked.moreOptions.unmount = Eject Drive main.createVault.nonEmptyDir.title = A széf létrehozása sikertelen
upgrade.version5toX.title = Vault Version Upgrade main.createVault.nonEmptyDir.header = A kiválasztott mappa nem üres
upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding. main.createVault.nonEmptyDir.content = A kiválasztott mappa már tartalmaz fájlokat (valószínűleg rejtett). A széf csak üres mappában hozható létre.
main.createVault.nonEmptyDir.title = Creating vault failed
main.createVault.nonEmptyDir.header = Chosen directory is not empty
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
unlock.label.mountPath = Mount Path
unlock.label.mountPathButton = Apply
settings.webdav.port.label = WebDAV Port settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.port.prompt = 0 \= Automatikus választás
settings.webdav.port.apply = Apply settings.webdav.port.apply = Alkalmaz
settings.webdav.prefGvfsScheme.label = WebDAV Scheme settings.webdav.prefGvfsScheme.label = WebDAV séma
settings.volume.label = Mount-Methode * settings.volume.label = Csatlakoztatási mód
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = A széf sikeresen létrehozva.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = A jelszó sikeresen megváltoztatva.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = A Cryptomator sikeresen frissítésre került.
unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Próbáld újra
main.gracefulShutdown.button.forceShutdown = Force shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+28 -17
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = Decriptaggio fallito
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Blocca vault unlocked.button.lock = Blocca vault
unlocked.moreOptions.reveal = Apri il disco unlocked.moreOptions.reveal = Apri il disco
unlocked.moreOptions.copyUrl = Copia url WebDAV
unlocked.label.revealFailed = Comando fallito unlocked.label.revealFailed = Comando fallito
unlocked.label.unmountFailed = Espulsione disco fallita unlocked.label.unmountFailed = Espulsione disco fallita
unlocked.label.statsEncrypted = criptato unlocked.label.statsEncrypted = criptato
@@ -86,29 +85,41 @@ upgrade.version3to4.title = Aggiornamento Vault da versione 3 a 4
upgrade.version4to5.title = Aggiornamento da versione 4 a 5 upgrade.version4to5.title = Aggiornamento da versione 4 a 5
upgrade.version4to5.msg = Questo vault ha bisogno di essere migrato ad un formato piu' recente. Tutti i files criptati saranno aggiornati. Per favore assicurati che la sincronizzazione sia terminata prima di procedere.\n\nNota\: la data di modifica di tutti i files cambiera' alla data/ora attuale del processo. upgrade.version4to5.msg = Questo vault ha bisogno di essere migrato ad un formato piu' recente. Tutti i files criptati saranno aggiornati. Per favore assicurati che la sincronizzazione sia terminata prima di procedere.\n\nNota\: la data di modifica di tutti i files cambiera' alla data/ora attuale del processo.
upgrade.version4to5.err.io = Migrazione fallita a causa di una eccezione I/O. Verifica il file di log per i dettagli. upgrade.version4to5.err.io = Migrazione fallita a causa di una eccezione I/O. Verifica il file di log per i dettagli.
unlock.label.mountAfterUnlock = Monta il disco
unlock.label.revealAfterMount = Mostra il disco unlock.label.revealAfterMount = Mostra il disco
unlocked.lock.force.confirmation.title = Il blocco di %1$s è fallito unlocked.lock.force.confirmation.title = Il blocco di %1$s è fallito
unlocked.lock.force.confirmation.header = Vuoi forzare il blocco? unlocked.lock.force.confirmation.header = Vuoi forzare il blocco?
unlocked.lock.force.confirmation.content = E' accaduto questo perchè altri programmi stanno ancora utilizzando i dati nel vault o perchè è accaduto un altro problema unlocked.lock.force.confirmation.content = E' accaduto questo perchè altri programmi stanno ancora utilizzando i dati nel vault o perchè è accaduto un altro problema
unlock.label.unlockAfterStartup = Blocco automatico all'avvio (Sperimentale) unlock.label.unlockAfterStartup = Blocco automatico all'avvio (Sperimentale)
unlock.errorMessage.unlockFailed = Unlock failed. See log file for details. unlock.errorMessage.unlockFailed = Sblocco fallito. Guarda il file log per i dettagli.
unlocked.moreOptions.mount = Mount Drive upgrade.version5toX.title = Aggiornamento di versione del Vault
unlocked.moreOptions.unmount = Eject Drive upgrade.version5toX.msg = Questo vault deve migrare ad un nuovo formato.\nAssicurati che la sincronizzazione sia terminata prima di procedere.
upgrade.version5toX.title = Vault Version Upgrade main.createVault.nonEmptyDir.title = Creazione del vaul fallita
upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding. main.createVault.nonEmptyDir.header = La directory scelta non è vuota
main.createVault.nonEmptyDir.title = Creating vault failed main.createVault.nonEmptyDir.content = La directory selezionata contiene già dei file (forse nascosti). Un vault può essere creato solo in una directory vuota.
main.createVault.nonEmptyDir.header = Chosen directory is not empty
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
unlock.label.mountPath = Mount Path
unlock.label.mountPathButton = Apply
settings.webdav.port.label = WebDAV Port settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.port.prompt = 0 \= Scelta automatica
settings.webdav.port.apply = Apply settings.webdav.port.apply = Applica
settings.webdav.prefGvfsScheme.label = WebDAV Scheme settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode * settings.volume.label = Mount-Methode *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Vaul creato con successo.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Password modificata con successo.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator aggiornato con successo.
unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try again
main.gracefulShutdown.button.forceShutdown = Force shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+20 -9
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = 復号に失敗しました。
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = 金庫の施錠 unlocked.button.lock = 金庫の施錠
unlocked.moreOptions.reveal = ドライブの表示 unlocked.moreOptions.reveal = ドライブの表示
unlocked.moreOptions.copyUrl = WebDAV URL のコピー
unlocked.label.revealFailed = 入力エラー unlocked.label.revealFailed = 入力エラー
unlocked.label.unmountFailed = ドライブの取り出しに失敗 unlocked.label.unmountFailed = ドライブの取り出しに失敗
unlocked.label.statsEncrypted = 暗号化済み unlocked.label.statsEncrypted = 暗号化済み
@@ -86,22 +85,17 @@ upgrade.version3to4.title = 金庫をバージョン 3 から 4 にアップグ
upgrade.version4to5.title = 金庫をバージョン 4 から 5 にアップグレード upgrade.version4to5.title = 金庫をバージョン 4 から 5 にアップグレード
upgrade.version4to5.msg = この金庫は新しいフォーマットに移行する必要があります。\n暗号化されたファイルは更新されます。\n続行する前に同期が完了していることをご確認ください。\n\n注意:すべてのファイルの変更日は、現在の日付・時刻に変わります。 upgrade.version4to5.msg = この金庫は新しいフォーマットに移行する必要があります。\n暗号化されたファイルは更新されます。\n続行する前に同期が完了していることをご確認ください。\n\n注意:すべてのファイルの変更日は、現在の日付・時刻に変わります。
upgrade.version4to5.err.io = I/O の例外で移行に失敗しました。詳細はログをご確認ください。 upgrade.version4to5.err.io = I/O の例外で移行に失敗しました。詳細はログをご確認ください。
unlock.label.mountAfterUnlock = ドライブをマウント
unlock.label.revealAfterMount = ドライブの表示 unlock.label.revealAfterMount = ドライブの表示
unlocked.lock.force.confirmation.title = %1$s の施錠に失敗しました unlocked.lock.force.confirmation.title = %1$s の施錠に失敗しました
unlocked.lock.force.confirmation.header = 強制的にロックしますか? unlocked.lock.force.confirmation.header = 強制的にロックしますか?
unlocked.lock.force.confirmation.content = これは恐らく他のプログラムがこの金庫のファイルをまだアクセスしているか、あるいは別の問題が発生したためです。\n\nまだファイルにアクセスしているプログラムが正しく動作しない可能性があり、それらのプログラムによってまだ書き込まれていないデータが失われる可能性があります。 unlocked.lock.force.confirmation.content = これは恐らく他のプログラムがこの金庫のファイルをまだアクセスしているか、あるいは別の問題が発生したためです。\n\nまだファイルにアクセスしているプログラムが正しく動作しない可能性があり、それらのプログラムによってまだ書き込まれていないデータが失われる可能性があります。
unlock.label.unlockAfterStartup = 起動時に解錠 (実験的) unlock.label.unlockAfterStartup = 起動時に解錠 (実験的)
unlock.errorMessage.unlockFailed = 施錠に失敗しました。詳細をログファイルで確認してください。 unlock.errorMessage.unlockFailed = 施錠に失敗しました。詳細をログファイルで確認してください。
unlocked.moreOptions.mount = ドライブのマウント
unlocked.moreOptions.unmount = ドライブの取り出し
upgrade.version5toX.title = 金庫のバージョンをアップグレード upgrade.version5toX.title = 金庫のバージョンをアップグレード
upgrade.version5toX.msg = この金庫を新しいバージョンに移行する必要があります。\n進行する前に同期が完了していることをご確認ください。 upgrade.version5toX.msg = この金庫を新しいバージョンに移行する必要があります。\n進行する前に同期が完了していることをご確認ください。
main.createVault.nonEmptyDir.title = 金庫の作成が失敗しました main.createVault.nonEmptyDir.title = 金庫の作成が失敗しました
main.createVault.nonEmptyDir.header = 空ではないディレクトリが選択されました main.createVault.nonEmptyDir.header = 空ではないディレクトリが選択されました
main.createVault.nonEmptyDir.content = 選択されたディレクトリが既にファイルを含んでいます(隠れている可能性があります)。金庫は空のディレクトのみに作れます。 main.createVault.nonEmptyDir.content = 選択されたディレクトリが既にファイルを含んでいます(隠れている可能性があります)。金庫は空のディレクトのみに作れます。
unlock.label.mountPath = マウントパス
unlock.label.mountPathButton = 適用
settings.webdav.port.label = WebDAV ポート settings.webdav.port.label = WebDAV ポート
settings.webdav.port.prompt = 0 \= 自動的に選択 settings.webdav.port.prompt = 0 \= 自動的に選択
settings.webdav.port.apply = 適用 settings.webdav.port.apply = 適用
@@ -109,6 +103,23 @@ settings.webdav.prefGvfsScheme.label = WebDAV スキーム
settings.volume.label = マウント方法 * settings.volume.label = マウント方法 *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = 金庫が正常に作成されました。
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = パスワードが正常に変更されました。
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator が正常にアップグレードされました。
unlock.label.useOwnMountPath = カスタムマウントポイントを使う
welcome.askForUpdateCheck.dialog.title = アップデート確認
welcome.askForUpdateCheck.dialog.header = 統合アップデート確認を有効にしますか?
welcome.askForUpdateCheck.dialog.content = おすすめ\: アップデート確認を有効にして、常にすべてのセキュリティパッチが適用されたCryptomatorを維持してください。\n設定はいつでも変えられます。
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = 金庫のロックに失敗しました。
main.gracefulShutdown.dialog.header = 金庫が使用中です。
main.gracefulShutdown.dialog.content = 金庫が複数のプログラムによって使用されています。Cryptomatorが正しく終了できるようにプログラムを閉じてから、もう一度やり直してください。\nこれでうまくいかない場合、Cryptomatorを強制的に終了できますが、データの損失が発生しかねないためお勧めできません。
main.gracefulShutdown.button.tryAgain = やり直す
main.gracefulShutdown.button.forceShutdown = 強制終了
unlock.pendingMessage.unlocking = 金庫を施錠中...
unlock.failedDialog.title = 施錠に失敗しました
unlock.failedDialog.header = 施錠に失敗しました
unlock.failedDialog.content.mountPathNonExisting = マウントポイントが存在しません。
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+20 -9
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = 암호화 해제 실패
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = 보관함 잠그기 unlocked.button.lock = 보관함 잠그기
unlocked.moreOptions.reveal = 드라이브 표시 unlocked.moreOptions.reveal = 드라이브 표시
unlocked.moreOptions.copyUrl = WebDAV 주소 복사
unlocked.label.revealFailed = 명령 실패 unlocked.label.revealFailed = 명령 실패
unlocked.label.unmountFailed = 드라이브 꺼내기 실패 unlocked.label.unmountFailed = 드라이브 꺼내기 실패
unlocked.label.statsEncrypted = 암호화 unlocked.label.statsEncrypted = 암호화
@@ -86,22 +85,17 @@ upgrade.version3to4.title = 보관함 버전 3에서 4로 업그레이드
upgrade.version4to5.title = 보관함 버전 4에서 5로 업그레이드 upgrade.version4to5.title = 보관함 버전 4에서 5로 업그레이드
upgrade.version4to5.msg = 이 보관함은 새로운 형식으로 이전되어야 합니다.\n암호화된 파일들은 업데이트 될 것입니다.\n진행하기 전에 동기화가 완료되었는지 확인해주세요.\n\n참고\: 모든 파일의 수정 날짜는 과정 진행 중에 현재 날짜/시간으로 바뀔 것입니다. upgrade.version4to5.msg = 이 보관함은 새로운 형식으로 이전되어야 합니다.\n암호화된 파일들은 업데이트 될 것입니다.\n진행하기 전에 동기화가 완료되었는지 확인해주세요.\n\n참고\: 모든 파일의 수정 날짜는 과정 진행 중에 현재 날짜/시간으로 바뀔 것입니다.
upgrade.version4to5.err.io = I/O 예외에 의해 마이그레이션 실패. 자세한 사항은 로그 파일을 참조하세요. upgrade.version4to5.err.io = I/O 예외에 의해 마이그레이션 실패. 자세한 사항은 로그 파일을 참조하세요.
unlock.label.mountAfterUnlock = 드라이브 마운트
unlock.label.revealAfterMount = 드라이브 공개 unlock.label.revealAfterMount = 드라이브 공개
unlocked.lock.force.confirmation.title = %1$s 잠그기 실패 unlocked.lock.force.confirmation.title = %1$s 잠그기 실패
unlocked.lock.force.confirmation.header = 강제로 잠그시겠습니까? unlocked.lock.force.confirmation.header = 강제로 잠그시겠습니까?
unlocked.lock.force.confirmation.content = 이는 다른 프로그램이 보관함 내의 파일을 접근하고 있거나, 다른 문제가 발생했기 때문일 수 있습니다.\n\n파일을 접근하고 있는 프로그램이 제대로 동작하지 않을 수 있으며, 프로그램이 쓰지 않은 데이터는 손실될 수 있습니다. unlocked.lock.force.confirmation.content = 이는 다른 프로그램이 보관함 내의 파일을 접근하고 있거나, 다른 문제가 발생했기 때문일 수 있습니다.\n\n파일을 접근하고 있는 프로그램이 제대로 동작하지 않을 수 있으며, 프로그램이 쓰지 않은 데이터는 손실될 수 있습니다.
unlock.label.unlockAfterStartup = 시작 시 자동 잠금 해제 (실험적) unlock.label.unlockAfterStartup = 시작 시 자동 잠금 해제 (실험적)
unlock.errorMessage.unlockFailed = 잠금 해제 실패. 자세한 사항은 로그 파일을 참조하세요. unlock.errorMessage.unlockFailed = 잠금 해제 실패. 자세한 사항은 로그 파일을 참조하세요.
unlocked.moreOptions.mount = 드라이브 마운트
unlocked.moreOptions.unmount = 드라이브 꺼내기
upgrade.version5toX.title = 보관함 버전 업그레이드 upgrade.version5toX.title = 보관함 버전 업그레이드
upgrade.version5toX.msg = 이 보관함은 새로운 버전으로 이전되어야 합니다.\n진행하기 전에 동기화가 완료되었는지 확인해주세요. upgrade.version5toX.msg = 이 보관함은 새로운 버전으로 이전되어야 합니다.\n진행하기 전에 동기화가 완료되었는지 확인해주세요.
main.createVault.nonEmptyDir.title = 보관함 생성 실패 main.createVault.nonEmptyDir.title = 보관함 생성 실패
main.createVault.nonEmptyDir.header = 선택된 디렉토리가 비어있지 않습니다 main.createVault.nonEmptyDir.header = 선택된 디렉토리가 비어있지 않습니다
main.createVault.nonEmptyDir.content = 선택된 디렉토리가 이미 파일을 포함하고 있습니다 (숨겨져 있을 수도 있습니다). 보관함은 비어있는 디렉토리에만 생성할 수 있습니다. main.createVault.nonEmptyDir.content = 선택된 디렉토리가 이미 파일을 포함하고 있습니다 (숨겨져 있을 수도 있습니다). 보관함은 비어있는 디렉토리에만 생성할 수 있습니다.
unlock.label.mountPath = 경로 마운트
unlock.label.mountPathButton = 적용
settings.webdav.port.label = WebDAV 포트 settings.webdav.port.label = WebDAV 포트
settings.webdav.port.prompt = 0 \= 자동으로 선택 settings.webdav.port.prompt = 0 \= 자동으로 선택
settings.webdav.port.apply = 적용 settings.webdav.port.apply = 적용
@@ -109,6 +103,23 @@ settings.webdav.prefGvfsScheme.label = WebDAV 스킴
settings.volume.label = 마운트-방법 * settings.volume.label = 마운트-방법 *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = 보관함이 성공적으로 생성되었습니다.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = 비밀번호가 성공적으로 변경되었습니다.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator가 성공적으로 업그레이드 되었습니다.
unlock.label.useOwnMountPath = 커스텀 마운트 지점 사용
welcome.askForUpdateCheck.dialog.title = 업데이트 확인
welcome.askForUpdateCheck.dialog.header = 통합 업데이트 확인을 활성화 하겠습니까?
welcome.askForUpdateCheck.dialog.content = 추천\: 모든 보안 패치가 적용된 최신 버전의 Cryptomator를 유지하기 위해 업데이트 확인을 활성화 하십시오.\n설정에서 언제든지 바꿀 수 있습니다.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = 보관함 잠그기 실패
main.gracefulShutdown.dialog.header = 보관함이 사용중입니다.
main.gracefulShutdown.dialog.content = 하나 이상의 보관함을 다른 프로그램이 사용하고 있습니다. Cryptomator를 올바르게 종료하려면 프로그램을 먼저 종료하고 다시 시도해 주세요.
main.gracefulShutdown.button.tryAgain = 다시 시도
main.gracefulShutdown.button.forceShutdown = 강제 종료
unlock.pendingMessage.unlocking = 보관함 여는 중
unlock.failedDialog.title = 잠금 해제 실패
unlock.failedDialog.header = 잠금 해제 실패
unlock.failedDialog.content.mountPathNonExisting = 마운트 지점이 존재하지 않습니다.
unlock.failedDialog.content.mountPathNotEmpty = 마운트 지점이 비어있지 않습니다.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+19 -8
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = Atšifrēšana neizdevās
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Aizslēgt glabātuvi unlocked.button.lock = Aizslēgt glabātuvi
unlocked.moreOptions.reveal = Atklāt disku unlocked.moreOptions.reveal = Atklāt disku
unlocked.moreOptions.copyUrl = Kopēt WebDAV saiti
unlocked.label.revealFailed = Komunikācija neizdevās unlocked.label.revealFailed = Komunikācija neizdevās
unlocked.label.unmountFailed = Diska izgrūšana neizdevās unlocked.label.unmountFailed = Diska izgrūšana neizdevās
unlocked.label.statsEncrypted = šifrēts unlocked.label.statsEncrypted = šifrēts
@@ -87,29 +86,41 @@ upgrade.version3to4.title = Glabātuves versijas 3 uz 4 atjauninājums
upgrade.version4to5.title = Glabātuves versijas 4 uz 5 atjauninājums upgrade.version4to5.title = Glabātuves versijas 4 uz 5 atjauninājums
upgrade.version4to5.msg = Šo glabātuvi nepieciešams migrēt uz jaunāku versiju.\nŠifrētās datnes tiks atjauninātas.\nPirms apstiprini, pārliecinies, ka ir beigusies sinhronizācija.\n\nPiezīme\: Visām datnēm modificēšanas datums tiks izmainīts uz šodienas datumu. upgrade.version4to5.msg = Šo glabātuvi nepieciešams migrēt uz jaunāku versiju.\nŠifrētās datnes tiks atjauninātas.\nPirms apstiprini, pārliecinies, ka ir beigusies sinhronizācija.\n\nPiezīme\: Visām datnēm modificēšanas datums tiks izmainīts uz šodienas datumu.
upgrade.version4to5.err.io = Migrācijas kļīda dēļ I/O izņēmuma. Sīkāku informāciju skaties žurnālā. upgrade.version4to5.err.io = Migrācijas kļīda dēļ I/O izņēmuma. Sīkāku informāciju skaties žurnālā.
unlock.label.mountAfterUnlock = Mount Drive
unlock.label.revealAfterMount = Reveal Drive unlock.label.revealAfterMount = Reveal Drive
unlocked.lock.force.confirmation.title = Locking of %1$s failed unlocked.lock.force.confirmation.title = Locking of %1$s failed
unlocked.lock.force.confirmation.header = Do you want to force locking? unlocked.lock.force.confirmation.header = Do you want to force locking?
unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost. unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost.
unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental) unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental)
unlock.errorMessage.unlockFailed = Unlock failed. See log file for details. unlock.errorMessage.unlockFailed = Unlock failed. See log file for details.
unlocked.moreOptions.mount = Mount Drive
unlocked.moreOptions.unmount = Eject Drive
upgrade.version5toX.title = Vault Version Upgrade upgrade.version5toX.title = Vault Version Upgrade
upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding. upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding.
main.createVault.nonEmptyDir.title = Creating vault failed main.createVault.nonEmptyDir.title = Creating vault failed
main.createVault.nonEmptyDir.header = Chosen directory is not empty main.createVault.nonEmptyDir.header = Chosen directory is not empty
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory. main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
unlock.label.mountPath = Mount Path
unlock.label.mountPathButton = Apply
settings.webdav.port.label = WebDAV Port settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.port.prompt = 0 \= Choose automatically
settings.webdav.port.apply = Apply settings.webdav.port.apply = Apply
settings.webdav.prefGvfsScheme.label = WebDAV Scheme settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode * settings.volume.label = Preferred Volume Type
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try again
main.gracefulShutdown.button.forceShutdown = Force shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+26 -15
View File
@@ -47,7 +47,6 @@ changePassword.errorMessage.decryptionFailed = Decoderen mislukt
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Vergrendel kluis unlocked.button.lock = Vergrendel kluis
unlocked.moreOptions.reveal = Maak schijf zichtbaar unlocked.moreOptions.reveal = Maak schijf zichtbaar
unlocked.moreOptions.copyUrl = Kopieer WebDAV URL
unlocked.label.revealFailed = Opdracht mislukt unlocked.label.revealFailed = Opdracht mislukt
unlocked.label.unmountFailed = Uitwerpen schijf mislukt unlocked.label.unmountFailed = Uitwerpen schijf mislukt
unlocked.label.statsEncrypted = versleuteld unlocked.label.statsEncrypted = versleuteld
@@ -88,29 +87,41 @@ upgrade.version3to4.title = Kluis Versie 3 naar 4 Upgrade
upgrade.version4to5.title = Kluis Versie 4 naar 5 Upgrade upgrade.version4to5.title = Kluis Versie 4 naar 5 Upgrade
upgrade.version4to5.msg = Deze kluis moet gemigreerd worden naar een nieuw formaat.\nVersleutelde bestanden zullen bijgewerkt worden.\nZorg ervoor dat synchronisatie voltooid is alvorens verder te gaan.\n\nLet op\: Tijdens dit proces zal de wijzigingsdatum van alle bestanden gewijzigd worden naar de huidige datum/tijd. upgrade.version4to5.msg = Deze kluis moet gemigreerd worden naar een nieuw formaat.\nVersleutelde bestanden zullen bijgewerkt worden.\nZorg ervoor dat synchronisatie voltooid is alvorens verder te gaan.\n\nLet op\: Tijdens dit proces zal de wijzigingsdatum van alle bestanden gewijzigd worden naar de huidige datum/tijd.
upgrade.version4to5.err.io = Migratie mislukt door een I/O Exception. Bekijk log file voor details. upgrade.version4to5.err.io = Migratie mislukt door een I/O Exception. Bekijk log file voor details.
unlock.label.mountAfterUnlock = Schijf mounten
unlock.label.revealAfterMount = Maak schijf zichtbaar unlock.label.revealAfterMount = Maak schijf zichtbaar
unlocked.lock.force.confirmation.title = Blokkeren van %1$s is mislukt unlocked.lock.force.confirmation.title = Blokkeren van %1$s is mislukt
unlocked.lock.force.confirmation.header = Wil je vergrendelen forceren? unlocked.lock.force.confirmation.header = Wil je vergrendelen forceren?
unlocked.lock.force.confirmation.content = Dit kan komen omdat er nog andere programma's de bestanden in de kluis gebruik hebben, of door een ander probleem.\n\nProgramma's die de bestanden nog in gebruik hebben werken mogelijk niet goed, en gegevens die nog niet opgeslagen zijn gaan mogelijk verloren. unlocked.lock.force.confirmation.content = Dit kan komen omdat er nog andere programma's de bestanden in de kluis gebruik hebben, of door een ander probleem.\n\nProgramma's die de bestanden nog in gebruik hebben werken mogelijk niet goed, en gegevens die nog niet opgeslagen zijn gaan mogelijk verloren.
unlock.label.unlockAfterStartup = Auto-ontgrendelen bij starten (Expirimenteel) unlock.label.unlockAfterStartup = Auto-ontgrendelen bij starten (Expirimenteel)
unlock.errorMessage.unlockFailed = Ontgrendelen mislukt. Zie log file voor details. unlock.errorMessage.unlockFailed = Ontgrendelen mislukt. Zie log file voor details.
unlocked.moreOptions.mount = Schijf mounten
unlocked.moreOptions.unmount = Schijf uitwerpen
upgrade.version5toX.title = Upgraden versie kluis upgrade.version5toX.title = Upgraden versie kluis
upgrade.version5toX.msg = Deze kluis moet gemigreerd worden naar een nieuwer formaat. Zorg dat de synchronisatie klaar is alvorens verder te gaan. upgrade.version5toX.msg = Deze kluis moet gemigreerd worden naar een nieuwer formaat. Zorg dat de synchronisatie klaar is alvorens verder te gaan.
main.createVault.nonEmptyDir.title = Kluis aanmaken mislukt main.createVault.nonEmptyDir.title = Kluis aanmaken mislukt
main.createVault.nonEmptyDir.header = De gekozen map is niet leeg main.createVault.nonEmptyDir.header = De gekozen map is niet leeg
main.createVault.nonEmptyDir.content = De geselecteerde map bevat al bestanden (mogelijk verborgen). Een klluis kan alleen worden aangemaakt in een lege map. main.createVault.nonEmptyDir.content = De geselecteerde map bevat al bestanden (mogelijk verborgen). Een klluis kan alleen worden aangemaakt in een lege map.
unlock.label.mountPath = Mount Path settings.webdav.port.label = WebDAV Poort
unlock.label.mountPathButton = Apply settings.webdav.port.prompt = 0 \= Automatisch kiezen
settings.webdav.port.label = WebDAV Port settings.webdav.port.apply = Toepassen
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.prefGvfsScheme.label = WebDAV Schema
settings.webdav.port.apply = Apply settings.volume.label = Voorkeurs Volume Type
settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = STOP
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Kluis was succesvol gecreeerd
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Wachtwoord is succesvol aangepast
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator succesvol vernieuwd.
unlock.label.useOwnMountPath = Gebruik een eigen koppelpunt
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Geintegreerde update check aanzetten
welcome.askForUpdateCheck.dialog.content = Om te controleren op updates haalt Cryptomator het huidige versienummer van de Cryptomatorservers en toont een hint indien een nieuwere versie beschikbaar is.\n\nWe raden aan om de geintegreerde update check aan te zetten om zeker te weten dat je de nieuwste versie van Cryptomator met alle beveiligings aanpassingen hebt geinstalleerd. Indien je deze niet aanzet kun je zelf de versie controleren en downloaden van https\://cryptomatr.org/downloads/.\n\n\nJe kan dit te allen tijden bij instellingen aanpassen.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Vergrendelen kluis/kluizen mislukt
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Probeer opnieuw
main.gracefulShutdown.button.forceShutdown = Geforceerd afsluiten
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+72 -61
View File
@@ -2,52 +2,51 @@ app.name = Cryptomator
# main.fxml # main.fxml
main.emptyListInstructions = Kliknij tutaj, aby utworzyć nowy portfel main.emptyListInstructions = Kliknij tutaj, aby utworzyć nowy portfel
main.directoryList.contextMenu.remove = Usuń z listy main.directoryList.contextMenu.remove = Usuń z listy
main.directoryList.contextMenu.changePassword = Zmień hasło main.directoryList.contextMenu.changePassword = Zmień Hasło
main.addDirectory.contextMenu.new = Stwórz nowy portfel main.addDirectory.contextMenu.new = Utwórz Nowy Portfel
main.addDirectory.contextMenu.open = Otwórz istniejący portfel main.addDirectory.contextMenu.open = Otwórz istniejący portfel
# welcome.fxml # welcome.fxml
welcome.checkForUpdates.label.currentlyChecking = Sprawdzanie aktualizacji... welcome.checkForUpdates.label.currentlyChecking = Sprawdzanie aktualizacji...
welcome.newVersionMessage = Nowa wersja %1$s jest dostępna do pobrania.\nObecnie używana wersja to %2$s. welcome.newVersionMessage = Nowa wersja %1$s jest dostępna do pobrania.\nObecnie używana wersja to %2$s.
# initialize.fxml # initialize.fxml
initialize.label.password = Hasło initialize.label.password = Hasło
initialize.label.retypePassword = Powtórz hasło initialize.label.retypePassword = Powtórz Hasło
initialize.button.ok = Stwórz portfel initialize.button.ok = Utwórz Portfel
initialize.messageLabel.alreadyInitialized = Portfel został utworzony initialize.messageLabel.alreadyInitialized = Portfel został utworzony
initialize.messageLabel.initializationFailed = Nie można utworzyć portfela. Szczegóły błędu znajdziesz w logach. initialize.messageLabel.initializationFailed = Nie można zainicjować portfela. Zobacz plik dziennika, aby poznać szczegóły.
# notfound.fxml # notfound.fxml
notfound.label = Nie znaleziono portfela. Może został przeniesiony? notfound.label = Nie znaleziono portfela. Może został przeniesiony?
# upgrade.fxml # upgrade.fxml
upgrade.button = Zaktualizuj portfel upgrade.button = Zaktualizuj Portfel
upgrade.version3dropBundleExtension.msg = Portfel musi zostać zaktualizowany do nowszego formatu.\n"%1$s" zostanie zmienione na "%2$s".\nZanim rozpoczniesz migracje upewnij się, że synchronizacja plików została ukończona. upgrade.version3dropBundleExtension.msg = Portfel musi zostać zaktualizowany do nowszego formatu.\n"%1$s" zostanie zmienione na "%2$s".\nPrzed kontynuowaniem upewnij się, że synchronizacja została zakończona.
upgrade.version3dropBundleExtension.err.alreadyExists = Błąd automatycznej migracji portfela.\n"%s" już istnieje. upgrade.version3dropBundleExtension.err.alreadyExists = Automatyczna migracja nie powiodła się.\n"%s" już istnieje.
# unlock.fxml # unlock.fxml
unlock.label.password = Hasło do wolumenu unlock.label.password = Hasło
unlock.label.mountName = Nazwa wolumenu unlock.label.mountName = Nazwa Napędu
unlock.label.winDriveLetter = Litera dysku unlock.label.winDriveLetter = Litera Napędu
unlock.label.downloadsPageLink = Wszystkie wersje Cryptomatora unlock.label.downloadsPageLink = Wszystkie wersje Cryptomatora
unlock.label.advancedHeading = Opcje zaawansowane unlock.label.advancedHeading = Opcje Zaawansowane
unlock.button.unlock = Odblokuj portfel unlock.button.unlock = Odblokuj Portfel
unlock.button.advancedOptions.show = Więcej opcji unlock.button.advancedOptions.show = Więcej Opcji
unlock.button.advancedOptions.hide = Mniej opcji unlock.button.advancedOptions.hide = Mniej Opcji
unlock.choicebox.winDriveLetter.auto = Przydziel automatycznie unlock.choicebox.winDriveLetter.auto = Przydziel automatycznie
unlock.errorMessage.wrongPassword = Nieprawidłowe hasło unlock.errorMessage.wrongPassword = Nieprawidłowe hasło
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = Niewspierana wersja portfela. Ten portfel został utworzony przez starszą wersję Cryptomatora. unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = Nieobsługiwana wersja portfela. Ten portfel został utworzony przez starszą wersję Cryptomatora.
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = Niewspierana wersja portfela. Ten portfel został utworzony przez nowszą wersję Cryptomatora. unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = Nieobsługiwana wersja portfela. Ten portfel został utworzony przez nowszą wersję Cryptomatora.
unlock.messageLabel.startServerFailed = Nie udało się uruchomić serwera WebDAV. unlock.messageLabel.startServerFailed = Nie udało się uruchomić serwera WebDAV.
# change_password.fxml # change_password.fxml
changePassword.label.oldPassword = Stare hasło changePassword.label.oldPassword = Stare Hasło
changePassword.label.newPassword = Nowe hasło changePassword.label.newPassword = Nowe Hasło
changePassword.label.retypePassword = Powtórz hasło changePassword.label.retypePassword = Powtórz Hasło
changePassword.label.downloadsPageLink = Wszystkie wersje Cryptomatora changePassword.label.downloadsPageLink = Wszystkie wersje Cryptomatora
changePassword.button.change = Zmień hasło changePassword.button.change = Zmień Hasło
changePassword.errorMessage.wrongPassword = Nieprawidłowe hasło changePassword.errorMessage.wrongPassword = Nieprawidłowe hasło
changePassword.errorMessage.decryptionFailed = Błąd odszyfrowywania changePassword.errorMessage.decryptionFailed = Błąd odszyfrowywania
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Zabezpiecz portfel unlocked.button.lock = Blokuj Portfel
unlocked.moreOptions.reveal = Odkryj wolumen unlocked.moreOptions.reveal = Odkryj Napęd
unlocked.moreOptions.copyUrl = Skopiuj URL WebDAV unlocked.label.revealFailed = Polecenie nie powiodło się
unlocked.label.revealFailed = Błąd odkrywania wolumenu unlocked.label.unmountFailed = Wysuwanie napędu nie powiodło się
unlocked.label.unmountFailed = Błąd odłączania wolumenu
unlocked.label.statsEncrypted = szyfrowane unlocked.label.statsEncrypted = szyfrowane
unlocked.label.statsDecrypted = nieszyfrowywane unlocked.label.statsDecrypted = nieszyfrowywane
unlocked.ioGraph.yAxis.label = Wydajność (MiB/s) unlocked.ioGraph.yAxis.label = Wydajność (MiB/s)
@@ -58,57 +57,69 @@ settings.requiresRestartLabel = * Cryptomator wymaga restartu
# tray icon # tray icon
tray.menu.open = Otwórz tray.menu.open = Otwórz
tray.menu.quit = Wyjdź tray.menu.quit = Wyjdź
tray.infoMsg.title = Wciąż działa tray.infoMsg.title = Nadal Uruchomiony
tray.infoMsg.msg = Cryptomator wciąż jest uruchomiony. Aby go wyłączyć, użyj ikony z obszaru powiadomień. tray.infoMsg.msg = Cryptomator jest nadal uruchomiony. Zamknij go z ikony z paska zadań.
tray.infoMsg.msg.osx = Cryptomator wciąż jest uruchomiony. Aby go wyłączyć, użyj ikony z paska menu. tray.infoMsg.msg.osx = Cryptomator jest nadal uruchomiony. Zamknij go z ikony z paska menu.
initialize.messageLabel.passwordStrength.0 = Bardzo słabe initialize.messageLabel.passwordStrength.0 = Bardzo słabe
initialize.messageLabel.passwordStrength.1 = Słabe initialize.messageLabel.passwordStrength.1 = Słabe
initialize.messageLabel.passwordStrength.2 = W porządku initialize.messageLabel.passwordStrength.2 = Dostateczne
initialize.messageLabel.passwordStrength.3 = Mocne initialize.messageLabel.passwordStrength.3 = Mocne
initialize.messageLabel.passwordStrength.4 = Bardzo mocne initialize.messageLabel.passwordStrength.4 = Bardzo mocne
initialize.label.doNotForget = WAŻNE\: Jeśli zapomnisz hasło, nie ma żadnej innej możliwości odzyskania Twouch danych. initialize.label.doNotForget = WAŻNE\: Jeśli zapomnisz hasło, nie ma żadnej innej możliwości odzyskania twoich danych.
main.directoryList.remove.confirmation.title = Usuń portfel main.directoryList.remove.confirmation.title = Usuń Portfel
main.directoryList.remove.confirmation.header = Czy na pewno chcesz usunąć ten portfel? main.directoryList.remove.confirmation.header = Czy na pewno chcesz usunąć ten portfel?
main.directoryList.remove.confirmation.content = Ten portfel zostanie usunięty tylko z listy. Jeśli chcesz trwale go usunąć, usuń pliki portfela z dysku. main.directoryList.remove.confirmation.content = Ten portfel zostanie usunięty tylko z listy. Jeśli chcesz trwale go usunąć, usuń pliki portfela ze swojego systemu plików.
upgrade.version3to4.msg = Ten portfel wymaga aktualizacji do nowszej wersji. \nZaszyfrowane nazwy folderów zostaną zmienione.\nZanim rozoczniesz migracje upewnij się, że synchronizacja plików została ukończona. upgrade.version3to4.msg = Ten portfel wymaga migracji do nowszego formatu.\nZaszyfrowane nazwy folderów zostaną zaktualizowane.\nPrzed kontynuowaniem upewnij się, że synchronizacja została zakończona.
upgrade.version3to4.err.io = Błąd aktualizacji z powodu problemów z odczytem/zapisem. Szczegóły błędu znajdziesz w logach. upgrade.version3to4.err.io = Migracja nie powiodła się z powodu wyjątku I/O. Zobacz plik dziennika, aby poznać szczegóły.
# upgrade.fxml # upgrade.fxml
upgrade.confirmation.label = Tak, synchronizacja plików na pewno została ukończona. upgrade.confirmation.label = Tak, upewniłem się że synchronizacja plików została ukończona.
unlock.label.savePassword = Zapisz hasło unlock.label.savePassword = Zapisz Hasło
unlock.errorMessage.unauthenticVersionMac = Nie udało się uwierzytelnić wersji MAC unlock.errorMessage.unauthenticVersionMac = Nie udało się uwierzytelnić wersji MAC
unlocked.label.mountFailed = Błąd podłączanie dysku. unlocked.label.mountFailed = Nie udało się połączyć z napędem
unlock.savePassword.delete.confirmation.title = Usuń zapisane hasło unlock.savePassword.delete.confirmation.title = Usuń Zapisane Hasło
unlock.savePassword.delete.confirmation.header = Czy na pewno chcesz usunąć zapisane hasło do tego portfela? unlock.savePassword.delete.confirmation.header = Czy na pewno chcesz usunąć zapisane hasło do tego portfela?
unlock.savePassword.delete.confirmation.content = Zapisane hasło do tego portfela zostanie natychmiast usunięte z systemowego pęku kluczy. Jeśli chcesz zapisać hasło ponownie, zaloguj się do portfela z zaznaczoną opcją "Zapisz hasło". unlock.savePassword.delete.confirmation.content = Zapisane hasło do tego portfela zostanie natychmiast usunięte z systemowego pęku kluczy. Jeśli chcesz ponownie zapisać hasło, musisz odblokować portfel z włączoną opcją "Zapisz hasło".
settings.debugMode.label = Tryb debugowania * settings.debugMode.label = Tryb Debugowania *
upgrade.version3dropBundleExtension.title = Aktualizacja portfela do wersji 3 (Drop Bundle Extension) upgrade.version3dropBundleExtension.title = Aktualizacja portfela do wersji 3 (Drop Bundle Extension)
upgrade.version3to4.title = Aktualizacja portfela z wersji 3 do 4 upgrade.version3to4.title = Aktualizacja portfela z wersji 3 do 4
upgrade.version4to5.title = Aktualizacja portfela z wersji 4 do 5 upgrade.version4to5.title = Aktualizacja portfela z wersji 4 do 5
upgrade.version4to5.msg = Ten portfel wymaga aktualizacji do nowszej wersji. \nZaszyfrowane nazwy folderów zostaną zmienione.\nZanim rozpoczniesz migracje, upewnij się, że synchronizacja plików została ukończona.\n\nUwaga\: W procesie aktualizacji data modyfikacji wszystkich plików zmieni się na biezącą datę/czas. upgrade.version4to5.msg = Ten portfel wymaga migracji do nowszego formatu.\nZaszyfrowane pliki zostaną zaktualizowane.\nPrzed kontynuowaniem upewnij się, że synchronizacja została zakończona..\n\nUwaga\: Data modyfikacji wszystkich plików zostanie zmieniona w procesie na bieżącą datę/czas.
upgrade.version4to5.err.io = Błąd aktualizacji z powodu problemów z odczytem/zapisem. Szczegóły błędu znajdziesz w logach. upgrade.version4to5.err.io = Migracja nie powiodła się z powodu wyjątku I/O. Szczegóły błędu znajdziesz w dzienniku.
unlock.label.mountAfterUnlock = Zamontuj dysk unlock.label.revealAfterMount = Pokaż Napęd
unlock.label.revealAfterMount = Pokaż dysk
unlocked.lock.force.confirmation.title = Zablokowywanie %1$s nie powiodło się unlocked.lock.force.confirmation.title = Zablokowywanie %1$s nie powiodło się
unlocked.lock.force.confirmation.header = Czy chcesz wymusić zablokowanie? unlocked.lock.force.confirmation.header = Czy chcesz wymusić zablokowanie?
unlocked.lock.force.confirmation.content = Może się tak dziać dlatego, że inne programy wciąż korzystają z plików z portfela lub wystąpił inny problem.\n\nProgramy wciąż korzystające z plików mogą przestać działać poprawnie, a nie zapisane przez nie dane mogą zostać utracone. unlocked.lock.force.confirmation.content = Może się tak dziać dlatego, że inne programy wciąż korzystają z plików z portfela lub wystąpił inny problem.\n\nProgramy wciąż korzystające z plików mogą przestać działać poprawnie, a nie zapisane przez nie dane mogą zostać utracone.
unlock.label.unlockAfterStartup = Auto-odblokowywanie podczas uruchamiania (Eksperymentalne) unlock.label.unlockAfterStartup = Auto-odblokowywanie podczas uruchamiania (Eksperymentalne)
unlock.errorMessage.unlockFailed = Błąd odblokowywania. Szczegóły błędu znajdziesz w logach. unlock.errorMessage.unlockFailed = Błąd odblokowywania. Szczegóły błędu znajdziesz w dzienniku.
unlocked.moreOptions.mount = Podłącz dysk upgrade.version5toX.title = Aktualizacja Wersji Portfela
unlocked.moreOptions.unmount = Odłącz dysk upgrade.version5toX.msg = Ten portfel wymaga migracji do nowszego formatu.\nZanim rozpoczniesz migrację upewnij się, że synchronizacja plików została zakończona.
upgrade.version5toX.title = Aktualizacja wersji portfela
upgrade.version5toX.msg = Ten portfel wymaga aktualizacji do nowszej wersji.\nZanim rozpoczniesz migracje upewnij się, że synchronizacja plików została ukończona.
main.createVault.nonEmptyDir.title = Błąd podczas tworzenia portfela main.createVault.nonEmptyDir.title = Błąd podczas tworzenia portfela
main.createVault.nonEmptyDir.header = Wybrany katalog nie jest pusty main.createVault.nonEmptyDir.header = Wybrany katalog nie jest pusty
main.createVault.nonEmptyDir.content = Wybrany katalog aktualnie zawiera pliki (prawdopodobnie ukryte). Portfel mozna utworzyć wyłącznie w puatym katalogu. main.createVault.nonEmptyDir.content = Wybrany katalog zawiera już pliki (prawdopodobnie ukryte). Portfel mozna utworzyć wyłącznie w pustym katalogu.
unlock.label.mountPath = Mount Path settings.webdav.port.label = Port WebDAV
unlock.label.mountPathButton = Apply settings.webdav.port.prompt = 0 \= Wybierz automatycznie
settings.webdav.port.label = WebDAV Port settings.webdav.port.apply = Zastosuj
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.prefGvfsScheme.label = System WebDAV
settings.webdav.port.apply = Apply settings.volume.label = Preferowany Typ Woluminu
settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Portfel został pomyślnie utworzony.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Hasło zostało pomyślnie zmienione.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator został pomyślnie zaktualizowany.
unlock.label.useOwnMountPath = Użyj indywidualnego punktu montowania
welcome.askForUpdateCheck.dialog.title = Sprawdź aktualizację
welcome.askForUpdateCheck.dialog.header = Włącz zintegrowane sprawdzenie aktualizacji?
welcome.askForUpdateCheck.dialog.content = Aby sprawdzić dostępność aktualizacji, Cryptomator pobierze bieżącą wersję z serwerów Cryptomator i wyświetli podpowiedź, jeśli dostępna będzie nowsza wersja.\n\nZalecamy włączenie sprawdzania aktualizacji, aby zawsze mieć pewność, że zainstalowana jest najnowsza wersja Cryptomatora ze wszystkimi poprawkami zabezpieczeń. Jeśli nie włączysz sprawdzania aktualizacji, możesz sprawdzić i pobrać aktualną wersję z https\://cryptomator.org/downloads/.\n\nMożesz to zmienić w dowolnym momencie, korzystając z ustawień.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Nie udało się zablokować porfela(i)
main.gracefulShutdown.dialog.header = Portfel(e) w użyciu
main.gracefulShutdown.dialog.content = Jedna lub więcej porfelii jest nadal używana przez inne programy. Zamknij je, aby umożliwić prawidłowe zamknięcie Cryptomator, a następnie spróbuj ponownie.\n\nJeśli to nie zadziała, Cryptomator może zamknąć na siłę, ale może to spowodować utratę danych i nie jest zalecane.
main.gracefulShutdown.button.tryAgain = Spróbuj ponownie
main.gracefulShutdown.button.forceShutdown = Wymuś zamknięcie
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+21 -10
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = Falha ao descriptografar
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Fechar cofre unlocked.button.lock = Fechar cofre
unlocked.moreOptions.reveal = Mostrar drive unlocked.moreOptions.reveal = Mostrar drive
unlocked.moreOptions.copyUrl = Copiar URL WebDAV
unlocked.label.revealFailed = Falha de comando unlocked.label.revealFailed = Falha de comando
unlocked.label.unmountFailed = Falha ao ejetar drive unlocked.label.unmountFailed = Falha ao ejetar drive
unlocked.label.statsEncrypted = Criptografado unlocked.label.statsEncrypted = Criptografado
@@ -74,7 +73,7 @@ upgrade.version3to4.msg = Esse cofre tem que ser migrado a um novo formato. Os n
upgrade.version3to4.err.io = Falha na migração devido a um erro de E/S. Veja o arquivo de log para mais detalhes. upgrade.version3to4.err.io = Falha na migração devido a um erro de E/S. Veja o arquivo de log para mais detalhes.
# upgrade.fxml # upgrade.fxml
upgrade.confirmation.label = Sim, tenho certeza de que a sincronização foi concluída upgrade.confirmation.label = Sim, tenho certeza de que a sincronização foi concluída
unlock.label.savePassword = Armazenar senha unlock.label.savePassword = Salvar senha
unlock.errorMessage.unauthenticVersionMac = Não foi possível autenticar a versão do MAC. unlock.errorMessage.unauthenticVersionMac = Não foi possível autenticar a versão do MAC.
unlocked.label.mountFailed = Falha ao conectar o drive unlocked.label.mountFailed = Falha ao conectar o drive
unlock.savePassword.delete.confirmation.title = Apagar a senha armazenada unlock.savePassword.delete.confirmation.title = Apagar a senha armazenada
@@ -86,22 +85,17 @@ upgrade.version3to4.title = Atualização do cofre da versão 3 para 4
upgrade.version4to5.title = Atualização do cofre da versão 4 para 5 upgrade.version4to5.title = Atualização do cofre da versão 4 para 5
upgrade.version4to5.msg = Este cofre precisa ser migrado a um novo formato.\nOs arquivos criptografados serão atualizados.\nPor favor, assegure que a sincronização do cofre esteja finalizada antes de proceder com a migração para o novo formato.\n\nNota\: A data de modificação de todos os arquivos do cofre será alterada durante o processo para a data e hora corrente. upgrade.version4to5.msg = Este cofre precisa ser migrado a um novo formato.\nOs arquivos criptografados serão atualizados.\nPor favor, assegure que a sincronização do cofre esteja finalizada antes de proceder com a migração para o novo formato.\n\nNota\: A data de modificação de todos os arquivos do cofre será alterada durante o processo para a data e hora corrente.
upgrade.version4to5.err.io = A migração falhou devido a uma exceção de I/O. Ver arquivo de log para mais detalhes. upgrade.version4to5.err.io = A migração falhou devido a uma exceção de I/O. Ver arquivo de log para mais detalhes.
unlock.label.mountAfterUnlock = Montar o Drive
unlock.label.revealAfterMount = Mostrar o Drive unlock.label.revealAfterMount = Mostrar o Drive
unlocked.lock.force.confirmation.title = O bloqueio do %1$s falhou unlocked.lock.force.confirmation.title = O bloqueio do %1$s falhou
unlocked.lock.force.confirmation.header = Você quer forçar o bloqueio? unlocked.lock.force.confirmation.header = Você quer forçar o bloqueio?
unlocked.lock.force.confirmation.content = Isto pode ser causado por outros programas que seguem acessando arquivos no cofre ou porque algum outro problema ocorreu.\n\nProgramas que seguem acessando os arquivos podem não funcionar corretamente e os dados ainda não gravados por estes programas podem ser perdidos. unlocked.lock.force.confirmation.content = Isto pode ser causado por outros programas que seguem acessando arquivos no cofre ou porque algum outro problema ocorreu.\n\nProgramas que seguem acessando os arquivos podem não funcionar corretamente e os dados ainda não gravados por estes programas podem ser perdidos.
unlock.label.unlockAfterStartup = Auto-desbloqueio ao Iniciar (Experimental) unlock.label.unlockAfterStartup = Auto-desbloqueio ao Iniciar (Experimental)
unlock.errorMessage.unlockFailed = O desbloqueio falhou. Veja o log para mais detalhes. unlock.errorMessage.unlockFailed = O desbloqueio falhou. Veja o log para mais detalhes.
unlocked.moreOptions.mount = Montar o Drive
unlocked.moreOptions.unmount = Ejetar o Drive
upgrade.version5toX.title = Atualização da Versão do Cofre upgrade.version5toX.title = Atualização da Versão do Cofre
upgrade.version5toX.msg = Este cofre precisa ser migrado a um novo formato. Por favor assegure que a sincronização foi finalizada antes de proceder. upgrade.version5toX.msg = Este cofre precisa ser migrado a um novo formato. Por favor assegure que a sincronização foi finalizada antes de proceder.
main.createVault.nonEmptyDir.title = Falha ao criar o cofre main.createVault.nonEmptyDir.title = Falha ao criar o cofre
main.createVault.nonEmptyDir.header = O diretório escolhido não se encontra vazio main.createVault.nonEmptyDir.header = O diretório escolhido não se encontra vazio
main.createVault.nonEmptyDir.content = O diretório selecionado contém arquivos (possivelmente ocultos). Um cofre só pode ser criado num diretório vazio. main.createVault.nonEmptyDir.content = O diretório selecionado contém arquivos (possivelmente ocultos). Um cofre só pode ser criado num diretório vazio.
unlock.label.mountPath = Local da montagem
unlock.label.mountPathButton = Aplicar
settings.webdav.port.label = WebDAV Porta settings.webdav.port.label = WebDAV Porta
settings.webdav.port.prompt = 0 \= Escolha Automática settings.webdav.port.prompt = 0 \= Escolha Automática
settings.webdav.port.apply = Aplicar settings.webdav.port.apply = Aplicar
@@ -109,6 +103,23 @@ settings.webdav.prefGvfsScheme.label = WebDAV schema
settings.volume.label = Método de Montagem settings.volume.label = Método de Montagem
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Cofre criado com sucesso
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Senha modificada com sucesso
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Crytomator atualizado com sucesso
unlock.label.useOwnMountPath = Usar Ponto de Montagem Personalizado
welcome.askForUpdateCheck.dialog.title = Verificação de atualização
welcome.askForUpdateCheck.dialog.header = Habilitar a verificação de atualização integrada?
welcome.askForUpdateCheck.dialog.content = Para verificar atualizações, Cryptomator vai buscar a versão atual dos servidores e exibirá uma dica para você se uma nova versão estiver disponível.\n\nNós recomendamos que habilite a verificação de atualização para que sempre tenha certeza de que está usando a última versão do Crytomator, com todos os pacotes de segurança instalados. Se você não habilitar a verificação de atualização, você pode verificar e baixar a versão atual em https\://cryptomator.org/downloads/.\n\nVocê pode mudar isso a qualquer momento através das configurações.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Falha no bloqueio do(s) cofre(s)
main.gracefulShutdown.dialog.header = Cofre(s) em uso
main.gracefulShutdown.dialog.content = Um ou mais cofres ainda estão em uso por outros programas. Por favor, feche-os para permitir que Cryptomator encerre corretamente, em seguida, tente novamente.\n\nSe isso não funcionar, Cryptomator pode forçar o desligamento, mas isso pode causar perda de dados e não é recomendado.
main.gracefulShutdown.button.tryAgain = Tente novamente
main.gracefulShutdown.button.forceShutdown = Forçar desligamento
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
@@ -18,7 +18,7 @@ initialize.messageLabel.initializationFailed = Cofre não inicializado. Veja os
notfound.label = Cofre não encontrado. Ele foi movido? notfound.label = Cofre não encontrado. Ele foi movido?
# upgrade.fxml # upgrade.fxml
upgrade.button = Atualizar Cofre upgrade.button = Atualizar Cofre
upgrade.version3dropBundleExtension.msg = O Cofre precisa ser migrado para o novo formato.\n%1$s" será renomeado para "%2$s".\nPor favor tenha certeza que a sincronização está finalizada antes de prosseguir. upgrade.version3dropBundleExtension.msg = O Cofre precisa ser migrado para o novo formato.\n%1$s" será renomeado para "%2$s".\nPor favor certifique que a sincronização está finalizada antes de prosseguir.
upgrade.version3dropBundleExtension.err.alreadyExists = A Migração automática falhou.\n"%s" já existe. upgrade.version3dropBundleExtension.err.alreadyExists = A Migração automática falhou.\n"%s" já existe.
# unlock.fxml # unlock.fxml
unlock.label.password = Senha unlock.label.password = Senha
@@ -32,7 +32,7 @@ unlock.button.advancedOptions.hide = Menos Opções
unlock.choicebox.winDriveLetter.auto = Atribuir automaticamente unlock.choicebox.winDriveLetter.auto = Atribuir automaticamente
unlock.errorMessage.wrongPassword = Senha errada unlock.errorMessage.wrongPassword = Senha errada
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = Cofre não suportado. Esse Cofre foi criado em uma versão antiga do Cryptomator. unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = Cofre não suportado. Esse Cofre foi criado em uma versão antiga do Cryptomator.
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = Cofre não suportado. Esse Cofre foi criado em uma versão mais nova do Cryptomator. unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = Cofre não suportado. Esse Cofre foi criado em uma versão mais recente do Cryptomator.
unlock.messageLabel.startServerFailed = A inicialização do servidor WebDAV falhou. unlock.messageLabel.startServerFailed = A inicialização do servidor WebDAV falhou.
# change_password.fxml # change_password.fxml
changePassword.label.oldPassword = Senha antiga changePassword.label.oldPassword = Senha antiga
@@ -43,9 +43,8 @@ changePassword.button.change = Alterar senha
changePassword.errorMessage.wrongPassword = Senha errada changePassword.errorMessage.wrongPassword = Senha errada
changePassword.errorMessage.decryptionFailed = Descriptografia falhou changePassword.errorMessage.decryptionFailed = Descriptografia falhou
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Travar Cofre unlocked.button.lock = Trancar Cofre
unlocked.moreOptions.reveal = Mostrar volume unlocked.moreOptions.reveal = Mostrar volume
unlocked.moreOptions.copyUrl = Copiar URL do arquivo de sistema
unlocked.label.revealFailed = Falha no comando unlocked.label.revealFailed = Falha no comando
unlocked.label.unmountFailed = A ejeção do volume falhou unlocked.label.unmountFailed = A ejeção do volume falhou
unlocked.label.statsEncrypted = criptografado unlocked.label.statsEncrypted = criptografado
@@ -66,10 +65,10 @@ initialize.messageLabel.passwordStrength.1 = Fraca
initialize.messageLabel.passwordStrength.2 = Razoável initialize.messageLabel.passwordStrength.2 = Razoável
initialize.messageLabel.passwordStrength.3 = Forte initialize.messageLabel.passwordStrength.3 = Forte
initialize.messageLabel.passwordStrength.4 = Muito forte initialize.messageLabel.passwordStrength.4 = Muito forte
initialize.label.doNotForget = IMPORTANTE\: Se você perder a sua senha, não haverá maneira alguma de recuperar seus dados. initialize.label.doNotForget = IMPORTANTE\: NÂO existe maneira alguma de recuperar seus dados se você perder a sua senha,
main.directoryList.remove.confirmation.title = Remover Cofre main.directoryList.remove.confirmation.title = Remover Cofre
main.directoryList.remove.confirmation.header = Você realmente quer remover esse Cofre? main.directoryList.remove.confirmation.header = Você realmente quer remover esse Cofre?
main.directoryList.remove.confirmation.content = O Cofre será removido somente da listagem. Para apagá-lo permanentemente, por favor apague o cofre do arquivo de sistemas. main.directoryList.remove.confirmation.content = O Cofre será removido somente da listagem. Para apagá-lo permanentemente é necessario apagá-lo de seu arquivo de sistema.
upgrade.version3to4.msg = Esse Cofre precisa ser migrado para o novo formato.\nOs nomes das pastas criptografadas serão atualizados.\nPor favor tenha certeza que a sincronização está finalizada antes de prosseguir. upgrade.version3to4.msg = Esse Cofre precisa ser migrado para o novo formato.\nOs nomes das pastas criptografadas serão atualizados.\nPor favor tenha certeza que a sincronização está finalizada antes de prosseguir.
upgrade.version3to4.err.io = A migração falhou devido a uma falha de entrada e saída. Veja o arquivo de log para mais detalhes. upgrade.version3to4.err.io = A migração falhou devido a uma falha de entrada e saída. Veja o arquivo de log para mais detalhes.
# upgrade.fxml # upgrade.fxml
@@ -79,29 +78,24 @@ unlock.errorMessage.unauthenticVersionMac = Não foi possível autenticar a vers
unlocked.label.mountFailed = Conexão do volume falhou unlocked.label.mountFailed = Conexão do volume falhou
unlock.savePassword.delete.confirmation.title = Apaga senha salva unlock.savePassword.delete.confirmation.title = Apaga senha salva
unlock.savePassword.delete.confirmation.header = Você realmente quer apagar a senha salva para esse Cofre? unlock.savePassword.delete.confirmation.header = Você realmente quer apagar a senha salva para esse Cofre?
unlock.savePassword.delete.confirmation.content = A senha salva para esse Cofre será imediatamente apagada do chaveiro do sistema. Se você quiser salvar a senha novamente, é preciso destravar o Cofre com a opção "Salvar senha" ativada. unlock.savePassword.delete.confirmation.content = A senha salva para esse Cofre será imediatamente apagada. Para salvar a senha novamente destrave o Cofre com a opção "Salvar senha" ativada.
settings.debugMode.label = Modo Debug * settings.debugMode.label = Modo Debug *
upgrade.version3dropBundleExtension.title = Atualização do Cofre v3 (Drop Bundle Extension) upgrade.version3dropBundleExtension.title = Atualização do Cofre v3 (Drop Bundle Extension)
upgrade.version3to4.title = Atualização do Cofre v3 para v4 upgrade.version3to4.title = Atualização do Cofre v3 para v4
upgrade.version4to5.title = Atualização do Cofre v4 para v5 upgrade.version4to5.title = Atualização do Cofre v4 para v5
upgrade.version4to5.msg = Este Cofre precisa ser migrado para o novo formato.\nOs arquivos criptografados serão atualizados.\nPor favor tenha certeza que a sincronização está finalizada antes de prosseguir. \n\nNota\: A data de modificação de todos os arquivos serão alteradas para a data/hora atual no processo. upgrade.version4to5.msg = Este Cofre precisa ser migrado para o novo formato.\nOs arquivos criptografados serão atualizados.\nPor favor tenha certeza que a sincronização está finalizada antes de prosseguir. \n\nNota\: A data de modificação de todos os arquivos serão alteradas para a data/hora atual no processo.
upgrade.version4to5.err.io = A migração falhou devido a uma falha de entrada e saída. Veja o arquivo de log para mais detalhes. upgrade.version4to5.err.io = A migração falhou devido a uma falha de entrada e saída. Veja o arquivo de log para mais detalhes.
unlock.label.mountAfterUnlock = Montar Volume
unlock.label.revealAfterMount = Abrir Volume unlock.label.revealAfterMount = Abrir Volume
unlocked.lock.force.confirmation.title = O Travamento para %1$s falhou unlocked.lock.force.confirmation.title = O Travamento para %1$s falhou
unlocked.lock.force.confirmation.header = Deseja forçar o travamento? unlocked.lock.force.confirmation.header = Deseja forçar o travamento?
unlocked.lock.force.confirmation.content = Isso pode está ocorrendo porque arquivos no Cofre ainda estão sendo acessados ou algum outro problema ocorreu.\n\nProgramas que ainda estão acessando os arquivos podem não funcionar corretamente e os dados não gravados podem ser perdidos. unlocked.lock.force.confirmation.content = Isso pode está ocorrendo porque arquivos no Cofre ainda estão sendo acessados ou algum outro problema ocorreu.\n\nProgramas que ainda estão acessando os arquivos podem não funcionar corretamente e os dados não gravados podem ser perdidos.
unlock.label.unlockAfterStartup = Desbloquear ao iniciar (Experimental) unlock.label.unlockAfterStartup = Desbloquear ao iniciar (Experimental)
unlock.errorMessage.unlockFailed = Desbloqueio falhou. Consulte o arquivo de log para obter mais detalhes. unlock.errorMessage.unlockFailed = Desbloqueio falhou. Consulte o arquivo de log para obter mais detalhes.
unlocked.moreOptions.mount = Montar Volume
unlocked.moreOptions.unmount = Ejetar Volume
upgrade.version5toX.title = Atualização da Versão do Cofre upgrade.version5toX.title = Atualização da Versão do Cofre
upgrade.version5toX.msg = Esse Cofre precisa ser migrado para o novo formato.\nPor favor tenha certeza que a sincronização está finalizada antes de prosseguir. upgrade.version5toX.msg = Esse Cofre precisa ser migrado para o novo formato.\nPor favor certifique que a sincronização está finalizada antes de prosseguir.
main.createVault.nonEmptyDir.title = Criação do cofre falhou main.createVault.nonEmptyDir.title = Criação do cofre falhou
main.createVault.nonEmptyDir.header = O diretório escolhido não está vazio main.createVault.nonEmptyDir.header = O diretório escolhido não está vazio
main.createVault.nonEmptyDir.content = O diretório selecionado já contém arquivos (possivelmente ocultos). Um cofre só pode ser criado em um diretório vazio. main.createVault.nonEmptyDir.content = O diretório selecionado já contém arquivos (possivelmente ocultos). Um cofre só pode ser criado em um diretório vazio.
unlock.label.mountPath = Caminho da Montagem
unlock.label.mountPathButton = Aplicar
settings.webdav.port.label = WebDAV Porta settings.webdav.port.label = WebDAV Porta
settings.webdav.port.prompt = 0 \= Escolher automaticamente settings.webdav.port.prompt = 0 \= Escolher automaticamente
settings.webdav.port.apply = Aplicar settings.webdav.port.apply = Aplicar
@@ -109,6 +103,23 @@ settings.webdav.prefGvfsScheme.label = WebDAV Esquema
settings.volume.label = Método de Montagem * settings.volume.label = Método de Montagem *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Cofre foi criado com sucesso.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Senha for trocada com sucesso.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator foi atualizado com sucesso.
unlock.label.useOwnMountPath = Usar ponto de montagem individual
welcome.askForUpdateCheck.dialog.title = Checar atualizações
welcome.askForUpdateCheck.dialog.header = Ativar a checagem por atualizações?
welcome.askForUpdateCheck.dialog.content = Para checar as atualizações, Cryptomator irá verificar a versão mais recente em nossos servidores e avisará se existe uma versão disponível.\n\nRecomendamos ativar a checagem por novas atualizações para ter certeza que se tenha a versão mais recente do Cryptomator, com todas as correções de segurança. Se não ativar as atualizações é possivel checar e baixa-las a versão mais recente em https\://cryptomator.org/downloads/.\n\nVocê pode alterar as configurações a qualquer hora.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Falha ao trancar o cofre
main.gracefulShutdown.dialog.header = Cofre(s) em uso
main.gracefulShutdown.dialog.content = Um ou mais cofres ainda estão em uso por outros programas. Por favor feche-os para permitir ao Cryptomator encerrar apropriadamente, então tente novamente.
main.gracefulShutdown.button.tryAgain = Tente novamente
main.gracefulShutdown.button.forceShutdown = Forçar término da execução
unlock.pendingMessage.unlocking = Destravando Cofre...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+30 -19
View File
@@ -11,7 +11,7 @@ welcome.checkForUpdates.label.currentlyChecking = Проверка обновл
welcome.newVersionMessage = Версия %1$s доступна для загрузки.\nТекущая версия %2$s. welcome.newVersionMessage = Версия %1$s доступна для загрузки.\nТекущая версия %2$s.
# initialize.fxml # initialize.fxml
initialize.label.password = Пароль initialize.label.password = Пароль
initialize.label.retypePassword = Повторите ввод пароля initialize.label.retypePassword = Введите пароль ещё раз
initialize.button.ok = Создать хранилище initialize.button.ok = Создать хранилище
initialize.messageLabel.alreadyInitialized = Хранилище уже инициализировано initialize.messageLabel.alreadyInitialized = Хранилище уже инициализировано
initialize.messageLabel.initializationFailed = Невозможно инициализировать хранилище. См. подробности в файле журнала. initialize.messageLabel.initializationFailed = Невозможно инициализировать хранилище. См. подробности в файле журнала.
@@ -29,8 +29,8 @@ unlock.label.downloadsPageLink = Все версии Cryptomator
# Дополнительные параметры # Дополнительные параметры
unlock.label.advancedHeading = Дополнительно unlock.label.advancedHeading = Дополнительно
unlock.button.unlock = Разблокировать хранилище unlock.button.unlock = Разблокировать хранилище
unlock.button.advancedOptions.show = Дополнительные опции unlock.button.advancedOptions.show = Больше опций
unlock.button.advancedOptions.hide = Убрать настройки unlock.button.advancedOptions.hide = Меньше опций
unlock.choicebox.winDriveLetter.auto = Автоназначение unlock.choicebox.winDriveLetter.auto = Автоназначение
unlock.errorMessage.wrongPassword = Неверный пароль unlock.errorMessage.wrongPassword = Неверный пароль
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = Неподдерживаемое хранилище. Оно было создано в более старой версии Cryptomator. unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = Неподдерживаемое хранилище. Оно было создано в более старой версии Cryptomator.
@@ -48,7 +48,6 @@ changePassword.errorMessage.decryptionFailed = Ошибка дешифрован
unlocked.button.lock = Заблокировать хранилище unlocked.button.lock = Заблокировать хранилище
# Does it mean "open" drive? # Does it mean "open" drive?
unlocked.moreOptions.reveal = Открыть диск unlocked.moreOptions.reveal = Открыть диск
unlocked.moreOptions.copyUrl = Скопировать URL-адрес WebDAV
unlocked.label.revealFailed = Не удалось выполнить команду unlocked.label.revealFailed = Не удалось выполнить команду
unlocked.label.unmountFailed = Ошибка извлечения диска unlocked.label.unmountFailed = Ошибка извлечения диска
unlocked.label.statsEncrypted = зашифровано unlocked.label.statsEncrypted = зашифровано
@@ -61,10 +60,10 @@ settings.requiresRestartLabel = * Требуется перезапуск Crypto
# tray icon # tray icon
tray.menu.open = Открыть tray.menu.open = Открыть
tray.menu.quit = Выход tray.menu.quit = Выход
tray.infoMsg.title = Все еще выполняется tray.infoMsg.title = Всё ещё выполняется
# Не нужно использовать жаргонизмы, а также прибегать к вкусовой правке. # Не нужно использовать жаргонизмы, а также прибегать к вкусовой правке.
tray.infoMsg.msg = Cryptomator еще работает. Выйдите при помощи иконки в трее. tray.infoMsg.msg = Cryptomator всё ещё работает. Выйдите c помощью значка в области уведомлений.
tray.infoMsg.msg.osx = Cryptomator еще работает. Выйдите при помощи значка в строке меню. tray.infoMsg.msg.osx = Cryptomator всё ещё работает. Выйдите с помощью значка в строке меню.
initialize.messageLabel.passwordStrength.0 = Очень слабый initialize.messageLabel.passwordStrength.0 = Очень слабый
initialize.messageLabel.passwordStrength.1 = Слабый initialize.messageLabel.passwordStrength.1 = Слабый
initialize.messageLabel.passwordStrength.2 = Приемлемый initialize.messageLabel.passwordStrength.2 = Приемлемый
@@ -82,33 +81,28 @@ unlock.label.savePassword = Сохранить пароль
unlock.errorMessage.unauthenticVersionMac = Не удалось проверить подлинность версии MAC. unlock.errorMessage.unauthenticVersionMac = Не удалось проверить подлинность версии MAC.
unlocked.label.mountFailed = Ошибка подключения к диску unlocked.label.mountFailed = Ошибка подключения к диску
# А как назвать эту правку? Пожалуйста, перестаньте портить перевод. # А как назвать эту правку? Пожалуйста, перестаньте портить перевод.
unlock.savePassword.delete.confirmation.title = Удалить сохраненный пароль unlock.savePassword.delete.confirmation.title = Удалить сохранённый пароль
unlock.savePassword.delete.confirmation.header = Вы действительно хотите удалить сохраненный пароль этого хранилища? unlock.savePassword.delete.confirmation.header = Вы действительно хотите удалить сохранённый пароль этого хранилища?
unlock.savePassword.delete.confirmation.content = Сохраненный пароль этого хранилища будет немедленно удален из вашей системной связки ключей. Если вы снова захотите сохранить пароль, вам придется разблокировать хранилище с включенным параметром "Сохранить пароль". unlock.savePassword.delete.confirmation.content = Сохранённый пароль этого хранилища будет немедленно удалён из вашей системной связки ключей. Если вы снова захотите сохранить пароль, вам придётся разблокировать хранилище с включённым параметром "Сохранить пароль".
settings.debugMode.label = Режим отладки * settings.debugMode.label = Режим отладки *
upgrade.version3dropBundleExtension.title = Обновление хранилища версии 3 (расширение пакета) upgrade.version3dropBundleExtension.title = Обновление хранилища версии 3 (расширение пакета)
upgrade.version3to4.title = Обновление хранилища с версии 3 на 4 upgrade.version3to4.title = Обновление хранилища с версии 3 на 4
upgrade.version4to5.title = Обновление хранилища с версии 4 на 5 upgrade.version4to5.title = Обновление хранилища с версии 4 на 5
upgrade.version4to5.msg = Это хранилище нужно преобразовать в более новый формат.\nЗашифрованные файлы будут обновлены.\nПрежде чем продолжить, убедитесь, что завершена синхронизация.\n\nПримечание\: дата и время изменения всех файлов будут изменены на текущие на момент обработки. upgrade.version4to5.msg = Это хранилище нужно преобразовать в более новый формат.\nЗашифрованные файлы будут обновлены.\nПрежде чем продолжить, убедитесь, что завершена синхронизация.\n\nПримечание\: дата и время изменения всех файлов будут изменены на текущие на момент обработки.
upgrade.version4to5.err.io = Преобразование не выполнено из-за ошибки ввода-вывода. См. подробности в файле журнала. upgrade.version4to5.err.io = Преобразование не выполнено из-за ошибки ввода-вывода. См. подробности в файле журнала.
unlock.label.mountAfterUnlock = Смонтировать диск
unlock.label.revealAfterMount = Открыть диск unlock.label.revealAfterMount = Открыть диск
unlocked.lock.force.confirmation.title = Ошибка блокировки %1$s unlocked.lock.force.confirmation.title = Ошибка блокировки %1$s
unlocked.lock.force.confirmation.header = Заблокировать принудительно? unlocked.lock.force.confirmation.header = Заблокировать принудительно?
unlocked.lock.force.confirmation.content = Это может быть вызвано тем, что другие программы по-прежнему обращаются к файлам в хранилище или из-за некоторых других проблем.\n\nТакие программы могут работать неправильно, а данные, которые еще не были записаны могут быть потеряны. unlocked.lock.force.confirmation.content = Возможно, к файлам в хранилище всё ещё обращаются другие программы, либо возникла иная проблема. Такие программы могут работать неправильно, а не записанные ими данные могут быть потеряны.
# Авторазблокировка при старте (экспериментально) # Авторазблокировка при старте (экспериментально)
unlock.label.unlockAfterStartup = Авторазблокировка при запуске (экспериментально) unlock.label.unlockAfterStartup = Авторазблокировка при запуске (экспериментально)
unlock.errorMessage.unlockFailed = Ошибка разблокировки. См. подробности в файле журнала. unlock.errorMessage.unlockFailed = Ошибка разблокировки. См. подробности в файле журнала.
unlocked.moreOptions.mount = Смонтировать диск
unlocked.moreOptions.unmount = Извлечь диск
upgrade.version5toX.title = Обновление версии хранилища upgrade.version5toX.title = Обновление версии хранилища
upgrade.version5toX.msg = Это хранилище нужно преобразовать в новый формат. Прежде чем продолжить, убедитесь, что завершена синхронизация. upgrade.version5toX.msg = Это хранилище нужно преобразовать в новый формат. Прежде чем продолжить, убедитесь, что завершена синхронизация.
main.createVault.nonEmptyDir.title = Ошибка создания хранилища main.createVault.nonEmptyDir.title = Ошибка создания хранилища
main.createVault.nonEmptyDir.header = Выбранная папка не пуста main.createVault.nonEmptyDir.header = Выбранная папка не пуста
# Выбранная папка уже содержит файлы (возможно скрытые). Хранилище может быть создано только в пустой папке. # Выбранная папка уже содержит файлы (возможно скрытые). Хранилище может быть создано только в пустой папке.
main.createVault.nonEmptyDir.content = В выбранной папке уже есть файлы (возможно, скрытые). Хранилище можно создавать только в пустой папке. main.createVault.nonEmptyDir.content = В выбранной папке уже есть файлы (возможно, скрытые). Хранилище можно создавать только в пустой папке.
unlock.label.mountPath = Путь монтирования
unlock.label.mountPathButton = Применить
settings.webdav.port.label = Порт WebDAV settings.webdav.port.label = Порт WebDAV
settings.webdav.port.prompt = 0 \= автовыбор settings.webdav.port.prompt = 0 \= автовыбор
settings.webdav.port.apply = Применить settings.webdav.port.apply = Применить
@@ -116,6 +110,23 @@ settings.webdav.prefGvfsScheme.label = Схема WebDAV
settings.volume.label = Метод монтирования* settings.volume.label = Метод монтирования*
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Хранилище успешно создано.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Пароль успешно изменён.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Обновление Cryptomator успешно выполнено.
unlock.label.useOwnMountPath = Своя точка монтирования
welcome.askForUpdateCheck.dialog.title = Проверка обновлений
welcome.askForUpdateCheck.dialog.header = Включить встроенную проверку обновлений?
welcome.askForUpdateCheck.dialog.content = Для проверки наличия обновлений Cryptomator будет получать номер текущей версии со своих серверов и показывать подсказку, что доступна более новая версия.\n\nРекомендуем включить проверку обновлений, чтобы быть уверенным, что у вас всегда новейшая версия программы, содержащая все патчи безопасности. Если вы не хотите включать проверку обновлений, то проверить наличие новой версии и загрузить её можно по адресу https\://cryptomator.org/downloads/\n\nЭтот параметр можно всегда изменить в настройках программы.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Ошибка блокировки хранилища
main.gracefulShutdown.dialog.header = Используемые хранилища
main.gracefulShutdown.dialog.content = Одно или несколько хранилищ всё ещё используются другими программами. Закройте их, чтобы Cryptomator мог корректно завершить работу, и повторите попытку.\n\nЕсли это не поможет, Cryptomator может завершить работу принудительно, но с риском потери данных, и потому это не рекомендуется.
main.gracefulShutdown.button.tryAgain = Попробовать снова
main.gracefulShutdown.button.forceShutdown = Принудительно завершить работу
unlock.pendingMessage.unlocking = Открываем хранилеще
unlock.failedDialog.title = Разблокировка не удалась
unlock.failedDialog.header = Разблокировка не удалась\n
unlock.failedDialog.content.mountPathNonExisting = Точка монтирования не существует
unlock.failedDialog.content.mountPathNotEmpty = Точка монтирования не пуста
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+19 -8
View File
@@ -48,7 +48,6 @@ changePassword.errorMessage.decryptionFailed = Dešifrovanie zlyhalo.
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Zamknúť trezor unlocked.button.lock = Zamknúť trezor
unlocked.moreOptions.reveal = Odhaliť jednotku unlocked.moreOptions.reveal = Odhaliť jednotku
unlocked.moreOptions.copyUrl = Kopírovať WebDAV URL
unlocked.label.revealFailed = Príkaz zlyhal unlocked.label.revealFailed = Príkaz zlyhal
unlocked.label.unmountFailed = Odpájanie jednotky zlyhalo unlocked.label.unmountFailed = Odpájanie jednotky zlyhalo
unlocked.label.statsEncrypted = zašifrované unlocked.label.statsEncrypted = zašifrované
@@ -89,29 +88,41 @@ upgrade.version3to4.title = Vault Version 3 to 4 Upgrade
upgrade.version4to5.title = Vault Version 4 to 5 Upgrade upgrade.version4to5.title = Vault Version 4 to 5 Upgrade
upgrade.version4to5.msg = This vault needs to be migrated to a newer format.\nEncrypted files will be updated.\nPlease make sure synchronization has finished before proceeding.\n\nNote\: Modification date of all files will be changed to the current date/time in the process. upgrade.version4to5.msg = This vault needs to be migrated to a newer format.\nEncrypted files will be updated.\nPlease make sure synchronization has finished before proceeding.\n\nNote\: Modification date of all files will be changed to the current date/time in the process.
upgrade.version4to5.err.io = Migration failed due to an I/O Exception. See log file for details. upgrade.version4to5.err.io = Migration failed due to an I/O Exception. See log file for details.
unlock.label.mountAfterUnlock = Mount Drive
unlock.label.revealAfterMount = Reveal Drive unlock.label.revealAfterMount = Reveal Drive
unlocked.lock.force.confirmation.title = Locking of %1$s failed unlocked.lock.force.confirmation.title = Locking of %1$s failed
unlocked.lock.force.confirmation.header = Do you want to force locking? unlocked.lock.force.confirmation.header = Do you want to force locking?
unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost. unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost.
unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental) unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental)
unlock.errorMessage.unlockFailed = Unlock failed. See log file for details. unlock.errorMessage.unlockFailed = Unlock failed. See log file for details.
unlocked.moreOptions.mount = Mount Drive
unlocked.moreOptions.unmount = Eject Drive
upgrade.version5toX.title = Vault Version Upgrade upgrade.version5toX.title = Vault Version Upgrade
upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding. upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding.
main.createVault.nonEmptyDir.title = Creating vault failed main.createVault.nonEmptyDir.title = Creating vault failed
main.createVault.nonEmptyDir.header = Chosen directory is not empty main.createVault.nonEmptyDir.header = Chosen directory is not empty
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory. main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
unlock.label.mountPath = Mount Path
unlock.label.mountPathButton = Apply
settings.webdav.port.label = WebDAV Port settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.port.prompt = 0 \= Choose automatically
settings.webdav.port.apply = Apply settings.webdav.port.apply = Apply
settings.webdav.prefGvfsScheme.label = WebDAV Scheme settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode * settings.volume.label = Preferred Volume Type
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try again
main.gracefulShutdown.button.forceShutdown = Force shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+19 -8
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = การถอดรหัสล
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = ล็อคกล่องข้อมูล unlocked.button.lock = ล็อคกล่องข้อมูล
unlocked.moreOptions.reveal = โชว์ไดรฟ์ unlocked.moreOptions.reveal = โชว์ไดรฟ์
unlocked.moreOptions.copyUrl = คัดลอก WebDEV ลิ้งค์
unlocked.label.revealFailed = คำสั่งล้มเหลว unlocked.label.revealFailed = คำสั่งล้มเหลว
unlocked.label.unmountFailed = Eject ไดรว์ล้มเหลว unlocked.label.unmountFailed = Eject ไดรว์ล้มเหลว
unlocked.label.statsEncrypted = เข้ารหัสแล้ว unlocked.label.statsEncrypted = เข้ารหัสแล้ว
@@ -86,29 +85,41 @@ upgrade.version3to4.title = อัพเกรดกล่องข้อมู
upgrade.version4to5.title = อัพเกรดกล่องข้อมูลเวอร์ชั่น 4 ไปยัง 5 upgrade.version4to5.title = อัพเกรดกล่องข้อมูลเวอร์ชั่น 4 ไปยัง 5
upgrade.version4to5.msg = กล่องข้อมูลนี้ต้องการอัพเกรดเป็นเวอร์ชั่นใหม่\nไฟล์เข้ารหัสจะได้รับการอัพเกรด\nกรุณารอการอัพเกรดให้เสร็จสิ้นก่อนเริ่มใช้งาน\n\nเพิ่มเติม\: วันที่ Modification ของไฟล์จะถูกเปลี่ยนเป็นเวลา ณ ปัจจุบัน upgrade.version4to5.msg = กล่องข้อมูลนี้ต้องการอัพเกรดเป็นเวอร์ชั่นใหม่\nไฟล์เข้ารหัสจะได้รับการอัพเกรด\nกรุณารอการอัพเกรดให้เสร็จสิ้นก่อนเริ่มใช้งาน\n\nเพิ่มเติม\: วันที่ Modification ของไฟล์จะถูกเปลี่ยนเป็นเวลา ณ ปัจจุบัน
upgrade.version4to5.err.io = อัพเกรดล้มเหลวเนื่องจากข้อยกเว้น I/O ดูรายละเอียดได้ใน Log ไฟล์ upgrade.version4to5.err.io = อัพเกรดล้มเหลวเนื่องจากข้อยกเว้น I/O ดูรายละเอียดได้ใน Log ไฟล์
unlock.label.mountAfterUnlock = เมาท์ไดรฟ์
unlock.label.revealAfterMount = ไปยังไดรฟ์ unlock.label.revealAfterMount = ไปยังไดรฟ์
unlocked.lock.force.confirmation.title = ล็อค %1$s ล้มเหลว unlocked.lock.force.confirmation.title = ล็อค %1$s ล้มเหลว
unlocked.lock.force.confirmation.header = คุณต้องการล็อคแบบ Force หรือไม่ ? unlocked.lock.force.confirmation.header = คุณต้องการล็อคแบบ Force หรือไม่ ?
unlocked.lock.force.confirmation.content = เนื่องจากบางโปรแกรมกำลังเรียกใช้ไฟล์ในกล่องข้อมูลอยู่ในขณะนี้ หรือเนื่องจากปัญหาอื่นๆ\n\nโปรแกรมที่เรียกใช้ไฟล์อาจทำงานได้ไม่สมบูรณ์ ข้อมูลอาจสูญหายได้ unlocked.lock.force.confirmation.content = เนื่องจากบางโปรแกรมกำลังเรียกใช้ไฟล์ในกล่องข้อมูลอยู่ในขณะนี้ หรือเนื่องจากปัญหาอื่นๆ\n\nโปรแกรมที่เรียกใช้ไฟล์อาจทำงานได้ไม่สมบูรณ์ ข้อมูลอาจสูญหายได้
unlock.label.unlockAfterStartup = ปลดล็อคอัตโนมัติตอนเปิดคอม (Experimental) unlock.label.unlockAfterStartup = ปลดล็อคอัตโนมัติตอนเปิดคอม (Experimental)
unlock.errorMessage.unlockFailed = ปลดล็อคล้มเหลว ดูรายละเอียดได้ใน Log ไฟล์ unlock.errorMessage.unlockFailed = ปลดล็อคล้มเหลว ดูรายละเอียดได้ใน Log ไฟล์
unlocked.moreOptions.mount = เมาท์ไดรฟ์
unlocked.moreOptions.unmount = Eject ไดรฟ์
upgrade.version5toX.title = อัพเกรดเวอร์ชั่นกล่องข้อมูล upgrade.version5toX.title = อัพเกรดเวอร์ชั่นกล่องข้อมูล
upgrade.version5toX.msg = กล่องข้อมูลต้องการอัพเกรดเป็นเวอร์ชั่นใหม่\nกรุณารอการอัพเกรดให้เสร็จสิ้นก่อนเริ่มใช้งาน upgrade.version5toX.msg = กล่องข้อมูลต้องการอัพเกรดเป็นเวอร์ชั่นใหม่\nกรุณารอการอัพเกรดให้เสร็จสิ้นก่อนเริ่มใช้งาน
main.createVault.nonEmptyDir.title = การสร้างกล่องข้อมูลล้มเหลว main.createVault.nonEmptyDir.title = การสร้างกล่องข้อมูลล้มเหลว
main.createVault.nonEmptyDir.header = โฟลเดอร์ที่เลือกมีไฟล์อยู่ main.createVault.nonEmptyDir.header = โฟลเดอร์ที่เลือกมีไฟล์อยู่
main.createVault.nonEmptyDir.content = โฟลเดอที่เลือกมีไฟล์อยู่ (อาจจะซ่อนอยู่)\nกล่องข้อมูลสามารถสร้างได้จากโฟลเดอร์เปล่าเท่านั้น main.createVault.nonEmptyDir.content = โฟลเดอที่เลือกมีไฟล์อยู่ (อาจจะซ่อนอยู่)\nกล่องข้อมูลสามารถสร้างได้จากโฟลเดอร์เปล่าเท่านั้น
unlock.label.mountPath = Mount Path
unlock.label.mountPathButton = Apply
settings.webdav.port.label = WebDAV Port settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.port.prompt = 0 \= Choose automatically
settings.webdav.port.apply = Apply settings.webdav.port.apply = Apply
settings.webdav.prefGvfsScheme.label = WebDAV Scheme settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode * settings.volume.label = Preferred Volume Type
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try again
main.gracefulShutdown.button.forceShutdown = Force shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+19 -8
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = Şifre çözme başarısız
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Kasayı kilitle unlocked.button.lock = Kasayı kilitle
unlocked.moreOptions.reveal = Sürücüyü göster unlocked.moreOptions.reveal = Sürücüyü göster
unlocked.moreOptions.copyUrl = WebDAV URl'sini kopyala
unlocked.label.revealFailed = Komut başarısız unlocked.label.revealFailed = Komut başarısız
unlocked.label.unmountFailed = Sürücü çıkarma başarısız unlocked.label.unmountFailed = Sürücü çıkarma başarısız
unlocked.label.statsEncrypted = şifrelenmiş unlocked.label.statsEncrypted = şifrelenmiş
@@ -86,29 +85,41 @@ upgrade.version3to4.title = Vault Version 3 to 4 Upgrade
upgrade.version4to5.title = Vault Version 4 to 5 Upgrade upgrade.version4to5.title = Vault Version 4 to 5 Upgrade
upgrade.version4to5.msg = This vault needs to be migrated to a newer format.\nEncrypted files will be updated.\nPlease make sure synchronization has finished before proceeding.\n\nNote\: Modification date of all files will be changed to the current date/time in the process. upgrade.version4to5.msg = This vault needs to be migrated to a newer format.\nEncrypted files will be updated.\nPlease make sure synchronization has finished before proceeding.\n\nNote\: Modification date of all files will be changed to the current date/time in the process.
upgrade.version4to5.err.io = Migration failed due to an I/O Exception. See log file for details. upgrade.version4to5.err.io = Migration failed due to an I/O Exception. See log file for details.
unlock.label.mountAfterUnlock = Mount Drive
unlock.label.revealAfterMount = Reveal Drive unlock.label.revealAfterMount = Reveal Drive
unlocked.lock.force.confirmation.title = Locking of %1$s failed unlocked.lock.force.confirmation.title = Locking of %1$s failed
unlocked.lock.force.confirmation.header = Do you want to force locking? unlocked.lock.force.confirmation.header = Do you want to force locking?
unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost. unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost.
unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental) unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental)
unlock.errorMessage.unlockFailed = Unlock failed. See log file for details. unlock.errorMessage.unlockFailed = Unlock failed. See log file for details.
unlocked.moreOptions.mount = Mount Drive
unlocked.moreOptions.unmount = Eject Drive
upgrade.version5toX.title = Vault Version Upgrade upgrade.version5toX.title = Vault Version Upgrade
upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding. upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding.
main.createVault.nonEmptyDir.title = Creating vault failed main.createVault.nonEmptyDir.title = Creating vault failed
main.createVault.nonEmptyDir.header = Chosen directory is not empty main.createVault.nonEmptyDir.header = Chosen directory is not empty
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory. main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
unlock.label.mountPath = Mount Path
unlock.label.mountPathButton = Apply
settings.webdav.port.label = WebDAV Port settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.port.prompt = 0 \= Choose automatically
settings.webdav.port.apply = Apply settings.webdav.port.apply = Apply
settings.webdav.prefGvfsScheme.label = WebDAV Scheme settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode * settings.volume.label = Preferred Volume Type
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try again
main.gracefulShutdown.button.forceShutdown = Force shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+49 -38
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = Розшифрування нев
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = Заблокувати сховище unlocked.button.lock = Заблокувати сховище
unlocked.moreOptions.reveal = Відкрити накопичувач unlocked.moreOptions.reveal = Відкрити накопичувач
unlocked.moreOptions.copyUrl = Копіювати URL-адресу WebDAV
unlocked.label.revealFailed = Команда невдала unlocked.label.revealFailed = Команда невдала
unlocked.label.unmountFailed = Вилучення диска невдале unlocked.label.unmountFailed = Вилучення диска невдале
unlocked.label.statsEncrypted = зашифровано unlocked.label.statsEncrypted = зашифровано
@@ -73,42 +72,54 @@ main.directoryList.remove.confirmation.content = Сховище буде вид
upgrade.version3to4.msg = Це сховище необхідно перетворити в новий формат. Зашифровані імена папок будуть оновлені. Перш ніж продовжити, виконайте синхронізацію. upgrade.version3to4.msg = Це сховище необхідно перетворити в новий формат. Зашифровані імена папок будуть оновлені. Перш ніж продовжити, виконайте синхронізацію.
upgrade.version3to4.err.io = Перетворення невдале через помилку введення-виведення. Дивіться деталі в файлі-звіті. upgrade.version3to4.err.io = Перетворення невдале через помилку введення-виведення. Дивіться деталі в файлі-звіті.
# upgrade.fxml # upgrade.fxml
upgrade.confirmation.label = Yes, I've made sure that synchronization has finished upgrade.confirmation.label = Так, я переконався, що синхронізація завершена
unlock.label.savePassword = Save Password unlock.label.savePassword = Зберегти пароль
unlock.errorMessage.unauthenticVersionMac = Could not authenticate version MAC. unlock.errorMessage.unauthenticVersionMac = Неможливо перевірити справжність версії MAC.
unlocked.label.mountFailed = Connecting drive failed unlocked.label.mountFailed = Не вдалося підключити диск
unlock.savePassword.delete.confirmation.title = Delete Saved Password unlock.savePassword.delete.confirmation.title = Видалити збережений пароль
unlock.savePassword.delete.confirmation.header = Do you really want to delete the saved password of this vault? unlock.savePassword.delete.confirmation.header = Ви дійсно хочете видалити збережений пароль цього сховища?
unlock.savePassword.delete.confirmation.content = The saved password of this vault will be immediately deleted from your system keychain. If you'd like to save your password again, you'd have to unlock your vault with the "Save Password" option enabled. unlock.savePassword.delete.confirmation.content = Збережений пароль цього сховища буде негайно видалено з вашого системної в'язки ключів. Якщо ви хочете знову зберегти свій пароль, вам потрібно буде розблокувати свої сховище з опцією "Зберегти пароль".
settings.debugMode.label = Debug Mode * settings.debugMode.label = Режим налагодження *
upgrade.version3dropBundleExtension.title = Vault Version 3 Upgrade (Drop Bundle Extension) upgrade.version3dropBundleExtension.title = Оновлення 3 версії сховища (Розширення пакету)
upgrade.version3to4.title = Vault Version 3 to 4 Upgrade upgrade.version3to4.title = Оновлення сховища з версії 3 на 4
upgrade.version4to5.title = Vault Version 4 to 5 Upgrade upgrade.version4to5.title = Оновлення сховища з версії 4 на 5
upgrade.version4to5.msg = This vault needs to be migrated to a newer format.\nEncrypted files will be updated.\nPlease make sure synchronization has finished before proceeding.\n\nNote\: Modification date of all files will be changed to the current date/time in the process. upgrade.version4to5.msg = Це сховище потрібно перетворити в більш новий формат. Зашифровані файли будуть оновлені. Будь ласка, переконайтеся, що синхронізація завершена, перш ніж продовжувати.\nПримітка. Дата зміни всіх файлів буде змінена на поточну дату/час в процесі перевторення.
upgrade.version4to5.err.io = Migration failed due to an I/O Exception. See log file for details. upgrade.version4to5.err.io = Перетворення не виконано із-за помилок вводу-виводу. Перегляньте деталі в файлі журналу.
unlock.label.mountAfterUnlock = Mount Drive unlock.label.revealAfterMount = Відкрити Диск
unlock.label.revealAfterMount = Reveal Drive unlocked.lock.force.confirmation.title = Заблокувати %1$s не вдалося
unlocked.lock.force.confirmation.title = Locking of %1$s failed unlocked.lock.force.confirmation.header = Ви хочете зупинити блокування?
unlocked.lock.force.confirmation.header = Do you want to force locking? unlocked.lock.force.confirmation.content = Це може бути тому, що інші програми все ще отримують доступ до файлів у сховище або через деяку іншу проблему.\nПрограми, які все ще мають доступ до файлів, можуть працювати некоректно, а дані, які ще не написані цими програмами, можуть бути втрачені.
unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost. unlock.label.unlockAfterStartup = Авто-розблокування при Запуску (експериментальна)
unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental) unlock.errorMessage.unlockFailed = Розблокувати не вдалося. Детальніше перегляньте файл журналу.
unlock.errorMessage.unlockFailed = Unlock failed. See log file for details. upgrade.version5toX.title = Оновлення версії сховища
unlocked.moreOptions.mount = Mount Drive upgrade.version5toX.msg = Це сховище потрібно перконвертувати в більш новий формат.\nБудь ласка, переконайтеся, що синхронізація завершена, перш ніж продовжувати.
unlocked.moreOptions.unmount = Eject Drive main.createVault.nonEmptyDir.title = Створення сховища не вдалося
upgrade.version5toX.title = Vault Version Upgrade main.createVault.nonEmptyDir.header = Вибраний каталог не порожній
upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding. main.createVault.nonEmptyDir.content = Вибрана директорія вже містить файли (можливо, приховані). Сховище можна створити лише у порожньому каталозі.
main.createVault.nonEmptyDir.title = Creating vault failed settings.webdav.port.label = Порт WebDAV
main.createVault.nonEmptyDir.header = Chosen directory is not empty settings.webdav.port.prompt = 0 \= автовибір
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory. settings.webdav.port.apply = Застосувати
unlock.label.mountPath = Mount Path settings.webdav.prefGvfsScheme.label = Схема WebDAV\n
unlock.label.mountPathButton = Apply settings.volume.label = Метод монтування*
settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically
settings.webdav.port.apply = Apply
settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Сховище успішно створено.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Пароль успішно змінено.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator був успішно оновлений.
unlock.label.useOwnMountPath = Використати Користувацьку Точку Монтування
welcome.askForUpdateCheck.dialog.title = Перевірити оновлення
welcome.askForUpdateCheck.dialog.header = Включити інтегровану перевірку оновлень?
welcome.askForUpdateCheck.dialog.content = Щоб перевірити наявність оновлень, Cryptomator буде завантажувати поточну версію з серверів Cryptomator і показувати підказку, якщо доступна нова версія.\nМи рекомендуємо ввімкнути перевірку оновлень, щоб завжди бути впевненим, що ви встановили найновішу версію Cryptomator з усіма оновленнями безпеки. Якщо ви не ввімкнули перевірку оновлень, ви можете перевірити та завантажити поточну версію за адресою https\://cryptomator.org/downloads/.\nВи можете будь-коли змінити це налаштування.
settings.volume.dokany = Віртуальна файлова система
main.gracefulShutdown.dialog.title = Блокування сховищ(а) не вдалося
main.gracefulShutdown.dialog.header = Сховища(е) використовуються
main.gracefulShutdown.dialog.content = Один або декілька сховищ все ще використовуються іншими програмами. Закрийте їх, щоб дозволити Cryptomator безпечно завершити роботу, а потім повторіть спробу.\nЯкщо це не спрацьовує, Cryptomator може примусово завершити роботу, але це може призвести до втрати даних, це нелогічно та не рекомендується.
main.gracefulShutdown.button.tryAgain = Спробуйте ще раз
main.gracefulShutdown.button.forceShutdown = Примусово завершити роботу
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
+28 -17
View File
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = 解密失败
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = 锁定资料库 unlocked.button.lock = 锁定资料库
unlocked.moreOptions.reveal = 打开驱动器 unlocked.moreOptions.reveal = 打开驱动器
unlocked.moreOptions.copyUrl = 复制 WebDAV 网址
unlocked.label.revealFailed = 指令无法执行 unlocked.label.revealFailed = 指令无法执行
unlocked.label.unmountFailed = 无法弹出驱动器 unlocked.label.unmountFailed = 无法弹出驱动器
unlocked.label.statsEncrypted = 已加密 unlocked.label.statsEncrypted = 已加密
@@ -87,29 +86,41 @@ upgrade.version3to4.title = 升级资料库到第四版
upgrade.version4to5.title = 升级资料库到第五版 upgrade.version4to5.title = 升级资料库到第五版
upgrade.version4to5.msg = 此资料库需要升级至最新版本,\n已加密的数据将被更新。\n请确保同步完成后再继续操作。 upgrade.version4to5.msg = 此资料库需要升级至最新版本,\n已加密的数据将被更新。\n请确保同步完成后再继续操作。
upgrade.version4to5.err.io = 升级因 I/O 错误失败。请查看日志来获得详细信息。 upgrade.version4to5.err.io = 升级因 I/O 错误失败。请查看日志来获得详细信息。
unlock.label.mountAfterUnlock = 装载驱动器
unlock.label.revealAfterMount = 显示驱动器 unlock.label.revealAfterMount = 显示驱动器
unlocked.lock.force.confirmation.title = 无法锁定 %1$s unlocked.lock.force.confirmation.title = 无法锁定 %1$s
unlocked.lock.force.confirmation.header = 要强制锁定吗? unlocked.lock.force.confirmation.header = 要强制锁定吗?
unlocked.lock.force.confirmation.content = 此错误可能是因为其他应用程序仍在使用此资料库中的文件,或遇到了其他问题。\n\n如强制锁定,正在使用文件的应用程序可能会出错并丢失部分还没有保存的资料。 unlocked.lock.force.confirmation.content = 此错误可能是因为其他应用程序仍在使用此资料库中的文件,或遇到了其他问题。\n\n如强制锁定,正在使用文件的应用程序可能会出错并丢失部分还没有保存的资料。
unlock.label.unlockAfterStartup = 启动时自动解锁(试验功能) unlock.label.unlockAfterStartup = 启动时自动解锁(试验功能)
unlock.errorMessage.unlockFailed = 无法解锁。请查看日志来获得详细信息。 unlock.errorMessage.unlockFailed = 无法解锁。请查看日志来获得详细信息。
unlocked.moreOptions.mount = 装载驱动器
unlocked.moreOptions.unmount = 弹出驱动器
upgrade.version5toX.title = 资料库版本升级 upgrade.version5toX.title = 资料库版本升级
upgrade.version5toX.msg = 此资料库需要升级至最新版本,\n请确保同步完成后再继续操作。 upgrade.version5toX.msg = 此资料库需要升级至最新版本,\n请确保同步完成后再继续操作。
main.createVault.nonEmptyDir.title = Creating vault failed main.createVault.nonEmptyDir.title = 创建资料库失败
main.createVault.nonEmptyDir.header = Chosen directory is not empty main.createVault.nonEmptyDir.header = 选择的目录不为空
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory. main.createVault.nonEmptyDir.content = 选择的目录含有文件(可能是隐藏的)。资料库只能创建在空目录
unlock.label.mountPath = Mount Path settings.webdav.port.label = webDav端口
unlock.label.mountPathButton = Apply settings.webdav.port.prompt = 0\=自动选择WebDav端口
settings.webdav.port.label = WebDAV Port settings.webdav.port.apply = 设定
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.prefGvfsScheme.label = WebDAV计划
settings.webdav.port.apply = Apply settings.volume.label = 首选卷类型
settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode *
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = 资料库成功创建
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = 密码成功更改
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator 成功升级
unlock.label.useOwnMountPath = 无效的挂载点
welcome.askForUpdateCheck.dialog.title = 检查更新
welcome.askForUpdateCheck.dialog.header = 启用更新检查?
welcome.askForUpdateCheck.dialog.content = 启用检查更新,Cryptomator将从Cryptomator服务器获取当前版本,并在有新版本时提示。\n我们建议您启用更新检查,以确保安装了最新版的Cryptomator,并安装了所有安全补丁。如果您未启用更新检查,则需要您自己到https\://cryptomator.org/downloads/ 检查并下载最新版本。\n你可以随时在设置中更改此设置。
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try again
main.gracefulShutdown.button.forceShutdown = Force shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
@@ -1,53 +1,52 @@
app.name = Cryptomator app.name = Cryptomator
# main.fxml # main.fxml
main.emptyListInstructions = 按這裡新增檔案 main.emptyListInstructions = 撳呢度新增檔案夾萬
main.directoryList.contextMenu.remove = 清單移除 main.directoryList.contextMenu.remove = 清單移除
main.directoryList.contextMenu.changePassword = 變更密碼 main.directoryList.contextMenu.changePassword = 密碼
main.addDirectory.contextMenu.new = 建立新檔案 main.addDirectory.contextMenu.new = 建立新檔案夾萬
main.addDirectory.contextMenu.open = 開現有檔案 main.addDirectory.contextMenu.open = 開現有檔案夾萬
# welcome.fxml # welcome.fxml
welcome.checkForUpdates.label.currentlyChecking = 檢查更新... welcome.checkForUpdates.label.currentlyChecking = 檢查更新...
welcome.newVersionMessage = 版本%1$s可下載。這是%2$s。 welcome.newVersionMessage = 可以下載版本%1$s。呢個係%2$s。
# initialize.fxml # initialize.fxml
initialize.label.password = 密碼 initialize.label.password = 密碼
initialize.label.retypePassword = 重新輸入密碼 initialize.label.retypePassword = 重新輸入密碼
initialize.button.ok = 建立檔案 initialize.button.ok = 建立檔案夾萬
initialize.messageLabel.alreadyInitialized = 已初始化檔案庫 initialize.messageLabel.alreadyInitialized = 檔案夾萬已初始化
initialize.messageLabel.initializationFailed = 無法初始化檔案庫。取得詳細資訊,請查看紀錄 initialize.messageLabel.initializationFailed = 初始化唔到檔案夾萬。詳細資訊請睇記錄檔
# notfound.fxml # notfound.fxml
notfound.label = 無法找到檔案庫。已經移置別的地方? notfound.label = 搵唔到檔案夾萬。係咪轉移咗去其他地方?
# upgrade.fxml # upgrade.fxml
upgrade.button = 升級檔案 upgrade.button = 升級檔案夾萬
upgrade.version3dropBundleExtension.msg = 這個檔案庫需要被轉移到新的格式。\n"%1$s"將會重新命名為"%2$s"。\n在進行之前,請確認同步已完成 upgrade.version3dropBundleExtension.msg = 這個檔案夾萬要轉換做新格式。\n"%1$s"將會名為"%2$s"。\n請確認檔案同步完再繼續
upgrade.version3dropBundleExtension.err.alreadyExists = 自動轉移失敗。\n"%s"已存在。 upgrade.version3dropBundleExtension.err.alreadyExists = 自動轉移失敗。\n"%s"已存在。
# unlock.fxml # unlock.fxml
unlock.label.password = 密碼 unlock.label.password = 密碼
unlock.label.mountName = 磁碟名 unlock.label.mountName = 磁碟名
unlock.label.winDriveLetter = 磁碟代號 unlock.label.winDriveLetter = 磁碟代號
unlock.label.downloadsPageLink = 所有Cryptomator版本 unlock.label.downloadsPageLink = 所有Cryptomator版本
unlock.label.advancedHeading = 進階選項 unlock.label.advancedHeading = 進階選項
unlock.button.unlock = 解鎖檔案 unlock.button.unlock = 解鎖檔案夾萬
unlock.button.advancedOptions.show = 更多選項 unlock.button.advancedOptions.show = 更多選項
unlock.button.advancedOptions.hide = 更少選項 unlock.button.advancedOptions.hide = 更少選項
unlock.choicebox.winDriveLetter.auto = 自動指定 unlock.choicebox.winDriveLetter.auto = 自動指定
unlock.errorMessage.wrongPassword = 錯誤的密碼 unlock.errorMessage.wrongPassword = 密碼錯誤
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = 不支援的檔案庫。這個檔案庫是由舊版本的Cryptomator所建立的 unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = 呢個檔案夾萬係由舊版Cryptomator創建嘅,並唔支援
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = 不支援的檔案庫。這個檔案庫是由新版本的Cryptomator所建立的 unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = 呢個檔案夾萬係由新版Cryptomator創建嘅,並唔支援
unlock.messageLabel.startServerFailed = 啟動WebDAV伺服器失敗 unlock.messageLabel.startServerFailed = 啓動唔到WebDAV伺服器。
# change_password.fxml # change_password.fxml
changePassword.label.oldPassword = 舊密碼 changePassword.label.oldPassword = 舊密碼
changePassword.label.newPassword = 新密碼 changePassword.label.newPassword = 新密碼
changePassword.label.retypePassword = 重新輸入密碼 changePassword.label.retypePassword = 重新輸入密碼
changePassword.label.downloadsPageLink = 所有Cryptomator版本 changePassword.label.downloadsPageLink = 所有Cryptomator版本
changePassword.button.change = 變更密碼 changePassword.button.change = 密碼
changePassword.errorMessage.wrongPassword = 錯誤的密碼 changePassword.errorMessage.wrongPassword = 密碼錯誤
changePassword.errorMessage.decryptionFailed = 解密失敗 changePassword.errorMessage.decryptionFailed = 解密失敗
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = 鎖檔案 unlocked.button.lock = 鎖檔案夾萬
unlocked.moreOptions.reveal = 打開磁碟 unlocked.moreOptions.reveal = 打開磁碟
unlocked.moreOptions.copyUrl = 複製WebDAV的網址
unlocked.label.revealFailed = 指令錯誤 unlocked.label.revealFailed = 指令錯誤
unlocked.label.unmountFailed = 插入磁碟錯誤 unlocked.label.unmountFailed = 移除磁碟錯誤
unlocked.label.statsEncrypted = 加密的 unlocked.label.statsEncrypted = 加密的
unlocked.label.statsDecrypted = 解密的 unlocked.label.statsDecrypted = 解密的
unlocked.ioGraph.yAxis.label = 傳輸量(MIB / S unlocked.ioGraph.yAxis.label = 傳輸量(MIB / S
@@ -56,9 +55,9 @@ settings.version.label = 版本%s
settings.checkForUpdates.label = 檢查更新 settings.checkForUpdates.label = 檢查更新
settings.requiresRestartLabel = * Cryptomator需要更新 settings.requiresRestartLabel = * Cryptomator需要更新
# tray icon # tray icon
tray.menu.open = tray.menu.open = 開
tray.menu.quit = 離開 tray.menu.quit = 離開
tray.infoMsg.title = 仍然在執行 tray.infoMsg.title = 仲運作緊
tray.infoMsg.msg = Cryptomator仍然在運作。從工具列的圖示點選離開。 tray.infoMsg.msg = Cryptomator仍然在運作。從工具列的圖示點選離開。
tray.infoMsg.msg.osx = Cryptomator仍然在運作。從選單列上點選離開。 tray.infoMsg.msg.osx = Cryptomator仍然在運作。從選單列上點選離開。
initialize.messageLabel.passwordStrength.0 = 非常弱的 initialize.messageLabel.passwordStrength.0 = 非常弱的
@@ -76,8 +75,8 @@ upgrade.version3to4.err.io = 由於I/O的例外,轉移失敗。取得詳細資
upgrade.confirmation.label = 是的,請確認同步已完成。 upgrade.confirmation.label = 是的,請確認同步已完成。
unlock.label.savePassword = 儲存密碼 unlock.label.savePassword = 儲存密碼
unlock.errorMessage.unauthenticVersionMac = 無法認證消息驗證碼版本。 unlock.errorMessage.unauthenticVersionMac = 無法認證消息驗證碼版本。
unlocked.label.mountFailed = Connecting drive failed unlocked.label.mountFailed = 連接唔到磁碟
unlock.savePassword.delete.confirmation.title = Delete Saved Password unlock.savePassword.delete.confirmation.title = 刪除儲存咗嘅密碼
unlock.savePassword.delete.confirmation.header = Do you really want to delete the saved password of this vault? unlock.savePassword.delete.confirmation.header = Do you really want to delete the saved password of this vault?
unlock.savePassword.delete.confirmation.content = The saved password of this vault will be immediately deleted from your system keychain. If you'd like to save your password again, you'd have to unlock your vault with the "Save Password" option enabled. unlock.savePassword.delete.confirmation.content = The saved password of this vault will be immediately deleted from your system keychain. If you'd like to save your password again, you'd have to unlock your vault with the "Save Password" option enabled.
settings.debugMode.label = Debug Mode * settings.debugMode.label = Debug Mode *
@@ -86,29 +85,41 @@ upgrade.version3to4.title = Vault Version 3 to 4 Upgrade
upgrade.version4to5.title = Vault Version 4 to 5 Upgrade upgrade.version4to5.title = Vault Version 4 to 5 Upgrade
upgrade.version4to5.msg = This vault needs to be migrated to a newer format.\nEncrypted files will be updated.\nPlease make sure synchronization has finished before proceeding.\n\nNote\: Modification date of all files will be changed to the current date/time in the process. upgrade.version4to5.msg = This vault needs to be migrated to a newer format.\nEncrypted files will be updated.\nPlease make sure synchronization has finished before proceeding.\n\nNote\: Modification date of all files will be changed to the current date/time in the process.
upgrade.version4to5.err.io = Migration failed due to an I/O Exception. See log file for details. upgrade.version4to5.err.io = Migration failed due to an I/O Exception. See log file for details.
unlock.label.mountAfterUnlock = Mount Drive
unlock.label.revealAfterMount = Reveal Drive unlock.label.revealAfterMount = Reveal Drive
unlocked.lock.force.confirmation.title = Locking of %1$s failed unlocked.lock.force.confirmation.title = Locking of %1$s failed
unlocked.lock.force.confirmation.header = Do you want to force locking? unlocked.lock.force.confirmation.header = Do you want to force locking?
unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost. unlocked.lock.force.confirmation.content = This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost.
unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental) unlock.label.unlockAfterStartup = Auto-Unlock on Start (Experimental)
unlock.errorMessage.unlockFailed = Unlock failed. See log file for details. unlock.errorMessage.unlockFailed = Unlock failed. See log file for details.
unlocked.moreOptions.mount = Mount Drive
unlocked.moreOptions.unmount = Eject Drive
upgrade.version5toX.title = Vault Version Upgrade upgrade.version5toX.title = Vault Version Upgrade
upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding. upgrade.version5toX.msg = This vault needs to be migrated to a newer format.\nPlease make sure synchronization has finished before proceeding.
main.createVault.nonEmptyDir.title = Creating vault failed main.createVault.nonEmptyDir.title = Creating vault failed
main.createVault.nonEmptyDir.header = Chosen directory is not empty main.createVault.nonEmptyDir.header = Chosen directory is not empty
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory. main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
unlock.label.mountPath = Mount Path
unlock.label.mountPathButton = Apply
settings.webdav.port.label = WebDAV Port settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.port.prompt = 0 \= Choose automatically
settings.webdav.port.apply = Apply settings.webdav.port.apply = Apply
settings.webdav.prefGvfsScheme.label = WebDAV Scheme settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode * settings.volume.label = Preferred Volume Type
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = Vault was successfully created.
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = Password was successfully changed.
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator was successfully upgraded.
unlock.label.useOwnMountPath = Use Custom Mount Point
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try again
main.gracefulShutdown.button.forceShutdown = Force shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
@@ -45,7 +45,6 @@ changePassword.errorMessage.decryptionFailed = 解密失敗
# unlocked.fxml # unlocked.fxml
unlocked.button.lock = 鎖住檔案庫 unlocked.button.lock = 鎖住檔案庫
unlocked.moreOptions.reveal = 打開磁碟 unlocked.moreOptions.reveal = 打開磁碟
unlocked.moreOptions.copyUrl = 複製 WebDAV 網址
unlocked.label.revealFailed = 指令錯誤 unlocked.label.revealFailed = 指令錯誤
unlocked.label.unmountFailed = 插入磁碟錯誤 unlocked.label.unmountFailed = 插入磁碟錯誤
unlocked.label.statsEncrypted = 加密的 unlocked.label.statsEncrypted = 加密的
@@ -86,29 +85,41 @@ upgrade.version3to4.title = 檔案庫版本 3 到 4 升級
upgrade.version4to5.title = 檔案庫版本 4 到 5 升級 upgrade.version4to5.title = 檔案庫版本 4 到 5 升級
upgrade.version4to5.msg = 這個檔案庫需要被遷移到新的格式。\n加密的檔案將會被更新。\n在處理前,請確保同步已經完成。\n\n註記:所有檔案的更改日期將會被變更為目前處理的日期/時間。 upgrade.version4to5.msg = 這個檔案庫需要被遷移到新的格式。\n加密的檔案將會被更新。\n在處理前,請確保同步已經完成。\n\n註記:所有檔案的更改日期將會被變更為目前處理的日期/時間。
upgrade.version4to5.err.io = 由於 I/O 異常導致遷移失敗。詳細請見日誌檔。 upgrade.version4to5.err.io = 由於 I/O 異常導致遷移失敗。詳細請見日誌檔。
unlock.label.mountAfterUnlock = 掛載磁碟
unlock.label.revealAfterMount = 打開磁碟 unlock.label.revealAfterMount = 打開磁碟
unlocked.lock.force.confirmation.title = %1$s 鎖定失敗 unlocked.lock.force.confirmation.title = %1$s 鎖定失敗
unlocked.lock.force.confirmation.header = 你想要強制鎖定? unlocked.lock.force.confirmation.header = 你想要強制鎖定?
unlocked.lock.force.confirmation.content = 這可能是因為其他軟體仍在存取這個檔案庫,或者發生其他問題。\n\n仍然在存取檔案的軟體可能無法正常運作,而且會造成寫入的資料遺失。 unlocked.lock.force.confirmation.content = 這可能是因為其他軟體仍在存取這個檔案庫,或者發生其他問題。\n\n仍然在存取檔案的軟體可能無法正常運作,而且會造成寫入的資料遺失。
unlock.label.unlockAfterStartup = 啟動時,自動解鎖(實驗中) unlock.label.unlockAfterStartup = 啟動時,自動解鎖(實驗中)
unlock.errorMessage.unlockFailed = 解鎖失敗。詳請查看日誌檔。 unlock.errorMessage.unlockFailed = 解鎖失敗。詳請查看日誌檔。
unlocked.moreOptions.mount = 掛載硬碟
unlocked.moreOptions.unmount = 退出硬碟
upgrade.version5toX.title = 檔案庫版本升級 upgrade.version5toX.title = 檔案庫版本升級
upgrade.version5toX.msg = 這個檔案庫需要轉移到新的格式。\n進行前,請確認已經完成所有同步。 upgrade.version5toX.msg = 這個檔案庫需要轉移到新的格式。\n進行前,請確認已經完成所有同步。
main.createVault.nonEmptyDir.title = Creating vault failed main.createVault.nonEmptyDir.title = 建立vault時發生錯誤
main.createVault.nonEmptyDir.header = Chosen directory is not empty main.createVault.nonEmptyDir.header = 選擇的資料夾並不是空的
main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory. main.createVault.nonEmptyDir.content = The selected directory already contains files (possibly hidden). A vault can only be created in an empty directory.
unlock.label.mountPath = Mount Path
unlock.label.mountPathButton = Apply
settings.webdav.port.label = WebDAV Port settings.webdav.port.label = WebDAV Port
settings.webdav.port.prompt = 0 \= Choose automatically settings.webdav.port.prompt = 0 \= 自動選擇
settings.webdav.port.apply = Apply settings.webdav.port.apply = 套用
settings.webdav.prefGvfsScheme.label = WebDAV Scheme settings.webdav.prefGvfsScheme.label = WebDAV Scheme
settings.volume.label = Mount-Methode * settings.volume.label = Preferred Volume Type
settings.volume.webdav = WebDAV settings.volume.webdav = WebDAV
settings.volume.fuse = FUSE settings.volume.fuse = FUSE
unlock.successLabel.vaultCreated = Vault was successfully created. unlock.successLabel.vaultCreated = 成功建立vault
unlock.successLabel.passwordChanged = Password was successfully changed. unlock.successLabel.passwordChanged = 密碼變更成功
unlock.successLabel.upgraded = Cryptomator was successfully upgraded. unlock.successLabel.upgraded = Cryptomator成功的更新了
unlock.label.useOwnMountPath = 自訂掛載點
welcome.askForUpdateCheck.dialog.title = Update check
welcome.askForUpdateCheck.dialog.header = Enable the integrated update check?
welcome.askForUpdateCheck.dialog.content = Recommended\: Enable the update check to always be sure you have the newest version of Cryptomator, with all security patches, installed.\n\nYou can change this from within the settings at any time.
settings.volume.dokany = Dokany
main.gracefulShutdown.dialog.title = Locking vault(s) failed
main.gracefulShutdown.dialog.header = Vault(s) in use
main.gracefulShutdown.dialog.content = One or more vaults are still in use by other programs. Please close them to allow Cryptomator to shut down properly, then try again.\n\nIf this doesn't work, Cryptomator can shut down forcefully, but this can incur data loss and is not recommended.
main.gracefulShutdown.button.tryAgain = Try again
main.gracefulShutdown.button.forceShutdown = Force shutdown
unlock.pendingMessage.unlocking = Unlocking vault...
unlock.failedDialog.title = Unlock failed
unlock.failedDialog.header = Unlock failed
unlock.failedDialog.content.mountPathNonExisting = Mount point does not exist.
unlock.failedDialog.content.mountPathNotEmpty = Mount point is not empty.
unlock.label.useReadOnlyMode = Read-Only
unlock.label.chooseMountPath = Choose empty directory…
@@ -31,7 +31,7 @@ public class LocalizationTest {
private static final Logger LOG = LoggerFactory.getLogger(LocalizationTest.class); private static final Logger LOG = LoggerFactory.getLogger(LocalizationTest.class);
private static final String RESOURCE_FOLDER_PATH = "/localization/"; private static final String RESOURCE_FOLDER_PATH = "/localization/";
private static final String REF_FILE_NAME = "en.txt"; private static final String REF_FILE_NAME = "en.txt";
private static final String[] LANG_FILE_NAMES = {"ar.txt", "bg.txt", "cs.txt", "da.txt", "de.txt", "es.txt", "fr.txt", "hu.txt", "it.txt", "ja.txt", // private static final String[] LANG_FILE_NAMES = {"ar.txt", "bg.txt", "ca.txt", "cs.txt", "da.txt", "de.txt", "es.txt", "fr.txt", "hu.txt", "it.txt", "ja.txt", //
"ko.txt", "lv.txt", "nl.txt", "pl.txt", "pt.txt", "pt_BR.txt", "ru.txt", "sk.txt", "th.txt", "tr.txt", "uk.txt", "zh_HK.txt", "zh_TW.txt", "zh.txt"}; "ko.txt", "lv.txt", "nl.txt", "pl.txt", "pt.txt", "pt_BR.txt", "ru.txt", "sk.txt", "th.txt", "tr.txt", "uk.txt", "zh_HK.txt", "zh_TW.txt", "zh.txt"};
/* /*