Compare commits

...

67 Commits

Author SHA1 Message Date
Armin Schrenk
36da26c6b9 Merge branch 'release/1.7.1' 2023-03-03 16:19:49 +01:00
Armin Schrenk
33e1cb3131 finalize release 2023-03-03 16:19:37 +01:00
Armin Schrenk
ed4b433df0 prepare 1.7.1 2023-03-03 16:14:01 +01:00
Armin Schrenk
d2ece543c8 suppress false positive 2023-03-03 16:04:34 +01:00
Armin Schrenk
4bb2df7d8f Fixes #2730 2023-03-03 16:03:36 +01:00
Cryptobot
4d5c6ca29a New Crowdin updates (#2712)
New translations strings.properties

Danish; German; Hebrew; 

[ci skip]

Closes #2724
2023-03-03 16:02:09 +01:00
Armin Schrenk
f0d597ba73 require fuse3 packge for deb to have fusermount3 2023-03-01 19:28:40 +01:00
Armin Schrenk
310329d0b5 use correct javafx patch version for debia build 2023-03-01 15:51:42 +01:00
Julian Raufelder
30f86a7f2a Fix issue template 2023-03-01 15:23:30 +01:00
Armin Schrenk
5237dc8cae Merge branch 'main' into develop 2023-03-01 12:07:46 +01:00
Armin Schrenk
67ff4da05b Merge branch 'release/1.7.0' 2023-03-01 12:06:40 +01:00
Armin Schrenk
947eb11198 set correct version in pom 2023-03-01 12:06:25 +01:00
Armin Schrenk
c6a9af1a04 update metainfo.xml 2023-03-01 12:03:03 +01:00
Armin Schrenk
0ddf221e26 Merge branch 'develop' into release/1.7.0 2023-03-01 11:43:49 +01:00
Cryptobot
3f2b5ccde9 New Crowdin updates (#2698)
New translations strings.properties

Chinese Simplified; Chinese Traditional; Chinese Traditional, Hong Kong; French; Japanese; 

[ci skip]
2023-03-01 11:42:57 +01:00
Armin Schrenk
3d0b6dde28 Update README.md 2023-02-27 13:09:56 +01:00
Armin Schrenk
45534b0a2b suppress false positive 2023-02-27 12:19:13 +01:00
Armin Schrenk
6d906beeb8 bump dependency-check 2023-02-27 12:17:47 +01:00
Tobias Hagemann
e577c64c35 arm64 dmg installer (link + bg) for fuse-t 2023-02-27 11:06:19 +01:00
Armin Schrenk
b848e78372 Merge branch 'develop' into release/1.7.0 2023-02-24 14:16:38 +01:00
Armin Schrenk
39e9395b4b bump fuse-nio-adapter 2023-02-24 14:16:20 +01:00
Cryptobot
ca3157cc70 New Crowdin updates (#2695)
New translations strings.properties

Arabic; Belarusian; Bengali; Bosnian; Catalan; Chinese Simplified; Chinese Traditional; Chinese Traditional, Hong Kong; Croatian; Czech; Danish; Dutch; Filipino; French; Galician; German; Greek; Hebrew; Hindi; Hungarian; Indonesian; Italian; Japanese; Korean; Latvian; Macedonian; Norwegian Bokmal; Norwegian Nynorsk; Persian; Polish; Portuguese; Portuguese, Brazilian; Punjabi; Romanian; Russian; Serbian (Cyrillic); Serbian (Latin); Sinhala; Slovak; Slovenian; Spanish; Swahili, Tanzania; Swedish; Tamil; Telugu; Thai; Turkish; Ukrainian; Vietnamese; 

[ci skip]
2023-02-24 14:15:50 +01:00
Armin Schrenk
f94c1f07d6 add new wix extension to ci build 2023-02-24 13:23:10 +01:00
Armin Schrenk
d43f197c11 fix 67e566832c 2023-02-24 13:14:14 +01:00
Armin Schrenk
67e566832c use correct path to get winfsp download url 2023-02-24 13:13:07 +01:00
Armin Schrenk
6f5a88af1d extend winfsp uninstall instruction by reboot step 2023-02-24 13:10:15 +01:00
Armin Schrenk
210b891616 block exe installation if winFsp is outdated 2023-02-24 12:50:20 +01:00
Armin Schrenk
20e820c903 update IDE specific files 2023-02-24 12:48:41 +01:00
Armin Schrenk
5307e93c1b bump fuse-nio-adapter
fix illegalArgumentException when setting loopbackHostName
2023-02-24 12:48:29 +01:00
Armin Schrenk
e221019b57 Merge branch 'develop' into release/1.7.0 2023-02-23 12:09:03 +01:00
Armin Schrenk
eeaaced976 reorder settingsJsonAdapter switch statements 2023-02-23 12:08:48 +01:00
Armin Schrenk
d246b54268 ignore lastWrittenByVersion when reading settings 2023-02-23 12:00:14 +01:00
Armin Schrenk
e94572960e enable drag and drop for linux aswell 2023-02-23 11:16:48 +01:00
Armin Schrenk
2d1c59bea9 Renamed objects related to license exceeded user flow 2023-02-23 10:45:55 +01:00
Armin Schrenk
921cbd6439 Merge branch 'develop' into release/1.7.0 2023-02-22 17:47:14 +01:00
Armin Schrenk
f811144ffa pom cleanup [ci skip] 2023-02-22 17:46:56 +01:00
Armin Schrenk
2ecc711f50 bump dependencies 2023-02-22 17:28:34 +01:00
Armin Schrenk
cfcc8782ef bump cryptomator dependencies to stable versions 2023-02-22 17:19:40 +01:00
Armin Schrenk
a1379bac40 For Windows try to migrate all user settings, not only the ones of local users 2023-02-22 15:33:37 +01:00
Armin Schrenk
fe3f2b5bd3 Merge branch 'develop' into release/1.7.0 2023-02-22 15:14:43 +01:00
Cryptobot
7fc07ae02c New Crowdin updates (#2689)
New translations strings.properties

Arabic; Belarusian; Bosnian; Catalan; Chinese Simplified; Chinese Traditional; Chinese Traditional, Hong Kong; Croatian; Czech; Danish; Dutch; French; German; Greek; Hebrew; Hungarian; Indonesian; Italian; Japanese; Korean; Latvian; Norwegian Bokmal; Norwegian Nynorsk; Polish; Portuguese, Brazilian; Punjabi; Romanian; Russian; Serbian (Cyrillic); Slovak; Slovenian; Spanish; Swahili, Tanzania; Swedish; Turkish; Vietnamese; 

[ci skip]
2023-02-22 15:12:58 +01:00
Armin Schrenk
2a70e2f0f4 Merge pull request #2686 from cryptomator/feature/recovery-key-wrong-key
Display message if recovery key is not valid
2023-02-17 15:41:39 +01:00
Tobias Hagemann
ffe0302fba updated access modifier 2023-02-17 15:33:00 +01:00
Armin Schrenk
c5b86bc355 Closes #2648 2023-02-17 14:46:45 +01:00
Armin Schrenk
5f86473e3e fix recovery key state logic 2023-02-17 12:49:38 +01:00
Armin Schrenk
a91c74b6eb Revert "Update translation key"
This reverts commit 71a09eae67.
2023-02-17 11:19:21 +01:00
Armin Schrenk
76949d6ccb Update src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyRecoverController.java
Co-authored-by: Tobias Hagemann <tobias.hagemann@skymatic.de>
2023-02-17 11:18:55 +01:00
Armin Schrenk
71a09eae67 Update translation key 2023-02-17 10:59:04 +01:00
Armin Schrenk
8087fcecfb Apply suggestions from code review
Co-authored-by: Tobias Hagemann <tobias.hagemann@skymatic.de>
2023-02-17 10:56:18 +01:00
Armin Schrenk
29c73e1bc8 display different messages if recovery key is either not valid or does not belong to the vault 2023-02-16 11:51:03 +01:00
Armin Schrenk
8bbdb69cda Update doc links to 1.7 2023-02-16 09:55:42 +01:00
Armin Schrenk
e9ee15dcd5 add info about html comments to error form 2023-02-16 09:42:28 +01:00
Armin Schrenk
03f6e0a33c Use Label instead of Text 2023-02-15 23:44:51 +01:00
Armin Schrenk
c5b21b0d8c Add warning about error report deletion to the error controller 2023-02-15 11:44:37 +01:00
Armin Schrenk
c5c5e297b7 Fix getCiphertextPath for Windows again. 2023-02-14 17:39:34 +01:00
Armin Schrenk
24839985e9 Merge branch 'develop' into release/1.7.0 2023-02-14 11:40:10 +01:00
Armin Schrenk
a7b2802f34 show correct error message when using custom mountpoint with webdav (Http address) 2023-02-14 11:39:16 +01:00
Armin Schrenk
c85d0b4beb bump webdav-nio-adapter 2023-02-14 11:22:11 +01:00
Armin Schrenk
3dff3a8664 Fixes #2682
* allow windows installer to remove same version
* add revisionNumber to installer version
2023-02-14 11:20:22 +01:00
Armin Schrenk
5b0bbf539b improve FailOnRunningApp action 2023-02-13 23:34:43 +01:00
Armin Schrenk
1ff7c40fd9 Fixes #2672 and fixes #2668 2023-02-13 10:42:17 +01:00
Armin Schrenk
d0875ef49e Merge pull request #2669 from cryptomator/feature/virtual-volume-doc-link
Add link to volume type documentation
2023-02-09 13:06:03 +01:00
Armin Schrenk
e35ed9af72 enable localization of tooltip 2023-02-08 20:11:34 +01:00
Armin Schrenk
ac43efe149 change UI to be not so clunky:
* only use question mark icon
* use tooltip at icon instead of explicit label
* icon is the hyperlink
2023-02-08 11:33:41 +01:00
Armin Schrenk
202a2ea79f Load revealPathServiceProvider at app startup 2023-02-08 11:14:54 +01:00
Armin Schrenk
c19a86a348 add link to mounting documentation 2023-02-07 15:23:04 +01:00
Armin Schrenk
539dcaa85a Update issue template 2023-02-07 12:23:25 +01:00
91 changed files with 806 additions and 400 deletions

View File

@@ -37,12 +37,17 @@ body:
id: volume-type
attributes:
label: Volume Type
description: What is selected under Settings → Virtual Drive?
multiple: true
description: What volume type is selected under Settings → Virtual Drive?
options:
- FUSE
- Dokany
- WebDAV
- WinFsp
- WinFsp (Local Drive)
- FUSE-T
- macFUSE
- WebDAV (Windows Explorer)
- WebDAV (AppleScript)
- WebDAV (gio)
- WebDAV (HTTP Address)
- Dokany (1.5)
validations:
required: false
- type: textarea

View File

@@ -20,8 +20,8 @@ on:
env:
JAVA_VERSION: 19
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/19/openjfx-19_linux-x64_bin-jmods.zip'
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/19/openjfx-19_linux-aarch64_bin-jmods.zip'
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/19.0.2.1/openjfx-19.0.2.1_linux-x64_bin-jmods.zip'
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/19.0.2.1/openjfx-19.0.2.1_linux-aarch64_bin-jmods.zip'
jobs:
build:

View File

@@ -30,10 +30,12 @@ jobs:
architecture: x64
output-suffix: x64
xcode-path: '/Applications/Xcode_13.2.1.app'
fuse-lib: macFUSE
- os: [self-hosted, macOS, ARM64]
architecture: aarch64
output-suffix: arm64
xcode-path: '/Applications/Xcode_13.2.1.app'
fuse-lib: FUSE-T
steps:
- uses: actions/checkout@v3
- name: Setup Java
@@ -177,7 +179,7 @@ jobs:
run: |
mkdir dmg
mv Cryptomator.app dmg
cp dist/mac/dmg/resources/macFUSE.webloc dmg
cp dist/mac/dmg/resources/${{ matrix.fuse-lib }}.webloc dmg
ls -l dmg
- name: Install create-dmg
run: |
@@ -188,14 +190,14 @@ jobs:
create-dmg
--volname Cryptomator
--volicon "dist/mac/dmg/resources/Cryptomator-Volume.icns"
--background "dist/mac/dmg/resources/Cryptomator-background.tiff"
--background "dist/mac/dmg/resources/Cryptomator-${{ matrix.fuse-lib }}-background.tiff"
--window-pos 400 100
--window-size 640 694
--icon-size 128
--icon "Cryptomator.app" 128 245
--hide-extension "Cryptomator.app"
--icon "macFUSE.webloc" 320 501
--hide-extension "macFUSE.webloc"
--icon "${{ matrix.fuse-lib }}.webloc" 320 501
--hide-extension "${{ matrix.fuse-lib }}.webloc"
--app-drop-link 512 245
--eula "dist/mac/dmg/resources/license.rtf"
--icon ".background" 128 758

View File

@@ -156,7 +156,7 @@ jobs:
--name Cryptomator
--vendor "Skymatic GmbH"
--copyright "(C) 2016 - 2023 Skymatic GmbH"
--app-version "${{ needs.get-version.outputs.semVerNum }}"
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum}}"
--win-menu
--win-dir-chooser
--win-shortcut-prompt
@@ -243,13 +243,14 @@ jobs:
shell: pwsh
- name: Download WinFsp
run: |
$winfspUrl= (Select-String -Path ".\dist\win\bundle\resources\winfsp-download.url" -Pattern 'https:.*').Matches.Value
$winfspUrl = (Select-String -Path ".\dist\win\bundle\resources\winFspMetaData.wxi" -Pattern '<\?define BundledWinFspDownloadLink="(.+)".*?>').Matches.Groups[1].Value
curl --output dist/win/bundle/resources/winfsp.msi -L $winfspUrl
shell: pwsh
- name: Compile to wixObj file
run: >
"${WIX}/bin/candle.exe" dist/win/bundle/bundleWithWinfsp.wxs
-ext WixBalExtension
-ext WixUtilExtension
-out dist/win/bundle/
-dBundleVersion="${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
-dBundleVendor="Skymatic GmbH"
@@ -261,6 +262,7 @@ jobs:
run: >
"${WIX}/bin/light.exe" -b dist/win/ dist/win/bundle/bundleWithWinfsp.wixobj
-ext WixBalExtension
-ext WixUtilExtension
-out installer/unsigned/Cryptomator-Installer.exe
- name: Detach burn engine in preparation to sign
run: >

10
.idea/compiler.xml generated
View File

@@ -14,10 +14,10 @@
<option name="dagger.fastInit" value="enabled" />
<option name="dagger.formatGeneratedSource" value="enabled" />
<processorPath useClasspath="false">
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-compiler/2.44/dagger-compiler-2.44.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger/2.44/dagger-2.44.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-compiler/2.45/dagger-compiler-2.45.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger/2.45/dagger-2.45.jar" />
<entry name="$MAVEN_REPOSITORY$/javax/inject/javax.inject/1/javax.inject-1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-producers/2.44/dagger-producers-2.44.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-producers/2.45/dagger-producers-2.45.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/guava/guava/31.0.1-jre/guava-31.0.1-jre.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" />
@@ -26,14 +26,16 @@
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" />
<entry name="$MAVEN_REPOSITORY$/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-spi/2.44/dagger-spi-2.44.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-spi/2.45/dagger-spi-2.45.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/devtools/ksp/symbol-processing-api/1.7.0-1.0.6/symbol-processing-api-1.7.0-1.0.6.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.7.0/kotlin-stdlib-1.7.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.7.0/kotlin-stdlib-common-1.7.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/squareup/javapoet/1.13.0/javapoet-1.13.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/squareup/kotlinpoet/1.11.0/kotlinpoet-1.11.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.7.0/kotlin-stdlib-jdk8-1.7.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.7.0/kotlin-stdlib-jdk7-1.7.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-reflect/1.6.10/kotlin-reflect-1.6.10.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$/net/ltgt/gradle/incap/incap/0.2/incap-0.2.jar" />

View File

@@ -74,7 +74,7 @@ Download native binaries of Cryptomator on [cryptomator.org](https://cryptomator
### Consistency
- HMAC over file contents to recognize changed ciphertext before decryption
- Authenticated encryption is used for file content to recognize changed ciphertext before decryption
- I/O operations are transactional and atomic, if the filesystems support it
- Each file contains all information needed for decryption (except for the key of course), no common metadata means no [SPOF](http://en.wikipedia.org/wiki/Single_point_of_failure)

View File

@@ -66,6 +66,8 @@
</content_rating>
<releases>
<release date="2023-03-03" version="1.7.1"/>
<release date="2023-03-01" version="1.7.0"/>
<release date="2022-12-14" version="1.6.17"/>
<release date="2022-12-06" version="1.6.16"/>
<release date="2022-10-06" version="1.6.15"/>

View File

@@ -12,7 +12,7 @@ Package: cryptomator
Architecture: any
Section: utils
Priority: optional
Depends: ${shlibs:Depends}, ${misc:Depends}, libfuse3-3
Depends: ${shlibs:Depends}, ${misc:Depends}, fuse3
Recommends: gvfs-backends, gvfs-fuse, gnome-keyring
XB-AppName: Cryptomator
XB-Category: Utility;Security;FileTools;

View File

@@ -27,6 +27,7 @@ MAIN_JAR_GLOB="cryptomator-*.jar"
MODULE_AND_MAIN_CLASS="org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator"
REVISION_NO=`git rev-list --count HEAD`
VERSION_NO=`mvn -f../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout | sed -rn 's/.*([0-9]+\.[0-9]+\.[0-9]+).*/\1/p'`
FUSE_LIB="FUSE-T"
# check preconditions
if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi
@@ -125,20 +126,20 @@ fi
# prepare dmg contents
mkdir dmg
mv ${APP_NAME}.app dmg
cp resources/macFUSE.webloc dmg
cp resources/${FUSE_LIB}.webloc dmg
# create dmg
create-dmg \
--volname ${APP_NAME} \
--volicon "resources/${APP_NAME}-Volume.icns" \
--background "resources/${APP_NAME}-background.tiff" \
--background "resources/${APP_NAME}-${FUSE_LIB}-background.tiff" \
--window-pos 400 100 \
--window-size 640 694 \
--icon-size 128 \
--icon "${APP_NAME}.app" 128 245 \
--hide-extension "${APP_NAME}.app" \
--icon "macFUSE.webloc" 320 501 \
--hide-extension "macFUSE.webloc" \
--icon "${FUSE_LIB}.webloc" 320 501 \
--hide-extension "${FUSE_LIB}.webloc" \
--app-drop-link 512 245 \
--eula "resources/license.rtf" \
--icon ".background" 128 758 \

Binary file not shown.

8
dist/mac/dmg/resources/FUSE-T.webloc vendored Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>URL</key>
<string>https://www.fuse-t.org/</string>
</dict>
</plist>

8
dist/win/build.ps1 vendored
View File

@@ -129,7 +129,7 @@ $Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources"
--name $AppName `
--vendor $Vendor `
--copyright $copyright `
--app-version "$semVerNo" `
--app-version "$semVerNo.$revisionNo" `
--win-menu `
--win-dir-chooser `
--win-shortcut-prompt `
@@ -153,7 +153,7 @@ $Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources"
# download Winfsp
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$ProgressPreference = 'SilentlyContinue' # disables Invoke-WebRequest's progress bar, which slows down downloads to a few bytes/s
$winfspMsiUrl= (Select-String -Path ".\bundle\resources\winfsp-download.url" -Pattern 'https:.*').Matches.Value
$winfspMsiUrl= (Select-String -Path ".\bundle\resources\winFspMetaData.wxi" -Pattern '<\?define BundledWinFspDownloadLink="(.+)".*?>').Matches.Groups[1].Value
Write-Output "Downloading ${winfspMsiUrl}..."
Invoke-WebRequest $winfspMsiUrl -OutFile ".\bundle\resources\winfsp.msi" # redirects are followed by default
@@ -161,11 +161,11 @@ Invoke-WebRequest $winfspMsiUrl -OutFile ".\bundle\resources\winfsp.msi" # redir
Copy-Item ".\installer\$AppName-*.msi" -Destination ".\bundle\resources\$AppName.msi"
# create bundle including winfsp
& "$env:WIX\bin\candle.exe" .\bundle\bundleWithWinfsp.wxs -ext WixBalExtension -out bundle\ `
& "$env:WIX\bin\candle.exe" .\bundle\bundleWithWinfsp.wxs -ext WixBalExtension -ext WixUtilextension -out bundle\ `
-dBundleVersion="$semVerNo.$revisionNo" `
-dBundleVendor="$Vendor" `
-dBundleCopyright="$copyright" `
-dAboutUrl="$AboutUrl" `
-dHelpUrl="$HelpUrl" `
-dUpdateUrl="$UpdateUrl"
& "$env:WIX\bin\light.exe" -b . .\bundle\BundlewithWinfsp.wixobj -ext WixBalExtension -out installer\$AppName-Installer.exe
& "$env:WIX\bin\light.exe" -b . .\bundle\BundlewithWinfsp.wixobj -ext WixBalExtension -ext WixUtilextension -out installer\$AppName-Installer.exe

View File

@@ -1,13 +1,31 @@
<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<!-- see https://wixtoolset.org/documentation/manual/v3/xsd/wix/bundle.html-->
<!-- Attributes explicitly not used:
Condition - the single msi files have their own install conditions, no need to copy them here
-->
<Bundle Name="Cryptomator" UpgradeCode="29eea626-2e5b-4449-b5f8-4602925ddf7b" Version="$(var.BundleVersion)" Manufacturer="$(var.BundleVendor)"
AboutUrl="$(var.AboutUrl)" HelpUrl="$(var.HelpUrl)" UpdateUrl="$(var.UpdateUrl)" Copyright="$(var.BundleCopyright)" IconSourceFile="bundle\resources\Cryptomator.ico">
<!-- detect outdated WinFsp installations -->
<?include "resources\winFspMetaData.wxi" ?>
<util:ProductSearch
Variable="InstalledWinFspVersion"
Result="version"
UpgradeCode="82F812D9-4083-4EF1-8BC8-0F1EDA05B46B"
/>
<!-- Note: The bundle engine takes the Message format literaly -->
<bal:Condition Message=
"The WinFsp driver used by Cryptomator is outdated and must be removed before the installation.
1. Open the view of installed apps
2. Search for &quot;WinFsp&quot;
3. Uninstall the listed application
4. Reboot your device
5. Restart this installer">(InstalledWinFspVersion = v0.0.0.0) OR ($(var.BundledWinFspVersion) &lt;= InstalledWinFspVersion)</bal:Condition>
<!-- for definition of the standard themes, see https://github.com/wixtoolset/wix3/blob/master/src/ext/BalExtension/wixstdba/Resources/-->
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLargeLicense">
<!-- see https://wixtoolset.org/documentation/manual/v3/xsd/bal/wixstandardbootstrapperapplication.html -->

View File

@@ -10,6 +10,7 @@
<Font Id="2" Height="-22" Weight="500" Foreground="666666">Segoe UI</Font>
<Font Id="3" Height="-12" Weight="500" Foreground="000000" Background="FFFFFF">Segoe UI</Font>
<Font Id="4" Height="-12" Weight="500" Foreground="ff0000" Background="FFFFFF" Underline="yes">Segoe UI</Font>
<Font Id="5" Height="-12" Weight="700" Foreground="000000" Background="FFFFFF">Segoe UI</Font>
<Image X="11" Y="11" Width="64" Height="64" ImageFile="logo.png" />
<Text X="80" Y="11" Width="-11" Height="64" FontId="1" DisablePrefix="yes">#(loc.Title)</Text>
@@ -82,7 +83,7 @@
<Text Name="FailureUninstallHeader" X="185" Y="50" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureUninstallHeader)</Text>
<Text Name="FailureRepairHeader" X="185" Y="50" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureRepairHeader)</Text>
<Hypertext Name="FailureLogFileLink" X="185" Y="121" Width="-11" Height="68" FontId="3" TabStop="yes" HideWhenDisabled="yes">#(loc.FailureHyperlinkLogText)</Hypertext>
<Hypertext Name="FailureMessageText" X="185" Y="-115" Width="-11" Height="80" FontId="3" TabStop="yes" HideWhenDisabled="yes" />
<Hypertext Name="FailureMessageText" X="185" Y="-80" Width="-11" Height="140" FontId="5" TabStop="yes" HideWhenDisabled="yes" />
<Text Name="FailureRestartText" X="185" Y="-57" Width="-11" Height="80" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureRestartText)</Text>
<Button Name="FailureRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FailureRestartButton)</Button>
<Button Name="FailureCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.FailureCloseButton)</Button>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">
<!-- A version number MUST be prefixed with letter "v", otherwise it is considered a normal string -->
<?define BundledWinFspVersion="v1.12.22309" ?>
<?define BundledWinFspDownloadLink="https://github.com/winfsp/winfsp/releases/download/v1.12.22339/winfsp-1.12.22339.msi" ?> <!-- Only used by external build scripts -->
</Include>

View File

@@ -1,2 +0,0 @@
[InternetShortcut]
URL=https://github.com/winfsp/winfsp/releases/download/v1.12/winfsp-1.12.22301.msi

View File

@@ -7,19 +7,9 @@
#Get all active, local user profiles
$profileList = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
$localUsers = Get-LocalUser | Where-Object {$_.Enabled} | ForEach-Object { $_.Name}
Get-ChildItem $profileList | ForEach-Object { $_.GetValue("ProfileImagePath") } | Where-Object {
$profileNameMatches = ($_ | Select-String -Pattern "\\([^\\]+)$").Matches
if($profileNameMatches.Count -eq 1) {
#check if the last path part is contained in the local user name list
#otherwise do not touch it
return $localUsers.Contains($profileNameMatches[0].Groups[1].Value)
} else {
return $false;
}
} | ForEach-Object {
$settingsPath = "$_\AppData\Roaming\Cryptomator\settings.json"
Get-ChildItem $profileList | ForEach-Object {
$profilePath = $_.GetValue("ProfileImagePath")
$settingsPath = "$profilePath\AppData\Roaming\Cryptomator\settings.json"
if(!(Test-Path -Path $settingsPath -PathType Leaf)) {
#No settings file, nothing to do.
return;

View File

@@ -54,7 +54,7 @@
Property="JP_UPGRADABLE_FOUND"
Maximum="$(var.JpAppVersion)"
MigrateFeatures="yes"
IncludeMaximum="$(var.JpUpgradeVersionOnlyDetectUpgrade)" />
IncludeMaximum="yes" /> <!-- TODO: check if this needs to be set to yes-->
<UpgradeVersion
OnlyDetect="$(var.JpUpgradeVersionOnlyDetectDowngrade)"
Property="JP_DOWNGRADABLE_FOUND"
@@ -143,11 +143,11 @@
CloseMessage="no"
RebootPrompt="no"
PromptToContinue="yes"
Description="A running instance of $(var.JpAppName) is found. Please close it to continue."
Description="A running instance of $(var.JpAppName) is found, using files marked for update. Please close it to continue."
Property="FOUNDRUNNINGAPP"
>
</util:CloseApplication>
<CustomAction Id="FailOnRunningApp" Impersonate="no" ExeCommand="[SystemFolder]\cmd.exe /c &quot;exit 1&quot;" Directory="INSTALLDIR" Execute="immediate" Return="check" />
<CustomAction Id="FailOnRunningApp" Error="Installation aborted, because files marked for update are used by a running instance of $(var.JpAppName)."/>
<?ifdef JpIcon ?>
<Property Id="ARPPRODUCTICON" Value="JpARPPRODUCTICON"/>
@@ -182,7 +182,7 @@
<Custom Action="WixCloseApplications" Before="InstallValidate"></Custom>
<Custom Action="FailOnRunningApp" After="WixCloseApplications" >FOUNDRUNNINGAPP</Custom>
<RemoveExistingProducts After="InstallValidate"/>
<RemoveExistingProducts After="InstallValidate"/> <!-- Moved from CostInitialize, due to WixCloseApplications -->
<Custom Action="PatchWebDAV" After="InstallFiles">NOT Installed OR REINSTALL</Custom>
<Custom Action="V170MigrateSettings" After="InstallFiles">NOT Installed OR REINSTALL</Custom>

38
pom.xml
View File

@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.cryptomator</groupId>
<artifactId>cryptomator</artifactId>
<version>1.7.0-SNAPSHOT</version>
<version>1.7.1</version>
<name>Cryptomator Desktop App</name>
<organization>
@@ -30,43 +30,43 @@
<!-- cryptomator dependencies -->
<cryptomator.cryptolib.version>2.1.1</cryptomator.cryptolib.version>
<cryptomator.cryptofs.version>2.6.1</cryptomator.cryptofs.version>
<cryptomator.integrations.version>1.2.0-beta4</cryptomator.integrations.version>
<cryptomator.integrations.win.version>1.2.0-beta2</cryptomator.integrations.win.version>
<cryptomator.integrations.mac.version>1.2.0-beta2</cryptomator.integrations.mac.version>
<cryptomator.integrations.linux.version>1.2.0-beta1</cryptomator.integrations.linux.version>
<cryptomator.fuse.version>2.0.0-beta5</cryptomator.fuse.version>
<cryptomator.dokany.version>2.0.0-beta2</cryptomator.dokany.version>
<cryptomator.webdav.version>2.0.0-beta4</cryptomator.webdav.version>
<cryptomator.integrations.version>1.2.0</cryptomator.integrations.version>
<cryptomator.integrations.win.version>1.2.0</cryptomator.integrations.win.version>
<cryptomator.integrations.mac.version>1.2.0</cryptomator.integrations.mac.version>
<cryptomator.integrations.linux.version>1.2.0</cryptomator.integrations.linux.version>
<cryptomator.fuse.version>2.0.2</cryptomator.fuse.version>
<cryptomator.dokany.version>2.0.0</cryptomator.dokany.version>
<cryptomator.webdav.version>2.0.1</cryptomator.webdav.version>
<!-- 3rd party dependencies -->
<commons-lang3.version>3.12.0</commons-lang3.version>
<dagger.version>2.44</dagger.version>
<dagger.version>2.45</dagger.version>
<easybind.version>2.2</easybind.version>
<guava.version>31.1-jre</guava.version>
<gson.version>2.9.1</gson.version>
<javafx.version>19</javafx.version>
<jwt.version>4.2.1</jwt.version>
<nimbus-jose.version>9.25.4</nimbus-jose.version>
<logback.version>1.4.4</logback.version>
<slf4j.version>2.0.3</slf4j.version>
<gson.version>2.10.1</gson.version>
<javafx.version>19.0.2.1</javafx.version>
<jwt.version>4.3.0</jwt.version>
<nimbus-jose.version>9.31</nimbus-jose.version>
<logback.version>1.4.5</logback.version>
<slf4j.version>2.0.6</slf4j.version>
<tinyoauth2.version>0.5.1</tinyoauth2.version>
<zxcvbn.version>1.7.0</zxcvbn.version>
<!-- test dependencies -->
<junit.jupiter.version>5.9.1</junit.jupiter.version>
<mockito.version>4.8.0</mockito.version>
<junit.jupiter.version>5.9.2</junit.jupiter.version>
<mockito.version>5.1.1</mockito.version>
<hamcrest.version>2.2</hamcrest.version>
<!-- build-time dependencies -->
<jetbrains.annotations.version>23.0.0</jetbrains.annotations.version>
<dependency-check.version>7.4.4</dependency-check.version>
<dependency-check.version>8.1.0</dependency-check.version>
<jacoco.version>0.8.8</jacoco.version>
</properties>
<dependencies>
<!-- Cryptomator Libs -->
<dependency>
<!-- needed due to https://github.com/cryptomator/cryptolib/issues/34-->
<!-- needed due to https://github.com/cryptomator/cryptolib/issues/34 -->
<groupId>org.cryptomator</groupId>
<artifactId>cryptolib</artifactId>
<version>${cryptomator.cryptolib.version}</version>

View File

@@ -16,6 +16,7 @@ import org.cryptomator.common.settings.SettingsProvider;
import org.cryptomator.common.vaults.VaultComponent;
import org.cryptomator.common.vaults.VaultListModule;
import org.cryptomator.cryptolib.common.MasterkeyFileAccess;
import org.cryptomator.integrations.revealpath.RevealPathService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -26,6 +27,7 @@ import java.net.InetSocketAddress;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Comparator;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.SynchronousQueue;
@@ -83,6 +85,13 @@ public abstract class CommonsModule {
return new SemVerComparator();
}
@Provides
@Singleton
static Optional<RevealPathService> provideRevealPathService() {
return RevealPathService.get().findFirst();
}
@Provides
@Singleton
static Settings provideSettings(SettingsProvider settingsProvider) {

View File

@@ -14,7 +14,6 @@ import javafx.beans.value.ObservableValue;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Objects;
import static org.cryptomator.integrations.mount.MountCapability.MOUNT_AS_DRIVE_LETTER;
import static org.cryptomator.integrations.mount.MountCapability.MOUNT_TO_EXISTING_DIR;
@@ -60,7 +59,7 @@ public class Mounter {
case READ_ONLY -> builder.setReadOnly(vaultSettings.usesReadOnlyMode().get());
case MOUNT_FLAGS -> {
var mountFlags = vaultSettings.mountFlags().get();
if( mountFlags == null || mountFlags.isBlank()) {
if (mountFlags == null || mountFlags.isBlank()) {
builder.setMountFlags(service.getDefaultMountFlags());
} else {
builder.setMountFlags(mountFlags);
@@ -81,9 +80,10 @@ public class Mounter {
var canMountToDriveLetter = service.hasCapability(MOUNT_AS_DRIVE_LETTER);
var canMountToParent = service.hasCapability(MOUNT_WITHIN_EXISTING_PARENT);
var canMountToDir = service.hasCapability(MOUNT_TO_EXISTING_DIR);
var canMountToSystem = service.hasCapability(MOUNT_TO_SYSTEM_CHOSEN_PATH);
if (userChosenMountPoint == null) {
if (service.hasCapability(MOUNT_TO_SYSTEM_CHOSEN_PATH)) {
if (canMountToSystem) {
// no need to set a mount point
} else if (canMountToDriveLetter) {
builder.setMountpoint(driveLetters.getFirstDesiredAvailable().orElseThrow()); //TODO: catch exception and translate
@@ -105,8 +105,11 @@ public class Mounter {
}
try {
builder.setMountpoint(userChosenMountPoint);
} catch (IllegalArgumentException e) {
var configNotSupported = (!canMountToDriveLetter && mpIsDriveLetter) || (!canMountToDir && !mpIsDriveLetter) || (!canMountToParent && !mpIsDriveLetter);
} catch (IllegalArgumentException | UnsupportedOperationException e) {
var configNotSupported = (!canMountToDriveLetter && mpIsDriveLetter) //mounting as driveletter, albeit not supported
|| (!canMountToDir && !mpIsDriveLetter) //mounting to directory, albeit not supported
|| (!canMountToParent && !mpIsDriveLetter) //
|| (!canMountToDir && !canMountToParent && !canMountToSystem && !canMountToDriveLetter);
if (configNotSupported) {
throw new MountPointNotSupportedException(e.getMessage());
} else if (canMountToDir && !canMountToParent && !Files.exists(userChosenMountPoint)) {

View File

@@ -37,30 +37,30 @@ public class SettingsJsonAdapter extends TypeAdapter<Settings> {
@Override
public void write(JsonWriter out, Settings value) throws IOException {
out.beginObject();
out.name("lastWrittenByVersion").value(env.getAppVersion()+env.getBuildNumber().map("-"::concat).orElse(""));
out.name("writtenByVersion").value(env.getAppVersion() + env.getBuildNumber().map("-"::concat).orElse(""));
out.name("directories");
writeVaultSettingsArray(out, value.getDirectories());
out.name("askedForUpdateCheck").value(value.askedForUpdateCheck().get());
out.name("checkForUpdatesEnabled").value(value.checkForUpdates().get());
out.name("startHidden").value(value.startHidden().get());
out.name("autoCloseVaults").value(value.autoCloseVaults().get());
out.name("port").value(value.port().get());
out.name("numTrayNotifications").value(value.numTrayNotifications().get());
out.name("checkForUpdatesEnabled").value(value.checkForUpdates().get());
out.name("debugMode").value(value.debugMode().get());
out.name("theme").value(value.theme().get().name());
out.name("uiOrientation").value(value.userInterfaceOrientation().get().name());
out.name("displayConfiguration").value((value.displayConfigurationProperty().get()));
out.name("keychainProvider").value(value.keychainProvider().get());
out.name("useKeychain").value(value.useKeychain().get());
out.name("language").value((value.languageProperty().get()));
out.name("licenseKey").value(value.licenseKey().get());
out.name("mountService").value(value.mountService().get());
out.name("numTrayNotifications").value(value.numTrayNotifications().get());
out.name("port").value(value.port().get());
out.name("showMinimizeButton").value(value.showMinimizeButton().get());
out.name("showTrayIcon").value(value.showTrayIcon().get());
out.name("startHidden").value(value.startHidden().get());
out.name("theme").value(value.theme().get().name());
out.name("uiOrientation").value(value.userInterfaceOrientation().get().name());
out.name("useKeychain").value(value.useKeychain().get());
out.name("windowHeight").value((value.windowHeightProperty().get()));
out.name("windowWidth").value((value.windowWidthProperty().get()));
out.name("windowXPosition").value((value.windowXPositionProperty().get()));
out.name("windowYPosition").value((value.windowYPositionProperty().get()));
out.name("windowWidth").value((value.windowWidthProperty().get()));
out.name("windowHeight").value((value.windowHeightProperty().get()));
out.name("displayConfiguration").value((value.displayConfigurationProperty().get()));
out.name("language").value((value.languageProperty().get()));
out.name("mountService").value(value.mountService().get());
out.endObject();
}
@@ -82,33 +82,34 @@ public class SettingsJsonAdapter extends TypeAdapter<Settings> {
while (in.hasNext()) {
String name = in.nextName();
switch (name) {
case "writtenByVersion" -> in.skipValue(); //noop
case "directories" -> settings.getDirectories().addAll(readVaultSettingsArray(in));
case "askedForUpdateCheck" -> settings.askedForUpdateCheck().set(in.nextBoolean());
case "checkForUpdatesEnabled" -> settings.checkForUpdates().set(in.nextBoolean());
case "startHidden" -> settings.startHidden().set(in.nextBoolean());
case "autoCloseVaults" -> settings.autoCloseVaults().set(in.nextBoolean());
case "port" -> settings.port().set(in.nextInt());
case "numTrayNotifications" -> settings.numTrayNotifications().set(in.nextInt());
case "checkForUpdatesEnabled" -> settings.checkForUpdates().set(in.nextBoolean());
case "debugMode" -> settings.debugMode().set(in.nextBoolean());
case "theme" -> settings.theme().set(parseUiTheme(in.nextString()));
case "uiOrientation" -> settings.userInterfaceOrientation().set(parseUiOrientation(in.nextString()));
case "keychainProvider" -> settings.keychainProvider().set(in.nextString());
case "useKeychain" -> settings.useKeychain().set(in.nextBoolean());
case "licenseKey" -> settings.licenseKey().set(in.nextString());
case "showMinimizeButton" -> settings.showMinimizeButton().set(in.nextBoolean());
case "showTrayIcon" -> settings.showTrayIcon().set(in.nextBoolean());
case "windowXPosition" -> settings.windowXPositionProperty().set(in.nextInt());
case "windowYPosition" -> settings.windowYPositionProperty().set(in.nextInt());
case "windowWidth" -> settings.windowWidthProperty().set(in.nextInt());
case "windowHeight" -> settings.windowHeightProperty().set(in.nextInt());
case "displayConfiguration" -> settings.displayConfigurationProperty().set(in.nextString());
case "keychainProvider" -> settings.keychainProvider().set(in.nextString());
case "language" -> settings.languageProperty().set(in.nextString());
case "licenseKey" -> settings.licenseKey().set(in.nextString());
case "mountService" -> {
var token = in.peek();
if (JsonToken.STRING == token) {
settings.mountService().set(in.nextString());
}
}
case "numTrayNotifications" -> settings.numTrayNotifications().set(in.nextInt());
case "port" -> settings.port().set(in.nextInt());
case "showMinimizeButton" -> settings.showMinimizeButton().set(in.nextBoolean());
case "showTrayIcon" -> settings.showTrayIcon().set(in.nextBoolean());
case "startHidden" -> settings.startHidden().set(in.nextBoolean());
case "theme" -> settings.theme().set(parseUiTheme(in.nextString()));
case "uiOrientation" -> settings.userInterfaceOrientation().set(parseUiOrientation(in.nextString()));
case "useKeychain" -> settings.useKeychain().set(in.nextBoolean());
case "windowHeight" -> settings.windowHeightProperty().set(in.nextInt());
case "windowWidth" -> settings.windowWidthProperty().set(in.nextInt());
case "windowXPosition" -> settings.windowXPositionProperty().set(in.nextInt());
case "windowYPosition" -> settings.windowYPositionProperty().set(in.nextInt());
//1.6.x legacy
case "preferredVolumeImpl" -> volumeImpl = in.nextString();
//legacy end
@@ -134,7 +135,7 @@ public class SettingsJsonAdapter extends TypeAdapter<Settings> {
if (volumeImpl.equals("Dokany")) {
return "org.cryptomator.frontend.dokany.mount.DokanyMountProvider";
} else if (volumeImpl.equals("FUSE")) {
if(SystemUtils.IS_OS_WINDOWS) {
if (SystemUtils.IS_OS_WINDOWS) {
return "org.cryptomator.frontend.fuse.mount.WinFspNetworkMountProvider";
} else if (SystemUtils.IS_OS_MAC) {
return "org.cryptomator.frontend.fuse.mount.MacFuseMountProvider";
@@ -142,7 +143,7 @@ public class SettingsJsonAdapter extends TypeAdapter<Settings> {
return "org.cryptomator.frontend.fuse.mount.LinuxFuseMountProvider";
}
} else {
if(SystemUtils.IS_OS_WINDOWS) {
if (SystemUtils.IS_OS_WINDOWS) {
return "org.cryptomator.frontend.webdav.mount.WindowsMounter";
} else if (SystemUtils.IS_OS_MAC) {
return "org.cryptomator.frontend.webdav.mount.MacAppleScriptMounter";

View File

@@ -316,18 +316,29 @@ public class Vault {
/**
* Gets from the cleartext path its ciphertext counterpart.
* The cleartext path has to start from the vault root (by starting with "/").
*
* @return Local os path to the ciphertext resource
* @throws IOException if an I/O error occurs
* @throws IllegalStateException if the vault is not unlocked
*/
public Path getCiphertextPath(String cleartextPath) throws IOException {
if (!cleartextPath.startsWith("/")) {
throw new IllegalArgumentException("Input path must be absolute from vault root by starting with \"/\".");
public Path getCiphertextPath(Path cleartextPath) throws IOException {
if (!state.getValue().equals(VaultState.Value.UNLOCKED)) {
throw new IllegalStateException("Vault is not unlocked");
}
var fs = cryptoFileSystem.get();
var cryptoPath = fs.getPath(cleartextPath);
return fs.getCiphertextPath(cryptoPath);
var osPathSeparator = cleartextPath.getFileSystem().getSeparator();
var cryptoFsPathSeparator = fs.getSeparator();
if (getMountPoint() instanceof Mountpoint.WithPath mp) {
var absoluteCryptoFsPath = cryptoFsPathSeparator + mp.path().relativize(cleartextPath).toString();
if (!cryptoFsPathSeparator.equals(osPathSeparator)) {
absoluteCryptoFsPath = absoluteCryptoFsPath.replace(osPathSeparator, cryptoFsPathSeparator);
}
var cryptoPath = fs.getPath(absoluteCryptoFsPath);
return fs.getCiphertextPath(cryptoPath);
} else {
throw new UnsupportedOperationException("URI mount points not supported.");
}
}
public VaultConfigCache getVaultConfigCache() {

View File

@@ -29,9 +29,13 @@ public class ErrorController implements FxController {
OS: %s / %s
App: %s / %s
<!-- ✏ Please describe what happened as accurately as possible. -->
<!-- ✏ Please describe what happened as accurately as possible. -->
<!-- 📋 Please also copy and paste the detail text from the error window. -->
<!-- Text enclosed like this (chevrons, exclamation mark, two dashes) is not visible to others! -->
<!-- ❗ If the description or the detail text is missing, the discussion will be deleted. -->
""";
private final Application application;

View File

@@ -15,7 +15,7 @@ public enum FxmlFile {
HEALTH_CHECK_LIST("/fxml/health_check_list.fxml"), //
HUB_NO_KEYCHAIN("/fxml/hub_no_keychain.fxml"), //
HUB_AUTH_FLOW("/fxml/hub_auth_flow.fxml"), //
HUB_LICENSE_EXCEEDED("/fxml/hub_license_exceeded.fxml"), //
HUB_INVALID_LICENSE("/fxml/hub_invalid_license.fxml"), //
HUB_RECEIVE_KEY("/fxml/hub_receive_key.fxml"), //
HUB_REGISTER_DEVICE("/fxml/hub_register_device.fxml"), //
HUB_REGISTER_SUCCESS("/fxml/hub_register_success.fxml"), //

View File

@@ -42,6 +42,7 @@ public enum FontAwesome5Icon {
PLUS("\uF067"), //
PRINT("\uF02F"), //
QUESTION("\uF128"), //
QUESTION_CIRCLE("\uf059"), //
REDO("\uF01E"), //
SEARCH("\uF002"), //
SPINNER("\uF110"), //

View File

@@ -102,10 +102,10 @@ public abstract class HubKeyLoadingModule {
}
@Provides
@FxmlScene(FxmlFile.HUB_LICENSE_EXCEEDED)
@FxmlScene(FxmlFile.HUB_INVALID_LICENSE)
@KeyLoadingScoped
static Scene provideLicenseExceededScene(@KeyLoading FxmlLoaderFactory fxmlLoaders) {
return fxmlLoaders.createScene(FxmlFile.HUB_LICENSE_EXCEEDED);
static Scene provideInvalidLicenseScene(@KeyLoading FxmlLoaderFactory fxmlLoaders) {
return fxmlLoaders.createScene(FxmlFile.HUB_INVALID_LICENSE);
}
@Provides
@@ -162,8 +162,8 @@ public abstract class HubKeyLoadingModule {
@Binds
@IntoMap
@FxControllerKey(LicenseExceededController.class)
abstract FxController bindLicenseExceededController(LicenseExceededController controller);
@FxControllerKey(InvalidLicenseController.class)
abstract FxController bindInvalidLicenseController(InvalidLicenseController controller);
@Binds
@IntoMap

View File

@@ -7,12 +7,12 @@ import javax.inject.Inject;
import javafx.fxml.FXML;
import javafx.stage.Stage;
public class LicenseExceededController implements FxController {
public class InvalidLicenseController implements FxController {
private final Stage window;
@Inject
public LicenseExceededController(@KeyLoading Stage window) {
public InvalidLicenseController(@KeyLoading Stage window) {
this.window = window;
}

View File

@@ -42,11 +42,11 @@ public class ReceiveKeyController implements FxController {
private final Lazy<Scene> registerDeviceScene;
private final Lazy<Scene> unauthorizedScene;
private final URI vaultBaseUri;
private final Lazy<Scene> licenseExceededScene;
private final Lazy<Scene> invalidLicenseScene;
private final HttpClient httpClient;
@Inject
public ReceiveKeyController(@KeyLoading Vault vault, ExecutorService executor, @KeyLoading Stage window, @Named("deviceId") String deviceId, @Named("bearerToken") AtomicReference<String> tokenRef, CompletableFuture<JWEObject> result, @FxmlScene(FxmlFile.HUB_REGISTER_DEVICE) Lazy<Scene> registerDeviceScene, @FxmlScene(FxmlFile.HUB_UNAUTHORIZED_DEVICE) Lazy<Scene> unauthorizedScene, @FxmlScene(FxmlFile.HUB_LICENSE_EXCEEDED) Lazy<Scene> licenseExceededScene) {
public ReceiveKeyController(@KeyLoading Vault vault, ExecutorService executor, @KeyLoading Stage window, @Named("deviceId") String deviceId, @Named("bearerToken") AtomicReference<String> tokenRef, CompletableFuture<JWEObject> result, @FxmlScene(FxmlFile.HUB_REGISTER_DEVICE) Lazy<Scene> registerDeviceScene, @FxmlScene(FxmlFile.HUB_UNAUTHORIZED_DEVICE) Lazy<Scene> unauthorizedScene, @FxmlScene(FxmlFile.HUB_INVALID_LICENSE) Lazy<Scene> invalidLicenseScene) {
this.window = window;
this.deviceId = deviceId;
this.bearerToken = Objects.requireNonNull(tokenRef.get());
@@ -54,7 +54,7 @@ public class ReceiveKeyController implements FxController {
this.registerDeviceScene = registerDeviceScene;
this.unauthorizedScene = unauthorizedScene;
this.vaultBaseUri = getVaultBaseUri(vault);
this.licenseExceededScene = licenseExceededScene;
this.invalidLicenseScene = invalidLicenseScene;
this.window.addEventHandler(WindowEvent.WINDOW_HIDING, this::windowClosed);
this.httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).executor(executor).build();
}
@@ -96,7 +96,7 @@ public class ReceiveKeyController implements FxController {
}
private void licenseExceeded() {
window.setScene(licenseExceededScene.get());
window.setScene(invalidLicenseScene.get());
}
private void needsDeviceRegistration() {

View File

@@ -5,6 +5,7 @@ import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.tobiasdiez.easybind.EasyBind;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.integrations.mount.Mountpoint;
import org.cryptomator.integrations.revealpath.RevealFailedException;
@@ -54,6 +55,7 @@ public class VaultDetailUnlockedController implements FxController {
private final VaultService vaultService;
private final WrongFileAlertComponent.Builder wrongFileAlert;
private final Stage mainWindow;
private final Optional<RevealPathService> revealPathService;
private final ResourceBundle resourceBundle;
private final LoadingCache<Vault, VaultStatisticsComponent> vaultStats;
private final VaultStatisticsComponent.Builder vaultStatsBuilder;
@@ -67,12 +69,13 @@ public class VaultDetailUnlockedController implements FxController {
public Button dropZone;
@Inject
public VaultDetailUnlockedController(ObjectProperty<Vault> vault, FxApplicationWindows appWindows, VaultService vaultService, VaultStatisticsComponent.Builder vaultStatsBuilder, WrongFileAlertComponent.Builder wrongFileAlert, @MainWindow Stage mainWindow, ResourceBundle resourceBundle) {
public VaultDetailUnlockedController(ObjectProperty<Vault> vault, FxApplicationWindows appWindows, VaultService vaultService, VaultStatisticsComponent.Builder vaultStatsBuilder, WrongFileAlertComponent.Builder wrongFileAlert, @MainWindow Stage mainWindow, Optional<RevealPathService> revealPathService, ResourceBundle resourceBundle) {
this.vault = vault;
this.appWindows = appWindows;
this.vaultService = vaultService;
this.wrongFileAlert = wrongFileAlert;
this.mainWindow = mainWindow;
this.revealPathService = revealPathService;
this.resourceBundle = resourceBundle;
this.vaultStats = CacheBuilder.newBuilder().weakValues().build(CacheLoader.from(this::buildVaultStats));
this.vaultStatsBuilder = vaultStatsBuilder;
@@ -99,7 +102,11 @@ public class VaultDetailUnlockedController implements FxController {
private void handleDragEvent(DragEvent event) {
if (DragEvent.DRAG_OVER.equals(event.getEventType()) && event.getGestureSource() == null && event.getDragboard().hasFiles()) {
event.acceptTransferModes(TransferMode.LINK);
if(SystemUtils.IS_OS_WINDOWS || SystemUtils.IS_OS_MAC) {
event.acceptTransferModes(TransferMode.LINK);
} else {
event.acceptTransferModes(TransferMode.ANY);
}
draggingOver.set(true);
} else if (DragEvent.DRAG_DROPPED.equals(event.getEventType()) && event.getGestureSource() == null && event.getDragboard().hasFiles()) {
List<Path> ciphertextPaths = event.getDragboard().getFiles().stream().map(File::toPath).map(this::getCiphertextPath).flatMap(Optional::stream).toList();
@@ -164,12 +171,7 @@ public class VaultDetailUnlockedController implements FxController {
return Optional.empty();
}
try {
var accessPoint = mountPoint.getValue();
var cleartextPath = path.toString().substring(accessPoint.length());
if (!cleartextPath.startsWith("/")) {
cleartextPath = "/" + cleartextPath;
}
return Optional.of(vault.get().getCiphertextPath(cleartextPath));
return Optional.of(vault.get().getCiphertextPath(path));
} catch (IOException e) {
LOG.warn("Unable to get ciphertext path from path: {}", path, e);
return Optional.empty();
@@ -177,29 +179,21 @@ public class VaultDetailUnlockedController implements FxController {
}
private void revealOrCopyPaths(List<Path> paths) {
if (!revealPaths(paths)) {
revealPathService.ifPresentOrElse(svc -> revealPaths(svc, paths), () -> {
LOG.warn("No service provider to reveal files found.");
copyPathsToClipboard(paths);
}
});
}
/**
* Reveals the paths over the {@link RevealPathService} in the file system
*
* @param paths List of Paths to reveal
* @return true, if at least one service provider was present, false otherwise
*/
private boolean revealPaths(List<Path> paths) {
return RevealPathService.get().findAny().map(s -> {
paths.forEach(path -> {
try {
s.reveal(path);
} catch (RevealFailedException e) {
LOG.error("Revealing ciphertext file failed.", e);
}
});
return true;
}).orElse(false);
private void revealPaths(RevealPathService service, List<Path> paths) {
paths.forEach(path -> {
try {
LOG.debug("Revealing {}", path);
service.reveal(path);
} catch (RevealFailedException e) {
LOG.error("Revealing ciphertext file failed.", e);
}
});
}
private void copyPathsToClipboard(List<Path> paths) {

View File

@@ -16,7 +16,7 @@ import javafx.fxml.FXML;
public class WelcomeController implements FxController {
private static final Logger LOG = LoggerFactory.getLogger(WelcomeController.class);
private static final String GETTING_STARTED_URI = "https://docs.cryptomator.org/en/1.6/desktop/getting-started/";
private static final String GETTING_STARTED_URI = "https://docs.cryptomator.org/en/1.7/desktop/getting-started/";
private final Application application;
private final BooleanBinding noVaultPresent;

View File

@@ -10,7 +10,7 @@ import javafx.stage.Stage;
public class MigrationImpossibleController implements FxController {
private static final String HELP_URI = "https://docs.cryptomator.org/en/1.6/help/manual-migration/";
private static final String HELP_URI = "https://docs.cryptomator.org/en/1.7/help/manual-migration/";
private final Application application;
private final Stage window;

View File

@@ -1,5 +1,6 @@
package org.cryptomator.ui.preferences;
import dagger.Lazy;
import org.cryptomator.common.ObservableUtil;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.integrations.mount.MountCapability;
@@ -7,6 +8,7 @@ import org.cryptomator.integrations.mount.MountService;
import org.cryptomator.ui.common.FxController;
import javax.inject.Inject;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanExpression;
import javafx.beans.value.ObservableValue;
@@ -21,6 +23,8 @@ import java.util.ResourceBundle;
@PreferencesScoped
public class VolumePreferencesController implements FxController {
private static final String DOCS_MOUNTING_URL = "https://docs.cryptomator.org/en/1.7/desktop/vault-mounting/";
private final Settings settings;
private final ObservableValue<MountService> selectedMountService;
private final ResourceBundle resourceBundle;
@@ -29,14 +33,16 @@ public class VolumePreferencesController implements FxController {
private final ObservableValue<Boolean> mountToDriveLetterSupported;
private final ObservableValue<Boolean> mountFlagsSupported;
private final ObservableValue<Boolean> readonlySupported;
private final Lazy<Application> application;
private final List<MountService> mountProviders;
public ChoiceBox<MountService> volumeTypeChoiceBox;
public TextField loopbackPortField;
public Button loopbackPortApplyButton;
@Inject
VolumePreferencesController(Settings settings, List<MountService> mountProviders, ResourceBundle resourceBundle) {
VolumePreferencesController(Settings settings, Lazy<Application> application, List<MountService> mountProviders, ResourceBundle resourceBundle) {
this.settings = settings;
this.application = application;
this.mountProviders = mountProviders;
this.resourceBundle = resourceBundle;
@@ -141,4 +147,8 @@ public class VolumePreferencesController implements FxController {
throw new UnsupportedOperationException();
}
}
public void openDocs() {
application.get().getHostServices().showDocument(DOCS_MOUNTING_URL);
}
}

View File

@@ -4,6 +4,7 @@ import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
import dagger.Lazy;
import org.cryptomator.common.Nullable;
import org.cryptomator.common.ObservableUtil;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.cryptofs.VaultConfig;
import org.cryptomator.cryptofs.VaultConfigLoadException;
@@ -15,9 +16,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
@@ -38,11 +40,16 @@ public class RecoveryKeyRecoverController implements FxController {
private final Vault vault;
private final VaultConfig.UnverifiedVaultConfig unverifiedVaultConfig;
private final StringProperty recoveryKey;
private final ObservableValue<Boolean> recoveryKeyCorrect;
private final ObservableValue<Boolean> recoveryKeyWrong;
private final ObservableValue<Boolean> recoveryKeyInvalid;
private final RecoveryKeyFactory recoveryKeyFactory;
private final BooleanBinding validRecoveryKey;
private final ObjectProperty<RecoveryKeyState> recoveryKeyState;
private final Lazy<Scene> resetPasswordScene;
private final AutoCompleter autoCompleter;
private volatile boolean isWrongKey;
public TextArea textarea;
@Inject
@@ -53,14 +60,18 @@ public class RecoveryKeyRecoverController implements FxController {
this.unverifiedVaultConfig = unverifiedVaultConfig;
this.recoveryKey = recoveryKey;
this.recoveryKeyFactory = recoveryKeyFactory;
this.validRecoveryKey = Bindings.createBooleanBinding(this::isValidRecoveryKey, recoveryKey);
this.resetPasswordScene = resetPasswordScene;
this.autoCompleter = new AutoCompleter(recoveryKeyFactory.getDictionary());
this.recoveryKeyState = new SimpleObjectProperty<>();
this.recoveryKeyCorrect = ObservableUtil.mapWithDefault(recoveryKeyState, RecoveryKeyState.CORRECT::equals, false);
this.recoveryKeyWrong = ObservableUtil.mapWithDefault(recoveryKeyState, RecoveryKeyState.WRONG::equals, false);
this.recoveryKeyInvalid = ObservableUtil.mapWithDefault(recoveryKeyState, RecoveryKeyState.INVALID::equals, false);
}
@FXML
public void initialize() {
recoveryKey.bind(textarea.textProperty());
textarea.textProperty().addListener(((observable, oldValue, newValue) -> validateRecoveryKey()));
}
private TextFormatter.Change filterTextChange(TextFormatter.Change change) {
@@ -107,6 +118,12 @@ public class RecoveryKeyRecoverController implements FxController {
window.setScene(resetPasswordScene.get());
}
/**
* Checks, if vault config is signed with the given key.
*
* @param key byte array of possible signing key
* @return true, if vault config is signed with this key
*/
private boolean checkKeyAgainstVaultConfig(byte[] key) {
try {
var config = unverifiedVaultConfig.verify(key, unverifiedVaultConfig.allegedVaultVersion());
@@ -114,6 +131,7 @@ public class RecoveryKeyRecoverController implements FxController {
return true;
} catch (VaultKeyInvalidException e) {
LOG.debug("Provided recovery key does not match vault config signature.");
isWrongKey = true;
return false;
} catch (VaultConfigLoadException e) {
LOG.error("Failed to parse vault config", e);
@@ -121,25 +139,64 @@ public class RecoveryKeyRecoverController implements FxController {
}
}
private void validateRecoveryKey() {
isWrongKey = false;
var valid = recoveryKeyFactory.validateRecoveryKey(recoveryKey.get(), unverifiedVaultConfig != null ? this::checkKeyAgainstVaultConfig : null);
if (valid) {
recoveryKeyState.set(RecoveryKeyState.CORRECT);
} else if (isWrongKey) { //set via side effect in checkKeyAgainstVaultConfig()
recoveryKeyState.set(RecoveryKeyState.WRONG);
} else {
recoveryKeyState.set(RecoveryKeyState.INVALID);
}
}
/* Getter/Setter */
public Vault getVault() {
return vault;
}
public BooleanBinding validRecoveryKeyProperty() {
return validRecoveryKey;
}
public boolean isValidRecoveryKey() {
if (unverifiedVaultConfig != null) {
return recoveryKeyFactory.validateRecoveryKey(recoveryKey.get(), this::checkKeyAgainstVaultConfig);
} else {
return recoveryKeyFactory.validateRecoveryKey(recoveryKey.get());
}
}
public TextFormatter getRecoveryKeyTextFormatter() {
return new TextFormatter<>(this::filterTextChange);
}
public ObservableValue<Boolean> recoveryKeyInvalidProperty() {
return recoveryKeyInvalid;
}
public boolean isRecoveryKeyInvalid() {
return recoveryKeyInvalid.getValue();
}
public ObservableValue<Boolean> recoveryKeyCorrectProperty() {
return recoveryKeyCorrect;
}
public boolean isRecoveryKeyCorrect() {
return recoveryKeyCorrect.getValue();
}
public ObservableValue<Boolean> recoveryKeyWrongProperty() {
return recoveryKeyWrong;
}
public boolean isRecoveryKeyWrong() {
return recoveryKeyWrong.getValue();
}
private enum RecoveryKeyState {
/**
* Recovery key is a valid key and belongs to this vault
*/
CORRECT,
/**
* Recovery key is a valid key, but does not belong to this vault
*/
WRONG,
/**
* Recovery key is not a valid key.
*/
INVALID;
}
}

View File

@@ -15,7 +15,7 @@ import java.io.UncheckedIOException;
@WrongFileAlertScoped
public class WrongFileAlertController implements FxController {
private static final String DOCUMENTATION_URI = "https://docs.cryptomator.org/en/1.6/desktop/accessing-vaults/";
private static final String DOCUMENTATION_URI = "https://docs.cryptomator.org/en/1.7/desktop/accessing-vaults/";
private final Application app;
private final Stage window;

View File

@@ -13,7 +13,7 @@
<?import javafx.scene.shape.Circle?>
<HBox xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx"
fx:controller="org.cryptomator.ui.keyloading.hub.LicenseExceededController"
fx:controller="org.cryptomator.ui.keyloading.hub.InvalidLicenseController"
minWidth="400"
maxWidth="400"
minHeight="145"
@@ -33,12 +33,12 @@
</StackPane>
</Group>
<VBox HBox.hgrow="ALWAYS">
<Label styleClass="label-large" text="%hub.licenseExceeded.message" wrapText="true" textAlignment="LEFT">
<Label styleClass="label-large" text="%hub.invalidLicense.message" wrapText="true" textAlignment="LEFT">
<padding>
<Insets bottom="6" top="6"/>
</padding>
</Label>
<Label text="%hub.licenseExceeded.description" wrapText="true"/>
<Label text="%hub.invalidLicense.description" wrapText="true"/>
<Region VBox.vgrow="ALWAYS" minHeight="18"/>
<ButtonBar buttonMinWidth="120" buttonOrder="+C">

View File

@@ -5,10 +5,12 @@
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.control.Hyperlink?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Tooltip?>
<VBox xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx"
fx:controller="org.cryptomator.ui.preferences.VolumePreferencesController"
@@ -20,6 +22,14 @@
<HBox spacing="12" alignment="CENTER_LEFT">
<Label text="%preferences.volume.type"/>
<ChoiceBox fx:id="volumeTypeChoiceBox"/>
<Hyperlink contentDisplay="GRAPHIC_ONLY" onAction="#openDocs">
<graphic>
<FontAwesome5IconView glyph="QUESTION_CIRCLE" styleClass="glyph-icon-muted"/>
</graphic>
<tooltip>
<Tooltip text="%preferences.volume.docsTooltip" showDelay="100ms"/>
</tooltip>
</Hyperlink>
</HBox>
<HBox spacing="12" alignment="CENTER_LEFT" visible="${controller.loopbackPortSupported}" managed="${controller.loopbackPortSupported}">

View File

@@ -9,6 +9,8 @@
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.Region?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.Group?>
<VBox xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx"
fx:controller="org.cryptomator.ui.recoverykey.RecoveryKeyRecoverController"
@@ -25,12 +27,28 @@
<TextArea wrapText="true" prefRowCount="4" fx:id="textarea" textFormatter="${controller.recoveryKeyTextFormatter}" onKeyPressed="#onKeyPressed"/>
<!-- TODO: add Label when the recovery key is not valid -->
<Label text="%recoveryKey.recover.validKey" graphicTextGap="6" contentDisplay="LEFT" visible="${controller.validRecoveryKey}">
<graphic>
<FontAwesome5IconView glyph="CHECK"/>
</graphic>
</Label>
<StackPane>
<Label text="Just some Filler" visible="false" graphicTextGap="6">
<graphic>
<FontAwesome5IconView glyph="ANCHOR"/>
</graphic>
</Label>
<Label text="%recoveryKey.recover.correctKey" graphicTextGap="6" contentDisplay="LEFT" visible="${(!textarea.text.empty) &amp;&amp; controller.recoveryKeyCorrect}">
<graphic>
<FontAwesome5IconView glyph="CHECK"/>
</graphic>
</Label>
<Label text="%recoveryKey.recover.wrongKey" graphicTextGap="6" contentDisplay="LEFT" visible="${(!textarea.text.empty) &amp;&amp; controller.recoveryKeyWrong}">
<graphic>
<FontAwesome5IconView glyph="TIMES" styleClass="glyph-icon-red"/>
</graphic>
</Label>
<Label text="%recoveryKey.recover.invalidKey" graphicTextGap="6" contentDisplay="LEFT" visible="${(!textarea.text.empty) &amp;&amp; controller.recoveryKeyInvalid}">
<graphic>
<FontAwesome5IconView glyph="TIMES" styleClass="glyph-icon-red"/>
</graphic>
</Label>
</StackPane>
<Region VBox.vgrow="ALWAYS"/>
@@ -38,7 +56,7 @@
<ButtonBar buttonMinWidth="120" buttonOrder="+CX">
<buttons>
<Button text="%generic.button.cancel" ButtonBar.buttonData="CANCEL_CLOSE" cancelButton="true" onAction="#close"/>
<Button text="%generic.button.next" ButtonBar.buttonData="NEXT_FORWARD" defaultButton="true" onAction="#recover" disable="${!controller.validRecoveryKey}"/>
<Button text="%generic.button.next" ButtonBar.buttonData="NEXT_FORWARD" defaultButton="true" onAction="#recover" disable="${!controller.recoveryKeyCorrect}"/>
</buttons>
</ButtonBar>
</VBox>

View File

@@ -12,7 +12,6 @@
<?import javafx.scene.control.ToggleGroup?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Text?>
<?import javafx.scene.text.TextFlow?>
<VBox xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx"
@@ -26,8 +25,8 @@
</padding>
<children>
<TextFlow>
<Text text="%vaultOptions.mount.info" styleClass="label"/>
<Text text=" "/>
<Label text="%vaultOptions.mount.info"/>
<Label text=" "/>
<Hyperlink styleClass="hyperlink-underline" text="%vaultOptions.mount.linkToPreferences" onAction="#openVolumePreferences" wrapText="true"/>
</TextFlow>
<CheckBox fx:id="readOnlyCheckbox" text="%vaultOptions.mount.readonly" visible="${controller.readOnlySupported}" managed="${controller.readOnlySupported}"/>

View File

@@ -155,9 +155,8 @@ hub.registerFailed.description=An error was thrown in the naming process. For mo
hub.unauthorized.message=Access denied
hub.unauthorized.description=Your device has not yet been authorized to access this vault. Ask the vault owner to authorize it.
### License Exceeded
hub.licenseExceeded.message=License exceeded
hub.licenseExceeded.description=Cryptomator Hub has given access to more users than its license permits. Please contact your Hub admin to upgrade the license or a vault admin to remove users from vaults.
hub.invalidLicense.message=Hub License invalid
hub.invalidLicense.description=Your Cryptomator Hub instance has an invalid license. Please inform a Hub administrator to upgrade or renew the license.
# Lock
## Force
@@ -278,6 +277,7 @@ preferences.interface.showTrayIcon=Show tray icon (requires restart)
preferences.volume=Virtual Drive
preferences.volume.type=Volume Type (requires restart)
preferences.volume.type.automatic=Automatic
preferences.volume.docsTooltip=Open the documentation to learn more about the different volume types.
preferences.volume.tcp.port=TCP Port
preferences.volume.supportedFeatures=The chosen volume type supports the following features:
preferences.volume.feature.mountAuto=Automatic mount point selection
@@ -446,7 +446,9 @@ recoveryKey.display.StorageHints=Keep it somewhere very secure, e.g.:\n • Stor
### Enter Recovery Key
recoveryKey.recover.title=Reset Password
recoveryKey.recover.prompt=Enter your recovery key for "%s":
recoveryKey.recover.validKey=This is a valid recovery key
recoveryKey.recover.correctKey=This recovery key is correct
recoveryKey.recover.wrongKey=This recovery key belongs to a different vault
recoveryKey.recover.invalidKey=This recovery key is not valid
recoveryKey.printout.heading=Cryptomator Recovery Key\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Reset

View File

@@ -113,7 +113,6 @@ hub.register.registerBtn=تأكيد
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.description=تم حظر قفل "%s" بواسطة العمليات المعلقة أو الملفات المفتوحة. يمكنك فرض قفل هذا المخزن، ولكن مقاطعة عمليات الادخال والاخراج I/O قد تؤدي لفقدان البيانات غير المحفوظة.
@@ -296,7 +295,7 @@ recoveryKey.display.StorageHints=حافظ عليه في مكان ما آمن ج
## Reset Password
### Enter Recovery Key
recoveryKey.recover.prompt=أدخل مفتاح الاسترداد الخاص لـ "%s":
recoveryKey.recover.validKey=هذا مفتاح استرداد صالح
recoveryKey.recover.correctKey=هذا مفتاح استرداد صالح
recoveryKey.printout.heading=مفتاح استرداد Cryptomator\n"%s"\n
### Reset Password
### Recovery Key Password Reset Success

View File

@@ -147,8 +147,6 @@ hub.registerFailed.description=Падчас прысваення імя адбы
hub.unauthorized.message=Адмова ў доступе
hub.unauthorized.description=Тваёй прыладзе ў дадзены момант не дазволена мець доступ да гэтай скрабніцы. Запытайся ўладальніка скрабніцы за дазволам.
### License Exceeded
hub.licenseExceeded.message=Ліцэнзія пратэрмінаваная
# Lock
## Force
@@ -370,7 +368,7 @@ recoveryKey.display.StorageHints=Захоўвай іх у бяспечным м
### Enter Recovery Key
recoveryKey.recover.title=Скінуць пароль
recoveryKey.recover.prompt=Увядзі свой ключ аднаўлення для "%s":
recoveryKey.recover.validKey=Гэта валідны ключ аднаўлення
recoveryKey.recover.correctKey=Гэта валідны ключ аднаўлення
recoveryKey.printout.heading=Ключ аднаўлення Cryptomator\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Скінуць

View File

@@ -97,7 +97,6 @@ hub.register.registerBtn=নিশ্চিত করুন
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.retryBtn=পুনরায় চেষ্টা করুন

View File

@@ -113,7 +113,6 @@ hub.register.registerBtn=Potvrdi
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.description=Zaključavanje "%s" blokirano je operacijama na čekanju ili otvorenim datotekama. Možete prisilno zaključati ovaj sef, međutim prekid U / I-a može rezultirati gubitkom nespremljenih podataka.
@@ -301,7 +300,7 @@ recoveryKey.display.StorageHints=Pohranite ga negdje vrlo sigurno, npr.:\n • S
## Reset Password
### Enter Recovery Key
recoveryKey.recover.prompt=Unesite ključ za oporavak za "%s":
recoveryKey.recover.validKey=Ključ za oporavak je ispravan
recoveryKey.recover.correctKey=Ključ za oporavak je ispravan
recoveryKey.printout.heading=Cryptomator Ključ za oporavak za \n"%s"\n
### Reset Password
### Recovery Key Password Reset Success

View File

@@ -154,9 +154,6 @@ hub.registerFailed.description=S'ha produït un error en el procés de nomenamen
hub.unauthorized.message=Accés denegat
hub.unauthorized.description=El vostre dispositiu no ha estat encara autoritzat a accedir a aquesta caixa forta. Demaneu autorització al propietari.
### License Exceeded
hub.licenseExceeded.message=Llicència caducada
hub.licenseExceeded.description=Cryptomator Hub ha donat accés a més usuaris dels permesos en la llicència. Si us plau contacteu amb l'administrador del Hub per actualitzar la llicència o amb l'administrador de la caixa forta per treure usuaris.
# Lock
## Force
@@ -445,7 +442,7 @@ recoveryKey.display.StorageHints=Conserveu-la en un lloc molt segur. P. ex.:\n
### Enter Recovery Key
recoveryKey.recover.title=Canviar contrasenya
recoveryKey.recover.prompt=Introduïu la vostra clau de recuperació de "%s":
recoveryKey.recover.validKey=La clau de recuperació és vàlida
recoveryKey.recover.correctKey=La clau de recuperació és vàlida
recoveryKey.printout.heading=Clau de recuperació de Cryptomator\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Reinicia

View File

@@ -142,9 +142,6 @@ hub.registerFailed.message=Pojmenování zařízení se nezdařilo
hub.unauthorized.message=Přístup odepřen
hub.unauthorized.description=Vaše zařízení dosud nebylo oprávněno k přístupu k tomuto trezoru. Požádejte vlastníka trezoru, aby jej autorizoval.
### License Exceeded
hub.licenseExceeded.message=Licence byla překročena
hub.licenseExceeded.description=Cryptomator Hub poskytl přístup více uživatelům, než jsou jeho licenční povolení. Obraťte se na správce Hubu pro aktualizaci licence nebo správce trezoru pro odstranění uživatelů z trezoru.
# Lock
## Force
@@ -405,7 +402,7 @@ recoveryKey.display.StorageHints=Uchovejte ho někde velmi bezpečně, např.\n
### Enter Recovery Key
recoveryKey.recover.title=Resetovat heslo
recoveryKey.recover.prompt=Zadejte váš obnovovací klíč pro "%s":
recoveryKey.recover.validKey=Toto je platný obnovovací klíč
recoveryKey.recover.correctKey=Toto je platný obnovovací klíč
recoveryKey.printout.heading=Obnovovací klíč Cryptomator\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Resetovat

View File

@@ -123,6 +123,10 @@ unlock.success.description=Indholdet i boksen "%s" er nu tilgængeligt der hvor
unlock.success.rememberChoice=Husk mit valg. Spørg ikke igen
unlock.success.revealBtn=Vis drev
## Failure
unlock.error.customPath.message=Kan ikke montere boks til brugerdefineret sti
unlock.error.customPath.description.notSupported=Hvis du ønsker at fortsætte med at bruge den brugerdefinerede sti, skal du gå til præferencer og vælge en type drev der understøtter det. Hvis ikke, skal du gå til boksens indstillinger og vælge et understøttet monteringspunkt.
unlock.error.customPath.description.notExists=Den brugerdefinerede monteringssti eksisterer ikke. Opret den enten i dit lokale filsystem eller skift monteringssti i boksens indstillinger.
unlock.error.customPath.description.generic=Du har valgt en brugerdefineret monteringssti til denne boks, men det mislykkedes med beskeden: %s
## Hub
hub.noKeychain.message=Kan ikke tilgå enhedsnøgle
hub.noKeychain.description=En enhedsnøgle er påkrævet for at låse Hub bokse op. Enhedsnøglen er sikret i en nøglering. For at fortsætte, aktivér “%s” og vælg en nøglering i indstillingerne.
@@ -150,9 +154,6 @@ hub.registerFailed.description=Der opstod en fejl i navngivnings-processen. Kig
hub.unauthorized.message=Adgang nægtet
hub.unauthorized.description=Din enhed er endnu ikke blevet godkendt til at få adgang til denne boks. Spørg boks-ejeren om godkendelse.
### License Exceeded
hub.licenseExceeded.message=Licens overskredet
hub.licenseExceeded.description=Cryptomator Hub har givet adgang til flere brugere end licensen tillader. Kontakt venligst din Hub administrator for at opgradere din licens eller en boks administrator for at fjerne brugere fra bokse.
# Lock
## Force
@@ -251,7 +252,7 @@ preferences.title=Præferencer
preferences.general=Generelt
preferences.general.startHidden=Skjul vinduet når Cryptomator starter
preferences.general.autoCloseVaults=Lås åbne bokse automatisk, når programmet afsluttes
preferences.general.debugLogging=Aktiver fejllogning
preferences.general.debugLogging=Aktivér fejllogning
preferences.general.debugDirectory=Vis logfiler
preferences.general.autoStart=Start Cryptomator automatisk ved opstart
preferences.general.keychainBackend=Gem adgangskoder med
@@ -271,7 +272,15 @@ preferences.interface.showMinimizeButton=Vis knap til minimering
preferences.interface.showTrayIcon=Vis ikon i system-bakken (kræver genstart)
## Volume
preferences.volume=Virtuelt drev
preferences.volume.type=Drev type (kræver genstart)
preferences.volume.type.automatic=Automatisk
preferences.volume.tcp.port=TCP port
preferences.volume.supportedFeatures=Den valgte type drev understøtter følgende funktioner:
preferences.volume.feature.mountAuto=Automatisk valg af monteringspunkt
preferences.volume.feature.mountToDir=Brugerdefineret mappe som monteringspunkt
preferences.volume.feature.mountToDriveLetter=Enhedsbogstav som monteringspunkt
preferences.volume.feature.mountFlags=Brugerdefinerede monteringsindstillinger
preferences.volume.feature.readOnly=Skrivebeskyttet montering
## Updates
preferences.updates=Opdateringer
preferences.updates.currentVersion=Nuværende version: %s
@@ -352,6 +361,7 @@ main.vaultDetail.passwordSavedInKeychain=Adgangskode gemt
main.vaultDetail.unlockedStatus=LÅST OP
main.vaultDetail.accessLocation=Boksens indhold er tilgængeligt her:
main.vaultDetail.revealBtn=Vis drev
main.vaultDetail.copyUri=Kopiér URI
main.vaultDetail.lockBtn=Lås
main.vaultDetail.bytesPerSecondRead=Læser:
main.vaultDetail.bytesPerSecondWritten=Skriver:
@@ -359,6 +369,10 @@ main.vaultDetail.throughput.idle=afventer
main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
main.vaultDetail.stats=Boks statistik
main.vaultDetail.locateEncryptedFileBtn=Find Krypteret Fil
main.vaultDetail.locateEncryptedFileBtn.tooltip=Vælg en fil fra din boks for at finde dens krypterede modpart
main.vaultDetail.encryptedPathsCopied=Stier kopieret!
main.vaultDetail.filePickerTitle=Vælg fil inde i boks
### Missing
main.vaultDetail.missing.info=Cryptomator kunne ikke finde en boks på denne sti.
main.vaultDetail.missing.recheck=Kontrollér igen
@@ -373,10 +387,10 @@ main.vaultDetail.error.reload=Genindlæs
main.vaultDetail.error.windowTitle=Fejl ved indlæsning af boks
# Wrong File Alert
wrongFileAlert.title=Sådan krypteres filer
wrongFileAlert.title=Sådan krypterer du filer
wrongFileAlert.message=Forsøgte du at kryptere disse filer?
wrongFileAlert.description=For kryptering af filer, skal du bruge det drev som Cryptomator har lavet i din stifinder.
wrongFileAlert.instruction.0=For at kryptere filer, gør følgende:
wrongFileAlert.description=Til dette formål opretter Cryptomator et drev i din filhåndtering.
wrongFileAlert.instruction.0=Følg disse trin for at kryptere filer:
wrongFileAlert.instruction.1=1. Lås din boks op.
wrongFileAlert.instruction.2=2. Klik på "Vis drev" for at åbne drevet i din stifinder.
wrongFileAlert.instruction.3=3. Tilføj filer til drevet.
@@ -397,13 +411,17 @@ vaultOptions.general.startHealthCheckBtn=Start sunhedstjek
## Mount
vaultOptions.mount=Montering
vaultOptions.mount.info=Valgmulighederne afhænger af den valgte type drev.
vaultOptions.mount.linkToPreferences=Åbn virtuelle drev præferencer
vaultOptions.mount.readonly=Skrivebeskyttet
vaultOptions.mount.customMountFlags=Brugerdefinerede monterings-flag
vaultOptions.mount.winDriveLetterOccupied=optaget
vaultOptions.mount.mountPoint=Monterings-sted
vaultOptions.mount.mountPoint.auto=Vælg automatisk en passende placering
vaultOptions.mount.mountPoint.driveLetter=Brug et ledigt drevbogstav
vaultOptions.mount.mountPoint.custom=Brug en valgt mappe
vaultOptions.mount.mountPoint.directoryPickerButton=Vælg…
vaultOptions.mount.mountPoint.directoryPickerTitle=Vælg en mappe
## Master Key
vaultOptions.masterkey=Adgangskode
vaultOptions.masterkey.changePasswordBtn=Skift adgangskode
@@ -424,7 +442,7 @@ recoveryKey.display.StorageHints=Opbevar den et meget sikkert sted, som fx:\n
### Enter Recovery Key
recoveryKey.recover.title=Nulstil adgangskode
recoveryKey.recover.prompt=Indtast din gendannelsesnøgle for "%s":
recoveryKey.recover.validKey=Dette er en gyldig gendannelsesnøgle
recoveryKey.recover.correctKey=Dette er en gyldig gendannelsesnøgle
recoveryKey.printout.heading=Cryptomator gendannelsesnøgle\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Nulstil
@@ -437,11 +455,11 @@ newPassword.promptText=Skriv en ny adgangskode
newPassword.reenterPassword=Bekræft ny adgangskode
newPassword.passwordsMatch=Adgangskoderne er ens!
newPassword.passwordsDoNotMatch=Adgangskoder stemmer ikke overens
passwordStrength.messageLabel.tooShort=Angiv mindst %d tegn
passwordStrength.messageLabel.0=Meget dårlig
passwordStrength.messageLabel.1=Dårlig
passwordStrength.messageLabel.tooShort=Brug mindst %d tegn
passwordStrength.messageLabel.0=Meget svag
passwordStrength.messageLabel.1=Svag
passwordStrength.messageLabel.2=Rimelig
passwordStrength.messageLabel.3=God
passwordStrength.messageLabel.3=Stærk
passwordStrength.messageLabel.4=Meget god
# Quit

View File

@@ -123,6 +123,10 @@ unlock.success.description=Der Inhalt des Tresors „%s“ ist nun über dessen
unlock.success.rememberChoice=Auswahl merken und nicht mehr fragen
unlock.success.revealBtn=Laufwerk anzeigen
## Failure
unlock.error.customPath.message=Tresor kann nicht an benutzerdefinierten Pfad eingehängt werden
unlock.error.customPath.description.notSupported=Wenn du den benutzerdefinierten Pfad weiter verwenden möchtest, gehe bitte in die Einstellungen und wähle einen Laufwerkstyp, der ihn unterstützt. Andernfalls gehe zu den Tresoroptionen und wähle einen unterstützten Einhängepunkt.
unlock.error.customPath.description.notExists=Der benutzerdefinierte Einhängepfad existiert nicht. Erstelle ihn entweder in deinem lokalen Dateisystem oder ändere ihn in den Tresoreinstellungen.
unlock.error.customPath.description.generic=Du hast einen benutzerdefinierten Einhängepfad für diesen Tresor ausgewählt, aber die Verwendung ist fehlgeschlagen. Fehlermeldung: %s
## Hub
hub.noKeychain.message=Zugriff auf Geräteschlüssel nicht möglich
hub.noKeychain.description=Um Hub Tresore zu entsperren, wird ein Geräteschlüssel benötigt, der mit einem Schlüsselbund gesichert ist. Um fortzufahren, aktiviere “%s” und wähle einen Schlüsselbund in den Einstellungen.
@@ -150,9 +154,8 @@ hub.registerFailed.description=Während der Namensvergabe wurde ein Fehler ausge
hub.unauthorized.message=Zugriff verweigert
hub.unauthorized.description=Dein Gerät wurde noch nicht für den Zugriff auf diesen Tresor autorisiert. Bitte den Tresorbesitzer, dein Gerät zu autorisieren.
### License Exceeded
hub.licenseExceeded.message=Lizenz überschritten
hub.licenseExceeded.description=Im Cryptomator Hub wurden mehr Benutzern Zugriff gewährt, als dessen Lizenz erlaubt. Bitte kontaktiere deinen Hub-Administrator für ein Lizenz-Upgrade oder einen Tresor-Administrator, um Benutzer aus Tresoren zu entfernen.
hub.invalidLicense.message=Hub-Lizenz ungültig
hub.invalidLicense.description=Die Lizenz deiner Cryptomator-Hub-Instanz ist ungültig. Bitte informiere deinen Hub-Administrator, um die Lizenz zu aktualisieren oder zu erneuern.
# Lock
## Force
@@ -241,8 +244,8 @@ health.result.fixStateFilter.fixing=Wird repariert …
health.result.fixStateFilter.fixed=Repariert
health.result.fixStateFilter.fixFailed=Reparatur gescheitert
## Fix Application
health.fix.fixBtn=Beheben
health.fix.successTip=Fehlerbehebung erfolgreich
health.fix.fixBtn=Reparieren
health.fix.successTip=Reparatur erfolgreich
health.fix.failTip=Reparatur fehlgeschlagen, siehe Protokoll für Details
# Preferences
@@ -270,8 +273,17 @@ preferences.interface.interfaceOrientation.rtl=Von rechts nach links
preferences.interface.showMinimizeButton=Schaltfläche zum Minimieren anzeigen
preferences.interface.showTrayIcon=Symbol im Infobereich anzeigen (Neustart erforderlich)
## Volume
preferences.volume=Tresorlaufwerk
preferences.volume=Virtuelles Laufwerk
preferences.volume.type=Laufwerkstyp (Neustart erforderlich)
preferences.volume.type.automatic=Automatisch
preferences.volume.docsTooltip=Öffne die Dokumentation, um mehr über die verschiedenen Laufwerkstypen zu erfahren.
preferences.volume.tcp.port=TCP-Port
preferences.volume.supportedFeatures=Der gewählte Laufwerkstyp unterstützt folgende Funktionen:
preferences.volume.feature.mountAuto=Automatische Einhängepunkt Auswahl
preferences.volume.feature.mountToDir=Benutzerdefiniertes Verzeichnis als Einhängepunkt
preferences.volume.feature.mountToDriveLetter=Laufwerkbuchstaben als Einhängepunkt
preferences.volume.feature.mountFlags=Benutzerdefinierte Einhänge-Optionen
preferences.volume.feature.readOnly=Schreibgeschütztes Einhängen
## Updates
preferences.updates=Updates
preferences.updates.currentVersion=Aktuelle Version: %s
@@ -352,6 +364,7 @@ main.vaultDetail.passwordSavedInKeychain=Passwort gespeichert
main.vaultDetail.unlockedStatus=ENTSPERRT
main.vaultDetail.accessLocation=Deine Tresorinhalte sind hier erreichbar:
main.vaultDetail.revealBtn=Laufwerk anzeigen
main.vaultDetail.copyUri=URI kopieren
main.vaultDetail.lockBtn=Sperren
main.vaultDetail.bytesPerSecondRead=Leserate:
main.vaultDetail.bytesPerSecondWritten=Schreibrate:
@@ -359,6 +372,10 @@ main.vaultDetail.throughput.idle=inaktiv
main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
main.vaultDetail.stats=Tresorstatistik
main.vaultDetail.locateEncryptedFileBtn=Verschlüsselte Datei finden
main.vaultDetail.locateEncryptedFileBtn.tooltip=Wähle eine Datei aus deinem Tresor aus, um das verschlüsselte Gegenstück zu finden
main.vaultDetail.encryptedPathsCopied=Pfade in Zwischenablage kopiert!
main.vaultDetail.filePickerTitle=Datei im Tresor auswählen
### Missing
main.vaultDetail.missing.info=Cryptomator konnte keinen Tresor mit diesem Pfad finden.
main.vaultDetail.missing.recheck=Erneut prüfen
@@ -397,13 +414,17 @@ vaultOptions.general.startHealthCheckBtn=Integritätsprüfung starten
## Mount
vaultOptions.mount=Laufwerk
vaultOptions.mount.info=Die Optionen hängen vom gewählten Laufwerkstyp ab.
vaultOptions.mount.linkToPreferences=Einstellungen für virtuelles Laufwerk öffnen
vaultOptions.mount.readonly=Schreibgeschützt
vaultOptions.mount.customMountFlags=Benutzerdefinierte Einhänge-Optionen
vaultOptions.mount.winDriveLetterOccupied=belegt
vaultOptions.mount.mountPoint=Einhängepunkt
vaultOptions.mount.mountPoint.auto=Automatisch einen geeigneten Ort auswählen
vaultOptions.mount.mountPoint.driveLetter=Laufwerksbuchstaben zuweisen
vaultOptions.mount.mountPoint.custom=Ausgewähltes Verzeichnis verwenden
vaultOptions.mount.mountPoint.directoryPickerButton=Durchsuchen 
vaultOptions.mount.mountPoint.directoryPickerTitle=Verzeichnis wählen
## Master Key
vaultOptions.masterkey=Passwort
vaultOptions.masterkey.changePasswordBtn=Passwort ändern
@@ -424,7 +445,9 @@ recoveryKey.display.StorageHints=Bewahre ihn möglichst sicher auf, z. B.\n •
### Enter Recovery Key
recoveryKey.recover.title=Passwort zurücksetzen
recoveryKey.recover.prompt=Gib deinen Wiederherstellungsschlüssel für „%s“ ein:
recoveryKey.recover.validKey=Dies ist ein gültiger Wiederherstellungsschlüssel
recoveryKey.recover.correctKey=Dies ist ein gültiger Wiederherstellungsschlüssel
recoveryKey.recover.wrongKey=Dieser Wiederherstellungsschlüssel gehört zu einem anderen Tresor
recoveryKey.recover.invalidKey=Dieser Wiederherstellungsschlüssel ist ungültig
recoveryKey.printout.heading=Cryptomator-Wiederherstellungsschlüssel\n„%s“\n
### Reset Password
recoveryKey.recover.resetBtn=Zurücksetzen

View File

@@ -154,9 +154,8 @@ hub.registerFailed.description=Παρουσιάστηκε σφάλμα στη δ
hub.unauthorized.message=Δεν επιτρέπεται η πρόσβαση
hub.unauthorized.description=Η συσκευή σας δεν έχει ακόμη εξουσιοδοτηθεί να έχει πρόσβαση σε αυτή την κρύπτη. Ζητήστε από τον κάτοχο της κρύπτης να την εξουσιοδοτήσει.
### License Exceeded
hub.licenseExceeded.message=Υπέρβαση άδειας
hub.licenseExceeded.description=Το Cryptomator Hub έχει δώσει πρόσβαση σε περισσότερους χρήστες από ότι επιτρέπει η άδειά του. Παρακαλούμε επικοινωνήστε με το Hub admin για να αναβαθμίσετε την άδεια ή έναν διαχειριστή κρύπτης για να αφαιρέσετε τους χρήστες από τις κρύπτες.
hub.invalidLicense.message=Μη έγκυρη Άδεια Hub
hub.invalidLicense.description=Η συνεδρία σας στο Cryptomator Hub έχει μη έγκυρη άδεια χρήσης. Ενημερώστε έναν διαχειριστή του Hub για να αναβαθμίσει ή να ανανεώσει την άδεια χρήσης.
# Lock
## Force
@@ -277,6 +276,7 @@ preferences.interface.showTrayIcon=Εμφάνιση εικονιδίου tray (
preferences.volume=Εικονικός δίσκος
preferences.volume.type=Τύπος Τόμου (απαιτείται επανεκκίνηση)
preferences.volume.type.automatic=Αυτόματα
preferences.volume.docsTooltip=Ανοίξτε τις οδηγίες για να μάθετε περισσότερα σχετικά με τους διαφορετικούς τύπους τόμων.
preferences.volume.tcp.port=Θύρα TCP
preferences.volume.supportedFeatures=Ο επιλεγμένος τύπος τόμου υποστηρίζει τις ακόλουθες δυνατότητες:
preferences.volume.feature.mountAuto=Αυτόματη επιλογή σημείου προσάρτησης
@@ -445,7 +445,9 @@ recoveryKey.display.StorageHints=Φυλάξτε κάπου που θα είνα
### Enter Recovery Key
recoveryKey.recover.title=Επαναφορά Κωδικού Πρόσβασης
recoveryKey.recover.prompt=Εισάγετε το κλειδί ανάκτησης για "%s":
recoveryKey.recover.validKey=Αυτό είναι ένα έγκυρο κλειδί ανάκτησης
recoveryKey.recover.correctKey=Αυτό το κλειδί ανάκτησης είναι έγκυρο
recoveryKey.recover.wrongKey=Αυτό το κλειδί ανάκτησης ανήκει σε διαφορετική κρύπτη
recoveryKey.recover.invalidKey=Αυτό το κλειδί ανάκτησης δεν είναι έγκυρο
recoveryKey.printout.heading=Κλειδί ανάκτησης Cryptomator\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Επαναφορά

View File

@@ -154,9 +154,8 @@ hub.registerFailed.description=Ocurrió un error en el nombramiento. Para más d
hub.unauthorized.message=Acceso denegado
hub.unauthorized.description=Su dispositivo aún no ha sido autorizado para acceder a esta bóveda. Pídale al propietario de la bóveda que lo autorice.
### License Exceeded
hub.licenseExceeded.message=Licencia excedida
hub.licenseExceeded.description=Cryptomator Hub ha dado acceso a más usuarios de los que permite su licencia. Póngase en contacto con su administrador de Hub para actualizar la licencia o un administrador de la bóveda para eliminar usuarios de la misma.
hub.invalidLicense.message=Licencia del Hub inválida
hub.invalidLicense.description=Su instancia del Hub de Cryptomator tiene una licencia inválida. Informe a un administrador del Hub para actualizar o renovar la licencia.
# Lock
## Force
@@ -277,6 +276,7 @@ preferences.interface.showTrayIcon=Mostrar ícono de bandeja (requiere reiniciar
preferences.volume=Unidad virtual
preferences.volume.type=Tipo de volumen (requiere reiniciar)
preferences.volume.type.automatic=Automático
preferences.volume.docsTooltip=Abra la documentación para saber más sobre los diferentes tipos de volumen.
preferences.volume.tcp.port=Puerto TCP
preferences.volume.supportedFeatures=El tipo de volumen elegido admite las siguientes funciones:
preferences.volume.feature.mountAuto=Selección automática del punto de montaje
@@ -445,7 +445,9 @@ recoveryKey.display.StorageHints=Manténgala en algún lugar seguro, p.ej.:\n
### Enter Recovery Key
recoveryKey.recover.title=Restablecer contraseña
recoveryKey.recover.prompt=Ingresar la clave de recuperación para "%s":
recoveryKey.recover.validKey=Esta es una clave de recuperación válida
recoveryKey.recover.correctKey=Esta es una clave de recuperación válida
recoveryKey.recover.wrongKey=Esta clave de recuperación pertenece a una bóveda diferente
recoveryKey.recover.invalidKey=Esta clave de recuperación no es válida
recoveryKey.printout.heading=Clave de recuperación de Cryptomator\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=## Reiniciar contraseña\nrecoveryKey.recover.resetBtn

View File

@@ -69,7 +69,6 @@ unlock.unlockBtn=بازکردن قفل
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.retryBtn=تلاش مجدد

View File

@@ -75,7 +75,6 @@ unlock.unlockBtn=I-unlock
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.retryBtn=Subukan muli

View File

@@ -124,8 +124,8 @@ unlock.success.rememberChoice=Se souvenir de mon choix et ne plus me le demander
unlock.success.revealBtn=Révéler le lecteur
## Failure
unlock.error.customPath.message=Impossible de monter le coffre vers le chemin personnalisé
unlock.error.customPath.description.notSupported=Si vous souhaitez continuer à utiliser le chemin personnalisé, veuillez aller dans les préférences et sélectionner un type de volume qui le supporte. Sinon, allez dans les options du coffre et choisissez un point de montage pris en charge.
unlock.error.customPath.description.notExists=Le chemin de montage personnalisé n'existe pas. Créez le dans votre système de fichiers local ou modifiez-le dans les options du coffre.
unlock.error.customPath.description.notSupported=Si vous souhaitez continuer à utiliser le chemin personnalisé, veuillez aller dans les préférences et sélectionner un type de volume qui le prend en charge. Sinon, allez dans les options du coffre et choisissez un point de montage pris en charge.
unlock.error.customPath.description.notExists=Le chemin de montage personnalisé n'existe pas. Créez-le dans votre système de fichiers local ou modifiez-le dans les options du coffre.
unlock.error.customPath.description.generic=Vous avez sélectionné un chemin de montage personnalisé pour ce coffre, mais son utilisation a échoué avec le message : %s
## Hub
hub.noKeychain.message=Impossible d'accéder à la clé du périphérique
@@ -154,9 +154,8 @@ hub.registerFailed.description=Le processus de nommage a retourné une erreur. P
hub.unauthorized.message=Accès refusé
hub.unauthorized.description=Votre appareil n'a pas encore été autorisé à accéder à ce coffre. Demandez au propriétaire du coffre de l'autoriser.
### License Exceeded
hub.licenseExceeded.message=Licence dépassée
hub.licenseExceeded.description=Cryptomator Hub a donné accès à plus d'utilisateurs qu'autorisé par la licence. Veuillez contacter votre administrateur Hub pour étendre la licence ou un administrateur de coffre pour supprimer des utilisateurs des coffres.
hub.invalidLicense.message=Licence de Hub invalide
hub.invalidLicense.description=Votre instance Cryptomator Hub a une licence invalide. Veuillez informer un administrateur Hub pour la mettre à niveau ou la renouveler.
# Lock
## Force
@@ -275,13 +274,14 @@ preferences.interface.showMinimizeButton=Afficher le bouton Réduire
preferences.interface.showTrayIcon=Montrer l'icône de service (redémarrage nécessaire)
## Volume
preferences.volume=Disque virtuel
preferences.volume.type=Type de volume (nécessite un redémarrage)
preferences.volume.type=Type de volume (redémarrage requis)
preferences.volume.type.automatic=Automatique
preferences.volume.docsTooltip=Consultez la documentation pour en savoir plus sur les différents types de volumes.
preferences.volume.tcp.port=Port TCP
preferences.volume.supportedFeatures=Le type de volume choisi prend en charge les fonctionnalités suivantes :
preferences.volume.feature.mountAuto=Sélection automatique de point de montage
preferences.volume.feature.mountAuto=Sélection automatique du point de montage
preferences.volume.feature.mountToDir=Répertoire personnalisé comme point de montage
preferences.volume.feature.mountToDriveLetter=Lettre du lecteur comme point de montage
preferences.volume.feature.mountToDriveLetter=Lettre de lecteur comme point de montage
preferences.volume.feature.mountFlags=Options de montage personnalisées
preferences.volume.feature.readOnly=Montage en lecture seule
## Updates
@@ -353,7 +353,7 @@ main.vaultlist.contextMenu.reveal=Afficher le lecteur
main.vaultlist.addVaultBtn=Ajouter un volume chiffré
## Vault Detail
### Welcome
main.vaultDetail.welcomeOnboarding=Merci d'avoir choisi Cryptomateur pour protéger vos fichiers. Si vous avez besoin d'aide, consultez nos guides de démarrage :
main.vaultDetail.welcomeOnboarding=Merci d'avoir choisi Cryptomator pour protéger vos fichiers. Si vous avez besoin d'aide, consultez nos guides de démarrage :
### Locked
main.vaultDetail.lockedStatus=VERROUILLÉ
main.vaultDetail.unlockBtn=Déverrouiller…
@@ -424,7 +424,7 @@ vaultOptions.mount.mountPoint.auto=Choisir automatiquement un emplacement approp
vaultOptions.mount.mountPoint.driveLetter=Utiliser la lettre du lecteur assignée
vaultOptions.mount.mountPoint.custom=Utiliser le répertoire choisi
vaultOptions.mount.mountPoint.directoryPickerButton=Choisir...
vaultOptions.mount.mountPoint.directoryPickerTitle=Choisissez un dossier
vaultOptions.mount.mountPoint.directoryPickerTitle=Choisissez un répertoire
## Master Key
vaultOptions.masterkey=Mot de passe
vaultOptions.masterkey.changePasswordBtn=Modifier le mot de passe
@@ -445,7 +445,9 @@ recoveryKey.display.StorageHints=Gardez-la dans un endroit sûr, par ex. :\n •
### Enter Recovery Key
recoveryKey.recover.title=Réinitialiser le mot de passe
recoveryKey.recover.prompt=Entrez votre clé de récupération pour "%s":
recoveryKey.recover.validKey=Cette clé de récupération est valide
recoveryKey.recover.correctKey=Cette clé de récupération est correcte
recoveryKey.recover.wrongKey=Cette clé de récupération appartient à un autre coffre
recoveryKey.recover.invalidKey=Cette clé de récupération n'est pas valide
recoveryKey.printout.heading=Clé de récupération Cryptomator "%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Réinitialiser

View File

@@ -50,7 +50,6 @@ error.message=Produciuse un erro
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.retryBtn=Tentar de novo

View File

@@ -123,37 +123,60 @@ unlock.success.description=הנעילה ל-"%s" בוטלה בהצלחה! הכס
unlock.success.rememberChoice=זכור בחירה, אל תראה שוב
unlock.success.revealBtn=חשוף את הכונן
## Failure
unlock.error.customPath.message=כשלון בקישור הכספת לנתיב הידני שהוגדר
unlock.error.customPath.description.notSupported=אם ברצונך להשתמש בנתיב ידני, אנא גש להעדפות ובחר סוג volume שתומך בכך. אחרת, לך לאפשרויות הכספת ובחר אפשרות יעד קישור נתמך.
unlock.error.customPath.description.notExists=יעד הקישור הידני לא קיים. או שתיצור אותו במערכת הקבצים המקומית או שנה אותו באפשרויות הכספת.
unlock.error.customPath.description.generic=אתה בחרת באפשרות יעד קישור ידני לכספת זו, אבל השימוש בו נכשל עם ההודעה: %s
## Hub
hub.noKeychain.message=לא ניתן לגשת למפתח המכשיר
hub.noKeychain.description=כדאי לשחרר כספות האב נדרש מפתח מכשיר שיאובטח בצרור מפתחות. כדאי להמשיך, אפשר ״%s״ ובחר את צרור המפתחות בהעדפות.
hub.noKeychain.openBtn=פתח העדפות
### Waiting
hub.auth.message=ממתין לאימות…
hub.auth.description=אתה אמור להיות מופנה אוטומטית למסך ההזדהות.
hub.auth.loginLink=לא הופנת? לחצן כאן לפתיחה.
### Receive Key
hub.receive.message=מעבד תשובה…
hub.receive.description=Cryptomator מקבל ומעבד את התשובה מה- האב. אנא המתן.
### Register Device
hub.register.message=שם המכשיר נדרש
hub.register.description=נראה שזו הגישה הראשונה ל- האב ממכשיר זה. כדי לזהות אותך למתן הרשאות, עליך לתת שם למכשיר זה.
hub.register.nameLabel=שם מכשיר
hub.register.occupiedMsg=שם זה נמצא כבר בשימוש
hub.register.registerBtn=אישור
### Registration Success
hub.registerSuccess.message=שם המכשיר
hub.registerSuccess.description=כדי לגשת לכספת, המכשיר שלך צריך לקבל הרשאה על ידי בעלי הכספת.
### Registration Failed
hub.registerFailed.message=הגדרת שם למכשיר נכשלה
hub.registerFailed.description=ארעה שגיאה בתהליך עם השם. לפרטים נוספים הסתכל בלוג האפליקציה.
### Unauthorized
hub.unauthorized.message=הגישה נדחתה
hub.unauthorized.description=המכשיר שלך טרם אושר לגשת לכספת הזאת. יש לבקש אישור גישה מבעל הכספת.
### License Exceeded
hub.invalidLicense.message=רישיון האב לא תקף
hub.invalidLicense.description=הרישיון שמותקן במופע ה- Cryptomator האב שלך אינו תקף. אנא ידע את מנהל ההאב שלך לשדרג או לחדש את הרישיון.
# Lock
## Force
lock.forced.message=הנעילה נכשלה
lock.forced.description=נעילת ״%s״ נחסמה על ידי פעולות ממתינות או קבצים פתוחים. אתה יכול לנעול את הכספת בכוח, אולם הפרעה לפעולת קריאה וכתיבה עשויה לגרום לאובדן מידע לא שמור.
lock.forced.retryBtn=נסה שנית
lock.forced.forceBtn=הכרח נעילה
## Failure
lock.fail.message=נעילת הכספת נשכלה.
lock.fail.description=לא ניתן היה לנעול את הכספת ״%s״. וודא שכל העבודה הלא שמורה נשמרת במקום אחר ושפעולות קריאה/כתיבה חשובות מסתיימות. כדי לסגור את הכספת, הרוג את התהליך של Cryptomator.
# Migration
migration.title=שדרג הכספת
## Start
migration.start.header=שדרג הכספת
migration.start.text=כדי לפתוח את הכספת ״%s״ בגרסה החדשה הזו של Cryptomator, צריך לשדרג את הכספת לגרסה חדשה יותר. לפני שתעשה זאת, כדאי שתדע:
migration.start.remarkUndone=פעולת השדרוג אינה הפיכה.
migration.start.remarkVersions=גרסאות ישנות יותר של Cryptomator לא יוכלו לפתוח את הכספת המשודרגת.
migration.start.remarkCanRun=עליך לוודא שכל מכשיר ממנו אתה ניגש לכספת יכול להפעיל את גרסה זו של Cryptomator.
migration.start.remarkSynced=עליך לוודא שהכספת שלך מסונכרנת במלואה במכשיר זה ובמכשירים האחרים, לפני שדרוגה.
migration.start.confirm=קראתי והבנתי את המידע לעיל
## Run
migration.run.enterPassword=הכנס/י סיסמה עבור "%s"
migration.run.startMigrationBtn=העבר הכספת
@@ -170,22 +193,60 @@ migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=מערכת הק
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=מערכת הקבצים אינה מאפשרת את הכתיבה אליה.
## Impossible
migration.impossible.heading=לא יכול להעביר את הכספת
migration.impossible.reason=לא ניתן לבצע מיגרציה אוטומטית של הכספת כי יעד האחסון או הקישור אינם תואמים.
migration.impossible.moreInfo=ניתן עדיין לפתוח את כספת זו עם גרסה ישנה יותר. להנחיות כיצד לבצע מיגרציה ידנית של הכספת בקר ב-
# Health Check
## Start
health.title=בדיקת בריאות של ״%s״
health.intro.header=בדיקת תקינות
health.intro.text=בדיקת בריאות היא אוסף בדיקות לאיתור, ואולי תיקון, של בעיות במבנה הפנימי של הכספת. שים לב ש:
health.intro.remarkSync=ודא שכל המכשירים מסונכרנים באופן מלא, זה פותר את רוב הבעיות.
health.intro.remarkFix=לא ניתן לפתור את כל הבעיות.
health.intro.remarkBackup=עם המידע משובש, רק גיבוי יכול לעזור.
health.intro.affirmation=קראתי והבנתי את המידע לעיל
## Start Failure
health.fail.header=שגיאה בהעלאת הגדרות הכספת
health.fail.ioError=ארעה שגיאה במהלך הגישה והקריאה של קובץ ההגדרות.
health.fail.parseError=ארעה שגיאה בעת עיבוד קובץ הגדרות הכספת.
health.fail.moreInfo=מידע נוסף
## Check Selection
health.checkList.description=בחר בדיקות ברשימה בצד שמאל או השתמש בלחצנים מטה.
health.checkList.selectAllButton=בחירת כל הבדיקות
health.checkList.deselectAllButton=הסר בחירה של כל הבדיקות
health.check.runBatchBtn=הרץ את הבדיקות הנבחרות
## Detail view
health.check.detail.noSelectedCheck=לתוצאות, בחר בדיקת בריאות שהסתיימה ברשימה משמאל.
health.check.detail.checkScheduled=הבדיקה מתוזמנת.
health.check.detail.checkRunning=הבדיקה רצה כרגע…
health.check.detail.checkSkipped=הבדיקה לא נבחרה לרוץ.
health.check.detail.checkFinished=הבדיקה הסתיימה בהצלחה.
health.check.detail.checkFinishedAndFound=הבדיקה הסתיימה. ניתן לבחון את התוצאות.
health.check.detail.checkFailed=הבדיקה נכשלה בשל שגיאה.
health.check.detail.checkCancelled=הבדיקה בוטלה.
health.check.detail.listFilters.label=סנן
health.check.detail.fixAllSpecificBtn=תקן הכל מסוג
health.check.exportBtn=יצוא דוחות
## Result view
health.result.severityFilter.all=חומרה - הכל
health.result.severityFilter.good=טוב
health.result.severityFilter.info=מידע
health.result.severityFilter.warn=אזהרה
health.result.severityFilter.crit=קריטי
health.result.severityTip.good=חומרה: טוב\nמבנה כספת רגיל.
health.result.severityTip.info=חומרה: מידע\nמבנה כספת קיים, תיקון מומלץ.
health.result.severityTip.warn=חומרה: אזהרה\nמבנה כספת שגוי, מומלץ מאוד לתקן.
health.result.severityTip.crit=חומרה: קריטי\nמבנה כספת שגוי, אומת אובדן מידע.
health.result.fixStateFilter.all=מצב תיקון - הכל
health.result.fixStateFilter.fixable=בר תיקון
health.result.fixStateFilter.notFixable=לא בר תיקון
health.result.fixStateFilter.fixing=מתקן…
health.result.fixStateFilter.fixed=תוקן
health.result.fixStateFilter.fixFailed=התיקון נכשל
## Fix Application
health.fix.fixBtn=תיקון
health.fix.successTip=התיקון הצליח
health.fix.failTip=התיקון כשל, ראה את הלוג לפרטים
# Preferences
preferences.title=העדפות
@@ -210,16 +271,31 @@ preferences.interface.interfaceOrientation=כיוון ממשק
preferences.interface.interfaceOrientation.ltr=משמאל לימין
preferences.interface.interfaceOrientation.rtl=מימין לשמאל
preferences.interface.showMinimizeButton=הצג כפתור מזעור
preferences.interface.showTrayIcon=הצג צלמית בשורה מטה (דורש הפעלה מחדש)
## Volume
preferences.volume=כונן וירטואלי
preferences.volume.type=סוג volume (דורש הפעלה מחדש)
preferences.volume.type.automatic=אוטומטי
preferences.volume.docsTooltip=בכדי ללמוד עוד על סוגי volume ניתן לקרוא את הדוקומנטציה.
preferences.volume.tcp.port=פורט TCP
preferences.volume.supportedFeatures=סוג ה- volume שבחרת תומך ביכולות הבאות:
preferences.volume.feature.mountAuto=נבחרה בחירת נקודת קישור אוטומטית
preferences.volume.feature.mountToDir=הגדרת תיקיה כנקודת קישור
preferences.volume.feature.mountToDriveLetter=אות כונן כנקודת קישור
preferences.volume.feature.mountFlags=בחירת אפשרויות לקישור
preferences.volume.feature.readOnly=קישור במצב קריאה בלבד
## Updates
preferences.updates=עדכונים
preferences.updates.currentVersion=הגרסה הנוכחית: %s
preferences.updates.autoUpdateCheck=בצע בדיקת עדכונים אוטומטית
preferences.updates.checkNowBtn=בדוק כעת
preferences.updates.updateAvailable=שדרוג לגרסה %s זמין.
## Contribution
preferences.contribute=תמוך בנו
preferences.contribute.registeredFor=אישור על תמיכה על שם %s
preferences.contribute.noCertificate=תמכו ב-Cryptomator וקבלו תעודת תמיכה. זה כמו מפתח רישוי רק לאנשים מדהימים שמשתמשים בתוכנה חופשית. ;-)
preferences.contribute.getCertificate=עדיין אין לכם אחד? לימדו כיצד אתם יכולים להשיג אותו.
preferences.contribute.promptText=הדבק את קוד תעודת התומך כאן
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
@@ -233,41 +309,95 @@ stats.read.throughput.idle=קריאה: ללא פעילות
stats.read.throughput.kibs=קריאה: %.2f kiB/s
stats.read.throughput.mibs=קריאה: %.2f MiB/s
stats.read.total.data.none=מידע שנקרא: -
stats.read.total.data.kib=מידע שנקרא: %.1f קילובייט
stats.read.total.data.mib=מידע שנקרא: %.1f מגהבייט
stats.read.total.data.gib=מידע שנקרא: %.1f גיגהבייט
stats.decr.total.data.none=מידע שפוענח: -
stats.decr.total.data.kib=מידע שפוענח: %.1fקילובייט
stats.decr.total.data.mib=מידע שפוענח: %.1f מגהבייט
stats.decr.total.data.gib=מידע שפוענח: %.1f גיגהבייט
stats.read.accessCount=מספר קריאות כולל: %d
## Write
stats.write.throughput.idle=כתיבה: ללא פעילות
stats.write.throughput.kibs=כתיבה: %.2f קילובייט/שניה
stats.write.throughput.mibs=כתיבה: %.2f מגהבייט/שניה
stats.write.total.data.none=מידע שנכתב: -
stats.write.total.data.kib=מידע שנכתב: %.1f קילובייט
stats.write.total.data.mib=מידע שנכתב: %.1f מגהבייט
stats.write.total.data.gib=מידע שנכתב: %.1f גיגהבייט
stats.encr.total.data.none=מידע שהוצפן: -
stats.encr.total.data.kib=מידע שהוצפן: %.1fקילובייט
stats.encr.total.data.mib=מידע שהוצפן: %.1f מגהבייט
stats.encr.total.data.gib=מידע שהוצפן: %.1f גיגהבייט
stats.write.accessCount=מספר כתיבות כולל: %d
## Accesses
stats.access.current=גישה: %d
stats.access.total=מספר גישות כולל: %d
# Main Window
main.closeBtn.tooltip=סגור
main.minimizeBtn.tooltip=מזער
main.preferencesBtn.tooltip=העדפות
main.debugModeEnabled.tooltip=מצב דיבאג מופעל
main.supporterCertificateMissing.tooltip=תרומתך תתקבל בברכה
## Vault List
main.vaultlist.emptyList.onboardingInstruction=לחץ כאן להוספת כספת
main.vaultlist.contextMenu.remove=הסר…
main.vaultlist.contextMenu.lock=נעילה
main.vaultlist.contextMenu.unlock=שחרר נעילה…
main.vaultlist.contextMenu.unlockNow=בטל נעילה כעת
main.vaultlist.contextMenu.vaultoptions=הצג את אפשרויות הכספת
main.vaultlist.contextMenu.reveal=חשוף את הכונן
main.vaultlist.addVaultBtn=יצירת כספת
## Vault Detail
### Welcome
main.vaultDetail.welcomeOnboarding=תודה שבחרת ב- Cryptomator להגן על הקבצים שלך. אם אתה זקוק לסיוע, אנא עיין במדריכים שלנו:
### Locked
main.vaultDetail.lockedStatus=נעול
main.vaultDetail.unlockBtn=שחרר נעילה…
main.vaultDetail.unlockNowBtn=בטל נעילה כעת
main.vaultDetail.optionsBtn=אפשרויות הכספת
main.vaultDetail.passwordSavedInKeychain=הסיסמה נשמרה
### Unlocked
main.vaultDetail.unlockedStatus=לא נעול
main.vaultDetail.accessLocation=תוכן הכספת שלך נגיש כאן:
main.vaultDetail.revealBtn=חשוף את הכונן
main.vaultDetail.copyUri=העתק קישור כתובת
main.vaultDetail.lockBtn=נעילה
main.vaultDetail.bytesPerSecondRead=קריאה:
main.vaultDetail.bytesPerSecondWritten=כתיבה:
main.vaultDetail.throughput.idle=ללא פעילות
main.vaultDetail.throughput.kbps=%.1f קילוביט לשניה
main.vaultDetail.throughput.mbps=%.1f מגהביט לשניה
main.vaultDetail.stats=סטטיסטיקת הכספת
main.vaultDetail.locateEncryptedFileBtn=מצא קבצים מוצפנים
main.vaultDetail.locateEncryptedFileBtn.tooltip=בחר קובץ מהכספת שלך על מנת לאתר את הקובץ התואם המוצפן
main.vaultDetail.encryptedPathsCopied=הנתיבים הועתקו ללוח!
main.vaultDetail.filePickerTitle=בחר קובץ בתוך הכספת
### Missing
main.vaultDetail.missing.info=Cryptomator לא הצליח למצוא כספת בנתיב זה.
main.vaultDetail.missing.recheck=בדיקה נוספת
main.vaultDetail.missing.remove=הסר מרשימה הכספות…
main.vaultDetail.missing.changeLocation=שנה את מיקום הכספת…
### Needs Migration
main.vaultDetail.migrateButton=שדרג הכספת
main.vaultDetail.migratePrompt=צריך לשדרג את הכספת שלך לגרסה חדשה לפני שניתן לגשת אליה
### Error
main.vaultDetail.error.info=ארעה שגיאה בהעלאת הכספת מהדיסק.
main.vaultDetail.error.reload=ריענון
main.vaultDetail.error.windowTitle=שגיאה בטעינת הכספת
# Wrong File Alert
wrongFileAlert.title=איך להצפין קבצים
wrongFileAlert.message=האם ניסית להצפין את הקבצים האלו?
wrongFileAlert.description=לצורך כך, Cryptomator מספקת volume במנהל הקבצים של המערכת.
wrongFileAlert.instruction.0=כדי להצפין את הקבצים, בצע את השלבים הבאים:
wrongFileAlert.instruction.1=1. פתחו את הכספת.
wrongFileAlert.instruction.2=2. לחץ על ״הצג״ לפתיחת ה- volume במנהל הקבצים.
wrongFileAlert.instruction.3=3. הוסף את הקבצים שלך ל- volume הזה.
wrongFileAlert.link=לסיוע נוסף, בקר ב-
# Vault Options
## General
@@ -275,17 +405,32 @@ vaultOptions.general=כללי
vaultOptions.general.vaultName=שם הכספת
vaultOptions.general.autoLock.lockAfterTimePart1=נעילה לאחר חוסר שימוש של
vaultOptions.general.autoLock.lockAfterTimePart2=דקות
vaultOptions.general.unlockAfterStartup=פתח את הכספת בהפעלה של Cryptomator
vaultOptions.general.actionAfterUnlock=לאחר שחרור נעילה מוצלח
vaultOptions.general.actionAfterUnlock.ignore=אל תעשה דבר
vaultOptions.general.actionAfterUnlock.reveal=חשוף את הכונן
vaultOptions.general.actionAfterUnlock.ask=שאל
vaultOptions.general.startHealthCheckBtn=התחל בדיקת בריאות
## Mount
vaultOptions.mount=קישור
vaultOptions.mount.info=האפשרויות תלויות בסוג ה- volume הנבחר.
vaultOptions.mount.linkToPreferences=פתח את העדפות הכונן הוירטואלי
vaultOptions.mount.readonly=קריאה בלבד
vaultOptions.mount.customMountFlags=דגלים ידנים לקישור
vaultOptions.mount.winDriveLetterOccupied=בשימוש
vaultOptions.mount.mountPoint=נקודת עיגון
vaultOptions.mount.mountPoint.auto=בחר אוטומטית מיקום מתאים
vaultOptions.mount.mountPoint.driveLetter=השתמש באות הכונן המוקצאת
vaultOptions.mount.mountPoint.custom=השתמש בתיקיה שנבחרה
vaultOptions.mount.mountPoint.directoryPickerButton=בחר...
vaultOptions.mount.mountPoint.directoryPickerTitle=בחר תיקיה
## Master Key
vaultOptions.masterkey=סיסמה
vaultOptions.masterkey.changePasswordBtn=שנה סיסמה
vaultOptions.masterkey.forgetSavedPasswordBtn=שכח סיסמה שמורה
vaultOptions.masterkey.recoveryKeyExplanation=מפתח שחזור הינו הדרך היחידה לשחזור הגישה לכספת אם תאבד את הסיסמה.
vaultOptions.masterkey.showRecoveryKeyBtn=הצג את מפתח השחזור
vaultOptions.masterkey.recoverPasswordBtn=איפוס סיסמה
@@ -295,9 +440,14 @@ recoveryKey.display.title=הצגת מפתח השחזור
recoveryKey.create.message=דרושה סיסמה
recoveryKey.create.description=נא להזין את הססמא ל "%s" בכדי להציג את מפתח השחזור.
recoveryKey.display.description=המפתח שחזור שלהלן ניתן לשימוש בכדי לשחזר גישה ל "%s":
recoveryKey.display.StorageHints=שמור אותו במקום מאוד בטוח, לדוגמה:\n • שמור אותו במנהל סיסמאות\n • שמור אותו בדיסק און קי\n • הדפס אותו על נייר
## Reset Password
### Enter Recovery Key
recoveryKey.recover.title=איפוס סיסמה
recoveryKey.recover.prompt=הקש את מפתח השחזור שלך עבור ״%s״:
recoveryKey.recover.correctKey=מפתח ה recovery נכון
recoveryKey.recover.wrongKey=מפתח ה recovery שייך ל vault אחר
recoveryKey.recover.invalidKey=מפתח ה recovery שגוי
recoveryKey.printout.heading=מפתח שחזור של Cryptomator\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=איפוס
@@ -306,6 +456,11 @@ recoveryKey.recover.resetSuccess.message=איפוס סיסמה הצליח
recoveryKey.recover.resetSuccess.description=ניתן לפתוח את הכספת עם הסיסמה החדשה.
# New Password
newPassword.promptText=הקש סיסמה חדשה
newPassword.reenterPassword=לאימות, הקש שוב את הסיסמא החדשה
newPassword.passwordsMatch=הסיסמאות תואמות!
newPassword.passwordsDoNotMatch=הסיסמאות אינם תואמות
passwordStrength.messageLabel.tooShort=השתמש בלפחות %d תווים
passwordStrength.messageLabel.0=חלשה מאוד
passwordStrength.messageLabel.1=חלשה
passwordStrength.messageLabel.2=סבירה
@@ -315,8 +470,10 @@ passwordStrength.messageLabel.4=חזקה מאוד
# Quit
quit.title=יציאה
quit.message=קיימים vaults פתוחים
quit.description=נא אשר שאתה רוצה לצאת. Cryptomator יבצע נעילה מסודרת של כל הכספות הפתוחות למניעת אובדן מידע.
quit.lockAndQuitBtn=נעילה ויציאה
# Forced Quit
quit.forced.message=חלק מה vaults לא היו ניתנים לנעילה
quit.forced.description=נעילה כספות נחסמה על ידי תהליכים ממתינים או קבצים פתוחים. אתה יכול לנעול את הכספת בכוח, אולם הפרעה לפעולת קריאה וכתיבה עשויה לגרום לאובדן מידע לא שמור.
quit.forced.forceAndQuitBtn=נעילה בכח ויציאה

View File

@@ -128,7 +128,6 @@ hub.register.registerBtn=पुष्टि करें
hub.unauthorized.message=प्रवेश अस्वीकृत
### License Exceeded
# Lock
## Force
lock.forced.message=लॉक करना विफल हुआ

View File

@@ -123,7 +123,6 @@ hub.register.registerBtn=Potvrdi
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.message=Zaključavanje neuspješno
@@ -365,7 +364,7 @@ recoveryKey.display.StorageHints=Držite ga na sigurnom mjestu, npr.:\n • Pohr
## Reset Password
### Enter Recovery Key
recoveryKey.recover.prompt=Unesite ključ za oporavak za "%s":
recoveryKey.recover.validKey=Ovo je valjani ključ za oporavak
recoveryKey.recover.correctKey=Ovo je valjani ključ za oporavak
recoveryKey.printout.heading=Cryptomator-ov ključ za oporavak\n"%s"\n
### Reset Password
### Recovery Key Password Reset Success

View File

@@ -105,7 +105,7 @@ unlock.savePassword=Jelszó megjegyzése
unlock.unlockBtn=Feloldás
## Select
unlock.chooseMasterkey.description=Nem található a tároló kulcsfájlja a várt helyen. Kérjük válassza ki a kulcsfájlt manuálisan.
unlock.chooseMasterkey.filePickerTitle=Kulcsfájl kiválasztása
unlock.chooseMasterkey.filePickerTitle=Mesterkulcs fájl kiválasztása
## Success
unlock.success.description="%s" sikreresen feloldásra került! Mostmár hozzáférhet a virtuális trezorhoz.
unlock.success.rememberChoice=Jegyezze meg a választást és ne mutassa többet
@@ -115,12 +115,13 @@ unlock.success.revealBtn=Széf megjelenítése
### Waiting
### Receive Key
### Register Device
hub.register.occupiedMsg=Ez a név már használatban van
hub.register.registerBtn=Megerősítés
### Registration Success
### Registration Failed
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.message=A lezárás sikertelen volt
@@ -362,7 +363,9 @@ recoveryKey.display.StorageHints=Tartsa nagyon biztonságos helyen. pl.:\n •T
## Reset Password
### Enter Recovery Key
recoveryKey.recover.prompt=Írja be a visszaállítási kulcsát a következőhöz "%s":
recoveryKey.recover.validKey=Ez egy érvényes visszaállítási kulcs
recoveryKey.recover.correctKey=Ez a visszaállítási kulcs érvényes
recoveryKey.recover.wrongKey=Ez a visszaállítási kulcs egy másik széfhez tartozik
recoveryKey.recover.invalidKey=Ez a visszaállítási kulcs nem érvényes
recoveryKey.printout.heading=Cryptomator visszaállítási kulcs\n"%s"\n
### Reset Password
### Recovery Key Password Reset Success

View File

@@ -123,7 +123,6 @@ hub.register.registerBtn=Konfirmasi
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.message=Gagal mengunci
@@ -365,7 +364,7 @@ recoveryKey.display.StorageHints=Simpan di tempat yang sangat aman, misal.:\n
## Reset Password
### Enter Recovery Key
recoveryKey.recover.prompt=Masukkan kunci pemulihan untuk "%s":
recoveryKey.recover.validKey=Ini adalah kunci pemulihan yang valid
recoveryKey.recover.correctKey=Ini adalah kunci pemulihan yang valid
recoveryKey.printout.heading=Kunci Pemulihan Cryptomator\n"%s"\n
### Reset Password
### Recovery Key Password Reset Success

View File

@@ -154,9 +154,6 @@ hub.registerFailed.description=Si è verificato un errore nel processo di nomina
hub.unauthorized.message=Accesso negato
hub.unauthorized.description=Il tuo dispositivo non è ancora stato autorizzato ad accedere a questa cassaforte. Chiedi al proprietario della cassaforte di autorizzarlo.
### License Exceeded
hub.licenseExceeded.message=Licenza scaduta
hub.licenseExceeded.description=Cryptomator Hub ha dato accesso a più utenti rispetto ai suoi permessi di licenza. Contatta il tuo amministratore Hub per aggiornare la licenza o un amministratore del vault per rimuovere gli utenti dalle cassaforte.
# Lock
## Force
@@ -445,7 +442,7 @@ recoveryKey.display.StorageHints=Mantienilo da qualche parte molto sicuro, ad es
### Enter Recovery Key
recoveryKey.recover.title=Reimposta Password
recoveryKey.recover.prompt=Inserisci la tua chiave di recupero per "%s":
recoveryKey.recover.validKey=Questa è una chiave di recupero valida
recoveryKey.recover.correctKey=Questa è una chiave di recupero valida
recoveryKey.printout.heading=Chiave di recupero Cryptomator\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Reimposta

View File

@@ -126,6 +126,7 @@ unlock.success.revealBtn=ドライブを表示
unlock.error.customPath.message=カスタム パスに金庫をマウントできません
unlock.error.customPath.description.notSupported=カスタム パスを使い続けたい場合、環境設定に移動してサポートしているボリューム タイプを選択してください。もしくは、金庫のオプションに移動してサポートされるマウント ポイントを選択してください。
unlock.error.customPath.description.notExists=カスタム マウント パスが存在していません。ローカル ファイルシステムで作成するか、金庫のオプションで変更を加えてください。
unlock.error.customPath.description.generic=この金庫のカスタム・マウント・パスを選択しましたが、その使用は次のメッセージで失敗しました: %s
## Hub
hub.noKeychain.message=デバイス キーにアクセスできません
hub.noKeychain.description=ハブ金庫を解錠するには、キーチェーンが保護するデバイス キーが必要です。続行するには、"%s" を有効にし環境設定からキーチェーンを選択します。
@@ -153,9 +154,8 @@ hub.registerFailed.description=デバイス名登録中にエラーが発生し
hub.unauthorized.message=アクセスが拒否されました
hub.unauthorized.description=お使いのデバイスはまだこの金庫にアクセスする権限がありません。金庫のオーナーに権限を与えてもらってください。
### License Exceeded
hub.licenseExceeded.message=ライセンス数が不足していま
hub.licenseExceeded.description=Cryptomator Hubがライセンスの許可よりも多くのユーザーにアクセス権を与えています。ハブ管理者にライセンスをアップグレードするよう連絡するか金庫の管理者に金庫からユーザーを削除するよう連絡してください。
hub.invalidLicense.message=ハブライセンスが無効で
hub.invalidLicense.description=Cryptomator ハブインスタンスに無効なライセンスがあります。ライセンスをアップグレードまたは更新するには、ハブ管理者に連絡してください。
# Lock
## Force
@@ -171,8 +171,11 @@ lock.fail.description=金庫 "%s" を施錠できませんでした。保存さ
migration.title=金庫をアップグレード
## Start
migration.start.header=金庫をアップグレード
migration.start.text=Cryptomatorのこの新しいバージョンであなたの金庫「%s」を開くには、金庫を新しい形式にアップグレードする必要があります。これを行う前に、次のことを知っておく必要があります:
migration.start.remarkUndone=このアップグレードは取り消すことができません。
migration.start.remarkVersions=古い Cryptomator では、アップグレードされた金庫を開くことができなくなります。
migration.start.remarkCanRun=あなたが金庫にアクセスするすべてのデバイスは、Cryptomatorのこのバージョンを実行できることを確認する必要があります。
migration.start.remarkSynced=アップグレードする前に、このデバイスと他のデバイスで、金庫が完全に同期されていることを確認する必要があります。
migration.start.confirm=上記の情報を理解しました。
## Run
migration.run.enterPassword="%s" のパスワードを入力してください
@@ -273,7 +276,12 @@ preferences.interface.showTrayIcon=トレイアイコンを表示 (再起動が
preferences.volume=仮想ドライブ
preferences.volume.type=ボリューム タイプ (再起動が必要)
preferences.volume.type.automatic=自動
preferences.volume.docsTooltip=異なるボリュームタイプの詳細については、ドキュメントを確認してください。
preferences.volume.tcp.port=TCP ポート
preferences.volume.supportedFeatures=選択されたボリュームタイプは、以下の機能をサポートしています。
preferences.volume.feature.mountAuto=マウント先の自動選択
preferences.volume.feature.mountToDir=カスタムディレクトリをマウント先に指定
preferences.volume.feature.mountToDriveLetter=ドライブレターをマウント先に指定
preferences.volume.feature.mountFlags=カスタム マウント オプション
preferences.volume.feature.readOnly=読み取り専用マウント
## Updates
@@ -367,6 +375,7 @@ main.vaultDetail.stats=金庫の統計情報
main.vaultDetail.locateEncryptedFileBtn=暗号化されたファイルの場所
main.vaultDetail.locateEncryptedFileBtn.tooltip=暗号化された金庫のファイルを選択してください
main.vaultDetail.encryptedPathsCopied=パスをクリップボードにコピーしました!
main.vaultDetail.filePickerTitle=金庫内のファイルを選択
### Missing
main.vaultDetail.missing.info=Cryptomator はこの場所に金庫を見つけることができませんでした。
main.vaultDetail.missing.recheck=再確認
@@ -405,6 +414,7 @@ vaultOptions.general.startHealthCheckBtn=正常性チェックを開始
## Mount
vaultOptions.mount=マウント
vaultOptions.mount.info=オプションは、選択されたボリュームタイプによって異なります。
vaultOptions.mount.linkToPreferences=仮想ドライブの環境設定を開く
vaultOptions.mount.readonly=読み取り専用
vaultOptions.mount.customMountFlags=カスタム マウント フラグ
@@ -435,7 +445,9 @@ recoveryKey.display.StorageHints=十分に安全な場所に保存してくだ
### Enter Recovery Key
recoveryKey.recover.title=パスワードをリセット
recoveryKey.recover.prompt="%s" の回復キーを入力してください:
recoveryKey.recover.validKey=有効な回復キー
recoveryKey.recover.correctKey=有効な回復キー
recoveryKey.recover.wrongKey=この回復キーは別の金庫に属しています
recoveryKey.recover.invalidKey=この回復キーは有効ではありません
recoveryKey.printout.heading=Cryptomator 回復キー\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=リセット

View File

@@ -121,7 +121,6 @@ hub.register.registerBtn=확인
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.description=대기 중인 작동이나 파일이 열려있어 "%s"를 잠그는데 실패하였습니다. 이 Vault를 강제로 잠글 수 있으나, 입/출력의 중단은 저장되지 않은 데이터의 유실을 초래할 수 있습니다.
@@ -352,7 +351,7 @@ recoveryKey.display.StorageHints=매우 안전한곳에 보관하십시요. 예
## Reset Password
### Enter Recovery Key
recoveryKey.recover.prompt="%s"의 복구키를 입력하십시요:
recoveryKey.recover.validKey=올바른 복구 키 입니다
recoveryKey.recover.correctKey=올바른 복구 키 입니다
recoveryKey.printout.heading=Cryptomator 복구 키\n"%s"\n
### Reset Password
### Recovery Key Password Reset Success

View File

@@ -117,7 +117,6 @@ hub.register.registerBtn=Apstiprināt
### Unauthorized
### License Exceeded
# Lock
## Force
## Failure
@@ -255,7 +254,7 @@ recoveryKey.display.StorageHints=Glabājiet to drošā vietā, piemēram:\n 
## Reset Password
### Enter Recovery Key
recoveryKey.recover.prompt=Ievadiet "%s" atjaunošanas atslēgu:
recoveryKey.recover.validKey=Šī ir derīga atjaunošanas atslēga
recoveryKey.recover.correctKey=Šī ir derīga atjaunošanas atslēga
recoveryKey.printout.heading=Cryptomator atjaunošanas atslēga\n"%s" \n
### Reset Password
recoveryKey.recover.resetBtn=Atiestatīt

View File

@@ -39,7 +39,6 @@ hub.register.registerBtn=Потврди
### Unauthorized
### License Exceeded
# Lock
## Force
## Failure

View File

@@ -154,9 +154,6 @@ hub.registerFailed.description=Under navngivingsprosessen oppsto det en feilmeld
hub.unauthorized.message=Ingen tilgang
hub.unauthorized.description=Enheten din har ikke blitt autorisert til å få tilgang til dette hvelvet ennå. Spør hvelveieren om å tillate det.
### License Exceeded
hub.licenseExceeded.message=Lisensen overskredet
hub.licenseExceeded.description=Cryptomator Hub har gitt tilgang til flere brukere enn lisensen dens tillater. Vennligst kontakt Hub-administratoren din for å få oppgradert lisensen eller få en hvelv-administrator til å fjerne brukere fra hvelv.
# Lock
## Force
@@ -277,6 +274,7 @@ preferences.interface.showTrayIcon=Vis verktøykasseikon (krever omstart)
preferences.volume=Virtuell enhet
preferences.volume.type=Volumtype (krever omstart)
preferences.volume.type.automatic=Automatisk
preferences.volume.docsTooltip=Åpne dokumentasjonen for å lære mer om de forskjellige volumtypene.
preferences.volume.tcp.port=TCP Port
preferences.volume.supportedFeatures=Valgt volumtype støtter følgende funksjoner:
preferences.volume.feature.mountAuto=Valg av automatisk monteringspunkt
@@ -445,7 +443,9 @@ recoveryKey.display.StorageHints=Oppbevar den et veldig sikkert sted, f.eks. ved
### Enter Recovery Key
recoveryKey.recover.title=Nullstill passordet
recoveryKey.recover.prompt=Skriv inn gjenopprettingsnøkkelen for "%s":
recoveryKey.recover.validKey=Dette er en gyldig gjenopprettingsnøkkel
recoveryKey.recover.correctKey=Gjenopprettingsnøkkelen er gyldig
recoveryKey.recover.wrongKey=Gjenopprettingsnøkkelen tilhører et annet hvelv
recoveryKey.recover.invalidKey=Gjennopprettingsnøkkelen er ugyldig
recoveryKey.printout.heading=Cryptomator-gjenopprettingsnøkkel\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Nullstill

View File

@@ -154,9 +154,8 @@ hub.registerFailed.description=Er is een fout in het naamproces geworpen. Kijk i
hub.unauthorized.message=Toegang geweigerd
hub.unauthorized.description=Uw apparaat is nog niet gemachtigd om toegang te krijgen tot deze kluis. Vraag de eigenaar van de kluis om toestemming te geven.
### License Exceeded
hub.licenseExceeded.message=Licentie vervallen
hub.licenseExceeded.description=Cryptomator Hub heeft toegang gegeven aan meer gebruikers dan er licentievergunningen zijn. Neem contact op met uw Hub beheerder om de licentie of een kluisbeheerder te upgraden om gebruikers uit kluizen te verwijderen.
hub.invalidLicense.message=Hub Licentie ongeldig
hub.invalidLicense.description=Uw Cryptomator Hub installatie heeft een ongeldige licentie. Informeer een Hub administrator om de licentie te upgraden of te verlengen.
# Lock
## Force
@@ -277,6 +276,7 @@ preferences.interface.showTrayIcon=Pictogram in systeemvak weergeven (herstart v
preferences.volume=Virtuele schijf
preferences.volume.type=Type Volume (herstart vereist)
preferences.volume.type.automatic=Automatisch
preferences.volume.docsTooltip=Open de documentatie om meer te weten te komen over de verschillende volume types.
preferences.volume.tcp.port=TCP-poort
preferences.volume.supportedFeatures=Het gekozen volume type ondersteunt de volgende functies:
preferences.volume.feature.mountAuto=Automatische koppelpunt selectie
@@ -445,7 +445,9 @@ recoveryKey.display.StorageHints=Bewaar het op een veilige plek, bv:\n • Bewaa
### Enter Recovery Key
recoveryKey.recover.title=Wachtwoord resetten
recoveryKey.recover.prompt=Voer uw herstelsleutel in voor "%s":
recoveryKey.recover.validKey=Dit is een geldige herstelsleutel
recoveryKey.recover.correctKey=Deze herstelsleutel is geldig
recoveryKey.recover.wrongKey=Deze herstelsleutel behoort tot een andere kluis
recoveryKey.recover.invalidKey=Deze herstelsleutel is niet geldig
recoveryKey.printout.heading=Cryptomator herstelsleutel\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Resetten

View File

@@ -104,7 +104,6 @@ unlock.success.revealBtn=Gjer eininga synleg
### Unauthorized
### License Exceeded
# Lock
## Force
## Failure
@@ -255,7 +254,6 @@ recoveryKey.display.StorageHints=Ta vare på han ein veldig sikker stad, t.d. ve
## Reset Password
### Enter Recovery Key
recoveryKey.recover.prompt=Skriv inn gjenopprettingsnøkkelen for "%s":
recoveryKey.recover.validKey=Dette er ein gyldig gjenopprettingsnøkkel
recoveryKey.printout.heading=Cryptomator-gjenopprettingsnøkkel\n"%s"\n
### Reset Password
### Recovery Key Password Reset Success

View File

@@ -106,7 +106,6 @@ unlock.success.revealBtn=ਡਰਾਇਵ ਦਿਖਾਓ
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.description=ਬਾਕੀ ਰਹਿੰਦੀਆਂ ਕਾਰਵਾਈਆਂ ਜਾਂ ਫ਼ਾਈਲਾਂ ਖੁੱਲ੍ਹਣ ਕਰਕੇ "%s" ਲਾਕ ਕਰਨ ਨੂੰ ਰੋਕਿਆ ਗਿਆ ਹੈ। ਤੁਸੀਂ ਇਸ ਵਾਲਟ ਨੂੰ ਧੱਕੇ ਨਾਲ ਲਾਕ ਕਰ ਸਕਦੇ ਹੋ, ਪਰ I/O ਵਿੱਚ ਰੁਕਾਵਟ ਪਾਉਣ ਨਾਲ ਨਾ-ਸੰਭਾਲਿਆ ਡਾਟਾ ਖਤਮ ਹੋ ਜਾ ਸਕਦਾ ਹੈ।
@@ -292,7 +291,7 @@ recoveryKey.display.StorageHints=ਇਸ ਨੂੰ ਕਿਸੇ ਥਾਂ ਬਹ
## Reset Password
### Enter Recovery Key
recoveryKey.recover.prompt='%s" ਲਈ ਆਪਣਾ ਰਿਕਵਰੀ ਕੁੰਜੀ ਦਿਓ:
recoveryKey.recover.validKey=ਇਹ ਜਾਇਜ਼ ਰਿਕਰਵੀ ਕੁੰਜੀ ਹੈ
recoveryKey.recover.correctKey=ਇਹ ਜਾਇਜ਼ ਰਿਕਰਵੀ ਕੁੰਜੀ ਹੈ
recoveryKey.printout.heading=Cryptomator ਰਿਕਵਰੀ ਕੁੰਜੀ\n"%s"\n
### Reset Password
### Recovery Key Password Reset Success

View File

@@ -124,7 +124,7 @@ unlock.success.rememberChoice=Zapamiętaj wybór, nie pokazuj tego ponownie
unlock.success.revealBtn=Pokaż Dysk
## Failure
unlock.error.customPath.message=Nie można zamontować sejfu na niestandardowej ścieżce
unlock.error.customPath.description.notSupported=Jeśli chcesz nadal używać niestandardowej ścieżki, przejdź do preferencji i wybierz typ woluminu, który ją obsługuje. W przeciwnym razie przejdź do opcji sejfu i wybierz obsługiwany punkt montowania.
unlock.error.customPath.description.notSupported=Jeśli chcesz nadal używać niestandardowej ścieżki, przejdź do preferencji i wybierz typ udziału, który ją obsługuje. W przeciwnym razie przejdź do opcji sejfu i wybierz obsługiwany punkt montowania.
unlock.error.customPath.description.notExists=Niestandardowa ścieżka montowania nie istnieje. Stwórz ją w lokalnym systemie plików lub zmień ją w opcjach sejfu.
unlock.error.customPath.description.generic=Wybrałeś niestandardową ścieżkę montowania dla tego sejfu, ale użycie jej nie powiodło się z wiadomością: %s
## Hub
@@ -154,9 +154,8 @@ hub.registerFailed.description=Wystąpił błąd podczas ustawiania nazwy. Aby u
hub.unauthorized.message=Brak dostępu
hub.unauthorized.description=Twoje urządzenie nie zostało jeszcze upoważnione do dostępu do tego sejfu. Poproś właściciela sejfu o autoryzację.
### License Exceeded
hub.licenseExceeded.message=Przekroczono licencję
hub.licenseExceeded.description=Cryptomator Hub dał dostęp większej ilości użytkowników, niż pozwala na to licencja. Proszę skontaktować się z administratorem Hub, aby ulepszyć licencję lub z administratorem sejfu, aby usunąć użytkowników z sejfu.
hub.invalidLicense.message=Nieważna licencja Huba
hub.invalidLicense.description=Twoja instancja Hub ma nieprawidłową licencję. Poproś administratora Hub o uaktualnienie lub odnowienie licencji.
# Lock
## Force
@@ -275,10 +274,11 @@ preferences.interface.showMinimizeButton=Pokaż przycisk minimalizacji
preferences.interface.showTrayIcon=Pokaż ikonę zasobnika (wymaga restartu)
## Volume
preferences.volume=Dysk wirtualny
preferences.volume.type=Typ woluminu (wymaga ponownego uruchomienia)
preferences.volume.type=Typ udziału (wymaga ponownego uruchomienia)
preferences.volume.type.automatic=Automatyczny
preferences.volume.docsTooltip=Sprawdź dokumentację, aby dowiedzieć się więcej o różnych typach udziałów.
preferences.volume.tcp.port=Port TCP
preferences.volume.supportedFeatures=Wybrany typ woluminu obsługuje następujące funkcje:
preferences.volume.supportedFeatures=Wybrany typ udziału obsługuje następujące funkcje:
preferences.volume.feature.mountAuto=Automatyczny wybór punktu montowania
preferences.volume.feature.mountToDir=Niestandardowy katalog jako punkt montowania
preferences.volume.feature.mountToDriveLetter=Litera dysku jako punkt montowania
@@ -372,6 +372,10 @@ main.vaultDetail.throughput.idle=bezczynny
main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
main.vaultDetail.stats=Statystyki sejfu
main.vaultDetail.locateEncryptedFileBtn=Zlokalizuj zaszyfrowany plik
main.vaultDetail.locateEncryptedFileBtn.tooltip=Wybierz plik z sejfu, aby zlokalizować jego zaszyfrowany odpowiednik
main.vaultDetail.encryptedPathsCopied=Ścieżki skopiowane do schowka!
main.vaultDetail.filePickerTitle=Wybierz plik wewnątrz sejfu
### Missing
main.vaultDetail.missing.info=Cryptomator nie mógł znaleźć sejfu w tej lokalizacji.
main.vaultDetail.missing.recheck=Ponów próbę
@@ -410,7 +414,7 @@ vaultOptions.general.startHealthCheckBtn=Rozpocznij Test Spójności
## Mount
vaultOptions.mount=Montowanie
vaultOptions.mount.info=Opcje zależą od wybranego typu woluminu.
vaultOptions.mount.info=Opcje zależą od wybranego typu udziału.
vaultOptions.mount.linkToPreferences=Otwórz ustawienia dysku wirtualnego
vaultOptions.mount.readonly=Tylko do odczytu
vaultOptions.mount.customMountFlags=Własne flagi montowania udziału
@@ -441,7 +445,9 @@ recoveryKey.display.StorageHints=Trzymaj go w bezpiecznym miejscu, np.\n • Prz
### Enter Recovery Key
recoveryKey.recover.title=Resetuj hasło
recoveryKey.recover.prompt=Wprowadź swój klucz odzyskiwania dla "%s":
recoveryKey.recover.validKey=To jest prawidłowy klucz odzyskiwania
recoveryKey.recover.correctKey=To jest prawidłowy klucz odzyskiwania
recoveryKey.recover.wrongKey=Ten klucz należy do innego sejfu
recoveryKey.recover.invalidKey=Ten klucz jest nieprawidłowy
recoveryKey.printout.heading=Cryptomator - Klucz odzyskiwania "%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Resetuj

View File

@@ -123,6 +123,7 @@ unlock.success.description="%s" desbloqueado com sucesso! O seu cofre está agor
unlock.success.rememberChoice=Lembrar escolha, não mostrar isto novamente
unlock.success.revealBtn=Revelar unidade
## Failure
unlock.error.customPath.message=Não é possível montar o cofre no caminho personalizado
## Hub
hub.noKeychain.message=Não foi possível aceder à chave do dispositivo
hub.noKeychain.description=Para desbloquear os cofres do Hub, é necessária uma chave do dispositivo, que é protegida usando um porta-chaves. Para continuar, ative “%s” e selecione um porta-chaves nas preferências.
@@ -150,9 +151,8 @@ hub.registerFailed.description=Houve um erro no processo de nomear. Para mais de
hub.unauthorized.message=Acesso negado
hub.unauthorized.description=O seu dispositivo ainda não foi autorizado a aceder a este cofre. Peça ao proprietário do cofre para o autorizar.
### License Exceeded
hub.licenseExceeded.message=Licença excedida
hub.licenseExceeded.description=O Hub do Cryptomator deu acesso a mais utilizadores do que as suas licenças de licença. Entre em contacto com o administrador do Hub para atualizar a licença ou um administrador do cofre para remover utilizadores dos cofres.
hub.invalidLicense.message=Licença Hub inválida
hub.invalidLicense.description=O pedido do seu Cryptomator Hub tem uma licença inválida. Informe um administrador do Hub para atualizar ou renovar a licença.
# Lock
## Force

View File

@@ -154,9 +154,6 @@ hub.registerFailed.description=Ocorreu um erro no processo de nomeação do disp
hub.unauthorized.message=Acesso negado
hub.unauthorized.description=Seu dispositivo ainda não foi autorizado a acessar este cofre. Peça ao proprietário ou a um administrador deste cofre para autorizá-lo.
### License Exceeded
hub.licenseExceeded.message=No. de licenças excedido
hub.licenseExceeded.description=O Cryptomator Hub deu acesso a mais usuários do que sua licença de uso permite. Entre em contato com o administrador do seu Cryptomator Hub para ele atualizar o número de licenças ou com um administrador do cofre para remover usuários dos cofres.
# Lock
## Force
@@ -445,7 +442,7 @@ recoveryKey.display.StorageHints=Mantenha-a em um lugar bem seguro, por exemplo:
### Enter Recovery Key
recoveryKey.recover.title=Redefinir Senha
recoveryKey.recover.prompt=Digite sua chave de recuperação para "%s":
recoveryKey.recover.validKey=Esta é uma chave de recuperação válida
recoveryKey.recover.correctKey=Esta é uma chave de recuperação válida
recoveryKey.printout.heading=Chave de Recuperação do Cryptomator\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Redefinir

View File

@@ -123,6 +123,10 @@ unlock.success.description=Deblocat "%s" cu succes! Seiful dvs. este acum accesi
unlock.success.rememberChoice=Ține minte alegerea, nu mai arăta asta din nou
unlock.success.revealBtn=Dezvăluie partiția
## Failure
unlock.error.customPath.message=Nu se poate monta seiful în locația alesă
unlock.error.customPath.description.notSupported=Dacă doriți să continuați să utilizați locația aleasă, vă rugăm să mergeți la preferințe și să selectați o unitate de stocare suportată. În caz contrar, mergeți la opțiunile seifului și alegeți o locație de montare suportată.
unlock.error.customPath.description.notExists=Locația de montare aleasă nu există. Creați-o în sistemul de fișiere local sau schimbați-o din opțiunile seifului.
unlock.error.customPath.description.generic=Ați selectat o locație de montare pentru acest seif, dar utilizarea ei a eșuat cu mesajul: %s
## Hub
hub.noKeychain.message=Cheia dispozitivului nu a putut fi accesată
hub.noKeychain.description=Pentru a debloca seifele de tip Hub, este necesară o cheie a dispozitivului, care este securizată prin intermediul unui keychain. Pentru a continua, activați „%s” și selectați un keychain în preferințe.
@@ -150,9 +154,6 @@ hub.registerFailed.description=O eroare a fost întâmpinata în procesul de den
hub.unauthorized.message=Acces respins
hub.unauthorized.description=Dispozitivul dvs. nu a fost autorizat să acceseze acest seif. Solicitați proprietarului seifului să va autorizeze accesul.
### License Exceeded
hub.licenseExceeded.message=Numărul de licențe a fost depășit
hub.licenseExceeded.description=Cryptomator Hub a permis accesul la mai mulți utilizatori decât licența permite. Vă rugăm să contactați administratorul Hub-ului dumneavoastră pentru a actualiza licența sau un administrator de seif pentru a elimina utilizatorii din seifuri.
# Lock
## Force
@@ -271,7 +272,10 @@ preferences.interface.showMinimizeButton=Arată butonul de minimizare
preferences.interface.showTrayIcon=Arată tray icon (necesită repornire)
## Volume
preferences.volume=Unitate virtuală
preferences.volume.type=Tip unitate de stocare (necesită repornire)
preferences.volume.type.automatic=Automat
preferences.volume.docsTooltip=Deschideți documentația pentru a afla mai multe despre tipurile diferite de unități de stocare.
preferences.volume.tcp.port=Portul TCP
## Updates
preferences.updates=Actualizări
preferences.updates.currentVersion=Versiunea actuală: %s
@@ -424,7 +428,9 @@ recoveryKey.display.StorageHints=Păstrați cheia de recuperare undeva foarte si
### Enter Recovery Key
recoveryKey.recover.title=Resetează Parola
recoveryKey.recover.prompt=Introduceți cheia de recuperare pentru "%s:
recoveryKey.recover.validKey=Aceasta este o cheie de recuperare validă
recoveryKey.recover.correctKey=Cheia de recuperare este validă
recoveryKey.recover.wrongKey=Cheia de recuperare aparţine unui alt seif
recoveryKey.recover.invalidKey=Cheia de recuperare nu este validă
recoveryKey.printout.heading=Cheia de recuperare Cryptomator\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Resetează

View File

@@ -123,7 +123,7 @@ unlock.success.description=Разблокировка "%s" успешно вып
unlock.success.rememberChoice=Запомнить выбор и больше не спрашивать
unlock.success.revealBtn=Показать диск
## Failure
unlock.error.customPath.message=Невозможно смонтировать хранилище на указанный путь
unlock.error.customPath.message=Невозможно смонтировать хранилище по указанному пути
unlock.error.customPath.description.notSupported=Если вы хотите продолжить использование пользовательского пути, перейдите в настройки и выберите тип тома, который его поддерживает. В противном случае, перейдите в настройки хранилища и выберите поддерживаемую точку монтирования.
unlock.error.customPath.description.notExists=Пользовательский путь монтирования не существует. Либо создайте его в локальной файловой системе, либо измените в параметрах хранилища.
unlock.error.customPath.description.generic=Вы выбрали свой путь монтирования этого хранилища, но его нельзя использовать: %s
@@ -154,9 +154,8 @@ hub.registerFailed.description=Ошибка присвоения имени. Б
hub.unauthorized.message=Нет доступа
hub.unauthorized.description=Устройство ещё не авторизовано для доступа к этому хранилищу. Попросите владельца хранилища разрешить его.
### License Exceeded
hub.licenseExceeded.message=Срок действия лицензии истёк
hub.licenseExceeded.description=Cryptomator Hub предоставил доступ большему количеству пользователей, чем разрешено лицензией. Обратитесь к администратору Hub для обновления лицензии или администратора хранилища, чтобы удалить пользователей из хранилищ.
hub.invalidLicense.message=Лицензия хаба недействительна
hub.invalidLicense.description=У вашего хаба Cryptomator неверная лицензия. Попросите администратора хаба обновить или продлить лицензию.
# Lock
## Force
@@ -277,12 +276,13 @@ preferences.interface.showTrayIcon=Показывать значок в пане
preferences.volume=Виртуальный диск
preferences.volume.type=Тип тома (требуется перезапуск)
preferences.volume.type.automatic=Автоматически
preferences.volume.docsTooltip=Откройте документацию, чтобы узнать больше о различных типах томов.
preferences.volume.tcp.port=Порт TCP
preferences.volume.supportedFeatures=Выбранный тип тома поддерживает следующие функции:
preferences.volume.feature.mountAuto=Выбор точки автомонтирования
preferences.volume.feature.mountToDir=Своя папка как точка монтирования
preferences.volume.feature.mountToDriveLetter=Буква диска как точка монтирования
preferences.volume.feature.mountFlags=Настройки монтирования
preferences.volume.feature.mountFlags=Параметры монтирования
preferences.volume.feature.readOnly=Монтирование только для чтения
## Updates
preferences.updates=Обновления
@@ -445,7 +445,9 @@ recoveryKey.display.StorageHints=Храните его в надёжном ме
### Enter Recovery Key
recoveryKey.recover.title=Сброс пароля
recoveryKey.recover.prompt=Введите ключ восстановления для "%s":
recoveryKey.recover.validKey=Это действительный ключ восстановления
recoveryKey.recover.correctKey=Это действительный ключ восстановления
recoveryKey.recover.wrongKey=Этот ключ восстановления от другого хранилища
recoveryKey.recover.invalidKey=Этот ключ восстановления недействителен
recoveryKey.printout.heading=Ключ восстановления Cryptomator\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Сброс

View File

@@ -54,7 +54,6 @@ unlock.unlockBtn=අගුළුහරින්න
### Unauthorized
### License Exceeded
# Lock
## Force
## Failure

View File

@@ -123,6 +123,7 @@ unlock.success.description=Odomknutie "%s" úspešné! Váš trezor je už prís
unlock.success.rememberChoice=Zapamätať voľbu, už viac nezobrazovať
unlock.success.revealBtn=Odkryť disk
## Failure
unlock.error.customPath.message=Nie je možné namapovať trezor na uživateĺskej ceste
## Hub
hub.noKeychain.message=Nemôžem pristúpiť ku kľúču zariadenia
hub.noKeychain.description=V poradí odomknutia Hub trezorov, je požadovaný kľúč zariadenia ktorý je zabezpečený použitím keychain. K vykonaniu povoľte "%s" a zvoľte keychain v nastaveniach.
@@ -150,9 +151,8 @@ hub.registerFailed.description=Vznikla chyba počas pomenovávacieho procesu. Pr
hub.unauthorized.message=Prístup zamietnutý
hub.unauthorized.description=Vaše zaradenie zatiaľ ešte nebolo autorizované pre pristúp tohto trezora. Požiadajte majiteľa trezora o autorizovanie.
### License Exceeded
hub.licenseExceeded.message=Licencia prekročená
hub.licenseExceeded.description=Cryptomator Hub má prístup pre viac užívateľov ako povoľuje licencia. Prosím kontaktujte svojho Hub administrátora pre aktualizovanie licencie alebo admina trezoru pre odstránenie užívateľov z trezorov.
hub.invalidLicense.message=Neplatná licencia Hub-u
hub.invalidLicense.description=Vaša inštancia Cryptomator Hub-uneplatnú licenciu. Prosím informujte Hub administrátora pre aktualizáciu alebo obnovenie licencie.
# Lock
## Force
@@ -272,6 +272,7 @@ preferences.interface.showTrayIcon=Ukázať ikonu na sytémovej lište (vyžaduj
## Volume
preferences.volume=Virtuálny disk
preferences.volume.type.automatic=Automaticky
preferences.volume.docsTooltip=Pre viac informácií ohľadne iných typov volume otvorte dokumentáciu.
preferences.volume.tcp.port=TCP port
preferences.volume.feature.mountFlags=Vlastné parametre mapovania
preferences.volume.feature.readOnly=Mapovanie len na čítanie
@@ -436,7 +437,9 @@ recoveryKey.display.StorageHints=Uchovávajte ho na bezpečnom mieste, ako napr.
### Enter Recovery Key
recoveryKey.recover.title=Resetovanie hesla
recoveryKey.recover.prompt=Zadajte Váš kľúč obnovy pre "%s":
recoveryKey.recover.validKey=Toto je platný kľúč obnovy
recoveryKey.recover.correctKey=Toto je platný kľúč obnovy
recoveryKey.recover.wrongKey=Tento kľúč obnovy patrí inému trezoru
recoveryKey.recover.invalidKey=Toto je neplatný kľúč obnovy
recoveryKey.printout.heading=Kľúč obnovy Cryptomator-a\n "%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Resetovať

View File

@@ -54,7 +54,6 @@ error.technicalDetails=Podrobnosti:
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.retryBtn=Poizkusi znova
@@ -79,6 +78,7 @@ lock.forced.retryBtn=Poizkusi znova
## General
## Interface
## Volume
preferences.volume.docsTooltip=Informacije o različnih podatkovnih nosilcih najdete v navodilih.
## Updates
## Contribution
#<-- Add entries for donations and code/translation/documentation contribution -->
@@ -117,6 +117,9 @@ main.vaultDetail.locateEncryptedFileBtn=Poišči šifrirano datoteko
## Display Recovery Key
## Reset Password
### Enter Recovery Key
recoveryKey.recover.correctKey=Obnovitveni ključ je pravilen
recoveryKey.recover.wrongKey=Ta obnovitveni ključ se ujema z drugim trezorjem
recoveryKey.recover.invalidKey=Obnovitveni ključ ni pravilen
### Reset Password
### Recovery Key Password Reset Success

View File

@@ -111,7 +111,6 @@ unlock.success.revealBtn=Otvori disk
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.description=Zaključavanje "%s" je blokirano operacijama na čekanju ili otvorenim datotekama. Možete prisilno zaključati ovaj sef, međutim prekid "I/O" operacija može rezultirati gubitkom nesačuvanih podataka.
@@ -304,7 +303,7 @@ recoveryKey.display.StorageHints=Чувајте га на веома сигур
## Reset Password
### Enter Recovery Key
recoveryKey.recover.prompt=Унесите резервни кључ за "%s":
recoveryKey.recover.validKey=Ово је исправан резервни кључ
recoveryKey.recover.correctKey=Ово је исправан резервни кључ
recoveryKey.printout.heading=Cryptomator Резервни Кључ\n"%s"\n
### Reset Password
### Recovery Key Password Reset Success

View File

@@ -104,7 +104,6 @@ unlock.success.revealBtn=Otvori disk
### Unauthorized
### License Exceeded
# Lock
## Force
## Failure

View File

@@ -154,9 +154,8 @@ hub.registerFailed.description=Ett fel uppstod i namngivningsprocessen. För mer
hub.unauthorized.message=Åtkomst nekad
hub.unauthorized.description=Din enhet har ännu inte behörighet att komma åt detta valv. Be valvägaren att godkänna det.
### License Exceeded
hub.licenseExceeded.message=Licensen överskriden
hub.licenseExceeded.description=Cryptomator Hub har gett tillgång till fler användare än licensen medger. Kontakta din Hub-administratör för att uppgradera licensen eller en valvadministratör för att minska antalet användare i valv.
hub.invalidLicense.message=Din Hub-licens är ogiltig
hub.invalidLicense.description=Din Cryptomator Hub-instans har en ogiltig licens. Vänligen informera en Hub administratör för att uppgradera eller förnya licensen.
# Lock
## Force
@@ -277,6 +276,7 @@ preferences.interface.showTrayIcon=Visa ikon i aktivitetsfältet (kräver omstar
preferences.volume=Virtuell enhet
preferences.volume.type=Volymtyp (kräver omstart)
preferences.volume.type.automatic=Automatiskt
preferences.volume.docsTooltip=Öppna dokumentationen för att läsa mer om de olika volymtyperna.
preferences.volume.tcp.port=TCP-port
preferences.volume.supportedFeatures=Den valda volymtypen stöder följande funktioner:
preferences.volume.feature.mountAuto=Automatiskt val av monteringspunkt
@@ -437,7 +437,9 @@ recoveryKey.display.StorageHints=Spara den på en säker plats, t.ex:\n • I en
### Enter Recovery Key
recoveryKey.recover.title=Återställ lösenord
recoveryKey.recover.prompt=Ange din återställningsnyckel för "%s":
recoveryKey.recover.validKey=Detta är en giltig återställningsnyckel
recoveryKey.recover.correctKey=Denna återställningsnyckel är korrekt
recoveryKey.recover.wrongKey=Denna återställningsnyckel tillhör ett annat valv
recoveryKey.recover.invalidKey=Denna återställningsnyckel är ogiltig
recoveryKey.printout.heading=Cryptomator återställningsnyckel\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Återställ

View File

@@ -147,9 +147,6 @@ hub.registerFailed.description=Hitilafu imetupwa katika mchakato wa kumtaja. Kwa
hub.unauthorized.message=Ufikiaji umekataliwa
hub.unauthorized.description=Kifaa chako bado hakijaidhinishwa kufikia kuba hii. Uliza mwenye kuba aidhinishe.
### License Exceeded
hub.licenseExceeded.message=Leseni imepitwa
hub.licenseExceeded.description=Cryptomator Hub imetoa ufikiaji kwa watumiaji zaidi ya vibali vyake vya leseni. Tafadhali wasiliana na msimamizi wako wa Hub ili kuboresha leseni au msimamizi wa kuba ili kuondoa watumiaji kwenye kuba.
# Lock
## Force
@@ -397,7 +394,7 @@ recoveryKey.display.StorageHints=Weka mahali salama sana, kwa mfano:\n • Hifad
### Enter Recovery Key
recoveryKey.recover.title=Fufua Neno la siri
recoveryKey.recover.prompt=Ingiza ufunguo wako wa kurejesha kwa "%s":
recoveryKey.recover.validKey=Hii ni ufunguo halali wa kurejesha
recoveryKey.recover.correctKey=Hii ni ufunguo halali wa kurejesha
recoveryKey.printout.heading=Ufunguo wa Urejeshaji wa Cryptomator\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Weka upya

View File

@@ -126,7 +126,6 @@ unlock.success.revealBtn=இயக்ககத்தை வெளிப்பட
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.message=பூட்டுதல் தோல்வியடைந்தது

View File

@@ -38,7 +38,6 @@
### Unauthorized
### License Exceeded
# Lock
## Force
lock.forced.retryBtn=మళ్ళీ చేయండి

View File

@@ -97,7 +97,6 @@ unlock.unlockBtn=ปลดล็อก
### Unauthorized
### License Exceeded
# Lock
## Force
## Failure

View File

@@ -150,9 +150,6 @@ hub.registerFailed.description=İsimlendirme işleminde bir hata oluştu. Daha f
hub.unauthorized.message=Erişim engellendi
hub.unauthorized.description=Cihazınıza henüz bu kasaya erişim yetkisi verilmedi. Kasa sahibinden yetkilendirmesini isteyin.
### License Exceeded
hub.licenseExceeded.message=Lisans aşıldı
hub.licenseExceeded.description=Cryptomator Hub, lisansının izin verdiğinden daha fazla kullanıcıya erişim sağladı. Lisansı yükseltmek için lütfen Hub yöneticinizle veya kullanıcıları kasalardan kaldırmak için bir kasa yöneticisiyle iletişime geçin.
# Lock
## Force
@@ -428,7 +425,7 @@ recoveryKey.display.StorageHints=Bunu çok güvenli bir yerde saklayın, örneğ
### Enter Recovery Key
recoveryKey.recover.title=Şifreyi Sıfırla
recoveryKey.recover.prompt="%s" için kurtarma anahtarınızı girin:
recoveryKey.recover.validKey=Bu geçerli bir kurtarma anahtarı
recoveryKey.recover.correctKey=Bu geçerli bir kurtarma anahtarı
recoveryKey.printout.heading=Cryptomator Kurtarma Anahtarı\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Sıfırla

View File

@@ -146,9 +146,6 @@ hub.registerFailed.description=Виникла помилка у процесі
hub.unauthorized.message=У доступі відмовлено
hub.unauthorized.description=Ваш пристрій ще не має прав доступу до цього vault. Попросіть власника vault надати їх.
### License Exceeded
hub.licenseExceeded.message=Кількість користувачів перевищено
hub.licenseExceeded.description=Cryptomator Hub надав доступ більшій кількості користувачів, ніж дозволяє ліцензія. Будь ласка, зверніться до адміністратора вашого Hub, щоб покращити ліцензію або адміністратора vault, щоб видалити користувачів з vaults.
# Lock
## Force

View File

@@ -145,7 +145,6 @@ hub.unauthorized.message=Truy cập bị từ chối
hub.unauthorized.description=Thiết bị của bạn chưa được phép truy cập vault này. Yêu cầu chủ sở hữu cấp phép.
### License Exceeded
# Lock
## Force
lock.forced.message=Khóa thất bại
@@ -375,7 +374,7 @@ recoveryKey.display.StorageHints=Giữ ở một nơi rất an toàn, ví dụ:\
### Enter Recovery Key
recoveryKey.recover.title=Đặt lại Mật khẩu
recoveryKey.recover.prompt=Nhập khóa khôi phục của bạn cho "%s":
recoveryKey.recover.validKey=Đây là khóa khôi phục hợp lệ
recoveryKey.recover.correctKey=Đây là khóa khôi phục hợp lệ
recoveryKey.printout.heading=Khóa Khôi phục Cryptomator\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=Đặt lại

View File

@@ -15,7 +15,7 @@ generic.button.next=下一步
generic.button.print=打印
# Error
error.message=错误 %s
error.message=发生错误
error.description=糟糕Cryptomator 未料到会发生这种情况。您可以查找该错误的现有解决方案;或者,如果是新错误,请随时向我们报告。
error.hyperlink.lookup=查找该错误
error.hyperlink.report=报告该错误
@@ -61,7 +61,7 @@ addvaultwizard.new.validCharacters.numbers=位数
addvaultwizard.new.validCharacters.dashes=连字符 (%s) 或下划线 (%s)
### Password
addvaultwizard.new.createVaultBtn=创建保险库
addvaultwizard.new.generateRecoveryKeyChoice=如果没有密码,您将无法访问您的数据。您想要一个恢复密钥以防您丢失密码吗?
addvaultwizard.new.generateRecoveryKeyChoice=如果丢失密码,您将无法访问您的数据。您想要创建一个恢复密钥以防您丢失密码吗?
addvaultwizard.new.generateRecoveryKeyChoice.yes=好的,有备无患
addvaultwizard.new.generateRecoveryKeyChoice.no=不,谢谢。我不会丢失密码的
### Information
@@ -72,9 +72,9 @@ addvault.new.readme.storageLocation.3=请勿
addvault.new.readme.storageLocation.4=• 更改此目录内的任何文件或者
addvault.new.readme.storageLocation.5=• 将任何文件粘贴到此目录内以进行加密
addvault.new.readme.storageLocation.6=如果你想要加密文件并查看保险库的内容,请执行以下操作:
addvault.new.readme.storageLocation.7=1. 将此保险库添加到Cryptomator
addvault.new.readme.storageLocation.8=2. 在Cryptomator中解锁保险库
addvault.new.readme.storageLocation.9=3. 通过点击“显示”按钮打开访问路径
addvault.new.readme.storageLocation.7=1. 将此保险库添加到Cryptomator
addvault.new.readme.storageLocation.8=2. 在Cryptomator中解锁保险库
addvault.new.readme.storageLocation.9=3. 通过点击“显示”按钮打开访问路径
addvault.new.readme.storageLocation.10=如果您需要帮助,请阅读文档: %s
addvault.new.readme.accessLocation.fileName=欢迎.rtf
addvault.new.readme.accessLocation.1=🔐️ 加密卷 🔐️
@@ -140,33 +140,32 @@ hub.receive.message=正在处理响应…
hub.receive.description=Cryptomator 正在接收和处理来自 Hub 的响应,请稍等
### Register Device
hub.register.message=设备名称(必填)
hub.register.description=这似乎是设备的首次 Hub 访问。为了识别它以进行访问授权,您需要命名此设备
hub.register.description=这似乎是设备的首次 Hub 访问。为了识别它以进行访问授权,您需要命名此设备
hub.register.nameLabel=设备名称
hub.register.occupiedMsg=名称已被占用
hub.register.registerBtn=
hub.register.registerBtn=
### Registration Success
hub.registerSuccess.message=设备命名成功
hub.registerSuccess.description=要访问保险库,设备需得到保险库所有者的授权
hub.registerSuccess.description=要访问保险库,设备需得到保险库所有者的授权
### Registration Failed
hub.registerFailed.message=设备命名失败
hub.registerFailed.description=命名过程中出现错误,详情请查看应用程序日志
hub.registerFailed.description=命名过程中出现错误,详情请查看应用程序日志
### Unauthorized
hub.unauthorized.message=拒绝访问
hub.unauthorized.description=您的设备尚未授权访问此保险库,请联系保险库所有者
hub.unauthorized.description=您的设备尚未授权访问此保险库,请联系保险库所有者
### License Exceeded
hub.licenseExceeded.message=许可证已逾期
hub.licenseExceeded.description=Cryptomator Hub 允许访问的用户数量超过其许可证允许的数量,请联系您的 Hub 管理员升级许可证或联系保险库管理员删除用户
hub.invalidLicense.message=Hub 许可证无效
hub.invalidLicense.description=Cryptomator Hub 实例许可证无效请联系Hub管理员升级或者续订许可证。
# Lock
## Force
lock.forced.message=锁定失败
lock.forced.description=锁定 "%s" 被挂起的操作或使用中的文件中断。您可以强制锁定此保险库,不过请注意打断 I/O 可能导致未保存的数据丢失
lock.forced.description=锁定 "%s" 因进行中的操作或已打开的文件而被阻止。您可以强制锁定此保险库,不过请注意中断读写可能导致未保存的数据丢失
lock.forced.retryBtn=重试
lock.forced.forceBtn=强制锁定
## Failure
lock.fail.message=锁定保险库失败
lock.fail.description=保险库 "%s" 无法锁定。请确保其他地方保存未保存的工作,以及重要的 "读/写" 操作已完成。为了顺利关闭保险库,请查杀 Cryptomator 进程
lock.fail.description=保险库 "%s" 无法锁定。请确保已经保存其他地方未保存的工作,以及重要的读写操作已完成。为了顺利关闭保险库,请终止 Cryptomator 进程
# Migration
migration.title=升级保险库
@@ -266,17 +265,18 @@ preferences.interface.theme.automatic=自动
preferences.interface.theme.dark=深色
preferences.interface.theme.light=浅色
preferences.interface.unlockThemes=解锁暗黑模式
preferences.interface.language=语言 (需重启)
preferences.interface.language=语言需重启
preferences.interface.language.auto=系统默认
preferences.interface.interfaceOrientation=界面方向
preferences.interface.interfaceOrientation.ltr=从左到右
preferences.interface.interfaceOrientation.rtl=从右到左
preferences.interface.showMinimizeButton=显示最小化按钮
preferences.interface.showTrayIcon=显示托盘图标 (需重启)
preferences.interface.showTrayIcon=显示托盘图标需重启
## Volume
preferences.volume=虚拟磁盘
preferences.volume.type=卷类型(需重启)
preferences.volume.type.automatic=自动
preferences.volume.docsTooltip=打开文档以了解有关不同卷类型的更多信息
preferences.volume.tcp.port=TCP 端口
preferences.volume.supportedFeatures=选定的卷类型支持以下功能:
preferences.volume.feature.mountAuto=自动选择挂载点
@@ -292,7 +292,7 @@ preferences.updates.checkNowBtn=立即检查
preferences.updates.updateAvailable=可更新到版本 %s
## Contribution
preferences.contribute=支持我们
preferences.contribute.registeredFor=注册署名 %s 的赞助者证书
preferences.contribute.registeredFor=为 %s 注册支持者证书
preferences.contribute.noCertificate=支持 Cryptomator 并获得一份支持者证书。它类似于许可证密钥,特别之处是提供给使用免费软件的牛人的 ;-)
preferences.contribute.getCertificate=还没有该证书吗?了解您如何获取
preferences.contribute.promptText=在这里粘贴赞助者证书码
@@ -353,7 +353,7 @@ main.vaultlist.contextMenu.reveal=显示驱动器
main.vaultlist.addVaultBtn=添加保险库
## Vault Detail
### Welcome
main.vaultDetail.welcomeOnboarding=感谢您使用 Cryptomator 来保护您的文件。如果您需要任何帮助,请查看正显示的快速开始指南:
main.vaultDetail.welcomeOnboarding=感谢您使用 Cryptomator 来保护您的文件。如果您需要任何帮助,请查看我们的快速开始指南:
### Locked
main.vaultDetail.lockedStatus=已锁定
main.vaultDetail.unlockBtn=解锁…
@@ -391,7 +391,7 @@ main.vaultDetail.error.windowTitle=加载保险库时出错
# Wrong File Alert
wrongFileAlert.title=如何加密文件
wrongFileAlert.message=试图要加密这些文件吗?
wrongFileAlert.message=要加密这些文件吗?
wrongFileAlert.description=为了实现加密Cryptomator 在系统文件管理器中提供一个卷
wrongFileAlert.instruction.0=要加密文件,请遵循以下步骤:
wrongFileAlert.instruction.1=1. 解锁您的保险库;
@@ -405,7 +405,7 @@ vaultOptions.general=常规​​​​​
vaultOptions.general.vaultName=保险库名称
vaultOptions.general.autoLock.lockAfterTimePart1=空闲超时
vaultOptions.general.autoLock.lockAfterTimePart2=分钟后自动锁定
vaultOptions.general.unlockAfterStartup=启动 Cryptomator 时解锁保险库 (此功能需先勾选保存密码)
vaultOptions.general.unlockAfterStartup=启动 Cryptomator 时解锁保险库此功能需先勾选保存密码
vaultOptions.general.actionAfterUnlock=解锁成功后的操作
vaultOptions.general.actionAfterUnlock.ignore=什么也不做
vaultOptions.general.actionAfterUnlock.reveal=显示驱动器
@@ -429,7 +429,7 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=选择目录
vaultOptions.masterkey=密码
vaultOptions.masterkey.changePasswordBtn=更改密码
vaultOptions.masterkey.forgetSavedPasswordBtn=忘记保存的密码
vaultOptions.masterkey.recoveryKeyExplanation=忘记密码时,恢复密钥是你恢复保险库访问权限的唯一方式!
vaultOptions.masterkey.recoveryKeyExplanation=忘记密码时,恢复密钥是你恢复保险库访问权限的唯一方式!
vaultOptions.masterkey.showRecoveryKeyBtn=显示恢复密钥
vaultOptions.masterkey.recoverPasswordBtn=重置密码
@@ -440,12 +440,14 @@ recoveryKey.display.title=显示恢复密钥
recoveryKey.create.message=密码是必填的
recoveryKey.create.description=输入您的密码以显示"%s"的恢复密钥:
recoveryKey.display.description=下面的恢复密钥可用于恢复对"%s"的访问:
recoveryKey.display.StorageHints=保存到非常安全的某处,例如:\n • 使用密码管理器来保存\n • 将其保存在USB闪存盘\n • 打印在纸上
recoveryKey.display.StorageHints=将它保存到非常安全的地方,例如:\n • 使用密码管理器来保存\n • 将其保存在U盘\n • 在纸上打印
## Reset Password
### Enter Recovery Key
recoveryKey.recover.title=重置密码
recoveryKey.recover.prompt=输入 "%s" 的恢复密钥:
recoveryKey.recover.validKey=这是一个有效的恢复密钥
recoveryKey.recover.correctKey=这是正确的恢复密钥
recoveryKey.recover.wrongKey=此恢复密钥属于另一个保管库
recoveryKey.recover.invalidKey=此恢复密钥无效
recoveryKey.printout.heading=Cryptomator 恢复密钥\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=重置
@@ -468,10 +470,10 @@ passwordStrength.messageLabel.4=非常强
# Quit
quit.title=退出程序
quit.message=存在已解锁的保险库
quit.description=请确认退出动作Cryptomator 将会温和地锁定所有已解锁的保险库,以防止数据丢失
quit.description=请确认退出动作Cryptomator 将会适时地锁定所有已解锁的保险库,以防止数据丢失
quit.lockAndQuitBtn=锁定并退出
# Forced Quit
quit.forced.message=无法锁定某些保险库
quit.forced.description=锁定保险库被挂起的操作或使用中的文件中断。您可以强制锁定剩余的保险库,不过请注意打断 I/O 可能导致未保存的数据丢失
quit.forced.description=锁定保险库因进行中的操作或已打开的文件被阻止。您可以强制锁定剩余的保险库,不过请注意中断读写可能导致未保存的数据丢失
quit.forced.forceAndQuitBtn=强制并退出

View File

@@ -123,7 +123,13 @@ unlock.success.description=成功解鎖「%s」現在可以存取你的加密
unlock.success.rememberChoice=記得這個決定,不要再詢問
unlock.success.revealBtn=展示磁碟
## Failure
unlock.error.customPath.message=無法掛載加密庫於此自定路徑
unlock.error.customPath.description.notSupported=若要繼續使用自定路徑,請在設定選取支援此自定路徑的空間/加密空間類型;或者,在加密庫選項中選擇一個受支援的掛載點。
unlock.error.customPath.description.notExists=自定路徑不存在。請在本機文件系統指定另一路徑或在加密庫選項中變更。
unlock.error.customPath.description.generic=已為加密庫設定了自定路徑,但是運作時出現錯誤:%s
## Hub
hub.noKeychain.message=無法訪問設備密鑰
hub.noKeychain.openBtn=開啟偏好設定
### Waiting
hub.auth.message=等待認證中…
hub.auth.description=您將被自動傳送到登入頁面。
@@ -147,9 +153,8 @@ hub.registerFailed.description=命名過程中引發錯誤。有關詳細信息
hub.unauthorized.message=拒絕存取
hub.unauthorized.description=您的設備權限尚未允許存取加密庫,請聯絡加密庫擁有者
### License Exceeded
hub.licenseExceeded.message=软件許可已滿額
hub.licenseExceeded.description=Cryptomator Hub 的被授予授權的使用者的數量,多於許可證容許的使用者數量。 請聯絡 Cryptomator Hub 管理員升級授權,或聯絡加密庫管理員從加密庫移除使用者
hub.invalidLicense.message=Hub 授權無效
hub.invalidLicense.description=Cryptomator Hub 實例授權無效,請聯繫管理員升級或續訂授權
# Lock
## Force
@@ -165,6 +170,9 @@ lock.fail.description=加密庫「%s」無法被鎖定。請確保未存檔的
migration.title=升級加密庫
## Start
migration.start.header=升級加密庫
migration.start.text=若要開啟%s加密庫需要將加密庫升級至新的格式。在此之前您需要先了解以下的事項
migration.start.remarkUndone=此升級操作無法撤銷或回復。
migration.start.remarkVersions=舊版 Cryptomator 將無法開啟已升級的加密庫。
migration.start.confirm=我已閱讀並理解上述資訊
## Run
migration.run.enterPassword=輸入「%s」的密碼
@@ -262,6 +270,7 @@ preferences.interface.showTrayIcon=顯示系統工作列圖示 (需重新啟動)
## Volume
preferences.volume=虛擬磁碟
preferences.volume.type.automatic=自動
preferences.volume.docsTooltip=閱讀文檔以了解各加密空間類型。
## Updates
preferences.updates=更新
preferences.updates.currentVersion=目前版本:%s
@@ -414,7 +423,9 @@ recoveryKey.display.StorageHints=請把它保存在非常安全的地方,例
### Enter Recovery Key
recoveryKey.recover.title=重設密碼
recoveryKey.recover.prompt=輸入「%s」的復原金鑰
recoveryKey.recover.validKey=這是有效的復原金鑰
recoveryKey.recover.correctKey=這是有效的復原金鑰
recoveryKey.recover.wrongKey=此復原金鑰屬於另一個加密庫
recoveryKey.recover.invalidKey=此復原金鑰無效
recoveryKey.printout.heading=Cryptomator 復原金鑰\n「%s」\n
### Reset Password
recoveryKey.recover.resetBtn=重設

View File

@@ -6,7 +6,7 @@ generic.button.apply=套用
generic.button.back=上一頁
generic.button.cancel=取消
generic.button.change=修改
generic.button.choose=選取…
generic.button.choose=选择...
generic.button.close=關閉
generic.button.copy=複製
generic.button.copied=已複製!
@@ -15,9 +15,9 @@ generic.button.next=繼續
generic.button.print=列印
# Error
error.message=錯誤%s
error.message=出現錯誤
error.description=糟糕Cryptomator 發生了預期外的錯誤。您可以嘗試查找該錯誤的現有解決方案,如果是新錯誤,請隨時向我們報告。
error.hyperlink.lookup=查找錯誤
error.hyperlink.lookup=查找錯誤
error.hyperlink.report=回報錯誤
error.technicalDetails=詳情:
@@ -62,11 +62,11 @@ addvaultwizard.new.validCharacters.dashes=連字符 (%s) 或下劃線 (%s)
### Password
addvaultwizard.new.createVaultBtn=新建加密檔案庫
addvaultwizard.new.generateRecoveryKeyChoice=若您遺失密碼將無法存取您的資料。您是否希望建立一組在您遺失密碼時可供復原的金鑰?
addvaultwizard.new.generateRecoveryKeyChoice.yes=是,做好安全措施,以免後悔莫及。
addvaultwizard.new.generateRecoveryKeyChoice.no=否,不用,我不會丟失密碼
addvaultwizard.new.generateRecoveryKeyChoice.yes=好的,有備無患
addvaultwizard.new.generateRecoveryKeyChoice.no=否,謝謝,我不會丟失密碼
### Information
addvault.new.readme.storageLocation.fileName=重要.rtf
addvault.new.readme.storageLocation.1=⚠️ 加密檔案庫的檔案 ⚠️
addvault.new.readme.storageLocation.1=⚠️ 加密檔案庫文件 ⚠️
addvault.new.readme.storageLocation.2=這是您加密檔案庫儲存的位置。
addvault.new.readme.storageLocation.3=不要
addvault.new.readme.storageLocation.4=• 修改這個資料夾中的任何檔案或是
@@ -85,9 +85,9 @@ addvault.new.readme.accessLocation.4=您可以放心移除這個檔案。
addvaultwizard.existing.instruction=請選擇現有加密檔案庫中名為「vault.cryptomator」的檔案。如果只有一個名為「masterkey.cryptomator」的檔案則選擇該檔案。
addvaultwizard.existing.chooseBtn=選取…
addvaultwizard.existing.filePickerTitle=選取加密檔案庫的檔案
addvaultwizard.existing.filePickerMimeDesc=Cryptomator 加密庫
addvaultwizard.existing.filePickerMimeDesc=Cryptomator 加密檔案
## Success
addvaultwizard.success.nextStepsInstructions=已加入加密檔案庫%s。您需要將這個加密檔案庫解鎖以存取內容,或是您也可以之後再解鎖。
addvaultwizard.success.nextStepsInstructions=已加入加密檔案庫 "%s"。您需要將這個加密檔案庫解鎖以存取內容,或是您也可以之後再解鎖。
addvaultwizard.success.unlockNow=立即解鎖
# Remove Vault
@@ -98,7 +98,7 @@ removeVault.confirmBtn=移除加密檔案庫
# Change Password
changepassword.title=變更密碼
changepassword.enterOldPassword=輸入「%s」目前的密碼
changepassword.enterOldPassword=輸入 "%s" 目前的密碼
changepassword.finalConfirmation=我明白如果忘記密碼將無法存取資料
# Forget Password
@@ -109,13 +109,13 @@ forgetPassword.confirmBtn=忘記密碼
# Unlock
unlock.title=解鎖 %s
unlock.passwordPrompt=輸入「%s」的密碼:
unlock.passwordPrompt=輸入 "%s" 的密碼:
unlock.savePassword=記住密碼
unlock.unlockBtn=解鎖
## Select
unlock.chooseMasterkey.message=未找到Masterkey檔案
unlock.chooseMasterkey.message=未找到主金鑰文件
unlock.chooseMasterkey.description=無法在其預期位置找到此加密檔案庫的主密鑰檔案。請手動選擇密鑰文件。
unlock.chooseMasterkey.filePickerTitle=選擇主金鑰檔案
unlock.chooseMasterkey.filePickerTitle=选择主金鑰文件
unlock.chooseMasterkey.filePickerMimeDesc=Cryptomator 主密鑰
## Success
unlock.success.message=解鎖成功
@@ -123,6 +123,10 @@ unlock.success.description=成功解鎖「%s」您現在可以存取您的加
unlock.success.rememberChoice=記得這個決定,不要再顯示
unlock.success.revealBtn=顯示磁碟
## Failure
unlock.error.customPath.message=無法將檔案庫掛載至自訂路徑
unlock.error.customPath.description.notSupported=如果要繼續使用自訂的掛載路徑,必須變更成支援的磁區空間類型,不然就必須使用不同的掛載路徑
unlock.error.customPath.description.notExists=自訂的掛載路徑並不存在‧ 請在本機創立該路徑,或者在加密庫選項中更改
unlock.error.customPath.description.generic=你選擇使用自訂的路徑來掛載此加密庫,但是掛載失敗,原因: %s
## Hub
hub.noKeychain.message=無法讀取裝置金鑰
hub.noKeychain.description=需要由鑰匙圈保護的裝置金鑰才能解鎖Hub加密檔案庫。請先至偏好設定中啟用「%s」並選擇一組鑰匙圈。
@@ -150,9 +154,8 @@ hub.registerFailed.description=命名過程中出現錯誤。更多詳情,請
hub.unauthorized.message=拒絕存取
hub.unauthorized.description=您的設備權限尚未允許存取檔案庫,請聯絡檔案庫擁有者
### License Exceeded
hub.licenseExceeded.message=软件許可已滿額
hub.licenseExceeded.description=Cryptomator Hub已授權的使用者已超過軟件許可的數量。請聯絡您的Hub管理員升級許可證或聯絡檔案庫管理員移除用戶
hub.invalidLicense.message=Hub 授權無效
hub.invalidLicense.description=Cryptomator Hub 實例授權無效,請聯繫管理員升級或續訂授權
# Lock
## Force
@@ -161,7 +164,7 @@ lock.forced.description=仍有未完成的操作或開啟中的檔案以致無
lock.forced.retryBtn=重試
lock.forced.forceBtn=強制鎖定
## Failure
lock.fail.message=鎖定加密檔案庫失敗
lock.fail.message=鎖定加密檔案庫失敗
lock.fail.description=加密檔案庫 "%s" 無法被鎖定。請確保未存檔的工作已儲存在別的地方以及重要的讀寫工作都已經完成。請強制結束 Cryptomator 以關閉加密檔案庫。
# Migration
@@ -171,11 +174,12 @@ migration.start.header=升級加密檔案庫
migration.start.text=為了在此新版的Cryptomator裡打開"%s"檔案庫,該檔案庫需要升級到新的格式。在此操作之前,您需要知道以下事項:
migration.start.remarkUndone=此項升級無法還原。
migration.start.remarkVersions=舊版的Cryptomator無法打開升級後的文库。
migration.start.remarkCanRun=請確認所有可存取此加密庫的裝置都可以運行這個版本的Cryptomator.
migration.start.remarkSynced=您必須確保您的檔案庫在升級之前已經完整地同步到此設備及您的其他設備。
migration.start.confirm=我已閱讀並理解上述資訊
## Run
migration.run.enterPassword=輸入 "%s" 的密碼
migration.run.startMigrationBtn=升級加密檔案庫
migration.run.startMigrationBtn=迁移加密檔案庫
migration.run.progressHint=這可能需要一點時間…
## Success
migration.success.nextStepsInstructions=已成功升級 "%s"。\n您現在可以解鎖您的加密檔案庫了。
@@ -196,7 +200,7 @@ migration.impossible.moreInfo=此加密檔案庫仍可被舊版本開啟。如
## Start
health.title=對於"%s"的健康檢查
health.intro.header=健康檢查
health.intro.text=運行狀況檢查用於檢測並修復加密檔案庫內部結構中的問題。請記住:
health.intro.text=運行狀況檢查包含一系列用於檢測並修復加密檔案庫內部結構中的問題的檢查。請記住:
health.intro.remarkSync=確保所有設備完全同步,這可以解決大部分問題。
health.intro.remarkFix=並非所有問題都可以解決。
health.intro.remarkBackup=如果數據已損壞,則只有備份才有幫助。
@@ -224,11 +228,16 @@ health.check.detail.listFilters.label=過濾
health.check.detail.fixAllSpecificBtn=解決全部問題
health.check.exportBtn=匯出報告
## Result view
health.result.severityFilter.all=過濾等級 - 所有
health.result.severityFilter.good=良好
health.result.severityFilter.info=訊息
health.result.severityFilter.warn=警告
health.result.severityFilter.crit=狀態嚴重
health.result.severityFilter.crit=危急
health.result.severityTip.good=程度: 良好\n加密庫結構完整
health.result.severityTip.info=程度: 詳細\n加密庫結構完整建議修復。
health.result.severityTip.warn=嚴重性:警告\n檔案庫結構被破壞強烈建議修復。
health.result.severityTip.crit=嚴重性:嚴重\n檔案庫結構被破壞數據已經丟失。
health.result.fixStateFilter.all=修復狀態全部
health.result.fixStateFilter.all=修復狀態 - 全部
health.result.fixStateFilter.fixable=可修復
health.result.fixStateFilter.notFixable=無法修復
health.result.fixStateFilter.fixing=修復中…
@@ -258,14 +267,23 @@ preferences.interface.theme.light=亮色
preferences.interface.unlockThemes=解鎖暗色模式
preferences.interface.language=語言 (需要重新啟動)
preferences.interface.language.auto=系統預設
preferences.interface.interfaceOrientation=界面排版方向
preferences.interface.interfaceOrientation=界面方向
preferences.interface.interfaceOrientation.ltr=由左至右
preferences.interface.interfaceOrientation.rtl=由右至左
preferences.interface.showMinimizeButton=顯示最小化按鈕
preferences.interface.showTrayIcon=顯示系統工作列圖示 (需要重新啟動)
## Volume
preferences.volume=虛擬磁碟
preferences.volume.type.automatic=自動
preferences.volume.type=磁區類別 (須重啟)
preferences.volume.type.automatic=自动
preferences.volume.docsTooltip=打開文檔以了解有關不同磁區類型更多信息。
preferences.volume.tcp.port=TCP 埠
preferences.volume.supportedFeatures=所選擇的磁區空間類別支援下列功能
preferences.volume.feature.mountAuto=自動選擇掛載路徑
preferences.volume.feature.mountToDir=使用自訂資料夾路徑來掛載
preferences.volume.feature.mountToDriveLetter=使用硬盤符號來當掛載路徑
preferences.volume.feature.mountFlags=自訂掛載選項
preferences.volume.feature.readOnly=只讀取掛載 (無法變更)
## Updates
preferences.updates=更新
preferences.updates.currentVersion=目前版本:%s
@@ -353,9 +371,9 @@ main.vaultDetail.bytesPerSecondWritten=寫入:
main.vaultDetail.throughput.idle=閒置
main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
main.vaultDetail.stats=加密檔案庫統計數據
main.vaultDetail.stats=加密檔案庫統計
main.vaultDetail.locateEncryptedFileBtn=顯示加密檔案路徑
main.vaultDetail.locateEncryptedFileBtn.tooltip=從加密檔案庫中選擇一個檔案來顯示對應加密檔案路徑
main.vaultDetail.locateEncryptedFileBtn.tooltip=選擇要顯示對應加密檔案路徑的加密檔案庫檔案
main.vaultDetail.encryptedPathsCopied=路徑已複製到剪貼簿
main.vaultDetail.filePickerTitle=從加密檔案庫中選擇檔案
### Missing
@@ -374,7 +392,7 @@ main.vaultDetail.error.windowTitle=載入加密檔案庫時出錯
# Wrong File Alert
wrongFileAlert.title=如何加密檔案
wrongFileAlert.message=您試著加密這些檔案嗎?
wrongFileAlert.description=如果是這樣Cryptomator 可以在您的檔案管裡產生一個磁區。
wrongFileAlert.description=为此Cryptomator 在您的檔案管裡產生一個磁區。
wrongFileAlert.instruction.0=請依下列步驟加密檔案:
wrongFileAlert.instruction.1=1. 解鎖您的加密檔案庫。
wrongFileAlert.instruction.2=2. 點擊「顯示」可在檔案總管中檢視磁區。
@@ -389,13 +407,15 @@ vaultOptions.general.autoLock.lockAfterTimePart1=空閒時鎖定
vaultOptions.general.autoLock.lockAfterTimePart2=分鐘
vaultOptions.general.unlockAfterStartup=啟動 Cryptomator 時解鎖加密檔案庫
vaultOptions.general.actionAfterUnlock=成功解鎖後
vaultOptions.general.actionAfterUnlock.ignore=不執行任何動作
vaultOptions.general.actionAfterUnlock.ignore=動作
vaultOptions.general.actionAfterUnlock.reveal=顯示磁碟
vaultOptions.general.actionAfterUnlock.ask=詢問
vaultOptions.general.startHealthCheckBtn=開始健康檢查
## Mount
vaultOptions.mount=掛載
vaultOptions.mount.info=選項會依據掛載磁區類別而變更
vaultOptions.mount.linkToPreferences=開啟虛擬硬盤設置
vaultOptions.mount.readonly=唯讀
vaultOptions.mount.customMountFlags=自訂掛載參數
vaultOptions.mount.winDriveLetterOccupied=已使用
@@ -409,7 +429,7 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=選擇一個路徑
vaultOptions.masterkey=密碼
vaultOptions.masterkey.changePasswordBtn=變更密碼
vaultOptions.masterkey.forgetSavedPasswordBtn=清除已存密碼
vaultOptions.masterkey.recoveryKeyExplanation=您遺失密碼時,僅能以復原金鑰恢復存取
vaultOptions.masterkey.recoveryKeyExplanation=如果您遺失密碼,恢復金鑰是您唯一恢復對保險箱存取權限的方法
vaultOptions.masterkey.showRecoveryKeyBtn=顯示復原金鑰
vaultOptions.masterkey.recoverPasswordBtn=重設密碼
@@ -417,16 +437,18 @@ vaultOptions.masterkey.recoverPasswordBtn=重設密碼
# Recovery Key
## Display Recovery Key
recoveryKey.display.title=顯示恢復金鑰
recoveryKey.create.message=需要密碼
recoveryKey.create.description=請輸入您的密碼以顯示 "%s" 的復金鑰:
recoveryKey.display.description=下方的復金鑰可用來恢復 "%s" 的存取能力:
recoveryKey.display.StorageHints=請把它保存在非常安全的地方,例如:\n • 使用密碼管理器保管\n • 存在 USB 隨身碟裡\n • 印在紙上
recoveryKey.create.message=需要填寫密碼
recoveryKey.create.description=請輸入您的密碼以顯示 "%s" 的復金鑰:
recoveryKey.display.description=下方的復金鑰可用來恢復 "%s" 的存取能力:
recoveryKey.display.StorageHints=請把它保存在安全的地方,例如:\n • 使用密碼管理器保管\n • 存在 USB 隨身碟裡\n • 印在紙上
## Reset Password
### Enter Recovery Key
recoveryKey.recover.title=重設密碼
recoveryKey.recover.prompt=輸入 "%s" 的復金鑰:
recoveryKey.recover.validKey=這是有效的復原金鑰
recoveryKey.printout.heading=Cryptomator 復原金鑰\n"%s"\n
recoveryKey.recover.prompt=輸入 "%s" 的復金鑰:
recoveryKey.recover.correctKey=這是一個正確的恢復金鑰
recoveryKey.recover.wrongKey=此恢復金鑰屬於不同的加密檔案庫
recoveryKey.recover.invalidKey=這是一個無效的恢復金鑰
recoveryKey.printout.heading=Cryptomator 恢復金鑰\n"%s"\n
### Reset Password
recoveryKey.recover.resetBtn=重設
### Recovery Key Password Reset Success
@@ -437,7 +459,7 @@ recoveryKey.recover.resetSuccess.description=您可以用新設的密碼解鎖
newPassword.promptText=輸入新密碼
newPassword.reenterPassword=確認新密碼
newPassword.passwordsMatch=密碼相符!
newPassword.passwordsDoNotMatch=密碼不符
newPassword.passwordsDoNotMatch=密碼不符
passwordStrength.messageLabel.tooShort=密碼長度至少需 %d 個字元
passwordStrength.messageLabel.0=非常弱
passwordStrength.messageLabel.1=
@@ -446,12 +468,12 @@ passwordStrength.messageLabel.3=強
passwordStrength.messageLabel.4=非常強
# Quit
quit.title=結束應用程式
quit.message=仍有已啟用的檔案庫
quit.description=請確認結束動作。Cryptomator將會鎖定所有已開啟的檔案庫以防止資料流失。
quit.title=結束程式
quit.message=仍有已解鎖的檔案庫
quit.description=請確認結束動作。Cryptomator將會適時地鎖定所有已解鎖的檔案庫以防止資料流失。
quit.lockAndQuitBtn=鎖定並離開
# Forced Quit
quit.forced.message=某些檔案庫無法鎖定
quit.forced.description=仍有未完成的作業或開啟中的檔案以致無法鎖定。您可以強制鎖定這個檔案庫,不過中斷讀寫可能導致資料遺失或未被儲存
quit.forced.description=因為進行中的操作或已經打開的檔案被阻止,無法鎖定加密檔案庫。您可以強制鎖定其餘的加密檔案庫,但請注意,中斷讀寫可能導致未保存的數據丟失
quit.forced.forceAndQuitBtn=強制並結束

View File

@@ -38,7 +38,7 @@
<!-- Apache Commons-cli false positives below -->
<suppress>
<notes><![CDATA[
False positive for commons-cli due, see https://github.com/jeremylong/DependencyCheck/pull/4148
False positive for commons-cli due, see https://github.com/jeremylong/DependencyCheck/pull/4148
]]></notes>
<gav regex="true">^commons\-cli:commons\-cli:.*$</gav>
<cpe>cpe:/a:apache:james</cpe>
@@ -46,4 +46,22 @@
<cpe>cpe:/a:spirit-project:spirit</cpe>
<cpe>cpe:/a:apache:commons_net</cpe>
</suppress>
<suppress>
<notes><![CDATA[
False positive for jackson-core-2.13.4.jar, see https://github.com/jeremylong/DependencyCheck/issues/5502
]]></notes>
<packageUrl regex="true">^pkg:maven/com\.fasterxml\.jackson\.core/jackson\-core@.*$</packageUrl>
<cve>CVE-2022-45688</cve>
</suppress>
<suppress>
<notes><![CDATA[
Suppress false positive, because com.google.common.io.Files.getTempDir() is not used
]]></notes>
<packageUrl regex="true">^pkg:maven/com\.google\.guava/guava@.*$</packageUrl>
<vulnerabilityName>CVE-2020-8908</vulnerabilityName>
<cve>CVE-2020-8908</cve>
</suppress>
</suppressions>