mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-09-22 16:04:28 +00:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2bad933c85 |
@@ -43,7 +43,6 @@ body:
|
|||||||
- WinFsp (Local Drive)
|
- WinFsp (Local Drive)
|
||||||
- FUSE-T
|
- FUSE-T
|
||||||
- macFUSE
|
- macFUSE
|
||||||
- FUSE
|
|
||||||
- WebDAV (Windows Explorer)
|
- WebDAV (Windows Explorer)
|
||||||
- WebDAV (AppleScript)
|
- WebDAV (AppleScript)
|
||||||
- WebDAV (gio)
|
- WebDAV (gio)
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: "maven"
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: "weekly"
|
|
||||||
day: "monday"
|
|
||||||
time: "06:00"
|
|
||||||
timezone: "UTC"
|
|
||||||
groups:
|
|
||||||
maven-dependencies:
|
|
||||||
patterns:
|
|
||||||
- "*"
|
|
||||||
|
|
||||||
- package-ecosystem: "github-actions"
|
|
||||||
directory: "/" # even for `.github/workflows`
|
|
||||||
schedule:
|
|
||||||
interval: "monthly"
|
|
||||||
groups:
|
|
||||||
github-actions:
|
|
||||||
patterns:
|
|
||||||
- "*"
|
|
||||||
labels:
|
|
||||||
- "misc:ci"
|
|
||||||
@@ -10,7 +10,6 @@ on:
|
|||||||
required: false
|
required: false
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
|
||||||
JAVA_VERSION: 20
|
JAVA_VERSION: 20
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -21,50 +20,26 @@ jobs:
|
|||||||
|
|
||||||
build:
|
build:
|
||||||
name: Build AppImage
|
name: Build AppImage
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ubuntu-latest
|
||||||
needs: [get-version]
|
needs: [get-version]
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- os: ubuntu-latest
|
|
||||||
appimage-suffix: x86_64
|
|
||||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_linux-x64_bin-jmods.zip'
|
|
||||||
openjfx-sha: 'f522ac2ae4bdd61f0219b7b8d2058ff72a22f36a44378453bcfdcd82f8f5e08c'
|
|
||||||
- os: [self-hosted, Linux, ARM64]
|
|
||||||
appimage-suffix: aarch64
|
|
||||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_linux-aarch64_bin-jmods.zip'
|
|
||||||
openjfx-sha: 'c0d80ebbe0aab404ef9ad8b46c05bf533a1e40b39b2720eebd9238d81f6326ca'
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: 'zulu'
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
check-latest: true
|
java-package: 'jdk+fx'
|
||||||
cache: 'maven'
|
cache: 'maven'
|
||||||
|
- name: Ensure major jfx version in pom equals in jdk
|
||||||
- name: Download OpenJFX jmods
|
shell: pwsh
|
||||||
id: download-jmods
|
|
||||||
run: |
|
run: |
|
||||||
curl -L ${{ matrix.openjfx-url }} -o openjfx-jmods.zip
|
$jfxPomVersion = (&mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout) -split "\."
|
||||||
echo "${{ matrix.openjfx-sha }} openjfx-jmods.zip" | shasum -a256 --check
|
$jfxJdkVersion = ((Get-Content -path "${env:JAVA_HOME}/lib/javafx.properties" | Where-Object {$_ -like 'javafx.version=*' }) -replace '.*=','') -split "\."
|
||||||
mkdir -p openjfx-jmods
|
if ($jfxPomVersion[0] -ne $jfxJdkVersion[0]) {
|
||||||
unzip -j openjfx-jmods.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d openjfx-jmods
|
Write-Error "Major part of JavaFX version in pom($($jfxPomVersion[0])) does not match the version in JDK($($jfxJdkVersion[0])) "
|
||||||
- name: Ensure major jfx version in pom and in jmods is the same
|
|
||||||
run: |
|
|
||||||
JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1)
|
|
||||||
JMOD_VERSION=${JMOD_VERSION#*@}
|
|
||||||
JMOD_VERSION=${JMOD_VERSION%%.*}
|
|
||||||
POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout)
|
|
||||||
POM_JFX_VERSION=${POM_JFX_VERSION#*@}
|
|
||||||
POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
|
|
||||||
|
|
||||||
if [ $POM_JFX_VERSION -ne $JMOD_VERSION_AMD64 ]; then
|
|
||||||
>&2 echo "Major JavaFX version in pom.xml (${POM_JFX_VERSION}) != amd64 jmod version (${JMOD_VERSION})"
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
}
|
||||||
- name: Set version
|
- name: Set version
|
||||||
run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }}
|
run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }}
|
||||||
- name: Run maven
|
- name: Run maven
|
||||||
@@ -78,8 +53,8 @@ jobs:
|
|||||||
${JAVA_HOME}/bin/jlink
|
${JAVA_HOME}/bin/jlink
|
||||||
--verbose
|
--verbose
|
||||||
--output runtime
|
--output runtime
|
||||||
--module-path "${JAVA_HOME}/jmods:openjfx-jmods"
|
--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,jdk.net
|
--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
|
||||||
--strip-native-commands
|
--strip-native-commands
|
||||||
--no-header-files
|
--no-header-files
|
||||||
--no-man-pages
|
--no-man-pages
|
||||||
@@ -105,7 +80,7 @@ jobs:
|
|||||||
--copyright "(C) 2016 - 2023 Skymatic GmbH"
|
--copyright "(C) 2016 - 2023 Skymatic GmbH"
|
||||||
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
|
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
|
||||||
--java-options "--enable-preview"
|
--java-options "--enable-preview"
|
||||||
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator"
|
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64"
|
||||||
--java-options "-Xss5m"
|
--java-options "-Xss5m"
|
||||||
--java-options "-Xmx256m"
|
--java-options "-Xmx256m"
|
||||||
--java-options "-Dcryptomator.appVersion=\"${{ needs.get-version.outputs.semVerStr }}\""
|
--java-options "-Dcryptomator.appVersion=\"${{ needs.get-version.outputs.semVerStr }}\""
|
||||||
@@ -117,8 +92,7 @@ jobs:
|
|||||||
--java-options "-Dcryptomator.p12Path=\"@{userhome}/.config/Cryptomator/key.p12\""
|
--java-options "-Dcryptomator.p12Path=\"@{userhome}/.config/Cryptomator/key.p12\""
|
||||||
--java-options "-Dcryptomator.ipcSocketPath=\"@{userhome}/.config/Cryptomator/ipc.socket\""
|
--java-options "-Dcryptomator.ipcSocketPath=\"@{userhome}/.config/Cryptomator/ipc.socket\""
|
||||||
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/.local/share/Cryptomator/mnt\""
|
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/.local/share/Cryptomator/mnt\""
|
||||||
--java-options "-Dcryptomator.showTrayIcon=true"
|
--java-options "-Dcryptomator.showTrayIcon=false"
|
||||||
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"@{appdir}/usr/share/icons/hicolor/symbolic/apps\""
|
|
||||||
--java-options "-Dcryptomator.buildNumber=\"appimage-${{ needs.get-version.outputs.revNum }}\""
|
--java-options "-Dcryptomator.buildNumber=\"appimage-${{ needs.get-version.outputs.revNum }}\""
|
||||||
--add-launcher Cryptomator-gtk2=launcher-gtk2.properties
|
--add-launcher Cryptomator-gtk2=launcher-gtk2.properties
|
||||||
--resource-dir dist/linux/resources
|
--resource-dir dist/linux/resources
|
||||||
@@ -129,10 +103,6 @@ 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.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.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.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.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/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
|
cp dist/linux/common/application-vnd.cryptomator.vault.xml Cryptomator.AppDir/usr/share/mime/packages/application-vnd.cryptomator.vault.xml
|
||||||
@@ -143,7 +113,7 @@ jobs:
|
|||||||
ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun
|
ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun
|
||||||
- name: Download AppImageKit
|
- name: Download AppImageKit
|
||||||
run: |
|
run: |
|
||||||
curl -L https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-${{ matrix.appimage-suffix }}.AppImage -o appimagetool.AppImage
|
curl -L https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage -o appimagetool.AppImage
|
||||||
chmod +x appimagetool.AppImage
|
chmod +x appimagetool.AppImage
|
||||||
./appimagetool.AppImage --appimage-extract
|
./appimagetool.AppImage --appimage-extract
|
||||||
- name: Prepare GPG-Agent for signing with key 615D449FE6E6A235
|
- name: Prepare GPG-Agent for signing with key 615D449FE6E6A235
|
||||||
@@ -155,8 +125,8 @@ jobs:
|
|||||||
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
|
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
|
||||||
- name: Build AppImage
|
- name: Build AppImage
|
||||||
run: >
|
run: >
|
||||||
./squashfs-root/AppRun Cryptomator.AppDir cryptomator-${{ needs.get-version.outputs.semVerStr }}-${{ matrix.appimage-suffix }}.AppImage
|
./squashfs-root/AppRun Cryptomator.AppDir cryptomator-${{ needs.get-version.outputs.semVerStr }}-x86_64.AppImage
|
||||||
-u 'gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-${{ matrix.appimage-suffix }}.AppImage.zsync'
|
-u 'gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-x86_64.AppImage.zsync'
|
||||||
--sign --sign-key=615D449FE6E6A235 --sign-args="--batch --pinentry-mode loopback"
|
--sign --sign-key=615D449FE6E6A235 --sign-args="--batch --pinentry-mode loopback"
|
||||||
- name: Create detached GPG signatures
|
- name: Create detached GPG signatures
|
||||||
run: |
|
run: |
|
||||||
@@ -165,7 +135,7 @@ jobs:
|
|||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: appimage-${{ matrix.appimage-suffix }}
|
name: appimage
|
||||||
path: |
|
path: |
|
||||||
cryptomator-*.AppImage
|
cryptomator-*.AppImage
|
||||||
cryptomator-*.AppImage.zsync
|
cryptomator-*.AppImage.zsync
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ on:
|
|||||||
types: [labeled]
|
types: [labeled]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
|
||||||
JAVA_VERSION: 20
|
JAVA_VERSION: 20
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
@@ -21,7 +20,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-java@v3
|
- uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: 'zulu'
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
cache: 'maven'
|
cache: 'maven'
|
||||||
- name: Cache SonarCloud packages
|
- name: Cache SonarCloud packages
|
||||||
|
|||||||
@@ -16,12 +16,9 @@ on:
|
|||||||
type: boolean
|
type: boolean
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
|
||||||
JAVA_VERSION: 20
|
JAVA_VERSION: 20
|
||||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_linux-x64_bin-jmods.zip'
|
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/20.0.1/openjfx-20.0.1_linux-x64_bin-jmods.zip'
|
||||||
OPENJFX_JMODS_AMD64_HASH: 'f522ac2ae4bdd61f0219b7b8d2058ff72a22f36a44378453bcfdcd82f8f5e08c'
|
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/20.0.1/openjfx-20.0.1_linux-aarch64_bin-jmods.zip'
|
||||||
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_linux-aarch64_bin-jmods.zip'
|
|
||||||
OPENJFX_JMODS_AARCH64_HASH: 'c0d80ebbe0aab404ef9ad8b46c05bf533a1e40b39b2720eebd9238d81f6326ca'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -46,9 +43,8 @@ jobs:
|
|||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: 'zulu'
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
check-latest: true
|
|
||||||
cache: 'maven'
|
cache: 'maven'
|
||||||
- name: Run maven
|
- name: Run maven
|
||||||
run: mvn -B clean package -Pdependency-check,linux -DskipTests
|
run: mvn -B clean package -Pdependency-check,linux -DskipTests
|
||||||
@@ -56,11 +52,9 @@ jobs:
|
|||||||
id: download-jmods
|
id: download-jmods
|
||||||
run: |
|
run: |
|
||||||
curl -L ${{ env.OPENJFX_JMODS_AMD64 }} -o openjfx-amd64.zip
|
curl -L ${{ env.OPENJFX_JMODS_AMD64 }} -o openjfx-amd64.zip
|
||||||
echo "${{ env.OPENJFX_JMODS_AMD64_HASH }} openjfx-amd64.zip" | shasum -a256 --check
|
|
||||||
mkdir -p jmods/amd64
|
mkdir -p jmods/amd64
|
||||||
unzip -j openjfx-amd64.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d jmods/amd64
|
unzip -j openjfx-amd64.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d jmods/amd64
|
||||||
curl -L ${{ env.OPENJFX_JMODS_AARCH64 }} -o openjfx-aarch64.zip
|
curl -L ${{ env.OPENJFX_JMODS_AARCH64 }} -o openjfx-aarch64.zip
|
||||||
echo "${{ env.OPENJFX_JMODS_AARCH64_HASH }} openjfx-aarch64.zip" | shasum -a256 --check
|
|
||||||
mkdir -p jmods/aarch64
|
mkdir -p jmods/aarch64
|
||||||
unzip -j openjfx-aarch64.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d jmods/aarch64
|
unzip -j openjfx-aarch64.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d jmods/aarch64
|
||||||
- name: Ensure major jfx version in pom and in jmods is the same
|
- name: Ensure major jfx version in pom and in jmods is the same
|
||||||
@@ -97,8 +91,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cp -r dist/linux/debian/ pkgdir
|
cp -r dist/linux/debian/ pkgdir
|
||||||
export RFC2822_TIMESTAMP=`date --rfc-2822`
|
export RFC2822_TIMESTAMP=`date --rfc-2822`
|
||||||
export DISABLE_UPDATE_CHECK=${{ inputs.dput }}
|
envsubst '${SEMVER_STR} ${VERSION_NUM} ${REVISION_NUM}' < dist/linux/debian/rules > pkgdir/debian/rules
|
||||||
envsubst '${SEMVER_STR} ${VERSION_NUM} ${REVISION_NUM} ${DISABLE_UPDATE_CHECK}' < dist/linux/debian/rules > pkgdir/debian/rules
|
|
||||||
envsubst '${PPA_VERSION} ${RFC2822_TIMESTAMP}' < dist/linux/debian/changelog > pkgdir/debian/changelog
|
envsubst '${PPA_VERSION} ${RFC2822_TIMESTAMP}' < dist/linux/debian/changelog > pkgdir/debian/changelog
|
||||||
find . -name "*.jar" >> pkgdir/debian/source/include-binaries
|
find . -name "*.jar" >> pkgdir/debian/source/include-binaries
|
||||||
mv pkgdir cryptomator_${{ inputs.ppaver }}
|
mv pkgdir cryptomator_${{ inputs.ppaver }}
|
||||||
|
|||||||
@@ -22,8 +22,9 @@ on:
|
|||||||
value: ${{ jobs.determine-version.outputs.type }}
|
value: ${{ jobs.determine-version.outputs.type }}
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
|
||||||
JAVA_VERSION: 20
|
JAVA_VERSION: 20
|
||||||
|
JAVA_DIST: 'temurin'
|
||||||
|
JAVA_CACHE: 'maven'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
determine-version:
|
determine-version:
|
||||||
@@ -43,7 +44,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ env.JAVA_DIST }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
cache: 'maven'
|
cache: ${{ env.JAVA_CACHE }}
|
||||||
- id: versions
|
- id: versions
|
||||||
name: Get version information
|
name: Get version information
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -8,14 +8,8 @@ on:
|
|||||||
version:
|
version:
|
||||||
description: 'Version'
|
description: 'Version'
|
||||||
required: false
|
required: false
|
||||||
notarize:
|
|
||||||
description: 'Notarize'
|
|
||||||
required: true
|
|
||||||
default: false
|
|
||||||
type: boolean
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
|
||||||
JAVA_VERSION: 20
|
JAVA_VERSION: 20
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -37,45 +31,31 @@ jobs:
|
|||||||
output-suffix: x64
|
output-suffix: x64
|
||||||
xcode-path: '/Applications/Xcode_13.2.1.app'
|
xcode-path: '/Applications/Xcode_13.2.1.app'
|
||||||
fuse-lib: macFUSE
|
fuse-lib: macFUSE
|
||||||
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]
|
- os: [self-hosted, macOS, ARM64]
|
||||||
architecture: aarch64
|
architecture: aarch64
|
||||||
output-suffix: arm64
|
output-suffix: arm64
|
||||||
xcode-path: '/Applications/Xcode_13.2.1.app'
|
xcode-path: '/Applications/Xcode_13.2.1.app'
|
||||||
fuse-lib: FUSE-T
|
fuse-lib: FUSE-T
|
||||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_osx-aarch64_bin-jmods.zip'
|
|
||||||
openjfx-sha: 'c60f5f19aa847e0e620e0b011e5de68f2c6755641c2141cec27a0b89f612beaf'
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: 'zulu'
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
|
java-package: 'jdk+fx'
|
||||||
architecture: ${{ matrix.architecture }}
|
architecture: ${{ matrix.architecture }}
|
||||||
check-latest: true
|
|
||||||
cache: 'maven'
|
cache: 'maven'
|
||||||
- name: Download OpenJFX jmods
|
- name: Ensure major jfx version in pom equals in jdk
|
||||||
id: download-jmods
|
if: ${{ !contains(matrix.os, 'self-hosted') }}
|
||||||
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
curl -L ${{ matrix.openjfx-url }} -o openjfx-jmods.zip
|
$jfxPomVersion = (&mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout) -split "\."
|
||||||
echo "${{ matrix.openjfx-sha }} *openjfx-jmods.zip" | shasum -a256 --check
|
$jfxJdkVersion = ((Get-Content -path "${env:JAVA_HOME}/lib/javafx.properties" | Where-Object {$_ -like 'javafx.version=*' }) -replace '.*=','') -split "\."
|
||||||
mkdir -p openjfx-jmods/
|
if ($jfxPomVersion[0] -ne $jfxJdkVersion[0]) {
|
||||||
unzip -j openjfx-jmods.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d openjfx-jmods
|
Write-Error "Major part of JavaFX version in pom($($jfxPomVersion[0])) does not match the version in JDK($($jfxJdkVersion[0])) "
|
||||||
- name: Ensure major jfx version in pom and in jmods is the same
|
|
||||||
run: |
|
|
||||||
JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1)
|
|
||||||
JMOD_VERSION=${JMOD_VERSION#*@}
|
|
||||||
JMOD_VERSION=${JMOD_VERSION%%.*}
|
|
||||||
POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout)
|
|
||||||
POM_JFX_VERSION=${POM_JFX_VERSION#*@}
|
|
||||||
POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
|
|
||||||
|
|
||||||
if [ $POM_JFX_VERSION -ne $JMOD_VERSION ]; then
|
|
||||||
>&2 echo "Major JavaFX version in pom.xml (${POM_JFX_VERSION}) != jmod version (${JMOD_VERSION})"
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
}
|
||||||
- name: Set version
|
- name: Set version
|
||||||
run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }}
|
run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }}
|
||||||
- name: Run maven
|
- name: Run maven
|
||||||
@@ -89,7 +69,7 @@ jobs:
|
|||||||
${JAVA_HOME}/bin/jlink
|
${JAVA_HOME}/bin/jlink
|
||||||
--verbose
|
--verbose
|
||||||
--output runtime
|
--output runtime
|
||||||
--module-path "${JAVA_HOME}/jmods:openjfx-jmods"
|
--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.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.accessibility,jdk.management.jfr
|
||||||
--strip-native-commands
|
--strip-native-commands
|
||||||
--no-header-files
|
--no-header-files
|
||||||
@@ -228,7 +208,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
VERSION_NO: ${{ needs.get-version.outputs.semVerNum }}
|
VERSION_NO: ${{ needs.get-version.outputs.semVerNum }}
|
||||||
- name: Notarize .dmg
|
- name: Notarize .dmg
|
||||||
if: startsWith(github.ref, 'refs/tags/') || inputs.notarize
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
uses: cocoalibs/xcode-notarization-action@v1
|
uses: cocoalibs/xcode-notarization-action@v1
|
||||||
with:
|
with:
|
||||||
app-path: 'Cryptomator-*.dmg'
|
app-path: 'Cryptomator-*.dmg'
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
|
||||||
JAVA_VERSION: 20
|
JAVA_VERSION: 20
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
@@ -20,7 +19,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-java@v3
|
- uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: 'zulu'
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
cache: 'maven'
|
cache: 'maven'
|
||||||
- name: Build and Test
|
- name: Build and Test
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ on:
|
|||||||
- 'release/**'
|
- 'release/**'
|
||||||
- 'hotfix/**'
|
- 'hotfix/**'
|
||||||
|
|
||||||
|
env:
|
||||||
|
JAVA_VERSION: 20
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -15,7 +18,7 @@ jobs:
|
|||||||
name: Validate commits pushed to release/hotfix branch to fulfill release requirements
|
name: Validate commits pushed to release/hotfix branch to fulfill release requirements
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v2
|
||||||
- id: validate-pom-version
|
- id: validate-pom-version
|
||||||
name: Validate POM version
|
name: Validate POM version
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -14,10 +14,11 @@ on:
|
|||||||
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
|
||||||
JAVA_VERSION: 20
|
JAVA_VERSION: 20
|
||||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_windows-x64_bin-jmods.zip'
|
JAVA_DIST: 'temurin'
|
||||||
OPENJFX_JMODS_AMD64_HASH: '18625bbc13c57dbf802486564247a8d8cab72ec558c240a401bf6440384ebd77'
|
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'
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
@@ -43,14 +44,14 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ env.JAVA_DIST }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
check-latest: true
|
java-package: 'jdk'
|
||||||
cache: 'maven'
|
cache: ${{ env.JAVA_CACHE }}
|
||||||
- name: Download and extract JavaFX jmods from Gluon
|
- name: Download and extract JavaFX jmods from Gluon
|
||||||
#In the last step we move all jmods files a dir level up because jmods are placed inside a directory in the zip
|
#In the last step we move all jmods files a dir level up because jmods are placed inside a directory in the zip
|
||||||
run: |
|
run: |
|
||||||
curl --output jfxjmods.zip -L "${{ env.OPENJFX_JMODS_AMD64 }}"
|
curl --output jfxjmods.zip -L "${{ env.JFX_JMODS_URL }}"
|
||||||
if(!(Get-FileHash -Path jfxjmods.zip -Algorithm SHA256).Hash.ToLower().equals("${{ env.OPENJFX_JMODS_AMD64_HASH }}")) {
|
if(!(Get-FileHash -Path jfxjmods.zip -Algorithm SHA256).Hash.equals("${{ env.JFX_JMODS_HASH }}")) {
|
||||||
throw "Wrong checksum of JMOD archive downloaded from ${{ env.OPENJFX_JMODS_AMD64 }}.";
|
throw "Wrong checksum of JMOD archive downloaded from ${{ env.JFX_JMODS_URL }}.";
|
||||||
}
|
}
|
||||||
Expand-Archive -Path jfxjmods.zip -DestinationPath jfxjmods
|
Expand-Archive -Path jfxjmods.zip -DestinationPath jfxjmods
|
||||||
Get-ChildItem -Path jfxjmods -Recurse -Filter "*.jmod" | ForEach-Object { Move-Item -Path $_ -Destination $_.Directory.Parent}
|
Get-ChildItem -Path jfxjmods -Recurse -Filter "*.jmod" | ForEach-Object { Move-Item -Path $_ -Destination $_.Directory.Parent}
|
||||||
@@ -246,8 +247,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ env.JAVA_DIST }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
check-latest: true
|
cache: ${{ env.JAVA_CACHE }}
|
||||||
cache: 'maven'
|
|
||||||
- name: Generate license for exe
|
- name: Generate license for exe
|
||||||
run: >
|
run: >
|
||||||
mvn -B license:add-third-party
|
mvn -B license:add-third-party
|
||||||
@@ -359,7 +359,7 @@ jobs:
|
|||||||
cp msi/*.msi files
|
cp msi/*.msi files
|
||||||
cp exe/*.exe files
|
cp exe/*.exe files
|
||||||
- name: Upload to Kaspersky
|
- name: Upload to Kaspersky
|
||||||
uses: SamKirkland/FTP-Deploy-Action@v4.3.4
|
uses: SamKirkland/FTP-Deploy-Action@4.3.3
|
||||||
with:
|
with:
|
||||||
protocol: ftps
|
protocol: ftps
|
||||||
server: allowlist.kaspersky-labs.com
|
server: allowlist.kaspersky-labs.com
|
||||||
@@ -368,7 +368,7 @@ jobs:
|
|||||||
password: ${{ secrets.ALLOWLIST_KASPERSKY_PASSWORD }}
|
password: ${{ secrets.ALLOWLIST_KASPERSKY_PASSWORD }}
|
||||||
local-dir: files/
|
local-dir: files/
|
||||||
- name: Upload to Avast
|
- name: Upload to Avast
|
||||||
uses: SamKirkland/FTP-Deploy-Action@v4.3.4
|
uses: SamKirkland/FTP-Deploy-Action@4.3.0
|
||||||
with:
|
with:
|
||||||
protocol: ftp
|
protocol: ftp
|
||||||
server: whitelisting.avast.com
|
server: whitelisting.avast.com
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
<configuration default="false" name="Cryptomator Linux" type="Application" factoryName="Application">
|
<configuration default="false" name="Cryptomator Linux" type="Application" factoryName="Application">
|
||||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||||
<module name="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,org.purejava.appindicator" />
|
<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" />
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
<configuration default="false" name="Cryptomator Linux Dev" type="Application" factoryName="Application">
|
<configuration default="false" name="Cryptomator Linux Dev" type="Application" factoryName="Application">
|
||||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||||
<module name="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,org.purejava.appindicator" />
|
<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" />
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
Vendored
+4
-8
@@ -16,6 +16,7 @@ mvn -f ../../../pom.xml versions:set -DnewVersion=${SEMVER_STR}
|
|||||||
# compile
|
# compile
|
||||||
mvn -B -f ../../../pom.xml clean package -Plinux -DskipTests
|
mvn -B -f ../../../pom.xml clean package -Plinux -DskipTests
|
||||||
cp ../../../LICENSE.txt ../../../target
|
cp ../../../LICENSE.txt ../../../target
|
||||||
|
cp ../launcher.sh ../../../target
|
||||||
cp ../../../target/cryptomator-*.jar ../../../target/mods
|
cp ../../../target/cryptomator-*.jar ../../../target/mods
|
||||||
|
|
||||||
# add runtime
|
# add runtime
|
||||||
@@ -23,7 +24,7 @@ ${JAVA_HOME}/bin/jlink \
|
|||||||
--verbose \
|
--verbose \
|
||||||
--output runtime \
|
--output runtime \
|
||||||
--module-path "${JAVA_HOME}/jmods" \
|
--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,jdk.net \
|
--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 \
|
||||||
--strip-native-commands \
|
--strip-native-commands \
|
||||||
--no-header-files \
|
--no-header-files \
|
||||||
--no-man-pages \
|
--no-man-pages \
|
||||||
@@ -43,7 +44,7 @@ ${JAVA_HOME}/bin/jpackage \
|
|||||||
--name Cryptomator \
|
--name Cryptomator \
|
||||||
--vendor "Skymatic GmbH" \
|
--vendor "Skymatic GmbH" \
|
||||||
--java-options "--enable-preview" \
|
--java-options "--enable-preview" \
|
||||||
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator" \
|
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64" \
|
||||||
--copyright "(C) 2016 - 2023 Skymatic GmbH" \
|
--copyright "(C) 2016 - 2023 Skymatic GmbH" \
|
||||||
--java-options "-Xss5m" \
|
--java-options "-Xss5m" \
|
||||||
--java-options "-Xmx256m" \
|
--java-options "-Xmx256m" \
|
||||||
@@ -56,8 +57,7 @@ ${JAVA_HOME}/bin/jpackage \
|
|||||||
--java-options "-Dcryptomator.p12Path=\"@{userhome}/.config/Cryptomator/key.p12\"" \
|
--java-options "-Dcryptomator.p12Path=\"@{userhome}/.config/Cryptomator/key.p12\"" \
|
||||||
--java-options "-Dcryptomator.ipcSocketPath=\"@{userhome}/.config/Cryptomator/ipc.socket\"" \
|
--java-options "-Dcryptomator.ipcSocketPath=\"@{userhome}/.config/Cryptomator/ipc.socket\"" \
|
||||||
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/.local/share/Cryptomator/mnt\"" \
|
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/.local/share/Cryptomator/mnt\"" \
|
||||||
--java-options "-Dcryptomator.showTrayIcon=true" \
|
--java-options "-Dcryptomator.showTrayIcon=false" \
|
||||||
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"@{appdir}/usr/share/icons/hicolor/symbolic/apps\"" \
|
|
||||||
--java-options "-Dcryptomator.buildNumber=\"appimage-${REVISION_NO}\"" \
|
--java-options "-Dcryptomator.buildNumber=\"appimage-${REVISION_NO}\"" \
|
||||||
--add-launcher cryptomator-gtk2=launcher-gtk2.properties \
|
--add-launcher cryptomator-gtk2=launcher-gtk2.properties \
|
||||||
--resource-dir ../resources
|
--resource-dir ../resources
|
||||||
@@ -69,10 +69,6 @@ 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.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.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.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.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/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
|
cp ../common/application-vnd.cryptomator.vault.xml Cryptomator.AppDir/usr/share/mime/packages/application-vnd.cryptomator.vault.xml
|
||||||
|
|||||||
@@ -66,11 +66,6 @@
|
|||||||
</content_rating>
|
</content_rating>
|
||||||
|
|
||||||
<releases>
|
<releases>
|
||||||
<release date="2023-09-20" version="1.10.1"/>
|
|
||||||
<release date="2023-09-11" version="1.10.0"/>
|
|
||||||
<release date="2023-08-11" version="1.9.4"/>
|
|
||||||
<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-06-07" version="1.9.1"/>
|
||||||
<release date="2023-05-30" version="1.9.0"/>
|
<release date="2023-05-30" version="1.9.0"/>
|
||||||
<release date="2023-04-25" version="1.8.0"/>
|
<release date="2023-04-25" version="1.8.0"/>
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
<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>
|
|
||||||
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1,8 +0,0 @@
|
|||||||
<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>
|
|
||||||
|
Before Width: | Height: | Size: 3.0 KiB |
-2
@@ -1,8 +1,6 @@
|
|||||||
cryptomator usr/lib
|
cryptomator usr/lib
|
||||||
common/org.cryptomator.Cryptomator.desktop usr/share/applications
|
common/org.cryptomator.Cryptomator.desktop usr/share/applications
|
||||||
common/org.cryptomator.Cryptomator.svg usr/share/icons/hicolor/scalable/apps
|
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.Cryptomator256.png usr/share/icons/hicolor/256x256/apps
|
||||||
common/org.cryptomator.Cryptomator512.png usr/share/icons/hicolor/512x512/apps
|
common/org.cryptomator.Cryptomator512.png usr/share/icons/hicolor/512x512/apps
|
||||||
common/org.cryptomator.Cryptomator.metainfo.xml usr/share/metainfo
|
common/org.cryptomator.Cryptomator.metainfo.xml usr/share/metainfo
|
||||||
|
|||||||
Vendored
-2
@@ -1,3 +1 @@
|
|||||||
usr/lib/cryptomator/bin/cryptomator usr/bin/cryptomator
|
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
|
|
||||||
Vendored
+3
-5
@@ -27,7 +27,7 @@ override_dh_auto_build:
|
|||||||
$(JAVA_HOME)/bin/jlink \
|
$(JAVA_HOME)/bin/jlink \
|
||||||
--output runtime \
|
--output runtime \
|
||||||
--module-path "${JMODS_PATH}" \
|
--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,jdk.net \
|
--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 \
|
||||||
--strip-native-commands \
|
--strip-native-commands \
|
||||||
--no-header-files \
|
--no-header-files \
|
||||||
--no-man-pages \
|
--no-man-pages \
|
||||||
@@ -43,7 +43,7 @@ override_dh_auto_build:
|
|||||||
--name cryptomator \
|
--name cryptomator \
|
||||||
--vendor "Skymatic GmbH" \
|
--vendor "Skymatic GmbH" \
|
||||||
--java-options "--enable-preview" \
|
--java-options "--enable-preview" \
|
||||||
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator" \
|
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64" \
|
||||||
--copyright "(C) 2016 - 2023 Skymatic GmbH" \
|
--copyright "(C) 2016 - 2023 Skymatic GmbH" \
|
||||||
--java-options "-Xss5m" \
|
--java-options "-Xss5m" \
|
||||||
--java-options "-Xmx256m" \
|
--java-options "-Xmx256m" \
|
||||||
@@ -55,11 +55,9 @@ override_dh_auto_build:
|
|||||||
--java-options "-Dcryptomator.p12Path=\"@{userhome}/.config/Cryptomator/key.p12\"" \
|
--java-options "-Dcryptomator.p12Path=\"@{userhome}/.config/Cryptomator/key.p12\"" \
|
||||||
--java-options "-Dcryptomator.ipcSocketPath=\"@{userhome}/.config/Cryptomator/ipc.socket\"" \
|
--java-options "-Dcryptomator.ipcSocketPath=\"@{userhome}/.config/Cryptomator/ipc.socket\"" \
|
||||||
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/.local/share/Cryptomator/mnt\"" \
|
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/.local/share/Cryptomator/mnt\"" \
|
||||||
--java-options "-Dcryptomator.showTrayIcon=true" \
|
--java-options "-Dcryptomator.showTrayIcon=false" \
|
||||||
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"/usr/share/icons/hicolor/symbolic/apps\"" \
|
|
||||||
--java-options "-Dcryptomator.buildNumber=\"deb-${REVISION_NUM}\"" \
|
--java-options "-Dcryptomator.buildNumber=\"deb-${REVISION_NUM}\"" \
|
||||||
--java-options "-Dcryptomator.appVersion=\"${SEMVER_STR}\"" \
|
--java-options "-Dcryptomator.appVersion=\"${SEMVER_STR}\"" \
|
||||||
--java-options "-Dcryptomator.disableUpdateCheck=\"${DISABLE_UPDATE_CHECK}\"" \
|
|
||||||
--app-version "${VERSION_NUM}.${REVISION_NUM}" \
|
--app-version "${VERSION_NUM}.${REVISION_NUM}" \
|
||||||
--resource-dir resources \
|
--resource-dir resources \
|
||||||
--verbose
|
--verbose
|
||||||
|
|||||||
Vendored
+2
-26
@@ -29,14 +29,6 @@ REVISION_NO=`git rev-list --count HEAD`
|
|||||||
VERSION_NO=`mvn -f../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout | sed -rn 's/.*([0-9]+\.[0-9]+\.[0-9]+).*/\1/p'`
|
VERSION_NO=`mvn -f../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout | sed -rn 's/.*([0-9]+\.[0-9]+\.[0-9]+).*/\1/p'`
|
||||||
FUSE_LIB="FUSE-T"
|
FUSE_LIB="FUSE-T"
|
||||||
|
|
||||||
ARCH="undefined"
|
|
||||||
if [ "$(machine)" = "arm64e" ]; then
|
|
||||||
ARCH="aarch64"
|
|
||||||
else
|
|
||||||
ARCH="x64"
|
|
||||||
fi
|
|
||||||
OPENJFX_JMODS="https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_osx-${ARCH}_bin-jmods.zip"
|
|
||||||
|
|
||||||
# check preconditions
|
# check preconditions
|
||||||
if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi
|
if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi
|
||||||
command -v mvn >/dev/null 2>&1 || { echo >&2 "mvn not found. Fix by 'brew install maven'."; exit 1; }
|
command -v mvn >/dev/null 2>&1 || { echo >&2 "mvn not found. Fix by 'brew install maven'."; exit 1; }
|
||||||
@@ -46,22 +38,6 @@ if [ -n "${CODESIGN_IDENTITY}" ]; then
|
|||||||
if [[ ! `security find-identity -v -p codesigning | grep -w "${CODESIGN_IDENTITY}"` ]]; then echo "Given codesign identity is invalid."; exit 1; fi
|
if [[ ! `security find-identity -v -p codesigning | grep -w "${CODESIGN_IDENTITY}"` ]]; then echo "Given codesign identity is invalid."; exit 1; fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# download and check jmods
|
|
||||||
curl -L ${OPENJFX_JMODS} -o openjfx-jmods.zip
|
|
||||||
mkdir -p openjfx-jmods/
|
|
||||||
unzip -j openjfx-jmods.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d openjfx-jmods/
|
|
||||||
JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1)
|
|
||||||
JMOD_VERSION=${JMOD_VERSION#*@}
|
|
||||||
JMOD_VERSION=${JMOD_VERSION%%.*}
|
|
||||||
POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout)
|
|
||||||
POM_JFX_VERSION=${POM_JFX_VERSION#*@}
|
|
||||||
POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
|
|
||||||
|
|
||||||
if [ $POM_JFX_VERSION -ne $JMOD_VERSION ]; then
|
|
||||||
>&2 echo "Major JavaFX version in pom.xml (${POM_JFX_VERSION}) != jmod version (${JMOD_VERSION})"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# compile
|
# compile
|
||||||
mvn -B -f../../../pom.xml clean package -DskipTests -Pmac
|
mvn -B -f../../../pom.xml clean package -DskipTests -Pmac
|
||||||
cp ../../../target/${MAIN_JAR_GLOB} ../../../target/mods
|
cp ../../../target/${MAIN_JAR_GLOB} ../../../target/mods
|
||||||
@@ -69,8 +45,8 @@ cp ../../../target/${MAIN_JAR_GLOB} ../../../target/mods
|
|||||||
# add runtime
|
# add runtime
|
||||||
${JAVA_HOME}/bin/jlink \
|
${JAVA_HOME}/bin/jlink \
|
||||||
--output runtime \
|
--output runtime \
|
||||||
--module-path "${JAVA_HOME}/jmods:openjfx-jmods" \
|
--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,jdk.unsupported,jdk.crypto.ec,jdk.accessibility,jdk.management.jfr \
|
||||||
--strip-native-commands \
|
--strip-native-commands \
|
||||||
--no-header-files \
|
--no-header-files \
|
||||||
--no-man-pages \
|
--no-man-pages \
|
||||||
|
|||||||
Vendored
BIN
Binary file not shown.
Vendored
+1
-1
@@ -11,7 +11,7 @@ SET HELP_URL="https://cryptomator.org/contact/"
|
|||||||
SET MODULE_AND_MAIN_CLASS="org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator"
|
SET MODULE_AND_MAIN_CLASS="org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator"
|
||||||
SET LOOPBACK_ALIAS="cryptomator-vault"
|
SET LOOPBACK_ALIAS="cryptomator-vault"
|
||||||
|
|
||||||
powershell -NoLogo -NoProfile -ExecutionPolicy Unrestricted -Command .\build.ps1^
|
powershell -NoLogo -ExecutionPolicy Unrestricted -Command .\build.ps1^
|
||||||
-AppName %APPNAME%^
|
-AppName %APPNAME%^
|
||||||
-MainJarGlob "%MAIN_JAR_GLOB%"^
|
-MainJarGlob "%MAIN_JAR_GLOB%"^
|
||||||
-ModuleAndMainClass "%MODULE_AND_MAIN_CLASS%"^
|
-ModuleAndMainClass "%MODULE_AND_MAIN_CLASS%"^
|
||||||
|
|||||||
Vendored
+4
-6
@@ -51,11 +51,10 @@ if ($clean -and (Test-Path -Path $runtimeImagePath)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
## download jfx jmods
|
## download jfx jmods
|
||||||
$jmodsVersion='20.0.2'
|
$jfxJmodsChecksum = 'd00767334c43b8832b5cf10267d34ca8f563d187c4655b73eb6020dd79c054b5'
|
||||||
$jmodsUrl = "https://download2.gluonhq.com/openjfx/${jmodsVersion}/openjfx-${jmodsVersion}_windows-x64_bin-jmods.zip"
|
|
||||||
$jfxJmodsChecksum = '18625bbc13c57dbf802486564247a8d8cab72ec558c240a401bf6440384ebd77'
|
|
||||||
$jfxJmodsZip = '.\resources\jfxJmods.zip'
|
$jfxJmodsZip = '.\resources\jfxJmods.zip'
|
||||||
if( !(Test-Path -Path $jfxJmodsZip) ) {
|
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}..."
|
Write-Output "Downloading ${jmodsUrl}..."
|
||||||
Invoke-WebRequest $jmodsUrl -OutFile $jfxJmodsZip # redirects are followed by default
|
Invoke-WebRequest $jmodsUrl -OutFile $jfxJmodsZip # redirects are followed by default
|
||||||
}
|
}
|
||||||
@@ -65,14 +64,13 @@ if( $jmodsChecksumActual -ne $jfxJmodsChecksum ) {
|
|||||||
Write-Error "Checksum mismatch for jfxJmods.zip. Expected: $jfxJmodsChecksum, actual: $jmodsChecksumActual"
|
Write-Error "Checksum mismatch for jfxJmods.zip. Expected: $jfxJmodsChecksum, actual: $jmodsChecksumActual"
|
||||||
exit 1;
|
exit 1;
|
||||||
}
|
}
|
||||||
Expand-Archive -Path $jfxJmodsZip -DestinationPath ".\resources\"
|
Expand-Archive -Force -Path $jfxJmodsZip -DestinationPath ".\resources\"
|
||||||
Move-Item -Force -Path ".\resources\javafx-jmods-*" -Destination ".\resources\javafx-jmods" -ErrorAction Stop
|
|
||||||
|
|
||||||
|
|
||||||
& "$Env:JAVA_HOME\bin\jlink" `
|
& "$Env:JAVA_HOME\bin\jlink" `
|
||||||
--verbose `
|
--verbose `
|
||||||
--output runtime `
|
--output runtime `
|
||||||
--module-path "$Env:JAVA_HOME/jmods;$buildDir/resources/javafx-jmods" `
|
--module-path "$Env:JAVA_HOME/jmods;$buildDir/resources/javafx-jmods-20.0.1" `
|
||||||
--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 `
|
--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 `
|
--strip-native-commands `
|
||||||
--no-header-files `
|
--no-header-files `
|
||||||
|
|||||||
Vendored
+1
-1
@@ -3,5 +3,5 @@
|
|||||||
::REPLACE ME
|
::REPLACE ME
|
||||||
|
|
||||||
cd %~dp0
|
cd %~dp0
|
||||||
powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command .\patchWebDAV.ps1^
|
powershell -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -Command .\patchWebDAV.ps1^
|
||||||
-LoopbackAlias %LOOPBACK_ALIAS%
|
-LoopbackAlias %LOOPBACK_ALIAS%
|
||||||
+1
-1
@@ -2,4 +2,4 @@
|
|||||||
:: see comments in file ./version170-migrate-settings.ps1
|
:: see comments in file ./version170-migrate-settings.ps1
|
||||||
|
|
||||||
cd %~dp0
|
cd %~dp0
|
||||||
powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command .\version170-migrate-settings.ps1
|
powershell -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -Command .\version170-migrate-settings.ps1
|
||||||
Vendored
+2
-8
@@ -132,17 +132,11 @@
|
|||||||
<CustomAction Id="JpSetARPURLUPDATEINFO" Property="ARPURLUPDATEINFO" Value="$(var.JpUpdateURL)" />
|
<CustomAction Id="JpSetARPURLUPDATEINFO" Property="ARPURLUPDATEINFO" Value="$(var.JpUpdateURL)" />
|
||||||
<?endif?>
|
<?endif?>
|
||||||
|
|
||||||
<Property Id="WixQuietExec64CmdTimeout" Value="20" />
|
|
||||||
<!-- Note for custom actions: Immediate CAs run BEFORE the files are installed, hence if you depend on installed files, the CAs must be deferred.-->
|
|
||||||
<!-- WebDAV patches -->
|
<!-- WebDAV patches -->
|
||||||
<SetProperty Id="PatchWebDAV" Value=""[INSTALLDIR]patchWebDAV.bat""
|
<CustomAction Id="PatchWebDAV" Impersonate="no" ExeCommand="[INSTALLDIR]patchWebDAV.bat" Directory="INSTALLDIR" Execute="deferred" Return="asyncWait" />
|
||||||
Sequence="execute" Before="PatchWebDAV" />
|
|
||||||
<CustomAction Id="PatchWebDAV" BinaryKey="WixCA" DllEntry="WixQuietExec64" Execute="deferred" Return="ignore" Impersonate="no"/>
|
|
||||||
|
|
||||||
<!-- Special Settings migration for 1.7.0,. Should be removed eventually, for more info, see ../contrib/version170-migrate-settings.ps1-->
|
<!-- Special Settings migration for 1.7.0,. Should be removed eventually, for more info, see ../contrib/version170-migrate-settings.ps1-->
|
||||||
<SetProperty Id="V170MigrateSettings" Value=""[INSTALLDIR]version170-migrate-settings.bat""
|
<CustomAction Id="V170MigrateSettings" Impersonate="no" ExeCommand="[INSTALLDIR]version170-migrate-settings.bat" Directory="INSTALLDIR" Execute="deferred" Return="asyncWait" />
|
||||||
Sequence="execute" Before="V170MigrateSettings" />
|
|
||||||
<CustomAction Id="V170MigrateSettings" BinaryKey="WixCA" DllEntry="WixQuietExec64" Execute="deferred" Return="ignore" Impersonate="no"/>
|
|
||||||
|
|
||||||
<!-- Running App detection and exit -->
|
<!-- Running App detection and exit -->
|
||||||
<Property Id="FOUNDRUNNINGAPP" Admin="yes"/>
|
<Property Id="FOUNDRUNNINGAPP" Admin="yes"/>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>org.cryptomator</groupId>
|
<groupId>org.cryptomator</groupId>
|
||||||
<artifactId>cryptomator</artifactId>
|
<artifactId>cryptomator</artifactId>
|
||||||
<version>1.10.1</version>
|
<version>1.10.0-SNAPSHOT</version>
|
||||||
<name>Cryptomator Desktop App</name>
|
<name>Cryptomator Desktop App</name>
|
||||||
|
|
||||||
<organization>
|
<organization>
|
||||||
@@ -29,49 +29,42 @@
|
|||||||
<project.jdk.version>20</project.jdk.version>
|
<project.jdk.version>20</project.jdk.version>
|
||||||
|
|
||||||
<!-- Group IDs of jars that need to stay on the class path for now -->
|
<!-- Group IDs of jars that need to stay on the class path for now -->
|
||||||
<!-- remove them, as soon they got modularized or support is dropped (i.e., WebDAV) -->
|
<!-- Once hypfvieh, swiesend, purejava and integrations-linux have module-info, remove them-->
|
||||||
<nonModularGroupIds>org.ow2.asm,org.apache.jackrabbit,org.apache.httpcomponents</nonModularGroupIds>
|
<nonModularGroupIds>org.ow2.asm,org.apache.jackrabbit,org.apache.httpcomponents,de.swiesend,org.purejava,com.github.hypfvieh</nonModularGroupIds>
|
||||||
|
|
||||||
<!-- cryptomator dependencies -->
|
<!-- cryptomator dependencies -->
|
||||||
<cryptomator.cryptofs.version>2.6.7</cryptomator.cryptofs.version>
|
<cryptomator.cryptofs.version>2.6.6</cryptomator.cryptofs.version>
|
||||||
<cryptomator.integrations.version>1.3.0</cryptomator.integrations.version>
|
<cryptomator.integrations.version>1.2.0</cryptomator.integrations.version>
|
||||||
<cryptomator.integrations.win.version>1.2.3</cryptomator.integrations.win.version>
|
<cryptomator.integrations.win.version>1.2.0</cryptomator.integrations.win.version>
|
||||||
<cryptomator.integrations.mac.version>1.2.2</cryptomator.integrations.mac.version>
|
<cryptomator.integrations.mac.version>1.2.0</cryptomator.integrations.mac.version>
|
||||||
<cryptomator.integrations.linux.version>1.3.0</cryptomator.integrations.linux.version>
|
<cryptomator.integrations.linux.version>1.2.1</cryptomator.integrations.linux.version>
|
||||||
<cryptomator.fuse.version>3.0.0</cryptomator.fuse.version>
|
<cryptomator.fuse.version>3.0.0</cryptomator.fuse.version>
|
||||||
<cryptomator.dokany.version>2.0.0</cryptomator.dokany.version>
|
<cryptomator.dokany.version>2.0.0</cryptomator.dokany.version>
|
||||||
<cryptomator.webdav.version>2.0.4</cryptomator.webdav.version>
|
<cryptomator.webdav.version>2.0.3</cryptomator.webdav.version>
|
||||||
|
|
||||||
<!-- 3rd party dependencies -->
|
<!-- 3rd party dependencies -->
|
||||||
<commons-lang3.version>3.13.0</commons-lang3.version>
|
<commons-lang3.version>3.12.0</commons-lang3.version>
|
||||||
<dagger.version>2.48</dagger.version>
|
<dagger.version>2.45</dagger.version>
|
||||||
<easybind.version>2.2</easybind.version>
|
<easybind.version>2.2</easybind.version>
|
||||||
<guava.version>32.1.2-jre</guava.version>
|
<guava.version>32.0.1-jre</guava.version>
|
||||||
<jackson.version>2.15.2</jackson.version>
|
<jackson.version>2.15.2</jackson.version>
|
||||||
<javafx.version>20.0.2</javafx.version>
|
<javafx.version>20.0.1</javafx.version>
|
||||||
<jwt.version>4.4.0</jwt.version>
|
<jwt.version>4.4.0</jwt.version>
|
||||||
<nimbus-jose.version>9.31</nimbus-jose.version>
|
<nimbus-jose.version>9.31</nimbus-jose.version>
|
||||||
<logback.version>1.4.11</logback.version>
|
<logback.version>1.4.7</logback.version>
|
||||||
<slf4j.version>2.0.9</slf4j.version>
|
<slf4j.version>2.0.7</slf4j.version>
|
||||||
<tinyoauth2.version>0.6.0</tinyoauth2.version>
|
<tinyoauth2.version>0.5.1</tinyoauth2.version>
|
||||||
<zxcvbn.version>1.8.2</zxcvbn.version>
|
<zxcvbn.version>1.7.0</zxcvbn.version>
|
||||||
|
|
||||||
<!-- test dependencies -->
|
<!-- test dependencies -->
|
||||||
<junit.jupiter.version>5.10.0</junit.jupiter.version>
|
<junit.jupiter.version>5.9.3</junit.jupiter.version>
|
||||||
<mockito.version>5.5.0</mockito.version>
|
<mockito.version>5.3.1</mockito.version>
|
||||||
<hamcrest.version>2.2</hamcrest.version>
|
<hamcrest.version>2.2</hamcrest.version>
|
||||||
|
|
||||||
<!-- build-time dependencies -->
|
<!-- build-time dependencies -->
|
||||||
<jetbrains.annotations.version>24.0.1</jetbrains.annotations.version>
|
<jetbrains.annotations.version>23.0.0</jetbrains.annotations.version>
|
||||||
<dependency-check.version>8.4.0</dependency-check.version>
|
<dependency-check.version>8.1.2</dependency-check.version>
|
||||||
<jacoco.version>0.8.10</jacoco.version>
|
<jacoco.version>0.8.9</jacoco.version>
|
||||||
<license-generator.version>2.2.0</license-generator.version>
|
|
||||||
<junit-tree-reporter.version>1.2.1</junit-tree-reporter.version>
|
|
||||||
<mvn-compiler.version>3.11.0</mvn-compiler.version>
|
|
||||||
<mvn-resources.version>3.3.1</mvn-resources.version>
|
|
||||||
<mvn-dependency.version>3.6.0</mvn-dependency.version>
|
|
||||||
<mvn-surefire.version>3.1.2</mvn-surefire.version>
|
|
||||||
<mvn-jar.version>3.3.0</mvn-jar.version>
|
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
@@ -247,7 +240,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.jimfs</groupId>
|
<groupId>com.google.jimfs</groupId>
|
||||||
<artifactId>jimfs</artifactId>
|
<artifactId>jimfs</artifactId>
|
||||||
<version>1.3.0</version>
|
<version>1.2</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
@@ -265,32 +258,32 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>${mvn-compiler.version}</version>
|
<version>3.10.1</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-resources-plugin</artifactId>
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
<version>${mvn-resources.version}</version>
|
<version>3.3.0</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-dependency-plugin</artifactId>
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
<version>${mvn-dependency.version}</version>
|
<version>3.3.0</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>${mvn-surefire.version}</version>
|
<version>3.0.0-M7</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>license-maven-plugin</artifactId>
|
<artifactId>license-maven-plugin</artifactId>
|
||||||
<version>${license-generator.version}</version>
|
<version>2.0.0</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-jar-plugin</artifactId>
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
<version>${mvn-jar.version}</version>
|
<version>3.3.0</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.jacoco</groupId>
|
<groupId>org.jacoco</groupId>
|
||||||
@@ -339,22 +332,8 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>me.fabriciorby</groupId>
|
|
||||||
<artifactId>maven-surefire-junit5-tree-reporter</artifactId>
|
|
||||||
<version>${junit-tree-reporter.version}</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<argLine>--enable-preview</argLine>
|
<argLine>--enable-preview</argLine>
|
||||||
<reportFormat>plain</reportFormat>
|
|
||||||
<consoleOutputReporter>
|
|
||||||
<disable>true</disable>
|
|
||||||
</consoleOutputReporter>
|
|
||||||
<statelessTestsetInfoReporter
|
|
||||||
implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporter">
|
|
||||||
</statelessTestsetInfoReporter>
|
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package org.cryptomator.common;
|
|||||||
|
|
||||||
import com.google.common.base.Splitter;
|
import com.google.common.base.Splitter;
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import org.jetbrains.annotations.VisibleForTesting;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -32,7 +31,6 @@ public class Environment {
|
|||||||
private static final String BUILD_NUMBER_PROP_NAME = "cryptomator.buildNumber";
|
private static final String BUILD_NUMBER_PROP_NAME = "cryptomator.buildNumber";
|
||||||
private static final String PLUGIN_DIR_PROP_NAME = "cryptomator.pluginDir";
|
private static final String PLUGIN_DIR_PROP_NAME = "cryptomator.pluginDir";
|
||||||
private static final String TRAY_ICON_PROP_NAME = "cryptomator.showTrayIcon";
|
private static final String TRAY_ICON_PROP_NAME = "cryptomator.showTrayIcon";
|
||||||
private static final String DISABLE_UPDATE_CHECK_PROP_NAME = "cryptomator.disableUpdateCheck";
|
|
||||||
|
|
||||||
private Environment() {}
|
private Environment() {}
|
||||||
|
|
||||||
@@ -45,16 +43,15 @@ public class Environment {
|
|||||||
logCryptomatorSystemProperty(SETTINGS_PATH_PROP_NAME);
|
logCryptomatorSystemProperty(SETTINGS_PATH_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(IPC_SOCKET_PATH_PROP_NAME);
|
logCryptomatorSystemProperty(IPC_SOCKET_PATH_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(KEYCHAIN_PATHS_PROP_NAME);
|
logCryptomatorSystemProperty(KEYCHAIN_PATHS_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(P12_PATH_PROP_NAME);
|
|
||||||
logCryptomatorSystemProperty(LOG_DIR_PROP_NAME);
|
logCryptomatorSystemProperty(LOG_DIR_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(LOOPBACK_ALIAS_PROP_NAME);
|
logCryptomatorSystemProperty(LOOPBACK_ALIAS_PROP_NAME);
|
||||||
|
logCryptomatorSystemProperty(PLUGIN_DIR_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(MOUNTPOINT_DIR_PROP_NAME);
|
logCryptomatorSystemProperty(MOUNTPOINT_DIR_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(MIN_PW_LENGTH_PROP_NAME);
|
logCryptomatorSystemProperty(MIN_PW_LENGTH_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(APP_VERSION_PROP_NAME);
|
logCryptomatorSystemProperty(APP_VERSION_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(BUILD_NUMBER_PROP_NAME);
|
logCryptomatorSystemProperty(BUILD_NUMBER_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(PLUGIN_DIR_PROP_NAME);
|
|
||||||
logCryptomatorSystemProperty(TRAY_ICON_PROP_NAME);
|
logCryptomatorSystemProperty(TRAY_ICON_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(DISABLE_UPDATE_CHECK_PROP_NAME);
|
logCryptomatorSystemProperty(P12_PATH_PROP_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Environment getInstance() {
|
public static Environment getInstance() {
|
||||||
@@ -77,6 +74,10 @@ public class Environment {
|
|||||||
return getPaths(SETTINGS_PATH_PROP_NAME);
|
return getPaths(SETTINGS_PATH_PROP_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Stream<Path> getP12Path() {
|
||||||
|
return getPaths(P12_PATH_PROP_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
public Stream<Path> getIpcSocketPath() {
|
public Stream<Path> getIpcSocketPath() {
|
||||||
return getPaths(IPC_SOCKET_PATH_PROP_NAME);
|
return getPaths(IPC_SOCKET_PATH_PROP_NAME);
|
||||||
}
|
}
|
||||||
@@ -85,10 +86,6 @@ public class Environment {
|
|||||||
return getPaths(KEYCHAIN_PATHS_PROP_NAME);
|
return getPaths(KEYCHAIN_PATHS_PROP_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Stream<Path> getP12Path() {
|
|
||||||
return getPaths(P12_PATH_PROP_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Optional<Path> getLogDir() {
|
public Optional<Path> getLogDir() {
|
||||||
return getPath(LOG_DIR_PROP_NAME);
|
return getPath(LOG_DIR_PROP_NAME);
|
||||||
}
|
}
|
||||||
@@ -97,12 +94,12 @@ public class Environment {
|
|||||||
return Optional.ofNullable(System.getProperty(LOOPBACK_ALIAS_PROP_NAME));
|
return Optional.ofNullable(System.getProperty(LOOPBACK_ALIAS_PROP_NAME));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<Path> getMountPointsDir() {
|
public Optional<Path> getPluginDir() {
|
||||||
return getPath(MOUNTPOINT_DIR_PROP_NAME);
|
return getPath(PLUGIN_DIR_PROP_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMinPwLength() {
|
public Optional<Path> getMountPointsDir() {
|
||||||
return Integer.getInteger(MIN_PW_LENGTH_PROP_NAME, DEFAULT_MIN_PW_LENGTH);
|
return getPath(MOUNTPOINT_DIR_PROP_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -118,24 +115,20 @@ public class Environment {
|
|||||||
return Optional.ofNullable(System.getProperty(BUILD_NUMBER_PROP_NAME));
|
return Optional.ofNullable(System.getProperty(BUILD_NUMBER_PROP_NAME));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<Path> getPluginDir() {
|
public int getMinPwLength() {
|
||||||
return getPath(PLUGIN_DIR_PROP_NAME);
|
return Integer.getInteger(MIN_PW_LENGTH_PROP_NAME, DEFAULT_MIN_PW_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean showTrayIcon() {
|
public boolean showTrayIcon() {
|
||||||
return Boolean.getBoolean(TRAY_ICON_PROP_NAME);
|
return Boolean.getBoolean(TRAY_ICON_PROP_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean disableUpdateCheck() {
|
|
||||||
return Boolean.getBoolean(DISABLE_UPDATE_CHECK_PROP_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Optional<Path> getPath(String propertyName) {
|
private Optional<Path> getPath(String propertyName) {
|
||||||
String value = System.getProperty(propertyName);
|
String value = System.getProperty(propertyName);
|
||||||
return Optional.ofNullable(value).map(Paths::get);
|
return Optional.ofNullable(value).map(Paths::get);
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
// visible for testing
|
||||||
Stream<Path> getPaths(String propertyName) {
|
Stream<Path> getPaths(String propertyName) {
|
||||||
Stream<String> rawSettingsPaths = getRawList(propertyName, System.getProperty("path.separator").charAt(0));
|
Stream<String> rawSettingsPaths = getRawList(propertyName, System.getProperty("path.separator").charAt(0));
|
||||||
return rawSettingsPaths.filter(Predicate.not(Strings::isNullOrEmpty)).map(Path::of);
|
return rawSettingsPaths.filter(Predicate.not(Strings::isNullOrEmpty)).map(Path::of);
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package org.cryptomator.common;
|
|||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import com.google.common.base.Throwables;
|
import com.google.common.base.Throwables;
|
||||||
import org.jetbrains.annotations.VisibleForTesting;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -115,7 +114,7 @@ public class ErrorCode {
|
|||||||
* @param bottomFrames Other stack frames, potentially forming the bottom of the stack of <code>allFrames</code>
|
* @param bottomFrames Other stack frames, potentially forming the bottom of the stack of <code>allFrames</code>
|
||||||
* @return The number of additional frames in <code>allFrames</code>. In most cases this should be equal to the difference in size.
|
* @return The number of additional frames in <code>allFrames</code>. In most cases this should be equal to the difference in size.
|
||||||
*/
|
*/
|
||||||
@VisibleForTesting
|
// visible for testing
|
||||||
static int countTopmostFrames(StackTraceElement[] allFrames, StackTraceElement[] bottomFrames) {
|
static int countTopmostFrames(StackTraceElement[] allFrames, StackTraceElement[] bottomFrames) {
|
||||||
if (allFrames.length < bottomFrames.length) {
|
if (allFrames.length < bottomFrames.length) {
|
||||||
// if frames had been stacked on top of bottomFrames, allFrames would be larger
|
// if frames had been stacked on top of bottomFrames, allFrames would be larger
|
||||||
@@ -125,7 +124,7 @@ public class ErrorCode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
// visible for testing
|
||||||
static <T> int commonSuffixLength(T[] set, T[] subset) {
|
static <T> int commonSuffixLength(T[] set, T[] subset) {
|
||||||
Preconditions.checkArgument(set.length >= subset.length);
|
Preconditions.checkArgument(set.length >= subset.length);
|
||||||
// iterate items backwards as long as they are identical
|
// iterate items backwards as long as they are identical
|
||||||
|
|||||||
+2
-2
@@ -83,8 +83,8 @@ public final class OneDriveWindowsLocationPresetsProvider implements LocationPre
|
|||||||
throw new TimeoutException(cmdDescription + " timed out after " + timeoutSeconds + "s");
|
throw new TimeoutException(cmdDescription + " timed out after " + timeoutSeconds + "s");
|
||||||
}
|
}
|
||||||
if (process.exitValue() != 0) {
|
if (process.exitValue() != 0) {
|
||||||
@SuppressWarnings("resource") var stdout = process.inputReader(StandardCharsets.ISO_8859_1).lines().collect(Collectors.joining("\n"));
|
@SuppressWarnings("resource") var stdout = process.inputReader(StandardCharsets.UTF_8).lines().collect(Collectors.joining("\n"));
|
||||||
@SuppressWarnings("resource") var stderr = process.errorReader(StandardCharsets.ISO_8859_1).lines().collect(Collectors.joining("\n"));
|
@SuppressWarnings("resource") var stderr = process.errorReader(StandardCharsets.UTF_8).lines().collect(Collectors.joining("\n"));
|
||||||
throw new CommandFailedException(cmdDescription, process.exitValue(), stdout, stderr);
|
throw new CommandFailedException(cmdDescription, process.exitValue(), stdout, stderr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
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,25 +1,9 @@
|
|||||||
package org.cryptomator.common.mount;
|
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 class IllegalMountPointException extends IllegalArgumentException {
|
||||||
|
|
||||||
private final Path mountpoint;
|
public IllegalMountPointException(String msg) {
|
||||||
|
|
||||||
public IllegalMountPointException(Path mountpoint) {
|
|
||||||
this(mountpoint, "The provided mountpoint has a problem: " + mountpoint.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
public IllegalMountPointException(Path mountpoint, String msg) {
|
|
||||||
super(msg);
|
super(msg);
|
||||||
this.mountpoint = mountpoint;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Path getMountpoint() {
|
|
||||||
return mountpoint;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
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,10 +1,8 @@
|
|||||||
package org.cryptomator.common.mount;
|
package org.cryptomator.common.mount;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
|
||||||
|
|
||||||
public class MountPointInUseException extends IllegalMountPointException {
|
public class MountPointInUseException extends IllegalMountPointException {
|
||||||
|
|
||||||
public MountPointInUseException(Path path) {
|
public MountPointInUseException(String msg) {
|
||||||
super(path);
|
super(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
package org.cryptomator.common.mount;
|
|
||||||
|
|
||||||
import java.nio.file.Path;
|
|
||||||
|
|
||||||
public class MountPointNotEmptyDirectoryException extends IllegalMountPointException {
|
|
||||||
|
|
||||||
public MountPointNotEmptyDirectoryException(Path path, String msg) {
|
|
||||||
super(path, msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package org.cryptomator.common.mount;
|
||||||
|
|
||||||
|
public class MountPointNotExistsException extends IllegalMountPointException {
|
||||||
|
|
||||||
|
public MountPointNotExistsException(String msg) {
|
||||||
|
super(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
package org.cryptomator.common.mount;
|
package org.cryptomator.common.mount;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
|
||||||
|
|
||||||
public class MountPointNotSupportedException extends IllegalMountPointException {
|
public class MountPointNotSupportedException extends IllegalMountPointException {
|
||||||
|
|
||||||
public MountPointNotSupportedException(Path path, String msg) {
|
public MountPointNotSupportedException(String msg) {
|
||||||
super(path, msg);
|
super(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package org.cryptomator.common.mount;
|
||||||
|
|
||||||
|
public class MountPointPreparationException extends RuntimeException {
|
||||||
|
|
||||||
|
public MountPointPreparationException(String msg) {
|
||||||
|
super(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MountPointPreparationException(Throwable cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,16 +1,17 @@
|
|||||||
package org.cryptomator.common.mount;
|
package org.cryptomator.common.mount;
|
||||||
|
|
||||||
import org.apache.commons.lang3.SystemUtils;
|
import org.apache.commons.lang3.SystemUtils;
|
||||||
import org.jetbrains.annotations.VisibleForTesting;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.nio.file.DirectoryNotEmptyException;
|
||||||
import java.nio.file.FileAlreadyExistsException;
|
import java.nio.file.FileAlreadyExistsException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.LinkOption;
|
import java.nio.file.LinkOption;
|
||||||
|
import java.nio.file.NoSuchFileException;
|
||||||
|
import java.nio.file.NotDirectoryException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.attribute.BasicFileAttributes;
|
|
||||||
|
|
||||||
public final class MountWithinParentUtil {
|
public final class MountWithinParentUtil {
|
||||||
|
|
||||||
@@ -21,33 +22,31 @@ public final class MountWithinParentUtil {
|
|||||||
|
|
||||||
private MountWithinParentUtil() {}
|
private MountWithinParentUtil() {}
|
||||||
|
|
||||||
static void prepareParentNoMountPoint(Path mountPoint) throws IllegalMountPointException, IOException {
|
static void prepareParentNoMountPoint(Path mountPoint) throws MountPointPreparationException {
|
||||||
Path hideaway = getHideaway(mountPoint);
|
Path hideaway = getHideaway(mountPoint);
|
||||||
var mpState = getMountPointState(mountPoint);
|
var mpExists = Files.exists(mountPoint, LinkOption.NOFOLLOW_LINKS);
|
||||||
var hideExists = Files.exists(hideaway, LinkOption.NOFOLLOW_LINKS);
|
var hideExists = Files.exists(hideaway, LinkOption.NOFOLLOW_LINKS);
|
||||||
|
|
||||||
if (mpState == MountPointState.BROKEN_JUNCTION) {
|
//TODO: possible improvement by just deleting an _empty_ hideaway
|
||||||
LOG.info("Mountpoint \"{}\" is still a junction. Deleting it.", mountPoint);
|
if (mpExists && hideExists) { //both resources exist (whatever type)
|
||||||
Files.delete(mountPoint); //Throws if mountPoint is also a non-empty folder
|
throw new MountPointPreparationException(new FileAlreadyExistsException(hideaway.toString()));
|
||||||
mpState = MountPointState.NOT_EXISTING;
|
} else if (!mpExists && !hideExists) { //neither mountpoint nor hideaway exist
|
||||||
}
|
throw new MountPointPreparationException(new NoSuchFileException(mountPoint.toString()));
|
||||||
|
} else if (!mpExists) { //only hideaway exists
|
||||||
if (mpState == MountPointState.NOT_EXISTING && !hideExists) { //neither mountpoint nor hideaway exist
|
checkIsDirectory(hideaway);
|
||||||
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);
|
LOG.info("Mountpoint {} seems to be not properly cleaned up. Will be fixed on unmount.", mountPoint);
|
||||||
|
try {
|
||||||
if (SystemUtils.IS_OS_WINDOWS) {
|
if (SystemUtils.IS_OS_WINDOWS) {
|
||||||
Files.setAttribute(hideaway, WIN_HIDDEN_ATTR, true, LinkOption.NOFOLLOW_LINKS);
|
Files.setAttribute(hideaway, WIN_HIDDEN_ATTR, true, LinkOption.NOFOLLOW_LINKS);
|
||||||
}
|
}
|
||||||
} else {
|
} catch (IOException e) {
|
||||||
assert mpState == MountPointState.EMPTY_DIR;
|
throw new MountPointPreparationException(e);
|
||||||
try {
|
|
||||||
if (hideExists) { //... with hideaway
|
|
||||||
removeResidualHideaway(mountPoint, hideaway);
|
|
||||||
}
|
}
|
||||||
|
} else { //only mountpoint exists
|
||||||
|
try {
|
||||||
|
checkIsDirectory(mountPoint);
|
||||||
|
checkIsEmpty(mountPoint);
|
||||||
|
|
||||||
//... (now) without hideaway
|
|
||||||
Files.move(mountPoint, hideaway);
|
Files.move(mountPoint, hideaway);
|
||||||
if (SystemUtils.IS_OS_WINDOWS) {
|
if (SystemUtils.IS_OS_WINDOWS) {
|
||||||
Files.setAttribute(hideaway, WIN_HIDDEN_ATTR, true, LinkOption.NOFOLLOW_LINKS);
|
Files.setAttribute(hideaway, WIN_HIDDEN_ATTR, true, LinkOption.NOFOLLOW_LINKS);
|
||||||
@@ -55,66 +54,30 @@ public final class MountWithinParentUtil {
|
|||||||
int attempts = 0;
|
int attempts = 0;
|
||||||
while (!Files.notExists(mountPoint)) {
|
while (!Files.notExists(mountPoint)) {
|
||||||
if (attempts >= 10) {
|
if (attempts >= 10) {
|
||||||
throw new MountPointCleanupFailedException(mountPoint);
|
throw new MountPointPreparationException("Path " + mountPoint + " could not be cleared");
|
||||||
}
|
}
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
attempts++;
|
attempts++;
|
||||||
}
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new MountPointPreparationException(e);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
Thread.currentThread().interrupt();
|
Thread.currentThread().interrupt();
|
||||||
throw new RuntimeException(e);
|
throw new MountPointPreparationException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
enum MountPointState {
|
|
||||||
|
|
||||||
NOT_EXISTING,
|
|
||||||
|
|
||||||
EMPTY_DIR,
|
|
||||||
|
|
||||||
BROKEN_JUNCTION;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
static void removeResidualHideaway(Path mountPoint, Path hideaway) throws IOException {
|
|
||||||
checkIsHideawayDirectory(mountPoint, hideaway);
|
|
||||||
Files.delete(hideaway); //Fails if not empty
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cleanup(Path mountPoint) {
|
static void cleanup(Path mountPoint) {
|
||||||
Path hideaway = getHideaway(mountPoint);
|
Path hideaway = getHideaway(mountPoint);
|
||||||
try {
|
try {
|
||||||
waitForMountpointRestoration(mountPoint);
|
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);
|
Files.move(hideaway, mountPoint);
|
||||||
if (SystemUtils.IS_OS_WINDOWS) {
|
if (SystemUtils.IS_OS_WINDOWS) {
|
||||||
Files.setAttribute(mountPoint, WIN_HIDDEN_ATTR, false);
|
Files.setAttribute(mountPoint, WIN_HIDDEN_ATTR, false);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,27 +99,21 @@ public final class MountWithinParentUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void checkIsMountPointDirectory(Path toCheck) throws IllegalMountPointException {
|
private static void checkIsDirectory(Path toCheck) throws MountPointPreparationException {
|
||||||
if (!Files.isDirectory(toCheck, LinkOption.NOFOLLOW_LINKS)) {
|
if (!Files.isDirectory(toCheck, LinkOption.NOFOLLOW_LINKS)) {
|
||||||
throw new MountPointNotEmptyDirectoryException(toCheck, "Mountpoint is not a directory: " + toCheck);
|
throw new MountPointPreparationException(new NotDirectoryException(toCheck.toString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void checkIsHideawayDirectory(Path mountPoint, Path hideawayToCheck) {
|
private static void checkIsEmpty(Path toCheck) throws MountPointPreparationException, IOException {
|
||||||
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)) {
|
try (var dirStream = Files.list(toCheck)) {
|
||||||
if (dirStream.findFirst().isPresent()) {
|
if (dirStream.findFirst().isPresent()) {
|
||||||
throw new MountPointNotEmptyDirectoryException(toCheck, "Mountpoint directory is not empty: " + toCheck);
|
throw new MountPointPreparationException(new DirectoryNotEmptyException(toCheck.toString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
//visible for testing
|
||||||
static Path getHideaway(Path mountPoint) {
|
static Path getHideaway(Path mountPoint) {
|
||||||
return mountPoint.resolveSibling(HIDEAWAY_PREFIX + mountPoint.getFileName().toString() + HIDEAWAY_SUFFIX);
|
return mountPoint.resolveSibling(HIDEAWAY_PREFIX + mountPoint.getFileName().toString() + HIDEAWAY_SUFFIX);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ public class Mounter {
|
|||||||
var mpIsDriveLetter = userChosenMountPoint.toString().matches("[A-Z]:\\\\");
|
var mpIsDriveLetter = userChosenMountPoint.toString().matches("[A-Z]:\\\\");
|
||||||
if (mpIsDriveLetter) {
|
if (mpIsDriveLetter) {
|
||||||
if (driveLetters.getOccupied().contains(userChosenMountPoint)) {
|
if (driveLetters.getOccupied().contains(userChosenMountPoint)) {
|
||||||
throw new MountPointInUseException(userChosenMountPoint);
|
throw new MountPointInUseException(userChosenMountPoint.toString());
|
||||||
}
|
}
|
||||||
} else if (canMountToParent && !canMountToDir) {
|
} else if (canMountToParent && !canMountToDir) {
|
||||||
MountWithinParentUtil.prepareParentNoMountPoint(userChosenMountPoint);
|
MountWithinParentUtil.prepareParentNoMountPoint(userChosenMountPoint);
|
||||||
@@ -115,13 +115,13 @@ public class Mounter {
|
|||||||
|| (!canMountToParent && !mpIsDriveLetter) //
|
|| (!canMountToParent && !mpIsDriveLetter) //
|
||||||
|| (!canMountToDir && !canMountToParent && !canMountToSystem && !canMountToDriveLetter);
|
|| (!canMountToDir && !canMountToParent && !canMountToSystem && !canMountToDriveLetter);
|
||||||
if (configNotSupported) {
|
if (configNotSupported) {
|
||||||
throw new MountPointNotSupportedException(userChosenMountPoint, e.getMessage());
|
throw new MountPointNotSupportedException(e.getMessage());
|
||||||
} else if (canMountToDir && !canMountToParent && !Files.exists(userChosenMountPoint)) {
|
} else if (canMountToDir && !canMountToParent && !Files.exists(userChosenMountPoint)) {
|
||||||
//mountpoint must exist
|
//mountpoint must exist
|
||||||
throw new MountPointNotExistingException(userChosenMountPoint, e.getMessage());
|
throw new MountPointNotExistsException(e.getMessage());
|
||||||
} else {
|
} else {
|
||||||
//TODO: add specific exception for !canMountToDir && canMountToParent && !Files.notExists(userChosenMountPoint)
|
//TODO: add specific exception for !canMountToDir && canMountToParent && !Files.notExists(userChosenMountPoint)
|
||||||
throw new IllegalMountPointException(userChosenMountPoint, e.getMessage());
|
throw new IllegalMountPointException(e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ public class Settings {
|
|||||||
public final IntegerProperty windowYPosition;
|
public final IntegerProperty windowYPosition;
|
||||||
public final IntegerProperty windowWidth;
|
public final IntegerProperty windowWidth;
|
||||||
public final IntegerProperty windowHeight;
|
public final IntegerProperty windowHeight;
|
||||||
|
public final StringProperty displayConfiguration;
|
||||||
public final StringProperty language;
|
public final StringProperty language;
|
||||||
public final StringProperty mountService;
|
public final StringProperty mountService;
|
||||||
public final StringProperty lastUpdateCheck;
|
public final StringProperty lastUpdateCheck;
|
||||||
@@ -102,6 +103,7 @@ public class Settings {
|
|||||||
this.windowYPosition = new SimpleIntegerProperty(this, "windowYPosition", json.windowYPosition);
|
this.windowYPosition = new SimpleIntegerProperty(this, "windowYPosition", json.windowYPosition);
|
||||||
this.windowWidth = new SimpleIntegerProperty(this, "windowWidth", json.windowWidth);
|
this.windowWidth = new SimpleIntegerProperty(this, "windowWidth", json.windowWidth);
|
||||||
this.windowHeight = new SimpleIntegerProperty(this, "windowHeight", json.windowHeight);
|
this.windowHeight = new SimpleIntegerProperty(this, "windowHeight", json.windowHeight);
|
||||||
|
this.displayConfiguration = new SimpleStringProperty(this, "displayConfiguration", json.displayConfiguration);
|
||||||
this.language = new SimpleStringProperty(this, "language", json.language);
|
this.language = new SimpleStringProperty(this, "language", json.language);
|
||||||
this.mountService = new SimpleStringProperty(this, "mountService", json.mountService);
|
this.mountService = new SimpleStringProperty(this, "mountService", json.mountService);
|
||||||
this.lastUpdateCheck = new SimpleStringProperty(this, "lastUpdateCheck", json.lastUpdateCheck);
|
this.lastUpdateCheck = new SimpleStringProperty(this, "lastUpdateCheck", json.lastUpdateCheck);
|
||||||
@@ -129,6 +131,7 @@ public class Settings {
|
|||||||
windowYPosition.addListener(this::somethingChanged);
|
windowYPosition.addListener(this::somethingChanged);
|
||||||
windowWidth.addListener(this::somethingChanged);
|
windowWidth.addListener(this::somethingChanged);
|
||||||
windowHeight.addListener(this::somethingChanged);
|
windowHeight.addListener(this::somethingChanged);
|
||||||
|
displayConfiguration.addListener(this::somethingChanged);
|
||||||
language.addListener(this::somethingChanged);
|
language.addListener(this::somethingChanged);
|
||||||
mountService.addListener(this::somethingChanged);
|
mountService.addListener(this::somethingChanged);
|
||||||
lastUpdateCheck.addListener(this::somethingChanged);
|
lastUpdateCheck.addListener(this::somethingChanged);
|
||||||
@@ -183,6 +186,7 @@ public class Settings {
|
|||||||
json.windowYPosition = windowYPosition.get();
|
json.windowYPosition = windowYPosition.get();
|
||||||
json.windowWidth = windowWidth.get();
|
json.windowWidth = windowWidth.get();
|
||||||
json.windowHeight = windowHeight.get();
|
json.windowHeight = windowHeight.get();
|
||||||
|
json.displayConfiguration = displayConfiguration.get();
|
||||||
json.language = language.get();
|
json.language = language.get();
|
||||||
json.mountService = mountService.get();
|
json.mountService = mountService.get();
|
||||||
json.lastUpdateCheck = lastUpdateCheck.get();
|
json.lastUpdateCheck = lastUpdateCheck.get();
|
||||||
|
|||||||
@@ -31,6 +31,9 @@ class SettingsJson {
|
|||||||
@JsonProperty("theme")
|
@JsonProperty("theme")
|
||||||
UiTheme theme = Settings.DEFAULT_THEME;
|
UiTheme theme = Settings.DEFAULT_THEME;
|
||||||
|
|
||||||
|
@JsonProperty("displayConfiguration")
|
||||||
|
String displayConfiguration;
|
||||||
|
|
||||||
@JsonProperty("keychainProvider")
|
@JsonProperty("keychainProvider")
|
||||||
String keychainProvider = Settings.DEFAULT_KEYCHAIN_PROVIDER;
|
String keychainProvider = Settings.DEFAULT_KEYCHAIN_PROVIDER;
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import com.google.common.base.CharMatcher;
|
|||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import com.google.common.io.BaseEncoding;
|
import com.google.common.io.BaseEncoding;
|
||||||
import org.apache.commons.lang3.SystemUtils;
|
import org.apache.commons.lang3.SystemUtils;
|
||||||
import org.jetbrains.annotations.VisibleForTesting;
|
|
||||||
|
|
||||||
import javafx.beans.Observable;
|
import javafx.beans.Observable;
|
||||||
import javafx.beans.binding.Bindings;
|
import javafx.beans.binding.Bindings;
|
||||||
@@ -127,7 +126,7 @@ public class VaultSettings {
|
|||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
//visible for testing
|
||||||
static String normalizeDisplayName(String original) {
|
static String normalizeDisplayName(String original) {
|
||||||
if (original.isBlank() || ".".equals(original) || "..".equals(original)) {
|
if (original.isBlank() || ".".equals(original) || "..".equals(original)) {
|
||||||
return "_";
|
return "_";
|
||||||
|
|||||||
@@ -314,6 +314,10 @@ public class Vault {
|
|||||||
return vaultSettings.path.get();
|
return vaultSettings.path.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CryptoFileSystem getCryptoFileSystem() {
|
||||||
|
return cryptoFileSystem.get();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets from the cleartext path its ciphertext counterpart.
|
* Gets from the cleartext path its ciphertext counterpart.
|
||||||
*
|
*
|
||||||
@@ -322,23 +326,7 @@ public class Vault {
|
|||||||
* @throws IllegalStateException if the vault is not unlocked
|
* @throws IllegalStateException if the vault is not unlocked
|
||||||
*/
|
*/
|
||||||
public Path getCiphertextPath(Path cleartextPath) throws IOException {
|
public Path getCiphertextPath(Path cleartextPath) throws IOException {
|
||||||
if (!state.getValue().equals(VaultState.Value.UNLOCKED)) {
|
return state.get().getCiphertextPath(this, cleartextPath);
|
||||||
throw new IllegalStateException("Vault is not unlocked");
|
|
||||||
}
|
|
||||||
var fs = cryptoFileSystem.get();
|
|
||||||
var osPathSeparator = cleartextPath.getFileSystem().getSeparator();
|
|
||||||
var cryptoFsPathSeparator = fs.getSeparator();
|
|
||||||
|
|
||||||
if (getMountPoint() instanceof Mountpoint.WithPath mp) {
|
|
||||||
var absoluteCryptoFsPath = cryptoFsPathSeparator + mp.path().relativize(cleartextPath).toString();
|
|
||||||
if (!cryptoFsPathSeparator.equals(osPathSeparator)) {
|
|
||||||
absoluteCryptoFsPath = absoluteCryptoFsPath.replace(osPathSeparator, cryptoFsPathSeparator);
|
|
||||||
}
|
|
||||||
var cryptoPath = fs.getPath(absoluteCryptoFsPath);
|
|
||||||
return fs.getCiphertextPath(cryptoPath);
|
|
||||||
} else {
|
|
||||||
throw new UnsupportedOperationException("URI mount points not supported.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public VaultConfigCache getVaultConfigCache() {
|
public VaultConfigCache getVaultConfigCache() {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package org.cryptomator.common.vaults;
|
package org.cryptomator.common.vaults;
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
|
import org.cryptomator.integrations.mount.Mountpoint;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -8,6 +9,8 @@ import javax.inject.Inject;
|
|||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import javafx.beans.value.ObservableObjectValue;
|
import javafx.beans.value.ObservableObjectValue;
|
||||||
import javafx.beans.value.ObservableValueBase;
|
import javafx.beans.value.ObservableValueBase;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.concurrent.locks.Condition;
|
import java.util.concurrent.locks.Condition;
|
||||||
@@ -43,12 +46,40 @@ public class VaultState extends ObservableValueBase<VaultState.Value> implements
|
|||||||
/**
|
/**
|
||||||
* Vault is unlocked
|
* Vault is unlocked
|
||||||
*/
|
*/
|
||||||
UNLOCKED,
|
UNLOCKED {
|
||||||
|
/**
|
||||||
|
* Gets from the cleartext path its ciphertext counterpart.
|
||||||
|
*
|
||||||
|
* @return Local os path to the ciphertext resource
|
||||||
|
* @throws IOException if an I/O error occurs
|
||||||
|
* @throws IllegalStateException if the vault is not unlocked
|
||||||
|
*/
|
||||||
|
Path getCiphertextPath(Vault vault, Path cleartextPath) throws IOException {
|
||||||
|
var fs = vault.getCryptoFileSystem();
|
||||||
|
var osPathSeparator = cleartextPath.getFileSystem().getSeparator();
|
||||||
|
var cryptoFsPathSeparator = fs.getSeparator();
|
||||||
|
|
||||||
|
if (vault.getMountPoint() instanceof Mountpoint.WithPath mp) {
|
||||||
|
var absoluteCryptoFsPath = cryptoFsPathSeparator + mp.path().relativize(cleartextPath).toString();
|
||||||
|
if (!cryptoFsPathSeparator.equals(osPathSeparator)) {
|
||||||
|
absoluteCryptoFsPath = absoluteCryptoFsPath.replace(osPathSeparator, cryptoFsPathSeparator);
|
||||||
|
}
|
||||||
|
var cryptoPath = fs.getPath(absoluteCryptoFsPath);
|
||||||
|
return fs.getCiphertextPath(cryptoPath);
|
||||||
|
} else {
|
||||||
|
throw new UnsupportedOperationException("URI mount points not supported.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unknown state due to preceding unrecoverable exceptions.
|
* Unknown state due to preceding unrecoverable exceptions.
|
||||||
*/
|
*/
|
||||||
ERROR;
|
ERROR;
|
||||||
|
|
||||||
|
Path getCiphertextPath(Vault vault, Path cleartextPath) throws IOException {
|
||||||
|
throw new IllegalStateException("Vault is not unlocked");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final AtomicReference<Value> value;
|
private final AtomicReference<Value> value;
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.cryptomator.launcher;
|
package org.cryptomator.launcher;
|
||||||
|
|
||||||
import org.jetbrains.annotations.VisibleForTesting;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -49,7 +48,7 @@ class FileOpenRequestHandler {
|
|||||||
handleLaunchArgs(FileSystems.getDefault(), args);
|
handleLaunchArgs(FileSystems.getDefault(), args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
// visible for testing
|
||||||
void handleLaunchArgs(FileSystem fs, List<String> args) {
|
void handleLaunchArgs(FileSystem fs, List<String> args) {
|
||||||
Collection<Path> pathsToOpen = args.stream().map(str -> {
|
Collection<Path> pathsToOpen = args.stream().map(str -> {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -45,8 +45,9 @@ public abstract class AddVaultModule {
|
|||||||
@Provides
|
@Provides
|
||||||
@AddVaultWizardWindow
|
@AddVaultWizardWindow
|
||||||
@AddVaultWizardScoped
|
@AddVaultWizardScoped
|
||||||
static Stage provideStage(StageFactory factory, @PrimaryStage Stage primaryStage) {
|
static Stage provideStage(StageFactory factory, @PrimaryStage Stage primaryStage, ResourceBundle resourceBundle) {
|
||||||
Stage stage = factory.create();
|
Stage stage = factory.create();
|
||||||
|
stage.setTitle(resourceBundle.getString("addvaultwizard.title"));
|
||||||
stage.setResizable(false);
|
stage.setResizable(false);
|
||||||
stage.initModality(Modality.WINDOW_MODAL);
|
stage.initModality(Modality.WINDOW_MODAL);
|
||||||
stage.initOwner(primaryStage);
|
stage.initOwner(primaryStage);
|
||||||
@@ -89,6 +90,13 @@ public abstract class AddVaultModule {
|
|||||||
|
|
||||||
// ------------------
|
// ------------------
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@FxmlScene(FxmlFile.ADDVAULT_WELCOME)
|
||||||
|
@AddVaultWizardScoped
|
||||||
|
static Scene provideWelcomeScene(@AddVaultWizardWindow FxmlLoaderFactory fxmlLoaders) {
|
||||||
|
return fxmlLoaders.createScene(FxmlFile.ADDVAULT_WELCOME);
|
||||||
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@FxmlScene(FxmlFile.ADDVAULT_EXISTING)
|
@FxmlScene(FxmlFile.ADDVAULT_EXISTING)
|
||||||
@AddVaultWizardScoped
|
@AddVaultWizardScoped
|
||||||
@@ -140,6 +148,11 @@ public abstract class AddVaultModule {
|
|||||||
|
|
||||||
// ------------------
|
// ------------------
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
@IntoMap
|
||||||
|
@FxControllerKey(AddVaultWelcomeController.class)
|
||||||
|
abstract FxController bindWelcomeController(AddVaultWelcomeController controller);
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
@IntoMap
|
@IntoMap
|
||||||
@FxControllerKey(ChooseExistingVaultController.class)
|
@FxControllerKey(ChooseExistingVaultController.class)
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package org.cryptomator.ui.addvaultwizard;
|
||||||
|
|
||||||
|
import dagger.Lazy;
|
||||||
|
import org.cryptomator.ui.common.FxController;
|
||||||
|
import org.cryptomator.ui.common.FxmlFile;
|
||||||
|
import org.cryptomator.ui.common.FxmlScene;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javafx.scene.Scene;
|
||||||
|
import javafx.stage.Stage;
|
||||||
|
|
||||||
|
@AddVaultWizardScoped
|
||||||
|
public class AddVaultWelcomeController implements FxController {
|
||||||
|
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(AddVaultWelcomeController.class);
|
||||||
|
private final Stage window;
|
||||||
|
private final Lazy<Scene> chooseExistingVaultScene;
|
||||||
|
private final Lazy<Scene> createNewVaultScene;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
AddVaultWelcomeController(@AddVaultWizardWindow Stage window, @FxmlScene(FxmlFile.ADDVAULT_EXISTING) Lazy<Scene> chooseExistingVaultScene, @FxmlScene(FxmlFile.ADDVAULT_NEW_NAME) Lazy<Scene> createNewVaultScene) {
|
||||||
|
this.window = window;
|
||||||
|
this.chooseExistingVaultScene = chooseExistingVaultScene;
|
||||||
|
this.createNewVaultScene = createNewVaultScene;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createNewVault() {
|
||||||
|
LOG.debug("AddVaultWelcomeController.createNewVault()");
|
||||||
|
window.setScene(createNewVaultScene.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void chooseExistingVault() {
|
||||||
|
LOG.debug("AddVaultWelcomeController.chooseExistingVault()");
|
||||||
|
window.setScene(chooseExistingVaultScene.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,7 +12,6 @@ import org.cryptomator.ui.common.FxmlScene;
|
|||||||
|
|
||||||
import javafx.scene.Scene;
|
import javafx.scene.Scene;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import java.util.ResourceBundle;
|
|
||||||
|
|
||||||
@AddVaultWizardScoped
|
@AddVaultWizardScoped
|
||||||
@Subcomponent(modules = {AddVaultModule.class})
|
@Subcomponent(modules = {AddVaultModule.class})
|
||||||
@@ -21,23 +20,12 @@ public interface AddVaultWizardComponent {
|
|||||||
@AddVaultWizardWindow
|
@AddVaultWizardWindow
|
||||||
Stage window();
|
Stage window();
|
||||||
|
|
||||||
@FxmlScene(FxmlFile.ADDVAULT_NEW_NAME)
|
@FxmlScene(FxmlFile.ADDVAULT_WELCOME)
|
||||||
Lazy<Scene> sceneNew();
|
Lazy<Scene> scene();
|
||||||
@FxmlScene(FxmlFile.ADDVAULT_EXISTING)
|
|
||||||
Lazy<Scene> sceneExisting();
|
|
||||||
|
|
||||||
default void showAddNewVaultWizard(ResourceBundle resourceBundle) {
|
default void showAddVaultWizard() {
|
||||||
Stage stage = window();
|
Stage stage = window();
|
||||||
stage.setScene(sceneNew().get());
|
stage.setScene(scene().get());
|
||||||
stage.setTitle(resourceBundle.getString("addvaultwizard.new.title"));
|
|
||||||
stage.sizeToScene();
|
|
||||||
stage.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
default void showAddExistingVaultWizard(ResourceBundle resourceBundle) {
|
|
||||||
Stage stage = window();
|
|
||||||
stage.setScene(sceneExisting().get());
|
|
||||||
stage.setTitle(resourceBundle.getString("addvaultwizard.existing.title"));
|
|
||||||
stage.sizeToScene();
|
stage.sizeToScene();
|
||||||
stage.show();
|
stage.show();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ public class ChooseExistingVaultController implements FxController {
|
|||||||
private static final Logger LOG = LoggerFactory.getLogger(ChooseExistingVaultController.class);
|
private static final Logger LOG = LoggerFactory.getLogger(ChooseExistingVaultController.class);
|
||||||
|
|
||||||
private final Stage window;
|
private final Stage window;
|
||||||
|
private final Lazy<Scene> welcomeScene;
|
||||||
private final Lazy<Scene> successScene;
|
private final Lazy<Scene> successScene;
|
||||||
private final FxApplicationWindows appWindows;
|
private final FxApplicationWindows appWindows;
|
||||||
private final ObjectProperty<Path> vaultPath;
|
private final ObjectProperty<Path> vaultPath;
|
||||||
@@ -44,15 +45,9 @@ public class ChooseExistingVaultController implements FxController {
|
|||||||
private final ObservableValue<Image> screenshot;
|
private final ObservableValue<Image> screenshot;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ChooseExistingVaultController(@AddVaultWizardWindow Stage window, //
|
ChooseExistingVaultController(@AddVaultWizardWindow Stage window, @FxmlScene(FxmlFile.ADDVAULT_WELCOME) Lazy<Scene> welcomeScene, @FxmlScene(FxmlFile.ADDVAULT_SUCCESS) Lazy<Scene> successScene, FxApplicationWindows appWindows, ObjectProperty<Path> vaultPath, @AddVaultWizardWindow ObjectProperty<Vault> vault, VaultListManager vaultListManager, ResourceBundle resourceBundle, FxApplicationStyle applicationStyle) {
|
||||||
@FxmlScene(FxmlFile.ADDVAULT_SUCCESS) Lazy<Scene> successScene, //
|
|
||||||
FxApplicationWindows appWindows, //
|
|
||||||
ObjectProperty<Path> vaultPath, //
|
|
||||||
@AddVaultWizardWindow ObjectProperty<Vault> vault, //
|
|
||||||
VaultListManager vaultListManager, //
|
|
||||||
ResourceBundle resourceBundle, //
|
|
||||||
FxApplicationStyle applicationStyle) {
|
|
||||||
this.window = window;
|
this.window = window;
|
||||||
|
this.welcomeScene = welcomeScene;
|
||||||
this.successScene = successScene;
|
this.successScene = successScene;
|
||||||
this.appWindows = appWindows;
|
this.appWindows = appWindows;
|
||||||
this.vaultPath = vaultPath;
|
this.vaultPath = vaultPath;
|
||||||
@@ -75,6 +70,11 @@ public class ChooseExistingVaultController implements FxController {
|
|||||||
return new Image((Objects.requireNonNull(getClass().getResource(imageResourcePath)).toString()));
|
return new Image((Objects.requireNonNull(getClass().getResource(imageResourcePath)).toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
public void back() {
|
||||||
|
window.setScene(welcomeScene.get());
|
||||||
|
}
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
public void chooseFileAndNext() {
|
public void chooseFileAndNext() {
|
||||||
FileChooser fileChooser = new FileChooser();
|
FileChooser fileChooser = new FileChooser();
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import javafx.scene.Scene;
|
|||||||
import javafx.scene.control.TextField;
|
import javafx.scene.control.TextField;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@AddVaultWizardScoped
|
@AddVaultWizardScoped
|
||||||
@@ -26,17 +27,16 @@ public class CreateNewVaultNameController implements FxController {
|
|||||||
|
|
||||||
public TextField textField;
|
public TextField textField;
|
||||||
private final Stage window;
|
private final Stage window;
|
||||||
|
private final Lazy<Scene> welcomeScene;
|
||||||
private final Lazy<Scene> chooseLocationScene;
|
private final Lazy<Scene> chooseLocationScene;
|
||||||
private final ObjectProperty<Path> vaultPath;
|
private final ObjectProperty<Path> vaultPath;
|
||||||
private final StringProperty vaultName;
|
private final StringProperty vaultName;
|
||||||
private final BooleanBinding validVaultName;
|
private final BooleanBinding validVaultName;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
CreateNewVaultNameController(@AddVaultWizardWindow Stage window, //
|
CreateNewVaultNameController(@AddVaultWizardWindow Stage window, @FxmlScene(FxmlFile.ADDVAULT_WELCOME) Lazy<Scene> welcomeScene, @FxmlScene(FxmlFile.ADDVAULT_NEW_LOCATION) Lazy<Scene> chooseLocationScene, ObjectProperty<Path> vaultPath, @Named("vaultName") StringProperty vaultName, ResourceBundle resourceBundle) {
|
||||||
@FxmlScene(FxmlFile.ADDVAULT_NEW_LOCATION) Lazy<Scene> chooseLocationScene, //
|
|
||||||
ObjectProperty<Path> vaultPath, //
|
|
||||||
@Named("vaultName") StringProperty vaultName) {
|
|
||||||
this.window = window;
|
this.window = window;
|
||||||
|
this.welcomeScene = welcomeScene;
|
||||||
this.chooseLocationScene = chooseLocationScene;
|
this.chooseLocationScene = chooseLocationScene;
|
||||||
this.vaultPath = vaultPath;
|
this.vaultPath = vaultPath;
|
||||||
this.vaultName = vaultName;
|
this.vaultName = vaultName;
|
||||||
@@ -58,6 +58,11 @@ public class CreateNewVaultNameController implements FxController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
public void back() {
|
||||||
|
window.setScene(welcomeScene.get());
|
||||||
|
}
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
public void next() {
|
public void next() {
|
||||||
window.setScene(chooseLocationScene.get());
|
window.setScene(chooseLocationScene.get());
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package org.cryptomator.ui.addvaultwizard;
|
package org.cryptomator.ui.addvaultwizard;
|
||||||
|
|
||||||
import org.jetbrains.annotations.VisibleForTesting;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
@@ -53,7 +51,7 @@ public class ReadmeGenerator {
|
|||||||
resourceBundle.getString("addvault.new.readme.accessLocation.4")));
|
resourceBundle.getString("addvault.new.readme.accessLocation.4")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
// visible for testing
|
||||||
String createDocument(Iterable<String> paragraphs) {
|
String createDocument(Iterable<String> paragraphs) {
|
||||||
StringBuilder sb = new StringBuilder(RTF_HEADER);
|
StringBuilder sb = new StringBuilder(RTF_HEADER);
|
||||||
for (String p : paragraphs) {
|
for (String p : paragraphs) {
|
||||||
@@ -65,7 +63,7 @@ public class ReadmeGenerator {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
// visible for testing
|
||||||
String escapeNonAsciiChars(CharSequence input) {
|
String escapeNonAsciiChars(CharSequence input) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
appendEscaped(sb, input);
|
appendEscaped(sb, input);
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ public enum FxmlFile {
|
|||||||
ADDVAULT_NEW_PASSWORD("/fxml/addvault_new_password.fxml"), //
|
ADDVAULT_NEW_PASSWORD("/fxml/addvault_new_password.fxml"), //
|
||||||
ADDVAULT_NEW_RECOVERYKEY("/fxml/addvault_new_recoverykey.fxml"), //
|
ADDVAULT_NEW_RECOVERYKEY("/fxml/addvault_new_recoverykey.fxml"), //
|
||||||
ADDVAULT_SUCCESS("/fxml/addvault_success.fxml"), //
|
ADDVAULT_SUCCESS("/fxml/addvault_success.fxml"), //
|
||||||
|
ADDVAULT_WELCOME("/fxml/addvault_welcome.fxml"), //
|
||||||
CHANGEPASSWORD("/fxml/changepassword.fxml"), //
|
CHANGEPASSWORD("/fxml/changepassword.fxml"), //
|
||||||
CONVERTVAULT_HUBTOPASSWORD_START("/fxml/convertvault_hubtopassword_start.fxml"), //
|
CONVERTVAULT_HUBTOPASSWORD_START("/fxml/convertvault_hubtopassword_start.fxml"), //
|
||||||
CONVERTVAULT_HUBTOPASSWORD_CONVERT("/fxml/convertvault_hubtopassword_convert.fxml"), //
|
CONVERTVAULT_HUBTOPASSWORD_CONVERT("/fxml/convertvault_hubtopassword_convert.fxml"), //
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import org.cryptomator.ui.common.FxmlFile;
|
|||||||
import org.cryptomator.ui.common.FxmlScene;
|
import org.cryptomator.ui.common.FxmlScene;
|
||||||
import org.cryptomator.ui.fxapp.FxApplicationWindows;
|
import org.cryptomator.ui.fxapp.FxApplicationWindows;
|
||||||
import org.cryptomator.ui.recoverykey.RecoveryKeyFactory;
|
import org.cryptomator.ui.recoverykey.RecoveryKeyFactory;
|
||||||
import org.jetbrains.annotations.VisibleForTesting;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -117,7 +116,7 @@ public class HubToPasswordConvertController implements FxController {
|
|||||||
}, Platform::runLater); //
|
}, Platform::runLater); //
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
//visible for testing
|
||||||
void convertInternal() throws CompletionException, IllegalArgumentException {
|
void convertInternal() throws CompletionException, IllegalArgumentException {
|
||||||
var passphrase = newPasswordController.getNewPassword();
|
var passphrase = newPasswordController.getNewPassword();
|
||||||
var vaultPath = vault.getPath();
|
var vaultPath = vault.getPath();
|
||||||
@@ -142,7 +141,7 @@ public class HubToPasswordConvertController implements FxController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
//visible for testing
|
||||||
void backupHubConfig(Path hubConfigPath) throws IOException {
|
void backupHubConfig(Path hubConfigPath) throws IOException {
|
||||||
byte[] hubConfigBytes = Files.readAllBytes(hubConfigPath);
|
byte[] hubConfigBytes = Files.readAllBytes(hubConfigPath);
|
||||||
Path backupPath = hubConfigPath.resolveSibling(VAULTCONFIG_FILENAME + BackupHelper.generateFileIdSuffix(hubConfigBytes) + MASTERKEY_BACKUP_SUFFIX);
|
Path backupPath = hubConfigPath.resolveSibling(VAULTCONFIG_FILENAME + BackupHelper.generateFileIdSuffix(hubConfigBytes) + MASTERKEY_BACKUP_SUFFIX);
|
||||||
@@ -150,7 +149,7 @@ public class HubToPasswordConvertController implements FxController {
|
|||||||
LOG.debug("Successfully created hub config backup {}", backupPath.getFileName());
|
LOG.debug("Successfully created hub config backup {}", backupPath.getFileName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
//visible for testing
|
||||||
Path createPasswordConfig(Path passwordConfigPath, Path masterkeyFile, Passphrase passphrase) throws IOException, MasterkeyLoadingFailedException {
|
Path createPasswordConfig(Path passwordConfigPath, Path masterkeyFile, Passphrase passphrase) throws IOException, MasterkeyLoadingFailedException {
|
||||||
var unverifiedVaultConfig = vault.getVaultConfigCache().get();
|
var unverifiedVaultConfig = vault.getVaultConfigCache().get();
|
||||||
try (var masterkey = masterkeyFileAccess.load(masterkeyFile, passphrase)) {
|
try (var masterkey = masterkeyFileAccess.load(masterkeyFile, passphrase)) {
|
||||||
|
|||||||
@@ -42,21 +42,19 @@ public class ErrorController implements FxController {
|
|||||||
|
|
||||||
private static final ObjectMapper JSON = new ObjectMapper();
|
private static final ObjectMapper JSON = new ObjectMapper();
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(ErrorController.class);
|
private static final Logger LOG = LoggerFactory.getLogger(ErrorController.class);
|
||||||
private static final String USER_AGENT_FORMAT = "Cryptomator/%s (Build %s) (%s %s %s)";
|
private static final String ERROR_CODES_URL = "https://gist.githubusercontent.com/cryptobot/accba9fb9555e7192271b85606f97230/raw/errorcodes.json";
|
||||||
private static final String ERROR_CODES_URL_FORMAT = "https://api.cryptomator.org/desktop/error-codes.json?error-code=%s";
|
|
||||||
private static final String SEARCH_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/categories/errors?discussions_q=category:Errors+%s";
|
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 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 ";
|
private static final String SEARCH_ERRORCODE_DELIM = " OR ";
|
||||||
private static final String REPORT_BODY_TEMPLATE = """
|
private static final String REPORT_BODY_TEMPLATE = """
|
||||||
<!-- 💚 Thank you for reporting this error. -->
|
|
||||||
OS: %s / %s
|
OS: %s / %s
|
||||||
App: %s / %s
|
App: %s / %s
|
||||||
|
|
||||||
<!-- ✏ Please describe what happened as accurately as possible. -->
|
<!-- ✏ Please describe what happened as accurately as possible. -->
|
||||||
Description:
|
|
||||||
|
|
||||||
<!-- 📋 Please also copy and paste the details from the error window. -->
|
<!-- 📋 Please also copy and paste the detail text from the error window. -->
|
||||||
Details:
|
|
||||||
|
<!-- ℹ Text enclosed like this (chevrons, exclamation mark, two dashes) is not visible to others! -->
|
||||||
|
|
||||||
<!-- ❗ If the description or the detail text is missing, the discussion will be deleted. -->
|
<!-- ❗ If the description or the detail text is missing, the discussion will be deleted. -->
|
||||||
""";
|
""";
|
||||||
@@ -67,13 +65,11 @@ public class ErrorController implements FxController {
|
|||||||
private final Scene previousScene;
|
private final Scene previousScene;
|
||||||
private final Stage window;
|
private final Stage window;
|
||||||
private final Environment environment;
|
private final Environment environment;
|
||||||
private final ExecutorService executorService;
|
|
||||||
|
|
||||||
private final BooleanProperty copiedDetails = new SimpleBooleanProperty();
|
private final BooleanProperty copiedDetails = new SimpleBooleanProperty();
|
||||||
private final ObjectProperty<ErrorDiscussion> matchingErrorDiscussion = new SimpleObjectProperty<>();
|
private final ObjectProperty<ErrorDiscussion> matchingErrorDiscussion = new SimpleObjectProperty<>();
|
||||||
private final BooleanExpression errorSolutionFound = matchingErrorDiscussion.isNotNull();
|
private final BooleanExpression errorSolutionFound = matchingErrorDiscussion.isNotNull();
|
||||||
private final BooleanProperty isLoadingHttpResponse = new SimpleBooleanProperty();
|
private final BooleanProperty isLoadingHttpResponse = new SimpleBooleanProperty();
|
||||||
private final BooleanProperty askedForLookupDatabasePermission = new SimpleBooleanProperty();
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment, ExecutorService executorService) {
|
ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment, ExecutorService executorService) {
|
||||||
@@ -83,7 +79,15 @@ public class ErrorController implements FxController {
|
|||||||
this.previousScene = previousScene;
|
this.previousScene = previousScene;
|
||||||
this.window = window;
|
this.window = window;
|
||||||
this.environment = environment;
|
this.environment = environment;
|
||||||
this.executorService = executorService;
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
@@ -136,31 +140,6 @@ public class ErrorController implements FxController {
|
|||||||
CompletableFuture.delayedExecutor(2, TimeUnit.SECONDS, Platform::runLater).execute(() -> copiedDetails.set(false));
|
CompletableFuture.delayedExecutor(2, TimeUnit.SECONDS, Platform::runLater).execute(() -> copiedDetails.set(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@FXML
|
|
||||||
public void dismiss() {
|
|
||||||
askedForLookupDatabasePermission.set(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
public void lookUpSolution() {
|
|
||||||
String userAgent = USER_AGENT_FORMAT.formatted( //
|
|
||||||
environment.getAppVersion(), //
|
|
||||||
environment.getBuildNumber().orElse("undefined"), //
|
|
||||||
System.getProperty("os.name"), //
|
|
||||||
System.getProperty("os.version"), //
|
|
||||||
System.getProperty("os.arch"));
|
|
||||||
isLoadingHttpResponse.set(true);
|
|
||||||
askedForLookupDatabasePermission.set(true);
|
|
||||||
HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
|
|
||||||
HttpRequest httpRequest = HttpRequest.newBuilder()//
|
|
||||||
.header("User-Agent", userAgent)
|
|
||||||
.uri(URI.create(ERROR_CODES_URL_FORMAT.formatted(URLEncoder.encode(errorCode.toString(),StandardCharsets.UTF_8))))//
|
|
||||||
.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) {
|
private void loadHttpResponse(HttpResponse<InputStream> response) {
|
||||||
if (response.statusCode() != 200) {
|
if (response.statusCode() != 200) {
|
||||||
LOG.error("Status code {} when trying to load {} ", response.statusCode(), response.uri());
|
LOG.error("Status code {} when trying to load {} ", response.statusCode(), response.uri());
|
||||||
@@ -314,12 +293,4 @@ public class ErrorController implements FxController {
|
|||||||
return isLoadingHttpResponse.get();
|
return isLoadingHttpResponse.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
public BooleanProperty askedForLookupDatabasePermissionProperty() {
|
|
||||||
return askedForLookupDatabasePermission;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean getAskedForLookupDatabasePermission() {
|
|
||||||
return askedForLookupDatabasePermission.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package org.cryptomator.ui.fxapp;
|
package org.cryptomator.ui.fxapp;
|
||||||
|
|
||||||
import dagger.Lazy;
|
import dagger.Lazy;
|
||||||
import org.cryptomator.common.Environment;
|
|
||||||
import org.cryptomator.common.settings.Settings;
|
import org.cryptomator.common.settings.Settings;
|
||||||
import org.cryptomator.ui.traymenu.TrayMenuComponent;
|
import org.cryptomator.ui.traymenu.TrayMenuComponent;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -18,7 +17,6 @@ public class FxApplication {
|
|||||||
private static final Logger LOG = LoggerFactory.getLogger(FxApplication.class);
|
private static final Logger LOG = LoggerFactory.getLogger(FxApplication.class);
|
||||||
|
|
||||||
private final long startupTime;
|
private final long startupTime;
|
||||||
private final Environment environment;
|
|
||||||
private final Settings settings;
|
private final Settings settings;
|
||||||
private final AppLaunchEventHandler launchEventHandler;
|
private final AppLaunchEventHandler launchEventHandler;
|
||||||
private final Lazy<TrayMenuComponent> trayMenu;
|
private final Lazy<TrayMenuComponent> trayMenu;
|
||||||
@@ -28,9 +26,8 @@ public class FxApplication {
|
|||||||
private final AutoUnlocker autoUnlocker;
|
private final AutoUnlocker autoUnlocker;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
FxApplication(@Named("startupTime") long startupTime, Environment environment, Settings settings, AppLaunchEventHandler launchEventHandler, Lazy<TrayMenuComponent> trayMenu, FxApplicationWindows appWindows, FxApplicationStyle applicationStyle, FxApplicationTerminator applicationTerminator, AutoUnlocker autoUnlocker) {
|
FxApplication(@Named("startupTime") long startupTime, Settings settings, AppLaunchEventHandler launchEventHandler, Lazy<TrayMenuComponent> trayMenu, FxApplicationWindows appWindows, FxApplicationStyle applicationStyle, FxApplicationTerminator applicationTerminator, AutoUnlocker autoUnlocker) {
|
||||||
this.startupTime = startupTime;
|
this.startupTime = startupTime;
|
||||||
this.environment = environment;
|
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
this.launchEventHandler = launchEventHandler;
|
this.launchEventHandler = launchEventHandler;
|
||||||
this.trayMenu = trayMenu;
|
this.trayMenu = trayMenu;
|
||||||
@@ -71,9 +68,7 @@ public class FxApplication {
|
|||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!environment.disableUpdateCheck()) {
|
|
||||||
appWindows.checkAndShowUpdateReminderWindow();
|
appWindows.checkAndShowUpdateReminderWindow();
|
||||||
}
|
|
||||||
|
|
||||||
launchEventHandler.startHandlingLaunchEvents();
|
launchEventHandler.startHandlingLaunchEvents();
|
||||||
autoUnlocker.tryUnlockForTimespan(2, TimeUnit.MINUTES);
|
autoUnlocker.tryUnlockForTimespan(2, TimeUnit.MINUTES);
|
||||||
|
|||||||
@@ -22,23 +22,23 @@ public class UpdateChecker {
|
|||||||
private static final Logger LOG = LoggerFactory.getLogger(UpdateChecker.class);
|
private static final Logger LOG = LoggerFactory.getLogger(UpdateChecker.class);
|
||||||
private static final Duration AUTOCHECK_DELAY = Duration.seconds(5);
|
private static final Duration AUTOCHECK_DELAY = Duration.seconds(5);
|
||||||
|
|
||||||
private final Environment env;
|
|
||||||
private final Settings settings;
|
private final Settings settings;
|
||||||
|
private final String currentVersion;
|
||||||
private final StringProperty latestVersionProperty;
|
private final StringProperty latestVersionProperty;
|
||||||
private final Comparator<String> semVerComparator;
|
private final Comparator<String> semVerComparator;
|
||||||
private final ScheduledService<String> updateCheckerService;
|
private final ScheduledService<String> updateCheckerService;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
UpdateChecker(Settings settings, Environment env, @Named("latestVersion") StringProperty latestVersionProperty, @Named("SemVer") Comparator<String> semVerComparator, ScheduledService<String> updateCheckerService) {
|
UpdateChecker(Settings settings, Environment env, @Named("latestVersion") StringProperty latestVersionProperty, @Named("SemVer") Comparator<String> semVerComparator, ScheduledService<String> updateCheckerService) {
|
||||||
this.env = env;
|
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
this.latestVersionProperty = latestVersionProperty;
|
this.latestVersionProperty = latestVersionProperty;
|
||||||
this.semVerComparator = semVerComparator;
|
this.semVerComparator = semVerComparator;
|
||||||
this.updateCheckerService = updateCheckerService;
|
this.updateCheckerService = updateCheckerService;
|
||||||
|
this.currentVersion = env.getAppVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void automaticallyCheckForUpdatesIfEnabled() {
|
public void automaticallyCheckForUpdatesIfEnabled() {
|
||||||
if (!env.disableUpdateCheck() && settings.checkForUpdates.get()) {
|
if (settings.checkForUpdates.get()) {
|
||||||
startCheckingForUpdates(AUTOCHECK_DELAY);
|
startCheckingForUpdates(AUTOCHECK_DELAY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,9 +63,9 @@ public class UpdateChecker {
|
|||||||
|
|
||||||
private void checkSucceeded(WorkerStateEvent event) {
|
private void checkSucceeded(WorkerStateEvent event) {
|
||||||
String latestVersion = updateCheckerService.getValue();
|
String latestVersion = updateCheckerService.getValue();
|
||||||
LOG.info("Current version: {}, lastest version: {}", getCurrentVersion(), latestVersion);
|
LOG.info("Current version: {}, lastest version: {}", currentVersion, latestVersion);
|
||||||
|
|
||||||
if (semVerComparator.compare(getCurrentVersion(), latestVersion) < 0) {
|
if (semVerComparator.compare(currentVersion, latestVersion) < 0) {
|
||||||
// update is available
|
// update is available
|
||||||
latestVersionProperty.set(latestVersion);
|
latestVersionProperty.set(latestVersion);
|
||||||
} else {
|
} else {
|
||||||
@@ -88,7 +88,7 @@ public class UpdateChecker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getCurrentVersion() {
|
public String getCurrentVersion() {
|
||||||
return env.getAppVersion();
|
return currentVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public abstract class UpdateCheckerModule {
|
|||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(UpdateCheckerModule.class);
|
private static final Logger LOG = LoggerFactory.getLogger(UpdateCheckerModule.class);
|
||||||
|
|
||||||
private static final URI LATEST_VERSION_URI = URI.create("https://api.cryptomator.org/desktop/latest-version.json");
|
private static final URI LATEST_VERSION_URI = URI.create("https://api.cryptomator.org/updates/latestVersion.json");
|
||||||
private static final Duration UPDATE_CHECK_INTERVAL = Duration.hours(3);
|
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...
|
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()) {
|
switch (response.statusCode()) {
|
||||||
case 200 -> retrievalSucceeded(response);
|
case 200 -> retrievalSucceeded(response);
|
||||||
case 402 -> licenseExceeded();
|
case 402 -> licenseExceeded();
|
||||||
case 403, 410 -> accessNotGranted(); // or vault has been archived, effectively disallowing access
|
case 403 -> accessNotGranted();
|
||||||
case 404 -> needsDeviceRegistration();
|
case 404 -> needsDeviceRegistration();
|
||||||
default -> throw new IOException("Unexpected response " + response.statusCode());
|
default -> throw new IOException("Unexpected response " + response.statusCode());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ public interface MainWindowComponent {
|
|||||||
default Stage showMainWindow() {
|
default Stage showMainWindow() {
|
||||||
Stage stage = window();
|
Stage stage = window();
|
||||||
stage.setScene(scene().get());
|
stage.setScene(scene().get());
|
||||||
stage.setIconified(false);
|
|
||||||
stage.show();
|
stage.show();
|
||||||
stage.toFront();
|
stage.toFront();
|
||||||
stage.requestFocus();
|
stage.requestFocus();
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import javafx.stage.Stage;
|
|||||||
public class MainWindowSceneFactory extends DefaultSceneFactory {
|
public class MainWindowSceneFactory extends DefaultSceneFactory {
|
||||||
|
|
||||||
protected static final KeyCodeCombination SHORTCUT_N = new KeyCodeCombination(KeyCode.N, KeyCombination.SHORTCUT_DOWN);
|
protected static final KeyCodeCombination SHORTCUT_N = new KeyCodeCombination(KeyCode.N, KeyCombination.SHORTCUT_DOWN);
|
||||||
protected static final KeyCodeCombination SHORTCUT_O = new KeyCodeCombination(KeyCode.O, KeyCombination.SHORTCUT_DOWN);
|
|
||||||
|
|
||||||
private final Lazy<MainWindowTitleController> mainWindowTitleController;
|
private final Lazy<MainWindowTitleController> mainWindowTitleController;
|
||||||
private final Lazy<VaultListController> vaultListController;
|
private final Lazy<VaultListController> vaultListController;
|
||||||
@@ -35,7 +34,6 @@ public class MainWindowSceneFactory extends DefaultSceneFactory {
|
|||||||
} else {
|
} else {
|
||||||
scene.getAccelerators().put(SHORTCUT_W, mainWindowTitleController.get()::close);
|
scene.getAccelerators().put(SHORTCUT_W, mainWindowTitleController.get()::close);
|
||||||
}
|
}
|
||||||
scene.getAccelerators().put(SHORTCUT_N, vaultListController.get()::didClickAddNewVault);
|
scene.getAccelerators().put(SHORTCUT_N, vaultListController.get()::didClickAddVault);
|
||||||
scene.getAccelerators().put(SHORTCUT_O, vaultListController.get()::didClickAddExistingVault);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import javafx.beans.binding.Bindings;
|
||||||
import javafx.beans.binding.BooleanBinding;
|
import javafx.beans.binding.BooleanBinding;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
@@ -14,7 +15,6 @@ import javafx.scene.input.MouseEvent;
|
|||||||
import javafx.scene.layout.Region;
|
import javafx.scene.layout.Region;
|
||||||
import javafx.stage.Screen;
|
import javafx.stage.Screen;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import javafx.stage.WindowEvent;
|
|
||||||
|
|
||||||
@MainWindow
|
@MainWindow
|
||||||
public class ResizeController implements FxController {
|
public class ResizeController implements FxController {
|
||||||
@@ -53,70 +53,48 @@ public class ResizeController implements FxController {
|
|||||||
public void initialize() {
|
public void initialize() {
|
||||||
LOG.trace("init ResizeController");
|
LOG.trace("init ResizeController");
|
||||||
|
|
||||||
if (!neverTouched()) {
|
if (neverTouched()) {
|
||||||
|
settings.displayConfiguration.set(getMonitorSizes());
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if (didDisplayConfigurationChange()) {
|
||||||
|
//If the position is illegal, then the window appears on the main screen in the middle of the window.
|
||||||
|
Rectangle2D primaryScreenBounds = Screen.getPrimary().getBounds();
|
||||||
|
window.setX((primaryScreenBounds.getWidth() - window.getMinWidth()) / 2);
|
||||||
|
window.setY((primaryScreenBounds.getHeight() - window.getMinHeight()) / 2);
|
||||||
|
window.setWidth(window.getMinWidth());
|
||||||
|
window.setHeight(window.getMinHeight());
|
||||||
|
} else {
|
||||||
window.setHeight(settings.windowHeight.get() > window.getMinHeight() ? settings.windowHeight.get() : window.getMinHeight());
|
window.setHeight(settings.windowHeight.get() > window.getMinHeight() ? settings.windowHeight.get() : window.getMinHeight());
|
||||||
window.setWidth(settings.windowWidth.get() > window.getMinWidth() ? settings.windowWidth.get() : window.getMinWidth());
|
window.setWidth(settings.windowWidth.get() > window.getMinWidth() ? settings.windowWidth.get() : window.getMinWidth());
|
||||||
window.setX(settings.windowXPosition.get());
|
window.setX(settings.windowXPosition.get());
|
||||||
window.setY(settings.windowYPosition.get());
|
window.setY(settings.windowYPosition.get());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
window.setOnShowing(this::checkDisplayBounds);
|
savePositionalSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean neverTouched() {
|
private boolean neverTouched() {
|
||||||
return (settings.windowHeight.get() == 0) && (settings.windowWidth.get() == 0) && (settings.windowXPosition.get() == 0) && (settings.windowYPosition.get() == 0);
|
return (settings.windowHeight.get() == 0) && (settings.windowWidth.get() == 0) && (settings.windowXPosition.get() == 0) && (settings.windowYPosition.get() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isWithinDisplayBounds() {
|
private boolean didDisplayConfigurationChange() {
|
||||||
// (x1, y1) is the top left corner of the window, (x2, y2) is the bottom right corner
|
String currentDisplayConfiguration = getMonitorSizes();
|
||||||
final double slack = 10;
|
String settingsDisplayConfiguration = settings.displayConfiguration.get();
|
||||||
final double width = window.getWidth() - 2 * slack;
|
boolean configurationHasChanged = !settingsDisplayConfiguration.equals(currentDisplayConfiguration);
|
||||||
final double height = window.getHeight() - 2 * slack;
|
if (configurationHasChanged) settings.displayConfiguration.set(currentDisplayConfiguration);
|
||||||
final double x1 = window.getX() + slack;
|
return configurationHasChanged;
|
||||||
final double y1 = window.getY() + slack;
|
|
||||||
final double x2 = x1 + width;
|
|
||||||
final double y2 = y1 + height;
|
|
||||||
|
|
||||||
final ObservableList<Screen> screens = Screen.getScreensForRectangle(x1, y1, width, height);
|
|
||||||
|
|
||||||
// Find the total visible area of the window
|
|
||||||
double visibleArea = 0;
|
|
||||||
for (Screen screen : screens) {
|
|
||||||
Rectangle2D bounds = screen.getVisualBounds();
|
|
||||||
|
|
||||||
double xOverlap = Math.min(x2, bounds.getMaxX()) - Math.max(x1, bounds.getMinX());
|
|
||||||
double yOverlap = Math.min(y2, bounds.getMaxY()) - Math.max(y1, bounds.getMinY());
|
|
||||||
|
|
||||||
visibleArea += xOverlap * yOverlap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final double windowArea = width * height;
|
private String getMonitorSizes() {
|
||||||
|
ObservableList<Screen> screens = Screen.getScreens();
|
||||||
// Within bounds if the visible area matches the window area
|
StringBuilder sb = new StringBuilder();
|
||||||
return visibleArea == windowArea;
|
for (int i = 0; i < screens.size(); i++) {
|
||||||
}
|
Rectangle2D screenBounds = screens.get(i).getBounds();
|
||||||
|
if (!sb.isEmpty()) sb.append(" ");
|
||||||
private void checkDisplayBounds(WindowEvent evt) {
|
sb.append("displayId: " + i + ", " + screenBounds.getWidth() + "x" + screenBounds.getHeight() + ";");
|
||||||
|
|
||||||
// Minimizing a window in Windows and closing it could result in an out of bounds position at (x, y) = (-32000, -32000)
|
|
||||||
// See https://devblogs.microsoft.com/oldnewthing/20041028-00/?p=37453
|
|
||||||
// If the position is (-32000, -32000), restore to the last saved position
|
|
||||||
if (window.getX() == -32000 && window.getY() == -32000) {
|
|
||||||
window.setX(settings.windowXPosition.get());
|
|
||||||
window.setY(settings.windowYPosition.get());
|
|
||||||
window.setWidth(settings.windowWidth.get());
|
|
||||||
window.setHeight(settings.windowHeight.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isWithinDisplayBounds()) {
|
|
||||||
// If the position is illegal, then the window appears on the main screen in the middle of the window.
|
|
||||||
Rectangle2D primaryScreenBounds = Screen.getPrimary().getBounds();
|
|
||||||
window.setX((primaryScreenBounds.getWidth() - window.getMinWidth()) / 2);
|
|
||||||
window.setY((primaryScreenBounds.getHeight() - window.getMinHeight()) / 2);
|
|
||||||
window.setWidth(window.getMinWidth());
|
|
||||||
window.setHeight(window.getMinHeight());
|
|
||||||
savePositionalSettings();
|
|
||||||
}
|
}
|
||||||
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startResize(MouseEvent evt) {
|
private void startResize(MouseEvent evt) {
|
||||||
@@ -205,4 +183,5 @@ public class ResizeController implements FxController {
|
|||||||
public boolean isShowResizingArrows() {
|
public boolean isShowResizingArrows() {
|
||||||
return showResizingArrows.get();
|
return showResizingArrows.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -21,9 +21,6 @@ import javafx.beans.value.ObservableValue;
|
|||||||
import javafx.collections.ListChangeListener;
|
import javafx.collections.ListChangeListener;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.geometry.Side;
|
|
||||||
import javafx.scene.control.Button;
|
|
||||||
import javafx.scene.control.ContextMenu;
|
|
||||||
import javafx.scene.control.ListView;
|
import javafx.scene.control.ListView;
|
||||||
import javafx.scene.input.ContextMenuEvent;
|
import javafx.scene.input.ContextMenuEvent;
|
||||||
import javafx.scene.input.DragEvent;
|
import javafx.scene.input.DragEvent;
|
||||||
@@ -37,7 +34,6 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.ResourceBundle;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@@ -63,23 +59,12 @@ public class VaultListController implements FxController {
|
|||||||
private final RemoveVaultComponent.Builder removeVaultDialogue;
|
private final RemoveVaultComponent.Builder removeVaultDialogue;
|
||||||
private final VaultListManager vaultListManager;
|
private final VaultListManager vaultListManager;
|
||||||
private final BooleanProperty draggingVaultOver = new SimpleBooleanProperty();
|
private final BooleanProperty draggingVaultOver = new SimpleBooleanProperty();
|
||||||
private final ResourceBundle resourceBundle;
|
|
||||||
|
|
||||||
public ListView<Vault> vaultList;
|
public ListView<Vault> vaultList;
|
||||||
public StackPane root;
|
public StackPane root;
|
||||||
public Button addVaultBtn;
|
|
||||||
@FXML
|
|
||||||
private ContextMenu addVaultContextMenu;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
VaultListController(@MainWindow Stage mainWindow, //
|
VaultListController(@MainWindow Stage mainWindow, ObservableList<Vault> vaults, ObjectProperty<Vault> selectedVault, VaultListCellFactory cellFactory, AddVaultWizardComponent.Builder addVaultWizard, RemoveVaultComponent.Builder removeVaultDialogue, VaultListManager vaultListManager) {
|
||||||
ObservableList<Vault> vaults, //
|
|
||||||
ObjectProperty<Vault> selectedVault, //
|
|
||||||
VaultListCellFactory cellFactory, //
|
|
||||||
AddVaultWizardComponent.Builder addVaultWizard, //
|
|
||||||
RemoveVaultComponent.Builder removeVaultDialogue, //
|
|
||||||
VaultListManager vaultListManager, //
|
|
||||||
ResourceBundle resourceBundle) {
|
|
||||||
this.mainWindow = mainWindow;
|
this.mainWindow = mainWindow;
|
||||||
this.vaults = vaults;
|
this.vaults = vaults;
|
||||||
this.selectedVault = selectedVault;
|
this.selectedVault = selectedVault;
|
||||||
@@ -87,7 +72,6 @@ public class VaultListController implements FxController {
|
|||||||
this.addVaultWizard = addVaultWizard;
|
this.addVaultWizard = addVaultWizard;
|
||||||
this.removeVaultDialogue = removeVaultDialogue;
|
this.removeVaultDialogue = removeVaultDialogue;
|
||||||
this.vaultListManager = vaultListManager;
|
this.vaultListManager = vaultListManager;
|
||||||
this.resourceBundle = resourceBundle;
|
|
||||||
|
|
||||||
this.emptyVaultList = Bindings.isEmpty(vaults);
|
this.emptyVaultList = Bindings.isEmpty(vaults);
|
||||||
|
|
||||||
@@ -145,15 +129,6 @@ public class VaultListController implements FxController {
|
|||||||
root.setOnDragExited(this::handleDragEvent);
|
root.setOnDragExited(this::handleDragEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@FXML
|
|
||||||
private void toggleMenu() {
|
|
||||||
if (addVaultContextMenu.isShowing()) {
|
|
||||||
addVaultContextMenu.hide();
|
|
||||||
} else {
|
|
||||||
addVaultContextMenu.show(addVaultBtn, Side.BOTTOM, 0.0, 0.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void deselect(MouseEvent released) {
|
private void deselect(MouseEvent released) {
|
||||||
if (released.getY() > (vaultList.getItems().size() * vaultList.fixedCellSizeProperty().get())) {
|
if (released.getY() > (vaultList.getItems().size() * vaultList.fixedCellSizeProperty().get())) {
|
||||||
vaultList.getSelectionModel().clearSelection();
|
vaultList.getSelectionModel().clearSelection();
|
||||||
@@ -169,13 +144,8 @@ public class VaultListController implements FxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
public void didClickAddNewVault() {
|
public void didClickAddVault() {
|
||||||
addVaultWizard.build().showAddNewVaultWizard(resourceBundle);
|
addVaultWizard.build().showAddVaultWizard();
|
||||||
}
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
public void didClickAddExistingVault() {
|
|
||||||
addVaultWizard.build().showAddExistingVaultWizard(resourceBundle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pressedShortcutToRemoveVault() {
|
private void pressedShortcutToRemoveVault() {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package org.cryptomator.ui.preferences;
|
package org.cryptomator.ui.preferences;
|
||||||
|
|
||||||
import org.cryptomator.common.Environment;
|
|
||||||
import org.cryptomator.ui.common.FxController;
|
import org.cryptomator.ui.common.FxController;
|
||||||
import org.cryptomator.ui.fxapp.UpdateChecker;
|
import org.cryptomator.ui.fxapp.UpdateChecker;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -20,7 +19,6 @@ public class PreferencesController implements FxController {
|
|||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(PreferencesController.class);
|
private static final Logger LOG = LoggerFactory.getLogger(PreferencesController.class);
|
||||||
|
|
||||||
private final Environment env;
|
|
||||||
private final Stage window;
|
private final Stage window;
|
||||||
private final ObjectProperty<SelectedPreferencesTab> selectedTabProperty;
|
private final ObjectProperty<SelectedPreferencesTab> selectedTabProperty;
|
||||||
private final BooleanBinding updateAvailable;
|
private final BooleanBinding updateAvailable;
|
||||||
@@ -33,8 +31,7 @@ public class PreferencesController implements FxController {
|
|||||||
public Tab aboutTab;
|
public Tab aboutTab;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public PreferencesController(Environment env, @PreferencesWindow Stage window, ObjectProperty<SelectedPreferencesTab> selectedTabProperty, UpdateChecker updateChecker) {
|
public PreferencesController(@PreferencesWindow Stage window, ObjectProperty<SelectedPreferencesTab> selectedTabProperty, UpdateChecker updateChecker) {
|
||||||
this.env = env;
|
|
||||||
this.window = window;
|
this.window = window;
|
||||||
this.selectedTabProperty = selectedTabProperty;
|
this.selectedTabProperty = selectedTabProperty;
|
||||||
this.updateAvailable = updateChecker.latestVersionProperty().isNotNull();
|
this.updateAvailable = updateChecker.latestVersionProperty().isNotNull();
|
||||||
@@ -45,9 +42,6 @@ public class PreferencesController implements FxController {
|
|||||||
window.setOnShowing(this::windowWillAppear);
|
window.setOnShowing(this::windowWillAppear);
|
||||||
selectedTabProperty.addListener(observable -> this.selectChosenTab());
|
selectedTabProperty.addListener(observable -> this.selectChosenTab());
|
||||||
tabPane.getSelectionModel().selectedItemProperty().addListener(observable -> this.selectedTabChanged());
|
tabPane.getSelectionModel().selectedItemProperty().addListener(observable -> this.selectedTabChanged());
|
||||||
if (env.disableUpdateCheck()) {
|
|
||||||
tabPane.getTabs().remove(updatesTab);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void selectChosenTab() {
|
private void selectChosenTab() {
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import org.cryptomator.cryptolib.api.InvalidPassphraseException;
|
|||||||
import org.cryptomator.cryptolib.api.Masterkey;
|
import org.cryptomator.cryptolib.api.Masterkey;
|
||||||
import org.cryptomator.cryptolib.common.MasterkeyFileAccess;
|
import org.cryptomator.cryptolib.common.MasterkeyFileAccess;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.annotations.VisibleForTesting;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
@@ -59,7 +58,7 @@ public class RecoveryKeyFactory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
// visible for testing
|
||||||
String createRecoveryKey(byte[] rawKey) {
|
String createRecoveryKey(byte[] rawKey) {
|
||||||
Preconditions.checkArgument(rawKey.length == 64, "key should be 64 bytes");
|
Preconditions.checkArgument(rawKey.length == 64, "key should be 64 bytes");
|
||||||
byte[] paddedKey = Arrays.copyOf(rawKey, 66);
|
byte[] paddedKey = Arrays.copyOf(rawKey, 66);
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import org.cryptomator.integrations.common.Priority;
|
|||||||
import org.cryptomator.integrations.tray.ActionItem;
|
import org.cryptomator.integrations.tray.ActionItem;
|
||||||
import org.cryptomator.integrations.tray.SeparatorItem;
|
import org.cryptomator.integrations.tray.SeparatorItem;
|
||||||
import org.cryptomator.integrations.tray.SubMenuItem;
|
import org.cryptomator.integrations.tray.SubMenuItem;
|
||||||
import org.cryptomator.integrations.tray.TrayIconLoader;
|
|
||||||
import org.cryptomator.integrations.tray.TrayMenuController;
|
import org.cryptomator.integrations.tray.TrayMenuController;
|
||||||
import org.cryptomator.integrations.tray.TrayMenuException;
|
import org.cryptomator.integrations.tray.TrayMenuException;
|
||||||
import org.cryptomator.integrations.tray.TrayMenuItem;
|
import org.cryptomator.integrations.tray.TrayMenuItem;
|
||||||
@@ -15,7 +14,6 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.awt.AWTException;
|
import java.awt.AWTException;
|
||||||
import java.awt.Image;
|
|
||||||
import java.awt.Menu;
|
import java.awt.Menu;
|
||||||
import java.awt.MenuItem;
|
import java.awt.MenuItem;
|
||||||
import java.awt.PopupMenu;
|
import java.awt.PopupMenu;
|
||||||
@@ -25,12 +23,7 @@ import java.awt.TrayIcon;
|
|||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.util.List;
|
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
|
@CheckAvailability
|
||||||
@Priority(Priority.FALLBACK)
|
@Priority(Priority.FALLBACK)
|
||||||
public class AwtTrayMenuController implements TrayMenuController {
|
public class AwtTrayMenuController implements TrayMenuController {
|
||||||
@@ -39,7 +32,6 @@ public class AwtTrayMenuController implements TrayMenuController {
|
|||||||
|
|
||||||
private final PopupMenu menu = new PopupMenu();
|
private final PopupMenu menu = new PopupMenu();
|
||||||
private TrayIcon trayIcon;
|
private TrayIcon trayIcon;
|
||||||
private Image image;
|
|
||||||
|
|
||||||
@CheckAvailability
|
@CheckAvailability
|
||||||
public static boolean isAvailable() {
|
public static boolean isAvailable() {
|
||||||
@@ -47,9 +39,8 @@ public class AwtTrayMenuController implements TrayMenuController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void showTrayIcon(Consumer<TrayIconLoader> iconLoader, Runnable defaultAction, String tooltip) throws TrayMenuException {
|
public void showTrayIcon(byte[] imageData, Runnable defaultAction, String tooltip) throws TrayMenuException {
|
||||||
TrayIconLoader.PngData callback = this::showTrayIconWithPngData;
|
var image = Toolkit.getDefaultToolkit().createImage(imageData);
|
||||||
iconLoader.accept(callback);
|
|
||||||
trayIcon = new TrayIcon(image, tooltip, menu);
|
trayIcon = new TrayIcon(image, tooltip, menu);
|
||||||
|
|
||||||
trayIcon.setImageAutoSize(true);
|
trayIcon.setImageAutoSize(true);
|
||||||
@@ -65,17 +56,8 @@ public class AwtTrayMenuController implements TrayMenuController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showTrayIconWithPngData(byte[] imageData) {
|
|
||||||
image = Toolkit.getDefaultToolkit().createImage(imageData);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTrayIcon(Consumer<TrayIconLoader> iconLoader) {
|
public void updateTrayIcon(byte[] imageData) {
|
||||||
TrayIconLoader.PngData callback = this::updateTrayIconWithPngData;
|
|
||||||
iconLoader.accept(callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateTrayIconWithPngData(byte[] imageData) {
|
|
||||||
if (trayIcon == null) {
|
if (trayIcon == null) {
|
||||||
throw new IllegalStateException("Failed to update the icon as it has not yet been added");
|
throw new IllegalStateException("Failed to update the icon as it has not yet been added");
|
||||||
}
|
}
|
||||||
@@ -118,4 +100,5 @@ public class AwtTrayMenuController implements TrayMenuController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import org.cryptomator.common.vaults.VaultListManager;
|
|||||||
import org.cryptomator.integrations.tray.ActionItem;
|
import org.cryptomator.integrations.tray.ActionItem;
|
||||||
import org.cryptomator.integrations.tray.SeparatorItem;
|
import org.cryptomator.integrations.tray.SeparatorItem;
|
||||||
import org.cryptomator.integrations.tray.SubMenuItem;
|
import org.cryptomator.integrations.tray.SubMenuItem;
|
||||||
import org.cryptomator.integrations.tray.TrayIconLoader;
|
|
||||||
import org.cryptomator.integrations.tray.TrayMenuController;
|
import org.cryptomator.integrations.tray.TrayMenuController;
|
||||||
import org.cryptomator.integrations.tray.TrayMenuException;
|
import org.cryptomator.integrations.tray.TrayMenuException;
|
||||||
import org.cryptomator.integrations.tray.TrayMenuItem;
|
import org.cryptomator.integrations.tray.TrayMenuItem;
|
||||||
@@ -66,12 +65,7 @@ public class TrayMenuBuilder {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
trayMenu.showTrayIcon(loader -> {
|
trayMenu.showTrayIcon(getAppropriateTrayIconImage(), this::showMainWindow, "Cryptomator");
|
||||||
switch (loader) {
|
|
||||||
case TrayIconLoader.PngData l -> l.loadPng(getAppropriateTrayIconImage());
|
|
||||||
case TrayIconLoader.FreedesktopIconName l -> l.lookupByName(getAppropriateFreedesktopIconName());
|
|
||||||
}
|
|
||||||
}, this::showMainWindow, "Cryptomator");
|
|
||||||
trayMenu.onBeforeOpenMenu(() -> {
|
trayMenu.onBeforeOpenMenu(() -> {
|
||||||
for (Vault vault : vaults) {
|
for (Vault vault : vaults) {
|
||||||
VaultListManager.redetermineVaultState(vault);
|
VaultListManager.redetermineVaultState(vault);
|
||||||
@@ -90,12 +84,7 @@ public class TrayMenuBuilder {
|
|||||||
|
|
||||||
private void vaultListChanged(@SuppressWarnings("unused") Observable observable) {
|
private void vaultListChanged(@SuppressWarnings("unused") Observable observable) {
|
||||||
assert Platform.isFxApplicationThread();
|
assert Platform.isFxApplicationThread();
|
||||||
trayMenu.updateTrayIcon(loader -> {
|
trayMenu.updateTrayIcon(getAppropriateTrayIconImage());
|
||||||
switch (loader) {
|
|
||||||
case TrayIconLoader.PngData l -> l.loadPng(getAppropriateTrayIconImage());
|
|
||||||
case TrayIconLoader.FreedesktopIconName l -> l.lookupByName(getAppropriateFreedesktopIconName());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
rebuildMenu();
|
rebuildMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,8 +173,4 @@ 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,12 +1,7 @@
|
|||||||
package org.cryptomator.ui.unlock;
|
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.MountPointInUseException;
|
||||||
import org.cryptomator.common.mount.MountPointNotEmptyDirectoryException;
|
import org.cryptomator.common.mount.MountPointNotExistsException;
|
||||||
import org.cryptomator.common.mount.MountPointNotExistingException;
|
|
||||||
import org.cryptomator.common.mount.MountPointNotSupportedException;
|
import org.cryptomator.common.mount.MountPointNotSupportedException;
|
||||||
import org.cryptomator.common.vaults.Vault;
|
import org.cryptomator.common.vaults.Vault;
|
||||||
import org.cryptomator.ui.common.FxController;
|
import org.cryptomator.ui.common.FxController;
|
||||||
@@ -14,15 +9,12 @@ import org.cryptomator.ui.controls.FormattedLabel;
|
|||||||
import org.cryptomator.ui.fxapp.FxApplicationWindows;
|
import org.cryptomator.ui.fxapp.FxApplicationWindows;
|
||||||
import org.cryptomator.ui.preferences.SelectedPreferencesTab;
|
import org.cryptomator.ui.preferences.SelectedPreferencesTab;
|
||||||
import org.cryptomator.ui.vaultoptions.SelectedVaultOptionsTab;
|
import org.cryptomator.ui.vaultoptions.SelectedVaultOptionsTab;
|
||||||
import org.jetbrains.annotations.PropertyKey;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javafx.beans.property.ObjectProperty;
|
|
||||||
import javafx.beans.value.ObservableValue;
|
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.util.ResourceBundle;
|
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.
|
//At the current point in time only the CustomMountPointChooser may cause this window to be shown.
|
||||||
@UnlockScoped
|
@UnlockScoped
|
||||||
@@ -31,31 +23,28 @@ public class UnlockInvalidMountPointController implements FxController {
|
|||||||
private final Stage window;
|
private final Stage window;
|
||||||
private final Vault vault;
|
private final Vault vault;
|
||||||
private final FxApplicationWindows appWindows;
|
private final FxApplicationWindows appWindows;
|
||||||
|
private final ResourceBundle resourceBundle;
|
||||||
private final ObservableValue<ExceptionType> exceptionType;
|
private final ExceptionType exceptionType;
|
||||||
private final ObservableValue<Path> exceptionPath;
|
private final String exceptionMessage;
|
||||||
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;
|
public FormattedLabel dialogDescription;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
UnlockInvalidMountPointController(@UnlockWindow Stage window, @UnlockWindow Vault vault, @UnlockWindow ObjectProperty<IllegalMountPointException> illegalMountPointException, FxApplicationWindows appWindows, ResourceBundle resourceBundle) {
|
UnlockInvalidMountPointController(@UnlockWindow Stage window, @UnlockWindow Vault vault, @UnlockWindow AtomicReference<Throwable> unlockException, FxApplicationWindows appWindows, ResourceBundle resourceBundle) {
|
||||||
this.window = window;
|
this.window = window;
|
||||||
this.vault = vault;
|
this.vault = vault;
|
||||||
this.appWindows = appWindows;
|
this.appWindows = appWindows;
|
||||||
|
this.resourceBundle = resourceBundle;
|
||||||
|
|
||||||
this.exceptionType = illegalMountPointException.map(this::getExceptionType);
|
var exc = unlockException.get();
|
||||||
this.exceptionPath = illegalMountPointException.map(IllegalMountPointException::getMountpoint);
|
this.exceptionType = getExceptionType(exc);
|
||||||
this.exceptionMessage = illegalMountPointException.map(IllegalMountPointException::getMessage);
|
this.exceptionMessage = exc.getMessage();
|
||||||
this.hideawayPath = illegalMountPointException.map(e -> e instanceof HideawayNotDirectoryException haeExc ? haeExc.getHideaway() : null);
|
}
|
||||||
|
|
||||||
this.format = ObservableUtil.mapWithDefault(exceptionType, type -> resourceBundle.getString(type.translationKey), "");
|
@FXML
|
||||||
this.showPreferences = ObservableUtil.mapWithDefault(exceptionType, type -> type.action == ButtonAction.SHOW_PREFERENCES, false);
|
public void initialize() {
|
||||||
this.showVaultOptions = ObservableUtil.mapWithDefault(exceptionType, type -> type.action == ButtonAction.SHOW_VAULT_OPTIONS, false);
|
dialogDescription.setFormat(resourceBundle.getString(exceptionType.translationKey));
|
||||||
|
dialogDescription.setArg1(exceptionMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
@@ -78,11 +67,8 @@ public class UnlockInvalidMountPointController implements FxController {
|
|||||||
private ExceptionType getExceptionType(Throwable unlockException) {
|
private ExceptionType getExceptionType(Throwable unlockException) {
|
||||||
return switch (unlockException) {
|
return switch (unlockException) {
|
||||||
case MountPointNotSupportedException x -> ExceptionType.NOT_SUPPORTED;
|
case MountPointNotSupportedException x -> ExceptionType.NOT_SUPPORTED;
|
||||||
case MountPointNotExistingException x -> ExceptionType.NOT_EXISTING;
|
case MountPointNotExistsException x -> ExceptionType.NOT_EXISTING;
|
||||||
case MountPointInUseException x -> ExceptionType.IN_USE;
|
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;
|
default -> ExceptionType.GENERIC;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -92,15 +78,12 @@ public class UnlockInvalidMountPointController implements FxController {
|
|||||||
NOT_SUPPORTED("unlock.error.customPath.description.notSupported", ButtonAction.SHOW_PREFERENCES),
|
NOT_SUPPORTED("unlock.error.customPath.description.notSupported", ButtonAction.SHOW_PREFERENCES),
|
||||||
NOT_EXISTING("unlock.error.customPath.description.notExists", ButtonAction.SHOW_VAULT_OPTIONS),
|
NOT_EXISTING("unlock.error.customPath.description.notExists", ButtonAction.SHOW_VAULT_OPTIONS),
|
||||||
IN_USE("unlock.error.customPath.description.inUse", 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);
|
GENERIC("unlock.error.customPath.description.generic", ButtonAction.SHOW_PREFERENCES);
|
||||||
|
|
||||||
private final String translationKey;
|
private final String translationKey;
|
||||||
private final ButtonAction action;
|
private final ButtonAction action;
|
||||||
|
|
||||||
ExceptionType(@PropertyKey(resourceBundle = "i18n.strings") String translationKey, ButtonAction action) {
|
ExceptionType(String translationKey, ButtonAction action) {
|
||||||
this.translationKey = translationKey;
|
this.translationKey = translationKey;
|
||||||
this.action = action;
|
this.action = action;
|
||||||
}
|
}
|
||||||
@@ -108,7 +91,6 @@ public class UnlockInvalidMountPointController implements FxController {
|
|||||||
|
|
||||||
private enum ButtonAction {
|
private enum ButtonAction {
|
||||||
|
|
||||||
//TODO Add option to show filesystem, e.g. for ExceptionType.HIDEAWAY_EXISTS
|
|
||||||
SHOW_PREFERENCES,
|
SHOW_PREFERENCES,
|
||||||
SHOW_VAULT_OPTIONS;
|
SHOW_VAULT_OPTIONS;
|
||||||
|
|
||||||
@@ -116,51 +98,11 @@ public class UnlockInvalidMountPointController implements FxController {
|
|||||||
|
|
||||||
/* Getter */
|
/* Getter */
|
||||||
|
|
||||||
public Path getExceptionPath() {
|
public boolean isShowPreferences() {
|
||||||
return exceptionPath.getValue();
|
return exceptionType.action == ButtonAction.SHOW_PREFERENCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ObservableValue<Path> exceptionPathProperty() {
|
public boolean isShowVaultOptions() {
|
||||||
return exceptionPath;
|
return exceptionType.action == ButtonAction.SHOW_VAULT_OPTIONS;
|
||||||
}
|
|
||||||
|
|
||||||
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,7 +4,6 @@ import dagger.Binds;
|
|||||||
import dagger.Module;
|
import dagger.Module;
|
||||||
import dagger.Provides;
|
import dagger.Provides;
|
||||||
import dagger.multibindings.IntoMap;
|
import dagger.multibindings.IntoMap;
|
||||||
import org.cryptomator.common.mount.IllegalMountPointException;
|
|
||||||
import org.cryptomator.common.vaults.Vault;
|
import org.cryptomator.common.vaults.Vault;
|
||||||
import org.cryptomator.ui.common.DefaultSceneFactory;
|
import org.cryptomator.ui.common.DefaultSceneFactory;
|
||||||
import org.cryptomator.ui.common.FxController;
|
import org.cryptomator.ui.common.FxController;
|
||||||
@@ -19,13 +18,12 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
|
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
import javax.inject.Provider;
|
import javax.inject.Provider;
|
||||||
import javafx.beans.property.ObjectProperty;
|
|
||||||
import javafx.beans.property.SimpleObjectProperty;
|
|
||||||
import javafx.scene.Scene;
|
import javafx.scene.Scene;
|
||||||
import javafx.stage.Modality;
|
import javafx.stage.Modality;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
@Module(subcomponents = {KeyLoadingComponent.class})
|
@Module(subcomponents = {KeyLoadingComponent.class})
|
||||||
abstract class UnlockModule {
|
abstract class UnlockModule {
|
||||||
@@ -63,8 +61,8 @@ abstract class UnlockModule {
|
|||||||
@Provides
|
@Provides
|
||||||
@UnlockWindow
|
@UnlockWindow
|
||||||
@UnlockScoped
|
@UnlockScoped
|
||||||
static ObjectProperty<IllegalMountPointException> illegalMountPointException() {
|
static AtomicReference<Throwable> unlockException() {
|
||||||
return new SimpleObjectProperty<>();
|
return new AtomicReference<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
|
|||||||
@@ -17,11 +17,11 @@ import org.slf4j.LoggerFactory;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import javafx.beans.property.ObjectProperty;
|
|
||||||
import javafx.concurrent.Task;
|
import javafx.concurrent.Task;
|
||||||
import javafx.scene.Scene;
|
import javafx.scene.Scene;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A multi-step task that consists of background activities as well as user interaction.
|
* 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 Lazy<Scene> invalidMountPointScene;
|
||||||
private final FxApplicationWindows appWindows;
|
private final FxApplicationWindows appWindows;
|
||||||
private final KeyLoadingStrategy keyLoadingStrategy;
|
private final KeyLoadingStrategy keyLoadingStrategy;
|
||||||
private final ObjectProperty<IllegalMountPointException> illegalMountPointException;
|
private final AtomicReference<Throwable> unlockFailedException;
|
||||||
|
|
||||||
@Inject
|
@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 ObjectProperty<IllegalMountPointException> illegalMountPointException) {
|
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) {
|
||||||
this.window = window;
|
this.window = window;
|
||||||
this.vault = vault;
|
this.vault = vault;
|
||||||
this.vaultService = vaultService;
|
this.vaultService = vaultService;
|
||||||
@@ -51,7 +51,7 @@ public class UnlockWorkflow extends Task<Boolean> {
|
|||||||
this.invalidMountPointScene = invalidMountPointScene;
|
this.invalidMountPointScene = invalidMountPointScene;
|
||||||
this.appWindows = appWindows;
|
this.appWindows = appWindows;
|
||||||
this.keyLoadingStrategy = keyLoadingStrategy;
|
this.keyLoadingStrategy = keyLoadingStrategy;
|
||||||
this.illegalMountPointException = illegalMountPointException;
|
this.unlockFailedException = unlockFailedException;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -79,7 +79,7 @@ public class UnlockWorkflow extends Task<Boolean> {
|
|||||||
|
|
||||||
private void handleIllegalMountPointError(IllegalMountPointException impe) {
|
private void handleIllegalMountPointError(IllegalMountPointException impe) {
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
illegalMountPointException.set(impe);
|
unlockFailedException.set(impe);
|
||||||
window.setScene(invalidMountPointScene.get());
|
window.setScene(invalidMountPointScene.get());
|
||||||
window.show();
|
window.show();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -795,16 +795,6 @@
|
|||||||
-fx-scale-shape: false;
|
-fx-scale-shape: false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* *
|
|
||||||
* Add Vault - MenuItem *
|
|
||||||
* *
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
.add-vault-menu-item {
|
|
||||||
-fx-padding: 4px 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* *
|
* *
|
||||||
* ProgressBar *
|
* ProgressBar *
|
||||||
|
|||||||
@@ -794,16 +794,6 @@
|
|||||||
-fx-scale-shape: false;
|
-fx-scale-shape: false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* *
|
|
||||||
* Add Vault - MenuItem *
|
|
||||||
* *
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
.add-vault-menu-item {
|
|
||||||
-fx-padding: 4px 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* *
|
* *
|
||||||
* ProgressBar *
|
* ProgressBar *
|
||||||
|
|||||||
@@ -24,8 +24,9 @@
|
|||||||
|
|
||||||
<Region VBox.vgrow="ALWAYS"/>
|
<Region VBox.vgrow="ALWAYS"/>
|
||||||
|
|
||||||
<ButtonBar buttonMinWidth="120" buttonOrder="+X">
|
<ButtonBar buttonMinWidth="120" buttonOrder="B+X">
|
||||||
<buttons>
|
<buttons>
|
||||||
|
<Button text="%generic.button.back" ButtonBar.buttonData="BACK_PREVIOUS" onAction="#back"/>
|
||||||
<Button fx:id="finishButton" text="%addvaultwizard.existing.chooseBtn" ButtonBar.buttonData="NEXT_FORWARD" onAction="#chooseFileAndNext" defaultButton="true"/>
|
<Button fx:id="finishButton" text="%addvaultwizard.existing.chooseBtn" ButtonBar.buttonData="NEXT_FORWARD" onAction="#chooseFileAndNext" defaultButton="true"/>
|
||||||
</buttons>
|
</buttons>
|
||||||
</ButtonBar>
|
</ButtonBar>
|
||||||
|
|||||||
@@ -68,8 +68,9 @@
|
|||||||
|
|
||||||
<Region VBox.vgrow="ALWAYS"/>
|
<Region VBox.vgrow="ALWAYS"/>
|
||||||
|
|
||||||
<ButtonBar buttonMinWidth="120" buttonOrder="+X">
|
<ButtonBar buttonMinWidth="120" buttonOrder="B+X">
|
||||||
<buttons>
|
<buttons>
|
||||||
|
<Button text="%generic.button.back" ButtonBar.buttonData="BACK_PREVIOUS" onAction="#back"/>
|
||||||
<Button text="%generic.button.next" ButtonBar.buttonData="NEXT_FORWARD" onAction="#next" defaultButton="true" disable="${!controller.validVaultName}"/>
|
<Button text="%generic.button.next" ButtonBar.buttonData="NEXT_FORWARD" onAction="#next" defaultButton="true" disable="${!controller.validVaultName}"/>
|
||||||
</buttons>
|
</buttons>
|
||||||
</ButtonBar>
|
</ButtonBar>
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
|
||||||
|
<?import javafx.geometry.Insets?>
|
||||||
|
<?import javafx.scene.control.Button?>
|
||||||
|
<?import javafx.scene.image.Image?>
|
||||||
|
<?import javafx.scene.image.ImageView?>
|
||||||
|
<?import javafx.scene.layout.Region?>
|
||||||
|
<?import javafx.scene.layout.VBox?>
|
||||||
|
<VBox xmlns:fx="http://javafx.com/fxml"
|
||||||
|
xmlns="http://javafx.com/javafx"
|
||||||
|
fx:controller="org.cryptomator.ui.addvaultwizard.AddVaultWelcomeController"
|
||||||
|
prefWidth="450"
|
||||||
|
prefHeight="450"
|
||||||
|
spacing="12"
|
||||||
|
alignment="TOP_CENTER">
|
||||||
|
<padding>
|
||||||
|
<Insets topRightBottomLeft="24"/>
|
||||||
|
</padding>
|
||||||
|
<children>
|
||||||
|
<Region VBox.vgrow="ALWAYS"/>
|
||||||
|
|
||||||
|
<ImageView VBox.vgrow="ALWAYS" fitHeight="128" preserveRatio="true" smooth="true" cache="true">
|
||||||
|
<Image url="@../img/logo.png"/>
|
||||||
|
</ImageView>
|
||||||
|
|
||||||
|
<Region VBox.vgrow="ALWAYS"/>
|
||||||
|
|
||||||
|
<VBox alignment="CENTER" spacing="9">
|
||||||
|
<Button styleClass="button-large" text="%addvaultwizard.welcome.newButton" onAction="#createNewVault" prefWidth="Infinity">
|
||||||
|
<graphic>
|
||||||
|
<FontAwesome5IconView glyph="MAGIC" glyphSize="15"/>
|
||||||
|
</graphic>
|
||||||
|
</Button>
|
||||||
|
<Button styleClass="button-large" text="%addvaultwizard.welcome.existingButton" onAction="#chooseExistingVault" prefWidth="Infinity">
|
||||||
|
<graphic>
|
||||||
|
<FontAwesome5IconView glyph="FOLDER_OPEN" glyphSize="15"/>
|
||||||
|
</graphic>
|
||||||
|
</Button>
|
||||||
|
</VBox>
|
||||||
|
|
||||||
|
<Region VBox.vgrow="ALWAYS"/>
|
||||||
|
</children>
|
||||||
|
</VBox>
|
||||||
@@ -32,17 +32,6 @@
|
|||||||
</StackPane>
|
</StackPane>
|
||||||
<VBox spacing="6" HBox.hgrow="ALWAYS">
|
<VBox spacing="6" HBox.hgrow="ALWAYS">
|
||||||
<FormattedLabel styleClass="label-extra-large" format="%error.message" arg1="${controller.errorCode}"/>
|
<FormattedLabel styleClass="label-extra-large" format="%error.message" arg1="${controller.errorCode}"/>
|
||||||
<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}"/>
|
<FontAwesome5Spinner glyphSize="24" visible="${controller.isLoadingHttpResponse}" managed="${controller.isLoadingHttpResponse}"/>
|
||||||
<VBox 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}"/>
|
<Label text="%error.existingSolutionDescription" wrapText="true" visible="${controller.errorSolutionFound}" managed="${controller.errorSolutionFound}"/>
|
||||||
@@ -64,7 +53,6 @@
|
|||||||
</Hyperlink>
|
</Hyperlink>
|
||||||
</VBox>
|
</VBox>
|
||||||
</VBox>
|
</VBox>
|
||||||
</VBox>
|
|
||||||
</HBox>
|
</HBox>
|
||||||
<VBox spacing="6" VBox.vgrow="ALWAYS">
|
<VBox spacing="6" VBox.vgrow="ALWAYS">
|
||||||
<HBox>
|
<HBox>
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
</padding>
|
</padding>
|
||||||
</Label>
|
</Label>
|
||||||
|
|
||||||
<FormattedLabel fx:id="dialogDescription" wrapText="true" textAlignment="LEFT" format="${controller.format}" arg1="${controller.exceptionPath}" arg2="${controller.exceptionMessage}" arg3="${controller.hideawayPath}"/>
|
<FormattedLabel fx:id="dialogDescription" wrapText="true" textAlignment="LEFT"/>
|
||||||
|
|
||||||
<Region VBox.vgrow="ALWAYS" minHeight="18"/>
|
<Region VBox.vgrow="ALWAYS" minHeight="18"/>
|
||||||
<ButtonBar buttonMinWidth="120" buttonOrder="+CI">
|
<ButtonBar buttonMinWidth="120" buttonOrder="+CI">
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
<?import javafx.scene.layout.StackPane?>
|
<?import javafx.scene.layout.StackPane?>
|
||||||
<?import javafx.scene.layout.VBox?>
|
<?import javafx.scene.layout.VBox?>
|
||||||
<?import javafx.scene.shape.Arc?>
|
<?import javafx.scene.shape.Arc?>
|
||||||
<?import javafx.scene.control.ContextMenu?>
|
|
||||||
<?import javafx.scene.control.MenuItem?>
|
|
||||||
<StackPane xmlns:fx="http://javafx.com/fxml"
|
<StackPane xmlns:fx="http://javafx.com/fxml"
|
||||||
xmlns="http://javafx.com/javafx"
|
xmlns="http://javafx.com/javafx"
|
||||||
fx:id="root"
|
fx:id="root"
|
||||||
@@ -28,27 +26,11 @@
|
|||||||
<Arc VBox.vgrow="NEVER" styleClass="onboarding-overlay-arc" type="OPEN" centerX="50" centerY="0" radiusY="100" radiusX="50" startAngle="0" length="-60" strokeWidth="1"/>
|
<Arc VBox.vgrow="NEVER" styleClass="onboarding-overlay-arc" type="OPEN" centerX="50" centerY="0" radiusY="100" radiusX="50" startAngle="0" length="-60" strokeWidth="1"/>
|
||||||
</VBox>
|
</VBox>
|
||||||
</StackPane>
|
</StackPane>
|
||||||
<Button fx:id="addVaultBtn" onAction="#toggleMenu" styleClass="toolbar-button" text="%main.vaultlist.addVaultBtn" alignment="BASELINE_CENTER" maxWidth="Infinity" contentDisplay="RIGHT">
|
<Button styleClass="toolbar-button" text="%main.vaultlist.addVaultBtn" onAction="#didClickAddVault" alignment="BASELINE_CENTER" maxWidth="Infinity">
|
||||||
<graphic>
|
<graphic>
|
||||||
<FontAwesome5IconView glyph="CARET_DOWN"/>
|
<FontAwesome5IconView glyph="PLUS"/>
|
||||||
</graphic>
|
</graphic>
|
||||||
</Button>
|
</Button>
|
||||||
<fx:define>
|
|
||||||
<ContextMenu fx:id="addVaultContextMenu">
|
|
||||||
<items>
|
|
||||||
<MenuItem styleClass="add-vault-menu-item" text="%main.vaultlist.addVaultBtn.menuItemNew" onAction="#didClickAddNewVault" >
|
|
||||||
<graphic>
|
|
||||||
<FontAwesome5IconView glyph="PLUS" textAlignment="CENTER" wrappingWidth="14" />
|
|
||||||
</graphic>
|
|
||||||
</MenuItem>
|
|
||||||
<MenuItem styleClass="add-vault-menu-item" text="%main.vaultlist.addVaultBtn.menuItemExisting" onAction="#didClickAddExistingVault" >
|
|
||||||
<graphic>
|
|
||||||
<FontAwesome5IconView glyph="FOLDER_OPEN" textAlignment="CENTER" wrappingWidth="14" />
|
|
||||||
</graphic>
|
|
||||||
</MenuItem>
|
|
||||||
</items>
|
|
||||||
</ContextMenu>
|
|
||||||
</fx:define>
|
|
||||||
</VBox>
|
</VBox>
|
||||||
<Region styleClass="drag-n-drop-border" visible="${controller.draggingVaultOver}"/>
|
<Region styleClass="drag-n-drop-border" visible="${controller.draggingVaultOver}"/>
|
||||||
</StackPane>
|
</StackPane>
|
||||||
|
|||||||
@@ -23,9 +23,7 @@ error.hyperlink.report=Report this error
|
|||||||
error.technicalDetails=Details:
|
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.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.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
|
||||||
defaults.vault.vaultName=Vault
|
defaults.vault.vaultName=Vault
|
||||||
@@ -41,8 +39,10 @@ traymenu.vault.reveal=Reveal
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Add Vault
|
addvaultwizard.title=Add Vault
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Create New Vault
|
||||||
|
addvaultwizard.welcome.existingButton=Open Existing Vault
|
||||||
## New
|
## New
|
||||||
addvaultwizard.new.title=Add New Vault
|
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Choose a name for the vault
|
addvaultwizard.new.nameInstruction=Choose a name for the vault
|
||||||
addvaultwizard.new.namePrompt=Vault Name
|
addvaultwizard.new.namePrompt=Vault Name
|
||||||
@@ -92,7 +92,6 @@ addvault.new.readme.accessLocation.2=This is your vault's access location.
|
|||||||
addvault.new.readme.accessLocation.3=Any files added to this volume will be encrypted by Cryptomator. You can work on it like on any other drive/folder. This is only a decrypted view of its content, your files stay encrypted on your hard drive all the time.
|
addvault.new.readme.accessLocation.3=Any files added to this volume will be encrypted by Cryptomator. You can work on it like on any other drive/folder. This is only a decrypted view of its content, your files stay encrypted on your hard drive all the time.
|
||||||
addvault.new.readme.accessLocation.4=Feel free to remove this file.
|
addvault.new.readme.accessLocation.4=Feel free to remove this file.
|
||||||
## Existing
|
## Existing
|
||||||
addvaultwizard.existing.title=Add Existing Vault
|
|
||||||
addvaultwizard.existing.instruction=Choose the "vault.cryptomator" file of your existing vault. If only a file named "masterkey.cryptomator" exists, select that instead.
|
addvaultwizard.existing.instruction=Choose the "vault.cryptomator" file of your existing vault. If only a file named "masterkey.cryptomator" exists, select that instead.
|
||||||
addvaultwizard.existing.chooseBtn=Choose…
|
addvaultwizard.existing.chooseBtn=Choose…
|
||||||
addvaultwizard.existing.filePickerTitle=Select Vault File
|
addvaultwizard.existing.filePickerTitle=Select Vault File
|
||||||
@@ -137,11 +136,8 @@ unlock.success.revealBtn=Reveal Drive
|
|||||||
unlock.error.customPath.message=Unable to mount vault to custom path
|
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.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.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=The drive letter or custom mount path "%s" is already in use.
|
unlock.error.customPath.description.inUse=Drive letter "%s" is already in use.
|
||||||
unlock.error.customPath.description.hideawayNotDir=The temporary, hidden file "%3$s" used for unlocking could not be removed. Please check the file and then delete it manually.
|
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.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
|
||||||
hub.noKeychain.message=Unable to access device key
|
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.
|
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.
|
||||||
@@ -366,9 +362,7 @@ main.vaultlist.contextMenu.unlock=Unlock…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Unlock Now
|
main.vaultlist.contextMenu.unlockNow=Unlock Now
|
||||||
main.vaultlist.contextMenu.vaultoptions=Show Vault Options
|
main.vaultlist.contextMenu.vaultoptions=Show Vault Options
|
||||||
main.vaultlist.contextMenu.reveal=Reveal Drive
|
main.vaultlist.contextMenu.reveal=Reveal Drive
|
||||||
main.vaultlist.addVaultBtn=Add
|
main.vaultlist.addVaultBtn=Add Vault
|
||||||
main.vaultlist.addVaultBtn.menuItemNew=New Vault...
|
|
||||||
main.vaultlist.addVaultBtn.menuItemExisting=Existing Vault...
|
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Thanks for choosing Cryptomator to protect your files. If you need any assistance, check out our getting started guides:
|
main.vaultDetail.welcomeOnboarding=Thanks for choosing Cryptomator to protect your files. If you need any assistance, check out our getting started guides:
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
## Button
|
## Button
|
||||||
generic.button.apply=تطبيق
|
generic.button.apply=تطبيق
|
||||||
generic.button.back=رجوع
|
generic.button.back=رجوع
|
||||||
generic.button.cancel=إلغاء
|
generic.button.cancel=الغاء
|
||||||
generic.button.change=تغيير
|
generic.button.change=تغيير
|
||||||
generic.button.choose=اختر…
|
generic.button.choose=اختر…
|
||||||
generic.button.close=إغلاق
|
generic.button.close=إغلاق
|
||||||
@@ -16,22 +16,13 @@ generic.button.print=طباعة
|
|||||||
|
|
||||||
# Error
|
# Error
|
||||||
error.message=حدث خطأ ما
|
error.message=حدث خطأ ما
|
||||||
error.description=لم يتوقع "كريبتوماتور" حدوث ذلك. يمكنك البحث عن الحلول الموجودة لهذا الخطأ. وإذا لم يتم الإبلاغ عنه بعد، لا تتردد في فعل ذلك.
|
|
||||||
error.hyperlink.lookup=ابحث عن هذا الخطأ
|
|
||||||
error.hyperlink.report=أبلغ عن هذا الخطأ
|
|
||||||
error.technicalDetails=التفاصيل:
|
|
||||||
error.existingSolutionDescription=لم يتوقع "كريبتوماتور" حدوث ذلك. لكننا وجدنا حلا لهذا الخطأ. يرجى إلقاء نظرة على الرابط التالي.
|
|
||||||
error.hyperlink.solution=ابحث عن الحل
|
|
||||||
error.lookupPermissionMessage=يمكن لـ Cryptomator البحث عن حل لهذه المشكلة على الإنترنت. هذا سيرسل طلب إلى قاعدة بيانات مشكلتنا من عنوان IP الخاص بك.
|
|
||||||
error.dismiss=تجاهل
|
|
||||||
error.lookUpSolution=البحث عن حل
|
|
||||||
|
|
||||||
# Defaults
|
# Defaults
|
||||||
defaults.vault.vaultName=الخزينة
|
defaults.vault.vaultName=مخزن
|
||||||
|
|
||||||
# Tray Menu
|
# Tray Menu
|
||||||
traymenu.showMainWindow=عرض
|
traymenu.showMainWindow=اظهار
|
||||||
traymenu.showPreferencesWindow=التفضيلات
|
traymenu.showPreferencesWindow=تفضيلات
|
||||||
traymenu.lockAllVaults=تأمين الكل
|
traymenu.lockAllVaults=تأمين الكل
|
||||||
traymenu.quitApplication=انهاء
|
traymenu.quitApplication=انهاء
|
||||||
traymenu.vault.unlock=افتح
|
traymenu.vault.unlock=افتح
|
||||||
@@ -40,11 +31,13 @@ traymenu.vault.reveal=إظهار
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=أضِف مخزنًا
|
addvaultwizard.title=أضِف مخزنًا
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=إنشاء مخزن جديد
|
||||||
|
addvaultwizard.welcome.existingButton=افتح مخزن موجود
|
||||||
## New
|
## New
|
||||||
addvaultwizard.new.title=إضافة مخزن جديد
|
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=اختر اسم للمخزن
|
addvaultwizard.new.nameInstruction=اختر اسم للمخزن
|
||||||
addvaultwizard.new.namePrompt=اسم الخزينة
|
addvaultwizard.new.namePrompt=اسم المخزن
|
||||||
### Location
|
### Location
|
||||||
addvaultwizard.new.locationInstruction=أين يجب على Cryptomator تخزين الملفات المشفرة للمخزن الخاص بك؟
|
addvaultwizard.new.locationInstruction=أين يجب على Cryptomator تخزين الملفات المشفرة للمخزن الخاص بك؟
|
||||||
addvaultwizard.new.locationLabel=موقع التخزين
|
addvaultwizard.new.locationLabel=موقع التخزين
|
||||||
@@ -56,18 +49,6 @@ addvaultwizard.new.fileAlreadyExists=ملف أو مجلد بنفس اسم الم
|
|||||||
addvaultwizard.new.locationDoesNotExist=المجلد في المسار المحدد غير موجود أو لا يمكن الوصول إليه
|
addvaultwizard.new.locationDoesNotExist=المجلد في المسار المحدد غير موجود أو لا يمكن الوصول إليه
|
||||||
addvaultwizard.new.locationIsNotWritable=لا يوجد صلاحيات للكتابة على المسار المحدد
|
addvaultwizard.new.locationIsNotWritable=لا يوجد صلاحيات للكتابة على المسار المحدد
|
||||||
addvaultwizard.new.locationIsOk=الموقع المناسب للمخزن الخاص بك
|
addvaultwizard.new.locationIsOk=الموقع المناسب للمخزن الخاص بك
|
||||||
addvaultwizard.new.invalidName=اسم المخزن غير صالح
|
|
||||||
addvaultwizard.new.validName=اسم المخزن صالح
|
|
||||||
addvaultwizard.new.validCharacters.message=قد يحتوي اسم المخزن على الأحرف التالية:
|
|
||||||
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
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=إنشاء المخزن
|
addvaultwizard.new.createVaultBtn=إنشاء المخزن
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=لن تتمكن من الوصول إلى بياناتك بدون كلمة المرور الخاصة بك. هل تريد مفتاح استرداد في حالة فقدان كلمة المرور الخاصة بك؟
|
addvaultwizard.new.generateRecoveryKeyChoice=لن تتمكن من الوصول إلى بياناتك بدون كلمة المرور الخاصة بك. هل تريد مفتاح استرداد في حالة فقدان كلمة المرور الخاصة بك؟
|
||||||
@@ -75,7 +56,7 @@ addvaultwizard.new.generateRecoveryKeyChoice.yes=نعم من فضلك، أن ت
|
|||||||
addvaultwizard.new.generateRecoveryKeyChoice.no=لا شكراً، لن أفقد كلمة المرور الخاصة بي
|
addvaultwizard.new.generateRecoveryKeyChoice.no=لا شكراً، لن أفقد كلمة المرور الخاصة بي
|
||||||
### Information
|
### Information
|
||||||
addvault.new.readme.storageLocation.fileName=هام.rtf
|
addvault.new.readme.storageLocation.fileName=هام.rtf
|
||||||
addvault.new.readme.storageLocation.1=⚠️ ملفات الخزينة ⚠️
|
addvault.new.readme.storageLocation.1=⚠️ ملفات الخزنة ⚠️
|
||||||
addvault.new.readme.storageLocation.2=هذا هو موقع تخزين الخزنة الخاصة بك.
|
addvault.new.readme.storageLocation.2=هذا هو موقع تخزين الخزنة الخاصة بك.
|
||||||
addvault.new.readme.storageLocation.3=لا تفعل
|
addvault.new.readme.storageLocation.3=لا تفعل
|
||||||
addvault.new.readme.storageLocation.4=• تغيير أي ملفات داخل هذا الدليل أو
|
addvault.new.readme.storageLocation.4=• تغيير أي ملفات داخل هذا الدليل أو
|
||||||
@@ -86,23 +67,18 @@ addvault.new.readme.storageLocation.8=2. فتح المخزن باستخدام Cr
|
|||||||
addvault.new.readme.storageLocation.9=3. افتح موقع الوصول بالنقر على زر "إظهار".
|
addvault.new.readme.storageLocation.9=3. افتح موقع الوصول بالنقر على زر "إظهار".
|
||||||
addvault.new.readme.storageLocation.10=إذا كنت بحاجة إلى المساعدة، قم بالاطلاع على كتيب الوثائق: %s
|
addvault.new.readme.storageLocation.10=إذا كنت بحاجة إلى المساعدة، قم بالاطلاع على كتيب الوثائق: %s
|
||||||
addvault.new.readme.accessLocation.fileName=مرحبا.rtf
|
addvault.new.readme.accessLocation.fileName=مرحبا.rtf
|
||||||
addvault.new.readme.accessLocation.1=🔐️ وحدة التخزين مشفرة 🔐️
|
addvault.new.readme.accessLocation.1=🔐️ المجلدات المشفرة 🔐️
|
||||||
addvault.new.readme.accessLocation.2=هذا هو موقع الوصول للخرنة الخاص بك.
|
addvault.new.readme.accessLocation.2=هذا هو موقع الوصول للخرنة الخاص بك.
|
||||||
addvault.new.readme.accessLocation.3=سيتم تشفير أي ملفات تضاف إلى هذا المجلد من قبل Cryptomator. يمكنك العمل عليه كأي مجلد آخر. هذه فقط طريقة عرض غير مشفرة لمحتوياتها، ملفاتك تبقى مشفرة على القرص الصلب الخاص بك طوال الوقت.
|
addvault.new.readme.accessLocation.3=سيتم تشفير أي ملفات تضاف إلى هذا المجلد من قبل Cryptomator. يمكنك العمل عليه كأي مجلد آخر. هذه فقط طريقة عرض غير مشفرة لمحتوياتها، ملفاتك تبقى مشفرة على القرص الصلب الخاص بك طوال الوقت.
|
||||||
addvault.new.readme.accessLocation.4=لا تتردد في إزالة هذا الملف.
|
addvault.new.readme.accessLocation.4=لا تتردد في إزالة هذا الملف.
|
||||||
## Existing
|
## Existing
|
||||||
addvaultwizard.existing.title=أضِف مخزن موجود
|
|
||||||
addvaultwizard.existing.instruction=اختر ملف "vault.cryptomator" من خزينتك الحالية. إذا كان يوجد فقط ملف اسمه "masterkey.cryptomator"، اختره عوضاً عنه.
|
|
||||||
addvaultwizard.existing.chooseBtn=اختر…
|
addvaultwizard.existing.chooseBtn=اختر…
|
||||||
addvaultwizard.existing.filePickerTitle=حدد مِلَفّ المخزن
|
|
||||||
addvaultwizard.existing.filePickerMimeDesc=مخزن Cryptomator
|
|
||||||
## Success
|
## Success
|
||||||
addvaultwizard.success.nextStepsInstructions=تم إضافة مخزن "%s".\nتحتاج إلى فتح هذا المخزن للوصول أو إضافة محتويات إليه. بدلاً من ذلك، يمكنك فتحه في أي وقت لاحق.
|
addvaultwizard.success.nextStepsInstructions=تم إضافة مخزن "%s".\nتحتاج إلى فتح هذا المخزن للوصول أو إضافة محتويات إليه. بدلاً من ذلك، يمكنك فتحه في أي وقت لاحق.
|
||||||
addvaultwizard.success.unlockNow=افتح الان
|
addvaultwizard.success.unlockNow=افتح الان
|
||||||
|
|
||||||
# Remove Vault
|
# Remove Vault
|
||||||
removeVault.title=احذف الحافظة
|
removeVault.title=احذف الحافظة
|
||||||
removeVault.message=حذف المخزن؟
|
|
||||||
removeVault.description=سيؤدي هذا إلى نسيان Cryptomator لهذا المخزن فقط. يمكنك إضافته مرة أخرى لاحقاً. لن يتم حذف أي من الملفات المشفرة من القرص الصلب الخاص بك.
|
removeVault.description=سيؤدي هذا إلى نسيان Cryptomator لهذا المخزن فقط. يمكنك إضافته مرة أخرى لاحقاً. لن يتم حذف أي من الملفات المشفرة من القرص الصلب الخاص بك.
|
||||||
removeVault.confirmBtn=احذف الحافظة
|
removeVault.confirmBtn=احذف الحافظة
|
||||||
|
|
||||||
@@ -113,70 +89,34 @@ changepassword.finalConfirmation=أتفهم أنني لن أتمكن من الو
|
|||||||
|
|
||||||
# Forget Password
|
# Forget Password
|
||||||
forgetPassword.title=نسيت كلمة المرور
|
forgetPassword.title=نسيت كلمة المرور
|
||||||
forgetPassword.message=نسيت كلمة المرور؟
|
|
||||||
forgetPassword.description=سيؤدي هذا إلى حذف كلمة المرور المحفوظة لهذا المخزن من سلسلة مفاتيح النظام الخاص بك.
|
forgetPassword.description=سيؤدي هذا إلى حذف كلمة المرور المحفوظة لهذا المخزن من سلسلة مفاتيح النظام الخاص بك.
|
||||||
forgetPassword.confirmBtn=نسيت كلمة المرور
|
forgetPassword.confirmBtn=نسيت كلمة المرور
|
||||||
|
|
||||||
# Unlock
|
# Unlock
|
||||||
unlock.title=فتح "%s"
|
|
||||||
unlock.passwordPrompt=أدخل كلمة السر لـ "%s":
|
unlock.passwordPrompt=أدخل كلمة السر لـ "%s":
|
||||||
unlock.savePassword=تذكر كلمة المرور
|
unlock.savePassword=تذكر كلمة المرور
|
||||||
unlock.unlockBtn=افتح
|
unlock.unlockBtn=افتح
|
||||||
## Select
|
## Select
|
||||||
unlock.chooseMasterkey.message=لم يتم العثور على مفتاح التشفير الرئيسي
|
|
||||||
unlock.chooseMasterkey.description=لم يتمكن Cryptomator من العثور على مفتاح التشفير الرئيسي للمخزن "%s". الرجاء اختيار الملف يدوياً.
|
|
||||||
unlock.chooseMasterkey.filePickerTitle=اختر ملف الـ Masterkey
|
unlock.chooseMasterkey.filePickerTitle=اختر ملف الـ Masterkey
|
||||||
unlock.chooseMasterkey.filePickerMimeDesc=مفتاح التشفير الرئيسي في Cryptomator
|
|
||||||
## Success
|
## Success
|
||||||
unlock.success.message=تم الفتح بنجاح
|
|
||||||
unlock.success.description=تم فتح "%s" بنجاح! يمكنك الآن الوصول لمخزنك عن طريق القرص الافتراضي الخاص به.
|
unlock.success.description=تم فتح "%s" بنجاح! يمكنك الآن الوصول لمخزنك عن طريق القرص الافتراضي الخاص به.
|
||||||
unlock.success.rememberChoice=تذكر اختياري ولا تظهر هذا مرة أخرى
|
unlock.success.rememberChoice=تذكر اختياري ولا تظهر هذا مرة أخرى
|
||||||
unlock.success.revealBtn=اظهار القرص
|
unlock.success.revealBtn=اظهار القرص
|
||||||
## Failure
|
## Failure
|
||||||
unlock.error.customPath.message=غير قادر على تركيب المخزن إلى المسار المخصص
|
|
||||||
unlock.error.customPath.description.notSupported=إذا كنت ترغب في الاستمرار في استخدام المسار المخصص، يرجى الذَّهاب إلى التفضيلات وتحديد نوع وحدة التخزين\n الذي يدعمها. خلاف ذلك، انتقل إلى خيارات المخزن واختر نقطة تركيب مدعومة.
|
|
||||||
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
|
||||||
hub.noKeychain.message=غير قادر على الوصول إلى مفتاح الجهاز
|
|
||||||
hub.noKeychain.description=من أجل فتح مركز مخازن، مطلوب مفتاح جهاز، يتم تأمينه باستخدام سلسلة مفاتيح. للمضي قدما، قم بتمكين "%s" واختر سلسلة مفاتيح في التفضيلات.
|
|
||||||
hub.noKeychain.openBtn=فتح التفضيلات
|
|
||||||
### Waiting
|
### Waiting
|
||||||
hub.auth.message=جاري الانتظار للمصادقة…
|
|
||||||
hub.auth.description=يجب أن يتم إعادة توجيهك تلقائياً إلى صفحة تسجيل الدخول.
|
|
||||||
hub.auth.loginLink=لم يتم إعادة توجيهك؟ انقر هنا لفتحه.
|
|
||||||
### Receive Key
|
### Receive Key
|
||||||
hub.receive.message=معالجة الاستجابة…
|
|
||||||
hub.receive.description=Cryptomator يتلقى ويعالج الاستجابة من المركز. الرجاء الانتظار.
|
|
||||||
### Register Device
|
### Register Device
|
||||||
hub.register.message=اسم الجهاز متطلب
|
|
||||||
hub.register.description=يبدو أن هذا هو أول وصول للمركز من هذا الجهاز. من أجل تحديده للحصول على إذن الوصول، تحتاج إلى تسمية هذا الجهاز.
|
|
||||||
hub.register.nameLabel=اسم الجهاز
|
|
||||||
hub.register.occupiedMsg=الاسم مستخدم مسبقاً
|
|
||||||
hub.register.registerBtn=تأكيد
|
hub.register.registerBtn=تأكيد
|
||||||
### Registration Success
|
### Registration Success
|
||||||
hub.registerSuccess.message=تم تسمية الجهاز
|
|
||||||
hub.registerSuccess.description=للدخول إلى الخزينة، يحتاج جهازك إلى إذن من مالك الخزينة.
|
|
||||||
### Registration Failed
|
### Registration Failed
|
||||||
hub.registerFailed.message=أخفق في تسمية الجهاز
|
|
||||||
hub.registerFailed.description=خطأ في عملية التسمية. لمزيد من التفاصيل، انظر إلى سجل التطبيق.
|
|
||||||
### Unauthorized
|
### Unauthorized
|
||||||
hub.unauthorized.message=تم رفض الوصول
|
|
||||||
hub.unauthorized.description=لم يتم بعد منح الإذن لجهازك بالوصول إلى هذا المخزن. اطلب من مالك المخزن أن يأذن بذلك.
|
|
||||||
### License Exceeded
|
### License Exceeded
|
||||||
hub.invalidLicense.message=ترخيص المركز غير صالح
|
|
||||||
hub.invalidLicense.description=نموذج المركز Cryptomator الخاص بك لديه ترخيص غير صالح. الرجاء إبلاغ مسؤول مركز لترقية أو تجديد الترخيص.
|
|
||||||
|
|
||||||
# Lock
|
# Lock
|
||||||
## Force
|
## Force
|
||||||
lock.forced.message=فشلت عملية القفل
|
|
||||||
lock.forced.description=تم حظر قفل "%s" بواسطة العمليات المعلقة أو الملفات المفتوحة. يمكنك فرض قفل هذا المخزن، ولكن مقاطعة عمليات الادخال والاخراج I/O قد تؤدي لفقدان البيانات غير المحفوظة.
|
lock.forced.description=تم حظر قفل "%s" بواسطة العمليات المعلقة أو الملفات المفتوحة. يمكنك فرض قفل هذا المخزن، ولكن مقاطعة عمليات الادخال والاخراج I/O قد تؤدي لفقدان البيانات غير المحفوظة.
|
||||||
lock.forced.retryBtn=اعد المحاولة
|
lock.forced.retryBtn=اعد المحاولة
|
||||||
lock.forced.forceBtn=قفل قسري
|
|
||||||
## Failure
|
## Failure
|
||||||
lock.fail.message=فشلت عملية اقفال الخزنة.
|
lock.fail.message=فشلت عملية اقفال الخزنة.
|
||||||
lock.fail.description=فشل عملية قفل %s". تأكد من حفظ العمل غير المحفوظ في مكان آخر وأن العمليات الهامة للقراءة/الكتابة قد انتهت. من أجل إغلاق المخزن، اقتل تطبيق Cryptomator.
|
lock.fail.description=فشل عملية قفل %s". تأكد من حفظ العمل غير المحفوظ في مكان آخر وأن العمليات الهامة للقراءة/الكتابة قد انتهت. من أجل إغلاق المخزن، اقتل تطبيق Cryptomator.
|
||||||
@@ -212,88 +152,26 @@ migration.impossible.moreInfo=لا يزال ممكناً فتح المخزن ب
|
|||||||
|
|
||||||
# Health Check
|
# Health Check
|
||||||
## Start
|
## Start
|
||||||
health.title=فحص الصحة لـ "%s"
|
|
||||||
health.intro.header=فحص الصحة
|
|
||||||
health.intro.text=فحص الصحة هو مجموعة من الفحوص للكشف عن المشاكل وربما إصلاحها في الهيكل الداخلي للمخزن الخاص بك. يرجى مراعاة ما يلي:
|
|
||||||
health.intro.remarkSync=تحقق من مزامنة جميع الأجهزة، وهذا يحل معظم المشاكل.
|
|
||||||
health.intro.remarkFix=لا يمكن حل جميع المشاكل.
|
|
||||||
health.intro.remarkBackup=إذا كانت البيانات تالفة، نسخة احتياطية يمكن فقط أن تساعد.
|
|
||||||
health.intro.affirmation=لقد قرأت وفهمت المعلومات الواردة أعلاه
|
|
||||||
## Start Failure
|
## Start Failure
|
||||||
health.fail.header=خطأ في تحميل إعدادات المخزن
|
|
||||||
health.fail.ioError=حدث خطأ أثناء الوصول إلى ملف التهيئة وقراءته.
|
|
||||||
health.fail.parseError=حدث خطأ أثناء تحليل إعدادات المخزن.
|
|
||||||
health.fail.moreInfo=المزيد من المعلومات
|
|
||||||
## Check Selection
|
## Check Selection
|
||||||
health.checkList.description=حدد عمليات التحقق في القائمة اليسرى أو استخدم الأزرار أدناه.
|
|
||||||
health.checkList.selectAllButton=اختر جميع الفحوص
|
|
||||||
health.checkList.deselectAllButton=إلغاء اختيار جميع الفحوص
|
|
||||||
health.check.runBatchBtn=تشغيل الفحوص المحددة
|
|
||||||
## Detail view
|
## 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
|
## Result view
|
||||||
health.result.severityFilter.all=الخطورة - الكل
|
|
||||||
health.result.severityFilter.good=جيد
|
|
||||||
health.result.severityFilter.info=معلومات
|
|
||||||
health.result.severityFilter.warn=تحذير
|
|
||||||
health.result.severityFilter.crit=حرج
|
|
||||||
health.result.severityTip.good=الخطورة: جيد\nبنية المخزن عادية.
|
|
||||||
health.result.severityTip.info=الخطورة: معلومات\nبنية المخزن سليمة، إصلاح المقترح.
|
|
||||||
health.result.severityTip.warn=الخطورة: تحذير\nبنية المخزن تالفة، ننصح لإصلاح.
|
|
||||||
health.result.severityTip.crit=الخطورة: حرجة\nبنية المخزن تالفة، وتم تحديد فقدان البيانات.
|
|
||||||
health.result.fixStateFilter.all=حالة لإصلاح - الكل
|
|
||||||
health.result.fixStateFilter.fixable=قابلة للإصلاح
|
|
||||||
health.result.fixStateFilter.notFixable=غير قابل للإصلاح
|
|
||||||
health.result.fixStateFilter.fixing=يتم الإصلاح…
|
|
||||||
health.result.fixStateFilter.fixed=تم الإصلاح
|
|
||||||
health.result.fixStateFilter.fixFailed=فشل الإصلاح
|
|
||||||
## Fix Application
|
## Fix Application
|
||||||
health.fix.fixBtn=إصلاح
|
|
||||||
health.fix.successTip=تم الإصلاح بنجاح
|
|
||||||
health.fix.failTip=فشل الإصلاح، راجع السجل للحصول على التفاصيل
|
|
||||||
|
|
||||||
# Preferences
|
# Preferences
|
||||||
preferences.title=تفضيلات
|
preferences.title=تفضيلات
|
||||||
## General
|
## General
|
||||||
preferences.general=عام
|
preferences.general=عام
|
||||||
preferences.general.startHidden=إخفاء النافذة عند بدء تشغيل Cryptomator
|
preferences.general.startHidden=إخفاء النافذة عند بدء تشغيل Cryptomator
|
||||||
preferences.general.autoCloseVaults=اقفل الخزانات المفتوحة تلقائياً عند الإقلاع عن التطبيق
|
|
||||||
preferences.general.debugLogging=تمكين سجلات التصحيح
|
preferences.general.debugLogging=تمكين سجلات التصحيح
|
||||||
preferences.general.debugDirectory=عرض ملفات السجل
|
preferences.general.debugDirectory=عرض ملفات السجل
|
||||||
preferences.general.autoStart=تشغيل Cryptomator عند بدء تشغيل النظام
|
preferences.general.autoStart=تشغيل Cryptomator عند بدء تشغيل النظام
|
||||||
preferences.general.keychainBackend=تخزين كلمات المرور مع
|
preferences.general.keychainBackend=تخزين كلمات المرور مع
|
||||||
## Interface
|
## Interface
|
||||||
preferences.interface=الواجهة
|
|
||||||
preferences.interface.theme=الشكل والمظهر
|
|
||||||
preferences.interface.theme.automatic=تلقائي
|
|
||||||
preferences.interface.theme.dark=مظلم (أسود)
|
preferences.interface.theme.dark=مظلم (أسود)
|
||||||
preferences.interface.theme.light=فاتح (أبيض)
|
preferences.interface.theme.light=فاتح (أبيض)
|
||||||
preferences.interface.unlockThemes=تفعيل الوضع الداكن
|
|
||||||
preferences.interface.language=اللغة (يتطلب إعادة التشغيل)
|
|
||||||
preferences.interface.language.auto=النظام الافتراضي
|
|
||||||
preferences.interface.interfaceOrientation=اتجاه الواجهة
|
|
||||||
preferences.interface.interfaceOrientation.ltr=من اليسار إلى اليمين
|
|
||||||
preferences.interface.interfaceOrientation.rtl=من اليمين إلى اليسار
|
|
||||||
preferences.interface.showMinimizeButton=إظهار زر التصغير
|
|
||||||
preferences.interface.showTrayIcon=إظهار أيقونة اللوحة (يتطلب إعادة تشغيل)
|
|
||||||
## Volume
|
## Volume
|
||||||
preferences.volume=القرص الإفتراضي
|
preferences.volume=القرص الإفتراضي
|
||||||
preferences.volume.type=نوع وحدة التخزين
|
|
||||||
preferences.volume.type.automatic=تلقائي
|
|
||||||
preferences.volume.docsTooltip=افتح الوثائق لمعرفة المزيد عن مختلف أنواع وحدة التخزين.
|
|
||||||
preferences.volume.fuseRestartRequired=لتطبيق التغييرات، يحتاج Cryptomator إلى إعادة التشغيل.
|
|
||||||
preferences.volume.tcp.port=منفذ TCP
|
|
||||||
preferences.volume.supportedFeatures=يدعم نوع وحدة تخزين المختار الميزات التالية:
|
|
||||||
## Updates
|
## Updates
|
||||||
preferences.updates=تحديثات
|
preferences.updates=تحديثات
|
||||||
preferences.updates.currentVersion=الإصدار الحالي: %s
|
preferences.updates.currentVersion=الإصدار الحالي: %s
|
||||||
@@ -318,8 +196,6 @@ stats.cacheHitRate=معدل استخدام الكاش
|
|||||||
stats.read.throughput.idle=قراءة: خامل
|
stats.read.throughput.idle=قراءة: خامل
|
||||||
stats.decr.total.data.none=تم فك تشفير البيانات:-
|
stats.decr.total.data.none=تم فك تشفير البيانات:-
|
||||||
## Write
|
## Write
|
||||||
stats.write.total.data.mib=البيانات المكتوبة: %.1f م.ب
|
|
||||||
stats.write.total.data.gib=البيانات المكتوبة: %.1f ج.ب
|
|
||||||
stats.encr.total.data.none=البيانات المشفرة: -
|
stats.encr.total.data.none=البيانات المشفرة: -
|
||||||
|
|
||||||
## Accesses
|
## Accesses
|
||||||
@@ -339,7 +215,7 @@ main.vaultlist.contextMenu.unlock=فتح…
|
|||||||
main.vaultlist.contextMenu.unlockNow=افتح الان
|
main.vaultlist.contextMenu.unlockNow=افتح الان
|
||||||
main.vaultlist.contextMenu.vaultoptions=إظهار خيارات المخزن
|
main.vaultlist.contextMenu.vaultoptions=إظهار خيارات المخزن
|
||||||
main.vaultlist.contextMenu.reveal=اظهار القرص
|
main.vaultlist.contextMenu.reveal=اظهار القرص
|
||||||
main.vaultlist.addVaultBtn=إضافة
|
main.vaultlist.addVaultBtn=أضِف مخزنًا
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=شكرا لاختيار Cryptomator لحماية ملفاتك. إذا كنت بحاجة إلى أية مساعدة، تحقق من دليل وتعليمات الإستخدام:
|
main.vaultDetail.welcomeOnboarding=شكرا لاختيار Cryptomator لحماية ملفاتك. إذا كنت بحاجة إلى أية مساعدة، تحقق من دليل وتعليمات الإستخدام:
|
||||||
@@ -379,19 +255,18 @@ wrongFileAlert.message=هل حاولت تشفير هذه الملفات؟
|
|||||||
wrongFileAlert.description=لهذا الغرض، بوفر Cryptomator مجلداً في مدير ملفات النظام الخاص بك.
|
wrongFileAlert.description=لهذا الغرض، بوفر Cryptomator مجلداً في مدير ملفات النظام الخاص بك.
|
||||||
wrongFileAlert.instruction.0=لتشفير الملفات، قم باتباع الخطوات التالية:
|
wrongFileAlert.instruction.0=لتشفير الملفات، قم باتباع الخطوات التالية:
|
||||||
wrongFileAlert.instruction.1=1. فتح المخزن الخاص بك.
|
wrongFileAlert.instruction.1=1. فتح المخزن الخاص بك.
|
||||||
wrongFileAlert.instruction.2=2. انقر على "إظهار" لفتح وحدة التخزين في مدير ملفاتك.
|
wrongFileAlert.instruction.2=2. انقر على "إظهار" لفتح المجلد في مدير الملفات الخاص بك.
|
||||||
wrongFileAlert.instruction.3=3. أضِف ملفاتك إلى هذه وحدة التخزين.
|
wrongFileAlert.instruction.3=3. أضف ملفاتك إلى هذا المجلد.
|
||||||
wrongFileAlert.link=لمزيد من المساعدة، قم بزيارة
|
wrongFileAlert.link=لمزيد من المساعدة، قم بزيارة
|
||||||
|
|
||||||
# Vault Options
|
# Vault Options
|
||||||
## General
|
## General
|
||||||
vaultOptions.general=عام
|
vaultOptions.general=عام
|
||||||
vaultOptions.general.vaultName=اسم المخزن
|
vaultOptions.general.vaultName=اسم المخزن
|
||||||
vaultOptions.general.autoLock.lockAfterTimePart2=دقائق
|
|
||||||
vaultOptions.general.unlockAfterStartup=فتح قفل المخزن عند بدء تشغيل Cryptomator
|
vaultOptions.general.unlockAfterStartup=فتح قفل المخزن عند بدء تشغيل Cryptomator
|
||||||
vaultOptions.general.actionAfterUnlock=بعد فتح القفل بنجاح
|
vaultOptions.general.actionAfterUnlock=بعد فتح القفل بنجاح
|
||||||
vaultOptions.general.actionAfterUnlock.ignore=لا تفعل شيئاً
|
vaultOptions.general.actionAfterUnlock.ignore=لا تفعل شيئاً
|
||||||
vaultOptions.general.actionAfterUnlock.reveal=إظهار القرص
|
vaultOptions.general.actionAfterUnlock.reveal=اظهار القرص
|
||||||
vaultOptions.general.actionAfterUnlock.ask=اسأل
|
vaultOptions.general.actionAfterUnlock.ask=اسأل
|
||||||
|
|
||||||
## Mount
|
## Mount
|
||||||
@@ -441,5 +316,3 @@ passwordStrength.messageLabel.4=قوية جداً
|
|||||||
quit.lockAndQuitBtn=قفل و خروج
|
quit.lockAndQuitBtn=قفل و خروج
|
||||||
|
|
||||||
# Forced Quit
|
# Forced Quit
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
@@ -20,8 +20,6 @@ error.description=Cryptomator не чакаў такога павароту. Т
|
|||||||
error.hyperlink.lookup=Шукаць гэтую памылку
|
error.hyperlink.lookup=Шукаць гэтую памылку
|
||||||
error.hyperlink.report=Паведаміць пра гэтую памылку
|
error.hyperlink.report=Паведаміць пра гэтую памылку
|
||||||
error.technicalDetails=Падрабязнасці:
|
error.technicalDetails=Падрабязнасці:
|
||||||
error.existingSolutionDescription=Cryptomator не чакаў такога, але мы знайшлі, як можна выправіць гэтую хібу. Калі ласка, скарыстайся спасылкаю.
|
|
||||||
error.hyperlink.solution=Паглядзець на рашэнне
|
|
||||||
|
|
||||||
# Defaults
|
# Defaults
|
||||||
defaults.vault.vaultName=Скарбніца
|
defaults.vault.vaultName=Скарбніца
|
||||||
@@ -37,6 +35,9 @@ traymenu.vault.reveal=Паказаць
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Дадаць скарбніцу
|
addvaultwizard.title=Дадаць скарбніцу
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Стварыць новую скарбніцу
|
||||||
|
addvaultwizard.welcome.existingButton=Адчыніць існуючую скарбніцу
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Абраць назву для скарбніцы
|
addvaultwizard.new.nameInstruction=Абраць назву для скарбніцы
|
||||||
@@ -58,7 +59,6 @@ addvaultwizard.new.validCharacters.message=Нчзва скарбніцы мус
|
|||||||
addvaultwizard.new.validCharacters.chars=Слоўныя знакі, накшталт a, ж або 수
|
addvaultwizard.new.validCharacters.chars=Слоўныя знакі, накшталт a, ж або 수
|
||||||
addvaultwizard.new.validCharacters.numbers=Лічбы
|
addvaultwizard.new.validCharacters.numbers=Лічбы
|
||||||
addvaultwizard.new.validCharacters.dashes=Злучок (%s) або падкрэслінік (%s)
|
addvaultwizard.new.validCharacters.dashes=Злучок (%s) або падкрэслінік (%s)
|
||||||
### Expert Settings
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Стварыць скарбніцу
|
addvaultwizard.new.createVaultBtn=Стварыць скарбніцу
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=Бяз гэтага пароля ты ня зможаш атрымаць доступ да сваіх даных. Ці хочаш ты мець ключ аднаўлення на выпадак, калі ты згубіш свой пароль?
|
addvaultwizard.new.generateRecoveryKeyChoice=Бяз гэтага пароля ты ня зможаш атрымаць доступ да сваіх даных. Ці хочаш ты мець ключ аднаўлення на выпадак, калі ты згубіш свой пароль?
|
||||||
@@ -126,6 +126,7 @@ unlock.success.revealBtn=Паказаць дыск
|
|||||||
unlock.error.customPath.message=Не магчыма змантажаваць скарбніцу да карыстальніцкай сцежкі
|
unlock.error.customPath.message=Не магчыма змантажаваць скарбніцу да карыстальніцкай сцежкі
|
||||||
unlock.error.customPath.description.notSupported=Калі ты надалей жадаеш карыстацца адмысловаю сцежкаю, калі ласка, пайдзі ў налады ды абары там тып тому, які падтрымлівае яе. У іншым выпадку пайдзі ў опцыі скарбніцы ды абяры там пункт мантажавання, які падтрымліваецца.
|
unlock.error.customPath.description.notSupported=Калі ты надалей жадаеш карыстацца адмысловаю сцежкаю, калі ласка, пайдзі ў налады ды абары там тып тому, які падтрымлівае яе. У іншым выпадку пайдзі ў опцыі скарбніцы ды абяры там пункт мантажавання, які падтрымліваецца.
|
||||||
unlock.error.customPath.description.notExists=Адмысловая сцежка мантажавання не існуе. Ствары яе ў сваёй файлавай сістэме, альбо змяні яе ў опцыях скарбніцы.
|
unlock.error.customPath.description.notExists=Адмысловая сцежка мантажавання не існуе. Ствары яе ў сваёй файлавай сістэме, альбо змяні яе ў опцыях скарбніцы.
|
||||||
|
unlock.error.customPath.description.generic=Ты абраў адмысловую сцежку мантажавання для гэтай скарбніцы, але скарыстацца ёю не ўдалося. Вось паведамленне пра памылку: %s
|
||||||
## Hub
|
## Hub
|
||||||
hub.noKeychain.message=Няма доступу да ключа прылады
|
hub.noKeychain.message=Няма доступу да ключа прылады
|
||||||
hub.noKeychain.description=Каб разамкнуць скарбніцы Hub, патрэбны ключ прылады, які захаваны ў звязку ключоў. Каб працягнуць, уключы "%s" ды абяры звязак ключоў у наладах.
|
hub.noKeychain.description=Каб разамкнуць скарбніцы Hub, патрэбны ключ прылады, які захаваны ў звязку ключоў. Каб працягнуць, уключы "%s" ды абяры звязак ключоў у наладах.
|
||||||
@@ -192,15 +193,11 @@ migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Файлава
|
|||||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Файлавая сістэма не дазваляе пісаць у яе.
|
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Файлавая сістэма не дазваляе пісаць у яе.
|
||||||
## Impossible
|
## Impossible
|
||||||
migration.impossible.heading=Не мажліва перанесці скарбніцу
|
migration.impossible.heading=Не мажліва перанесці скарбніцу
|
||||||
migration.impossible.reason=Скарбніца ня можа аўтаматычна зьміґравацца, бо ейнае месца сховішча альбо пункт доступу не падтрымліваюцца.
|
|
||||||
migration.impossible.moreInfo=Скарбніца ўсё яшчэ можа адчыняцца, нягледзячы на старую вэрсію. Інструкцыю ручнога міґравання скарбніцы ты знойдзеш тут:
|
|
||||||
|
|
||||||
# Health Check
|
# Health Check
|
||||||
## Start
|
## Start
|
||||||
health.title=Тэст на цэласнасць для "%s"
|
health.title=Тэст на цэласнасць для "%s"
|
||||||
health.intro.header=Тэст на цэласнасць
|
health.intro.header=Тэст на цэласнасць
|
||||||
health.intro.text=Тэст на цэласнасьць – гэта калекцыя тэстаў для выяўлення ды выпраўленню хібаў унутранай структуры тваёй скарбніцы. Калі ласка, зьвярні ўвагу:
|
|
||||||
health.intro.remarkSync=Пераканайся, што ўсе прыстоі цалкам сынхранаваныя – гэта вырашае большасьць праблемаў.
|
|
||||||
health.intro.remarkFix=Ня ўсе хібы могуць быць выпраўленыя.
|
health.intro.remarkFix=Ня ўсе хібы могуць быць выпраўленыя.
|
||||||
health.intro.remarkBackup=Калі даныя пашкоджаныя, дапаможа толькі рэзервовая копія.
|
health.intro.remarkBackup=Калі даныя пашкоджаныя, дапаможа толькі рэзервовая копія.
|
||||||
health.intro.affirmation=Я прачытала і зразумела інфармацыю зверху
|
health.intro.affirmation=Я прачытала і зразумела інфармацыю зверху
|
||||||
@@ -273,10 +270,8 @@ preferences.interface.showMinimizeButton=Паказаць кнопку згор
|
|||||||
preferences.interface.showTrayIcon=Паказваць іконку на інфармацыйнай панэлі (спатрэбіцца перазапуск)
|
preferences.interface.showTrayIcon=Паказваць іконку на інфармацыйнай панэлі (спатрэбіцца перазапуск)
|
||||||
## Volume
|
## Volume
|
||||||
preferences.volume=Віртуальны дыск
|
preferences.volume=Віртуальны дыск
|
||||||
preferences.volume.type=Тып тому
|
|
||||||
preferences.volume.type.automatic=Аўтаматычна
|
preferences.volume.type.automatic=Аўтаматычна
|
||||||
preferences.volume.docsTooltip=Адчыні дакумэнтацыю, каб даведацца больш пра розныя тыпы тому.
|
preferences.volume.docsTooltip=Адчыні дакумэнтацыю, каб даведацца больш пра розныя тыпы тому.
|
||||||
preferences.volume.fuseRestartRequired=Каб дастасаваць зьмены, Cryptomator патрэбна перазапусьціць.
|
|
||||||
preferences.volume.tcp.port=Порт TCP
|
preferences.volume.tcp.port=Порт TCP
|
||||||
preferences.volume.supportedFeatures=Абраны тып тому падтрымлівае наступныя функцыі:
|
preferences.volume.supportedFeatures=Абраны тып тому падтрымлівае наступныя функцыі:
|
||||||
preferences.volume.feature.mountAuto=Аўтаматычны выбар пункту мантажавання
|
preferences.volume.feature.mountAuto=Аўтаматычны выбар пункту мантажавання
|
||||||
@@ -350,10 +345,9 @@ main.vaultlist.contextMenu.unlock=Адамкнуць…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Разамкнуць зараз
|
main.vaultlist.contextMenu.unlockNow=Разамкнуць зараз
|
||||||
main.vaultlist.contextMenu.vaultoptions=Паказаць параметры скарбніцы
|
main.vaultlist.contextMenu.vaultoptions=Паказаць параметры скарбніцы
|
||||||
main.vaultlist.contextMenu.reveal=Паказаць дыск
|
main.vaultlist.contextMenu.reveal=Паказаць дыск
|
||||||
main.vaultlist.addVaultBtn=Дадаць
|
main.vaultlist.addVaultBtn=Дадаць скарбніцу
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Дзякуй, што ты абраў Cryptomator для абароны тваіх файлаў. Калі табе патрэбна дапамога, калі ласка, паглядзі нашы інструкцыі:
|
|
||||||
### Locked
|
### Locked
|
||||||
main.vaultDetail.lockedStatus=ЗАМКНЁНА
|
main.vaultDetail.lockedStatus=ЗАМКНЁНА
|
||||||
main.vaultDetail.unlockBtn=Адамкнуць…
|
main.vaultDetail.unlockBtn=Адамкнуць…
|
||||||
@@ -392,7 +386,6 @@ main.vaultDetail.error.windowTitle=Памылка загрузкі скарбн
|
|||||||
# Wrong File Alert
|
# Wrong File Alert
|
||||||
wrongFileAlert.title=Як зашыфраваць файлы
|
wrongFileAlert.title=Як зашыфраваць файлы
|
||||||
wrongFileAlert.message=Ці спрабаваў ты зашыфраваць гэтыя файлы?
|
wrongFileAlert.message=Ці спрабаваў ты зашыфраваць гэтыя файлы?
|
||||||
wrongFileAlert.description=Для гэтай мэты Cryptomator стварае том у тваім мэнэджары файлавай сыстэмы.
|
|
||||||
wrongFileAlert.instruction.0=Каб зашыфраваць файлы, зрабі наступныя крокі:
|
wrongFileAlert.instruction.0=Каб зашыфраваць файлы, зрабі наступныя крокі:
|
||||||
wrongFileAlert.instruction.1=1. Разамкні свая скарбніцу.
|
wrongFileAlert.instruction.1=1. Разамкні свая скарбніцу.
|
||||||
wrongFileAlert.instruction.2=2. Пстрыкні па "Паказаць"; каб адчыніць том у тваім файлавым мэнэджары.
|
wrongFileAlert.instruction.2=2. Пстрыкні па "Паказаць"; каб адчыніць том у тваім файлавым мэнэджары.
|
||||||
@@ -433,7 +426,6 @@ vaultOptions.masterkey.recoveryKeyExplanation=Ключ аднаўлення –
|
|||||||
vaultOptions.masterkey.showRecoveryKeyBtn=Паказаць ключ аднаўлення
|
vaultOptions.masterkey.showRecoveryKeyBtn=Паказаць ключ аднаўлення
|
||||||
vaultOptions.masterkey.recoverPasswordBtn=Скінуць пароль
|
vaultOptions.masterkey.recoverPasswordBtn=Скінуць пароль
|
||||||
## Hub
|
## Hub
|
||||||
vaultOptions.hub=Аднаўленне
|
|
||||||
|
|
||||||
# Recovery Key
|
# Recovery Key
|
||||||
## Display Recovery Key
|
## Display Recovery Key
|
||||||
@@ -445,7 +437,6 @@ recoveryKey.display.StorageHints=Захоўвай іх у бяспечным м
|
|||||||
## Reset Password
|
## Reset Password
|
||||||
### Enter Recovery Key
|
### Enter Recovery Key
|
||||||
recoveryKey.recover.title=Скінуць пароль
|
recoveryKey.recover.title=Скінуць пароль
|
||||||
recoveryKey.recover.prompt=Увядзі ключ аднаўлення для "%s":
|
|
||||||
recoveryKey.recover.correctKey=Гэта валідны ключ аднаўлення
|
recoveryKey.recover.correctKey=Гэта валідны ключ аднаўлення
|
||||||
recoveryKey.recover.wrongKey=Гэты ключ аднаўлення належыць іншай скарбніцы
|
recoveryKey.recover.wrongKey=Гэты ключ аднаўлення належыць іншай скарбніцы
|
||||||
recoveryKey.recover.invalidKey=Несапраўдны ключ аднаўлення
|
recoveryKey.recover.invalidKey=Несапраўдны ключ аднаўлення
|
||||||
@@ -457,10 +448,6 @@ recoveryKey.recover.resetSuccess.message=Пароль паспяхова скі
|
|||||||
recoveryKey.recover.resetSuccess.description=Ты можаш разамкнуць сваю скарбніцу з дапамогаю новага паролю.
|
recoveryKey.recover.resetSuccess.description=Ты можаш разамкнуць сваю скарбніцу з дапамогаю новага паролю.
|
||||||
|
|
||||||
# Convert Vault
|
# Convert Vault
|
||||||
convertVault.title=Перабудаваць скарбніцу
|
|
||||||
convertVault.convert.convertBtn.before=Перабудаваць
|
|
||||||
convertVault.convert.convertBtn.processing=Перабудаванне…
|
|
||||||
convertVault.success.message=Перабудаванне прайшло паспяхова
|
|
||||||
|
|
||||||
# New Password
|
# New Password
|
||||||
newPassword.promptText=Увядзі новы пароль
|
newPassword.promptText=Увядзі новы пароль
|
||||||
@@ -484,5 +471,3 @@ quit.lockAndQuitBtn=Замкнуць ды вайсці
|
|||||||
quit.forced.message=Некаторыя скарбніцы не магчыма замкнуць
|
quit.forced.message=Некаторыя скарбніцы не магчыма замкнуць
|
||||||
quit.forced.description=Замыканне скарбніц было заблакавана праз дзеючыя аперацыі альбо праз адчыненыя файлы. Ты можаш прымусова замкнуць скарбніцы, але гэта можа прывесці да страты незахаваных даных.
|
quit.forced.description=Замыканне скарбніц было заблакавана праз дзеючыя аперацыі альбо праз адчыненыя файлы. Ты можаш прымусова замкнуць скарбніцы, але гэта можа прывесці да страты незахаваных даных.
|
||||||
quit.forced.forceAndQuitBtn=Прымусіць і выйсці
|
quit.forced.forceAndQuitBtn=Прымусіць і выйсці
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
@@ -35,6 +35,9 @@ traymenu.vault.reveal=Разкриване
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Добавяне на хранилище
|
addvaultwizard.title=Добавяне на хранилище
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Ново хранилище
|
||||||
|
addvaultwizard.welcome.existingButton=Отваряне на хранилище
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Изберете име на хранилището
|
addvaultwizard.new.nameInstruction=Изберете име на хранилището
|
||||||
@@ -56,7 +59,6 @@ addvaultwizard.new.validCharacters.message=Името на хранилищет
|
|||||||
addvaultwizard.new.validCharacters.chars=Букви (напр. a, ж или 수)
|
addvaultwizard.new.validCharacters.chars=Букви (напр. a, ж или 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=Числа
|
addvaultwizard.new.validCharacters.numbers=Числа
|
||||||
addvaultwizard.new.validCharacters.dashes=Тире (%s) или долна черта (%s)
|
addvaultwizard.new.validCharacters.dashes=Тире (%s) или долна черта (%s)
|
||||||
### Expert Settings
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Създаване
|
addvaultwizard.new.createVaultBtn=Създаване
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=Без парола няма да имате достъп до данните си. Желаете ли да бъде създаден ключ за възстановяване, в случай че загубите паролата си?
|
addvaultwizard.new.generateRecoveryKeyChoice=Без парола няма да имате достъп до данните си. Желаете ли да бъде създаден ключ за възстановяване, в случай че загубите паролата си?
|
||||||
@@ -116,44 +118,20 @@ unlock.chooseMasterkey.filePickerMimeDesc=Гкавен ключ на Крипт
|
|||||||
## Success
|
## Success
|
||||||
unlock.success.message=Отключено е успешно
|
unlock.success.message=Отключено е успешно
|
||||||
unlock.success.description=Съдържанието на хранилището „%s“ е достъпно в точката му на монтиране.
|
unlock.success.description=Съдържанието на хранилището „%s“ е достъпно в точката му на монтиране.
|
||||||
unlock.success.rememberChoice=Запомняне на избора и да не бъде задаван отново този въпрос
|
|
||||||
unlock.success.revealBtn=Разкриване на диска
|
unlock.success.revealBtn=Разкриване на диска
|
||||||
## Failure
|
## Failure
|
||||||
unlock.error.customPath.message=Хранилището не може да бъде монтирано в потребителския път
|
|
||||||
unlock.error.customPath.description.notSupported=Ако искате да продължите да използвате потребитрлския път, отидете в настройките и изберете вид на дял, който поддържа потребителски пътища. В противен случай отидете в настройките на хранилището и изберете поддържана точка за монтиране.
|
|
||||||
unlock.error.customPath.description.notExists=Потребителският път на монтиране не съществува. Създайте го в местната файлова система или го променете в настройките на хранилището.
|
|
||||||
## Hub
|
## Hub
|
||||||
hub.noKeychain.message=Няма достъп до ключа на устройството
|
|
||||||
hub.noKeychain.description=За да отключите хранилищата в Hub е необходим ключ за устройството, който се защитава с помощта на ключодържател. За да продължите, разрешете „%s“ и изберете ключодържателя в настройките.
|
|
||||||
hub.noKeychain.openBtn=Към настройките
|
hub.noKeychain.openBtn=Към настройките
|
||||||
### Waiting
|
### Waiting
|
||||||
hub.auth.message=Изчакване на удостоверяване…
|
|
||||||
hub.auth.description=Автоматично ще бъдете пренасочени към страницата за вход.
|
|
||||||
hub.auth.loginLink=Не сте пренасочени? Щракнете тук, за да посетите.
|
|
||||||
### Receive Key
|
### Receive Key
|
||||||
hub.receive.message=Обработване на отговора…
|
|
||||||
hub.receive.description=Криптоматор получава и обработва отговора от Hub. Изчакайте.
|
|
||||||
### Register Device
|
### Register Device
|
||||||
hub.register.message=Изисква се име на устройство
|
|
||||||
hub.register.description=Изглежда, че това е първи достъп до Hub от това устройство. За да го разпознаете при разрешаване на достъпа, трябва да му дадете име.
|
|
||||||
hub.register.nameLabel=Име на устройството
|
|
||||||
hub.register.occupiedMsg=Това име вече е заето
|
|
||||||
hub.register.registerBtn=Потвърждаване
|
|
||||||
### Registration Success
|
### Registration Success
|
||||||
hub.registerSuccess.message=Устройството е именувано
|
|
||||||
hub.registerSuccess.description=За да получи достъп до хранилището, устройството трябва да бъде упълномощено от собственика на хранилището.
|
|
||||||
### Registration Failed
|
### Registration Failed
|
||||||
hub.registerFailed.message=Грешка при именуване на устройството
|
|
||||||
hub.registerFailed.description=В процеса на именуване е допусната грешка. За повече подробности разгледайте дневника на приложението.
|
|
||||||
### Unauthorized
|
### Unauthorized
|
||||||
hub.unauthorized.message=Отказан достъп
|
|
||||||
hub.unauthorized.description=Устройството не е упълномощено за достъп до това хранилище. Поискайте достъп от собственика.
|
|
||||||
### License Exceeded
|
### License Exceeded
|
||||||
hub.invalidLicense.message=Лиценза за Hub е недействителен
|
|
||||||
|
|
||||||
# Lock
|
# Lock
|
||||||
## Force
|
## Force
|
||||||
lock.forced.retryBtn=Повторен опит
|
|
||||||
## Failure
|
## Failure
|
||||||
|
|
||||||
# Migration
|
# Migration
|
||||||
@@ -162,7 +140,6 @@ lock.forced.retryBtn=Повторен опит
|
|||||||
## Success
|
## Success
|
||||||
migration.success.unlockNow=Отключване сега
|
migration.success.unlockNow=Отключване сега
|
||||||
## Missing file system capabilities
|
## Missing file system capabilities
|
||||||
migration.error.missingFileSystemCapabilities.title=Неподдържана файлова система
|
|
||||||
## Impossible
|
## Impossible
|
||||||
|
|
||||||
# Health Check
|
# Health Check
|
||||||
@@ -189,9 +166,7 @@ preferences.title=Настройки
|
|||||||
## General
|
## General
|
||||||
## Interface
|
## Interface
|
||||||
preferences.interface.theme=Оформление
|
preferences.interface.theme=Оформление
|
||||||
preferences.interface.theme.automatic=Автоматично
|
|
||||||
## Volume
|
## Volume
|
||||||
preferences.volume.type.automatic=Автоматично
|
|
||||||
## Updates
|
## Updates
|
||||||
## Contribution
|
## Contribution
|
||||||
#<-- Add entries for donations and code/translation/documentation contribution -->
|
#<-- Add entries for donations and code/translation/documentation contribution -->
|
||||||
@@ -214,6 +189,7 @@ main.vaultlist.contextMenu.unlock=Отключване…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Отключване сега
|
main.vaultlist.contextMenu.unlockNow=Отключване сега
|
||||||
main.vaultlist.contextMenu.vaultoptions=Настройки на хранилището
|
main.vaultlist.contextMenu.vaultoptions=Настройки на хранилището
|
||||||
main.vaultlist.contextMenu.reveal=Разкриване на диска
|
main.vaultlist.contextMenu.reveal=Разкриване на диска
|
||||||
|
main.vaultlist.addVaultBtn=Добавяне на хранилище
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
### Locked
|
### Locked
|
||||||
@@ -255,5 +231,3 @@ vaultOptions.masterkey.changePasswordBtn=Промяна на парола
|
|||||||
# Quit
|
# Quit
|
||||||
|
|
||||||
# Forced Quit
|
# Forced Quit
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
@@ -33,6 +33,9 @@ traymenu.vault.lock=লক করুন
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=ভোল্ট যুক্ত করুন
|
addvaultwizard.title=ভোল্ট যুক্ত করুন
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=নতুন ভোল্ট তৈরি করুন
|
||||||
|
addvaultwizard.welcome.existingButton=বিদ্যমান কোনো ভোল্ট খুলুন
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=ভোল্ট এর একটি নাম দেন
|
addvaultwizard.new.nameInstruction=ভোল্ট এর একটি নাম দেন
|
||||||
@@ -54,7 +57,6 @@ addvaultwizard.new.validCharacters.message=ভোল্টের নামটি
|
|||||||
addvaultwizard.new.validCharacters.chars=শব্দের অক্ষরগুলো (যেমনঃ a, ж অথবা 수)
|
addvaultwizard.new.validCharacters.chars=শব্দের অক্ষরগুলো (যেমনঃ a, ж অথবা 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=সংখ্যা
|
addvaultwizard.new.validCharacters.numbers=সংখ্যা
|
||||||
addvaultwizard.new.validCharacters.dashes=হাইফেন (%s) অথবা আন্ডারস্কোর (%s)
|
addvaultwizard.new.validCharacters.dashes=হাইফেন (%s) অথবা আন্ডারস্কোর (%s)
|
||||||
### Expert Settings
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=ভোল্ট তৈরি করুন
|
addvaultwizard.new.createVaultBtn=ভোল্ট তৈরি করুন
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=পাসওয়ার্ড ছাড়া আপনি আপনার তথ্যগুলো ব্যবহার করতে পারবেন না. তাই আপনি কি একটি পুনরুদ্ধার চাবি চান যদি আপনি পাসওয়ার্ড হারিয়ে ফেলেন?
|
addvaultwizard.new.generateRecoveryKeyChoice=পাসওয়ার্ড ছাড়া আপনি আপনার তথ্যগুলো ব্যবহার করতে পারবেন না. তাই আপনি কি একটি পুনরুদ্ধার চাবি চান যদি আপনি পাসওয়ার্ড হারিয়ে ফেলেন?
|
||||||
@@ -136,6 +138,7 @@ lock.forced.retryBtn=পুনরায় চেষ্টা করুন
|
|||||||
main.closeBtn.tooltip=বন্ধ করুন
|
main.closeBtn.tooltip=বন্ধ করুন
|
||||||
## Vault List
|
## Vault List
|
||||||
main.vaultlist.contextMenu.lock=লক করুন
|
main.vaultlist.contextMenu.lock=লক করুন
|
||||||
|
main.vaultlist.addVaultBtn=ভোল্ট যুক্ত করুন
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
### Locked
|
### Locked
|
||||||
@@ -170,5 +173,3 @@ vaultOptions.mount.mountPoint.directoryPickerButton=নির্বাচন ক
|
|||||||
# Quit
|
# Quit
|
||||||
|
|
||||||
# Forced Quit
|
# Forced Quit
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
@@ -31,6 +31,9 @@ traymenu.vault.reveal=Otkrij
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Dodaj sef
|
addvaultwizard.title=Dodaj sef
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Kreiraj novi sef
|
||||||
|
addvaultwizard.welcome.existingButton=Otvori postojeći sef
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Izaberi naziv za sef
|
addvaultwizard.new.nameInstruction=Izaberi naziv za sef
|
||||||
@@ -46,7 +49,6 @@ addvaultwizard.new.fileAlreadyExists=Upozorenje: Fajl ili mapa s tim nazivom ve
|
|||||||
addvaultwizard.new.locationDoesNotExist=Direktorij u navedenoj putanji ne postoji ili mu se ne može pristupiti
|
addvaultwizard.new.locationDoesNotExist=Direktorij u navedenoj putanji ne postoji ili mu se ne može pristupiti
|
||||||
addvaultwizard.new.locationIsNotWritable=Nije moguće izvršiti operaciju pisanja na navedenoj putanji
|
addvaultwizard.new.locationIsNotWritable=Nije moguće izvršiti operaciju pisanja na navedenoj putanji
|
||||||
addvaultwizard.new.locationIsOk=Pogodno mjesto za vaš sef
|
addvaultwizard.new.locationIsOk=Pogodno mjesto za vaš sef
|
||||||
### Expert Settings
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Kreiraj novi sef
|
addvaultwizard.new.createVaultBtn=Kreiraj novi sef
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=Nećete moći pristupiti svojim podacima bez lozinke. Želite li ključ za oporavak u slučaju da izgubite lozinku?
|
addvaultwizard.new.generateRecoveryKeyChoice=Nećete moći pristupiti svojim podacima bez lozinke. Želite li ključ za oporavak u slučaju da izgubite lozinku?
|
||||||
@@ -216,6 +218,7 @@ main.vaultlist.contextMenu.unlock=Otključaj…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Otključaj sada
|
main.vaultlist.contextMenu.unlockNow=Otključaj sada
|
||||||
main.vaultlist.contextMenu.vaultoptions=Pokaži opcije sefa
|
main.vaultlist.contextMenu.vaultoptions=Pokaži opcije sefa
|
||||||
main.vaultlist.contextMenu.reveal=Otkrij pogon
|
main.vaultlist.contextMenu.reveal=Otkrij pogon
|
||||||
|
main.vaultlist.addVaultBtn=Dodaj sef
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Hvala što ste izabrali Cryptomator za zaštitu podataka. Ako vam je potrebna pomoć, pogledajte naše vodiče za početak:
|
main.vaultDetail.welcomeOnboarding=Hvala što ste izabrali Cryptomator za zaštitu podataka. Ako vam je potrebna pomoć, pogledajte naše vodiče za početak:
|
||||||
@@ -312,5 +315,3 @@ passwordStrength.messageLabel.4=Veoma sigurno
|
|||||||
quit.lockAndQuitBtn=Zaključaj i zatvori
|
quit.lockAndQuitBtn=Zaključaj i zatvori
|
||||||
|
|
||||||
# Forced Quit
|
# Forced Quit
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
@@ -20,8 +20,6 @@ error.description=Ui! Cryptomator no esperava que passés això. Podeu cercar al
|
|||||||
error.hyperlink.lookup=Cerca aquest error
|
error.hyperlink.lookup=Cerca aquest error
|
||||||
error.hyperlink.report=Notifica aquest error
|
error.hyperlink.report=Notifica aquest error
|
||||||
error.technicalDetails=Detalls:
|
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
|
||||||
defaults.vault.vaultName=Caixa forta
|
defaults.vault.vaultName=Caixa forta
|
||||||
@@ -37,6 +35,9 @@ traymenu.vault.reveal=Mostra
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Afegir una caixa forta
|
addvaultwizard.title=Afegir una caixa forta
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Crea una caixa forta nova
|
||||||
|
addvaultwizard.welcome.existingButton=Obri una caixa forta existent
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Introduiu el nom de la caixa forta
|
addvaultwizard.new.nameInstruction=Introduiu el nom de la caixa forta
|
||||||
@@ -58,7 +59,6 @@ addvaultwizard.new.validCharacters.message=El nom de la caixa forta només pot c
|
|||||||
addvaultwizard.new.validCharacters.chars=Caràcters que formen paraules (ex.: a, ж or 수)
|
addvaultwizard.new.validCharacters.chars=Caràcters que formen paraules (ex.: a, ж or 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=Nombres
|
addvaultwizard.new.validCharacters.numbers=Nombres
|
||||||
addvaultwizard.new.validCharacters.dashes=Guionet (%s) o guió baix (%s)
|
addvaultwizard.new.validCharacters.dashes=Guionet (%s) o guió baix (%s)
|
||||||
### Expert Settings
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Crea la caixa forta
|
addvaultwizard.new.createVaultBtn=Crea la caixa forta
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=No podreu accedir a les vostres dades sense la contrasenya. Voleu crear una clau de recuperació en cas perdre la vostra contrasenya?
|
addvaultwizard.new.generateRecoveryKeyChoice=No podreu accedir a les vostres dades sense la contrasenya. Voleu crear una clau de recuperació en cas perdre la vostra contrasenya?
|
||||||
@@ -126,6 +126,7 @@ unlock.success.revealBtn=Mostra la unitat
|
|||||||
unlock.error.customPath.message=No es pot muntar la caixa forta en la ruta personalitzada
|
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.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.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
|
||||||
hub.noKeychain.message=No es pot accedir a la clau del dispositiu
|
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.
|
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.
|
||||||
@@ -348,7 +349,7 @@ main.vaultlist.contextMenu.unlock=Desbloca…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Desbloqueja ara
|
main.vaultlist.contextMenu.unlockNow=Desbloqueja ara
|
||||||
main.vaultlist.contextMenu.vaultoptions=Opcions de la caixa forta
|
main.vaultlist.contextMenu.vaultoptions=Opcions de la caixa forta
|
||||||
main.vaultlist.contextMenu.reveal=Mostra la unitat
|
main.vaultlist.contextMenu.reveal=Mostra la unitat
|
||||||
main.vaultlist.addVaultBtn=Afegir
|
main.vaultlist.addVaultBtn=Afegir una caixa forta
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Gràcies per escollir Cryptomator per protegir els vostres fitxers. Si vos cal ajuda, llegiu les nostres guies per donar els Primers passos:
|
main.vaultDetail.welcomeOnboarding=Gràcies per escollir Cryptomator per protegir els vostres fitxers. Si vos cal ajuda, llegiu les nostres guies per donar els Primers passos:
|
||||||
@@ -476,5 +477,3 @@ quit.lockAndQuitBtn=Bloqueja i surt
|
|||||||
quit.forced.message=Algunes caixes fortes no s'han pogut bloquejar
|
quit.forced.message=Algunes caixes fortes no s'han pogut bloquejar
|
||||||
quit.forced.description=No s'ha pogut blocar la caixa forta perquè hi ha operacions pendents o fitxers oberts. Podeu forçar-ne el blocatge, però heu de saber que interrompre l'entrada/sortida pot produir la pèrdua de dades.
|
quit.forced.description=No s'ha pogut blocar la caixa forta perquè hi ha operacions pendents o fitxers oberts. Podeu forçar-ne el blocatge, però heu de saber que interrompre l'entrada/sortida pot produir la pèrdua de dades.
|
||||||
quit.forced.forceAndQuitBtn=Forçar i sortir
|
quit.forced.forceAndQuitBtn=Forçar i sortir
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
@@ -20,9 +20,6 @@ error.description=Jejda! Tohle Cryptomator nečekal. Můžete najít již existu
|
|||||||
error.hyperlink.lookup=Vyhledat tuto chybu
|
error.hyperlink.lookup=Vyhledat tuto chybu
|
||||||
error.hyperlink.report=Nahlásit tuto chybu
|
error.hyperlink.report=Nahlásit tuto chybu
|
||||||
error.technicalDetails=Podrobnosti:
|
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
|
||||||
defaults.vault.vaultName=Trezor
|
defaults.vault.vaultName=Trezor
|
||||||
@@ -38,6 +35,9 @@ traymenu.vault.reveal=Zobrazit
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Přidat trezor
|
addvaultwizard.title=Přidat trezor
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Vytvořit nový trezor
|
||||||
|
addvaultwizard.welcome.existingButton=Otevřít existující trezor
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Zvolte jméno trezoru
|
addvaultwizard.new.nameInstruction=Zvolte jméno trezoru
|
||||||
@@ -59,12 +59,6 @@ addvaultwizard.new.validCharacters.message=Název trezoru může obsahovat tyto
|
|||||||
addvaultwizard.new.validCharacters.chars=Slovní znaky (např. a, ж nebo 수)
|
addvaultwizard.new.validCharacters.chars=Slovní znaky (např. a, ж nebo 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=Čísla
|
addvaultwizard.new.validCharacters.numbers=Čísla
|
||||||
addvaultwizard.new.validCharacters.dashes=Pomlčka (%s) nebo podtržítko (%s)
|
addvaultwizard.new.validCharacters.dashes=Pomlčka (%s) nebo podtržítko (%s)
|
||||||
### Expert Settings
|
|
||||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Zobrazit expertní nastavení
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Zadejte hodnotu mezi 36 a 220 (výchozí 220)
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Otevřete dokumentaci, abyste se dozvěděli více.
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.title=Maximální délka šifrovaných názvů souborů
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Platný
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Vytvořit trezor
|
addvaultwizard.new.createVaultBtn=Vytvořit trezor
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=Nebudete mít přístup k datům bez hesla. Chcete recovery klíč pro případ, že ztratíte heslo?
|
addvaultwizard.new.generateRecoveryKeyChoice=Nebudete mít přístup k datům bez hesla. Chcete recovery klíč pro případ, že ztratíte heslo?
|
||||||
@@ -129,18 +123,11 @@ unlock.success.description=Trezor "%s" byl úspěšně odemčen a nyní je dostu
|
|||||||
unlock.success.rememberChoice=Pamatovat si volbu, nezobrazovat to znovu
|
unlock.success.rememberChoice=Pamatovat si volbu, nezobrazovat to znovu
|
||||||
unlock.success.revealBtn=Zobrazit jednotku
|
unlock.success.revealBtn=Zobrazit jednotku
|
||||||
## Failure
|
## Failure
|
||||||
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.
|
|
||||||
## Hub
|
## Hub
|
||||||
hub.noKeychain.message=Nelze získat přístup ke klíči zařízení
|
|
||||||
hub.noKeychain.openBtn=Otevřít předvolby
|
hub.noKeychain.openBtn=Otevřít předvolby
|
||||||
### Waiting
|
### Waiting
|
||||||
hub.auth.message=Čekání na ověření…
|
hub.auth.message=Čekání na ověření…
|
||||||
hub.auth.description=Měli byste být automaticky přesměrováni na přihlašovací stránku.
|
|
||||||
hub.auth.loginLink=Nebyli jste přesměrováni? Klikněte zde pro otevření.
|
|
||||||
### Receive Key
|
### Receive Key
|
||||||
hub.receive.message=Zpracovávání odezvy…
|
|
||||||
### Register Device
|
### Register Device
|
||||||
hub.register.message=Je vyžadován název zařízení
|
hub.register.message=Je vyžadován název zařízení
|
||||||
hub.register.nameLabel=Název zařízení
|
hub.register.nameLabel=Název zařízení
|
||||||
@@ -155,7 +142,6 @@ hub.registerFailed.message=Pojmenování zařízení se nezdařilo
|
|||||||
hub.unauthorized.message=Přístup odepřen
|
hub.unauthorized.message=Přístup odepřen
|
||||||
hub.unauthorized.description=Vaše zařízení dosud nebylo oprávněno k přístupu k tomuto trezoru. Požádejte vlastníka trezoru, aby jej autorizoval.
|
hub.unauthorized.description=Vaše zařízení dosud nebylo oprávněno k přístupu k tomuto trezoru. Požádejte vlastníka trezoru, aby jej autorizoval.
|
||||||
### License Exceeded
|
### License Exceeded
|
||||||
hub.invalidLicense.message=Licence Hubu je neplatná
|
|
||||||
|
|
||||||
# Lock
|
# Lock
|
||||||
## Force
|
## Force
|
||||||
@@ -233,11 +219,6 @@ health.result.severityFilter.good=Dobré
|
|||||||
health.result.severityFilter.info=Informace
|
health.result.severityFilter.info=Informace
|
||||||
health.result.severityFilter.warn=Varování
|
health.result.severityFilter.warn=Varování
|
||||||
health.result.severityFilter.crit=Kritické
|
health.result.severityFilter.crit=Kritické
|
||||||
health.result.fixStateFilter.fixable=Opravitelné
|
|
||||||
health.result.fixStateFilter.notFixable=Ne opravitelné
|
|
||||||
health.result.fixStateFilter.fixing=Opravování…
|
|
||||||
health.result.fixStateFilter.fixed=Opraveno
|
|
||||||
health.result.fixStateFilter.fixFailed=Opravovaní selhalo
|
|
||||||
## Fix Application
|
## Fix Application
|
||||||
health.fix.fixBtn=Opravit
|
health.fix.fixBtn=Opravit
|
||||||
health.fix.successTip=Oprava byla úspěšná
|
health.fix.successTip=Oprava byla úspěšná
|
||||||
@@ -269,9 +250,6 @@ preferences.interface.showTrayIcon=Zobrazit ikonu v liště (vyžaduje restart)
|
|||||||
## Volume
|
## Volume
|
||||||
preferences.volume=Virtuální jednotky
|
preferences.volume=Virtuální jednotky
|
||||||
preferences.volume.type.automatic=Automatické
|
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
|
## Updates
|
||||||
preferences.updates=Aktualizace
|
preferences.updates=Aktualizace
|
||||||
preferences.updates.currentVersion=Aktuální verze: %s
|
preferences.updates.currentVersion=Aktuální verze: %s
|
||||||
@@ -294,27 +272,21 @@ stats.title=Statistika pro %s
|
|||||||
stats.cacheHitRate=Rychlost dosažené mezipaměti
|
stats.cacheHitRate=Rychlost dosažené mezipaměti
|
||||||
## Read
|
## Read
|
||||||
stats.read.throughput.idle=Čtení: nečinné
|
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.throughput.mibs=Čtení: %.2f MiB/s
|
||||||
stats.read.total.data.none=Přečteno: -
|
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.mib=Přečteno: %.1f MiB
|
||||||
stats.read.total.data.gib=Přečteno: %.1f GiB
|
stats.read.total.data.gib=Přečteno: %.1f GiB
|
||||||
stats.decr.total.data.none=Dešifrováno: -
|
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.mib=Dešifrováno: %.1f MiB
|
||||||
stats.decr.total.data.gib=Dešifrováno: %.1f GiB
|
stats.decr.total.data.gib=Dešifrováno: %.1f GiB
|
||||||
stats.read.accessCount=Celkem přečteno: %d
|
stats.read.accessCount=Celkem přečteno: %d
|
||||||
## Write
|
## Write
|
||||||
stats.write.throughput.idle=Zápis: nečinný
|
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.throughput.mibs=Zápis: %.2f MiB/s
|
||||||
stats.write.total.data.none=Zapsaná data: -
|
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.mib=Zapsáno: %.1f MiB
|
||||||
stats.write.total.data.gib=Zapsáno: %.1f GiB
|
stats.write.total.data.gib=Zapsáno: %.1f GiB
|
||||||
stats.encr.total.data.none=Zašifrováno: -
|
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.mib=Zašifrováno: %.1f MiB
|
||||||
stats.encr.total.data.gib=Zašifrováno: %.1f GiB
|
stats.encr.total.data.gib=Zašifrováno: %.1f GiB
|
||||||
stats.write.accessCount=Celkem zapsáno: %d
|
stats.write.accessCount=Celkem zapsáno: %d
|
||||||
@@ -338,7 +310,7 @@ main.vaultlist.contextMenu.unlock=Odemknout…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Odemknout nyní
|
main.vaultlist.contextMenu.unlockNow=Odemknout nyní
|
||||||
main.vaultlist.contextMenu.vaultoptions=Zobrazit možnosti trezoru
|
main.vaultlist.contextMenu.vaultoptions=Zobrazit možnosti trezoru
|
||||||
main.vaultlist.contextMenu.reveal=Zobrazit jednotku
|
main.vaultlist.contextMenu.reveal=Zobrazit jednotku
|
||||||
main.vaultlist.addVaultBtn=Přidat
|
main.vaultlist.addVaultBtn=Přidat trezor
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Děkujeme, že jste si vybrali Cryptomator pro ochranu vašich souborů. Pokud potřebujete pomoc, podívejte se na naše návody:
|
main.vaultDetail.welcomeOnboarding=Děkujeme, že jste si vybrali Cryptomator pro ochranu vašich souborů. Pokud potřebujete pomoc, podívejte se na naše návody:
|
||||||
@@ -352,16 +324,12 @@ main.vaultDetail.passwordSavedInKeychain=Heslo uloženo
|
|||||||
main.vaultDetail.unlockedStatus=ODEMKNUTO
|
main.vaultDetail.unlockedStatus=ODEMKNUTO
|
||||||
main.vaultDetail.accessLocation=Obsah vašeho trezoru je dostupný:
|
main.vaultDetail.accessLocation=Obsah vašeho trezoru je dostupný:
|
||||||
main.vaultDetail.revealBtn=Zobrazit jednotku
|
main.vaultDetail.revealBtn=Zobrazit jednotku
|
||||||
main.vaultDetail.copyUri=Kopírovat URL
|
|
||||||
main.vaultDetail.lockBtn=Zamknout
|
main.vaultDetail.lockBtn=Zamknout
|
||||||
main.vaultDetail.bytesPerSecondRead=Přečteno:
|
main.vaultDetail.bytesPerSecondRead=Přečteno:
|
||||||
main.vaultDetail.bytesPerSecondWritten=Zapsáno:
|
main.vaultDetail.bytesPerSecondWritten=Zapsáno:
|
||||||
main.vaultDetail.throughput.idle=nečinný
|
main.vaultDetail.throughput.idle=nečinný
|
||||||
main.vaultDetail.throughput.kbps=%.1f KiB/s
|
|
||||||
main.vaultDetail.throughput.mbps=%.1f MiB/s
|
main.vaultDetail.throughput.mbps=%.1f MiB/s
|
||||||
main.vaultDetail.stats=Statistiky trezoru
|
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
|
### Missing
|
||||||
main.vaultDetail.missing.info=Cryptomator nemohl najít trezor na této cestě.
|
main.vaultDetail.missing.info=Cryptomator nemohl najít trezor na této cestě.
|
||||||
main.vaultDetail.missing.recheck=Znovu zkontrolovat
|
main.vaultDetail.missing.recheck=Znovu zkontrolovat
|
||||||
@@ -407,7 +375,6 @@ vaultOptions.mount.mountPoint=Přípojný bod
|
|||||||
vaultOptions.mount.mountPoint.auto=Automaticky vybrat vhodné místo
|
vaultOptions.mount.mountPoint.auto=Automaticky vybrat vhodné místo
|
||||||
vaultOptions.mount.mountPoint.driveLetter=Použít zvolenou jednotku
|
vaultOptions.mount.mountPoint.driveLetter=Použít zvolenou jednotku
|
||||||
vaultOptions.mount.mountPoint.directoryPickerButton=Vybrat...
|
vaultOptions.mount.mountPoint.directoryPickerButton=Vybrat...
|
||||||
vaultOptions.mount.mountPoint.directoryPickerTitle=Vyberte složku
|
|
||||||
## Master Key
|
## Master Key
|
||||||
vaultOptions.masterkey=Heslo
|
vaultOptions.masterkey=Heslo
|
||||||
vaultOptions.masterkey.changePasswordBtn=Změnit heslo
|
vaultOptions.masterkey.changePasswordBtn=Změnit heslo
|
||||||
@@ -416,9 +383,6 @@ vaultOptions.masterkey.recoveryKeyExplanation=Obnovovací klíč je váš jedin
|
|||||||
vaultOptions.masterkey.showRecoveryKeyBtn=Zobrazit klíč k obnově
|
vaultOptions.masterkey.showRecoveryKeyBtn=Zobrazit klíč k obnově
|
||||||
vaultOptions.masterkey.recoverPasswordBtn=Resetovat heslo
|
vaultOptions.masterkey.recoverPasswordBtn=Resetovat heslo
|
||||||
## Hub
|
## Hub
|
||||||
vaultOptions.hub=Obnovení
|
|
||||||
vaultOptions.hub.convertInfo=V případě nouze můžete použít klíč pro obnovení k převedení tohoho trezoru na trezor s heslem.
|
|
||||||
vaultOptions.hub.convertBtn=Převést na trezor s heslem
|
|
||||||
|
|
||||||
# Recovery Key
|
# Recovery Key
|
||||||
## Display Recovery Key
|
## Display Recovery Key
|
||||||
@@ -435,7 +399,6 @@ recoveryKey.printout.heading=Obnovovací klíč Cryptomator\n"%s"\n
|
|||||||
### Reset Password
|
### Reset Password
|
||||||
recoveryKey.recover.resetBtn=Resetovat
|
recoveryKey.recover.resetBtn=Resetovat
|
||||||
### Recovery Key Password Reset Success
|
### Recovery Key Password Reset Success
|
||||||
recoveryKey.recover.resetSuccess.message=Resetování hesla bylo úspěšné
|
|
||||||
|
|
||||||
# Convert Vault
|
# Convert Vault
|
||||||
|
|
||||||
@@ -456,14 +419,3 @@ quit.title=Ukončit aplikaci
|
|||||||
quit.lockAndQuitBtn=Uzamknout a zavřít
|
quit.lockAndQuitBtn=Uzamknout a zavřít
|
||||||
|
|
||||||
# Forced Quit
|
# Forced Quit
|
||||||
quit.forced.message=Některé trezory nelze uzamknout
|
|
||||||
quit.forced.description=Uzamčení trezorů bylo zablokováno probíhajícími operacemi nebo otevřenými soubory. Můžete vynutit uzamčení zbývajících trezorů, ale přerušení I/O může mít za následek ztrátu neuložených dat.
|
|
||||||
quit.forced.forceAndQuitBtn=Vynutit a ukončit
|
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
updateReminder.title=Kontrola aktualizací
|
|
||||||
updateReminder.message=Zkontrolovat aktualizace?
|
|
||||||
updateReminder.description=Získejte aktuální informace o nových funkcích, opravách chyb a vylepšeních zabezpečení. Doporučujeme automaticky kontrolovat aktualizace.
|
|
||||||
updateReminder.notNow=Nyní ne
|
|
||||||
updateReminder.yesOnce=Ano, jednou
|
|
||||||
updateReminder.yesAutomatically=Ano, automaticky
|
|
||||||
@@ -20,8 +20,6 @@ error.description=Cryptomator forventede ikke at dette skete. Du kan gennemse ek
|
|||||||
error.hyperlink.lookup=Slå denne fejl op
|
error.hyperlink.lookup=Slå denne fejl op
|
||||||
error.hyperlink.report=Rapportér denne fejl
|
error.hyperlink.report=Rapportér denne fejl
|
||||||
error.technicalDetails=Detaljer:
|
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
|
||||||
defaults.vault.vaultName=Boks
|
defaults.vault.vaultName=Boks
|
||||||
@@ -37,6 +35,9 @@ traymenu.vault.reveal=Vis
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Tilføj boks
|
addvaultwizard.title=Tilføj boks
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Opret ny boks
|
||||||
|
addvaultwizard.welcome.existingButton=Open eksisterende boks
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Vælg et navn til boksen
|
addvaultwizard.new.nameInstruction=Vælg et navn til boksen
|
||||||
@@ -58,12 +59,6 @@ addvaultwizard.new.validCharacters.message=Boks-navnet må indeholde de følgend
|
|||||||
addvaultwizard.new.validCharacters.chars=Bogstaver (fx a, ж eller 수)
|
addvaultwizard.new.validCharacters.chars=Bogstaver (fx a, ж eller 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=Tal
|
addvaultwizard.new.validCharacters.numbers=Tal
|
||||||
addvaultwizard.new.validCharacters.dashes=Bindestreg (%s) eller understregning (%s)
|
addvaultwizard.new.validCharacters.dashes=Bindestreg (%s) eller understregning (%s)
|
||||||
### Expert Settings
|
|
||||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Aktivér ekspertindstillinger
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Indtast en værdi mellem 36 og 220 (standard 220)
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Åbn dokumentationen for at få mere at vide.
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.title=Maksimal længde af krypterede filnavne
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Gyldig
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Opret boks
|
addvaultwizard.new.createVaultBtn=Opret boks
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=Du kan ikke tilgå dine data uden din adgangskode. Vil du oprette en gendannelses-nøgle i tilfælde af, at du mister din adgangskode?
|
addvaultwizard.new.generateRecoveryKeyChoice=Du kan ikke tilgå dine data uden din adgangskode. Vil du oprette en gendannelses-nøgle i tilfælde af, at du mister din adgangskode?
|
||||||
@@ -131,6 +126,7 @@ unlock.success.revealBtn=Vis drev
|
|||||||
unlock.error.customPath.message=Kan ikke montere boks til brugerdefineret sti
|
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.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.notExists=Den brugerdefinerede monteringssti eksisterer ikke. Opret den enten i dit lokale filsystem eller skift monteringssti i boksens indstillinger.
|
||||||
|
unlock.error.customPath.description.generic=Du har valgt en brugerdefineret monteringssti til denne boks, men det mislykkedes med beskeden: %s
|
||||||
## Hub
|
## Hub
|
||||||
hub.noKeychain.message=Kan ikke tilgå enhedsnøgle
|
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.
|
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.
|
||||||
@@ -158,7 +154,7 @@ hub.registerFailed.description=Der opstod en fejl i navngivnings-processen. Kig
|
|||||||
hub.unauthorized.message=Adgang nægtet
|
hub.unauthorized.message=Adgang nægtet
|
||||||
hub.unauthorized.description=Din enhed er endnu ikke blevet godkendt til at få adgang til denne boks. Spørg boks-ejeren om godkendelse.
|
hub.unauthorized.description=Din enhed er endnu ikke blevet godkendt til at få adgang til denne boks. Spørg boks-ejeren om godkendelse.
|
||||||
### License Exceeded
|
### License Exceeded
|
||||||
hub.invalidLicense.message=Ugyldig Hub-licens
|
hub.invalidLicense.message=Ugyldig Hub licens
|
||||||
hub.invalidLicense.description=Din Cryptomator Hub har en ugyldig licens. Få venligst en Hub administrator til at opgradere eller forny licensen.
|
hub.invalidLicense.description=Din Cryptomator Hub har en ugyldig licens. Få venligst en Hub administrator til at opgradere eller forny licensen.
|
||||||
|
|
||||||
# Lock
|
# Lock
|
||||||
@@ -355,7 +351,7 @@ main.vaultlist.contextMenu.unlock=Lås op…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Lås op nu
|
main.vaultlist.contextMenu.unlockNow=Lås op nu
|
||||||
main.vaultlist.contextMenu.vaultoptions=Vis boksindstillinger
|
main.vaultlist.contextMenu.vaultoptions=Vis boksindstillinger
|
||||||
main.vaultlist.contextMenu.reveal=Vis drev
|
main.vaultlist.contextMenu.reveal=Vis drev
|
||||||
main.vaultlist.addVaultBtn=Tilføj
|
main.vaultlist.addVaultBtn=Tilføj boks
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Tak fordi du valgte Cryptomator til at beskytte dine filer. Hvis du har brug for hjælp, så tjek vores guider for at komme i gang:
|
main.vaultDetail.welcomeOnboarding=Tak fordi du valgte Cryptomator til at beskytte dine filer. Hvis du har brug for hjælp, så tjek vores guider for at komme i gang:
|
||||||
@@ -438,9 +434,6 @@ vaultOptions.masterkey.recoveryKeyExplanation=En gendannelsesnøgle er den enest
|
|||||||
vaultOptions.masterkey.showRecoveryKeyBtn=Vis gendannelsesnøgle
|
vaultOptions.masterkey.showRecoveryKeyBtn=Vis gendannelsesnøgle
|
||||||
vaultOptions.masterkey.recoverPasswordBtn=Nulstil adgangskode
|
vaultOptions.masterkey.recoverPasswordBtn=Nulstil adgangskode
|
||||||
## Hub
|
## Hub
|
||||||
vaultOptions.hub=Gendannelse
|
|
||||||
vaultOptions.hub.convertInfo=Du kan bruge gendannelsesnøglen til at konvertere denne Hub-boks til en adgangskode-baseret boks i en nødsituation.
|
|
||||||
vaultOptions.hub.convertBtn=Konvertér til adgangskodebaseret boks
|
|
||||||
|
|
||||||
# Recovery Key
|
# Recovery Key
|
||||||
## Display Recovery Key
|
## Display Recovery Key
|
||||||
@@ -452,7 +445,6 @@ recoveryKey.display.StorageHints=Opbevar den et meget sikkert sted, som fx:\n
|
|||||||
## Reset Password
|
## Reset Password
|
||||||
### Enter Recovery Key
|
### Enter Recovery Key
|
||||||
recoveryKey.recover.title=Nulstil adgangskode
|
recoveryKey.recover.title=Nulstil adgangskode
|
||||||
recoveryKey.recover.prompt=Indtast gendannelsesnøgle for "%s":
|
|
||||||
recoveryKey.recover.correctKey=Dette er en gyldig gendannelsesnøgle
|
recoveryKey.recover.correctKey=Dette er en gyldig gendannelsesnøgle
|
||||||
recoveryKey.recover.wrongKey=Denne gendannelsesnøgle tilhører en anden boks
|
recoveryKey.recover.wrongKey=Denne gendannelsesnøgle tilhører en anden boks
|
||||||
recoveryKey.recover.invalidKey=Denne gendannelsesnøgle er ikke gyldig
|
recoveryKey.recover.invalidKey=Denne gendannelsesnøgle er ikke gyldig
|
||||||
@@ -464,11 +456,6 @@ recoveryKey.recover.resetSuccess.message=Adgangskod nulstillet
|
|||||||
recoveryKey.recover.resetSuccess.description=Du kan nu låse din boks op med den nye adgangskode.
|
recoveryKey.recover.resetSuccess.description=Du kan nu låse din boks op med den nye adgangskode.
|
||||||
|
|
||||||
# Convert Vault
|
# Convert Vault
|
||||||
convertVault.title=Konvertér boks
|
|
||||||
convertVault.convert.convertBtn.before=Konvertér
|
|
||||||
convertVault.convert.convertBtn.processing=Konverterer…
|
|
||||||
convertVault.success.message=Konvertering udført
|
|
||||||
convertVault.hubToPassword.success.description=Du kan nu låse boksen op med den valgte adgangskode uden at kræve Hub adgang.
|
|
||||||
|
|
||||||
# New Password
|
# New Password
|
||||||
newPassword.promptText=Skriv en ny adgangskode
|
newPassword.promptText=Skriv en ny adgangskode
|
||||||
@@ -492,11 +479,3 @@ quit.lockAndQuitBtn=Lås og afslut
|
|||||||
quit.forced.message=Nogle bokse kunne ikke låses
|
quit.forced.message=Nogle bokse kunne ikke låses
|
||||||
quit.forced.description=Låsning af "%s" blev blokeret fordi der er igangværende operationer eller åbne filer. Du kan gennemtvinge låsningen - men en afbrydelse af igangværende I/O operationer kan resultere i tab af data som endnu ikke er gemt.
|
quit.forced.description=Låsning af "%s" blev blokeret fordi der er igangværende operationer eller åbne filer. Du kan gennemtvinge låsningen - men en afbrydelse af igangværende I/O operationer kan resultere i tab af data som endnu ikke er gemt.
|
||||||
quit.forced.forceAndQuitBtn=Tving og afslut
|
quit.forced.forceAndQuitBtn=Tving og afslut
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
updateReminder.title=Opdateringstjek
|
|
||||||
updateReminder.message=Tjek for opdateringer?
|
|
||||||
updateReminder.description=Hold dig opdateret med nye funktioner, fejlrettelser og sikkerhedsforbedringer. Vi anbefaler automatisk at søge efter opdateringer.
|
|
||||||
updateReminder.notNow=Ikke nu
|
|
||||||
updateReminder.yesOnce=Ja, én gang
|
|
||||||
updateReminder.yesAutomatically=Ja, automatisk
|
|
||||||
@@ -20,11 +20,6 @@ error.description=Cryptomator hat diesen Fehler nicht erwartet. Du kannst für i
|
|||||||
error.hyperlink.lookup=Diesen Fehler nachschlagen
|
error.hyperlink.lookup=Diesen Fehler nachschlagen
|
||||||
error.hyperlink.report=Diesen Fehler melden
|
error.hyperlink.report=Diesen Fehler melden
|
||||||
error.technicalDetails=Details:
|
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
|
||||||
defaults.vault.vaultName=Tresor
|
defaults.vault.vaultName=Tresor
|
||||||
@@ -40,8 +35,10 @@ traymenu.vault.reveal=Anzeigen
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Tresor hinzufügen
|
addvaultwizard.title=Tresor hinzufügen
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Neuen Tresor erstellen
|
||||||
|
addvaultwizard.welcome.existingButton=Bestehenden Tresor öffnen
|
||||||
## New
|
## New
|
||||||
addvaultwizard.new.title=Neuen Tresor hinzufügen
|
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Wähle einen Namen für den Tresor
|
addvaultwizard.new.nameInstruction=Wähle einen Namen für den Tresor
|
||||||
addvaultwizard.new.namePrompt=Tresorname
|
addvaultwizard.new.namePrompt=Tresorname
|
||||||
@@ -62,12 +59,6 @@ addvaultwizard.new.validCharacters.message=Der Tresorname darf folgende Zeichen
|
|||||||
addvaultwizard.new.validCharacters.chars=Wortzeichen (z. B. a, ж oder 수)
|
addvaultwizard.new.validCharacters.chars=Wortzeichen (z. B. a, ж oder 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=Zahlen
|
addvaultwizard.new.validCharacters.numbers=Zahlen
|
||||||
addvaultwizard.new.validCharacters.dashes=Bindestrich (%s) oder Unterstrich (%s)
|
addvaultwizard.new.validCharacters.dashes=Bindestrich (%s) oder Unterstrich (%s)
|
||||||
### Expert Settings
|
|
||||||
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 verschlüsselter Dateinamen
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Gültig
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Tresor erstellen
|
addvaultwizard.new.createVaultBtn=Tresor erstellen
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=Ohne dieses Passwort kannst du auf deine Daten nicht mehr zugreifen. Möchtest du für den Fall eines Passwortverlusts einen Wiederherstellungsschlüssel erstellen?
|
addvaultwizard.new.generateRecoveryKeyChoice=Ohne dieses Passwort kannst du auf deine Daten nicht mehr zugreifen. Möchtest du für den Fall eines Passwortverlusts einen Wiederherstellungsschlüssel erstellen?
|
||||||
@@ -91,7 +82,6 @@ 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.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.
|
addvault.new.readme.accessLocation.4=Du kannst diese Datei löschen.
|
||||||
## Existing
|
## Existing
|
||||||
addvaultwizard.existing.title=Bestehenden Tresor hinzufügen
|
|
||||||
addvaultwizard.existing.instruction=Wähle die Datei „vault.cryptomator“ deines bestehenden Tresors aus. Falls nur eine Datei mit der Bezeichnung „masterkey.cryptomator“ vorhanden ist, nutze stattdessen diese.
|
addvaultwizard.existing.instruction=Wähle die Datei „vault.cryptomator“ deines bestehenden Tresors aus. Falls nur eine Datei mit der Bezeichnung „masterkey.cryptomator“ vorhanden ist, nutze stattdessen diese.
|
||||||
addvaultwizard.existing.chooseBtn=Durchsuchen …
|
addvaultwizard.existing.chooseBtn=Durchsuchen …
|
||||||
addvaultwizard.existing.filePickerTitle=Tresordatei auswählen
|
addvaultwizard.existing.filePickerTitle=Tresordatei auswählen
|
||||||
@@ -133,14 +123,10 @@ unlock.success.description=Der Inhalt des Tresors „%s“ ist nun über dessen
|
|||||||
unlock.success.rememberChoice=Auswahl merken und nicht mehr fragen
|
unlock.success.rememberChoice=Auswahl merken und nicht mehr fragen
|
||||||
unlock.success.revealBtn=Laufwerk anzeigen
|
unlock.success.revealBtn=Laufwerk anzeigen
|
||||||
## Failure
|
## Failure
|
||||||
unlock.error.customPath.message=Tresor kann nicht in benutzerdefinierten Pfad eingehängt werden
|
unlock.error.customPath.message=Tresor kann nicht an 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.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.notExists=Der benutzerdefinierte Einhängepunkt existiert nicht. Entweder erstelle ihn in deinem lokalen Dateisystem oder ändere ihn in den Tresor-Optionen.
|
||||||
unlock.error.customPath.description.inUse=Der Laufwerksbuchstabe oder benutzerdefinierte Einhängepunkt „%s“ wird bereits verwendet.
|
unlock.error.customPath.description.generic=Du hast für diesen Tresor einen benutzerdefinierten Einhängepunkt ausgewählt, aber die Verwendung ist fehlgeschlagen mit der Meldung: %s
|
||||||
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
|
||||||
hub.noKeychain.message=Zugriff auf Geräteschlüssel nicht möglich
|
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.
|
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.
|
||||||
@@ -169,7 +155,7 @@ hub.unauthorized.message=Zugriff verweigert
|
|||||||
hub.unauthorized.description=Dein Gerät wurde noch nicht für den Zugriff auf diesen Tresor autorisiert. Bitte den Tresorbesitzer, dein Gerät zu autorisieren.
|
hub.unauthorized.description=Dein Gerät wurde noch nicht für den Zugriff auf diesen Tresor autorisiert. Bitte den Tresorbesitzer, dein Gerät zu autorisieren.
|
||||||
### License Exceeded
|
### License Exceeded
|
||||||
hub.invalidLicense.message=Hub-Lizenz ungültig
|
hub.invalidLicense.message=Hub-Lizenz ungültig
|
||||||
hub.invalidLicense.description=Die Lizenz deiner Cryptomator-Hub-Instanz ist ungültig. Bitte informiere deinen Hub-Administrator, um die Lizenz zu erweitern oder zu erneuern.
|
hub.invalidLicense.description=Die Lizenz für deine Cryptomator Hub-Instanz ist ungültig. Bitte informiere einen Hub-Administrator, um die Lizenz zu aktualisieren oder zu erneuern.
|
||||||
|
|
||||||
# Lock
|
# Lock
|
||||||
## Force
|
## Force
|
||||||
@@ -186,8 +172,8 @@ migration.title=Tresor upgraden
|
|||||||
## Start
|
## Start
|
||||||
migration.start.header=Tresor upgraden
|
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.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=Dieses Upgrade kann nicht rückgängig gemacht werden.
|
migration.start.remarkUndone=Diese Aktualisierung kann nicht rückgängig gemacht werden.
|
||||||
migration.start.remarkVersions=Ältere Versionen von Cryptomator können den aktualisierten Tresor nicht öffnen.
|
migration.start.remarkVersions=Ältere Versionen von Cryptomator werden den aktualisierten Tresor nicht öffnen können.
|
||||||
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.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.
|
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.
|
||||||
migration.start.confirm=Ich habe die oben genannten Informationen gelesen und verstanden
|
migration.start.confirm=Ich habe die oben genannten Informationen gelesen und verstanden
|
||||||
@@ -294,9 +280,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.fuseRestartRequired=Um die Änderungen anzuwenden, muss Cryptomator neu gestartet werden.
|
||||||
preferences.volume.tcp.port=TCP-Port
|
preferences.volume.tcp.port=TCP-Port
|
||||||
preferences.volume.supportedFeatures=Der gewählte Laufwerkstyp unterstützt folgende Funktionen:
|
preferences.volume.supportedFeatures=Der gewählte Laufwerkstyp unterstützt folgende Funktionen:
|
||||||
preferences.volume.feature.mountAuto=Automatische Auswahl des Einhängepunkts
|
preferences.volume.feature.mountAuto=Automatische Einhängepunkt Auswahl
|
||||||
preferences.volume.feature.mountToDir=Benutzerdefiniertes Verzeichnis als Einhängepunkt
|
preferences.volume.feature.mountToDir=Benutzerdefiniertes Verzeichnis als Einhängepunkt
|
||||||
preferences.volume.feature.mountToDriveLetter=Laufwerksbuchstabe als Einhängepunkt
|
preferences.volume.feature.mountToDriveLetter=Laufwerkbuchstaben als Einhängepunkt
|
||||||
preferences.volume.feature.mountFlags=Benutzerdefinierte Einhänge-Optionen
|
preferences.volume.feature.mountFlags=Benutzerdefinierte Einhänge-Optionen
|
||||||
preferences.volume.feature.readOnly=Schreibgeschütztes Einhängen
|
preferences.volume.feature.readOnly=Schreibgeschütztes Einhängen
|
||||||
## Updates
|
## Updates
|
||||||
@@ -348,7 +334,7 @@ stats.write.accessCount=Schreibzugriffe: %d
|
|||||||
|
|
||||||
## Accesses
|
## Accesses
|
||||||
stats.access.current=Zugriffe: %d
|
stats.access.current=Zugriffe: %d
|
||||||
stats.access.total=Gesamtzugriffe: %d
|
stats.access.total=Gesamte Zugriffe: %d
|
||||||
|
|
||||||
|
|
||||||
# Main Window
|
# Main Window
|
||||||
@@ -365,9 +351,7 @@ main.vaultlist.contextMenu.unlock=Entsperren …
|
|||||||
main.vaultlist.contextMenu.unlockNow=Jetzt entsperren
|
main.vaultlist.contextMenu.unlockNow=Jetzt entsperren
|
||||||
main.vaultlist.contextMenu.vaultoptions=Tresoroptionen anzeigen
|
main.vaultlist.contextMenu.vaultoptions=Tresoroptionen anzeigen
|
||||||
main.vaultlist.contextMenu.reveal=Laufwerk anzeigen
|
main.vaultlist.contextMenu.reveal=Laufwerk anzeigen
|
||||||
main.vaultlist.addVaultBtn=Hinzufügen
|
main.vaultlist.addVaultBtn=Tresor hinzufügen
|
||||||
main.vaultlist.addVaultBtn.menuItemNew=Neuer Tresor …
|
|
||||||
main.vaultlist.addVaultBtn.menuItemExisting=Bestehender Tresor …
|
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Danke, dass du zum Schutz deiner Dateien Cryptomator gewählt hast. Falls du Hilfe brauchst, schau dir unsere Anleitungen an:
|
main.vaultDetail.welcomeOnboarding=Danke, dass du zum Schutz deiner Dateien Cryptomator gewählt hast. Falls du Hilfe brauchst, schau dir unsere Anleitungen an:
|
||||||
@@ -439,9 +423,9 @@ vaultOptions.mount.winDriveLetterOccupied=belegt
|
|||||||
vaultOptions.mount.mountPoint=Einhängepunkt
|
vaultOptions.mount.mountPoint=Einhängepunkt
|
||||||
vaultOptions.mount.mountPoint.auto=Automatisch einen geeigneten Ort auswählen
|
vaultOptions.mount.mountPoint.auto=Automatisch einen geeigneten Ort auswählen
|
||||||
vaultOptions.mount.mountPoint.driveLetter=Laufwerksbuchstaben zuweisen
|
vaultOptions.mount.mountPoint.driveLetter=Laufwerksbuchstaben zuweisen
|
||||||
vaultOptions.mount.mountPoint.custom=Gewähltes Verzeichnis verwenden
|
vaultOptions.mount.mountPoint.custom=Ausgewähltes Verzeichnis verwenden
|
||||||
vaultOptions.mount.mountPoint.directoryPickerButton=Durchsuchen …
|
vaultOptions.mount.mountPoint.directoryPickerButton=Durchsuchen …
|
||||||
vaultOptions.mount.mountPoint.directoryPickerTitle=Wähle ein Verzeichnis
|
vaultOptions.mount.mountPoint.directoryPickerTitle=Verzeichnis wählen
|
||||||
## Master Key
|
## Master Key
|
||||||
vaultOptions.masterkey=Passwort
|
vaultOptions.masterkey=Passwort
|
||||||
vaultOptions.masterkey.changePasswordBtn=Passwort ändern
|
vaultOptions.masterkey.changePasswordBtn=Passwort ändern
|
||||||
@@ -452,7 +436,7 @@ vaultOptions.masterkey.recoverPasswordBtn=Passwort zurücksetzen
|
|||||||
## Hub
|
## Hub
|
||||||
vaultOptions.hub=Wiederherstellung
|
vaultOptions.hub=Wiederherstellung
|
||||||
vaultOptions.hub.convertInfo=Im Notfall kannst du den Wiederherstellungsschlüssel verwenden, um diesen Hub-Tresor in einen passwortgeschützten Tresor umzuwandeln.
|
vaultOptions.hub.convertInfo=Im Notfall kannst du den Wiederherstellungsschlüssel verwenden, um diesen Hub-Tresor in einen passwortgeschützten Tresor umzuwandeln.
|
||||||
vaultOptions.hub.convertBtn=In passwortgeschützten Tresor umwandeln
|
vaultOptions.hub.convertBtn=In einen passwortgeschützten Tresor umwandeln
|
||||||
|
|
||||||
# Recovery Key
|
# Recovery Key
|
||||||
## Display Recovery Key
|
## Display Recovery Key
|
||||||
@@ -464,7 +448,7 @@ recoveryKey.display.StorageHints=Bewahre ihn möglichst sicher auf, z. B.\n •
|
|||||||
## Reset Password
|
## Reset Password
|
||||||
### Enter Recovery Key
|
### Enter Recovery Key
|
||||||
recoveryKey.recover.title=Passwort zurücksetzen
|
recoveryKey.recover.title=Passwort zurücksetzen
|
||||||
recoveryKey.recover.prompt=Gib den Wiederherstellungsschlüssel für „%s“ ein:
|
recoveryKey.recover.prompt=Gib den Wiederherstellungsschlüssel für "%s" ein:
|
||||||
recoveryKey.recover.correctKey=Dieser Wiederherstellungsschlüssel ist gültig
|
recoveryKey.recover.correctKey=Dieser Wiederherstellungsschlüssel ist gültig
|
||||||
recoveryKey.recover.wrongKey=Dieser Wiederherstellungsschlüssel gehört zu einem anderen Tresor
|
recoveryKey.recover.wrongKey=Dieser Wiederherstellungsschlüssel gehört zu einem anderen Tresor
|
||||||
recoveryKey.recover.invalidKey=Dieser Wiederherstellungsschlüssel ist ungültig
|
recoveryKey.recover.invalidKey=Dieser Wiederherstellungsschlüssel ist ungültig
|
||||||
@@ -476,11 +460,11 @@ recoveryKey.recover.resetSuccess.message=Passwort erfolgreich zurückgesetzt
|
|||||||
recoveryKey.recover.resetSuccess.description=Du kannst deinen Tresor mit dem neuen Passwort entsperren.
|
recoveryKey.recover.resetSuccess.description=Du kannst deinen Tresor mit dem neuen Passwort entsperren.
|
||||||
|
|
||||||
# Convert Vault
|
# Convert Vault
|
||||||
convertVault.title=Tresor umwandeln
|
convertVault.title=Tresor konvertieren
|
||||||
convertVault.convert.convertBtn.before=Konvertieren
|
convertVault.convert.convertBtn.before=Konvertieren
|
||||||
convertVault.convert.convertBtn.processing=Wird umgewandelt…
|
convertVault.convert.convertBtn.processing=Konvertierung läuft…
|
||||||
convertVault.success.message=Umwandlung erfolgreich
|
convertVault.success.message=Konvertierung erfolgreich
|
||||||
convertVault.hubToPassword.success.description=Du kannst nun den Tresor mit dem gewählten Passwort entsperren, ohne Hub-Zugriff zu benötigen.
|
convertVault.hubToPassword.success.description=Du kannst nun den Tresor mit dem gewählten Passwort entsperren, ohne Hub Zugriff zu benötigen.
|
||||||
|
|
||||||
# New Password
|
# New Password
|
||||||
newPassword.promptText=Gib ein neues Passwort ein
|
newPassword.promptText=Gib ein neues Passwort ein
|
||||||
@@ -504,11 +488,3 @@ quit.lockAndQuitBtn=Sperren und beenden
|
|||||||
quit.forced.message=Einige Tresore konnten nicht gesperrt werden
|
quit.forced.message=Einige Tresore konnten nicht gesperrt werden
|
||||||
quit.forced.description=Das Sperren von Tresoren wurde durch ausstehende Operationen oder geöffnete Dateien verhindert. Du kannst das Sperren der verbleibenden Tresore erzwingen, jedoch kann das Unterbrechen von E/A-Vorgängen zum Verlust ungespeicherter Daten führen.
|
quit.forced.description=Das Sperren von Tresoren wurde durch ausstehende Operationen oder geöffnete Dateien verhindert. Du kannst das Sperren der verbleibenden Tresore erzwingen, jedoch kann das Unterbrechen von E/A-Vorgängen zum Verlust ungespeicherter Daten führen.
|
||||||
quit.forced.forceAndQuitBtn=Erzwingen und beenden
|
quit.forced.forceAndQuitBtn=Erzwingen und beenden
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
updateReminder.title=Update-Überprüfung
|
|
||||||
updateReminder.message=Nach Updates suchen?
|
|
||||||
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
|
|
||||||
@@ -20,11 +20,6 @@ error.description=Ωχ! Το Cryptomator δεν περίμενε να συμβε
|
|||||||
error.hyperlink.lookup=Αναζήτηση αυτού του σφάλματος
|
error.hyperlink.lookup=Αναζήτηση αυτού του σφάλματος
|
||||||
error.hyperlink.report=Αναφέρετε αυτό το σφάλμα
|
error.hyperlink.report=Αναφέρετε αυτό το σφάλμα
|
||||||
error.technicalDetails=Λεπτομέρειες:
|
error.technicalDetails=Λεπτομέρειες:
|
||||||
error.existingSolutionDescription=Το Cryptomator δεν περίμενε ότι θα συμβεί αυτό. Αλλά βρήκαμε μια υπάρχουσα λύση για αυτό το σφάλμα. Ρίξτε μια ματιά στον παρακάτω σύνδεσμο.
|
|
||||||
error.hyperlink.solution=Αναζήτηση της λύσης
|
|
||||||
error.lookupPermissionMessage=Το Cryptomator μπορεί να αναζητήσει μια λύση για αυτό το πρόβλημα στο διαδίκτυο. Αυτό θα στείλει ένα αίτημα στη βάση δεδομένων προβλημάτων μας από τη διεύθυνση IP σας.
|
|
||||||
error.dismiss=Παράβλεψη
|
|
||||||
error.lookUpSolution=Αναζήτηση λύσης
|
|
||||||
|
|
||||||
# Defaults
|
# Defaults
|
||||||
defaults.vault.vaultName=Κρύπτη
|
defaults.vault.vaultName=Κρύπτη
|
||||||
@@ -40,8 +35,10 @@ traymenu.vault.reveal=Αποκάλυψη
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Προσθήκη Κρύπτης
|
addvaultwizard.title=Προσθήκη Κρύπτης
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Δημιουργία Νέας Κρύπτης
|
||||||
|
addvaultwizard.welcome.existingButton=Άνοιγμα Υπάρχοντος Κρύπτης
|
||||||
## New
|
## New
|
||||||
addvaultwizard.new.title=Προσθήκη Νέας Κρύπτης
|
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Διαλέξτε ένα όνομα για την κρύπτη
|
addvaultwizard.new.nameInstruction=Διαλέξτε ένα όνομα για την κρύπτη
|
||||||
addvaultwizard.new.namePrompt=Όνομα Κρύπτης
|
addvaultwizard.new.namePrompt=Όνομα Κρύπτης
|
||||||
@@ -62,12 +59,6 @@ addvaultwizard.new.validCharacters.message=Το όνομα κρύπτης μπο
|
|||||||
addvaultwizard.new.validCharacters.chars=Χαρακτήρες λέξεων (πχ, a, ж or 수)
|
addvaultwizard.new.validCharacters.chars=Χαρακτήρες λέξεων (πχ, a, ж or 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=Αριθμοί
|
addvaultwizard.new.validCharacters.numbers=Αριθμοί
|
||||||
addvaultwizard.new.validCharacters.dashes=Παύλα (%s) ή κάτω παύλα (%s)
|
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
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Δημιουργία Κρύπτης
|
addvaultwizard.new.createVaultBtn=Δημιουργία Κρύπτης
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=Δεν θα μπορείτε να έχετε πρόσβαση στα δεδομένα σας χωρίς τον κωδικό σας. Θέλετε να δημιουργηθεί ένα κλειδί ανάκτησης στην περίπτωση που χάσετε τον κωδικό σας;
|
addvaultwizard.new.generateRecoveryKeyChoice=Δεν θα μπορείτε να έχετε πρόσβαση στα δεδομένα σας χωρίς τον κωδικό σας. Θέλετε να δημιουργηθεί ένα κλειδί ανάκτησης στην περίπτωση που χάσετε τον κωδικό σας;
|
||||||
@@ -91,7 +82,6 @@ addvault.new.readme.accessLocation.2=Αυτή είναι η τοποθεσία
|
|||||||
addvault.new.readme.accessLocation.3=Κάθε αρχείο που θα προστεθεί σε αυτό τον τόμο θα κωδικοποιηθεί από το Cryptomator. Μπορείτε να το επεξεργαστείτε όπως θα κάνατε σε κάθε δίσκο/φάκελο. Αυτή είναι μόνο για αποκρυπτογραφημένη μορφή των περιεχομένων του, τα αρχεία σας μένουν κωδικοποιημένα στον σκληρό σας δίσκο συνέχεια.
|
addvault.new.readme.accessLocation.3=Κάθε αρχείο που θα προστεθεί σε αυτό τον τόμο θα κωδικοποιηθεί από το Cryptomator. Μπορείτε να το επεξεργαστείτε όπως θα κάνατε σε κάθε δίσκο/φάκελο. Αυτή είναι μόνο για αποκρυπτογραφημένη μορφή των περιεχομένων του, τα αρχεία σας μένουν κωδικοποιημένα στον σκληρό σας δίσκο συνέχεια.
|
||||||
addvault.new.readme.accessLocation.4=Μπορείτε ελεύθερα να αφαιρέσετε το αρχείο.
|
addvault.new.readme.accessLocation.4=Μπορείτε ελεύθερα να αφαιρέσετε το αρχείο.
|
||||||
## Existing
|
## Existing
|
||||||
addvaultwizard.existing.title=Προσθήκη Υπάρχοντος Κρύπτης
|
|
||||||
addvaultwizard.existing.instruction=Επιλέξτε το αρχείο "vault.cryptomator" της υπάρχοντος κρύπτης. Αν υπάρχει μόνο ένα αρχείο με όνομα "masterkey.cryptomator", επιλέξτε αυτό.
|
addvaultwizard.existing.instruction=Επιλέξτε το αρχείο "vault.cryptomator" της υπάρχοντος κρύπτης. Αν υπάρχει μόνο ένα αρχείο με όνομα "masterkey.cryptomator", επιλέξτε αυτό.
|
||||||
addvaultwizard.existing.chooseBtn=Επιλογή…
|
addvaultwizard.existing.chooseBtn=Επιλογή…
|
||||||
addvaultwizard.existing.filePickerTitle=Επιλέξτε Αρχείο Κρύπτης
|
addvaultwizard.existing.filePickerTitle=Επιλέξτε Αρχείο Κρύπτης
|
||||||
@@ -136,11 +126,7 @@ unlock.success.revealBtn=Αποκάλυψη εικονικού δίσκου
|
|||||||
unlock.error.customPath.message=Αδυναμία προσάρτησης της κρύπτης στην προσαρμοσμένη διαδρομή
|
unlock.error.customPath.message=Αδυναμία προσάρτησης της κρύπτης στην προσαρμοσμένη διαδρομή
|
||||||
unlock.error.customPath.description.notSupported=Εάν θέλετε να συνεχίσετε να χρησιμοποιείτε την προσαρμοσμένη διαδρομή, μεταβείτε στις προτιμήσεις και επιλέξτε έναν τύπο τόμου που την υποστηρίζει. Διαφορετικά, μεταβείτε στις επιλογές της κρύπτης και επιλέξτε ένα υποστηριζόμενο σημείο προσάρτησης.
|
unlock.error.customPath.description.notSupported=Εάν θέλετε να συνεχίσετε να χρησιμοποιείτε την προσαρμοσμένη διαδρομή, μεταβείτε στις προτιμήσεις και επιλέξτε έναν τύπο τόμου που την υποστηρίζει. Διαφορετικά, μεταβείτε στις επιλογές της κρύπτης και επιλέξτε ένα υποστηριζόμενο σημείο προσάρτησης.
|
||||||
unlock.error.customPath.description.notExists=Η προσαρμοσμένη διαδρομή προσάρτησης δεν υπάρχει. Είτε δημιουργήστε την στο τοπικό σύστημα αρχείων σας είτε αλλάξτε την στις επιλογές κρύπτης.
|
unlock.error.customPath.description.notExists=Η προσαρμοσμένη διαδρομή προσάρτησης δεν υπάρχει. Είτε δημιουργήστε την στο τοπικό σύστημα αρχείων σας είτε αλλάξτε την στις επιλογές κρύπτης.
|
||||||
unlock.error.customPath.description.inUse=Το γράμμα μονάδας δίσκου ή προσαρμοσμένη διαδρομή προσάρτησης "%s" είναι ήδη σε χρήση.
|
unlock.error.customPath.description.generic=Έχετε επιλέξει μια προσαρμοσμένη διαδρομή προσάρτησης για αυτή την κρύπτη, αλλά η χρήση της απέτυχε με το μήνυμα: %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
|
||||||
hub.noKeychain.message=Δεν είναι δυνατή η πρόσβαση στο κλειδί της συσκευής
|
hub.noKeychain.message=Δεν είναι δυνατή η πρόσβαση στο κλειδί της συσκευής
|
||||||
hub.noKeychain.description=Για να ξεκλειδώσετε τις κρύπτες Hub, απαιτείται ένα κλειδί συσκευής, το οποίο ασφαλίζεται με χρήση μπρελόκ. Για να συνεχίσετε, ενεργοποιήστε το "%s" και επιλέξτε ένα keychain στις προτιμήσεις.
|
hub.noKeychain.description=Για να ξεκλειδώσετε τις κρύπτες Hub, απαιτείται ένα κλειδί συσκευής, το οποίο ασφαλίζεται με χρήση μπρελόκ. Για να συνεχίσετε, ενεργοποιήστε το "%s" και επιλέξτε ένα keychain στις προτιμήσεις.
|
||||||
@@ -365,9 +351,7 @@ main.vaultlist.contextMenu.unlock=Ξεκλείδωμα…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Ξεκλείδωμα τώρα
|
main.vaultlist.contextMenu.unlockNow=Ξεκλείδωμα τώρα
|
||||||
main.vaultlist.contextMenu.vaultoptions=Εμφάνιση επιλογών Vault
|
main.vaultlist.contextMenu.vaultoptions=Εμφάνιση επιλογών Vault
|
||||||
main.vaultlist.contextMenu.reveal=Αποκάλυψη εικονικού δίσκου
|
main.vaultlist.contextMenu.reveal=Αποκάλυψη εικονικού δίσκου
|
||||||
main.vaultlist.addVaultBtn=Προσθήκη
|
main.vaultlist.addVaultBtn=Προσθήκη Κρύπτης
|
||||||
main.vaultlist.addVaultBtn.menuItemNew=Νέα Κρύπτη...
|
|
||||||
main.vaultlist.addVaultBtn.menuItemExisting=Υπάρχουσα Κρύπτη...
|
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Ευχαριστούμε που επιλέξατε το Cryptomator για να προστατεύσετε τα αρχεία σας. Αν χρειάζεστε οποιαδήποτε βοήθεια, ελέγξτε τους οδηγούς για αρχάριους:
|
main.vaultDetail.welcomeOnboarding=Ευχαριστούμε που επιλέξατε το Cryptomator για να προστατεύσετε τα αρχεία σας. Αν χρειάζεστε οποιαδήποτε βοήθεια, ελέγξτε τους οδηγούς για αρχάριους:
|
||||||
@@ -504,11 +488,3 @@ quit.lockAndQuitBtn=Κλείδωμα και Έξοδος
|
|||||||
quit.forced.message=Δεν ήταν δυνατό να κλειδωθούν ορισμένες κρύπτες
|
quit.forced.message=Δεν ήταν δυνατό να κλειδωθούν ορισμένες κρύπτες
|
||||||
quit.forced.description=Το κλείδωμα κρυπτών αποκλείστηκε από εκκρεμείς ενέργειες ή από ανοιχτά αρχεία. Μπορείτε να αναγκάσετε το κλείδωμα εναπομείναντων θησαυροφυλάκων, ωστόσο η διακοπή I/O μπορεί να οδηγήσει στην απώλεια μη αποθηκευμένων δεδομένων.
|
quit.forced.description=Το κλείδωμα κρυπτών αποκλείστηκε από εκκρεμείς ενέργειες ή από ανοιχτά αρχεία. Μπορείτε να αναγκάσετε το κλείδωμα εναπομείναντων θησαυροφυλάκων, ωστόσο η διακοπή I/O μπορεί να οδηγήσει στην απώλεια μη αποθηκευμένων δεδομένων.
|
||||||
quit.forced.forceAndQuitBtn=Εξαναγκασμός και Έξοδος
|
quit.forced.forceAndQuitBtn=Εξαναγκασμός και Έξοδος
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
updateReminder.title=Έλεγχος Ενημερώσεων
|
|
||||||
updateReminder.message=Έλεγχος για ενημερώσεις;
|
|
||||||
updateReminder.description=Μείνετε ενημερωμένοι με νέες δυνατότητες, διορθώσεις σφαλμάτων και βελτιώσεις ασφάλειας. Συνιστούμε τον αυτόματο έλεγχο για ενημερώσεις.
|
|
||||||
updateReminder.notNow=Όχι Τώρα
|
|
||||||
updateReminder.yesOnce=Ναι, Μία Φορά
|
|
||||||
updateReminder.yesAutomatically=Ναι, Αυτόματα
|
|
||||||
@@ -20,11 +20,6 @@ error.description=Cryptomator no esperaba que esto sucediera. Puede buscar soluc
|
|||||||
error.hyperlink.lookup=Buscar este error
|
error.hyperlink.lookup=Buscar este error
|
||||||
error.hyperlink.report=Notificar este error
|
error.hyperlink.report=Notificar este error
|
||||||
error.technicalDetails=Detalles:
|
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
|
||||||
defaults.vault.vaultName=Bóveda
|
defaults.vault.vaultName=Bóveda
|
||||||
@@ -40,8 +35,10 @@ traymenu.vault.reveal=Revelar
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Añadir bóveda
|
addvaultwizard.title=Añadir bóveda
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Crear bóveda nueva
|
||||||
|
addvaultwizard.welcome.existingButton=Abrir bóveda existente
|
||||||
## New
|
## New
|
||||||
addvaultwizard.new.title=Añadir nueva bóveda
|
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Elegir un nombre para la bóveda
|
addvaultwizard.new.nameInstruction=Elegir un nombre para la bóveda
|
||||||
addvaultwizard.new.namePrompt=Nombre de la bóveda
|
addvaultwizard.new.namePrompt=Nombre de la bóveda
|
||||||
@@ -62,12 +59,6 @@ addvaultwizard.new.validCharacters.message=El nombre de la bóveda puede contene
|
|||||||
addvaultwizard.new.validCharacters.chars=Caracteres de la palabra (por ejemplo, a, ж o 수)
|
addvaultwizard.new.validCharacters.chars=Caracteres de la palabra (por ejemplo, a, ж o 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=Números
|
addvaultwizard.new.validCharacters.numbers=Números
|
||||||
addvaultwizard.new.validCharacters.dashes=Guion (%s) o subrayado (%s)
|
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
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Crear bóveda
|
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?
|
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?
|
||||||
@@ -91,7 +82,6 @@ addvault.new.readme.accessLocation.2=Este es el lugar de acceso de la bóveda.
|
|||||||
addvault.new.readme.accessLocation.3=Los archivos agregados a este volumen serán cifrados por Cryptomator. Se puede trabajar con ellos como en cualquier otra unidad/carpeta. Esta es sólo una vista descifrada del contenido, sus archivos permanecen cifrados en el disco duro todo el tiempo.
|
addvault.new.readme.accessLocation.3=Los archivos agregados a este volumen serán cifrados por Cryptomator. Se puede trabajar con ellos como en cualquier otra unidad/carpeta. Esta es sólo una vista descifrada del contenido, sus archivos permanecen cifrados en el disco duro todo el tiempo.
|
||||||
addvault.new.readme.accessLocation.4=No dude en eliminar este archivo.
|
addvault.new.readme.accessLocation.4=No dude en eliminar este archivo.
|
||||||
## Existing
|
## Existing
|
||||||
addvaultwizard.existing.title=Añadir bóveda existente
|
|
||||||
addvaultwizard.existing.instruction=Elija el archivo "vault.cryptomator" de su bóveda existente. Si solo existe un archivo llamado "masterkey.cryptomator", selecciónelo en su lugar.
|
addvaultwizard.existing.instruction=Elija el archivo "vault.cryptomator" de su bóveda existente. Si solo existe un archivo llamado "masterkey.cryptomator", selecciónelo en su lugar.
|
||||||
addvaultwizard.existing.chooseBtn=Elegir…
|
addvaultwizard.existing.chooseBtn=Elegir…
|
||||||
addvaultwizard.existing.filePickerTitle=Seleccionar archivo de bóveda
|
addvaultwizard.existing.filePickerTitle=Seleccionar archivo de bóveda
|
||||||
@@ -136,11 +126,7 @@ unlock.success.revealBtn=Revelar unidad
|
|||||||
unlock.error.customPath.message=No se puede montar la bóveda en la ruta personalizada
|
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.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.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 unidad o ruta de montaje personalizada "%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.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
|
||||||
hub.noKeychain.message=No se puede acceder a la clave del dispositivo
|
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.
|
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.
|
||||||
@@ -178,7 +164,7 @@ lock.forced.description=El bloqueo de "%s" fue bloqueado por operaciones pendien
|
|||||||
lock.forced.retryBtn=Reintentar
|
lock.forced.retryBtn=Reintentar
|
||||||
lock.forced.forceBtn=Forzar bloqueo
|
lock.forced.forceBtn=Forzar bloqueo
|
||||||
## Failure
|
## Failure
|
||||||
lock.fail.message=Error al bloquear la bóveda
|
lock.fail.message=Error al bloquear la bóveda.
|
||||||
lock.fail.description=No se pudo bloquear la bóveda "%s". Asegúrese de que el trabajo no guardado se ha guardado en otro lugar y las operaciones de lectura/escritura importantes han finalizado. Para cerrar la bóveda termine el proceso de Cryptomator.
|
lock.fail.description=No se pudo bloquear la bóveda "%s". Asegúrese de que el trabajo no guardado se ha guardado en otro lugar y las operaciones de lectura/escritura importantes han finalizado. Para cerrar la bóveda termine el proceso de Cryptomator.
|
||||||
|
|
||||||
# Migration
|
# Migration
|
||||||
@@ -365,9 +351,7 @@ main.vaultlist.contextMenu.unlock=Desbloquear…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Desbloquear ahora
|
main.vaultlist.contextMenu.unlockNow=Desbloquear ahora
|
||||||
main.vaultlist.contextMenu.vaultoptions=Mostrar opciones de la bóveda
|
main.vaultlist.contextMenu.vaultoptions=Mostrar opciones de la bóveda
|
||||||
main.vaultlist.contextMenu.reveal=Revelar unidad
|
main.vaultlist.contextMenu.reveal=Revelar unidad
|
||||||
main.vaultlist.addVaultBtn=Añadir
|
main.vaultlist.addVaultBtn=Añadir bóveda
|
||||||
main.vaultlist.addVaultBtn.menuItemNew=Nueva bóveda...
|
|
||||||
main.vaultlist.addVaultBtn.menuItemExisting=Bóveda existente...
|
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Gracias por elegir Cryptomator para proteger sus archivos. En caso de necesitar ayuda, revise nuestras guías:
|
main.vaultDetail.welcomeOnboarding=Gracias por elegir Cryptomator para proteger sus archivos. En caso de necesitar ayuda, revise nuestras guías:
|
||||||
@@ -504,11 +488,3 @@ quit.lockAndQuitBtn=Bloquear y salir
|
|||||||
quit.forced.message=Algunas bóvedas no pudieron ser bloqueadas
|
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.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
|
quit.forced.forceAndQuitBtn=Forzar y salir
|
||||||
|
|
||||||
# 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
|
|
||||||
@@ -30,6 +30,9 @@ traymenu.vault.reveal=ظاهر
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=اضافه کردن گاوصندوق
|
addvaultwizard.title=اضافه کردن گاوصندوق
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=ساخت گاوصندوق جدید
|
||||||
|
addvaultwizard.welcome.existingButton=باز کردن گاوصندوق موجود
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=یک نام برای گاوصندوق انتخاب کنید
|
addvaultwizard.new.nameInstruction=یک نام برای گاوصندوق انتخاب کنید
|
||||||
@@ -40,7 +43,6 @@ addvaultwizard.new.directoryPickerLabel=مکان سفارشی
|
|||||||
addvaultwizard.new.directoryPickerButton=انتخاب کنید…
|
addvaultwizard.new.directoryPickerButton=انتخاب کنید…
|
||||||
addvaultwizard.new.fileAlreadyExists=در حال حاضر یک فایل یا پوشه با همین نام وجود دارد
|
addvaultwizard.new.fileAlreadyExists=در حال حاضر یک فایل یا پوشه با همین نام وجود دارد
|
||||||
addvaultwizard.new.validCharacters.numbers=اعداد
|
addvaultwizard.new.validCharacters.numbers=اعداد
|
||||||
### Expert Settings
|
|
||||||
### Password
|
### Password
|
||||||
### Information
|
### Information
|
||||||
## Existing
|
## Existing
|
||||||
@@ -109,6 +111,7 @@ main.closeBtn.tooltip=ببند
|
|||||||
main.supporterCertificateMissing.tooltip=لطفا کمک مالی در نظر بگیرند
|
main.supporterCertificateMissing.tooltip=لطفا کمک مالی در نظر بگیرند
|
||||||
## Vault List
|
## Vault List
|
||||||
main.vaultlist.contextMenu.lock=قفل
|
main.vaultlist.contextMenu.lock=قفل
|
||||||
|
main.vaultlist.addVaultBtn=اضافه کردن گاوصندوق
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
### Locked
|
### Locked
|
||||||
@@ -143,5 +146,3 @@ vaultOptions.mount.mountPoint.directoryPickerButton=انتخاب کنید…
|
|||||||
# Quit
|
# Quit
|
||||||
|
|
||||||
# Forced Quit
|
# Forced Quit
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
@@ -20,8 +20,6 @@ error.description=Cryptomator ei odottanut tämän tapahtuvan. Voit etsiä olema
|
|||||||
error.hyperlink.lookup=Etsi tämä virhe
|
error.hyperlink.lookup=Etsi tämä virhe
|
||||||
error.hyperlink.report=Ilmoita ongelmasta
|
error.hyperlink.report=Ilmoita ongelmasta
|
||||||
error.technicalDetails=Tiedot:
|
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
|
||||||
defaults.vault.vaultName=Vault
|
defaults.vault.vaultName=Vault
|
||||||
@@ -37,6 +35,9 @@ traymenu.vault.reveal=Paljasta
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Lisää Vault
|
addvaultwizard.title=Lisää Vault
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Luo Uusi Vault
|
||||||
|
addvaultwizard.welcome.existingButton=Avaa Olemassaoleva Vault
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Anna uusi nimi Vaultille
|
addvaultwizard.new.nameInstruction=Anna uusi nimi Vaultille
|
||||||
@@ -58,7 +59,6 @@ addvaultwizard.new.validCharacters.message=Vaultin nimi voi sisältää seuraava
|
|||||||
addvaultwizard.new.validCharacters.chars=Sanamerkit (e.g. a, ж or 수)
|
addvaultwizard.new.validCharacters.chars=Sanamerkit (e.g. a, ж or 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=Numerot
|
addvaultwizard.new.validCharacters.numbers=Numerot
|
||||||
addvaultwizard.new.validCharacters.dashes=Hyphen (%s) tai alaviiva (%s)
|
addvaultwizard.new.validCharacters.dashes=Hyphen (%s) tai alaviiva (%s)
|
||||||
### Expert Settings
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Luo Uusi Vault
|
addvaultwizard.new.createVaultBtn=Luo Uusi Vault
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=Et voi käyttää tietojasi ilman salasanaasi. Haluatko palautusavaimen siltä varalta, että menetät salasanasi?
|
addvaultwizard.new.generateRecoveryKeyChoice=Et voi käyttää tietojasi ilman salasanaasi. Haluatko palautusavaimen siltä varalta, että menetät salasanasi?
|
||||||
@@ -126,6 +126,7 @@ unlock.success.revealBtn=Paljasta Asema
|
|||||||
unlock.error.customPath.message=Holvia ei pystytty yhdistämään valittuun polkuun
|
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.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.notExists=Valitsemaasi mukautettua polkua ei ole olemassa. Voit joko luoda uuden polun tai muuttaa polkua holvisi asetuksissa.
|
||||||
|
unlock.error.customPath.description.generic=Olet valinnut mukautetun polun holvillesi, mutta sen kanssa ilmeni ongelma: %s
|
||||||
## Hub
|
## Hub
|
||||||
hub.noKeychain.message=Laitteen avainta ei löytynyt
|
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.
|
hub.noKeychain.description=Hub-holvien purkamiseksi tarvitaan laiteavain joka on suojattu avainrenkaalla. Jatkaaksesi, kytke “%s” päälle ja valitse avainrengas asetuksista.
|
||||||
@@ -177,28 +178,13 @@ migration.start.remarkCanRun=Sinun tulee varmistaa, että kaikki laitteet joilla
|
|||||||
migration.start.remarkSynced=Sinun tulee varmistaa, että holvisi on täysin ajantasalla tällä laitteella ja muilla laitteillasi, ennen kuin aloitat päivitysprosessin.
|
migration.start.remarkSynced=Sinun tulee varmistaa, että holvisi on täysin ajantasalla tällä laitteella ja muilla laitteillasi, ennen kuin aloitat päivitysprosessin.
|
||||||
migration.start.confirm=Olen lukenut ja ymmärtänyt yllä ilmoitetut ohjeet
|
migration.start.confirm=Olen lukenut ja ymmärtänyt yllä ilmoitetut ohjeet
|
||||||
## Run
|
## Run
|
||||||
migration.run.enterPassword=Kirjoita "%s" salasana
|
|
||||||
migration.run.startMigrationBtn=Siirrä Holvi
|
|
||||||
migration.run.progressHint=Tämä saattaa kestää jonkin aikaa…
|
|
||||||
## Success
|
## Success
|
||||||
migration.success.nextStepsInstructions="%s" siirretty onnistuneesti.\nVoit nyt avata holvin lukituksen.
|
|
||||||
migration.success.unlockNow=Avaa Nyt
|
migration.success.unlockNow=Avaa Nyt
|
||||||
## Missing file system capabilities
|
## Missing file system capabilities
|
||||||
migration.error.missingFileSystemCapabilities.title=Tiedostojärjestelmää ei tueta
|
|
||||||
migration.error.missingFileSystemCapabilities.description=Siirtoa ei aloitettu, koska varastosi sijaitsee riittämättömässä tiedostojärjestelmässä.
|
|
||||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Tiedostojärjestelmä ei tue pitkiä tiedostonimiä.
|
|
||||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Tiedostojärjestelmä ei tue pitkiä polkuja.
|
|
||||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Tiedostojärjestelmä ei salli lukemista.
|
|
||||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Tiedostojärjestelmä ei salli kirjoittamista.
|
|
||||||
## Impossible
|
## Impossible
|
||||||
migration.impossible.heading=Holvin siirtäminen ei onnistu
|
|
||||||
migration.impossible.reason=Varastoa ei voida siirtää automaattisesti, koska sen tallennuspaikka tai tukiasema ei ole yhteensopiva.
|
|
||||||
migration.impossible.moreInfo=Varasto voidaan edelleen avata vanhemmalla versiolla. Katso ohjeet varaston manuaaliseen siirtämiseen osoitteesta
|
|
||||||
|
|
||||||
# Health Check
|
# Health Check
|
||||||
## Start
|
## Start
|
||||||
health.title="%s" kuntotarkastus
|
|
||||||
health.intro.header=Kuntotarkastus
|
|
||||||
## Start Failure
|
## Start Failure
|
||||||
## Check Selection
|
## Check Selection
|
||||||
## Detail view
|
## Detail view
|
||||||
@@ -230,6 +216,7 @@ main.preferencesBtn.tooltip=Asetukset
|
|||||||
main.vaultlist.contextMenu.lock=Lukitse
|
main.vaultlist.contextMenu.lock=Lukitse
|
||||||
main.vaultlist.contextMenu.unlockNow=Avaa Nyt
|
main.vaultlist.contextMenu.unlockNow=Avaa Nyt
|
||||||
main.vaultlist.contextMenu.reveal=Paljasta Asema
|
main.vaultlist.contextMenu.reveal=Paljasta Asema
|
||||||
|
main.vaultlist.addVaultBtn=Lisää Vault
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
### Locked
|
### Locked
|
||||||
@@ -269,5 +256,3 @@ vaultOptions.masterkey.changePasswordBtn=Vaihda salasana
|
|||||||
# Quit
|
# Quit
|
||||||
|
|
||||||
# Forced Quit
|
# Forced Quit
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
@@ -20,11 +20,6 @@ error.description=Oops! Hindi inaasahan ng Cryptomator na ito'y mangyari. Maaari
|
|||||||
error.hyperlink.lookup=Hanapin ang solusyon
|
error.hyperlink.lookup=Hanapin ang solusyon
|
||||||
error.hyperlink.report=I-report ang problema
|
error.hyperlink.report=I-report ang problema
|
||||||
error.technicalDetails=Mga detalye:
|
error.technicalDetails=Mga detalye:
|
||||||
error.existingSolutionDescription=Hindi inaasahan ng Cryptomator na mangyayari ito. Ngunit nakakita kami ng kasalukuyang solusyon para sa error na ito. Mangyaring tingnan ang sumusunod na link.
|
|
||||||
error.hyperlink.solution=Hanapin ang solusyon
|
|
||||||
error.lookupPermissionMessage=Maaaring maghanap ng solusyon ang Cryptomator para sa problemang ito online. Magpapadala ito ng kahilingan sa aming database ng problema mula sa iyong IP address.
|
|
||||||
error.dismiss=I-dismiss
|
|
||||||
error.lookUpSolution=Itignan ang solusyon
|
|
||||||
|
|
||||||
# Defaults
|
# Defaults
|
||||||
defaults.vault.vaultName=Vault
|
defaults.vault.vaultName=Vault
|
||||||
@@ -40,8 +35,10 @@ traymenu.vault.reveal=Ipakita
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Magdagdag ng Vault
|
addvaultwizard.title=Magdagdag ng Vault
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Gumawa ng Bagong Vault
|
||||||
|
addvaultwizard.welcome.existingButton=Magbukas ng Umiiral na Vault
|
||||||
## New
|
## New
|
||||||
addvaultwizard.new.title=Magdagdag ng Bagong Vault
|
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Pangalanan ang vault
|
addvaultwizard.new.nameInstruction=Pangalanan ang vault
|
||||||
addvaultwizard.new.namePrompt=Pangalan ng Vault
|
addvaultwizard.new.namePrompt=Pangalan ng Vault
|
||||||
@@ -52,78 +49,31 @@ addvaultwizard.new.locationPrompt=…
|
|||||||
addvaultwizard.new.directoryPickerLabel=Custom Location
|
addvaultwizard.new.directoryPickerLabel=Custom Location
|
||||||
addvaultwizard.new.directoryPickerButton=Mamili…
|
addvaultwizard.new.directoryPickerButton=Mamili…
|
||||||
addvaultwizard.new.directoryPickerTitle=Pumili ng Direktoryo
|
addvaultwizard.new.directoryPickerTitle=Pumili ng Direktoryo
|
||||||
addvaultwizard.new.fileAlreadyExists=Mayroon nang file o direktoryo na may pangalan ng vault
|
|
||||||
addvaultwizard.new.locationDoesNotExist=Ang isang direktoryo sa tinukoy na landas ay hindi umiiral o hindi ma-access
|
|
||||||
addvaultwizard.new.locationIsNotWritable=Walang access sa pagsulat sa tinukoy na landas
|
|
||||||
addvaultwizard.new.locationIsOk=Angkop na lokasyon para sa iyong vault
|
|
||||||
addvaultwizard.new.invalidName=Di-wastong pangalan ng vault
|
|
||||||
addvaultwizard.new.validName=Wastong pangalan ng vault
|
|
||||||
addvaultwizard.new.validCharacters.message=Maaaring naglalaman ang pangalan ng vault ng mga sumusunod na character:
|
|
||||||
addvaultwizard.new.validCharacters.chars=Mga character ng salita (hal. a, ж o 수)
|
|
||||||
addvaultwizard.new.validCharacters.numbers=Numero
|
|
||||||
addvaultwizard.new.validCharacters.dashes=Hyphen (%s) o underscore (%s)
|
|
||||||
### Expert Settings
|
|
||||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Paganahin ang mga setting ng eksperto
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Maglagay ng value sa pagitan ng 36 at 220 (default 220)
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Ibukas ang dokumentasyon para matuto pa.
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.title=Pinakamataas na haba ng mga naka-encrypt na pangalan ng file
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Wasto
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Gumawa ng bagong Vault
|
addvaultwizard.new.createVaultBtn=Gumawa ng bagong Vault
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=Hindi mo maa-access ang iyong data nang wala ang iyong password. Gusto mo ba ng recovery key para sa kaso na nawala mo ang iyong password?
|
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice.yes=Oo pakiusap, mas ligtas kaysa sorry
|
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice.no=Hindi, salamat, hindi ko mawawala ang aking password
|
|
||||||
### Information
|
### Information
|
||||||
addvault.new.readme.storageLocation.fileName=MAHALAGA.rtf
|
|
||||||
addvault.new.readme.storageLocation.1=⚠️ VAULT FILES ⚠️
|
|
||||||
addvault.new.readme.storageLocation.2=Ito ang lokasyon ng iyong vault na imbakan.
|
addvault.new.readme.storageLocation.2=Ito ang lokasyon ng iyong vault na imbakan.
|
||||||
addvault.new.readme.storageLocation.3=HUWAG
|
addvault.new.readme.storageLocation.3=HUWAG
|
||||||
addvault.new.readme.storageLocation.4=• baguhin ang anumang mga file sa loob ng direktoryong ito o
|
|
||||||
addvault.new.readme.storageLocation.5=• i-paste ang anumang mga file para sa pag-encrypt sa direktoryong ito.
|
|
||||||
addvault.new.readme.storageLocation.6=Kung gusto mo i-encrypt ang mga files at makita nang nilalaman ng vault, gawin ang nakasabi:
|
addvault.new.readme.storageLocation.6=Kung gusto mo i-encrypt ang mga files at makita nang nilalaman ng vault, gawin ang nakasabi:
|
||||||
addvault.new.readme.storageLocation.7=1. Idagdag ang vault na ito sa Cryptomator.
|
addvault.new.readme.storageLocation.7=1. Idagdag ang vault na ito sa Cryptomator.
|
||||||
addvault.new.readme.storageLocation.8=2. I-unlock ang vault sa Cryptomator.
|
|
||||||
addvault.new.readme.storageLocation.9=3. Buksan ang lokasyon ng pag-access sa pamamagitan ng pag-click sa pindutang "Ibunyag".
|
|
||||||
addvault.new.readme.storageLocation.10=Kung kailangan mo ng tulong, bisitahin ang dokumentasyon: %s
|
|
||||||
addvault.new.readme.accessLocation.fileName=WELCOME.rtf
|
|
||||||
addvault.new.readme.accessLocation.1=🔐️ Naka-encrypt na VOLUME 🔐️
|
|
||||||
addvault.new.readme.accessLocation.2=Ito ang lokasyon ng iyong vault.
|
addvault.new.readme.accessLocation.2=Ito ang lokasyon ng iyong vault.
|
||||||
addvault.new.readme.accessLocation.3=Ang anumang mga file na idinagdag sa volume na ito ay ie-encrypt ng Cryptomator. Maaari mong gawin ito tulad ng sa anumang iba pang drive/folder. Ito ay isang decrypted view lamang ng nilalaman nito, ang iyong mga file ay mananatiling naka-encrypt sa iyong hard drive sa lahat ng oras.
|
|
||||||
addvault.new.readme.accessLocation.4=Huwag mag-atubiling tanggalin ang file na ito.
|
|
||||||
## Existing
|
## Existing
|
||||||
addvaultwizard.existing.title=Magdagdag ng Umiiral na Vault
|
|
||||||
addvaultwizard.existing.instruction=Piliin ang "vault.cryptomator" file ng iyong kasalukuyang vault. Kung mayroon lamang file na may pangalang "masterkey.cryptomator," piliin iyon sa halip.
|
|
||||||
addvaultwizard.existing.chooseBtn=Mamili…
|
addvaultwizard.existing.chooseBtn=Mamili…
|
||||||
addvaultwizard.existing.filePickerTitle=Piliin ang Vault File
|
|
||||||
addvaultwizard.existing.filePickerMimeDesc=Cryptomator Vault
|
|
||||||
## Success
|
## Success
|
||||||
addvaultwizard.success.nextStepsInstructions=Idinagdag ang vault na "%s".\nKailangan mong i-unlock ang vault na ito para ma-access o magdagdag ng mga content. Bilang kahalili, maaari mo itong i-unlock sa anumang susunod na oras.
|
|
||||||
addvaultwizard.success.unlockNow=I-unlock Ngayon
|
|
||||||
|
|
||||||
# Remove Vault
|
# Remove Vault
|
||||||
removeVault.title=Tanggalin %s
|
removeVault.title=Tanggalin %s
|
||||||
removeVault.message=Itangal ang vault?
|
removeVault.message=Itangal ang vault?
|
||||||
removeVault.description=Makakalimutan lang nito ang Cryptomator tungkol sa vault na ito. Maaari mo itong idagdag muli. Walang matatanggal na mga naka-encrypt na file mula sa iyong hard drive.
|
|
||||||
removeVault.confirmBtn=Itangal ang vault
|
removeVault.confirmBtn=Itangal ang vault
|
||||||
|
|
||||||
# Change Password
|
# Change Password
|
||||||
changepassword.title=Palitan ANG password
|
|
||||||
changepassword.enterOldPassword=Ilagay ang kasalukuyang password para sa "%s"
|
|
||||||
changepassword.finalConfirmation=Naiintindihan ko na hindi ko maa-access ang aking data kung nakalimutan ko ang aking password
|
|
||||||
|
|
||||||
# Forget Password
|
# Forget Password
|
||||||
forgetPassword.title=Kalimutan ang Password
|
|
||||||
forgetPassword.message=Nakalimutan ang iyong password?
|
|
||||||
forgetPassword.description=Tatanggalin nito ang naka-save na password ng vault na ito mula sa keychain ng iyong system.
|
|
||||||
forgetPassword.confirmBtn=Kalimutan ang Password
|
|
||||||
|
|
||||||
# Unlock
|
# Unlock
|
||||||
unlock.title=I-unlock ang "%s"
|
|
||||||
unlock.passwordPrompt=Ipasok ang password para sa "%s":
|
|
||||||
unlock.savePassword=Maalala ang password
|
unlock.savePassword=Maalala ang password
|
||||||
unlock.unlockBtn=I-unlock
|
unlock.unlockBtn=I-unlock
|
||||||
## Select
|
## Select
|
||||||
unlock.chooseMasterkey.message=Hindi nahanap ang masterkey file
|
|
||||||
unlock.chooseMasterkey.filePickerTitle=Piliin ang masterkey file
|
unlock.chooseMasterkey.filePickerTitle=Piliin ang masterkey file
|
||||||
unlock.chooseMasterkey.filePickerMimeDesc=Cryptomator Masterkey
|
unlock.chooseMasterkey.filePickerMimeDesc=Cryptomator Masterkey
|
||||||
## Success
|
## Success
|
||||||
@@ -149,7 +99,6 @@ lock.forced.retryBtn=Subukan muli
|
|||||||
## Start
|
## Start
|
||||||
## Run
|
## Run
|
||||||
## Success
|
## Success
|
||||||
migration.success.unlockNow=I-unlock Ngayon
|
|
||||||
## Missing file system capabilities
|
## Missing file system capabilities
|
||||||
## Impossible
|
## Impossible
|
||||||
|
|
||||||
@@ -186,12 +135,10 @@ main.closeBtn.tooltip=Isara
|
|||||||
main.preferencesBtn.tooltip=Mga Kagustuhan
|
main.preferencesBtn.tooltip=Mga Kagustuhan
|
||||||
## Vault List
|
## Vault List
|
||||||
main.vaultlist.contextMenu.lock=I-lock
|
main.vaultlist.contextMenu.lock=I-lock
|
||||||
main.vaultlist.contextMenu.unlockNow=I-unlock Ngayon
|
main.vaultlist.addVaultBtn=Magdagdag ng Vault
|
||||||
main.vaultlist.addVaultBtn=Idagdag
|
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
### Locked
|
### Locked
|
||||||
main.vaultDetail.unlockNowBtn=I-unlock Ngayon
|
|
||||||
### Unlocked
|
### Unlocked
|
||||||
main.vaultDetail.lockBtn=I-lock
|
main.vaultDetail.lockBtn=I-lock
|
||||||
### Missing
|
### Missing
|
||||||
@@ -207,7 +154,6 @@ vaultOptions.general.vaultName=Pangalan ng Vault
|
|||||||
## Mount
|
## Mount
|
||||||
vaultOptions.mount.mountPoint.directoryPickerButton=Mamili…
|
vaultOptions.mount.mountPoint.directoryPickerButton=Mamili…
|
||||||
## Master Key
|
## Master Key
|
||||||
vaultOptions.masterkey.changePasswordBtn=Palitan ANG password
|
|
||||||
## Hub
|
## Hub
|
||||||
|
|
||||||
# Recovery Key
|
# Recovery Key
|
||||||
@@ -224,6 +170,3 @@ vaultOptions.masterkey.changePasswordBtn=Palitan ANG password
|
|||||||
# Quit
|
# Quit
|
||||||
|
|
||||||
# Forced Quit
|
# Forced Quit
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
updateReminder.message=I-tsek kung may bagong update?
|
|
||||||
@@ -20,11 +20,6 @@ error.description=Oups ! Cryptomator ne s'attendait pas à ce que cela se produi
|
|||||||
error.hyperlink.lookup=Rechercher cette erreur
|
error.hyperlink.lookup=Rechercher cette erreur
|
||||||
error.hyperlink.report=Signaler cette erreur
|
error.hyperlink.report=Signaler cette erreur
|
||||||
error.technicalDetails=Détails :
|
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 trouver une solution à ce problème en ligne. Cela enverra une requête à notre base de données de problèmes à partir de votre adresse IP.
|
|
||||||
error.dismiss=Ignorer
|
|
||||||
error.lookUpSolution=Rechercher la solution
|
|
||||||
|
|
||||||
# Defaults
|
# Defaults
|
||||||
defaults.vault.vaultName=Coffre
|
defaults.vault.vaultName=Coffre
|
||||||
@@ -40,8 +35,10 @@ traymenu.vault.reveal=Révéler
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Ajouter un coffre
|
addvaultwizard.title=Ajouter un coffre
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Créer un nouveau coffre
|
||||||
|
addvaultwizard.welcome.existingButton=Ouvrir un coffre existant
|
||||||
## New
|
## New
|
||||||
addvaultwizard.new.title=Ajouter un nouveau coffre
|
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Choisir un nom pour le coffre
|
addvaultwizard.new.nameInstruction=Choisir un nom pour le coffre
|
||||||
addvaultwizard.new.namePrompt=Nom du coffre
|
addvaultwizard.new.namePrompt=Nom du coffre
|
||||||
@@ -62,12 +59,6 @@ addvaultwizard.new.validCharacters.message=Le nom du coffre ne peut contenir que
|
|||||||
addvaultwizard.new.validCharacters.chars=Caractères de mot (par exemple a, ж ou 수)
|
addvaultwizard.new.validCharacters.chars=Caractères de mot (par exemple a, ж ou 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=Nombres
|
addvaultwizard.new.validCharacters.numbers=Nombres
|
||||||
addvaultwizard.new.validCharacters.dashes=Tiret (%s) ou tiret du bas (%s)
|
addvaultwizard.new.validCharacters.dashes=Tiret (%s) ou tiret du bas (%s)
|
||||||
### Expert Settings
|
|
||||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Activer les paramètres experts
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Entrez une valeur entre 36 et 220 (par défaut 220)
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Ouvrez la documentation pour en savoir plus.
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.title=Longueur maximale des noms de fichiers chiffrés
|
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Valide
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Créer un coffre
|
addvaultwizard.new.createVaultBtn=Créer un coffre
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=Il sera impossible d’accéder à vos données sans mot de passe. Souhaitez-vous créer une clé de secours en cas d'oubli du mot passe ?
|
addvaultwizard.new.generateRecoveryKeyChoice=Il sera impossible d’accéder à vos données sans mot de passe. Souhaitez-vous créer une clé de secours en cas d'oubli du mot passe ?
|
||||||
@@ -78,7 +69,7 @@ addvault.new.readme.storageLocation.fileName=IMPORTANT.rtf
|
|||||||
addvault.new.readme.storageLocation.1=Fichiers de coffre-fort
|
addvault.new.readme.storageLocation.1=Fichiers de coffre-fort
|
||||||
addvault.new.readme.storageLocation.2=Ceci est l'emplacement de stockage de votre coffre.
|
addvault.new.readme.storageLocation.2=Ceci est l'emplacement de stockage de votre coffre.
|
||||||
addvault.new.readme.storageLocation.3=NE PAS
|
addvault.new.readme.storageLocation.3=NE PAS
|
||||||
addvault.new.readme.storageLocation.4=• Modifier n'importe quel fichier dans ce répertoire ou
|
addvault.new.readme.storageLocation.4=• modifier les fichiers dans ce répertoire ni
|
||||||
addvault.new.readme.storageLocation.5=• coller de fichier à chiffrer dans ce répertoire.
|
addvault.new.readme.storageLocation.5=• coller de fichier à chiffrer dans ce répertoire.
|
||||||
addvault.new.readme.storageLocation.6=Si vous voulez chiffrer les fichiers et afficher le contenu du coffre, faites ce qui suit :
|
addvault.new.readme.storageLocation.6=Si vous voulez chiffrer les fichiers et afficher le contenu du coffre, faites ce qui suit :
|
||||||
addvault.new.readme.storageLocation.7=1. Ajouter ce coffre à Cryptomator.
|
addvault.new.readme.storageLocation.7=1. Ajouter ce coffre à Cryptomator.
|
||||||
@@ -91,7 +82,6 @@ addvault.new.readme.accessLocation.2=Ceci est le chemin d'accès de votre coffre
|
|||||||
addvault.new.readme.accessLocation.3=Tous les fichiers ajoutés à ce volume seront chiffrés par Cryptomator. Vous pouvez l'utiliser comme n'importe quel lecteur/répertoire. Ceci est seulement une vue déchiffrée de son contenu, vos fichiers restent chiffrés dans votre disque dur en permanence.
|
addvault.new.readme.accessLocation.3=Tous les fichiers ajoutés à ce volume seront chiffrés par Cryptomator. Vous pouvez l'utiliser comme n'importe quel lecteur/répertoire. Ceci est seulement une vue déchiffrée de son contenu, vos fichiers restent chiffrés dans votre disque dur en permanence.
|
||||||
addvault.new.readme.accessLocation.4=Vous pouvez supprimer ce fichier.
|
addvault.new.readme.accessLocation.4=Vous pouvez supprimer ce fichier.
|
||||||
## Existing
|
## Existing
|
||||||
addvaultwizard.existing.title=Ajouter un coffre existant
|
|
||||||
addvaultwizard.existing.instruction=Choisissez le fichier « vault.cryptomator » de votre volume existant. Si seul le fichier « masterkey.cryptomator » est présent, sélectionnez celui-là.
|
addvaultwizard.existing.instruction=Choisissez le fichier « vault.cryptomator » de votre volume existant. Si seul le fichier « masterkey.cryptomator » est présent, sélectionnez celui-là.
|
||||||
addvaultwizard.existing.chooseBtn=Choisir...
|
addvaultwizard.existing.chooseBtn=Choisir...
|
||||||
addvaultwizard.existing.filePickerTitle=Sélectionnez le fichier correspondant au volume chiffré
|
addvaultwizard.existing.filePickerTitle=Sélectionnez le fichier correspondant au volume chiffré
|
||||||
@@ -136,11 +126,7 @@ unlock.success.revealBtn=Révéler le lecteur
|
|||||||
unlock.error.customPath.message=Impossible de monter le coffre vers le chemin personnalisé
|
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.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.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 ou le point de montage personnalisé «%s» est déjà utilisé.
|
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.hideawayNotDir=Le fichier temporaire et caché «%3$s» utilisé pour déverrouiller 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
|
||||||
hub.noKeychain.message=Impossible d'accéder à la clé du périphérique
|
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.
|
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.
|
||||||
@@ -365,9 +351,7 @@ main.vaultlist.contextMenu.unlock=Déverrouiller…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Déverrouiller maintenant
|
main.vaultlist.contextMenu.unlockNow=Déverrouiller maintenant
|
||||||
main.vaultlist.contextMenu.vaultoptions=Afficher les options du volume chiffré
|
main.vaultlist.contextMenu.vaultoptions=Afficher les options du volume chiffré
|
||||||
main.vaultlist.contextMenu.reveal=Afficher le lecteur
|
main.vaultlist.contextMenu.reveal=Afficher le lecteur
|
||||||
main.vaultlist.addVaultBtn=Ajouter
|
main.vaultlist.addVaultBtn=Ajouter un volume chiffré
|
||||||
main.vaultlist.addVaultBtn.menuItemNew=Nouveau coffre...
|
|
||||||
main.vaultlist.addVaultBtn.menuItemExisting=Coffre existant...
|
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Merci d'avoir choisi Cryptomator pour protéger vos fichiers. Si vous avez besoin d'aide, consultez nos guides de démarrage :
|
main.vaultDetail.welcomeOnboarding=Merci d'avoir choisi Cryptomator pour protéger vos fichiers. Si vous avez besoin d'aide, consultez nos guides de démarrage :
|
||||||
@@ -451,7 +435,7 @@ vaultOptions.masterkey.showRecoveryKeyBtn=Afficher la clé de récupération
|
|||||||
vaultOptions.masterkey.recoverPasswordBtn=Réinitialiser le mot de passe
|
vaultOptions.masterkey.recoverPasswordBtn=Réinitialiser le mot de passe
|
||||||
## Hub
|
## Hub
|
||||||
vaultOptions.hub=Récupération
|
vaultOptions.hub=Récupération
|
||||||
vaultOptions.hub.convertInfo=Vous pouvez utiliser la clé de récupération pour convertir ce coffre Hub en coffre à mot de passe en cas d'urgence.
|
vaultOptions.hub.convertInfo=Vous pouvez utiliser la clé de récupération pour convertir ce coffre Hub en coffre basé sur un mot de passe en cas d'urgence.
|
||||||
vaultOptions.hub.convertBtn=Convertir en coffre-fort basé sur mot de passe
|
vaultOptions.hub.convertBtn=Convertir en coffre-fort basé sur mot de passe
|
||||||
|
|
||||||
# Recovery Key
|
# Recovery Key
|
||||||
@@ -464,7 +448,7 @@ recoveryKey.display.StorageHints=Gardez-la dans un endroit sûr, par ex. :\n •
|
|||||||
## Reset Password
|
## Reset Password
|
||||||
### Enter Recovery Key
|
### Enter Recovery Key
|
||||||
recoveryKey.recover.title=Réinitialiser le mot de passe
|
recoveryKey.recover.title=Réinitialiser le mot de passe
|
||||||
recoveryKey.recover.prompt=Entrez la clé de récupération pour "%s" :
|
recoveryKey.recover.prompt=Entrez la clé de récupération pour "%s " :
|
||||||
recoveryKey.recover.correctKey=Cette clé de récupération est correcte
|
recoveryKey.recover.correctKey=Cette clé de récupération est correcte
|
||||||
recoveryKey.recover.wrongKey=Cette clé de récupération appartient à un autre coffre
|
recoveryKey.recover.wrongKey=Cette clé de récupération appartient à un autre coffre
|
||||||
recoveryKey.recover.invalidKey=Cette clé de récupération n'est pas valide
|
recoveryKey.recover.invalidKey=Cette clé de récupération n'est pas valide
|
||||||
@@ -504,11 +488,3 @@ quit.lockAndQuitBtn=Verrouiller et quitter
|
|||||||
quit.forced.message=Certains coffres n'ont pas pu être verrouillés
|
quit.forced.message=Certains coffres n'ont pas pu être verrouillés
|
||||||
quit.forced.description=Le verrouillage des coffres a été bloqué par des opérations en attente ou des fichiers ouverts. Vous pouvez forcer le verrouillage des coffres restants, mais l'interruption d'E/S peut entraîner la perte de données non enregistrées.
|
quit.forced.description=Le verrouillage des coffres a été bloqué par des opérations en attente ou des fichiers ouverts. Vous pouvez forcer le verrouillage des coffres restants, mais l'interruption d'E/S peut entraîner la perte de données non enregistrées.
|
||||||
quit.forced.forceAndQuitBtn=Forcer la fermeture
|
quit.forced.forceAndQuitBtn=Forcer la fermeture
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
updateReminder.title=Recherche de mise à jour
|
|
||||||
updateReminder.message=Rechercher des mises à jour ?
|
|
||||||
updateReminder.description=Restez à jour avec de nouvelles fonctionnalités, des corrections de bugs et des améliorations de sécurité. La vérification automatique des mises à jour est recommandée.
|
|
||||||
updateReminder.notNow=Plus tard
|
|
||||||
updateReminder.yesOnce=Cette fois seulement
|
|
||||||
updateReminder.yesAutomatically=Oui, automatiquement
|
|
||||||
@@ -22,10 +22,10 @@ error.message=Produciuse un erro
|
|||||||
# Tray Menu
|
# Tray Menu
|
||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
|
## Welcome
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
### Location
|
### Location
|
||||||
### Expert Settings
|
|
||||||
### Password
|
### Password
|
||||||
### Information
|
### Information
|
||||||
## Existing
|
## Existing
|
||||||
@@ -121,5 +121,3 @@ main.closeBtn.tooltip=Pechar
|
|||||||
# Quit
|
# Quit
|
||||||
|
|
||||||
# Forced Quit
|
# Forced Quit
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
@@ -35,6 +35,9 @@ traymenu.vault.reveal=חשוף
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=הוספת כספת
|
addvaultwizard.title=הוספת כספת
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=צור כספת חדשה
|
||||||
|
addvaultwizard.welcome.existingButton=פתיחת כספת קיימת
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=בחירת שם עבור הכספת
|
addvaultwizard.new.nameInstruction=בחירת שם עבור הכספת
|
||||||
@@ -56,7 +59,6 @@ addvaultwizard.new.validCharacters.message=שם כספת יכול לכלול א
|
|||||||
addvaultwizard.new.validCharacters.chars=תווי מילים (למשל: a, ж or 수)
|
addvaultwizard.new.validCharacters.chars=תווי מילים (למשל: a, ж or 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=מספרים
|
addvaultwizard.new.validCharacters.numbers=מספרים
|
||||||
addvaultwizard.new.validCharacters.dashes=מקף (%s) או קו תחתון (%s)
|
addvaultwizard.new.validCharacters.dashes=מקף (%s) או קו תחתון (%s)
|
||||||
### Expert Settings
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=צור כספת חדשה
|
addvaultwizard.new.createVaultBtn=צור כספת חדשה
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=לא תיהיה אפשרות לקבל גישה למידע שלך בלי הסיסמה שלך. האם תרצה/י מפתח שחזור למקרה ותאבד/י את הסיסמה שלך?
|
addvaultwizard.new.generateRecoveryKeyChoice=לא תיהיה אפשרות לקבל גישה למידע שלך בלי הסיסמה שלך. האם תרצה/י מפתח שחזור למקרה ותאבד/י את הסיסמה שלך?
|
||||||
@@ -124,7 +126,7 @@ unlock.success.revealBtn=חשוף את הכונן
|
|||||||
unlock.error.customPath.message=כשלון בקישור הכספת לנתיב הידני שהוגדר
|
unlock.error.customPath.message=כשלון בקישור הכספת לנתיב הידני שהוגדר
|
||||||
unlock.error.customPath.description.notSupported=אם ברצונך להשתמש בנתיב ידני, אנא גש להעדפות ובחר סוג volume שתומך בכך. אחרת, לך לאפשרויות הכספת ובחר אפשרות יעד קישור נתמך.
|
unlock.error.customPath.description.notSupported=אם ברצונך להשתמש בנתיב ידני, אנא גש להעדפות ובחר סוג volume שתומך בכך. אחרת, לך לאפשרויות הכספת ובחר אפשרות יעד קישור נתמך.
|
||||||
unlock.error.customPath.description.notExists=יעד הקישור הידני לא קיים. או שתיצור אותו במערכת הקבצים המקומית או שנה אותו באפשרויות הכספת.
|
unlock.error.customPath.description.notExists=יעד הקישור הידני לא קיים. או שתיצור אותו במערכת הקבצים המקומית או שנה אותו באפשרויות הכספת.
|
||||||
unlock.error.customPath.description.hideawayNotDir=הקובץ הזמני, הנסתר %3$s עבור פתיחה לא ניתן להסרה. יש לבדוק את הקובץ ולמחוק אותו ידנית.
|
unlock.error.customPath.description.generic=אתה בחרת באפשרות יעד קישור ידני לכספת זו, אבל השימוש בו נכשל עם ההודעה: %s
|
||||||
## Hub
|
## Hub
|
||||||
hub.noKeychain.message=לא ניתן לגשת למפתח המכשיר
|
hub.noKeychain.message=לא ניתן לגשת למפתח המכשיר
|
||||||
hub.noKeychain.description=כדאי לשחרר כספות האב נדרש מפתח מכשיר שיאובטח בצרור מפתחות. כדאי להמשיך, אפשר ״%s״ ובחר את צרור המפתחות בהעדפות.
|
hub.noKeychain.description=כדאי לשחרר כספות האב נדרש מפתח מכשיר שיאובטח בצרור מפתחות. כדאי להמשיך, אפשר ״%s״ ובחר את צרור המפתחות בהעדפות.
|
||||||
@@ -349,7 +351,7 @@ main.vaultlist.contextMenu.unlock=שחרר נעילה…
|
|||||||
main.vaultlist.contextMenu.unlockNow=בטל נעילה כעת
|
main.vaultlist.contextMenu.unlockNow=בטל נעילה כעת
|
||||||
main.vaultlist.contextMenu.vaultoptions=הצג את אפשרויות הכספת
|
main.vaultlist.contextMenu.vaultoptions=הצג את אפשרויות הכספת
|
||||||
main.vaultlist.contextMenu.reveal=חשוף את הכונן
|
main.vaultlist.contextMenu.reveal=חשוף את הכונן
|
||||||
main.vaultlist.addVaultBtn=הוספה
|
main.vaultlist.addVaultBtn=יצירת כספת
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=תודה שבחרת ב- Cryptomator להגן על הקבצים שלך. אם אתה זקוק לסיוע, אנא עיין במדריכים שלנו:
|
main.vaultDetail.welcomeOnboarding=תודה שבחרת ב- Cryptomator להגן על הקבצים שלך. אם אתה זקוק לסיוע, אנא עיין במדריכים שלנו:
|
||||||
@@ -478,5 +480,3 @@ quit.lockAndQuitBtn=נעילה ויציאה
|
|||||||
quit.forced.message=חלק מה vaults לא היו ניתנים לנעילה
|
quit.forced.message=חלק מה vaults לא היו ניתנים לנעילה
|
||||||
quit.forced.description=נעילה כספות נחסמה על ידי תהליכים ממתינים או קבצים פתוחים. אתה יכול לנעול את הכספת בכוח, אולם הפרעה לפעולת קריאה וכתיבה עשויה לגרום לאובדן מידע לא שמור.
|
quit.forced.description=נעילה כספות נחסמה על ידי תהליכים ממתינים או קבצים פתוחים. אתה יכול לנעול את הכספת בכוח, אולם הפרעה לפעולת קריאה וכתיבה עשויה לגרום לאובדן מידע לא שמור.
|
||||||
quit.forced.forceAndQuitBtn=נעילה בכח ויציאה
|
quit.forced.forceAndQuitBtn=נעילה בכח ויציאה
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
@@ -35,6 +35,9 @@ traymenu.vault.reveal=प्रत्यक्ष करें
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=वाउल्ट डालें
|
addvaultwizard.title=वाउल्ट डालें
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=नया वाउल्ट बनाएं
|
||||||
|
addvaultwizard.welcome.existingButton=मौजूदा वाउल्ट खोलें
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=वाउल्ट के लिए नाम चुनें
|
addvaultwizard.new.nameInstruction=वाउल्ट के लिए नाम चुनें
|
||||||
@@ -54,7 +57,6 @@ addvaultwizard.new.invalidName=तिजोरी के लिए इस ना
|
|||||||
addvaultwizard.new.validName=आप इस नाम का उपयोग कर सकते हैं
|
addvaultwizard.new.validName=आप इस नाम का उपयोग कर सकते हैं
|
||||||
addvaultwizard.new.validCharacters.message=नाम के लिए केवल इन वर्णों का उपयोग कर सकते हैं
|
addvaultwizard.new.validCharacters.message=नाम के लिए केवल इन वर्णों का उपयोग कर सकते हैं
|
||||||
addvaultwizard.new.validCharacters.numbers=नंबर
|
addvaultwizard.new.validCharacters.numbers=नंबर
|
||||||
### Expert Settings
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=वॉल्ट बनाएं
|
addvaultwizard.new.createVaultBtn=वॉल्ट बनाएं
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=आप अपने पासवर्ड के बिना अपने डेटा तक नहीं पहुंच पाएंगे। क्या आप उस वक़्त के लिए एक पुनर्प्राप्ति कुंजी चाहते हैं जब आप अपना पासवर्ड खो देते हैं?
|
addvaultwizard.new.generateRecoveryKeyChoice=आप अपने पासवर्ड के बिना अपने डेटा तक नहीं पहुंच पाएंगे। क्या आप उस वक़्त के लिए एक पुनर्प्राप्ति कुंजी चाहते हैं जब आप अपना पासवर्ड खो देते हैं?
|
||||||
@@ -209,6 +211,7 @@ main.vaultlist.contextMenu.unlock=अनलॉक करें...
|
|||||||
main.vaultlist.contextMenu.unlockNow=अब अनलॉक करें
|
main.vaultlist.contextMenu.unlockNow=अब अनलॉक करें
|
||||||
main.vaultlist.contextMenu.vaultoptions=वॉल्ट के विकल्प दिखाए
|
main.vaultlist.contextMenu.vaultoptions=वॉल्ट के विकल्प दिखाए
|
||||||
main.vaultlist.contextMenu.reveal=फोल्डर खोलें
|
main.vaultlist.contextMenu.reveal=फोल्डर खोलें
|
||||||
|
main.vaultlist.addVaultBtn=वाउल्ट डालें
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Cryptomator को अपनी फाइल्स सिराक्षित रखने को चुनने के लिए धन्यवाद। अगर आपको सहायता चाइये, तो हमारी गेटिंग स्टार्टेड गाइगाइड्स देखिये:
|
main.vaultDetail.welcomeOnboarding=Cryptomator को अपनी फाइल्स सिराक्षित रखने को चुनने के लिए धन्यवाद। अगर आपको सहायता चाइये, तो हमारी गेटिंग स्टार्टेड गाइगाइड्स देखिये:
|
||||||
@@ -275,5 +278,3 @@ quit.title=एप्लीकेशन को बंद करें
|
|||||||
|
|
||||||
# Forced Quit
|
# Forced Quit
|
||||||
quit.forced.message=कुछ वॉल्ट्स लॉक नहीं हो पायी
|
quit.forced.message=कुछ वॉल्ट्स लॉक नहीं हो पायी
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
@@ -35,6 +35,9 @@ traymenu.vault.reveal=Otkrij
|
|||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Dodaj trezor
|
addvaultwizard.title=Dodaj trezor
|
||||||
|
## Welcome
|
||||||
|
addvaultwizard.welcome.newButton=Izradi novi trezor
|
||||||
|
addvaultwizard.welcome.existingButton=Otvori postojeći trezor
|
||||||
## New
|
## New
|
||||||
### Name
|
### Name
|
||||||
addvaultwizard.new.nameInstruction=Odaberi ime za trezor
|
addvaultwizard.new.nameInstruction=Odaberi ime za trezor
|
||||||
@@ -50,7 +53,6 @@ addvaultwizard.new.fileAlreadyExists=Datoteka ili mapa s nazivom trezora već po
|
|||||||
addvaultwizard.new.locationDoesNotExist=Mapa u navedenoj putanji ne postoji ili joj se ne može pristupiti
|
addvaultwizard.new.locationDoesNotExist=Mapa u navedenoj putanji ne postoji ili joj se ne može pristupiti
|
||||||
addvaultwizard.new.locationIsNotWritable=Nemate pravo pisanja u navedenu mapu
|
addvaultwizard.new.locationIsNotWritable=Nemate pravo pisanja u navedenu mapu
|
||||||
addvaultwizard.new.locationIsOk=Prikladna lokacija za Vaš trezor
|
addvaultwizard.new.locationIsOk=Prikladna lokacija za Vaš trezor
|
||||||
### Expert Settings
|
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Izradi trezor
|
addvaultwizard.new.createVaultBtn=Izradi trezor
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=Nećete moći pristupiti svojim podacima bez lozinke. Želite li ključ za oporavak za slučaj gubitka lozinke?
|
addvaultwizard.new.generateRecoveryKeyChoice=Nećete moći pristupiti svojim podacima bez lozinke. Želite li ključ za oporavak za slučaj gubitka lozinke?
|
||||||
@@ -274,7 +276,7 @@ main.vaultlist.contextMenu.unlock=Otključaj…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Otključaj sada
|
main.vaultlist.contextMenu.unlockNow=Otključaj sada
|
||||||
main.vaultlist.contextMenu.vaultoptions=Prikaži opcije trezora
|
main.vaultlist.contextMenu.vaultoptions=Prikaži opcije trezora
|
||||||
main.vaultlist.contextMenu.reveal=Otkrij pogon
|
main.vaultlist.contextMenu.reveal=Otkrij pogon
|
||||||
main.vaultlist.addVaultBtn=Dodaj
|
main.vaultlist.addVaultBtn=Dodaj trezor
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Hvala što ste odabrali Cryptomator za zaštitu Vaših datoteka. Ukoliko trebate pomoć, provjerite naše vodiče za početak rada:
|
main.vaultDetail.welcomeOnboarding=Hvala što ste odabrali Cryptomator za zaštitu Vaših datoteka. Ukoliko trebate pomoć, provjerite naše vodiče za početak rada:
|
||||||
@@ -377,5 +379,3 @@ passwordStrength.messageLabel.4=Vrlo jaka
|
|||||||
quit.lockAndQuitBtn=Zaključaj i napusti
|
quit.lockAndQuitBtn=Zaključaj i napusti
|
||||||
|
|
||||||
# Forced Quit
|
# Forced Quit
|
||||||
|
|
||||||
# Update Reminder
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user