mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-14 08:41:28 +00:00
Merge branch 'develop' into release/1.10.0
This commit is contained in:
24
.github/dependabot.yml
vendored
Normal file
24
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "maven"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
day: "monday"
|
||||
time: "06:00"
|
||||
timezone: "UTC"
|
||||
groups:
|
||||
all: # one PR for all dependencies
|
||||
patterns:
|
||||
- "*"
|
||||
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/" # even for `.github/workflows`
|
||||
schedule:
|
||||
interval: "monthly"
|
||||
groups:
|
||||
all: # one PR for all actions
|
||||
patterns:
|
||||
- "*"
|
||||
labels:
|
||||
- "misc:ci"
|
||||
11
.github/workflows/appimage.yml
vendored
11
.github/workflows/appimage.yml
vendored
@@ -54,7 +54,7 @@ jobs:
|
||||
--verbose
|
||||
--output runtime
|
||||
--module-path "${JAVA_HOME}/jmods"
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.crypto.ec,jdk.security.auth,jdk.accessibility,jdk.management.jfr
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.crypto.ec,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net
|
||||
--strip-native-commands
|
||||
--no-header-files
|
||||
--no-man-pages
|
||||
@@ -80,7 +80,7 @@ jobs:
|
||||
--copyright "(C) 2016 - 2023 Skymatic GmbH"
|
||||
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
|
||||
--java-options "--enable-preview"
|
||||
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64"
|
||||
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator"
|
||||
--java-options "-Xss5m"
|
||||
--java-options "-Xmx256m"
|
||||
--java-options "-Dcryptomator.appVersion=\"${{ needs.get-version.outputs.semVerStr }}\""
|
||||
@@ -92,7 +92,8 @@ jobs:
|
||||
--java-options "-Dcryptomator.p12Path=\"@{userhome}/.config/Cryptomator/key.p12\""
|
||||
--java-options "-Dcryptomator.ipcSocketPath=\"@{userhome}/.config/Cryptomator/ipc.socket\""
|
||||
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/.local/share/Cryptomator/mnt\""
|
||||
--java-options "-Dcryptomator.showTrayIcon=false"
|
||||
--java-options "-Dcryptomator.showTrayIcon=true"
|
||||
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"@{appdir}/usr/share/icons/hicolor/symbolic/apps\""
|
||||
--java-options "-Dcryptomator.buildNumber=\"appimage-${{ needs.get-version.outputs.revNum }}\""
|
||||
--add-launcher Cryptomator-gtk2=launcher-gtk2.properties
|
||||
--resource-dir dist/linux/resources
|
||||
@@ -103,6 +104,10 @@ jobs:
|
||||
cp dist/linux/common/org.cryptomator.Cryptomator256.png Cryptomator.AppDir/usr/share/icons/hicolor/256x256/apps/org.cryptomator.Cryptomator.png
|
||||
cp dist/linux/common/org.cryptomator.Cryptomator512.png Cryptomator.AppDir/usr/share/icons/hicolor/512x512/apps/org.cryptomator.Cryptomator.png
|
||||
cp dist/linux/common/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg
|
||||
cp dist/linux/common/org.cryptomator.Cryptomator.tray.svg Cryptomator.AppDir/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.tray.svg
|
||||
cp dist/linux/common/org.cryptomator.Cryptomator.tray-unlocked.svg Cryptomator.AppDir/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.tray-unlocked.svg
|
||||
cp dist/linux/common/org.cryptomator.Cryptomator.tray.svg Cryptomator.AppDir/usr/share/icons/hicolor/symbolic/apps/org.cryptomator.Cryptomator.tray-symbolic.svg
|
||||
cp dist/linux/common/org.cryptomator.Cryptomator.tray-unlocked.svg Cryptomator.AppDir/usr/share/icons/hicolor/symbolic/apps/org.cryptomator.Cryptomator.tray-unlocked-symbolic.svg
|
||||
cp dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml Cryptomator.AppDir/usr/share/metainfo/org.cryptomator.Cryptomator.metainfo.xml
|
||||
cp dist/linux/common/org.cryptomator.Cryptomator.desktop Cryptomator.AppDir/usr/share/applications/org.cryptomator.Cryptomator.desktop
|
||||
cp dist/linux/common/application-vnd.cryptomator.vault.xml Cryptomator.AppDir/usr/share/mime/packages/application-vnd.cryptomator.vault.xml
|
||||
|
||||
4
.github/workflows/debian.yml
vendored
4
.github/workflows/debian.yml
vendored
@@ -17,8 +17,8 @@ on:
|
||||
|
||||
env:
|
||||
JAVA_VERSION: 20
|
||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/20.0.1/openjfx-20.0.1_linux-x64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/20.0.1/openjfx-20.0.1_linux-aarch64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_linux-x64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_linux-aarch64_bin-jmods.zip'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
8
.github/workflows/mac-dmg.yml
vendored
8
.github/workflows/mac-dmg.yml
vendored
@@ -36,15 +36,15 @@ jobs:
|
||||
output-suffix: x64
|
||||
xcode-path: '/Applications/Xcode_13.2.1.app'
|
||||
fuse-lib: macFUSE
|
||||
openjfx-url: https://download2.gluonhq.com/openjfx/20.0.1/openjfx-20.0.1_osx-x64_bin-jmods.zip
|
||||
openjfx-sha: 4fcd4bc3cd0edeb899108109e42a0c5a2d87d14a195d11199060862eb6d887b5
|
||||
openjfx-url: https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_osx-x64_bin-jmods.zip
|
||||
openjfx-sha: 55b8ff7453d59c89ae129f6c9c5ad7b09a5d359568811b376ac1766c14d6a17c
|
||||
- os: [self-hosted, macOS, ARM64]
|
||||
architecture: aarch64
|
||||
output-suffix: arm64
|
||||
xcode-path: '/Applications/Xcode_13.2.1.app'
|
||||
fuse-lib: FUSE-T
|
||||
openjfx-url: https://download2.gluonhq.com/openjfx/20.0.1/openjfx-20.0.1_osx-aarch64_bin-jmods.zip
|
||||
openjfx-sha: e7e99e6dc3d091e7e1c6940d8e1acc282f22b82b234a20ae7cbec4b93a6acabe
|
||||
openjfx-url: https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_osx-aarch64_bin-jmods.zip
|
||||
openjfx-sha: c60f5f19aa847e0e620e0b011e5de68f2c6755641c2141cec27a0b89f612beaf
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Setup Java
|
||||
|
||||
2
.github/workflows/release-check.yml
vendored
2
.github/workflows/release-check.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
name: Validate commits pushed to release/hotfix branch to fulfill release requirements
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
- id: validate-pom-version
|
||||
name: Validate POM version
|
||||
run: |
|
||||
|
||||
10
.github/workflows/win-exe.yml
vendored
10
.github/workflows/win-exe.yml
vendored
@@ -10,15 +10,15 @@ on:
|
||||
required: false
|
||||
isDebug:
|
||||
description: 'Build debug version with console output'
|
||||
type: boolean
|
||||
type: boolean
|
||||
|
||||
|
||||
env:
|
||||
JAVA_VERSION: 20
|
||||
JAVA_DIST: 'temurin'
|
||||
JAVA_CACHE: 'maven'
|
||||
JFX_JMODS_URL: 'https://download2.gluonhq.com/openjfx/20.0.1/openjfx-20.0.1_windows-x64_bin-jmods.zip'
|
||||
JFX_JMODS_HASH: 'D00767334C43B8832B5CF10267D34CA8F563D187C4655B73EB6020DD79C054B5'
|
||||
JFX_JMODS_URL: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_windows-x64_bin-jmods.zip'
|
||||
JFX_JMODS_HASH: '18625bbc13c57dbf802486564247a8d8cab72ec558c240a401bf6440384ebd77'
|
||||
|
||||
defaults:
|
||||
run:
|
||||
@@ -359,7 +359,7 @@ jobs:
|
||||
cp msi/*.msi files
|
||||
cp exe/*.exe files
|
||||
- name: Upload to Kaspersky
|
||||
uses: SamKirkland/FTP-Deploy-Action@4.3.3
|
||||
uses: SamKirkland/FTP-Deploy-Action@v4.3.4
|
||||
with:
|
||||
protocol: ftps
|
||||
server: allowlist.kaspersky-labs.com
|
||||
@@ -368,7 +368,7 @@ jobs:
|
||||
password: ${{ secrets.ALLOWLIST_KASPERSKY_PASSWORD }}
|
||||
local-dir: files/
|
||||
- name: Upload to Avast
|
||||
uses: SamKirkland/FTP-Deploy-Action@4.3.0
|
||||
uses: SamKirkland/FTP-Deploy-Action@v4.3.4
|
||||
with:
|
||||
protocol: ftp
|
||||
server: whitelisting.avast.com
|
||||
|
||||
2
.idea/runConfigurations/Cryptomator_Linux.xml
generated
2
.idea/runConfigurations/Cryptomator_Linux.xml
generated
@@ -2,7 +2,7 @@
|
||||
<configuration default="false" name="Cryptomator Linux" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{userhome}/.config/Cryptomator/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/Cryptomator/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/Cryptomator/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/Cryptomator/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/Cryptomator/mnt" -Dcryptomator.showTrayIcon=true -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{userhome}/.config/Cryptomator/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/Cryptomator/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/Cryptomator/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/Cryptomator/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/Cryptomator/mnt" -Dcryptomator.showTrayIcon=true -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<configuration default="false" name="Cryptomator Linux Dev" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{userhome}/.config/Cryptomator-Dev/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/Cryptomator-Dev/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/Cryptomator-Dev/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/Cryptomator-Dev/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/Cryptomator-Dev/mnt" -Dcryptomator.showTrayIcon=true -Dfuse.experimental="true" -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{userhome}/.config/Cryptomator-Dev/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/Cryptomator-Dev/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/Cryptomator-Dev/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/Cryptomator-Dev/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/Cryptomator-Dev/mnt" -Dcryptomator.showTrayIcon=true -Dfuse.experimental="true" -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
12
dist/linux/appimage/build.sh
vendored
12
dist/linux/appimage/build.sh
vendored
@@ -16,7 +16,6 @@ mvn -f ../../../pom.xml versions:set -DnewVersion=${SEMVER_STR}
|
||||
# compile
|
||||
mvn -B -f ../../../pom.xml clean package -Plinux -DskipTests
|
||||
cp ../../../LICENSE.txt ../../../target
|
||||
cp ../launcher.sh ../../../target
|
||||
cp ../../../target/cryptomator-*.jar ../../../target/mods
|
||||
|
||||
# add runtime
|
||||
@@ -24,7 +23,7 @@ ${JAVA_HOME}/bin/jlink \
|
||||
--verbose \
|
||||
--output runtime \
|
||||
--module-path "${JAVA_HOME}/jmods" \
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.crypto.ec,jdk.security.auth,jdk.accessibility,jdk.management.jfr \
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.crypto.ec,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net \
|
||||
--strip-native-commands \
|
||||
--no-header-files \
|
||||
--no-man-pages \
|
||||
@@ -44,7 +43,7 @@ ${JAVA_HOME}/bin/jpackage \
|
||||
--name Cryptomator \
|
||||
--vendor "Skymatic GmbH" \
|
||||
--java-options "--enable-preview" \
|
||||
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64" \
|
||||
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator" \
|
||||
--copyright "(C) 2016 - 2023 Skymatic GmbH" \
|
||||
--java-options "-Xss5m" \
|
||||
--java-options "-Xmx256m" \
|
||||
@@ -57,7 +56,8 @@ ${JAVA_HOME}/bin/jpackage \
|
||||
--java-options "-Dcryptomator.p12Path=\"@{userhome}/.config/Cryptomator/key.p12\"" \
|
||||
--java-options "-Dcryptomator.ipcSocketPath=\"@{userhome}/.config/Cryptomator/ipc.socket\"" \
|
||||
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/.local/share/Cryptomator/mnt\"" \
|
||||
--java-options "-Dcryptomator.showTrayIcon=false" \
|
||||
--java-options "-Dcryptomator.showTrayIcon=true" \
|
||||
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"@{appdir}/usr/share/icons/hicolor/symbolic/apps\"" \
|
||||
--java-options "-Dcryptomator.buildNumber=\"appimage-${REVISION_NO}\"" \
|
||||
--add-launcher cryptomator-gtk2=launcher-gtk2.properties \
|
||||
--resource-dir ../resources
|
||||
@@ -69,6 +69,10 @@ envsubst '${REVISION_NO}' < resources/AppDir/bin/cryptomator.sh > Cryptomator.Ap
|
||||
cp ../common/org.cryptomator.Cryptomator256.png Cryptomator.AppDir/usr/share/icons/hicolor/256x256/apps/org.cryptomator.Cryptomator.png
|
||||
cp ../common/org.cryptomator.Cryptomator512.png Cryptomator.AppDir/usr/share/icons/hicolor/512x512/apps/org.cryptomator.Cryptomator.png
|
||||
cp ../common/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg
|
||||
cp ../common/org.cryptomator.Cryptomator.tray.svg Cryptomator.AppDir/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.tray.svg
|
||||
cp ../common/org.cryptomator.Cryptomator.tray-unlocked.svg Cryptomator.AppDir/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.tray-unlocked.svg
|
||||
cp ../common/org.cryptomator.Cryptomator.tray.svg Cryptomator.AppDir/usr/share/icons/hicolor/symbolic/apps/org.cryptomator.Cryptomator.tray-symbolic.svg
|
||||
cp ../common/org.cryptomator.Cryptomator.tray-unlocked.svg Cryptomator.AppDir/usr/share/icons/hicolor/symbolic/apps/org.cryptomator.Cryptomator.tray-unlocked-symbolic.svg
|
||||
cp ../common/org.cryptomator.Cryptomator.desktop Cryptomator.AppDir/usr/share/applications/org.cryptomator.Cryptomator.desktop
|
||||
cp ../common/org.cryptomator.Cryptomator.metainfo.xml Cryptomator.AppDir/usr/share/metainfo/org.cryptomator.Cryptomator.metainfo.xml
|
||||
cp ../common/application-vnd.cryptomator.vault.xml Cryptomator.AppDir/usr/share/mime/packages/application-vnd.cryptomator.vault.xml
|
||||
|
||||
0
dist/linux/appimage/resources/AppDir/usr/share/icons/hicolor/symbolic/apps/.gitkeep
vendored
Normal file
0
dist/linux/appimage/resources/AppDir/usr/share/icons/hicolor/symbolic/apps/.gitkeep
vendored
Normal file
@@ -66,6 +66,7 @@
|
||||
</content_rating>
|
||||
|
||||
<releases>
|
||||
<release date="2023-08-07" version="1.9.3"/>
|
||||
<release date="2023-07-24" version="1.9.2"/>
|
||||
<release date="2023-06-07" version="1.9.1"/>
|
||||
<release date="2023-05-30" version="1.9.0"/>
|
||||
|
||||
12
dist/linux/common/org.cryptomator.Cryptomator.tray-unlocked.svg
vendored
Normal file
12
dist/linux/common/org.cryptomator.Cryptomator.tray-unlocked.svg
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
<svg height="16" viewBox="0 0 42 42" width="16" xmlns="http://www.w3.org/2000/svg">
|
||||
<style
|
||||
id="current-color-scheme" type="text/css">
|
||||
.ColorScheme-Text {
|
||||
color:#232629;
|
||||
}
|
||||
</style>
|
||||
<g fill-rule="evenodd" style="fill:#f2f2f2;fill-opacity:1" class="ColorScheme-Text" fill="currentColor">
|
||||
<path d="m15.591 35.824c-.019.009-.936.775-1.458 1.208a.418.418 0 0 1 -.627-.111 9.322 9.322 0 0 1 -.3-5.974 15.843 15.843 0 0 0 2.894 2.043c.051 1.03-.161 2.644-.509 2.834zm6.409-6.824h-2l.5-5a2 2 0 1 1 1 0zm-14.544-3.241.744-1.366a1.579 1.579 0 0 0 -.019-1.557l.653-1.2c.2.014-.03-.113.165-.14.051-.217-.051-.336 0-.5a3.269 3.269 0 0 0 0-1.5 7.151 7.151 0 0 1 0-3 2.366 2.366 0 0 0 -2.378 1.448 2.409 2.409 0 0 0 .229 2.661l-.7 1.278a1.779 1.779 0 0 0 -1.317.891l-.741 1.372a1.577 1.577 0 0 0 -.019 1.487 3.028 3.028 0 0 0 -2.746 1.525 2.648 2.648 0 0 0 .044 2.631.748.748 0 0 0 .981.266.656.656 0 0 0 .284-.92 1.37 1.37 0 0 1 -.023-1.361 1.6 1.6 0 0 1 2.079-.63 1.408 1.408 0 0 1 .672 1.95 1.546 1.546 0 0 1 -1.2.78.688.688 0 0 0 -.636.749.707.707 0 0 0 .717.6.789.789 0 0 0 .082 0 2.989 2.989 0 0 0 2.322-1.513 2.669 2.669 0 0 0 -.377-3.084 1.767 1.767 0 0 0 1.184-.867zm13.544-10.759a13.013 13.013 0 0 1 5-1 21.6 21.6 0 0 1 4.5.5 9.312 9.312 0 0 0 -9.5-8.5c-5.794 0-9.176 4-9.5 8.5a21.858 21.858 0 0 1 4.5-.5 12.819 12.819 0 0 1 5 1zm3.5-5c1.209 0 2.5.866 2.5 2h-5c0-1.134 1.291-2 2.5-2zm-7 0c1.209 0 2.5.866 2.5 2h-5c0-1.134 1.291-2 2.5-2zm14.473 6a8.067 8.067 0 0 0 -8.08 8v2.141a3.891 3.891 0 0 0 -2.893 3.734v5.125a23.166 23.166 0 0 1 -4.174-1.623 7.857 7.857 0 0 1 -.027.878 3.263 3.263 0 0 1 -.729 2.074l-1.794 1.483a.379.379 0 0 1 -.276.188h-4c-1.324 0-2.346-1.336-2.653-3.343a7.058 7.058 0 0 1 .234-3.18 3.477 3.477 0 0 1 1.636-2.157 1.868 1.868 0 0 1 .783-.32h1.5a8.035 8.035 0 0 1 -1.5-5 11.1 11.1 0 0 1 .5-3 2.519 2.519 0 0 0 0-1.5 13.272 13.272 0 0 1 -.5-3.5c6.687-1.936 11 0 11 0s4.319-1.955 11 0"/>
|
||||
<path d="m39 28h-10v-4a3.13 3.13 0 0 1 3-3 3.087 3.087 0 0 1 3 3v1a1.034 1.034 0 0 0 1 1h1a1.034 1.034 0 0 0 1-1v-1a6 6 0 0 0 -12 0v4h-1a2.073 2.073 0 0 0 -2 2v6a2.073 2.073 0 0 0 2 2h14a2.073 2.073 0 0 0 2-2v-6a2.073 2.073 0 0 0 -2-2zm-5.391 5.94a1.609 1.609 0 0 1 -3.217 0v-1.876a1.609 1.609 0 0 1 3.217 0z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
8
dist/linux/common/org.cryptomator.Cryptomator.tray.svg
vendored
Normal file
8
dist/linux/common/org.cryptomator.Cryptomator.tray.svg
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<svg height="16" viewBox="0 0 42 42" width="16" xmlns="http://www.w3.org/2000/svg">
|
||||
<style id="current-color-scheme" type="text/css">
|
||||
.ColorScheme-Text {
|
||||
color:#232629;
|
||||
}
|
||||
</style>
|
||||
<path d="m32.66 29.319a1.432 1.432 0 0 0 -.66-.319h-1.5a8.125 8.125 0 0 0 1.5-5 11.027 11.027 0 0 0 -.5-3 2.519 2.519 0 0 1 0-1.5 12.987 12.987 0 0 0 .5-3.5c-6.681-1.955-11 0-11 0s-4.313-1.936-11 0a13.272 13.272 0 0 0 .5 3.5 2.519 2.519 0 0 1 0 1.5 11.1 11.1 0 0 0 -.5 3 8.035 8.035 0 0 0 1.5 5h-1.5a1.868 1.868 0 0 0 -.783.319 3.477 3.477 0 0 0 -1.636 2.157 7.058 7.058 0 0 0 -.234 3.18c.307 2.008 1.329 3.344 2.653 3.344h4a.379.379 0 0 0 .277-.187l1.793-1.483a3.263 3.263 0 0 0 .729-2.074 7.857 7.857 0 0 0 .027-.878 23.166 23.166 0 0 0 4.174 1.622 24.4 24.4 0 0 0 4.051-1.614 7.848 7.848 0 0 0 .027.869 3.263 3.263 0 0 0 .729 2.074l1.793 1.484a.61.61 0 0 0 .4.187h4c1.324 0 2.223-1.336 2.529-3.343a7.057 7.057 0 0 0 -.234-3.18 3.477 3.477 0 0 0 -1.635-2.158zm-17.069 6.5c-.019.009-.936.775-1.458 1.208a.418.418 0 0 1 -.627-.111 9.322 9.322 0 0 1 -.3-5.974 15.843 15.843 0 0 0 2.894 2.048c.051 1.03-.161 2.644-.509 2.834zm6.409-6.819h-2l.5-5a2 2 0 1 1 1 0zm6.38 7.921a.418.418 0 0 1 -.627.111c-.522-.433-1.439-1.2-1.458-1.208-.348-.189-.56-1.8-.505-2.828a15.84 15.84 0 0 0 2.9-2.037 9.322 9.322 0 0 1 -.31 5.962zm-20.924-11.162.744-1.366a1.579 1.579 0 0 0 -.019-1.557l.653-1.2c.2.014-.03-.113.165-.14.051-.217-.051-.336 0-.5a3.269 3.269 0 0 0 0-1.5 7.151 7.151 0 0 1 0-3 2.366 2.366 0 0 0 -2.378 1.448 2.409 2.409 0 0 0 .229 2.661l-.7 1.278a1.779 1.779 0 0 0 -1.317.891l-.741 1.372a1.577 1.577 0 0 0 -.019 1.487 3.028 3.028 0 0 0 -2.746 1.525 2.648 2.648 0 0 0 .044 2.631.748.748 0 0 0 .981.266.656.656 0 0 0 .284-.92 1.37 1.37 0 0 1 -.023-1.361 1.6 1.6 0 0 1 2.079-.63 1.408 1.408 0 0 1 .672 1.95 1.546 1.546 0 0 1 -1.2.78.688.688 0 0 0 -.636.749.707.707 0 0 0 .717.6.789.789 0 0 0 .082 0 2.989 2.989 0 0 0 2.322-1.513 2.669 2.669 0 0 0 -.377-3.084 1.767 1.767 0 0 0 1.184-.867zm33.217 1.2a3.021 3.021 0 0 0 -2.658-1.525 1.574 1.574 0 0 0 -.107-1.283l-.745-1.367a1.779 1.779 0 0 0 -1.317-.891l-.7-1.278a2.409 2.409 0 0 0 .229-2.661 2.283 2.283 0 0 0 -2.375-1.454 7.039 7.039 0 0 1 0 3 3.272 3.272 0 0 0 0 1.5c.047.152-.047.3 0 .5.227.04-.069.156.165.14l.653 1.2a1.579 1.579 0 0 0 -.019 1.557l.745 1.367a1.753 1.753 0 0 0 1.045.832 2.66 2.66 0 0 0 -.238 2.916 2.989 2.989 0 0 0 2.326 1.509.79.79 0 0 0 .082 0 .707.707 0 0 0 .717-.6.688.688 0 0 0 -.636-.749 1.546 1.546 0 0 1 -1.2-.78 1.408 1.408 0 0 1 .672-1.95 1.628 1.628 0 0 1 1.179-.089 1.512 1.512 0 0 1 .9.719 1.37 1.37 0 0 1 -.023 1.361.656.656 0 0 0 .284.92.748.748 0 0 0 .981-.266 2.648 2.648 0 0 0 .04-2.633zm-19.673-11.959a13.013 13.013 0 0 1 5-1 21.6 21.6 0 0 1 4.5.5 9.312 9.312 0 0 0 -9.5-8.5c-5.794 0-9.176 4-9.5 8.5a21.858 21.858 0 0 1 4.5-.5 12.819 12.819 0 0 1 5 1zm3.5-5c1.209 0 2.5.866 2.5 2h-5c0-1.134 1.291-2 2.5-2zm-7 0c1.209 0 2.5.866 2.5 2h-5c0-1.134 1.291-2 2.5-2z" fill-rule="evenodd" style="fill:#f2f2f2;fill-opacity:1" class="ColorScheme-Text" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.0 KiB |
2
dist/linux/debian/cryptomator.install
vendored
2
dist/linux/debian/cryptomator.install
vendored
@@ -1,6 +1,8 @@
|
||||
cryptomator usr/lib
|
||||
common/org.cryptomator.Cryptomator.desktop usr/share/applications
|
||||
common/org.cryptomator.Cryptomator.svg usr/share/icons/hicolor/scalable/apps
|
||||
common/org.cryptomator.Cryptomator.tray.svg usr/share/icons/hicolor/scalable/apps
|
||||
common/org.cryptomator.Cryptomator.tray-unlocked.svg usr/share/icons/hicolor/scalable/apps
|
||||
common/org.cryptomator.Cryptomator256.png usr/share/icons/hicolor/256x256/apps
|
||||
common/org.cryptomator.Cryptomator512.png usr/share/icons/hicolor/512x512/apps
|
||||
common/org.cryptomator.Cryptomator.metainfo.xml usr/share/metainfo
|
||||
|
||||
2
dist/linux/debian/cryptomator.links
vendored
2
dist/linux/debian/cryptomator.links
vendored
@@ -1 +1,3 @@
|
||||
usr/lib/cryptomator/bin/cryptomator usr/bin/cryptomator
|
||||
usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.tray.svg usr/share/icons/hicolor/symbolic/apps/org.cryptomator.Cryptomator.tray-symbolic.svg
|
||||
usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.tray-unlocked.svg usr/share/icons/hicolor/symbolic/apps/org.cryptomator.Cryptomator.tray-unlocked-symbolic.svg
|
||||
7
dist/linux/debian/rules
vendored
7
dist/linux/debian/rules
vendored
@@ -27,7 +27,7 @@ override_dh_auto_build:
|
||||
$(JAVA_HOME)/bin/jlink \
|
||||
--output runtime \
|
||||
--module-path "${JMODS_PATH}" \
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.crypto.ec,jdk.security.auth,jdk.accessibility,jdk.management.jfr \
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.crypto.ec,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net \
|
||||
--strip-native-commands \
|
||||
--no-header-files \
|
||||
--no-man-pages \
|
||||
@@ -43,7 +43,7 @@ override_dh_auto_build:
|
||||
--name cryptomator \
|
||||
--vendor "Skymatic GmbH" \
|
||||
--java-options "--enable-preview" \
|
||||
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64" \
|
||||
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator" \
|
||||
--copyright "(C) 2016 - 2023 Skymatic GmbH" \
|
||||
--java-options "-Xss5m" \
|
||||
--java-options "-Xmx256m" \
|
||||
@@ -55,7 +55,8 @@ override_dh_auto_build:
|
||||
--java-options "-Dcryptomator.p12Path=\"@{userhome}/.config/Cryptomator/key.p12\"" \
|
||||
--java-options "-Dcryptomator.ipcSocketPath=\"@{userhome}/.config/Cryptomator/ipc.socket\"" \
|
||||
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/.local/share/Cryptomator/mnt\"" \
|
||||
--java-options "-Dcryptomator.showTrayIcon=false" \
|
||||
--java-options "-Dcryptomator.showTrayIcon=true" \
|
||||
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"/usr/share/icons/hicolor/symbolic/apps\"" \
|
||||
--java-options "-Dcryptomator.buildNumber=\"deb-${REVISION_NUM}\"" \
|
||||
--java-options "-Dcryptomator.appVersion=\"${SEMVER_STR}\"" \
|
||||
--app-version "${VERSION_NUM}.${REVISION_NUM}" \
|
||||
|
||||
2
dist/mac/dmg/build.sh
vendored
2
dist/mac/dmg/build.sh
vendored
@@ -35,7 +35,7 @@ if [ "$(machine)" = "arm64e" ]; then
|
||||
else
|
||||
ARCH="x64"
|
||||
fi
|
||||
OPENJFX_JMODS="https://download2.gluonhq.com/openjfx/20.0.1/openjfx-20.0.1_linux-${ARCH}_bin-jmods.zip"
|
||||
OPENJFX_JMODS="https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_osx-${ARCH}_bin-jmods.zip"
|
||||
|
||||
# check preconditions
|
||||
if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi
|
||||
|
||||
2
dist/win/build.bat
vendored
2
dist/win/build.bat
vendored
@@ -11,7 +11,7 @@ SET HELP_URL="https://cryptomator.org/contact/"
|
||||
SET MODULE_AND_MAIN_CLASS="org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator"
|
||||
SET LOOPBACK_ALIAS="cryptomator-vault"
|
||||
|
||||
powershell -NoLogo -ExecutionPolicy Unrestricted -Command .\build.ps1^
|
||||
powershell -NoLogo -NoProfile -ExecutionPolicy Unrestricted -Command .\build.ps1^
|
||||
-AppName %APPNAME%^
|
||||
-MainJarGlob "%MAIN_JAR_GLOB%"^
|
||||
-ModuleAndMainClass "%MODULE_AND_MAIN_CLASS%"^
|
||||
|
||||
8
dist/win/build.ps1
vendored
8
dist/win/build.ps1
vendored
@@ -51,10 +51,11 @@ if ($clean -and (Test-Path -Path $runtimeImagePath)) {
|
||||
}
|
||||
|
||||
## download jfx jmods
|
||||
$jfxJmodsChecksum = 'd00767334c43b8832b5cf10267d34ca8f563d187c4655b73eb6020dd79c054b5'
|
||||
$jmodsVersion='20.0.2'
|
||||
$jmodsUrl = "https://download2.gluonhq.com/openjfx/${jmodsVersion}/openjfx-${jmodsVersion}_windows-x64_bin-jmods.zip"
|
||||
$jfxJmodsChecksum = '18625bbc13c57dbf802486564247a8d8cab72ec558c240a401bf6440384ebd77'
|
||||
$jfxJmodsZip = '.\resources\jfxJmods.zip'
|
||||
if( !(Test-Path -Path $jfxJmodsZip) ) {
|
||||
$jmodsUrl = "https://download2.gluonhq.com/openjfx/20.0.1/openjfx-20.0.1_windows-x64_bin-jmods.zip"
|
||||
Write-Output "Downloading ${jmodsUrl}..."
|
||||
Invoke-WebRequest $jmodsUrl -OutFile $jfxJmodsZip # redirects are followed by default
|
||||
}
|
||||
@@ -65,12 +66,13 @@ if( $jmodsChecksumActual -ne $jfxJmodsChecksum ) {
|
||||
exit 1;
|
||||
}
|
||||
Expand-Archive -Force -Path $jfxJmodsZip -DestinationPath ".\resources\"
|
||||
Move-Item -Path ".\resources\javafx-jmods-*" -Destination ".\resources\javafx-jmods" -ErrorAction Stop
|
||||
|
||||
|
||||
& "$Env:JAVA_HOME\bin\jlink" `
|
||||
--verbose `
|
||||
--output runtime `
|
||||
--module-path "$Env:JAVA_HOME/jmods;$buildDir/resources/javafx-jmods-20.0.1" `
|
||||
--module-path "$Env:JAVA_HOME/jmods;$buildDir/resources/javafx-jmods" `
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,jdk.unsupported,jdk.crypto.ec,jdk.accessibility,jdk.management.jfr,javafx.base,javafx.graphics,javafx.controls,javafx.fxml `
|
||||
--strip-native-commands `
|
||||
--no-header-files `
|
||||
|
||||
2
dist/win/contrib/patchWebDAV.bat
vendored
2
dist/win/contrib/patchWebDAV.bat
vendored
@@ -3,5 +3,5 @@
|
||||
::REPLACE ME
|
||||
|
||||
cd %~dp0
|
||||
powershell -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -Command .\patchWebDAV.ps1^
|
||||
powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command .\patchWebDAV.ps1^
|
||||
-LoopbackAlias %LOOPBACK_ALIAS%
|
||||
@@ -2,4 +2,4 @@
|
||||
:: see comments in file ./version170-migrate-settings.ps1
|
||||
|
||||
cd %~dp0
|
||||
powershell -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -Command .\version170-migrate-settings.ps1
|
||||
powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command .\version170-migrate-settings.ps1
|
||||
14
pom.xml
14
pom.xml
@@ -29,15 +29,15 @@
|
||||
<project.jdk.version>20</project.jdk.version>
|
||||
|
||||
<!-- Group IDs of jars that need to stay on the class path for now -->
|
||||
<!-- Once hypfvieh, swiesend, purejava and integrations-linux have module-info, remove them-->
|
||||
<nonModularGroupIds>org.ow2.asm,org.apache.jackrabbit,org.apache.httpcomponents,de.swiesend,org.purejava,com.github.hypfvieh</nonModularGroupIds>
|
||||
<!-- remove them, as soon they got modularized or support is dropped (i.e., WebDAV) -->
|
||||
<nonModularGroupIds>org.ow2.asm,org.apache.jackrabbit,org.apache.httpcomponents</nonModularGroupIds>
|
||||
|
||||
<!-- cryptomator dependencies -->
|
||||
<cryptomator.cryptofs.version>2.6.6</cryptomator.cryptofs.version>
|
||||
<cryptomator.integrations.version>1.2.0</cryptomator.integrations.version>
|
||||
<cryptomator.integrations.win.version>1.2.0</cryptomator.integrations.win.version>
|
||||
<cryptomator.cryptofs.version>2.6.7</cryptomator.cryptofs.version>
|
||||
<cryptomator.integrations.version>1.3.0</cryptomator.integrations.version>
|
||||
<cryptomator.integrations.win.version>1.2.2</cryptomator.integrations.win.version>
|
||||
<cryptomator.integrations.mac.version>1.2.0</cryptomator.integrations.mac.version>
|
||||
<cryptomator.integrations.linux.version>1.2.1</cryptomator.integrations.linux.version>
|
||||
<cryptomator.integrations.linux.version>1.3.0-beta6</cryptomator.integrations.linux.version>
|
||||
<cryptomator.fuse.version>3.0.0</cryptomator.fuse.version>
|
||||
<cryptomator.dokany.version>2.0.0</cryptomator.dokany.version>
|
||||
<cryptomator.webdav.version>2.0.3</cryptomator.webdav.version>
|
||||
@@ -48,7 +48,7 @@
|
||||
<easybind.version>2.2</easybind.version>
|
||||
<guava.version>32.0.1-jre</guava.version>
|
||||
<jackson.version>2.15.2</jackson.version>
|
||||
<javafx.version>20.0.1</javafx.version>
|
||||
<javafx.version>20.0.2</javafx.version>
|
||||
<jwt.version>4.4.0</jwt.version>
|
||||
<nimbus-jose.version>9.31</nimbus-jose.version>
|
||||
<logback.version>1.4.7</logback.version>
|
||||
|
||||
@@ -83,8 +83,8 @@ public final class OneDriveWindowsLocationPresetsProvider implements LocationPre
|
||||
throw new TimeoutException(cmdDescription + " timed out after " + timeoutSeconds + "s");
|
||||
}
|
||||
if (process.exitValue() != 0) {
|
||||
@SuppressWarnings("resource") var stdout = process.inputReader(StandardCharsets.UTF_8).lines().collect(Collectors.joining("\n"));
|
||||
@SuppressWarnings("resource") var stderr = process.errorReader(StandardCharsets.UTF_8).lines().collect(Collectors.joining("\n"));
|
||||
@SuppressWarnings("resource") var stdout = process.inputReader(StandardCharsets.ISO_8859_1).lines().collect(Collectors.joining("\n"));
|
||||
@SuppressWarnings("resource") var stderr = process.errorReader(StandardCharsets.ISO_8859_1).lines().collect(Collectors.joining("\n"));
|
||||
throw new CommandFailedException(cmdDescription, process.exitValue(), stdout, stderr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package org.cryptomator.common.mount;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
public class HideawayNotDirectoryException extends IllegalMountPointException {
|
||||
|
||||
private final Path hideaway;
|
||||
|
||||
public HideawayNotDirectoryException(Path path, Path hideaway) {
|
||||
super(path, "Existing hideaway (" + hideaway.toString() + ") for mountpoint is not a directory: " + path.toString());
|
||||
this.hideaway = hideaway;
|
||||
}
|
||||
|
||||
public Path getHideaway() {
|
||||
return hideaway;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,25 @@
|
||||
package org.cryptomator.common.mount;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
/**
|
||||
* Indicates that validation or preparation of a mountpoint failed due to a configuration error or an invalid system state.<br>
|
||||
* Instances of this exception are usually caught and displayed to the user in an appropriate fashion, e.g. by {@link org.cryptomator.ui.unlock.UnlockInvalidMountPointController UnlockInvalidMountPointController.}
|
||||
*/
|
||||
public class IllegalMountPointException extends IllegalArgumentException {
|
||||
|
||||
public IllegalMountPointException(String msg) {
|
||||
super(msg);
|
||||
private final Path mountpoint;
|
||||
|
||||
public IllegalMountPointException(Path mountpoint) {
|
||||
this(mountpoint, "The provided mountpoint has a problem: " + mountpoint.toString());
|
||||
}
|
||||
|
||||
}
|
||||
public IllegalMountPointException(Path mountpoint, String msg) {
|
||||
super(msg);
|
||||
this.mountpoint = mountpoint;
|
||||
}
|
||||
|
||||
public Path getMountpoint() {
|
||||
return mountpoint;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.cryptomator.common.mount;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
public class MountPointCleanupFailedException extends IllegalMountPointException {
|
||||
|
||||
public MountPointCleanupFailedException(Path path) {
|
||||
super(path, "Mountpoint could not be cleared: " + path.toString());
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
package org.cryptomator.common.mount;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
public class MountPointInUseException extends IllegalMountPointException {
|
||||
|
||||
public MountPointInUseException(String msg) {
|
||||
super(msg);
|
||||
public MountPointInUseException(Path path) {
|
||||
super(path);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.cryptomator.common.mount;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
public class MountPointNotEmptyDirectoryException extends IllegalMountPointException {
|
||||
|
||||
public MountPointNotEmptyDirectoryException(Path path, String msg) {
|
||||
super(path, msg);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package org.cryptomator.common.mount;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
public class MountPointNotExistingException extends IllegalMountPointException {
|
||||
|
||||
public MountPointNotExistingException(Path path, String msg) {
|
||||
super(path, msg);
|
||||
}
|
||||
|
||||
public MountPointNotExistingException(Path path) {
|
||||
super(path, "Mountpoint does not exist: " + path);
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
package org.cryptomator.common.mount;
|
||||
|
||||
public class MountPointNotExistsException extends IllegalMountPointException {
|
||||
|
||||
public MountPointNotExistsException(String msg) {
|
||||
super(msg);
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
package org.cryptomator.common.mount;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
public class MountPointNotSupportedException extends IllegalMountPointException {
|
||||
|
||||
public MountPointNotSupportedException(String msg) {
|
||||
super(msg);
|
||||
public MountPointNotSupportedException(Path path, String msg) {
|
||||
super(path, msg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
package org.cryptomator.common.mount;
|
||||
|
||||
public class MountPointPreparationException extends RuntimeException {
|
||||
|
||||
public MountPointPreparationException(String msg) {
|
||||
super(msg);
|
||||
}
|
||||
|
||||
public MountPointPreparationException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
}
|
||||
@@ -5,13 +5,11 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.DirectoryNotEmptyException;
|
||||
import java.nio.file.FileAlreadyExistsException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.LinkOption;
|
||||
import java.nio.file.NoSuchFileException;
|
||||
import java.nio.file.NotDirectoryException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
|
||||
public final class MountWithinParentUtil {
|
||||
|
||||
@@ -22,31 +20,33 @@ public final class MountWithinParentUtil {
|
||||
|
||||
private MountWithinParentUtil() {}
|
||||
|
||||
static void prepareParentNoMountPoint(Path mountPoint) throws MountPointPreparationException {
|
||||
static void prepareParentNoMountPoint(Path mountPoint) throws IllegalMountPointException, IOException {
|
||||
Path hideaway = getHideaway(mountPoint);
|
||||
var mpExists = Files.exists(mountPoint, LinkOption.NOFOLLOW_LINKS);
|
||||
var mpState = getMountPointState(mountPoint);
|
||||
var hideExists = Files.exists(hideaway, LinkOption.NOFOLLOW_LINKS);
|
||||
|
||||
//TODO: possible improvement by just deleting an _empty_ hideaway
|
||||
if (mpExists && hideExists) { //both resources exist (whatever type)
|
||||
throw new MountPointPreparationException(new FileAlreadyExistsException(hideaway.toString()));
|
||||
} else if (!mpExists && !hideExists) { //neither mountpoint nor hideaway exist
|
||||
throw new MountPointPreparationException(new NoSuchFileException(mountPoint.toString()));
|
||||
} else if (!mpExists) { //only hideaway exists
|
||||
checkIsDirectory(hideaway);
|
||||
LOG.info("Mountpoint {} seems to be not properly cleaned up. Will be fixed on unmount.", mountPoint);
|
||||
try {
|
||||
if (SystemUtils.IS_OS_WINDOWS) {
|
||||
Files.setAttribute(hideaway, WIN_HIDDEN_ATTR, true, LinkOption.NOFOLLOW_LINKS);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new MountPointPreparationException(e);
|
||||
}
|
||||
} else { //only mountpoint exists
|
||||
try {
|
||||
checkIsDirectory(mountPoint);
|
||||
checkIsEmpty(mountPoint);
|
||||
if (mpState == MountPointState.BROKEN_JUNCTION) {
|
||||
LOG.info("Mountpoint \"{}\" is still a junction. Deleting it.", mountPoint);
|
||||
Files.delete(mountPoint); //Throws if mountPoint is also a non-empty folder
|
||||
mpState = MountPointState.NOT_EXISTING;
|
||||
}
|
||||
|
||||
if (mpState == MountPointState.NOT_EXISTING && !hideExists) { //neither mountpoint nor hideaway exist
|
||||
throw new MountPointNotExistingException(mountPoint);
|
||||
} else if (mpState == MountPointState.NOT_EXISTING) { //only hideaway exists
|
||||
checkIsHideawayDirectory(mountPoint, hideaway);
|
||||
LOG.info("Mountpoint {} seems to be not properly cleaned up. Will be fixed on unmount.", mountPoint);
|
||||
if (SystemUtils.IS_OS_WINDOWS) {
|
||||
Files.setAttribute(hideaway, WIN_HIDDEN_ATTR, true, LinkOption.NOFOLLOW_LINKS);
|
||||
}
|
||||
} else {
|
||||
assert mpState == MountPointState.EMPTY_DIR;
|
||||
try {
|
||||
if (hideExists) { //... with hideaway
|
||||
removeResidualHideaway(mountPoint, hideaway);
|
||||
}
|
||||
|
||||
//... (now) without hideaway
|
||||
Files.move(mountPoint, hideaway);
|
||||
if (SystemUtils.IS_OS_WINDOWS) {
|
||||
Files.setAttribute(hideaway, WIN_HIDDEN_ATTR, true, LinkOption.NOFOLLOW_LINKS);
|
||||
@@ -54,30 +54,66 @@ public final class MountWithinParentUtil {
|
||||
int attempts = 0;
|
||||
while (!Files.notExists(mountPoint)) {
|
||||
if (attempts >= 10) {
|
||||
throw new MountPointPreparationException("Path " + mountPoint + " could not be cleared");
|
||||
throw new MountPointCleanupFailedException(mountPoint);
|
||||
}
|
||||
Thread.sleep(1000);
|
||||
attempts++;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new MountPointPreparationException(e);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
throw new MountPointPreparationException(e);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//visible for testing
|
||||
static MountPointState getMountPointState(Path path) throws IOException, IllegalMountPointException {
|
||||
if (Files.notExists(path, LinkOption.NOFOLLOW_LINKS)) {
|
||||
return MountPointState.NOT_EXISTING;
|
||||
}
|
||||
if (!Files.readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS).isOther()) {
|
||||
checkIsMountPointDirectory(path);
|
||||
checkIsMountPointEmpty(path);
|
||||
return MountPointState.EMPTY_DIR;
|
||||
}
|
||||
if (Files.exists(path /* FOLLOW_LINKS */)) { //Both junction and target exist
|
||||
throw new MountPointInUseException(path);
|
||||
}
|
||||
return MountPointState.BROKEN_JUNCTION;
|
||||
}
|
||||
|
||||
//visible for testing
|
||||
enum MountPointState {
|
||||
|
||||
NOT_EXISTING,
|
||||
|
||||
EMPTY_DIR,
|
||||
|
||||
BROKEN_JUNCTION;
|
||||
|
||||
}
|
||||
|
||||
//visible for testing
|
||||
static void removeResidualHideaway(Path mountPoint, Path hideaway) throws IOException {
|
||||
checkIsHideawayDirectory(mountPoint, hideaway);
|
||||
Files.delete(hideaway); //Fails if not empty
|
||||
}
|
||||
|
||||
static void cleanup(Path mountPoint) {
|
||||
Path hideaway = getHideaway(mountPoint);
|
||||
try {
|
||||
waitForMountpointRestoration(mountPoint);
|
||||
if (Files.notExists(hideaway, LinkOption.NOFOLLOW_LINKS)) {
|
||||
LOG.error("Unable to restore hidden directory to mountpoint \"{}\": Directory does not exist.", mountPoint);
|
||||
return;
|
||||
}
|
||||
|
||||
Files.move(hideaway, mountPoint);
|
||||
if (SystemUtils.IS_OS_WINDOWS) {
|
||||
Files.setAttribute(mountPoint, WIN_HIDDEN_ATTR, false);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
LOG.error("Unable to restore hidden directory to mountpoint {}.", mountPoint, e);
|
||||
LOG.error("Unable to restore hidden directory to mountpoint \"{}\".", mountPoint, e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,16 +135,22 @@ public final class MountWithinParentUtil {
|
||||
}
|
||||
}
|
||||
|
||||
private static void checkIsDirectory(Path toCheck) throws MountPointPreparationException {
|
||||
private static void checkIsMountPointDirectory(Path toCheck) throws IllegalMountPointException {
|
||||
if (!Files.isDirectory(toCheck, LinkOption.NOFOLLOW_LINKS)) {
|
||||
throw new MountPointPreparationException(new NotDirectoryException(toCheck.toString()));
|
||||
throw new MountPointNotEmptyDirectoryException(toCheck, "Mountpoint is not a directory: " + toCheck);
|
||||
}
|
||||
}
|
||||
|
||||
private static void checkIsEmpty(Path toCheck) throws MountPointPreparationException, IOException {
|
||||
private static void checkIsHideawayDirectory(Path mountPoint, Path hideawayToCheck) {
|
||||
if (!Files.isDirectory(hideawayToCheck, LinkOption.NOFOLLOW_LINKS)) {
|
||||
throw new HideawayNotDirectoryException(mountPoint, hideawayToCheck);
|
||||
}
|
||||
}
|
||||
|
||||
private static void checkIsMountPointEmpty(Path toCheck) throws IllegalMountPointException, IOException {
|
||||
try (var dirStream = Files.list(toCheck)) {
|
||||
if (dirStream.findFirst().isPresent()) {
|
||||
throw new MountPointPreparationException(new DirectoryNotEmptyException(toCheck.toString()));
|
||||
throw new MountPointNotEmptyDirectoryException(toCheck, "Mountpoint directory is not empty: " + toCheck);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,7 +99,7 @@ public class Mounter {
|
||||
var mpIsDriveLetter = userChosenMountPoint.toString().matches("[A-Z]:\\\\");
|
||||
if (mpIsDriveLetter) {
|
||||
if (driveLetters.getOccupied().contains(userChosenMountPoint)) {
|
||||
throw new MountPointInUseException(userChosenMountPoint.toString());
|
||||
throw new MountPointInUseException(userChosenMountPoint);
|
||||
}
|
||||
} else if (canMountToParent && !canMountToDir) {
|
||||
MountWithinParentUtil.prepareParentNoMountPoint(userChosenMountPoint);
|
||||
@@ -115,13 +115,13 @@ public class Mounter {
|
||||
|| (!canMountToParent && !mpIsDriveLetter) //
|
||||
|| (!canMountToDir && !canMountToParent && !canMountToSystem && !canMountToDriveLetter);
|
||||
if (configNotSupported) {
|
||||
throw new MountPointNotSupportedException(e.getMessage());
|
||||
throw new MountPointNotSupportedException(userChosenMountPoint, e.getMessage());
|
||||
} else if (canMountToDir && !canMountToParent && !Files.exists(userChosenMountPoint)) {
|
||||
//mountpoint must exist
|
||||
throw new MountPointNotExistsException(e.getMessage());
|
||||
throw new MountPointNotExistingException(userChosenMountPoint, e.getMessage());
|
||||
} else {
|
||||
//TODO: add specific exception for !canMountToDir && canMountToParent && !Files.notExists(userChosenMountPoint)
|
||||
throw new IllegalMountPointException(e.getMessage());
|
||||
throw new IllegalMountPointException(userChosenMountPoint, e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ public class ErrorController implements FxController {
|
||||
|
||||
private static final ObjectMapper JSON = new ObjectMapper();
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ErrorController.class);
|
||||
private static final String ERROR_CODES_URL = "https://gist.githubusercontent.com/cryptobot/accba9fb9555e7192271b85606f97230/raw/errorcodes.json";
|
||||
private static final String ERROR_CODES_URL = "https://api.cryptomator.org/desktop/error-codes.json";
|
||||
private static final String SEARCH_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/categories/errors?discussions_q=category:Errors+%s";
|
||||
private static final String REPORT_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/new?category=Errors&title=Error+%s&body=%s";
|
||||
private static final String SEARCH_ERRORCODE_DELIM = " OR ";
|
||||
@@ -65,11 +65,13 @@ public class ErrorController implements FxController {
|
||||
private final Scene previousScene;
|
||||
private final Stage window;
|
||||
private final Environment environment;
|
||||
private final ExecutorService executorService;
|
||||
|
||||
private final BooleanProperty copiedDetails = new SimpleBooleanProperty();
|
||||
private final ObjectProperty<ErrorDiscussion> matchingErrorDiscussion = new SimpleObjectProperty<>();
|
||||
private final BooleanExpression errorSolutionFound = matchingErrorDiscussion.isNotNull();
|
||||
private final BooleanProperty isLoadingHttpResponse = new SimpleBooleanProperty();
|
||||
private final BooleanProperty askedForLookupDatabasePermission = new SimpleBooleanProperty();
|
||||
|
||||
@Inject
|
||||
ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment, ExecutorService executorService) {
|
||||
@@ -79,15 +81,7 @@ public class ErrorController implements FxController {
|
||||
this.previousScene = previousScene;
|
||||
this.window = window;
|
||||
this.environment = environment;
|
||||
|
||||
isLoadingHttpResponse.set(true);
|
||||
HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
|
||||
HttpRequest httpRequest = HttpRequest.newBuilder()//
|
||||
.uri(URI.create(ERROR_CODES_URL))//
|
||||
.build();
|
||||
httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofInputStream())//
|
||||
.thenAcceptAsync(this::loadHttpResponse, executorService)//
|
||||
.whenCompleteAsync((r, e) -> isLoadingHttpResponse.set(false), Platform::runLater);
|
||||
this.executorService = executorService;
|
||||
}
|
||||
|
||||
@FXML
|
||||
@@ -140,6 +134,24 @@ public class ErrorController implements FxController {
|
||||
CompletableFuture.delayedExecutor(2, TimeUnit.SECONDS, Platform::runLater).execute(() -> copiedDetails.set(false));
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void dismiss() {
|
||||
askedForLookupDatabasePermission.set(true);
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void lookUpSolution() {
|
||||
isLoadingHttpResponse.set(true);
|
||||
askedForLookupDatabasePermission.set(true);
|
||||
HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
|
||||
HttpRequest httpRequest = HttpRequest.newBuilder()//
|
||||
.uri(URI.create(ERROR_CODES_URL))//
|
||||
.build();
|
||||
httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofInputStream())//
|
||||
.thenAcceptAsync(this::loadHttpResponse, executorService)//
|
||||
.whenCompleteAsync((r, e) -> isLoadingHttpResponse.set(false), Platform::runLater);
|
||||
}
|
||||
|
||||
private void loadHttpResponse(HttpResponse<InputStream> response) {
|
||||
if (response.statusCode() != 200) {
|
||||
LOG.error("Status code {} when trying to load {} ", response.statusCode(), response.uri());
|
||||
@@ -293,4 +305,12 @@ public class ErrorController implements FxController {
|
||||
return isLoadingHttpResponse.get();
|
||||
}
|
||||
|
||||
public BooleanProperty askedForLookupDatabasePermissionProperty() {
|
||||
return askedForLookupDatabasePermission;
|
||||
}
|
||||
|
||||
public boolean getAskedForLookupDatabasePermission() {
|
||||
return askedForLookupDatabasePermission.get();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -28,7 +28,7 @@ public abstract class UpdateCheckerModule {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(UpdateCheckerModule.class);
|
||||
|
||||
private static final URI LATEST_VERSION_URI = URI.create("https://api.cryptomator.org/updates/latestVersion.json");
|
||||
private static final URI LATEST_VERSION_URI = URI.create("https://api.cryptomator.org/desktop/latest-version.json");
|
||||
private static final Duration UPDATE_CHECK_INTERVAL = Duration.hours(3);
|
||||
private static final Duration DISABLED_UPDATE_CHECK_INTERVAL = Duration.hours(100000); // Duration.INDEFINITE leads to overflows...
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ public class ReceiveKeyController implements FxController {
|
||||
switch (response.statusCode()) {
|
||||
case 200 -> retrievalSucceeded(response);
|
||||
case 402 -> licenseExceeded();
|
||||
case 403 -> accessNotGranted();
|
||||
case 403, 410 -> accessNotGranted(); // or vault has been archived, effectively disallowing access
|
||||
case 404 -> needsDeviceRegistration();
|
||||
default -> throw new IOException("Unexpected response " + response.statusCode());
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import org.cryptomator.integrations.common.Priority;
|
||||
import org.cryptomator.integrations.tray.ActionItem;
|
||||
import org.cryptomator.integrations.tray.SeparatorItem;
|
||||
import org.cryptomator.integrations.tray.SubMenuItem;
|
||||
import org.cryptomator.integrations.tray.TrayIconLoader;
|
||||
import org.cryptomator.integrations.tray.TrayMenuController;
|
||||
import org.cryptomator.integrations.tray.TrayMenuException;
|
||||
import org.cryptomator.integrations.tray.TrayMenuItem;
|
||||
@@ -14,6 +15,7 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.awt.AWTException;
|
||||
import java.awt.Image;
|
||||
import java.awt.Menu;
|
||||
import java.awt.MenuItem;
|
||||
import java.awt.PopupMenu;
|
||||
@@ -23,7 +25,12 @@ import java.awt.TrayIcon;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Fallback tray icon implementation using AWT. This will only be used if no better implementation is found.
|
||||
* @see <a href="https://github.com/cryptomator/integrations-linux/blob/33f9a4685b781b55fcce399b8618818bfc08cbdf/src/main/java/org/cryptomator/linux/tray/AppindicatorTrayMenuController.java">preferred AppIndicator-based implementation used on Linux</a>
|
||||
*/
|
||||
@CheckAvailability
|
||||
@Priority(Priority.FALLBACK)
|
||||
public class AwtTrayMenuController implements TrayMenuController {
|
||||
@@ -32,6 +39,7 @@ public class AwtTrayMenuController implements TrayMenuController {
|
||||
|
||||
private final PopupMenu menu = new PopupMenu();
|
||||
private TrayIcon trayIcon;
|
||||
private Image image;
|
||||
|
||||
@CheckAvailability
|
||||
public static boolean isAvailable() {
|
||||
@@ -39,8 +47,9 @@ public class AwtTrayMenuController implements TrayMenuController {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showTrayIcon(byte[] imageData, Runnable defaultAction, String tooltip) throws TrayMenuException {
|
||||
var image = Toolkit.getDefaultToolkit().createImage(imageData);
|
||||
public void showTrayIcon(Consumer<TrayIconLoader> iconLoader, Runnable defaultAction, String tooltip) throws TrayMenuException {
|
||||
TrayIconLoader.PngData callback = this::showTrayIconWithPngData;
|
||||
iconLoader.accept(callback);
|
||||
trayIcon = new TrayIcon(image, tooltip, menu);
|
||||
|
||||
trayIcon.setImageAutoSize(true);
|
||||
@@ -56,8 +65,17 @@ public class AwtTrayMenuController implements TrayMenuController {
|
||||
}
|
||||
}
|
||||
|
||||
private void showTrayIconWithPngData(byte[] imageData) {
|
||||
image = Toolkit.getDefaultToolkit().createImage(imageData);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTrayIcon(byte[] imageData) {
|
||||
public void updateTrayIcon(Consumer<TrayIconLoader> iconLoader) {
|
||||
TrayIconLoader.PngData callback = this::updateTrayIconWithPngData;
|
||||
iconLoader.accept(callback);
|
||||
}
|
||||
|
||||
private void updateTrayIconWithPngData(byte[] imageData) {
|
||||
if (trayIcon == null) {
|
||||
throw new IllegalStateException("Failed to update the icon as it has not yet been added");
|
||||
}
|
||||
@@ -100,5 +118,4 @@ public class AwtTrayMenuController implements TrayMenuController {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import org.cryptomator.common.vaults.VaultListManager;
|
||||
import org.cryptomator.integrations.tray.ActionItem;
|
||||
import org.cryptomator.integrations.tray.SeparatorItem;
|
||||
import org.cryptomator.integrations.tray.SubMenuItem;
|
||||
import org.cryptomator.integrations.tray.TrayIconLoader;
|
||||
import org.cryptomator.integrations.tray.TrayMenuController;
|
||||
import org.cryptomator.integrations.tray.TrayMenuException;
|
||||
import org.cryptomator.integrations.tray.TrayMenuItem;
|
||||
@@ -65,7 +66,12 @@ public class TrayMenuBuilder {
|
||||
});
|
||||
|
||||
try {
|
||||
trayMenu.showTrayIcon(getAppropriateTrayIconImage(), this::showMainWindow, "Cryptomator");
|
||||
trayMenu.showTrayIcon(loader -> {
|
||||
switch (loader) {
|
||||
case TrayIconLoader.PngData l -> l.loadPng(getAppropriateTrayIconImage());
|
||||
case TrayIconLoader.FreedesktopIconName l -> l.lookupByName(getAppropriateFreedesktopIconName());
|
||||
}
|
||||
}, this::showMainWindow, "Cryptomator");
|
||||
trayMenu.onBeforeOpenMenu(() -> {
|
||||
for (Vault vault : vaults) {
|
||||
VaultListManager.redetermineVaultState(vault);
|
||||
@@ -84,7 +90,12 @@ public class TrayMenuBuilder {
|
||||
|
||||
private void vaultListChanged(@SuppressWarnings("unused") Observable observable) {
|
||||
assert Platform.isFxApplicationThread();
|
||||
trayMenu.updateTrayIcon(getAppropriateTrayIconImage());
|
||||
trayMenu.updateTrayIcon(loader -> {
|
||||
switch (loader) {
|
||||
case TrayIconLoader.PngData l -> l.loadPng(getAppropriateTrayIconImage());
|
||||
case TrayIconLoader.FreedesktopIconName l -> l.lookupByName(getAppropriateFreedesktopIconName());
|
||||
}
|
||||
});
|
||||
rebuildMenu();
|
||||
}
|
||||
|
||||
@@ -173,4 +184,8 @@ public class TrayMenuBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
private String getAppropriateFreedesktopIconName() {
|
||||
boolean isAnyVaultUnlocked = vaults.stream().anyMatch(Vault::isUnlocked);
|
||||
return isAnyVaultUnlocked ? "org.cryptomator.Cryptomator.tray-unlocked-symbolic" : "org.cryptomator.Cryptomator.tray-symbolic";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
package org.cryptomator.ui.unlock;
|
||||
|
||||
import org.cryptomator.common.ObservableUtil;
|
||||
import org.cryptomator.common.mount.HideawayNotDirectoryException;
|
||||
import org.cryptomator.common.mount.IllegalMountPointException;
|
||||
import org.cryptomator.common.mount.MountPointCleanupFailedException;
|
||||
import org.cryptomator.common.mount.MountPointInUseException;
|
||||
import org.cryptomator.common.mount.MountPointNotExistsException;
|
||||
import org.cryptomator.common.mount.MountPointNotEmptyDirectoryException;
|
||||
import org.cryptomator.common.mount.MountPointNotExistingException;
|
||||
import org.cryptomator.common.mount.MountPointNotSupportedException;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
@@ -9,12 +14,15 @@ import org.cryptomator.ui.controls.FormattedLabel;
|
||||
import org.cryptomator.ui.fxapp.FxApplicationWindows;
|
||||
import org.cryptomator.ui.preferences.SelectedPreferencesTab;
|
||||
import org.cryptomator.ui.vaultoptions.SelectedVaultOptionsTab;
|
||||
import org.jetbrains.annotations.PropertyKey;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.value.ObservableValue;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.stage.Stage;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
//At the current point in time only the CustomMountPointChooser may cause this window to be shown.
|
||||
@UnlockScoped
|
||||
@@ -23,28 +31,31 @@ public class UnlockInvalidMountPointController implements FxController {
|
||||
private final Stage window;
|
||||
private final Vault vault;
|
||||
private final FxApplicationWindows appWindows;
|
||||
private final ResourceBundle resourceBundle;
|
||||
private final ExceptionType exceptionType;
|
||||
private final String exceptionMessage;
|
||||
|
||||
private final ObservableValue<ExceptionType> exceptionType;
|
||||
private final ObservableValue<Path> exceptionPath;
|
||||
private final ObservableValue<String> exceptionMessage;
|
||||
private final ObservableValue<Path> hideawayPath;
|
||||
private final ObservableValue<String> format;
|
||||
private final ObservableValue<Boolean> showPreferences;
|
||||
private final ObservableValue<Boolean> showVaultOptions;
|
||||
|
||||
public FormattedLabel dialogDescription;
|
||||
|
||||
@Inject
|
||||
UnlockInvalidMountPointController(@UnlockWindow Stage window, @UnlockWindow Vault vault, @UnlockWindow AtomicReference<Throwable> unlockException, FxApplicationWindows appWindows, ResourceBundle resourceBundle) {
|
||||
UnlockInvalidMountPointController(@UnlockWindow Stage window, @UnlockWindow Vault vault, @UnlockWindow ObjectProperty<IllegalMountPointException> illegalMountPointException, FxApplicationWindows appWindows, ResourceBundle resourceBundle) {
|
||||
this.window = window;
|
||||
this.vault = vault;
|
||||
this.appWindows = appWindows;
|
||||
this.resourceBundle = resourceBundle;
|
||||
|
||||
var exc = unlockException.get();
|
||||
this.exceptionType = getExceptionType(exc);
|
||||
this.exceptionMessage = exc.getMessage();
|
||||
}
|
||||
this.exceptionType = illegalMountPointException.map(this::getExceptionType);
|
||||
this.exceptionPath = illegalMountPointException.map(IllegalMountPointException::getMountpoint);
|
||||
this.exceptionMessage = illegalMountPointException.map(IllegalMountPointException::getMessage);
|
||||
this.hideawayPath = illegalMountPointException.map(e -> e instanceof HideawayNotDirectoryException haeExc ? haeExc.getHideaway() : null);
|
||||
|
||||
@FXML
|
||||
public void initialize() {
|
||||
dialogDescription.setFormat(resourceBundle.getString(exceptionType.translationKey));
|
||||
dialogDescription.setArg1(exceptionMessage);
|
||||
this.format = ObservableUtil.mapWithDefault(exceptionType, type -> resourceBundle.getString(type.translationKey), "");
|
||||
this.showPreferences = ObservableUtil.mapWithDefault(exceptionType, type -> type.action == ButtonAction.SHOW_PREFERENCES, false);
|
||||
this.showVaultOptions = ObservableUtil.mapWithDefault(exceptionType, type -> type.action == ButtonAction.SHOW_VAULT_OPTIONS, false);
|
||||
}
|
||||
|
||||
@FXML
|
||||
@@ -67,8 +78,11 @@ public class UnlockInvalidMountPointController implements FxController {
|
||||
private ExceptionType getExceptionType(Throwable unlockException) {
|
||||
return switch (unlockException) {
|
||||
case MountPointNotSupportedException x -> ExceptionType.NOT_SUPPORTED;
|
||||
case MountPointNotExistsException x -> ExceptionType.NOT_EXISTING;
|
||||
case MountPointNotExistingException x -> ExceptionType.NOT_EXISTING;
|
||||
case MountPointInUseException x -> ExceptionType.IN_USE;
|
||||
case HideawayNotDirectoryException x -> ExceptionType.HIDEAWAY_NOT_DIR;
|
||||
case MountPointCleanupFailedException x -> ExceptionType.COULD_NOT_BE_CLEARED;
|
||||
case MountPointNotEmptyDirectoryException x -> ExceptionType.NOT_EMPTY_DIRECTORY;
|
||||
default -> ExceptionType.GENERIC;
|
||||
};
|
||||
}
|
||||
@@ -78,12 +92,15 @@ public class UnlockInvalidMountPointController implements FxController {
|
||||
NOT_SUPPORTED("unlock.error.customPath.description.notSupported", ButtonAction.SHOW_PREFERENCES),
|
||||
NOT_EXISTING("unlock.error.customPath.description.notExists", ButtonAction.SHOW_VAULT_OPTIONS),
|
||||
IN_USE("unlock.error.customPath.description.inUse", ButtonAction.SHOW_VAULT_OPTIONS),
|
||||
HIDEAWAY_NOT_DIR("unlock.error.customPath.description.hideawayNotDir", ButtonAction.SHOW_VAULT_OPTIONS),
|
||||
COULD_NOT_BE_CLEARED("unlock.error.customPath.description.couldNotBeCleaned", ButtonAction.SHOW_VAULT_OPTIONS),
|
||||
NOT_EMPTY_DIRECTORY("unlock.error.customPath.description.notEmptyDir", ButtonAction.SHOW_VAULT_OPTIONS),
|
||||
GENERIC("unlock.error.customPath.description.generic", ButtonAction.SHOW_PREFERENCES);
|
||||
|
||||
private final String translationKey;
|
||||
private final ButtonAction action;
|
||||
|
||||
ExceptionType(String translationKey, ButtonAction action) {
|
||||
ExceptionType(@PropertyKey(resourceBundle = "i18n.strings") String translationKey, ButtonAction action) {
|
||||
this.translationKey = translationKey;
|
||||
this.action = action;
|
||||
}
|
||||
@@ -91,6 +108,7 @@ public class UnlockInvalidMountPointController implements FxController {
|
||||
|
||||
private enum ButtonAction {
|
||||
|
||||
//TODO Add option to show filesystem, e.g. for ExceptionType.HIDEAWAY_EXISTS
|
||||
SHOW_PREFERENCES,
|
||||
SHOW_VAULT_OPTIONS;
|
||||
|
||||
@@ -98,11 +116,51 @@ public class UnlockInvalidMountPointController implements FxController {
|
||||
|
||||
/* Getter */
|
||||
|
||||
public boolean isShowPreferences() {
|
||||
return exceptionType.action == ButtonAction.SHOW_PREFERENCES;
|
||||
public Path getExceptionPath() {
|
||||
return exceptionPath.getValue();
|
||||
}
|
||||
|
||||
public boolean isShowVaultOptions() {
|
||||
return exceptionType.action == ButtonAction.SHOW_VAULT_OPTIONS;
|
||||
public ObservableValue<Path> exceptionPathProperty() {
|
||||
return exceptionPath;
|
||||
}
|
||||
|
||||
public String getFormat() {
|
||||
return format.getValue();
|
||||
}
|
||||
|
||||
public ObservableValue<String> formatProperty() {
|
||||
return format;
|
||||
}
|
||||
|
||||
public String getExceptionMessage() {
|
||||
return exceptionMessage.getValue();
|
||||
}
|
||||
|
||||
public ObservableValue<String> exceptionMessageProperty() {
|
||||
return exceptionMessage;
|
||||
}
|
||||
|
||||
public Path getHideawayPath() {
|
||||
return hideawayPath.getValue();
|
||||
}
|
||||
|
||||
public ObservableValue<Path> hideawayPathProperty() {
|
||||
return hideawayPath;
|
||||
}
|
||||
|
||||
public Boolean getShowPreferences() {
|
||||
return showPreferences.getValue();
|
||||
}
|
||||
|
||||
public ObservableValue<Boolean> showPreferencesProperty() {
|
||||
return showPreferences;
|
||||
}
|
||||
|
||||
public Boolean getShowVaultOptions() {
|
||||
return showVaultOptions.getValue();
|
||||
}
|
||||
|
||||
public ObservableValue<Boolean> showVaultOptionsProperty() {
|
||||
return showVaultOptions;
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import dagger.Binds;
|
||||
import dagger.Module;
|
||||
import dagger.Provides;
|
||||
import dagger.multibindings.IntoMap;
|
||||
import org.cryptomator.common.mount.IllegalMountPointException;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.ui.common.DefaultSceneFactory;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
@@ -18,12 +19,13 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Provider;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.SimpleObjectProperty;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.stage.Modality;
|
||||
import javafx.stage.Stage;
|
||||
import java.util.Map;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
@Module(subcomponents = {KeyLoadingComponent.class})
|
||||
abstract class UnlockModule {
|
||||
@@ -61,8 +63,8 @@ abstract class UnlockModule {
|
||||
@Provides
|
||||
@UnlockWindow
|
||||
@UnlockScoped
|
||||
static AtomicReference<Throwable> unlockException() {
|
||||
return new AtomicReference<>();
|
||||
static ObjectProperty<IllegalMountPointException> illegalMountPointException() {
|
||||
return new SimpleObjectProperty<>();
|
||||
}
|
||||
|
||||
@Provides
|
||||
|
||||
@@ -17,11 +17,11 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.concurrent.Task;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.stage.Stage;
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
/**
|
||||
* A multi-step task that consists of background activities as well as user interaction.
|
||||
@@ -40,10 +40,10 @@ public class UnlockWorkflow extends Task<Boolean> {
|
||||
private final Lazy<Scene> invalidMountPointScene;
|
||||
private final FxApplicationWindows appWindows;
|
||||
private final KeyLoadingStrategy keyLoadingStrategy;
|
||||
private final AtomicReference<Throwable> unlockFailedException;
|
||||
private final ObjectProperty<IllegalMountPointException> illegalMountPointException;
|
||||
|
||||
@Inject
|
||||
UnlockWorkflow(@UnlockWindow Stage window, @UnlockWindow Vault vault, VaultService vaultService, @FxmlScene(FxmlFile.UNLOCK_SUCCESS) Lazy<Scene> successScene, @FxmlScene(FxmlFile.UNLOCK_INVALID_MOUNT_POINT) Lazy<Scene> invalidMountPointScene, FxApplicationWindows appWindows, @UnlockWindow KeyLoadingStrategy keyLoadingStrategy, @UnlockWindow AtomicReference<Throwable> unlockFailedException) {
|
||||
UnlockWorkflow(@UnlockWindow Stage window, @UnlockWindow Vault vault, VaultService vaultService, @FxmlScene(FxmlFile.UNLOCK_SUCCESS) Lazy<Scene> successScene, @FxmlScene(FxmlFile.UNLOCK_INVALID_MOUNT_POINT) Lazy<Scene> invalidMountPointScene, FxApplicationWindows appWindows, @UnlockWindow KeyLoadingStrategy keyLoadingStrategy, @UnlockWindow ObjectProperty<IllegalMountPointException> illegalMountPointException) {
|
||||
this.window = window;
|
||||
this.vault = vault;
|
||||
this.vaultService = vaultService;
|
||||
@@ -51,7 +51,7 @@ public class UnlockWorkflow extends Task<Boolean> {
|
||||
this.invalidMountPointScene = invalidMountPointScene;
|
||||
this.appWindows = appWindows;
|
||||
this.keyLoadingStrategy = keyLoadingStrategy;
|
||||
this.unlockFailedException = unlockFailedException;
|
||||
this.illegalMountPointException = illegalMountPointException;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -79,7 +79,7 @@ public class UnlockWorkflow extends Task<Boolean> {
|
||||
|
||||
private void handleIllegalMountPointError(IllegalMountPointException impe) {
|
||||
Platform.runLater(() -> {
|
||||
unlockFailedException.set(impe);
|
||||
illegalMountPointException.set(impe);
|
||||
window.setScene(invalidMountPointScene.get());
|
||||
window.show();
|
||||
});
|
||||
|
||||
@@ -32,25 +32,37 @@
|
||||
</StackPane>
|
||||
<VBox spacing="6" HBox.hgrow="ALWAYS">
|
||||
<FormattedLabel styleClass="label-extra-large" format="%error.message" arg1="${controller.errorCode}"/>
|
||||
<FontAwesome5Spinner glyphSize="24" visible="${controller.isLoadingHttpResponse}" managed="${controller.isLoadingHttpResponse}"/>
|
||||
<VBox visible="${!controller.isLoadingHttpResponse}" managed="${!controller.isLoadingHttpResponse}">
|
||||
<Label text="%error.existingSolutionDescription" wrapText="true" visible="${controller.errorSolutionFound}" managed="${controller.errorSolutionFound}"/>
|
||||
<Hyperlink styleClass="hyperlink-underline" text="%error.hyperlink.solution" onAction="#showSolution" contentDisplay="LEFT" visible="${controller.errorSolutionFound}" managed="${controller.errorSolutionFound}">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
|
||||
</graphic>
|
||||
</Hyperlink>
|
||||
<Label text="%error.description" wrapText="true" visible="${!controller.errorSolutionFound}" managed="${!controller.errorSolutionFound}"/>
|
||||
<Hyperlink styleClass="hyperlink-underline" text="%error.hyperlink.lookup" onAction="#searchError" contentDisplay="LEFT" visible="${!controller.errorSolutionFound}" managed="${!controller.errorSolutionFound}">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
|
||||
</graphic>
|
||||
</Hyperlink>
|
||||
<Hyperlink styleClass="hyperlink-underline" text="%error.hyperlink.report" onAction="#reportError" contentDisplay="LEFT" visible="${!controller.errorSolutionFound}" managed="${!controller.errorSolutionFound}">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
|
||||
</graphic>
|
||||
</Hyperlink>
|
||||
<VBox visible="${!controller.askedForLookupDatabasePermission}" managed="${!controller.askedForLookupDatabasePermission}">
|
||||
<Label text="%error.lookupPermissionMessage" wrapText="true"/>
|
||||
<Region VBox.vgrow="ALWAYS" minHeight="18"/>
|
||||
<ButtonBar buttonMinWidth="120" buttonOrder="+NY">
|
||||
<buttons>
|
||||
<Button text="%error.dismiss" ButtonBar.buttonData="NO" onAction="#dismiss"/>
|
||||
<Button text="%error.lookUpSolution" ButtonBar.buttonData="YES" defaultButton="true" onAction="#lookUpSolution"/>
|
||||
</buttons>
|
||||
</ButtonBar>
|
||||
</VBox>
|
||||
<VBox visible="${controller.askedForLookupDatabasePermission}" managed="${controller.askedForLookupDatabasePermission}">
|
||||
<FontAwesome5Spinner glyphSize="24" visible="${controller.isLoadingHttpResponse}" managed="${controller.isLoadingHttpResponse}"/>
|
||||
<VBox visible="${!controller.isLoadingHttpResponse}" managed="${!controller.isLoadingHttpResponse}">
|
||||
<Label text="%error.existingSolutionDescription" wrapText="true" visible="${controller.errorSolutionFound}" managed="${controller.errorSolutionFound}"/>
|
||||
<Hyperlink styleClass="hyperlink-underline" text="%error.hyperlink.solution" onAction="#showSolution" contentDisplay="LEFT" visible="${controller.errorSolutionFound}" managed="${controller.errorSolutionFound}">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
|
||||
</graphic>
|
||||
</Hyperlink>
|
||||
<Label text="%error.description" wrapText="true" visible="${!controller.errorSolutionFound}" managed="${!controller.errorSolutionFound}"/>
|
||||
<Hyperlink styleClass="hyperlink-underline" text="%error.hyperlink.lookup" onAction="#searchError" contentDisplay="LEFT" visible="${!controller.errorSolutionFound}" managed="${!controller.errorSolutionFound}">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
|
||||
</graphic>
|
||||
</Hyperlink>
|
||||
<Hyperlink styleClass="hyperlink-underline" text="%error.hyperlink.report" onAction="#reportError" contentDisplay="LEFT" visible="${!controller.errorSolutionFound}" managed="${!controller.errorSolutionFound}">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
|
||||
</graphic>
|
||||
</Hyperlink>
|
||||
</VBox>
|
||||
</VBox>
|
||||
</VBox>
|
||||
</HBox>
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
</padding>
|
||||
</Label>
|
||||
|
||||
<FormattedLabel fx:id="dialogDescription" wrapText="true" textAlignment="LEFT"/>
|
||||
<FormattedLabel fx:id="dialogDescription" wrapText="true" textAlignment="LEFT" format="${controller.format}" arg1="${controller.exceptionPath}" arg2="${controller.exceptionMessage}" arg3="${controller.hideawayPath}"/>
|
||||
|
||||
<Region VBox.vgrow="ALWAYS" minHeight="18"/>
|
||||
<ButtonBar buttonMinWidth="120" buttonOrder="+CI">
|
||||
|
||||
@@ -23,7 +23,9 @@ error.hyperlink.report=Report this error
|
||||
error.technicalDetails=Details:
|
||||
error.existingSolutionDescription=Cryptomator didn't expect this to happen. But we found an existing solution for this error. Please take a look at the following link.
|
||||
error.hyperlink.solution=Look up the solution
|
||||
|
||||
error.lookupPermissionMessage=Cryptomator can look up a solution for this problem online. This will send a request to our problem database from your IP address.
|
||||
error.dismiss=Dismiss
|
||||
error.lookUpSolution=Look up Solution
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Vault
|
||||
@@ -136,8 +138,11 @@ unlock.success.revealBtn=Reveal Drive
|
||||
unlock.error.customPath.message=Unable to mount vault to custom path
|
||||
unlock.error.customPath.description.notSupported=If you wish to keep using the custom path, please go to the preferences and select a volume type that supports it. Otherwise, go to the vault options and choose a supported mount point.
|
||||
unlock.error.customPath.description.notExists=The custom mount path does not exist. Either create it in your local filesystem or change it in the vault options.
|
||||
unlock.error.customPath.description.inUse=Drive letter "%s" is already in use.
|
||||
unlock.error.customPath.description.generic=You have selected a custom mount path for this vault, but using it failed with the message: %s
|
||||
unlock.error.customPath.description.inUse=The drive letter or custom mount path "%s" is already in use.
|
||||
unlock.error.customPath.description.hideawayNotDir=The temporary, hidden file "%3$s" used for unlock could not be removed. Please check the file and then delete it manually.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Your vault could not be mounted to the path "%s". Please try again or choose a different path.
|
||||
unlock.error.customPath.description.notEmptyDir=The custom mount path "%s" is not an empty folder. Please choose an empty folder and try again.
|
||||
unlock.error.customPath.description.generic=You have selected a custom mount path for this vault, but using it failed with the message: %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=Unable to access device key
|
||||
hub.noKeychain.description=In order to unlock Hub vaults, a device key is required, which is secured using a keychain. To proceed, enable “%s” and select a keychain in the preferences.
|
||||
|
||||
@@ -22,7 +22,9 @@ error.hyperlink.report=أبلغ عن هذا الخطأ
|
||||
error.technicalDetails=التفاصيل:
|
||||
error.existingSolutionDescription=لم يتوقع "كريبتوماتور" حدوث ذلك. لكننا وجدنا حلا لهذا الخطأ. يرجى إلقاء نظرة على الرابط التالي.
|
||||
error.hyperlink.solution=ابحث عن الحل
|
||||
|
||||
error.lookupPermissionMessage=يمكن لـ Cryptomator البحث عن حل لهذه المشكلة على الإنترنت. هذا سيرسل طلب إلى قاعدة بيانات مشكلتنا من عنوان IP الخاص بك.
|
||||
error.dismiss=تجاهل
|
||||
error.lookUpSolution=البحث عن حل
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=الخزينة
|
||||
@@ -63,6 +65,11 @@ addvaultwizard.new.validCharacters.chars=أحرف الكلمات (أمثلة: a,
|
||||
addvaultwizard.new.validCharacters.numbers=الأعداد
|
||||
addvaultwizard.new.validCharacters.dashes=الشرطة (%s) أو الشرطة السفلية (%s)
|
||||
### Expert Settings
|
||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=تمكين إعدادات الخبراء
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=أدخل قيمة بين 36 و 220 (الافتراضي 220)
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=افتح وثائق الدعم لمعرفة المزيد.
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.title=الحد الأقصى لطول أسماء الملفات المشفرة
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=صالح
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=إنشاء المخزن
|
||||
addvaultwizard.new.generateRecoveryKeyChoice=لن تتمكن من الوصول إلى بياناتك بدون كلمة المرور الخاصة بك. هل تريد مفتاح استرداد في حالة فقدان كلمة المرور الخاصة بك؟
|
||||
@@ -107,6 +114,7 @@ changepassword.finalConfirmation=أتفهم أنني لن أتمكن من الو
|
||||
|
||||
# Forget Password
|
||||
forgetPassword.title=نسيت كلمة المرور
|
||||
forgetPassword.message=نسيت كلمة المرور؟
|
||||
forgetPassword.description=سيؤدي هذا إلى حذف كلمة المرور المحفوظة لهذا المخزن من سلسلة مفاتيح النظام الخاص بك.
|
||||
forgetPassword.confirmBtn=نسيت كلمة المرور
|
||||
|
||||
@@ -126,26 +134,43 @@ unlock.success.description=تم فتح "%s" بنجاح! يمكنك الآن ال
|
||||
unlock.success.rememberChoice=تذكر اختياري ولا تظهر هذا مرة أخرى
|
||||
unlock.success.revealBtn=اظهار القرص
|
||||
## Failure
|
||||
unlock.error.customPath.description.inUse=حرف القرص "%s" قيد الاستخدام.
|
||||
unlock.error.customPath.description.generic=لقد اخترت مسار تثبيت مخصص لهذه الخزينة، ولكن استخدامه فشل مع الرسالة: %s
|
||||
unlock.error.customPath.message=غير قادر على تركيب المخزن إلى المسار المخصص
|
||||
unlock.error.customPath.description.notSupported=إذا كنت ترغب في الاستمرار في استخدام المسار المخصص، يرجى الذَّهاب إلى التفضيلات وتحديد نوع واسطة التخزين الذي يدعمها. خلاف ذلك، انتقل إلى خيارات المخزن واختر نقطة تركيب مدعومة.
|
||||
unlock.error.customPath.description.notExists=مسار التركيب المخصص غير موجود. قم بإنشائه في نظام الملفات المحلي الخاص بك أو اختر غيره في خيارات الخزانة.
|
||||
unlock.error.customPath.description.inUse=حرف القرص أو مسار التركيب المخصص "%s" قيد الاستخدام بالفعل.
|
||||
unlock.error.customPath.description.hideawayNotDir=لا يمكن إزالة الملف المؤقت المخفي "%3$s" المستخدم للفتح. الرجاء التحقق من الملف ثم حذفه يدوياً.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=لا يمكن تركيب خزانتك على المسار "%s". الرجاء المحاولة مرة أخرى أو اختيار مسار مختلف.
|
||||
unlock.error.customPath.description.notEmptyDir=مسار التركيب المخصص "%s" ليس مجلد فارغ. الرجاء اختيار مجلد فارغ وحاول مرة أخرى.
|
||||
unlock.error.customPath.description.generic=لقد اخترت مسار تركيب مخصص لهذه الخزانة، ولكن استخدامه فشل مع الرسالة: %2$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
|
||||
@@ -188,20 +213,42 @@ 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بنية المخزن عادية.
|
||||
## Fix Application
|
||||
|
||||
# Preferences
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Падрабязнасці:
|
||||
error.existingSolutionDescription=Cryptomator не чакаў такога, але мы знайшлі, як можна выправіць гэтую хібу. Калі ласка, скарыстайся спасылкаю.
|
||||
error.hyperlink.solution=Паглядзець на рашэнне
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Скарбніца
|
||||
|
||||
@@ -130,8 +129,6 @@ unlock.success.revealBtn=Паказаць дыск
|
||||
unlock.error.customPath.message=Не магчыма змантажаваць скарбніцу да карыстальніцкай сцежкі
|
||||
unlock.error.customPath.description.notSupported=Калі ты надалей жадаеш карыстацца адмысловаю сцежкаю, калі ласка, пайдзі ў налады ды абары там тып тому, які падтрымлівае яе. У іншым выпадку пайдзі ў опцыі скарбніцы ды абяры там пункт мантажавання, які падтрымліваецца.
|
||||
unlock.error.customPath.description.notExists=Адмысловая сцежка мантажавання не існуе. Ствары яе ў сваёй файлавай сістэме, альбо змяні яе ў опцыях скарбніцы.
|
||||
unlock.error.customPath.description.inUse=Дыскавая літара "%s" ужо выкарыстоўваецца.
|
||||
unlock.error.customPath.description.generic=Ты абраў адмысловую сцежку мантажавання для гэтай скарбніцы, але скарыстацца ёю не ўдалося. Вось паведамленне пра памылку: %s
|
||||
## Hub
|
||||
hub.noKeychain.message=Няма доступу да ключа прылады
|
||||
hub.noKeychain.description=Каб разамкнуць скарбніцы Hub, патрэбны ключ прылады, які захаваны ў звязку ключоў. Каб працягнуць, уключы "%s" ды абяры звязак ключоў у наладах.
|
||||
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=Търсене на грешката
|
||||
error.hyperlink.report=Докладване на грешката
|
||||
error.technicalDetails=Подробности:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Хранилище
|
||||
|
||||
@@ -126,8 +125,6 @@ unlock.success.revealBtn=Разкриване на диска
|
||||
unlock.error.customPath.message=Хранилището не може да бъде монтирано в потребителския път
|
||||
unlock.error.customPath.description.notSupported=Ако искате да продължите да използвате потребитрлския път, отидете в настройките и изберете вид на дял, който поддържа потребителски пътища. В противен случай отидете в настройките на хранилището и изберете поддържана точка за монтиране.
|
||||
unlock.error.customPath.description.notExists=Потребителският път на монтиране не съществува. Създайте го в местната файлова система или го променете в настройките на хранилището.
|
||||
unlock.error.customPath.description.inUse=Има друго устройство с буква „%s“.
|
||||
unlock.error.customPath.description.generic=Избрали сте потребителски път за монтиране на това хранилище, но при използването на този път възникна следната грешка: %s
|
||||
## Hub
|
||||
hub.noKeychain.message=Няма достъп до ключа на устройството
|
||||
hub.noKeychain.description=За да отключите хранилищата в Hub е необходим ключ за устройството, който се защитава с помощта на ключодържател. За да продължите, разрешете „%s“ и изберете ключодържателя в настройките.
|
||||
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=ত্রুটিটি খুঁজে দেখুন
|
||||
error.hyperlink.report=ত্রুটিটি রিপোর্ট করুন
|
||||
error.technicalDetails=বিস্তারিত:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=ভোল্ট
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@ generic.button.print=Ispis
|
||||
# Error
|
||||
error.message=Došlo je do greške
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Sef
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Detalls:
|
||||
error.existingSolutionDescription=Cryptomator no esperava que això ocorreguera. Però hem trobat una solució per a aquest error. Per favor, done una ullada al següent enllaç.
|
||||
error.hyperlink.solution=Buscar la solució
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Caixa forta
|
||||
|
||||
@@ -130,7 +129,6 @@ unlock.success.revealBtn=Mostra la unitat
|
||||
unlock.error.customPath.message=No es pot muntar la caixa forta en la ruta personalitzada
|
||||
unlock.error.customPath.description.notSupported=Si vol continuar fent servir una ruta personalitzada, vagi si us plau a Preferències i seleccioni un tipus de volum que la suporti. Altrament, vagi a les opcions de la caixa forta i escolli un punt de muntatge suportat.
|
||||
unlock.error.customPath.description.notExists=La ruta de muntatge personalitzada no existeix. Creï-la o canviï-la en les opcions de la caixa forta.
|
||||
unlock.error.customPath.description.generic=Ha seleccionat una ruta personalitzada on muntar la caixa forta, però ha fallat amb aquest missatge: %s
|
||||
## Hub
|
||||
hub.noKeychain.message=No es pot accedir a la clau del dispositiu
|
||||
hub.noKeychain.description=Per poder desblocar caixes fortes del Hub es requereix la clau d'un dispositiu, que s'emmagatzema de forma segura en un clauer. Per continuar, habiliti "%s" i seleccioni un clauer en les Preferències.
|
||||
|
||||
@@ -22,7 +22,7 @@ error.hyperlink.report=Nahlásit tuto chybu
|
||||
error.technicalDetails=Podrobnosti:
|
||||
error.existingSolutionDescription=Cryptomator neočekával, že se tak stane. Našli jsme však existující řešení pro tuto chybu. Podívejte se prosím na následující odkaz.
|
||||
error.hyperlink.solution=Podívejte se na řešení
|
||||
|
||||
error.lookupPermissionMessage=Cryptomator může najít řešení tohoto problému online. To odešle žádost do naší databáze problémů z vaší IP adresy.
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Trezor
|
||||
@@ -135,8 +135,6 @@ unlock.success.revealBtn=Zobrazit jednotku
|
||||
unlock.error.customPath.message=Nelze připojit trezor k vlastní cestě
|
||||
unlock.error.customPath.description.notSupported=Pokud chcete pokračovat v používání vlastní cesty, přejděte do nastavení a vyberte typ hlasitosti, který ji podporuje. V opačném případě přejděte do možností trezoru a vyberte podporovaný přípojný bod.
|
||||
unlock.error.customPath.description.notExists=Cesta k připojení neexistuje. Buď ji vytvořte ve vašem lokálním souborovém systému, nebo ji změňte v možnostech trezoru.
|
||||
unlock.error.customPath.description.inUse=Písmeno „%s“ už je používáno pro jiný disk.
|
||||
unlock.error.customPath.description.generic=Pro tento trezor jste vybrali vlastní cestu, ale použití selhalo se zprávou: %s
|
||||
## Hub
|
||||
hub.noKeychain.message=Nelze získat přístup ke klíči zařízení
|
||||
hub.noKeychain.openBtn=Otevřít předvolby
|
||||
@@ -275,6 +273,8 @@ preferences.interface.showTrayIcon=Zobrazit ikonu v liště (vyžaduje restart)
|
||||
preferences.volume=Virtuální jednotky
|
||||
preferences.volume.type.automatic=Automatické
|
||||
preferences.volume.tcp.port=TCP port
|
||||
preferences.volume.feature.mountFlags=Vlastní možnosti připojení disku
|
||||
preferences.volume.feature.readOnly=Připojení disku pouze pro čtení
|
||||
## Updates
|
||||
preferences.updates=Aktualizace
|
||||
preferences.updates.currentVersion=Aktuální verze: %s
|
||||
@@ -297,21 +297,27 @@ stats.title=Statistika pro %s
|
||||
stats.cacheHitRate=Rychlost dosažené mezipaměti
|
||||
## Read
|
||||
stats.read.throughput.idle=Čtení: nečinné
|
||||
stats.read.throughput.kibs=Rychlost čtení: %.2f KiB/s
|
||||
stats.read.throughput.mibs=Čtení: %.2f MiB/s
|
||||
stats.read.total.data.none=Přečteno: -
|
||||
stats.read.total.data.kib=Přečtená data: %.1f KiB
|
||||
stats.read.total.data.mib=Přečteno: %.1f MiB
|
||||
stats.read.total.data.gib=Přečteno: %.1f GiB
|
||||
stats.decr.total.data.none=Dešifrováno: -
|
||||
stats.decr.total.data.kib=Dešifrovaná data: %.1f KiB
|
||||
stats.decr.total.data.mib=Dešifrováno: %.1f MiB
|
||||
stats.decr.total.data.gib=Dešifrováno: %.1f GiB
|
||||
stats.read.accessCount=Celkem přečteno: %d
|
||||
## Write
|
||||
stats.write.throughput.idle=Zápis: nečinný
|
||||
stats.write.throughput.kibs=Rychlost zápisu: %.2f KiB/s
|
||||
stats.write.throughput.mibs=Zápis: %.2f MiB/s
|
||||
stats.write.total.data.none=Zapsaná data: -
|
||||
stats.write.total.data.kib=Zapsaná data: %.1f KiB
|
||||
stats.write.total.data.mib=Zapsáno: %.1f MiB
|
||||
stats.write.total.data.gib=Zapsáno: %.1f GiB
|
||||
stats.encr.total.data.none=Zašifrováno: -
|
||||
stats.encr.total.data.kib=Zašifrovaná data: %.1f KiB
|
||||
stats.encr.total.data.mib=Zašifrováno: %.1f MiB
|
||||
stats.encr.total.data.gib=Zašifrováno: %.1f GiB
|
||||
stats.write.accessCount=Celkem zapsáno: %d
|
||||
@@ -358,6 +364,7 @@ main.vaultDetail.throughput.kbps=%.1f KiB/s
|
||||
main.vaultDetail.throughput.mbps=%.1f MiB/s
|
||||
main.vaultDetail.stats=Statistiky trezoru
|
||||
main.vaultDetail.locateEncryptedFileBtn=Najít šifrovaný soubor
|
||||
main.vaultDetail.encryptedPathsCopied=Cesta souboru byla zkopírována do schránky!
|
||||
### Missing
|
||||
main.vaultDetail.missing.info=Cryptomator nemohl najít trezor na této cestě.
|
||||
main.vaultDetail.missing.recheck=Znovu zkontrolovat
|
||||
@@ -431,6 +438,7 @@ recoveryKey.printout.heading=Obnovovací klíč Cryptomator\n"%s"\n
|
||||
### Reset Password
|
||||
recoveryKey.recover.resetBtn=Resetovat
|
||||
### Recovery Key Password Reset Success
|
||||
recoveryKey.recover.resetSuccess.message=Resetování hesla bylo úspěšné
|
||||
|
||||
# Convert Vault
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Detaljer:
|
||||
error.existingSolutionDescription=Cryptomator forventede ikke, at dette ville ske. Men vi har fundet en eksisterende løsning på denne fejl. Tag et kig på følgende link.
|
||||
error.hyperlink.solution=Tjek løsningen
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Boks
|
||||
|
||||
@@ -135,8 +134,6 @@ unlock.success.revealBtn=Vis drev
|
||||
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.inUse=Drevbogstavet "%s" er allerede i brug.
|
||||
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.
|
||||
|
||||
@@ -22,7 +22,9 @@ error.hyperlink.report=Diesen Fehler melden
|
||||
error.technicalDetails=Details:
|
||||
error.existingSolutionDescription=Cryptomator hat dies nicht erwartet, wir haben jedoch eine funktionierende Lösung für diesen Fehler gefunden. Bitte wirf einen Blick auf den folgenden Link.
|
||||
error.hyperlink.solution=Lösung nachsehen
|
||||
|
||||
error.lookupPermissionMessage=Cryptomator kann online nach einer Lösung für dieses Problem suchen. Hierbei wird eine Anfrage an unsere Problemdatenbank gesendet. Bitte beachte, dass dabei auch deine IP-Adresse übermittelt wird.
|
||||
error.dismiss=Verwerfen
|
||||
error.lookUpSolution=Lösung suchen
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Tresor
|
||||
@@ -63,10 +65,10 @@ addvaultwizard.new.validCharacters.chars=Wortzeichen (z. B. a, ж oder 수)
|
||||
addvaultwizard.new.validCharacters.numbers=Zahlen
|
||||
addvaultwizard.new.validCharacters.dashes=Bindestrich (%s) oder Unterstrich (%s)
|
||||
### Expert Settings
|
||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Experten-Einstellungen anzeigen
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Gebe einen Wert zwischen 36 und 220 (Standard 220) ein
|
||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Experteneinstellungen aktivieren
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Gib einen Wert zwischen 36 und 220 ein (Standardwert: 220)
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Öffne die Dokumentation, um mehr zu erfahren.
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.title=Maximale Länge der verschlüsselten Dateinamen
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.title=Maximale Länge verschlüsselter Dateinamen
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Gültig
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=Tresor erstellen
|
||||
@@ -87,7 +89,7 @@ addvault.new.readme.storageLocation.9=3. Öffne den Zugangsort durch Klicken au
|
||||
addvault.new.readme.storageLocation.10=Falls du Hilfe brauchst, lies die Dokumentation: %s
|
||||
addvault.new.readme.accessLocation.fileName=WILLKOMMEN.rtf
|
||||
addvault.new.readme.accessLocation.1=🔐️ VERSCHLÜSSELTES LAUFWERK 🔐️
|
||||
addvault.new.readme.accessLocation.2=Dies ist der Zugriffsort auf deinen Tresor.
|
||||
addvault.new.readme.accessLocation.2=Dies ist der Zugangsort deines Tresors.
|
||||
addvault.new.readme.accessLocation.3=Alle zu diesem Laufwerk hinzugefügten Dateien werden von Cryptomator verschlüsselt. Du kannst mit diesem arbeiten wie mit jedem anderen Laufwerk bzw. Ordner. Dies ist lediglich eine unverschlüsselte Ansicht des Laufwerkinhalts; auf deiner Festplatte bleiben deine Dateien weiterhin verschlüsselt.
|
||||
addvault.new.readme.accessLocation.4=Du kannst diese Datei löschen.
|
||||
## Existing
|
||||
@@ -132,11 +134,14 @@ 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.message=Tresor kann nicht in benutzerdefinierten Pfad eingehängt werden
|
||||
unlock.error.customPath.description.notSupported=Wenn du weiterhin den benutzerdefinierten Pfad verwenden möchtest, öffne die allgemeinen Einstellungen und wähle einen unterstützten Laufwerkstyp. Andernfalls gehe zu den Tresor-Optionen und wähle einen unterstützten Einhängepunkt.
|
||||
unlock.error.customPath.description.notExists=Der benutzerdefinierte Einhängepunkt existiert nicht. Erstelle ihn in deinem lokalen Dateisystem oder ändere ihn in den Tresor-Optionen.
|
||||
unlock.error.customPath.description.inUse=Laufwerksbuchstabe „%s“ wird bereits verwendet.
|
||||
unlock.error.customPath.description.generic=Du hast für diesen Tresor einen benutzerdefinierten Einhängepunkt ausgewählt, aber dessen Verwendung ist fehlgeschlagen mit der Meldung: %s
|
||||
unlock.error.customPath.description.inUse=Der Laufwerksbuchstabe oder benutzerdefinierte Einhängepunkt „%s“ wird bereits verwendet.
|
||||
unlock.error.customPath.description.hideawayNotDir=Die temporäre, versteckte Datei "%3$s", die für das Entsperren verwendet wurde, konnte nicht entfernt werden. Bitte überprüfe die Datei und lösche sie manuell.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Dein Tresor konnte nicht in den Pfad „%s“ eingehängt werden. Bitte versuche es erneut oder wähle einen anderen Pfad aus.
|
||||
unlock.error.customPath.description.notEmptyDir=Der benutzerdefinierte Einhängepunkt "%s" ist kein leerer Ordner. Bitte wähle einen leeren Ordner und versuche es erneut.
|
||||
unlock.error.customPath.description.generic=Du hast für diesen Tresor einen benutzerdefinierten Einhängepunkt ausgewählt, aber dessen Verwendung ist mit folgender Meldung fehlgeschlagen: %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=Zugriff auf Geräteschlüssel nicht möglich
|
||||
hub.noKeychain.description=Zum Entsperren von Hub-Tresoren wird ein Geräteschlüssel benötigt, der in einem Schlüsselbund gesichert ist. Um fortzufahren, aktiviere „%s“ und wähle in den Einstellungen einen Schlüsselbund.
|
||||
@@ -182,7 +187,7 @@ migration.title=Tresor upgraden
|
||||
## Start
|
||||
migration.start.header=Tresor upgraden
|
||||
migration.start.text=Um deinen Tresor "%s" in dieser neuen Version von Cryptomator zu öffnen, muss der Tresor auf ein neueres Format aktualisiert werden. Bevor du dies tust, solltest du Folgendes wissen:
|
||||
migration.start.remarkUndone=Diese Aktualisierung kann nicht rückgängig gemacht werden.
|
||||
migration.start.remarkUndone=Dieses Upgrade kann nicht rückgängig gemacht werden.
|
||||
migration.start.remarkVersions=Ältere Versionen von Cryptomator können den aktualisierten Tresor nicht öffnen.
|
||||
migration.start.remarkCanRun=Du musst sicherstellen, dass jedes Gerät, von dem aus du auf den Tresor zugreifst, diese Version von Cryptomator ausführen kann.
|
||||
migration.start.remarkSynced=Du musst sicherstellen, dass dein Tresor auf diesem Gerät und auf deinen anderen Geräten vollständig synchronisiert ist, bevor du ihn aktualisierst.
|
||||
@@ -290,9 +295,9 @@ preferences.volume.docsTooltip=Öffne die Dokumentation, um mehr über die versc
|
||||
preferences.volume.fuseRestartRequired=Um die Änderungen anzuwenden, muss Cryptomator neu gestartet werden.
|
||||
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.mountAuto=Automatische Auswahl des Einhängepunkts
|
||||
preferences.volume.feature.mountToDir=Benutzerdefiniertes Verzeichnis als Einhängepunkt
|
||||
preferences.volume.feature.mountToDriveLetter=Laufwerkbuchstaben als Einhängepunkt
|
||||
preferences.volume.feature.mountToDriveLetter=Laufwerksbuchstabe als Einhängepunkt
|
||||
preferences.volume.feature.mountFlags=Benutzerdefinierte Einhänge-Optionen
|
||||
preferences.volume.feature.readOnly=Schreibgeschütztes Einhängen
|
||||
## Updates
|
||||
@@ -344,7 +349,7 @@ stats.write.accessCount=Schreibzugriffe: %d
|
||||
|
||||
## Accesses
|
||||
stats.access.current=Zugriffe: %d
|
||||
stats.access.total=Gesamte Zugriffe: %d
|
||||
stats.access.total=Gesamtzugriffe: %d
|
||||
|
||||
|
||||
# Main Window
|
||||
@@ -500,9 +505,9 @@ quit.forced.description=Das Sperren von Tresoren wurde durch ausstehende Operati
|
||||
quit.forced.forceAndQuitBtn=Erzwingen und beenden
|
||||
|
||||
# Update Reminder
|
||||
updateReminder.title=Aktualisierung überprüfen
|
||||
updateReminder.title=Update-Überprüfung
|
||||
updateReminder.message=Nach Updates suchen?
|
||||
updateReminder.description=Bleibe auf dem Laufenden was neue Features, Bug fixes und Sicherheitsverbesserungen angeht. Wir empfehlen automatisch nach Updates suchen zu lassen.
|
||||
updateReminder.description=Bleib auf dem Laufenden mit neuen Funktionen, Fehlerbehebungen und Sicherheitsverbesserungen. Wir empfehlen, automatisch nach Updates zu suchen.
|
||||
updateReminder.notNow=Nicht jetzt
|
||||
updateReminder.yesOnce=Ja, einmalig
|
||||
updateReminder.yesAutomatically=Ja, automatisch
|
||||
@@ -22,7 +22,9 @@ error.hyperlink.report=Αναφέρετε αυτό το σφάλμα
|
||||
error.technicalDetails=Λεπτομέρειες:
|
||||
error.existingSolutionDescription=Το Cryptomator δεν περίμενε ότι θα συμβεί αυτό. Αλλά βρήκαμε μια υπάρχουσα λύση για αυτό το σφάλμα. Ρίξτε μια ματιά στον παρακάτω σύνδεσμο.
|
||||
error.hyperlink.solution=Αναζήτηση της λύσης
|
||||
|
||||
error.lookupPermissionMessage=Το Cryptomator μπορεί να αναζητήσει μια λύση για αυτό το πρόβλημα στο διαδίκτυο. Αυτό θα στείλει ένα αίτημα στη βάση δεδομένων προβλημάτων μας από τη διεύθυνση IP σας.
|
||||
error.dismiss=Παράβλεψη
|
||||
error.lookUpSolution=Αναζήτηση λύσης
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Κρύπτη
|
||||
@@ -135,8 +137,11 @@ unlock.success.revealBtn=Αποκάλυψη εικονικού δίσκου
|
||||
unlock.error.customPath.message=Αδυναμία προσάρτησης της κρύπτης στην προσαρμοσμένη διαδρομή
|
||||
unlock.error.customPath.description.notSupported=Εάν θέλετε να συνεχίσετε να χρησιμοποιείτε την προσαρμοσμένη διαδρομή, μεταβείτε στις προτιμήσεις και επιλέξτε έναν τύπο τόμου που την υποστηρίζει. Διαφορετικά, μεταβείτε στις επιλογές της κρύπτης και επιλέξτε ένα υποστηριζόμενο σημείο προσάρτησης.
|
||||
unlock.error.customPath.description.notExists=Η προσαρμοσμένη διαδρομή προσάρτησης δεν υπάρχει. Είτε δημιουργήστε την στο τοπικό σύστημα αρχείων σας είτε αλλάξτε την στις επιλογές κρύπτης.
|
||||
unlock.error.customPath.description.inUse=Το γράμμα μονάδας δίσκου "%s" χρησιμοποιείται ήδη.
|
||||
unlock.error.customPath.description.generic=Έχετε επιλέξει μια προσαρμοσμένη διαδρομή προσάρτησης για αυτή την κρύπτη, αλλά η χρήση της απέτυχε με το μήνυμα: %s
|
||||
unlock.error.customPath.description.inUse=Το γράμμα μονάδας δίσκου ή προσαρμοσμένη διαδρομή προσάρτησης "%s" είναι ήδη σε χρήση.
|
||||
unlock.error.customPath.description.hideawayNotDir=Το προσωρινό, κρυφό αρχείο "%3$s" που χρησιμοποιείται για το ξεκλείδωμα δεν μπορεί να αφαιρεθεί. Παρακαλώ ελέγξτε το αρχείο και στη συνέχεια διαγράψτε το χειροκίνητα.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Η κρύπτη σας δεν μπορεί να τοποθετηθεί στη διαδρομή "%s". Παρακαλώ δοκιμάστε ξανά ή επιλέξτε διαφορετική διαδρομή.
|
||||
unlock.error.customPath.description.notEmptyDir=Η προσαρμοσμένη διαδρομή προσάρτησης "%s" δεν είναι ένας άδειος φάκελος. Παρακαλώ επιλέξτε έναν άδειο φάκελο και προσπαθήστε ξανά.
|
||||
unlock.error.customPath.description.generic=Έχετε επιλέξει μια προσαρμοσμένη διαδρομή προσάρτησης για αυτή την κρύπτη, αλλά η χρήση της απέτυχε με το μήνυμα: %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=Δεν είναι δυνατή η πρόσβαση στο κλειδί της συσκευής
|
||||
hub.noKeychain.description=Για να ξεκλειδώσετε τις κρύπτες Hub, απαιτείται ένα κλειδί συσκευής, το οποίο ασφαλίζεται με χρήση μπρελόκ. Για να συνεχίσετε, ενεργοποιήστε το "%s" και επιλέξτε ένα keychain στις προτιμήσεις.
|
||||
|
||||
@@ -22,7 +22,9 @@ error.hyperlink.report=Notificar este error
|
||||
error.technicalDetails=Detalles:
|
||||
error.existingSolutionDescription=Cryptomator no esperaba que esto ocurriera, pero hemos encontrado una solución existente para este error. Eche un vistazo al siguiente enlace.
|
||||
error.hyperlink.solution=Buscar la solución
|
||||
|
||||
error.lookupPermissionMessage=Cryptomator puede buscar una solución en línea para este problema. Esto enviará una solicitud a nuestra base de datos de problemas desde su dirección IP.
|
||||
error.dismiss=Descartar
|
||||
error.lookUpSolution=Buscar solución
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Bóveda
|
||||
@@ -63,6 +65,11 @@ addvaultwizard.new.validCharacters.chars=Caracteres de la palabra (por ejemplo,
|
||||
addvaultwizard.new.validCharacters.numbers=Números
|
||||
addvaultwizard.new.validCharacters.dashes=Guion (%s) o subrayado (%s)
|
||||
### Expert Settings
|
||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Habilitar ajustes expertos
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Ingrese un valor entre 36 y 220 (por defecto 220)
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Abra la documentación para obtener más información.
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.title=Longitud máxima de los nombres de archivo cifrados
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Válido
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=Crear bóveda
|
||||
addvaultwizard.new.generateRecoveryKeyChoice=No podrá acceder a sus datos sin su contraseña. ¿Desea una clave de recuperación en caso de que pierda su contraseña?
|
||||
@@ -130,8 +137,11 @@ unlock.success.revealBtn=Revelar unidad
|
||||
unlock.error.customPath.message=No se puede montar la bóveda en la ruta personalizada
|
||||
unlock.error.customPath.description.notSupported=Si desea seguir usando la ruta personalizada, vaya a las preferencias y seleccione un tipo de volumen que lo admita. De lo contrario, vaya a las opciones de la bóveda y elija un punto de montaje compatible.
|
||||
unlock.error.customPath.description.notExists=La ruta de montaje personalizada no existe. Créela en su sistema de archivos local o cámbiela en las opciones de la bóveda.
|
||||
unlock.error.customPath.description.inUse=La letra de la unidad "%s" ya está en uso.
|
||||
unlock.error.customPath.description.generic=Seleccionó una ruta de montaje personalizada para esta bóveda, pero falló al usarla con el mensaje: %s
|
||||
unlock.error.customPath.description.inUse=La letra de unidad o ruta de montaje personalizada "%s" ya está en uso.
|
||||
unlock.error.customPath.description.hideawayNotDir=El archivo oculto temporal "%3$s" usado para el desbloqueo no pudo ser eliminado. Compruebe el archivo y elimínelo manualmente.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Su bóveda no se pudo montar en la ruta "%s". Intente de nuevo o elija una ruta diferente.
|
||||
unlock.error.customPath.description.notEmptyDir=La ruta de montaje personalizada "%s" no es una carpeta vacía. Elija una carpeta vacía y vuelva a intentarlo.
|
||||
unlock.error.customPath.description.generic=Seleccionó una ruta de montaje personalizada para esta bóveda, pero falló al usarla con el mensaje: %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=No se puede acceder a la clave del dispositivo
|
||||
hub.noKeychain.description=Para desbloquear las bóvedas de Hub, se requiere una clave de dispositivo que se asegura con un llavero. Para continuar, habilite "%s" y seleccione un llavero en las preferencias.
|
||||
@@ -494,4 +504,10 @@ quit.forced.message=Algunas bóvedas no pudieron ser bloqueadas
|
||||
quit.forced.description=El bloqueo de las bóvedas fue impedido por operaciones pendientes o archivos abiertos. Puede forzar a bloquear las bóvedas restantes, sin embargo, la interrupción de E/S puede resultar en la pérdida de datos sin guardar.
|
||||
quit.forced.forceAndQuitBtn=Forzar y salir
|
||||
|
||||
# Update Reminder
|
||||
# Update Reminder
|
||||
updateReminder.title=Comprobación de actualización
|
||||
updateReminder.message=¿Buscar actualizaciones?
|
||||
updateReminder.description=Manténgase actualizado con funciones nuevas, correcciones de errores y mejoras de seguridad. Recomendamos comprobar actualizaciones automáticamente.
|
||||
updateReminder.notNow=Ahora no
|
||||
updateReminder.yesOnce=Sí, una vez
|
||||
updateReminder.yesAutomatically=Sí, automáticamente
|
||||
@@ -18,7 +18,6 @@ generic.button.print=چاپ
|
||||
error.message=خطایی رخ داده است
|
||||
error.technicalDetails=جزئیات:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=گاوصندوق
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Tiedot:
|
||||
error.existingSolutionDescription=Cryptomator ei odottanut tämän tapahtuvan. Mutta löysimme olemassa olevan ratkaisun tähän virheeseen. Ole hyvä ja katso seuraavaa linkkiä.
|
||||
error.hyperlink.solution=Etsi ratkaisu
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Vault
|
||||
|
||||
@@ -130,8 +129,6 @@ unlock.success.revealBtn=Paljasta Asema
|
||||
unlock.error.customPath.message=Holvia ei pystytty yhdistämään valittuun polkuun
|
||||
unlock.error.customPath.description.notSupported=Mikäli haluat jatkaa mukautetun polun käyttöä, ole hyvä ja mene Asetuksiin ja valitse volyymityyppi mikä tukee sitä. Muussa tapauksessa avaa holvin asetukset ja valitse tuettu mukautettu polku.
|
||||
unlock.error.customPath.description.notExists=Valitsemaasi mukautettua polkua ei ole olemassa. Voit joko luoda uuden polun tai muuttaa polkua holvisi asetuksissa.
|
||||
unlock.error.customPath.description.inUse=Asemakirjain "%s" on jo käytössä.
|
||||
unlock.error.customPath.description.generic=Olet valinnut mukautetun polun holvillesi, mutta sen kanssa ilmeni ongelma: %s
|
||||
## Hub
|
||||
hub.noKeychain.message=Laitteen avainta ei löytynyt
|
||||
hub.noKeychain.description=Hub-holvien purkamiseksi tarvitaan laiteavain joka on suojattu avainrenkaalla. Jatkaaksesi, kytke “%s” päälle ja valitse avainrengas asetuksista.
|
||||
|
||||
@@ -20,7 +20,7 @@ error.description=Oops! Hindi inaasahan ng Cryptomator na ito'y mangyari. Maaari
|
||||
error.hyperlink.lookup=Hanapin ang solusyon
|
||||
error.hyperlink.report=I-report ang problema
|
||||
error.technicalDetails=Mga detalye:
|
||||
|
||||
error.lookUpSolution=Itignan ang solusyon
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Vault
|
||||
|
||||
@@ -22,7 +22,9 @@ error.hyperlink.report=Signaler cette erreur
|
||||
error.technicalDetails=Détails :
|
||||
error.existingSolutionDescription=Cryptomator ne s'attendait pas à ce que cela se produise. Mais nous avons trouvé une solution existante pour cette erreur. Veuillez consulter le lien suivant.
|
||||
error.hyperlink.solution=Rechercher la solution
|
||||
|
||||
error.lookupPermissionMessage=Cryptomator peut rechercher une solution en ligne. Une requête sera envoyée à notre base de données de problèmes à partir de votre adresse IP.
|
||||
error.dismiss=Ignorer
|
||||
error.lookUpSolution=Rechercher une solution
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Coffre
|
||||
@@ -135,8 +137,11 @@ unlock.success.revealBtn=Révéler le lecteur
|
||||
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 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.inUse=La lettre de lecteur "%s" est déjà utilisée.
|
||||
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
|
||||
unlock.error.customPath.description.inUse=La lettre de lecteur ou le point de montage personnalisé «%s» est déjà utilisé.
|
||||
unlock.error.customPath.description.hideawayNotDir=Le fichier temporaire et caché « %3$s » utilisé pour le déverrouillage n’a pas pu être supprimé. Veuillez vérifier le fichier puis le supprimer manuellement.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Votre coffre n'a pas pu être monté au point "%s". Veuillez réessayer ou choisissez un autre point.
|
||||
unlock.error.customPath.description.notEmptyDir=Le chemin de montage personnalisé "%s" n'est pas un dossier vide. Veuillez choisir un dossier vide et réessayez.
|
||||
unlock.error.customPath.description.generic=Vous avez sélectionné un point de montage personnalisé pour ce coffre, mais son utilisation a échoué avec le message : %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=Impossible d'accéder à la clé du périphérique
|
||||
hub.noKeychain.description=Le déverrouillage des coffres Hub nécessite une clé de périphérique sécurisée à l'aide d'un trousseau. Pour continuer, activez « %s » et sélectionnez un trousseau dans les préférences.
|
||||
|
||||
@@ -17,7 +17,6 @@ generic.button.print=Imprimir
|
||||
# Error
|
||||
error.message=Produciuse un erro
|
||||
|
||||
|
||||
# Defaults
|
||||
|
||||
# Tray Menu
|
||||
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=חיפוש שגיאה
|
||||
error.hyperlink.report=דיווח על שגיאה
|
||||
error.technicalDetails=פרטים:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=כספת
|
||||
|
||||
@@ -128,7 +127,6 @@ unlock.success.revealBtn=חשוף את הכונן
|
||||
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״ ובחר את צרור המפתחות בהעדפות.
|
||||
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=इस त्रुटि को ढूंढिए
|
||||
error.hyperlink.report=त्रुटि रिपोर्ट करें
|
||||
error.technicalDetails=अधिक जानकारी:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=वॉल्ट
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=Pogledaj ovu grešku
|
||||
error.hyperlink.report=Prijavi ovu grešku
|
||||
error.technicalDetails=Detalji:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Trezor
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Részletek:
|
||||
error.existingSolutionDescription=A Cryptomator nem számított arra, hogy ez megtörténjen. Viszont már találtunk egy létező megoldást erre a problémára. Kérem, látogassa meg az alábbi linket.
|
||||
error.hyperlink.solution=Megoldás megnézése
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Széf
|
||||
|
||||
@@ -63,6 +62,11 @@ addvaultwizard.new.validCharacters.chars=Szókarakterek (pl. a, ж vagy 수)
|
||||
addvaultwizard.new.validCharacters.numbers=Számok
|
||||
addvaultwizard.new.validCharacters.dashes=Kötőjel (%s) vagy alulvonás (%s)
|
||||
### Expert Settings
|
||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Haladó beállítások engedélyezése
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Írjon be egy értéket 36 és 220 között (alapértelmezett: 220)
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=További információkért olvassa el a dokumentációt.
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.title=A kódolt fájlnevek maximális hosszúsága
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Érvényes
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=Új széf létrehozása
|
||||
addvaultwizard.new.generateRecoveryKeyChoice=Nem fog tudni hozzáférni az adataihoz a jelszó nélkül. Akar egy visszaállítási kulcsot arra az esetre, ha elveszíti a jelszavát?
|
||||
@@ -130,8 +134,11 @@ unlock.success.revealBtn=Széf megjelenítése
|
||||
unlock.error.customPath.message=Nem lehet csatolni a széfet az egyéni útvonalhoz
|
||||
unlock.error.customPath.description.notSupported=Ha szeretné továbbra is az egyéni útvonalat használni, kérem, menjen a beállításokba és válasszon egy kötet típust, amely támogatja azt. Máskülönben, menjen a széf opciókhoz és válasszon egy támogatott csatoláspontot.
|
||||
unlock.error.customPath.description.notExists=Az egyéni csatolás útvonal nem létezik. Hozza létre a helyi fájlrendszerében vagy változtassa meg a széf opciókban.
|
||||
unlock.error.customPath.description.inUse=A "%s" meghajtó betűjel már használat alatt van.
|
||||
unlock.error.customPath.description.generic=Egyéni csatolási útvonalat választott ehhez a széfhez, de használatakor ez a hibaüzenet érkezett: %s
|
||||
unlock.error.customPath.description.inUse=A meghajtó betűjele vagy a csatolási útvonal: "%s" már foglalt.
|
||||
unlock.error.customPath.description.hideawayNotDir=A feloldáshoz használt, "%3$s" nevű ideiglenes, rejtett fájlt nem lehet eltávolítani. Kérjük, ellenőrizze a fájlt, majd törölje manuálisan.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=A széfet nem lehetett a "%s" elérési útvonalra csatlakoztatni. Kérjük, próbálja meg újra, vagy válasszon másik elérési útvonalat.
|
||||
unlock.error.customPath.description.notEmptyDir=A megadott "%s" elérési útvonal nem egy üres mappa. Kérjük, válasszon egy üres mappát, és próbálja meg újra.
|
||||
unlock.error.customPath.description.generic=Egyéni csatolási útvonalat választott ehhez a széfhez, de használatakor ez a hibaüzenet érkezett: %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=Nem lehet az eszközkulcshoz hozzáférni
|
||||
hub.noKeychain.description=Hogy feloldja a Hub széfeket, egy eszközkulcs szükséges, mely egy kulcslánccal van biztosítva. A folytatáshoz engedélyezze a következőt: “%s” és válasszon egy kulcsláncot a beállításokban.
|
||||
@@ -494,4 +501,10 @@ quit.forced.message=Egyes széfeket nem lehetett lezárni
|
||||
quit.forced.description=A széfek zárolását függőbben lévő műveletek vagy megnyitott fájlok blokkolták. Kényszerítheti a maradék széfek zárolását, de az I/O megszakítása nem mentett adatok elvesztéséhez vezethet.
|
||||
quit.forced.forceAndQuitBtn=Kényszerítés és Kilépés
|
||||
|
||||
# Update Reminder
|
||||
# Update Reminder
|
||||
updateReminder.title=Frissítések keresése
|
||||
updateReminder.message=Frissítések ellenőrzése?
|
||||
updateReminder.description=Maradjon naprakész az új funkciókkal, hibajavításokkal és biztonsági fejlesztésekkel. Javasoljuk, hogy automatikusan ellenőrizze a frissítéseket.
|
||||
updateReminder.notNow=Most nem
|
||||
updateReminder.yesOnce=Igen, egyszer
|
||||
updateReminder.yesAutomatically=Igen, automatikusan
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=Cari error berikut
|
||||
error.hyperlink.report=Laporkan error berikut
|
||||
error.technicalDetails=Rincian:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Vault
|
||||
|
||||
|
||||
@@ -22,7 +22,9 @@ error.hyperlink.report=Segnala questo errore
|
||||
error.technicalDetails=Dettagli:
|
||||
error.existingSolutionDescription=Cryptomator non si aspettava che questo problema accadesse. Ma abbiamo trovato una soluzione a questo errore. Dai un'occhiata al seguente link.
|
||||
error.hyperlink.solution=Cerca la soluzione
|
||||
|
||||
error.lookupPermissionMessage=Cryptomator può cercare una soluzione a questo problema online. Invierà una richiesta al nostro database dei problemi, dal tuo indirizzo IP.
|
||||
error.dismiss=Ignora
|
||||
error.lookUpSolution=Cerca la Soluzione
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Cassaforte
|
||||
@@ -135,8 +137,11 @@ unlock.success.revealBtn=Rivela l'Unità
|
||||
unlock.error.customPath.message=Impossibile montare la cassaforte sul percorso personalizzato
|
||||
unlock.error.customPath.description.notSupported=Se desideri continuare a utilizzare il percorso personalizzato, vai alle preferenze e seleziona un tipo di volume che lo supporta. Altrimenti, vai alle opzioni della cassaforte e scegli un punto di montaggio supportato.
|
||||
unlock.error.customPath.description.notExists=Il percorso di mount personalizzato non esiste. Crealo nel tuo file system locale o cambialo nelle opzioni della cassaforte.
|
||||
unlock.error.customPath.description.inUse=La lettera di unità "%s" è già in uso.
|
||||
unlock.error.customPath.description.generic=Hai selezionato un percorso di montaggio personalizzato per questa cassaforte, ma il suo utilizzo è fallito col messaggio: %s
|
||||
unlock.error.customPath.description.inUse=La lettera di unità o il percorso di montaggio selezionato "%s" è già in uso.
|
||||
unlock.error.customPath.description.hideawayNotDir=Il file provvisorio nascosto "%3$s" utilizzato per sbloccare non può essere rimosso. Controlla il file ed eliminalo manualmente.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=La tua cassaforte non può essere montata sul percorso "%s". Riprova o scegli un percorso diverso.
|
||||
unlock.error.customPath.description.notEmptyDir=Il percorso di montaggio selezionato "%s" non è una cartella vuota. Scegli una cartella vuota e riprova.
|
||||
unlock.error.customPath.description.generic=Hai selezionato un percorso di montaggio personalizzato per questa cassaforte, ma il suo utilizzo non è riuscito con il messaggio: %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=Impossibile accedere alla chiave del dispositivo
|
||||
hub.noKeychain.description=Per sbloccare le casseforti Hub, è necessaria una chiave del dispositivo, che è protetta tramite un portachiavi. Per procedere, abilita "%s" e seleziona un portachiavi nelle preferenze.
|
||||
|
||||
@@ -22,7 +22,9 @@ error.hyperlink.report=このエラーを報告する
|
||||
error.technicalDetails=詳細:
|
||||
error.existingSolutionDescription=Cryptomator が予期しない状況が発生しましたが、解決策が見つかりました。以下のリンクを参照してください。
|
||||
error.hyperlink.solution=解決策を調べる
|
||||
|
||||
error.lookupPermissionMessage=Cryptomatorはこの問題の解決策をオンラインで調べることができます。その際、あなたのIPアドレスから私たちの解決策データベースに問い合わせます。
|
||||
error.dismiss=閉じる
|
||||
error.lookUpSolution=解決策を調べる
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=金庫
|
||||
@@ -135,8 +137,11 @@ unlock.success.revealBtn=ドライブを表示
|
||||
unlock.error.customPath.message=カスタム パスに金庫をマウントできません
|
||||
unlock.error.customPath.description.notSupported=カスタム パスを使い続けたい場合、環境設定に移動してサポートしているボリューム タイプを選択してください。もしくは、金庫のオプションに移動してサポートされるマウント ポイントを選択してください。
|
||||
unlock.error.customPath.description.notExists=カスタム マウント パスが存在していません。ローカル ファイルシステムで作成するか、金庫のオプションで変更してください。
|
||||
unlock.error.customPath.description.inUse=ドライブレター「%s」は既に使用されています。
|
||||
unlock.error.customPath.description.generic=この金庫のカスタム マウント パスを選択しましたが、次のメッセージで失敗しました: %s
|
||||
unlock.error.customPath.description.inUse=ドライブ名またはカスタムマウントパス「%s」は既に使用されています。
|
||||
unlock.error.customPath.description.hideawayNotDir=ロック解除に使用される一時的な隠しファイル "%3$s" を削除できませんでした。ファイルを確認し、手動で削除してください。
|
||||
unlock.error.customPath.description.couldNotBeCleaned=金庫を "%s" にマウントすることができませんでした。もう一度試すか、別のパスを選択してください。
|
||||
unlock.error.customPath.description.notEmptyDir=カスタムマウントパス「%s」は空のフォルダではありません。空のフォルダを選択して再度お試し下さい。
|
||||
unlock.error.customPath.description.generic=この金庫に対してカスタムマウントパスを選択しましたが、以下のメッセージとともに失敗しました:%2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=デバイス キーにアクセスできません
|
||||
hub.noKeychain.description=ハブ金庫を解錠するには、キーチェーンが保護するデバイス キーが必要です。続行するには、"%s" を有効にし環境設定からキーチェーンを選択します。
|
||||
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=에러 검색하기
|
||||
error.hyperlink.report=에러 보고하기
|
||||
error.technicalDetails=상세 정보:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Vault
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=Meklējiet šo kļūdu
|
||||
error.hyperlink.report=Ziņojiet par šo kļūdu
|
||||
error.technicalDetails=Detaļas:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Glabātava
|
||||
|
||||
|
||||
@@ -2,23 +2,63 @@
|
||||
|
||||
# Generics
|
||||
## Button
|
||||
generic.button.apply=Примени
|
||||
generic.button.back=Назад
|
||||
generic.button.cancel=Откажи
|
||||
generic.button.change=Промени
|
||||
generic.button.choose=Избор…
|
||||
generic.button.close=Затвори
|
||||
generic.button.copy=Копирај
|
||||
generic.button.copied=Копирано!
|
||||
generic.button.done=Прифати
|
||||
generic.button.next=Продолжи
|
||||
generic.button.print=Печати
|
||||
|
||||
# Error
|
||||
|
||||
error.message=Грешка
|
||||
error.description=Не очекуваше да се случи ова. Можете да пронајдете постоечки решенија за оваа грешка. Или, ако не е пријавена сè уште, слободно направете тоа.
|
||||
error.hyperlink.lookup=Пребарај за оваа грешка
|
||||
error.hyperlink.report=Пријави ја оваа грешка
|
||||
error.technicalDetails=Детали:
|
||||
error.existingSolutionDescription=Не очекуваше да се случи ова. Но најдовме постоечко решение за оваа грешка. Ве молиме погледнете го следниот линк.
|
||||
error.hyperlink.solution=Пребарај решение
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Сеф
|
||||
|
||||
# Tray Menu
|
||||
traymenu.showMainWindow=Покажи
|
||||
traymenu.showPreferencesWindow=Поставки
|
||||
traymenu.lockAllVaults=Заклучи сè
|
||||
traymenu.quitApplication=Излез
|
||||
traymenu.vault.unlock=Отклучи
|
||||
traymenu.vault.lock=Заклучи
|
||||
traymenu.vault.reveal=Откриј
|
||||
|
||||
# Add Vault Wizard
|
||||
addvaultwizard.title=Додај сеф
|
||||
## Welcome
|
||||
addvaultwizard.welcome.newButton=Додај нов сеф
|
||||
addvaultwizard.welcome.existingButton=Отвори постоечки сеф
|
||||
## New
|
||||
### Name
|
||||
addvaultwizard.new.nameInstruction=Одберете име за сефот
|
||||
addvaultwizard.new.namePrompt=Име на сеф
|
||||
### Location
|
||||
addvaultwizard.new.locationInstruction=Каде би сакале Cryptomator да ги зачува шифрираните фајлови на Вашиот сеф?
|
||||
addvaultwizard.new.locationLabel=Локација за складирање
|
||||
addvaultwizard.new.locationPrompt=…
|
||||
addvaultwizard.new.directoryPickerLabel=Прилагодена локација
|
||||
addvaultwizard.new.directoryPickerButton=Избор…
|
||||
addvaultwizard.new.directoryPickerTitle=Избери папка
|
||||
addvaultwizard.new.fileAlreadyExists=Датотека или папка со истото име на сефот веќе постои
|
||||
addvaultwizard.new.locationDoesNotExist=Папка на наведената локација не постои или е непристапна
|
||||
addvaultwizard.new.locationIsNotWritable=Нема пристап за запишување на наведената локација
|
||||
### Expert Settings
|
||||
### Password
|
||||
### Information
|
||||
## Existing
|
||||
addvaultwizard.existing.chooseBtn=Избор…
|
||||
## Success
|
||||
|
||||
# Remove Vault
|
||||
@@ -28,6 +68,7 @@
|
||||
# Forget Password
|
||||
|
||||
# Unlock
|
||||
unlock.unlockBtn=Отклучи
|
||||
## Select
|
||||
## Success
|
||||
## Failure
|
||||
@@ -61,6 +102,7 @@ hub.register.registerBtn=Потврди
|
||||
## Fix Application
|
||||
|
||||
# Preferences
|
||||
preferences.title=Поставки
|
||||
## General
|
||||
## Interface
|
||||
## Volume
|
||||
@@ -78,11 +120,16 @@ hub.register.registerBtn=Потврди
|
||||
|
||||
|
||||
# Main Window
|
||||
main.closeBtn.tooltip=Затвори
|
||||
main.preferencesBtn.tooltip=Поставки
|
||||
## Vault List
|
||||
main.vaultlist.contextMenu.lock=Заклучи
|
||||
main.vaultlist.addVaultBtn=Додај сеф
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
### Locked
|
||||
### Unlocked
|
||||
main.vaultDetail.lockBtn=Заклучи
|
||||
### Missing
|
||||
### Needs Migration
|
||||
### Error
|
||||
@@ -91,8 +138,10 @@ hub.register.registerBtn=Потврди
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
vaultOptions.general.vaultName=Име на сеф
|
||||
|
||||
## Mount
|
||||
vaultOptions.mount.mountPoint.directoryPickerButton=Избор…
|
||||
## Master Key
|
||||
## Hub
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Detaljer:
|
||||
error.existingSolutionDescription=Cryptomator forventet ikke at dette skulle skje. Men vi fant en eksisterende løsning for denne feilen. Ta en titt ved å følge lenken.
|
||||
error.hyperlink.solution=Slå opp løsningen
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Hvelv
|
||||
|
||||
@@ -130,8 +129,6 @@ unlock.success.revealBtn=Vis enheten
|
||||
unlock.error.customPath.message=Kan ikke montere hvelvet til egendefinert sti
|
||||
unlock.error.customPath.description.notSupported=Hvis du vil fortsette å bruke den egendefinerte stien, gå til innstillingene og velg en enhetstype som støtter den. Gå ellers til hvelvalternativene og velg et støttet monteringspunkt.
|
||||
unlock.error.customPath.description.notExists=Egendefinert monteringssti eksisterer ikke. Enten opprett den i ditt lokale filsystem eller endre den i hvelvvalgene.
|
||||
unlock.error.customPath.description.inUse=Drevbokstaven "%s" er allerede i bruk.
|
||||
unlock.error.customPath.description.generic=Du har valgt en egendefinert monterings sti for dette hvelvet, men ved bruk av den mislyktes med meldingen: %s
|
||||
## Hub
|
||||
hub.noKeychain.message=Får ikke tilgang til enhetsnøkkel
|
||||
hub.noKeychain.description=For å låse opp Hub-hvelv er det nødvendig med en enhetsnøkkel som er sikret med en nøkkelring. For å fortsette, aktiver "%s" og velg en nøkkelring i innstillingene.
|
||||
|
||||
@@ -22,7 +22,9 @@ error.hyperlink.report=Deze fout melden
|
||||
error.technicalDetails=Details:
|
||||
error.existingSolutionDescription=Cryptomator had niet verwacht dat dit zou gebeuren. Maar we hebben een bestaande oplossing voor deze fout gevonden. Neem een kijkje op de volgende link.
|
||||
error.hyperlink.solution=Zoek de oplossing op
|
||||
|
||||
error.lookupPermissionMessage=Cryptomator kan online een oplossing voor dit probleem zoeken. Dit zal een aanvraag naar onze probleemdatabase verzenden vanaf uw IP-adres.
|
||||
error.dismiss=Afwijzen
|
||||
error.lookUpSolution=Oplossing opzoeken
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Kluis
|
||||
@@ -135,8 +137,11 @@ unlock.success.revealBtn=Toon Schijf
|
||||
unlock.error.customPath.message=Kan kluis niet aan aangepast pad koppelen
|
||||
unlock.error.customPath.description.notSupported=Als je het aangepaste pad wilt blijven gebruiken, ga dan naar de voorkeuren en selecteer een volume type dat het ondersteunt. Anders ga je naar de kluis opties en kies je een steunpunt voor het koppelplaten.
|
||||
unlock.error.customPath.description.notExists=Het aangepaste koppelpad bestaat niet. Maak het aan in uw lokale bestandssysteem of verander het in de kluis opties.
|
||||
unlock.error.customPath.description.inUse=Schijfletter "%s" is al in gebruik.
|
||||
unlock.error.customPath.description.generic=Je hebt een aangepast koppel pad geselecteerd voor deze kluis, maar het gebruik ervan is mislukt met het bericht: %s
|
||||
unlock.error.customPath.description.inUse=De schijfletter of aangepaste pad "%s" is al in gebruik.
|
||||
unlock.error.customPath.description.hideawayNotDir=Het verborgen tijdelijk bestand "%3$s" gebruikt voor ontgrendelen kon niet worden verwijderd. Controleer het bestand en verwijder het handmatig.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Uw kluis kon niet worden gekoppeld aan het pad "%s". Probeer het opnieuw of kies een ander pad.
|
||||
unlock.error.customPath.description.notEmptyDir=Het aangepaste pad "%s" is geen lege map. Kies een lege map en probeer het opnieuw.
|
||||
unlock.error.customPath.description.generic=Je hebt een aangepast koppelpad voor deze kluis geselecteerd, maar gebruik ervan is mislukt met het bericht: %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=Geen toegang tot de apparaatsleutel
|
||||
hub.noKeychain.description=Om Hub kluizen te ontgrendelen is een apparaatsleutel vereist, die met een sleutelhanger wordt beveiligd. Om verder te gaan, schakel "%s" in en selecteer een sleutelhanger in de voorkeursinstellingen.
|
||||
@@ -503,6 +508,6 @@ quit.forced.forceAndQuitBtn=Forceren en afsluiten
|
||||
updateReminder.title=Zoek naar updates
|
||||
updateReminder.message=Controleren op updates?
|
||||
updateReminder.description=Blijf op de hoogte met nieuwe functies, bugfixes en beveiligingsverbeteringen. We raden aan om automatisch te controleren op updates.
|
||||
updateReminder.notNow=Niet Nu
|
||||
updateReminder.notNow=Niet nu
|
||||
updateReminder.yesOnce=Ja, Eenmaal
|
||||
updateReminder.yesAutomatically=Ja, Automatisch
|
||||
updateReminder.yesAutomatically=Ja, automatisch
|
||||
@@ -16,7 +16,6 @@ generic.button.print=Skriv ut
|
||||
|
||||
# Error
|
||||
|
||||
|
||||
# Defaults
|
||||
|
||||
# Tray Menu
|
||||
|
||||
@@ -16,7 +16,6 @@ generic.button.print=ਪਰਿੰਟ ਕਰੋ
|
||||
|
||||
# Error
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=ਵਾਲਟ
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Szczegóły:
|
||||
error.existingSolutionDescription=Cryptomator nie spodziewał się, że tak się stanie. Znaleźliśmy jednak istniejące rozwiązanie dla tego błędu. Proszę spojrzeć na poniższy link.
|
||||
error.hyperlink.solution=Wyszukaj rozwiązanie
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Sejf
|
||||
|
||||
@@ -135,8 +134,11 @@ unlock.success.revealBtn=Pokaż Dysk
|
||||
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 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.inUse=Litera dysku "%s" jest już w użyciu.
|
||||
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
|
||||
unlock.error.customPath.description.inUse=Litera dysku lub podana ścieżka montowania "%s" jest już w użyciu.
|
||||
unlock.error.customPath.description.hideawayNotDir=Tymczasowy, ukryty plik "%3$s" używany do odblokowywania nie mógł zostać usunięty. Sprawdź plik, a następnie usuń go ręcznie.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Twój sejf nie mógł być zamontowany do ścieżki "%s". Spróbuj ponownie lub wybierz inną ścieżkę.
|
||||
unlock.error.customPath.description.notEmptyDir=Wybrana ścieżka montowania "%s" nie jest pustym katalogiem. Wybierz pusty katalog i spróbuj ponownie.
|
||||
unlock.error.customPath.description.generic=Wybrałeś własną ścieżkę montowania dla tego sejfu, ale użycie jej nie powiodło się. Powód: %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=Brak dostępu do klucza urządzenia
|
||||
hub.noKeychain.description=Aby odblokować sejfy na Hubie, wymagany jest klucz urządzenia zabezpieczony za pomocą pęku kluczy. Aby kontynuować, włącz "%s" i wybierz Pęk kluczy w ustawieniach.
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Detalhes:
|
||||
error.existingSolutionDescription=O Cryptomator não esperava que isso acontecesse. Mas encontrámos uma solução existente para esse erro. Por favor, veja o seguinte link.
|
||||
error.hyperlink.solution=Procure a solução
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Cofre
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Detalhes:
|
||||
error.existingSolutionDescription=O Cryptomator encontrou um erro inesperado, mas há uma solução pré-existente disponível no seguinte link.
|
||||
error.hyperlink.solution=Procure a solução
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Cofre
|
||||
|
||||
@@ -135,8 +134,11 @@ unlock.success.revealBtn=Revelar Volume
|
||||
unlock.error.customPath.message=Não foi possível iniciar o cofre no caminho personalizado
|
||||
unlock.error.customPath.description.notSupported=Se você deseja continuar usando o caminho personalizado, por favor vá para as preferências e selecione um tipo de volume que o suporte. Caso contrário, vá para as opções de cofre e escolha um ponto de montagem suportado.
|
||||
unlock.error.customPath.description.notExists=O caminho de montagem personalizado não existe. Crie o caminho em seu sistema de arquivos local, ou o altere nas opções de cofre.
|
||||
unlock.error.customPath.description.inUse=A letra da unidade de disco "%s" já está em uso.
|
||||
unlock.error.customPath.description.generic=Você selecionou um caminho de montagem personalizado para este cofre, mas ao usá-lo ocorreu uma falha com a mensagem: %s
|
||||
unlock.error.customPath.description.inUse=A letra da unidade ou o caminho de montagem "%s" já está em uso.
|
||||
unlock.error.customPath.description.hideawayNotDir=O arquivo oculto temporário "%3$s" usado para desbloquear não pôde ser removido. Verifique o arquivo e exclua-o manualmente.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Seu cofre não pôde ser montado no caminho "%s". Tente novamente ou escolha um caminho diferente.
|
||||
unlock.error.customPath.description.notEmptyDir=O caminho de montagem escolhido "%s" não é uma pasta vazia. Escolha uma pasta vazia e tente novamente.
|
||||
unlock.error.customPath.description.generic=Você selecionou um caminho de montagem personalizado para este cofre, mas falhou com a mensagem: %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=Não foi possível acessar a chave do dispositivo
|
||||
hub.noKeychain.description=Para desbloquear os cofres centrais, é necessário a chave do dispositivo, protegida por um chaveiro. Para proceder, ative "%s" e selecione um chaveiro nas preferências.
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Detalii:
|
||||
error.existingSolutionDescription=Cryptomator nu s-a aşteptat să se întâmple asta. Dar am găsit o soluţie pentru această eroare. Vă rugăm să cititi următorul link.
|
||||
error.hyperlink.solution=Caută soluția
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Seif
|
||||
|
||||
@@ -135,8 +134,6 @@ unlock.success.revealBtn=Dezvăluie partiția
|
||||
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.inUse=Partiția cu litera "%s" este deja folosită.
|
||||
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.
|
||||
|
||||
@@ -22,7 +22,9 @@ error.hyperlink.report=Сообщить об ошибке
|
||||
error.technicalDetails=Подробности:
|
||||
error.existingSolutionDescription=Произошло неожиданное событие. Однако мы нашли решение этой проблемы. Ознакомьтесь с ним по ссылке.
|
||||
error.hyperlink.solution=Найти решение
|
||||
|
||||
error.lookupPermissionMessage=Cryptomator может поискать решение этой проблемы в Интернете. Для этого будет отправлен запрос о проблеме в нашу базу данных с вашего IP-адреса.
|
||||
error.dismiss=Отклонить
|
||||
error.lookUpSolution=Найти решение
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Хранилище
|
||||
@@ -135,8 +137,11 @@ unlock.success.revealBtn=Показать диск
|
||||
unlock.error.customPath.message=Невозможно смонтировать хранилище по указанному пути
|
||||
unlock.error.customPath.description.notSupported=Если вы хотите продолжить использование пользовательского пути, перейдите в настройки и выберите тип тома, который его поддерживает. В противном случае, перейдите в настройки хранилища и выберите поддерживаемую точку монтирования.
|
||||
unlock.error.customPath.description.notExists=Пользовательский путь монтирования не существует. Либо создайте его в локальной файловой системе, либо измените в параметрах хранилища.
|
||||
unlock.error.customPath.description.inUse=Буква диска "%s" уже используется.
|
||||
unlock.error.customPath.description.generic=Вы выбрали свой путь монтирования этого хранилища, но его нельзя использовать: %s
|
||||
unlock.error.customPath.description.inUse=Буква диска или путь монтирования "%s" уже используется.
|
||||
unlock.error.customPath.description.hideawayNotDir=Временный скрытый файл "%3$s" используется для разблокировки и не может быть удалён. Проверьте файл и затем удалите его вручную.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Хранилище не может быть смонтировано к пути "%s". Попробуйте ещё раз или выберите другой путь.
|
||||
unlock.error.customPath.description.notEmptyDir=Путь монтирования "%s" — не пустая папка. Выберите пустую папку и повторите попытку.
|
||||
unlock.error.customPath.description.generic=Выбранный вами путь монтирования для хранилища не удалось использовать: %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=Нет доступа к ключу устройства
|
||||
hub.noKeychain.description=Для разблокировки хаб-хранилища необходим ключ устройства, который защищён с помощью связки ключей. Чтобы продолжить, включите "%s" и выберите связку ключей в настройках.
|
||||
|
||||
@@ -17,7 +17,6 @@ generic.button.print=මුද්රණය කරන්න
|
||||
error.message=දෝෂය: %s
|
||||
error.technicalDetails=විස්තර:
|
||||
|
||||
|
||||
# Defaults
|
||||
|
||||
# Tray Menu
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Podrobnosti:
|
||||
error.existingSolutionDescription=Cryptomator nečakal, že sa toto stane. Našli sme však existujúce riešenie tejto chyby. Pozrite si prosím nasledujúci odkaz.
|
||||
error.hyperlink.solution=Vyhľadať riešenie
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Trezor
|
||||
|
||||
@@ -66,6 +65,7 @@ addvaultwizard.new.validCharacters.dashes=Pomlčka (%s) alebo podčiarnik (%s)
|
||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Povoliť expertné nastavenia
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Zadajte hodnotu medzi 36 a 220 (predvolená 220)
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Otvorte dokumentáciu pre viac informácií.
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.title=Maximálna dĺžka zakryptovaných mien súborov
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Platný
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=Vytvoriť trezor
|
||||
@@ -133,8 +133,6 @@ unlock.success.revealBtn=Odkryť disk
|
||||
## Failure
|
||||
unlock.error.customPath.message=Nie je možné namapovať trezor na uživateĺskej ceste
|
||||
unlock.error.customPath.description.notSupported=Ak chcete naďalej používať vlastnú cestu, prejdite do nastavení a vyberte typ zväzku, ktorý ju podporuje. V opačnom prípade prejdite na možnosti trezoru a vyberte podporovaný bod pripojenia.
|
||||
unlock.error.customPath.description.inUse=Písmeno jednotky „%s“ sa už používa.
|
||||
unlock.error.customPath.description.generic=Vybrali ste voliteľnú cestu pripojenia pre tento trezor, ale použiť ho zlyhalo so správou: %s
|
||||
## 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.
|
||||
@@ -443,6 +441,7 @@ vaultOptions.masterkey.showRecoveryKeyBtn=Ukázať klúč obnovy
|
||||
vaultOptions.masterkey.recoverPasswordBtn=Obnoviť heslo
|
||||
## Hub
|
||||
vaultOptions.hub=Obnova
|
||||
vaultOptions.hub.convertBtn=Konvertovať do Password-Based trezora
|
||||
|
||||
# Recovery Key
|
||||
## Display Recovery Key
|
||||
@@ -495,4 +494,10 @@ quit.forced.message=Niektoré trezory nemožno uzamknúť
|
||||
quit.forced.description=Uzavretie trezorov bolo blokované prebiehajúcou operáciou alebo otvorenými súbormi. Môžte vynútiť uzamknutie ostávajúcich trezorov, čo preruší I/O a to môže viesť k strate neuložených dát.
|
||||
quit.forced.forceAndQuitBtn=Vynútiť a skončiť
|
||||
|
||||
# Update Reminder
|
||||
# Update Reminder
|
||||
updateReminder.title=Kontrola aktualizácií
|
||||
updateReminder.message=Skontrolovať aktualizácie?
|
||||
updateReminder.description=Zostaňte aktualizovaný s novými vlastnosťami, opravami chýb a bezpečnostnými vylepšeniami. Odporúčame automatickú kontrolu aktualizácií.
|
||||
updateReminder.notNow=Teraz nie
|
||||
updateReminder.yesOnce=Áno, raz
|
||||
updateReminder.yesAutomatically=Áno, automaticky
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=Poiščite to napako
|
||||
error.hyperlink.report=Prijavite to napako
|
||||
error.technicalDetails=Podrobnosti:
|
||||
|
||||
|
||||
# Defaults
|
||||
|
||||
# Tray Menu
|
||||
|
||||
@@ -16,7 +16,6 @@ generic.button.print=Štampaj
|
||||
|
||||
# Error
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Sef
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@ generic.button.print=Štampaj
|
||||
|
||||
# Error
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Sef
|
||||
|
||||
|
||||
@@ -22,7 +22,9 @@ error.hyperlink.report=Rapportera fel
|
||||
error.technicalDetails=Detaljer:
|
||||
error.existingSolutionDescription=Cryptomator förväntade sig inte att det här skulle hända. Men vi hittade en befintlig lösning för detta fel. Ta en titt på följande länk.
|
||||
error.hyperlink.solution=Se lösningen
|
||||
|
||||
error.lookupPermissionMessage=Cryptomator kan leta efter en lösning för detta problem på Internet. Detta kommer att skicka en förfrågan till vår problemdatabas från din IP-adress.
|
||||
error.dismiss=Avfärda
|
||||
error.lookUpSolution=Sök efter lösning
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Valv
|
||||
@@ -135,8 +137,11 @@ unlock.success.revealBtn=Visa enhet
|
||||
unlock.error.customPath.message=Det går inte att montera valvet på utpekad sökväg
|
||||
unlock.error.customPath.description.notSupported=Om du vill fortsätta använda den anpassade sökvägen, gå till inställningarna och välj en volymtyp som stöder den. Annars går du till valvalternativen och väljer en monteringspunkt som stöds.
|
||||
unlock.error.customPath.description.notExists=Den anpassade monteringssökvägen finns inte. Skapa den antingen i ditt lokala filsystem eller ändra den i valvalternativen.
|
||||
unlock.error.customPath.description.inUse=Enhetsbokstav "%s" används redan.
|
||||
unlock.error.customPath.description.generic=Den anpassade monteringssökvägen gick inte att använda. Felmeddelande: %s
|
||||
unlock.error.customPath.description.inUse=Enhetsbokstaven eller anpassad monteringsväg "%s" används redan.
|
||||
unlock.error.customPath.description.hideawayNotDir=Den temporära, dolda filen "%3$s" som användes för upplåsning kunde inte tas bort. Kontrollera filen och ta sedan bort den manuellt.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Ditt valv kunde inte monteras till sökvägen "%s". Försök igen eller välj en annan sökväg.
|
||||
unlock.error.customPath.description.notEmptyDir=Den anpassade monteringssökvägen "%s" är inte en tom mapp. Välj en tom mapp och försök igen.
|
||||
unlock.error.customPath.description.generic=Den anpassade monteringssökvägen gick inte att använda. Felmeddelande: %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=Kan inte komma åt enhetsnyckeln
|
||||
hub.noKeychain.description=För att låsa upp Hubb-valv krävs en enhetsnyckel, som är säkrad med hjälp av en nyckelring. För att fortsätta, aktivera ”%s” och välj en nyckelring i inställningarna.
|
||||
@@ -292,6 +297,9 @@ 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
|
||||
preferences.volume.feature.mountToDir=Utpekad katalog som monteringspunkt
|
||||
preferences.volume.feature.mountToDriveLetter=Enhetsbokstav som monteringspunkt
|
||||
preferences.volume.feature.mountFlags=Anpassade monteringsalternativ
|
||||
preferences.volume.feature.readOnly=Skrivskyddat enhetspunkt
|
||||
## Updates
|
||||
preferences.updates=Uppdateringar
|
||||
preferences.updates.currentVersion=Nuvarande version: %s
|
||||
@@ -372,6 +380,7 @@ main.vaultDetail.passwordSavedInKeychain=Lösenord sparat
|
||||
main.vaultDetail.unlockedStatus=UPPLÅST
|
||||
main.vaultDetail.accessLocation=Valvets innehåll kan nås härifrån:
|
||||
main.vaultDetail.revealBtn=Visa enhet
|
||||
main.vaultDetail.copyUri=Kopiera URI
|
||||
main.vaultDetail.lockBtn=Lås
|
||||
main.vaultDetail.bytesPerSecondRead=Läs:
|
||||
main.vaultDetail.bytesPerSecondWritten=Skriv:
|
||||
@@ -421,13 +430,17 @@ vaultOptions.general.startHealthCheckBtn=Starta hälsokontroll
|
||||
|
||||
## Mount
|
||||
vaultOptions.mount=Montering
|
||||
vaultOptions.mount.info=Val beror på enhetstyp.
|
||||
vaultOptions.mount.linkToPreferences=Öppna virtuella enhetsinställningar
|
||||
vaultOptions.mount.readonly=Skrivskyddad
|
||||
vaultOptions.mount.customMountFlags=Egna monterings-flaggor
|
||||
vaultOptions.mount.winDriveLetterOccupied=upptagen
|
||||
vaultOptions.mount.mountPoint=Monteringspunkt
|
||||
vaultOptions.mount.mountPoint.auto=Välj en lämplig plats automatiskt
|
||||
vaultOptions.mount.mountPoint.driveLetter=Använd tilldelad enhetsbokstav
|
||||
vaultOptions.mount.mountPoint.custom=Använd vald mapp
|
||||
vaultOptions.mount.mountPoint.directoryPickerButton=Välj…
|
||||
vaultOptions.mount.mountPoint.directoryPickerTitle=Välj mapp
|
||||
## Master Key
|
||||
vaultOptions.masterkey=Lösenord
|
||||
vaultOptions.masterkey.changePasswordBtn=Ändra lösenord
|
||||
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=Angalia kosa hili
|
||||
error.hyperlink.report=Ripoti kosa hili
|
||||
error.technicalDetails=Maelezo:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Kuba
|
||||
|
||||
@@ -128,7 +127,6 @@ unlock.success.revealBtn=Fichua Kiendeshaji
|
||||
unlock.error.customPath.message=Haiwezi kupachika kuba kwenye njia maalum
|
||||
unlock.error.customPath.description.notSupported=Ikiwa ungependa kuendelea kutumia njia maalum, tafadhali nenda kwa mapendeleo na uchague aina ya sauti inayoitumia. Vinginevyo, nenda kwa chaguo za kuba na uchague sehemu ya kupachika inayotumika.
|
||||
unlock.error.customPath.description.notExists=Njia maalum ya kupachika haipo. Iunde katika mfumo wako wa faili wa karibu au ubadilishe katika chaguzi za kuba.
|
||||
unlock.error.customPath.description.generic=Umechagua njia maalum ya kupachika kwa kuba hii, lakini kuitumia imeshindwa na ujumbe: %s
|
||||
## Hub
|
||||
hub.noKeychain.message=Imeshindwa kufikia ufunguo wa kifaa
|
||||
hub.noKeychain.description=Ili kufungua kuba za Hub, ufunguo wa kifaa unahitajika, ambao hulindwa kwa kutumia mnyororo wa vitufe. Ili kuendelea, washa "%s" na uchague mnyororo wa vitufe katika mapendeleo.
|
||||
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=இந்தப் பிழையைத் தேடு
|
||||
error.hyperlink.report=இந்தப் பிழையைப் புகாரளி
|
||||
error.technicalDetails=விவரங்கள்:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=பெட்டகம்
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
|
||||
# Error
|
||||
|
||||
|
||||
# Defaults
|
||||
|
||||
# Tray Menu
|
||||
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=ค้นหาข้อผิดพลาดนี้
|
||||
error.hyperlink.report=รายงานข้อผิดพลาดนี้
|
||||
error.technicalDetails=รายละเอียด:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Vault
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Detaylar:
|
||||
error.existingSolutionDescription=Cryptomator bunun olmasını beklemiyordu. Ancak bu hata için hali hazırda bir çözüm olduğunu bulduk. Lütfen aşağıdaki bağlantıya göz atın.
|
||||
error.hyperlink.solution=Çözüme bak
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Kasa
|
||||
|
||||
@@ -135,8 +134,11 @@ unlock.success.revealBtn=Sürücüyü Göster
|
||||
unlock.error.customPath.message=Kasa özel yola bağlanamıyor
|
||||
unlock.error.customPath.description.notSupported=Özel yolu kullanmaya devam etmek istiyorsanız, lütfen tercihlere gidin ve onu destekleyen bir cilt türü seçin. Aksi takdirde kasa seçeneklerine gidin ve desteklenen bir bağlama noktası seçin.
|
||||
unlock.error.customPath.description.notExists=Özel bağlama yolu mevcut değil. Ya yerel dosya sisteminizde oluşturun ya da kasa seçeneklerinde değiştirin.
|
||||
unlock.error.customPath.description.inUse=Sürücü harfi "%s" zaten kullanımdadır.
|
||||
unlock.error.customPath.description.generic=Bu kasa için özel bir bağlama yolu seçtiniz, ancak bunu kullanmak şu mesajla başarısız oldu: %s
|
||||
unlock.error.customPath.description.inUse=Sürücü harfi veya özel montaj yolu "%s" zaten kullanımda.
|
||||
unlock.error.customPath.description.hideawayNotDir=Kilidi açmak için kullanılan geçici, gizli dosya "%3$s" kaldırılamadı. Lütfen dosyayı kontrol edin ve elle silin.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Kasanız "%s" yoluna monte edilemedi. Lütfen tekrar deneyin veya farklı bir montaj yolu seçin.
|
||||
unlock.error.customPath.description.notEmptyDir=Özel montaj yolu "%s" boş bir klasör değil. Lütfen boş bir klasör seçip tekrar deneyin.
|
||||
unlock.error.customPath.description.generic=Bu kasa için özel bir montaj yolu seçtiniz ancak bu yolun kullanımı şu ileti ile başarısız oldu: %2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=Cihaz anahtarına erişilemiyor
|
||||
hub.noKeychain.description=Hub kasalarının kilidini açmak için, bir anahtarlık kullanılarak güvenliği sağlanan bir cihaz anahtarı gerekir. Devam etmek için "%s"yi etkinleştirin ve tercihlerde bir anahtarlık seçin.
|
||||
@@ -499,4 +501,10 @@ quit.forced.message=Bazı kasalar kilitlenemedi
|
||||
quit.forced.description=Kasaların kilitlenmesi, bekleyen işlemler veya açık dosyalar tarafından engellendi. Kalan kasaları zorla kilitleyebilirsiniz, ancak G/Ç'nin kesilmesi kaydedilmemiş verilerin kaybına neden olabilir.
|
||||
quit.forced.forceAndQuitBtn=Zorla ve Çık
|
||||
|
||||
# Update Reminder
|
||||
# Update Reminder
|
||||
updateReminder.title=Güncelleme Kontrolü
|
||||
updateReminder.message=Güncellemeleri Denetle?
|
||||
updateReminder.description=Yeni özellikler, hata düzeltmeleri ve güvenlik iyileştirmeleri ile güncel kalın. Güncellemelerin otomatik olarak kontrol edilmesini öneririz.
|
||||
updateReminder.notNow=Şimdi değil
|
||||
updateReminder.yesOnce=Evet, tek seferlik
|
||||
updateReminder.yesAutomatically=Evet, otomatik olarak
|
||||
@@ -21,7 +21,6 @@ error.hyperlink.lookup=Дізнатися більше про цю помилк
|
||||
error.hyperlink.report=Повідомити про помилку
|
||||
error.technicalDetails=Подробиці:
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Сховище
|
||||
|
||||
@@ -128,7 +127,6 @@ 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=Щоб розблокувати Hub vaults, необхідний ключ пристрою, який захищено за допомогою ланцюга ключів. Щоб продовжити, увімкніть “%s” та виберіть ланцюг ключів у налаштуваннях.
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=Chi tiết:
|
||||
error.existingSolutionDescription=Cryptomator không mong đợi điều này xảy ra. Nhưng chúng tôi đã tìm thấy một giải pháp hiện có cho lỗi này. Vui lòng xem qua liên kết sau.
|
||||
error.hyperlink.solution=Tra cứu giải pháp
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Vault
|
||||
|
||||
@@ -130,8 +129,6 @@ unlock.success.revealBtn=Hiển thị Ổ đĩa
|
||||
unlock.error.customPath.message=Không thể gắn vault vào đường dẫn tùy chỉnh
|
||||
unlock.error.customPath.description.notSupported=Nếu bạn muốn tiếp tục sử dụng đường dẫn tuỳ chỉnh, vui lòng chuyển đến tuỳ chọn và chọn loại ổ đĩa hỗ trợ nó. Nếu không, hãy chuyển đến tuỳ chọn vault và chọn điểm gắn kết được hỗ trợ.
|
||||
unlock.error.customPath.description.notExists=Đường dẫn gắn kết tuỳ chỉnh không tồn tại. Tạo nó trong hệ thống tệp cục bộ của bạn hoặc thay đổi nó trong các tuỳ chọn vault.
|
||||
unlock.error.customPath.description.inUse=Ký tự ổ đĩa "%s" đã được sử dụng.
|
||||
unlock.error.customPath.description.generic=Bạn đã chọn một đường dẫn gắn kết tuỳ chỉnh cho vault này, nhưng sử dụng nó không thành công với thông báo: %s
|
||||
## Hub
|
||||
hub.noKeychain.message=Không thể truy cập khoá thiết bị
|
||||
hub.noKeychain.description=Để mở khoá vault Hub, cần có khoá thiết bị, khoá này được bảo mật bằng chuỗi khoá. Để tiếp tục, hãy bật “%s” và chọn một chuỗi khoá trong tuỳ chọn.
|
||||
|
||||
@@ -22,7 +22,9 @@ error.hyperlink.report=报告该错误
|
||||
error.technicalDetails=详细信息:
|
||||
error.existingSolutionDescription=Cryptomator 没有预料到会发生这种情况。但我们找到了一个现有的解决方案来解决这个错误。请查看以下链接。
|
||||
error.hyperlink.solution=查找解决方案
|
||||
|
||||
error.lookupPermissionMessage=Cryptomator 可以在线查找这个问题的解决方案。这将从您的IP地址向我们的问题数据库发送一个请求。
|
||||
error.dismiss=放弃
|
||||
error.lookUpSolution=查找解决方案
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=保险库
|
||||
@@ -135,8 +137,11 @@ unlock.success.revealBtn=显示驱动器
|
||||
unlock.error.customPath.message=无法将保险库挂载到自定义路径
|
||||
unlock.error.customPath.description.notSupported=如果您仍想使用自定义路径,请转至首选项并选择支持它的卷类型。否则,请转至保险库选项并选择受支持的挂载点
|
||||
unlock.error.customPath.description.notExists=自定义挂载路径不存在,请在您的本地文件系统中创建它或在保险库选项中进行更改
|
||||
unlock.error.customPath.description.inUse=盘符 "%s" 已被使用。
|
||||
unlock.error.customPath.description.generic=您已为此保险库选择了自定义挂载路径,但使用失败,错误消息:%s
|
||||
unlock.error.customPath.description.inUse=盘符或自定义挂载路径「%s」已被使用。
|
||||
unlock.error.customPath.description.hideawayNotDir=无法删除用于解锁的临时隐藏文件 '%3$s'。请检查该文件,然后手动删除。
|
||||
unlock.error.customPath.description.couldNotBeCleaned=无法将您的保险库挂载到路径 "%s"。请重试或选择其他路径。
|
||||
unlock.error.customPath.description.notEmptyDir=自定义挂载路径 "%s" 不是一个空文件夹。请选择一个空文件夹并重试。
|
||||
unlock.error.customPath.description.generic=您为此保险库选择了自定义挂载路径,但使用它时出现了错误信息:%2$s。
|
||||
## Hub
|
||||
hub.noKeychain.message=无法访问设备密钥
|
||||
hub.noKeychain.description=为了解锁 Hub 保险库,需要使用由钥匙串保护的设备密钥。若要继续,请启用“%s”并在首选项中选择一个钥匙串
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=詳情:
|
||||
error.existingSolutionDescription=Cryptomator 沒有預料到會發生這種情況。但我們找到了一個現有的解決方案來解決這個錯誤。請查看以下連結。
|
||||
error.hyperlink.solution=尋找解決方案
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=加密庫
|
||||
|
||||
@@ -135,8 +134,11 @@ unlock.success.revealBtn=展示磁碟
|
||||
unlock.error.customPath.message=無法掛載加密庫於此自定路徑
|
||||
unlock.error.customPath.description.notSupported=若要繼續使用自定路徑,請在設定選取支援此自定路徑的空間/加密空間類型;或者,在加密庫選項中選擇一個受支援的掛載點。
|
||||
unlock.error.customPath.description.notExists=自定路徑不存在。請在本機文件系統指定另一路徑或在加密庫選項中變更。
|
||||
unlock.error.customPath.description.inUse=磁碟代號 "%s" 已被使用。
|
||||
unlock.error.customPath.description.generic=已為加密庫設定了自定路徑,但是運作時出現錯誤:%s
|
||||
unlock.error.customPath.description.inUse=磁碟代號或自訂掛載路徑「%s」已被使用。
|
||||
unlock.error.customPath.description.hideawayNotDir=無法移除用於解鎖的臨時隱藏檔案「%3$s」。請檢查該檔案,然後手動刪除。
|
||||
unlock.error.customPath.description.couldNotBeCleaned=無法將您的保險庫掛載至路徑「%s」。請再試一次或選擇不同的路徑。
|
||||
unlock.error.customPath.description.notEmptyDir=自訂掛載路徑「%s」不是一個空資料夾。請選擇一個空資料夾並重試。
|
||||
unlock.error.customPath.description.generic=您為此保險庫選擇了自訂掛載路徑,但使用時出現了錯誤訊息:%2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=無法訪問設備密鑰
|
||||
hub.noKeychain.description=為了解鎖 Hub 加密檔案庫需要一個裝置密鑰,該密鑰已被安全地保管在鑰匙串中。為了繼續進行,請啟用「%s」並在偏好設定中選擇一個鑰匙串。
|
||||
|
||||
@@ -23,7 +23,6 @@ error.technicalDetails=詳情:
|
||||
error.existingSolutionDescription=Cryptomator 沒有預料到會發生這種情況。但我們找到了一個現有的解決方案來解決這個錯誤。請查看以下連結。
|
||||
error.hyperlink.solution=查詢解決方案
|
||||
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=加密檔案庫
|
||||
|
||||
@@ -135,8 +134,11 @@ unlock.success.revealBtn=顯示磁碟
|
||||
unlock.error.customPath.message=無法將檔案庫掛載至自訂路徑
|
||||
unlock.error.customPath.description.notSupported=如果要繼續使用自訂的掛載路徑,必須變更成支援的磁區空間類型,不然就必須使用不同的掛載路徑
|
||||
unlock.error.customPath.description.notExists=自訂的掛載路徑並不存在‧ 請在本機創立該路徑,或者在加密庫選項中更改
|
||||
unlock.error.customPath.description.inUse=磁碟代號 "%s" 已被使用。
|
||||
unlock.error.customPath.description.generic=你選擇使用自訂的路徑來掛載此加密庫,但是掛載失敗,原因: %s
|
||||
unlock.error.customPath.description.inUse=磁碟代號或自訂掛載路徑「%s」已被使用。
|
||||
unlock.error.customPath.description.hideawayNotDir=無法移除用於解鎖的臨時隱藏檔案「%3$s」。請檢查該檔案,然後手動刪除。
|
||||
unlock.error.customPath.description.couldNotBeCleaned=無法將您的保險庫掛載至路徑「%s」。請再試一次或選擇不同的路徑。
|
||||
unlock.error.customPath.description.notEmptyDir=自訂掛載路徑「%s」不是一個空資料夾。請選擇一個空資料夾並重試。
|
||||
unlock.error.customPath.description.generic=您為此保險庫選擇了自訂掛載路徑,但使用時出現了錯誤訊息:%2$s
|
||||
## Hub
|
||||
hub.noKeychain.message=無法讀取裝置金鑰
|
||||
hub.noKeychain.description=需要由鑰匙圈保護的裝置金鑰才能解鎖Hub加密檔案庫。請先至偏好設定中啟用「%s」並選擇一組鑰匙圈。
|
||||
|
||||
@@ -0,0 +1,241 @@
|
||||
package org.cryptomator.common.mount;
|
||||
|
||||
import org.apache.commons.lang3.SystemUtils;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.condition.DisabledOnOs;
|
||||
import org.junit.jupiter.api.condition.EnabledOnOs;
|
||||
import org.junit.jupiter.api.condition.OS;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.DirectoryNotEmptyException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Objects;
|
||||
|
||||
import static java.nio.file.LinkOption.NOFOLLOW_LINKS;
|
||||
import static org.cryptomator.common.mount.MountWithinParentUtil.MountPointState.EMPTY_DIR;
|
||||
import static org.cryptomator.common.mount.MountWithinParentUtil.MountPointState.NOT_EXISTING;
|
||||
import static org.cryptomator.common.mount.MountWithinParentUtil.cleanup;
|
||||
import static org.cryptomator.common.mount.MountWithinParentUtil.getHideaway;
|
||||
import static org.cryptomator.common.mount.MountWithinParentUtil.getMountPointState;
|
||||
import static org.cryptomator.common.mount.MountWithinParentUtil.prepareParentNoMountPoint;
|
||||
import static org.cryptomator.common.mount.MountWithinParentUtil.removeResidualHideaway;
|
||||
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import static org.junit.jupiter.api.Assumptions.assumeTrue;
|
||||
|
||||
class MountWithinParentUtilTest {
|
||||
|
||||
@Test
|
||||
void testPrepareNeitherExist(@TempDir Path parentDir) {
|
||||
assertThrows(MountPointNotExistingException.class, () -> {
|
||||
prepareParentNoMountPoint(parentDir.resolve("mount"));
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void testPrepareOnlyHideawayFileExists(@TempDir Path parentDir) throws IOException {
|
||||
var mount = parentDir.resolve("mount");
|
||||
var hideaway = getHideaway(mount);
|
||||
Files.createFile(hideaway);
|
||||
|
||||
assertThrows(HideawayNotDirectoryException.class, () -> {
|
||||
prepareParentNoMountPoint(mount);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void testPrepareOnlyHideawayDirExists(@TempDir Path parentDir) throws IOException {
|
||||
var mount = parentDir.resolve("mount");
|
||||
var hideaway = getHideaway(mount);
|
||||
Files.createDirectory(hideaway);
|
||||
assertFalse(isHidden(hideaway));
|
||||
|
||||
prepareParentNoMountPoint(mount);
|
||||
|
||||
assumeTrue(SystemUtils.IS_OS_WINDOWS);
|
||||
assertTrue(isHidden(hideaway));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testPrepareBothExistHideawayFile(@TempDir Path parentDir) throws IOException {
|
||||
var mount = parentDir.resolve("mount");
|
||||
var hideaway = getHideaway(mount);
|
||||
Files.createFile(hideaway);
|
||||
Files.createDirectory(mount);
|
||||
|
||||
assertThrows(HideawayNotDirectoryException.class, () -> {
|
||||
prepareParentNoMountPoint(mount);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void testPrepareBothExistHideawayNotEmpty(@TempDir Path parentDir) throws IOException {
|
||||
var mount = parentDir.resolve("mount");
|
||||
var hideaway = getHideaway(mount);
|
||||
Files.createDirectory(hideaway);
|
||||
Files.createFile(hideaway.resolve("dummy"));
|
||||
Files.createDirectory(mount);
|
||||
|
||||
assertThrows(DirectoryNotEmptyException.class, () -> {
|
||||
prepareParentNoMountPoint(mount);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void testPrepareBothExistMountNotDir(@TempDir Path parentDir) throws IOException {
|
||||
var mount = parentDir.resolve("mount");
|
||||
var hideaway = getHideaway(mount);
|
||||
Files.createFile(hideaway);
|
||||
Files.createFile(mount);
|
||||
|
||||
assertThrows(MountPointNotEmptyDirectoryException.class, () -> {
|
||||
prepareParentNoMountPoint(mount); //Must not throw something related to hideaway
|
||||
});
|
||||
assertTrue(Files.exists(hideaway, NOFOLLOW_LINKS));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testPrepareBothExistMountNotEmpty(@TempDir Path parentDir) throws IOException {
|
||||
var mount = parentDir.resolve("mount");
|
||||
var hideaway = getHideaway(mount);
|
||||
Files.createFile(hideaway);
|
||||
Files.createDirectory(mount);
|
||||
Files.createFile(mount.resolve("dummy"));
|
||||
|
||||
assertThrows(MountPointNotEmptyDirectoryException.class, () -> {
|
||||
prepareParentNoMountPoint(mount); //Must not throw something related to hideaway
|
||||
});
|
||||
assertTrue(Files.exists(hideaway, NOFOLLOW_LINKS));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testPrepareBothExist(@TempDir Path parentDir) throws IOException {
|
||||
var mount = parentDir.resolve("mount");
|
||||
var hideaway = getHideaway(mount);
|
||||
Files.createDirectory(hideaway);
|
||||
Files.createDirectory(mount);
|
||||
|
||||
prepareParentNoMountPoint(mount);
|
||||
assertTrue(Files.notExists(mount, NOFOLLOW_LINKS));
|
||||
|
||||
assumeTrue(SystemUtils.IS_OS_WINDOWS);
|
||||
assertTrue(isHidden(hideaway));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testHandleMountPointFolderDoesNotExist(@TempDir Path parentDir) throws IOException {
|
||||
assertSame(getMountPointState(parentDir.resolve("notExisting")), NOT_EXISTING);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testHandleMountPointFolderIsFile(@TempDir Path parentDir) throws IOException {
|
||||
var regularFile = parentDir.resolve("regularFile");
|
||||
Files.createFile(regularFile);
|
||||
|
||||
assertThrows(MountPointNotEmptyDirectoryException.class, () -> {
|
||||
getMountPointState(regularFile);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void testHandleMountPointFolderIsNotEmpty(@TempDir Path parentDir) throws IOException {
|
||||
var regularFolder = parentDir.resolve("regularFolder");
|
||||
var dummyFile = regularFolder.resolve("dummy");
|
||||
Files.createDirectory(regularFolder);
|
||||
Files.createFile(dummyFile);
|
||||
|
||||
assertThrows(MountPointNotEmptyDirectoryException.class, () -> {
|
||||
getMountPointState(regularFolder);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void testHandleMountPointFolder(@TempDir Path parentDir) throws IOException {
|
||||
//Sadly can't easily create files with "Other" attribute
|
||||
var regularFolder = parentDir.resolve("regularFolder");
|
||||
Files.createDirectory(regularFolder);
|
||||
|
||||
assertSame(getMountPointState(regularFolder), EMPTY_DIR);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRemoveResidualHideawayFile(@TempDir Path parentDir) throws IOException {
|
||||
var hideaway = parentDir.resolve("hideaway");
|
||||
Files.createFile(hideaway);
|
||||
|
||||
assertThrows(HideawayNotDirectoryException.class, () -> removeResidualHideaway(parentDir.resolve("mount"), hideaway));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRemoveResidualHideawayNotEmpty(@TempDir Path parentDir) throws IOException {
|
||||
var hideaway = parentDir.resolve("hideaway");
|
||||
Files.createDirectory(hideaway);
|
||||
Files.createFile(hideaway.resolve("dummy"));
|
||||
|
||||
assertThrows(DirectoryNotEmptyException.class, () -> removeResidualHideaway(parentDir.resolve("mount"), hideaway));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testCleanupNoHideaway(@TempDir Path parentDir) {
|
||||
assertDoesNotThrow(() -> cleanup(parentDir.resolve("mount")));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testCleanup(@TempDir Path parentDir) throws IOException {
|
||||
var mount = parentDir.resolve("mount");
|
||||
var hideaway = getHideaway(mount);
|
||||
Files.createDirectory(hideaway);
|
||||
|
||||
cleanup(mount);
|
||||
assertTrue(Files.exists(mount, NOFOLLOW_LINKS));
|
||||
assertTrue(Files.notExists(hideaway, NOFOLLOW_LINKS));
|
||||
assertFalse(isHidden(mount));
|
||||
}
|
||||
|
||||
@Test
|
||||
@EnabledOnOs(OS.WINDOWS)
|
||||
void testGetHideawayRootDirWin() {
|
||||
var mount = Path.of("C:\\mount");
|
||||
var hideaway = getHideaway(mount);
|
||||
|
||||
assertEquals(mount.getParent(), hideaway.getParent());
|
||||
assertEquals(mount.getParent().resolve(".~$mount.tmp"), hideaway);
|
||||
assertEquals(mount.getParent().toAbsolutePath() + ".~$mount.tmp", hideaway.toAbsolutePath().toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisabledOnOs(OS.WINDOWS)
|
||||
void testGetHideawayRootDirUnix() {
|
||||
var mount = Path.of("/mount");
|
||||
var hideaway = getHideaway(mount);
|
||||
|
||||
assertEquals(mount.getParent(), hideaway.getParent());
|
||||
assertEquals(mount.getParent().resolve(".~$mount.tmp"), hideaway);
|
||||
assertEquals(mount.getParent().toAbsolutePath() + ".~$mount.tmp", hideaway.toAbsolutePath().toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetHideaway(@TempDir Path parentDir) {
|
||||
var mount = parentDir.resolve("mount");
|
||||
var hideaway = getHideaway(mount);
|
||||
|
||||
assertEquals(mount.getParent(), hideaway.getParent());
|
||||
assertEquals(mount.getParent().resolve(".~$mount.tmp"), hideaway);
|
||||
assertEquals(mount.getParent().toAbsolutePath() + File.separator + ".~$mount.tmp", hideaway.toAbsolutePath().toString());
|
||||
}
|
||||
|
||||
private static boolean isHidden(Path path) throws IOException {
|
||||
try {
|
||||
return (boolean) Objects.requireNonNullElse(Files.getAttribute(path, "dos:hidden", NOFOLLOW_LINKS), false);
|
||||
} catch (UnsupportedOperationException | IllegalMountPointException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -63,4 +63,11 @@
|
||||
<cve>CVE-2023-35116</cve>
|
||||
</suppress>
|
||||
|
||||
<suppress>
|
||||
<notes><![CDATA[
|
||||
False positive for jackrabbit-webdav-2.21.15.jar. This component is not affected, see https://lists.apache.org/thread/j03b3qdhborc2jrhdc4d765d3jkh8bfw
|
||||
]]></notes>
|
||||
<packageUrl regex="true">^pkg:maven/org\.apache\.jackrabbit/jackrabbit\-webdav@.*$</packageUrl>
|
||||
<cve>CVE-2023-37895</cve>
|
||||
</suppress>
|
||||
</suppressions>
|
||||
|
||||
Reference in New Issue
Block a user