mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-16 01:31:28 +00:00
Compare commits
38 Commits
1.6.0-beta
...
1.6.0-rc2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e436ce372d | ||
|
|
1c62467fd2 | ||
|
|
7f833d2567 | ||
|
|
6c6f6baf12 | ||
|
|
8319a09b12 | ||
|
|
ac1ff5fb79 | ||
|
|
1ac0820f93 | ||
|
|
2f868304e4 | ||
|
|
813c69f6ac | ||
|
|
0d240cdb2d | ||
|
|
1ef3e948be | ||
|
|
2200a100e0 | ||
|
|
f5822fc568 | ||
|
|
126201506c | ||
|
|
c7d8cf5465 | ||
|
|
6415c29e3e | ||
|
|
c1965086f3 | ||
|
|
c8b9deccb9 | ||
|
|
9586e4e65a | ||
|
|
0fb5867bd8 | ||
|
|
3cc1bef4a6 | ||
|
|
907d097e2c | ||
|
|
c9907d6085 | ||
|
|
5eac665a93 | ||
|
|
8795e5c8d2 | ||
|
|
069c07cbf1 | ||
|
|
cda7cc8ef9 | ||
|
|
1015542629 | ||
|
|
18be4ba257 | ||
|
|
90bceb0f68 | ||
|
|
53afaf1b12 | ||
|
|
6b0625609b | ||
|
|
5670e77908 | ||
|
|
79c48778ce | ||
|
|
f9889c16de | ||
|
|
cbe26d8a4f | ||
|
|
b3c2d68d9b | ||
|
|
d07c018670 |
15
.github/workflows/build.yml
vendored
15
.github/workflows/build.yml
vendored
@@ -2,9 +2,11 @@ name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request_target:
|
||||
types: [labeled]
|
||||
|
||||
env:
|
||||
JAVA_VERSION: 16
|
||||
JAVA_VERSION: 17
|
||||
|
||||
defaults:
|
||||
run:
|
||||
@@ -17,19 +19,16 @@ jobs:
|
||||
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-java@v1
|
||||
- uses: actions/setup-java@v2
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: ${{ env.JAVA_VERSION }}
|
||||
- uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-maven-
|
||||
cache: 'maven'
|
||||
- name: Build and Test
|
||||
run: mvn -B clean install jacoco:report -Pcoverage,dependency-check
|
||||
- name: Upload code coverage report
|
||||
id: codacyCoverageReporter
|
||||
if: "github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'pr:safe')"
|
||||
run: bash <(curl -Ls https://coverage.codacy.com/get.sh)
|
||||
env:
|
||||
CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
||||
|
||||
26
.github/workflows/pullrequest.yml
vendored
Normal file
26
.github/workflows/pullrequest.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
name: Pull Request
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
|
||||
env:
|
||||
JAVA_VERSION: 17
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Compile and Test
|
||||
runs-on: ubuntu-latest
|
||||
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-java@v2
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: ${{ env.JAVA_VERSION }}
|
||||
cache: 'maven'
|
||||
- name: Build and Test
|
||||
run: mvn -B clean install jacoco:report -Pcoverage,dependency-check
|
||||
159
.github/workflows/release.yml
vendored
159
.github/workflows/release.yml
vendored
@@ -13,7 +13,7 @@ on:
|
||||
- '[0-9]+.[0-9]+.[0-9]+-*'
|
||||
|
||||
env:
|
||||
JAVA_VERSION: 16
|
||||
JAVA_VERSION: 17
|
||||
|
||||
defaults:
|
||||
run:
|
||||
@@ -97,7 +97,7 @@ jobs:
|
||||
echo "::set-output name=semVerNum::${SEM_VER_NUM}"
|
||||
echo "::set-output name=ppaVerStr::${SEM_VER_STR/-/\~}-${REVCOUNT}"
|
||||
echo "::set-output name=revNum::${REVCOUNT}"
|
||||
- uses: rubenesp87/semver-validation-action@0.0.6
|
||||
- uses: skymatic/semver-validation-action@v1
|
||||
with:
|
||||
version: ${{ steps.versions.outputs.semVerStr }}
|
||||
|
||||
@@ -200,6 +200,69 @@ jobs:
|
||||
path: appdir.tar
|
||||
if-no-files-found: error
|
||||
|
||||
#
|
||||
# Linux PPA Source Package
|
||||
#
|
||||
ppa:
|
||||
name: Upload source package to PPA
|
||||
needs: [buildkit, metadata]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: install build tools
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install debhelper devscripts dput
|
||||
- name: Download linux-buildkit
|
||||
uses: actions/download-artifact@v2
|
||||
with:
|
||||
name: linux-buildkit
|
||||
path: pkgdir
|
||||
- name: create orig.tar.gz
|
||||
run: tar -cJf cryptomator_${{ needs.metadata.outputs.ppaVerStr }}.orig.tar.xz -C pkgdir .
|
||||
- name: patch and rename pkgdir
|
||||
run: |
|
||||
cp -r dist/linux/debian/ pkgdir
|
||||
cp -r dist/linux/resources/ pkgdir
|
||||
export RFC2822_TIMESTAMP=`date --rfc-2822`
|
||||
envsubst '${VERSION_STR} ${VERSION_NUM} ${REVISION_NUM}' < dist/linux/debian/rules > pkgdir/debian/rules
|
||||
envsubst '${VERSION_STR}' < dist/linux/debian/org.cryptomator.Cryptomator.desktop > pkgdir/debian/org.cryptomator.Cryptomator.desktop
|
||||
envsubst '${PPA_VERSION} ${RFC2822_TIMESTAMP}' < dist/linux/debian/changelog > pkgdir/debian/changelog
|
||||
find . -name "*.jar" >> pkgdir/debian/source/include-binaries
|
||||
mv pkgdir cryptomator_${{ needs.metadata.outputs.ppaVerStr }}
|
||||
env:
|
||||
VERSION_STR: ${{ needs.metadata.outputs.semVerStr }}
|
||||
VERSION_NUM: ${{ needs.metadata.outputs.semVerNum }}
|
||||
REVISION_NUM: ${{ needs.metadata.outputs.revNum }}
|
||||
PPA_VERSION: ${{ needs.metadata.outputs.ppaVerStr }}-0ppa1
|
||||
- name: import gpg key 615D449FE6E6A235
|
||||
run: |
|
||||
echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
|
||||
echo "${GPG_PASSPHRASE}" | gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --dry-run --sign dist/linux/debian/rules
|
||||
env:
|
||||
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
|
||||
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
|
||||
- name: debuild
|
||||
run: debuild -S -sa -d
|
||||
env:
|
||||
DEBSIGN_PROGRAM: gpg --batch --pinentry-mode loopback
|
||||
DEBSIGN_KEYID: 615D449FE6E6A235
|
||||
working-directory: cryptomator_${{ needs.metadata.outputs.ppaVerStr }}
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: linux-deb-source-package
|
||||
path: |
|
||||
cryptomator_*.dsc
|
||||
cryptomator_*.orig.tar.xz
|
||||
cryptomator_*.debian.tar.xz
|
||||
cryptomator_*_source.changes
|
||||
cryptomator_*_source.buildinfo
|
||||
- name: dput to beta repo
|
||||
run: dput ppa:sebastian-stenzel/cryptomator-beta cryptomator_${PPA_VERSION}_source.changes
|
||||
env:
|
||||
PPA_VERSION: ${{ needs.metadata.outputs.ppaVerStr }}-0ppa1
|
||||
|
||||
#
|
||||
# Linux Cryptomator.AppImage
|
||||
#
|
||||
@@ -220,7 +283,7 @@ jobs:
|
||||
run: |
|
||||
mv appdir/Cryptomator Cryptomator.AppDir
|
||||
cp -r dist/linux/appimage/resources/AppDir/* Cryptomator.AppDir/
|
||||
envsubst '${REVISION_NO}' < dist/linux/appimage/resources/AppDir/bin/cryptomator.sh > Cryptomator.AppDir/bin/cryptomator.sh
|
||||
envsubst '${REVISION_NO} ${SEMVER_STR}' < dist/linux/appimage/resources/AppDir/bin/cryptomator.sh > Cryptomator.AppDir/bin/cryptomator.sh
|
||||
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/org.cryptomator.Cryptomator.svg
|
||||
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/Cryptomator.svg
|
||||
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/.DirIcon
|
||||
@@ -228,6 +291,7 @@ jobs:
|
||||
ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun
|
||||
env:
|
||||
REVISION_NO: ${{ needs.metadata.outputs.revNum }}
|
||||
SEMVER_STR: ${{ needs.metadata.outputs.semVerStr }}
|
||||
- name: Extract libjffi.so # workaround for https://github.com/cryptomator/cryptomator-linux/issues/27
|
||||
run: |
|
||||
JFFI_NATIVE_JAR=`ls lib/app/ | grep -e 'jffi-[1-9]\.[0-9]\{1,2\}.[0-9]\{1,2\}-native.jar'`
|
||||
@@ -493,70 +557,6 @@ jobs:
|
||||
path: installer/*.msi
|
||||
if-no-files-found: error
|
||||
|
||||
#
|
||||
# Linux PPA Source Package
|
||||
#
|
||||
ppa:
|
||||
name: Upload source package to PPA
|
||||
needs: [buildkit, metadata, win-msi, mac-dmg, linux-appimage]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: install build tools
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install debhelper devscripts dput
|
||||
- name: Download linux-buildkit
|
||||
uses: actions/download-artifact@v2
|
||||
with:
|
||||
name: linux-buildkit
|
||||
path: pkgdir
|
||||
- name: create orig.tar.gz
|
||||
run: tar -cJf cryptomator_${{ needs.metadata.outputs.ppaVerStr }}.orig.tar.xz -C pkgdir .
|
||||
- name: patch and rename pkgdir
|
||||
run: |
|
||||
cp -r dist/linux/debian/ pkgdir
|
||||
cp -r dist/linux/resources/ pkgdir
|
||||
export RFC2822_TIMESTAMP=`date --rfc-2822`
|
||||
envsubst '${VERSION_STR} ${VERSION_NUM} ${REVISION_NUM}' < dist/linux/debian/rules > pkgdir/debian/rules
|
||||
envsubst '${VERSION_STR}' < dist/linux/debian/org.cryptomator.Cryptomator.desktop > pkgdir/debian/org.cryptomator.Cryptomator.desktop
|
||||
envsubst '${PPA_VERSION} ${RFC2822_TIMESTAMP}' < dist/linux/debian/changelog > pkgdir/debian/changelog
|
||||
find . -name "*.jar" >> pkgdir/debian/source/include-binaries
|
||||
mv pkgdir cryptomator_${{ needs.metadata.outputs.ppaVerStr }}
|
||||
env:
|
||||
VERSION_STR: ${{ needs.metadata.outputs.semVerStr }}
|
||||
VERSION_NUM: ${{ needs.metadata.outputs.semVerNum }}
|
||||
REVISION_NUM: ${{ needs.metadata.outputs.revNum }}
|
||||
PPA_VERSION: ${{ needs.metadata.outputs.ppaVerStr }}-0ppa1
|
||||
- name: import gpg key 615D449FE6E6A235
|
||||
run: |
|
||||
echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
|
||||
echo "${GPG_PASSPHRASE}" | gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --dry-run --sign dist/linux/debian/rules
|
||||
env:
|
||||
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
|
||||
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
|
||||
- name: debuild
|
||||
run: debuild -S -sa -d
|
||||
env:
|
||||
DEBSIGN_PROGRAM: gpg --batch --pinentry-mode loopback
|
||||
DEBSIGN_KEYID: 615D449FE6E6A235
|
||||
working-directory: cryptomator_${{ needs.metadata.outputs.ppaVerStr }}
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: linux-deb-source-package
|
||||
path: |
|
||||
cryptomator_*.dsc
|
||||
cryptomator_*.orig.tar.xz
|
||||
cryptomator_*.debian.tar.xz
|
||||
cryptomator_*_source.changes
|
||||
cryptomator_*_source.buildinfo
|
||||
- name: dput to beta repo
|
||||
run: dput ppa:sebastian-stenzel/cryptomator-beta cryptomator_${PPA_VERSION}_source.changes
|
||||
env:
|
||||
PPA_VERSION: ${{ needs.metadata.outputs.ppaVerStr }}-0ppa1
|
||||
|
||||
|
||||
#
|
||||
# Release
|
||||
#
|
||||
@@ -565,10 +565,6 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [metadata,linux-appimage,mac-dmg,win-msi,ppa]
|
||||
if: startsWith(github.ref, 'refs/tags/') && github.repository == 'cryptomator/cryptomator'
|
||||
env:
|
||||
APPIMAGE_SHA256_MSG: undefined
|
||||
DMG_SHA256_MSG: undefined
|
||||
MSI_SHA256_MSG: undefined
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Create tarball
|
||||
@@ -594,14 +590,13 @@ jobs:
|
||||
env:
|
||||
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
|
||||
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
|
||||
- name: Compute SHA256 checksums of release artifacts # sha256sum is split on the whitespace with sed and reorderd. env keys are file name extensions in uppercase
|
||||
- name: Compute SHA256 checksums of release artifacts
|
||||
run: |
|
||||
for FILE in `find . -name "*.AppImage" -o -name "*.dmg" -o -name "*.msi" -o -name "*.zsync" -o -name "*.tar.gz"`; do
|
||||
CHECKSUM_MSG=$(sha256sum ${FILE})
|
||||
VALUE=$(echo ${CHECKSUM_MSG} | sed 's/\([0-9,a-f]\{64\}\)[[:blank:]]\([Cc]ryptomator-.*$\)/\2: `\1`/' )
|
||||
KEY=$(echo ${CHECKSUM_MSG} | sed 's/.*[[:blank:]].*\.\(.*$\)/\1/')
|
||||
echo "{${KEY^^}_SHA256_MSG}={${VALUE}}" >> $GITHUB_ENV
|
||||
done
|
||||
SHA256_SUMS=`find . -name "*.AppImage" -o -name "*.dmg" -o -name "*.msi" -o -name "*.tar.gz" | xargs sha256sum`
|
||||
echo "SHA256_SUMS<<EOF" >> $GITHUB_ENV
|
||||
echo "${SHA256_SUMS}" >> $GITHUB_ENV
|
||||
echo "EOF" >> $GITHUB_ENV
|
||||
continue-on-error: true
|
||||
- name: Create release draft
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
@@ -623,7 +618,7 @@ jobs:
|
||||
---
|
||||
:scroll: A complete list of closed issues is available [here](LINK)
|
||||
---
|
||||
Checksums of release artifacts:
|
||||
* ${{ env.APPIMAGE_SHA256_MSG}}
|
||||
* ${{ env.DMG_SHA256_MSG}}
|
||||
* ${{ env.MSI_SHA_256_MSG}}
|
||||
:floppy_disk: SHA-256 checksums of release artifacts:
|
||||
```
|
||||
${{ env.SHA256_SUMS }}
|
||||
```
|
||||
|
||||
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -8,7 +8,7 @@
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_16" project-jdk-name="16" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="17" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -72,7 +72,7 @@ For more information on the security details visit [cryptomator.org](https://doc
|
||||
|
||||
### Dependencies
|
||||
|
||||
* JDK 16 (e.g. adoptopenjdk)
|
||||
* JDK 17 (e.g. temurin)
|
||||
* Maven 3
|
||||
* Optional: OS-dependent build tools for native packaging (see [Windows](https://github.com/cryptomator/cryptomator-win), [OS X](https://github.com/cryptomator/cryptomator-osx), [Linux](https://github.com/cryptomator/builder-containers))
|
||||
|
||||
|
||||
@@ -26,12 +26,15 @@ export LD_PRELOAD=lib/app/libjffi.so
|
||||
./lib/runtime/bin/java \
|
||||
-p "lib/app/mods" \
|
||||
-cp "lib/app/*" \
|
||||
-Dfile.encoding="utf-8" \
|
||||
-Dcryptomator.logDir="~/.local/share/Cryptomator/logs" \
|
||||
-Dcryptomator.pluginDir="~/.local/share/Cryptomator/plugins" \
|
||||
-Dcryptomator.mountPointsDir="~/.local/share/Cryptomator/mnt" \
|
||||
-Dcryptomator.settingsPath="~/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json" \
|
||||
-Dcryptomator.ipcSocketPath="~/.config/Cryptomator/ipc.socket" \
|
||||
-Dcryptomator.buildNumber="appimage-${REVISION_NO}" \
|
||||
-Dcryptomator.appVersion="${SEMVER_STR}" \
|
||||
$GTK_FLAG \
|
||||
-Xss2m \
|
||||
-Xmx512m \
|
||||
-Xss5m \
|
||||
-Xmx256m \
|
||||
-m org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator
|
||||
|
||||
2
dist/linux/debian/control
vendored
2
dist/linux/debian/control
vendored
@@ -2,7 +2,7 @@ Source: cryptomator
|
||||
Maintainer: Cryptobot <releases@cryptomator.org>
|
||||
Section: utils
|
||||
Priority: optional
|
||||
Build-Depends: debhelper (>=10), openjdk-16-jdk
|
||||
Build-Depends: debhelper (>=10), openjdk-17-jdk
|
||||
Standards-Version: 4.5.0
|
||||
Homepage: https://cryptomator.org
|
||||
Vcs-Git: https://github.com/cryptomator/cryptomator.git
|
||||
|
||||
3
dist/mac/dmg/.gitignore
vendored
Normal file
3
dist/mac/dmg/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# created during build
|
||||
runtime/
|
||||
*.app/
|
||||
96
dist/mac/dmg/build.sh
vendored
Executable file
96
dist/mac/dmg/build.sh
vendored
Executable file
@@ -0,0 +1,96 @@
|
||||
#!/bin/bash
|
||||
|
||||
# parse options
|
||||
usage() { echo "Usage: $0 [-s <codesign-identity>]" 1>&2; exit 1; }
|
||||
while getopts ":s:" o; do
|
||||
case "${o}" in
|
||||
s)
|
||||
CODESIGN_IDENTITY=${OPTARG}
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND-1))"
|
||||
|
||||
# prepare working dir and variables
|
||||
cd $(dirname $0)
|
||||
rm -rf runtime *.app
|
||||
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'`
|
||||
|
||||
# check preconditions
|
||||
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."; exit 1; }
|
||||
if [ -n "${CODESIGN_IDENTITY}" ]; then
|
||||
command -v codesign >/dev/null 2>&1 || { echo >&2 "codesign not found. Fix by 'xcode-select --install'."; exit 1; }
|
||||
if [[ ! `security find-identity -v -p codesigning | grep -w "${CODESIGN_IDENTITY}"` ]]; then echo "Given codesign identity is invalid."; exit 1; fi
|
||||
fi
|
||||
|
||||
# compile
|
||||
mvn -B -f../../../pom.xml clean package -DskipTests -Pmac
|
||||
cp ../../../target/cryptomator-*.jar ../../../target/mods
|
||||
|
||||
# add runtime
|
||||
${JAVA_HOME}/bin/jlink \
|
||||
--output runtime \
|
||||
--module-path "${JAVA_HOME}/jmods" \
|
||||
--add-modules java.base,java.desktop,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,jdk.unsupported,jdk.crypto.ec,jdk.accessibility \
|
||||
--no-header-files \
|
||||
--no-man-pages \
|
||||
--strip-debug \
|
||||
--compress=1
|
||||
|
||||
# create app dir
|
||||
${JAVA_HOME}/bin/jpackage \
|
||||
--verbose \
|
||||
--type app-image \
|
||||
--runtime-image runtime \
|
||||
--input ../../../target/libs \
|
||||
--module-path ../../../target/mods \
|
||||
--module org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator \
|
||||
--dest . \
|
||||
--name Cryptomator \
|
||||
--vendor "Skymatic GmbH" \
|
||||
--copyright "(C) 2016 - 2021 Skymatic GmbH" \
|
||||
--java-options "-Xss5m" \
|
||||
--java-options "-Xmx256m" \
|
||||
--java-options "-Dcryptomator.appVersion=\"${VERSION_NO}\"" \
|
||||
--app-version "${VERSION_NO}" \
|
||||
--java-options "-Dfile.encoding=\"utf-8\"" \
|
||||
--java-options "-Dcryptomator.logDir=\"~/Library/Logs/Cryptomator\"" \
|
||||
--java-options "-Dcryptomator.pluginDir=\"~/Library/Application Support/Cryptomator/Plugins\"" \
|
||||
--java-options "-Dcryptomator.settingsPath=\"~/Library/Application Support/Cryptomator/settings.json\"" \
|
||||
--java-options "-Dcryptomator.ipcSocketPath=\"~/Library/Application Support/Cryptomator/ipc.socket\"" \
|
||||
--java-options "-Dcryptomator.showTrayIcon=true" \
|
||||
--java-options "-Dcryptomator.buildNumber=\"dmg-${REVISION_NO}\"" \
|
||||
--mac-package-identifier org.cryptomator \
|
||||
--resource-dir ../resources
|
||||
|
||||
# transform app dir
|
||||
cp ../resources/Cryptomator-Vault.icns Cryptomator.app/Contents/Resources/
|
||||
sed -i '' "s|###BUNDLE_SHORT_VERSION_STRING###|${VERSION_NO}|g" Cryptomator.app/Contents/Info.plist
|
||||
sed -i '' "s|###BUNDLE_VERSION###|${REVISION_NO}|g" Cryptomator.app/Contents/Info.plist
|
||||
|
||||
# codesign
|
||||
if [ -n "${CODESIGN_IDENTITY}" ]; then
|
||||
find Cryptomator.app/Contents/runtime/Contents/MacOS -name '*.dylib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \;
|
||||
for JAR_PATH in `find Cryptomator.app -name "*.jar"`; do
|
||||
if [[ `unzip -l ${JAR_PATH} | grep '.dylib\|.jnilib'` ]]; then
|
||||
JAR_FILENAME=$(basename ${JAR_PATH})
|
||||
OUTPUT_PATH=${JAR_PATH%.*}
|
||||
echo "Codesigning libs in ${JAR_FILENAME}..."
|
||||
unzip -q ${JAR_PATH} -d ${OUTPUT_PATH}
|
||||
find ${OUTPUT_PATH} -name '*.dylib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \;
|
||||
find ${OUTPUT_PATH} -name '*.jnilib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \;
|
||||
rm ${JAR_PATH}
|
||||
pushd ${OUTPUT_PATH} > /dev/null
|
||||
zip -qr ../${JAR_FILENAME} *
|
||||
popd > /dev/null
|
||||
rm -r ${OUTPUT_PATH}
|
||||
fi
|
||||
done
|
||||
echo "Codesigning Cryptomator.app..."
|
||||
codesign --force --deep --entitlements ../Cryptomator.entitlements -o runtime -s ${CODESIGN_IDENTITY} Cryptomator.app
|
||||
fi
|
||||
45
pom.xml
45
pom.xml
@@ -21,36 +21,36 @@
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.jdk.version>16</project.jdk.version>
|
||||
<project.jdk.version>17</project.jdk.version>
|
||||
|
||||
<!-- Group IDs of jars that need to stay on the class path for now -->
|
||||
<nonModularGroupIds>com.github.serceman,com.github.jnr,org.ow2.asm,net.java.dev.jna,org.apache.jackrabbit,org.apache.httpcomponents,de.swiesend,org.purejava,com.github.hypfvieh</nonModularGroupIds>
|
||||
|
||||
<!-- cryptomator dependencies -->
|
||||
<cryptomator.cryptofs.version>2.1.0-beta13</cryptomator.cryptofs.version>
|
||||
<cryptomator.integrations.version>1.0.0-rc1</cryptomator.integrations.version>
|
||||
<cryptomator.integrations.win.version>1.0.0-beta2</cryptomator.integrations.win.version>
|
||||
<cryptomator.integrations.mac.version>1.0.0-beta2</cryptomator.integrations.mac.version>
|
||||
<cryptomator.integrations.linux.version>1.0.0-beta1</cryptomator.integrations.linux.version>
|
||||
<cryptomator.integrations.version>1.0.0</cryptomator.integrations.version>
|
||||
<cryptomator.integrations.win.version>1.0.0-rc1</cryptomator.integrations.win.version>
|
||||
<cryptomator.integrations.mac.version>1.0.0-rc1</cryptomator.integrations.mac.version>
|
||||
<cryptomator.integrations.linux.version>1.0.0-rc2</cryptomator.integrations.linux.version>
|
||||
<cryptomator.fuse.version>1.3.2</cryptomator.fuse.version>
|
||||
<cryptomator.dokany.version>1.3.2</cryptomator.dokany.version>
|
||||
<cryptomator.dokany.version>1.3.3</cryptomator.dokany.version>
|
||||
<cryptomator.webdav.version>1.2.6</cryptomator.webdav.version>
|
||||
|
||||
<!-- 3rd party dependencies -->
|
||||
<javafx.version>16</javafx.version>
|
||||
<javafx.version>17.0.0.1</javafx.version>
|
||||
<commons-lang3.version>3.12.0</commons-lang3.version>
|
||||
<jwt.version>3.18.1</jwt.version>
|
||||
<jwt.version>3.18.2</jwt.version>
|
||||
<easybind.version>2.2</easybind.version>
|
||||
<guava.version>30.1.1-jre</guava.version>
|
||||
<dagger.version>2.38.1</dagger.version>
|
||||
<gson.version>2.8.7</gson.version>
|
||||
<guava.version>31.0-jre</guava.version>
|
||||
<dagger.version>2.39</dagger.version>
|
||||
<gson.version>2.8.8</gson.version>
|
||||
<zxcvbn.version>1.5.2</zxcvbn.version>
|
||||
<slf4j.version>1.7.31</slf4j.version>
|
||||
<logback.version>1.2.3</logback.version>
|
||||
<slf4j.version>1.7.32</slf4j.version>
|
||||
<logback.version>1.2.6</logback.version>
|
||||
|
||||
<!-- test dependencies -->
|
||||
<junit.jupiter.version>5.7.2</junit.jupiter.version>
|
||||
<mockito.version>3.11.2</mockito.version>
|
||||
<junit.jupiter.version>5.8.1</junit.jupiter.version>
|
||||
<mockito.version>3.12.4</mockito.version>
|
||||
<hamcrest.version>2.2</hamcrest.version>
|
||||
</properties>
|
||||
|
||||
@@ -222,19 +222,6 @@
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>maven-central</id>
|
||||
<name>Maven Central Repo</name>
|
||||
<url>https://repo.maven.apache.org/maven2</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>google-maven</id>
|
||||
<name>Google Maven Repo</name>
|
||||
<url>https://maven.google.com</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<build>
|
||||
<pluginManagement>
|
||||
<plugins>
|
||||
@@ -276,7 +263,7 @@
|
||||
<plugin>
|
||||
<groupId>org.owasp</groupId>
|
||||
<artifactId>dependency-check-maven</artifactId>
|
||||
<version>6.2.2</version>
|
||||
<version>6.3.1</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
|
||||
@@ -5,6 +5,7 @@ public interface Constants {
|
||||
String MASTERKEY_FILENAME = "masterkey.cryptomator";
|
||||
String MASTERKEY_BACKUP_SUFFIX = ".bkup";
|
||||
String VAULTCONFIG_FILENAME = "vault.cryptomator";
|
||||
String CRYPTOMATOR_FILENAME_EXT = ".cryptomator";
|
||||
byte[] PEPPER = new byte[0];
|
||||
|
||||
}
|
||||
|
||||
@@ -38,6 +38,11 @@ public class KeychainManager implements KeychainAccessProvider {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String displayName() {
|
||||
return getClass().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void storePassphrase(String key, CharSequence passphrase) throws KeychainAccessException {
|
||||
getKeychainOrFail().storePassphrase(key, passphrase);
|
||||
|
||||
@@ -29,16 +29,20 @@ import javafx.scene.control.ToggleGroup;
|
||||
import javafx.stage.DirectoryChooser;
|
||||
import javafx.stage.Stage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.UUID;
|
||||
|
||||
@AddVaultWizardScoped
|
||||
public class CreateNewVaultLocationController implements FxController {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(CreateNewVaultLocationController.class);
|
||||
private static final Path DEFAULT_CUSTOM_VAULT_PATH = Paths.get(System.getProperty("user.home"));
|
||||
private static final String TEMP_FILE_FORMAT = "cryptomator-%s.tmp";
|
||||
|
||||
private final Stage window;
|
||||
private final Lazy<Scene> chooseNameScene;
|
||||
@@ -92,7 +96,7 @@ public class CreateNewVaultLocationController implements FxController {
|
||||
statusText.set(resourceBundle.getString("addvaultwizard.new.locationDoesNotExist"));
|
||||
statusGraphic.set(badLocation);
|
||||
return false;
|
||||
} else if (!Files.isWritable(p.getParent())) {
|
||||
} else if (!isActuallyWritable(p.getParent())) {
|
||||
statusText.set(resourceBundle.getString("addvaultwizard.new.locationIsNotWritable"));
|
||||
statusGraphic.set(badLocation);
|
||||
return false;
|
||||
@@ -107,6 +111,21 @@ public class CreateNewVaultLocationController implements FxController {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isActuallyWritable(Path p) {
|
||||
Path tmpFile = p.resolve(String.format(TEMP_FILE_FORMAT, UUID.randomUUID()));
|
||||
try (var chan = Files.newByteChannel(tmpFile, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE, StandardOpenOption.DELETE_ON_CLOSE)) {
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
} finally {
|
||||
try {
|
||||
Files.deleteIfExists(tmpFile);
|
||||
} catch (IOException e) {
|
||||
LOG.warn("Unable to delete temporary file {}. Needs to be deleted manually.", tmpFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void initialize() {
|
||||
predefinedLocationToggler.selectedToggleProperty().addListener(this::togglePredefinedLocation);
|
||||
|
||||
@@ -10,6 +10,7 @@ package org.cryptomator.ui.controls;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.NamedArg;
|
||||
import javafx.beans.Observable;
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
@@ -27,7 +28,6 @@ import javafx.scene.input.KeyCodeCombination;
|
||||
import javafx.scene.input.KeyCombination;
|
||||
import javafx.scene.input.KeyEvent;
|
||||
import javafx.scene.input.TransferMode;
|
||||
import java.awt.Toolkit;
|
||||
import java.nio.CharBuffer;
|
||||
import java.text.Normalizer;
|
||||
import java.text.Normalizer.Form;
|
||||
@@ -123,8 +123,7 @@ public class SecurePasswordField extends TextField {
|
||||
}
|
||||
|
||||
private void updateCapsLocked() {
|
||||
//TODO: fixed in JavaFX 17. AWT code needed until update (see https://bugs.openjdk.java.net/browse/JDK-8259680)
|
||||
capsLocked.set(isFocused() && Toolkit.getDefaultToolkit().getLockingKeyState(java.awt.event.KeyEvent.VK_CAPS_LOCK));
|
||||
capsLocked.set(Platform.isKeyLocked(KeyCode.CAPS).orElse(false));
|
||||
}
|
||||
|
||||
private void updateContainingNonPrintableChars() {
|
||||
|
||||
@@ -1,16 +1,14 @@
|
||||
package org.cryptomator.ui.health;
|
||||
|
||||
import com.tobiasdiez.easybind.EasyBind;
|
||||
import com.tobiasdiez.easybind.Subscription;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.beans.binding.Binding;
|
||||
import javafx.beans.binding.Bindings;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.SimpleObjectProperty;
|
||||
import javafx.scene.control.CheckBox;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class CheckListCellController implements FxController {
|
||||
|
||||
@@ -18,26 +16,26 @@ public class CheckListCellController implements FxController {
|
||||
private final ObjectProperty<Check> check;
|
||||
private final Binding<String> checkName;
|
||||
private final Binding<Boolean> checkRunnable;
|
||||
private final List<Subscription> subscriptions;
|
||||
|
||||
/* FXML */
|
||||
public CheckBox forRunSelectedCheckBox;
|
||||
public CheckBox checkbox;
|
||||
|
||||
@Inject
|
||||
public CheckListCellController() {
|
||||
check = new SimpleObjectProperty<>();
|
||||
checkRunnable = EasyBind.wrapNullable(check).mapObservable(Check::stateProperty).map(Check.CheckState.RUNNABLE::equals).orElse(false);
|
||||
checkName = EasyBind.wrapNullable(check).map(Check::getName).orElse("");
|
||||
subscriptions = new ArrayList<>();
|
||||
}
|
||||
|
||||
public void initialize() {
|
||||
subscriptions.add(EasyBind.subscribe(check, c -> {
|
||||
forRunSelectedCheckBox.selectedProperty().unbind();
|
||||
if (c != null) {
|
||||
forRunSelectedCheckBox.selectedProperty().bindBidirectional(c.chosenForExecutionProperty());
|
||||
check.addListener((observable, oldVal, newVal) -> {
|
||||
if (oldVal != null) {
|
||||
Bindings.unbindBidirectional(checkbox.selectedProperty(), oldVal.chosenForExecutionProperty());
|
||||
}
|
||||
}));
|
||||
if (newVal != null) {
|
||||
Bindings.bindBidirectional(checkbox.selectedProperty(), newVal.chosenForExecutionProperty());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public ObjectProperty<Check> checkProperty() {
|
||||
|
||||
@@ -11,12 +11,11 @@ import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
import javafx.application.Platform;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.NoSuchFileException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import static org.cryptomator.common.Constants.MASTERKEY_FILENAME;
|
||||
import static org.cryptomator.common.Constants.CRYPTOMATOR_FILENAME_EXT;
|
||||
|
||||
@Singleton
|
||||
class AppLaunchEventHandler {
|
||||
@@ -69,7 +68,7 @@ class AppLaunchEventHandler {
|
||||
assert Platform.isFxApplicationThread();
|
||||
try {
|
||||
final Vault v;
|
||||
if (potentialVaultPath.getFileName().toString().equals(MASTERKEY_FILENAME)) {
|
||||
if (potentialVaultPath.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT)) {
|
||||
v = vaultListManager.add(potentialVaultPath.getParent());
|
||||
} else {
|
||||
v = vaultListManager.add(potentialVaultPath);
|
||||
|
||||
@@ -27,6 +27,7 @@ import java.nio.file.Path;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.cryptomator.common.Constants.CRYPTOMATOR_FILENAME_EXT;
|
||||
import static org.cryptomator.common.Constants.MASTERKEY_FILENAME;
|
||||
import static org.cryptomator.common.Constants.VAULTCONFIG_FILENAME;
|
||||
|
||||
@@ -94,6 +95,9 @@ public class MainWindowController implements FxController {
|
||||
|
||||
private boolean containsVault(Path path) {
|
||||
try {
|
||||
if (path.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT)) {
|
||||
path = path.getParent();
|
||||
}
|
||||
return CryptoFileSystemProvider.checkDirStructureForVault(path, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME) != DirStructure.UNRELATED;
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
@@ -102,7 +106,7 @@ public class MainWindowController implements FxController {
|
||||
|
||||
private void addVault(Path pathToVault) {
|
||||
try {
|
||||
if (pathToVault.getFileName().toString().equals(VAULTCONFIG_FILENAME)) {
|
||||
if (pathToVault.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT)) {
|
||||
vaultListManager.add(pathToVault.getParent());
|
||||
} else {
|
||||
vaultListManager.add(pathToVault);
|
||||
|
||||
@@ -6,6 +6,7 @@ import dagger.Provides;
|
||||
import dagger.multibindings.IntoMap;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent;
|
||||
import org.cryptomator.ui.common.ErrorComponent;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.common.FxControllerKey;
|
||||
import org.cryptomator.ui.common.FxmlFile;
|
||||
@@ -19,16 +20,18 @@ import org.cryptomator.ui.stats.VaultStatisticsComponent;
|
||||
import org.cryptomator.ui.vaultoptions.VaultOptionsComponent;
|
||||
import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent;
|
||||
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Provider;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.SimpleObjectProperty;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.stage.Modality;
|
||||
import javafx.stage.Stage;
|
||||
import javafx.stage.StageStyle;
|
||||
import java.util.Map;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
@Module(subcomponents = {AddVaultWizardComponent.class, HealthCheckComponent.class, MigrationComponent.class, RemoveVaultComponent.class, VaultOptionsComponent.class, VaultStatisticsComponent.class, WrongFileAlertComponent.class})
|
||||
@Module(subcomponents = {AddVaultWizardComponent.class, HealthCheckComponent.class, MigrationComponent.class, RemoveVaultComponent.class, VaultOptionsComponent.class, VaultStatisticsComponent.class, WrongFileAlertComponent.class, ErrorComponent.class})
|
||||
abstract class MainWindowModule {
|
||||
|
||||
@Provides
|
||||
@@ -55,6 +58,17 @@ abstract class MainWindowModule {
|
||||
return stage;
|
||||
}
|
||||
|
||||
@Provides
|
||||
@MainWindowScoped
|
||||
@Named("errorWindow")
|
||||
static Stage provideErrorStage(@MainWindow Stage window, StageFactory factory, ResourceBundle resourceBundle) {
|
||||
Stage stage = factory.create(StageStyle.DECORATED);
|
||||
stage.setTitle(resourceBundle.getString("main.vaultDetail.error.windowTitle"));
|
||||
stage.initModality(Modality.APPLICATION_MODAL);
|
||||
stage.initOwner(window);
|
||||
return stage;
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxmlScene(FxmlFile.MAIN_WINDOW)
|
||||
@MainWindowScoped
|
||||
|
||||
@@ -2,45 +2,46 @@ package org.cryptomator.ui.mainwindow;
|
||||
|
||||
import com.tobiasdiez.easybind.EasyBind;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.common.vaults.VaultListManager;
|
||||
import org.cryptomator.ui.common.ErrorComponent;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.removevault.RemoveVaultComponent;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javafx.beans.binding.Binding;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
@MainWindowScoped
|
||||
public class VaultDetailUnknownErrorController implements FxController {
|
||||
|
||||
private final Binding<String> stackTrace;
|
||||
private final ObjectProperty<Vault> vault;
|
||||
private final ErrorComponent.Builder errorComponentBuilder;
|
||||
private final Stage errorWindow;
|
||||
private final RemoveVaultComponent.Builder removeVault;
|
||||
|
||||
@Inject
|
||||
public VaultDetailUnknownErrorController(ObjectProperty<Vault> vault) {
|
||||
this.stackTrace = EasyBind.select(vault) //
|
||||
.selectObject(Vault::lastKnownExceptionProperty) //
|
||||
.map(this::provideStackTrace);
|
||||
public VaultDetailUnknownErrorController(ObjectProperty<Vault> vault, ErrorComponent.Builder errorComponentBuilder, @Named("errorWindow") Stage errorWindow, RemoveVaultComponent.Builder removeVault) {
|
||||
this.vault = vault;
|
||||
this.errorComponentBuilder = errorComponentBuilder;
|
||||
this.errorWindow = errorWindow;
|
||||
this.removeVault = removeVault;
|
||||
}
|
||||
|
||||
private String provideStackTrace(Throwable cause) {
|
||||
// TODO deduplicate ErrorModule.java
|
||||
if (cause != null) {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
cause.printStackTrace(new PrintStream(baos));
|
||||
return baos.toString(StandardCharsets.UTF_8);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
@FXML
|
||||
public void showError() {
|
||||
errorComponentBuilder.window(errorWindow).cause(vault.get().getLastKnownException()).build().showErrorScene();
|
||||
}
|
||||
|
||||
/* Getter/Setter */
|
||||
|
||||
public Binding<String> stackTraceProperty() {
|
||||
return stackTrace;
|
||||
@FXML
|
||||
public void reload() {
|
||||
VaultListManager.redetermineVaultState(vault.get());
|
||||
}
|
||||
|
||||
public String getStackTrace() {
|
||||
return stackTrace.getValue();
|
||||
@FXML
|
||||
void didClickRemoveVault() {
|
||||
removeVault.vault(vault.get()).build().showRemoveVault();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,6 @@ abstract class PreferencesModule {
|
||||
static Stage provideStage(StageFactory factory, ResourceBundle resourceBundle) {
|
||||
Stage stage = factory.create();
|
||||
stage.setTitle(resourceBundle.getString("preferences.title"));
|
||||
stage.setResizable(false);
|
||||
return stage;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ import javafx.stage.DirectoryChooser;
|
||||
import javafx.stage.Stage;
|
||||
import javafx.util.StringConverter;
|
||||
import java.io.File;
|
||||
import java.nio.file.InvalidPathException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.Set;
|
||||
@@ -94,7 +95,9 @@ public class MountOptionsController implements FxController {
|
||||
driveLetterSelection.setConverter(new WinDriveLetterLabelConverter(windowsDriveLetters, resourceBundle));
|
||||
driveLetterSelection.setValue(vault.getVaultSettings().winDriveLetter().get());
|
||||
|
||||
if (vault.getVaultSettings().useCustomMountPath().get() && !getRestrictToStableFuseOnWindows() /* to prevent invalid states */) {
|
||||
if (vault.getVaultSettings().useCustomMountPath().get()
|
||||
&& vault.getVaultSettings().getCustomMountPath().isPresent()
|
||||
&& !getRestrictToStableFuseOnWindows() /* to prevent invalid states */) {
|
||||
mountPoint.selectToggle(mountPointCustomDir);
|
||||
} else if (!Strings.isNullOrEmpty(vault.getVaultSettings().winDriveLetter().get())) {
|
||||
mountPoint.selectToggle(mountPointWinDriveLetter);
|
||||
@@ -125,25 +128,30 @@ public class MountOptionsController implements FxController {
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void chooseCustomMountPoint() {
|
||||
public void chooseCustomMountPoint() {
|
||||
chooseCustomMountPointOrReset(mountPointCustomDir);
|
||||
}
|
||||
|
||||
private void chooseCustomMountPointOrReset(Toggle previousMountToggle) {
|
||||
DirectoryChooser directoryChooser = new DirectoryChooser();
|
||||
directoryChooser.setTitle(resourceBundle.getString("vaultOptions.mount.mountPoint.directoryPickerTitle"));
|
||||
try {
|
||||
directoryChooser.setInitialDirectory(Path.of(System.getProperty("user.home")).toFile());
|
||||
} catch (Exception e) {
|
||||
//NO-OP
|
||||
var initialDir = vault.getVaultSettings().getCustomMountPath().orElse(System.getProperty("user.home"));
|
||||
directoryChooser.setInitialDirectory(Path.of(initialDir).toFile());
|
||||
} catch (InvalidPathException e) {
|
||||
// no-op
|
||||
}
|
||||
File file = directoryChooser.showDialog(window);
|
||||
if (file != null) {
|
||||
vault.getVaultSettings().customMountPath().set(file.getAbsolutePath());
|
||||
} else {
|
||||
vault.getVaultSettings().customMountPath().set(null);
|
||||
mountPoint.selectToggle(previousMountToggle);
|
||||
}
|
||||
}
|
||||
|
||||
private void toggleMountPoint(@SuppressWarnings("unused") ObservableValue<? extends Toggle> observable, @SuppressWarnings("unused") Toggle oldValue, Toggle newValue) {
|
||||
private void toggleMountPoint(@SuppressWarnings("unused") ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) {
|
||||
if (mountPointCustomDir.equals(newValue) && Strings.isNullOrEmpty(vault.getVaultSettings().customMountPath().get())) {
|
||||
chooseCustomMountPoint();
|
||||
chooseCustomMountPointOrReset(oldValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ButtonBar?>
|
||||
<?import javafx.scene.control.CheckBox?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.ListView?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
@@ -27,7 +26,7 @@
|
||||
<ListView fx:id="checksListView" VBox.vgrow="ALWAYS" minWidth="175" maxWidth="175"/>
|
||||
<VBox alignment="CENTER" visible="${!controller.mainRunStarted}" managed="${!controller.mainRunStarted}" HBox.hgrow="ALWAYS" spacing="12">
|
||||
<Label text="%health.checkList.description" wrapText="true"/>
|
||||
<HBox alignment="CENTER">
|
||||
<HBox alignment="CENTER" spacing="6">
|
||||
<Button onAction="#selectAllChecks" text="%health.checkList.selectAllButton" />
|
||||
<Button onAction="#deselectAllChecks" text="%health.checkList.deselectAllButton" />
|
||||
</HBox>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
</padding>
|
||||
|
||||
<StackPane minWidth="20" minHeight="20" alignment="CENTER">
|
||||
<CheckBox fx:id="forRunSelectedCheckBox" visible="${controller.checkRunnable}" />
|
||||
<CheckBox fx:id="checkbox" visible="${controller.checkRunnable}"/>
|
||||
<CheckStateIconView check="${controller.check}" glyphSize="20" visible="${!controller.checkRunnable}"/>
|
||||
</StackPane>
|
||||
<Label text="${controller.checkName}"/>
|
||||
|
||||
@@ -1,15 +1,42 @@
|
||||
<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.TextArea?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.shape.Circle?>
|
||||
<VBox xmlns:fx="http://javafx.com/fxml"
|
||||
xmlns="http://javafx.com/javafx"
|
||||
fx:controller="org.cryptomator.ui.mainwindow.VaultDetailUnknownErrorController"
|
||||
alignment="CENTER"
|
||||
spacing="24">
|
||||
alignment="TOP_CENTER"
|
||||
spacing="9">
|
||||
<children>
|
||||
<Label text="%generic.error.title" wrapText="true"/>
|
||||
<Label text="%generic.error.instruction" wrapText="true"/>
|
||||
|
||||
<TextArea VBox.vgrow="ALWAYS" text="${controller.stackTrace}" prefRowCount="5" editable="false"/>
|
||||
<StackPane VBox.vgrow="NEVER">
|
||||
<Circle styleClass="glyph-icon-primary" radius="48"/>
|
||||
<FontAwesome5IconView styleClass="glyph-icon-white" glyph="FILE" glyphSize="48"/>
|
||||
<FontAwesome5IconView styleClass="glyph-icon-primary" glyph="TIMES" glyphSize="24">
|
||||
<StackPane.margin>
|
||||
<Insets top="12"/>
|
||||
</StackPane.margin>
|
||||
</FontAwesome5IconView>
|
||||
</StackPane>
|
||||
<Label text="%main.vaultDetail.error.info" wrapText="true"/>
|
||||
<VBox spacing="6" alignment="BASELINE_CENTER" VBox.vgrow="NEVER">
|
||||
<Button styleClass="" text="Show Error Details" onAction="#showError">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="INFO"/>
|
||||
</graphic>
|
||||
</Button>
|
||||
<Button text="%main.vaultDetail.error.reload" minWidth="120" onAction="#reload">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="REDO"/>
|
||||
</graphic>
|
||||
</Button>
|
||||
<Button text="%main.vaultDetail.missing.remove" minWidth="120" onAction="#didClickRemoveVault">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="TRASH"/>
|
||||
</graphic>
|
||||
</Button>
|
||||
</VBox>
|
||||
</children>
|
||||
</VBox>
|
||||
@@ -300,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Change Vault Location…
|
||||
### Needs Migration
|
||||
main.vaultDetail.migrateButton=Upgrade Vault
|
||||
main.vaultDetail.migratePrompt=Your vault needs to be upgraded to a new format, before you can access it
|
||||
### Error
|
||||
main.vaultDetail.error.info=An error occurred loading the vault from disk.
|
||||
main.vaultDetail.error.reload=Reload
|
||||
main.vaultDetail.error.windowTitle=Error loading vault
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.title=How to Encrypt Files
|
||||
|
||||
@@ -76,7 +76,7 @@ addvault.new.readme.accessLocation.3=Alle zu diesem Laufwerk hinzugefügten Date
|
||||
addvault.new.readme.accessLocation.4=Diese Datei kannst du löschen.
|
||||
## Existing
|
||||
addvaultwizard.existing.instruction=Wähle die Datei „masterkey.cryptomator“ deines vorhandenen Tresors aus.
|
||||
addvaultwizard.existing.chooseBtn=Durchsuchen …
|
||||
addvaultwizard.existing.chooseBtn=Durchsuchen…
|
||||
addvaultwizard.existing.filePickerTitle=Masterkey-Datei auswählen
|
||||
## Success
|
||||
addvaultwizard.success.nextStepsInstructions=Tresor „%s“ hinzugefügt.\nUm auf Inhalte zuzugreifen oder welche hinzuzufügen, musst du den Tresor entsperren. Du kannst ihn aber auch zu jedem späteren Zeitpunkt entsperren.
|
||||
@@ -98,7 +98,7 @@ forgetPassword.information=Dies löscht das gespeicherte Passwort dieses Tresors
|
||||
forgetPassword.confirmBtn=Passwort vergessen
|
||||
|
||||
# Unlock
|
||||
unlock.title=Entsperre "%s"
|
||||
unlock.title="%s" entsperren
|
||||
unlock.passwordPrompt=Gib das Passwort für „%s“ ein:
|
||||
unlock.savePassword=Passwort merken
|
||||
unlock.unlockBtn=Entsperren
|
||||
@@ -294,8 +294,8 @@ main.vaultDetail.stats=Tresorstatistik
|
||||
### Missing
|
||||
main.vaultDetail.missing.info=Cryptomator konnte keinen Tresor mit diesem Pfad finden.
|
||||
main.vaultDetail.missing.recheck=Erneut prüfen
|
||||
main.vaultDetail.missing.remove=Aus Tresorliste entfernen…
|
||||
main.vaultDetail.missing.changeLocation=Speicherort des Tresors ändern…
|
||||
main.vaultDetail.missing.remove=Aus Tresorliste entfernen …
|
||||
main.vaultDetail.missing.changeLocation=Speicherort des Tresors ändern …
|
||||
### Needs Migration
|
||||
main.vaultDetail.migrateButton=Tresor aktualisieren
|
||||
main.vaultDetail.migratePrompt=Dein Tresor muss auf ein neues Format aktualisiert werden, bevor du auf ihn zugreifen kannst
|
||||
|
||||
@@ -13,9 +13,14 @@ generic.button.done=Κλείσιμο
|
||||
generic.button.next=Επόμενο
|
||||
generic.button.print=Εκτύπωση
|
||||
## Error
|
||||
generic.error.title=Σφάλμα %s
|
||||
generic.error.instruction=Ωχ! Το Cryptomator δεν περίμενε να συμβεί αυτό. Μπορείτε να αναζητήσετε υπάρχουσες λύσεις για αυτό το σφάλμα. Ή εάν δεν έχει αναφερθεί ακόμα, μη διστάσετε να το κάνετε.
|
||||
generic.error.hyperlink.lookup=Αναζήτηση αυτού του σφάλματος
|
||||
generic.error.hyperlink.report=Αναφέρετε αυτό το σφάλμα
|
||||
generic.error.technicalDetails=Λεπτομέρειες:
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Vault
|
||||
defaults.vault.vaultName=Κρύπτη
|
||||
|
||||
# Tray Menu
|
||||
traymenu.showMainWindow=Εμφάνιση
|
||||
@@ -27,34 +32,34 @@ traymenu.vault.lock=Κλείδωμα
|
||||
traymenu.vault.reveal=Αποκάλυψη
|
||||
|
||||
# Add Vault Wizard
|
||||
addvaultwizard.title=Προσθήκη Vault
|
||||
addvaultwizard.title=Προσθήκη Κρύπτης
|
||||
## Welcome
|
||||
addvaultwizard.welcome.newButton=Δημιουργία νέου Vault
|
||||
addvaultwizard.welcome.existingButton=Άνοιγμα υπάρχοντος Vault
|
||||
addvaultwizard.welcome.newButton=Δημιουργία Νέας Κρύπτης
|
||||
addvaultwizard.welcome.existingButton=Άνοιγμα Υπάρχοντος Κρύπτης
|
||||
## New
|
||||
### Name
|
||||
addvaultwizard.new.nameInstruction=Διαλέξτε ένα όνομα για το vault
|
||||
addvaultwizard.new.namePrompt=Όνομα Vault
|
||||
addvaultwizard.new.nameInstruction=Διαλέξτε ένα όνομα για την κρύπτη
|
||||
addvaultwizard.new.namePrompt=Όνομα Κρύπτης
|
||||
### Location
|
||||
addvaultwizard.new.locationInstruction=Που θα αποθηκεύσει το Cryptomator τα κωδικοποιημένα αρχεία του vault σου;
|
||||
addvaultwizard.new.locationInstruction=Που θα πρέπει να αποθηκεύσει το Cryptomator τα κωδικοποιημένα αρχεία της κρύπτης σου;
|
||||
addvaultwizard.new.locationLabel=Θέση αποθήκευσης
|
||||
addvaultwizard.new.locationPrompt=…
|
||||
addvaultwizard.new.directoryPickerLabel=Προσαρμοσμένη τοποθεσία
|
||||
addvaultwizard.new.directoryPickerButton=Επιλογή…
|
||||
addvaultwizard.new.directoryPickerTitle=Επιλογή φακέλου
|
||||
addvaultwizard.new.fileAlreadyExists=Ένα αρχείο ή φάκελος με το όνομα του vault υπάρχει ήδη
|
||||
addvaultwizard.new.fileAlreadyExists=Ένα αρχείο ή φάκελος με το όνομα της κρύπτης υπάρχει ήδη
|
||||
addvaultwizard.new.locationDoesNotExist=Στην καθορισμένη διαδρομή δεν υπάρχει ή δεν μπορεί να προσπελαστεί ένας φάκελος
|
||||
addvaultwizard.new.locationIsNotWritable=Δεν υπάρχει πρόσβαση εγγραφής στην καθορισμένη διαδρομή
|
||||
addvaultwizard.new.locationIsOk=Κατάλληλη τοποθεσία για το vault σας
|
||||
addvaultwizard.new.invalidName=Λάθος όνομα vault. Παρακαλώ χρησιμοποιείστε ένα κανονικό όνομα φακέλου.
|
||||
addvaultwizard.new.locationIsOk=Κατάλληλη τοποθεσία για την κρύπτη σας
|
||||
addvaultwizard.new.invalidName=Λάθος όνομα κρύπτης. Παρακαλώ χρησιμοποιείστε ένα κανονικό όνομα φακέλου.
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=Δημιουργία Vault
|
||||
addvaultwizard.new.createVaultBtn=Δημιουργία Κρύπτης
|
||||
addvaultwizard.new.generateRecoveryKeyChoice=Δεν θα μπορείτε να έχετε πρόσβαση στα δεδομένα σας χωρίς τον κωδικό σας. Θέλετε να δημιουργηθεί ένα κλειδί ανάκτησης στην περίπτωση που χάσετε τον κωδικό σας;
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.yes=Ναι παρακαλώ, καλύτερα ασφαλής παρά λυπημένος
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.no=Όχι ευχαριστώ, δεν θα χάσω τον κωδικό μου
|
||||
### Information
|
||||
addvault.new.readme.storageLocation.fileName=ΣΗΜΑΝΤΙΚΟ.rtf
|
||||
addvault.new.readme.storageLocation.1=ΑΡΧΕΙΑ VAULT
|
||||
addvault.new.readme.storageLocation.1=ΑΡΧΕΙΑ ΚΡΥΠΤΗΣ
|
||||
addvault.new.readme.storageLocation.2=Αυτή είναι η τοποθεσία του vault σας.
|
||||
addvault.new.readme.storageLocation.3=ΜΗΝ
|
||||
addvault.new.readme.storageLocation.4=αλλάξετε οποιοδήποτε αρχείο σε αυτό το φάκελο ή
|
||||
@@ -80,7 +85,7 @@ addvaultwizard.success.unlockNow=Ξεκλείδωμα τώρα
|
||||
# Remove Vault
|
||||
removeVault.title=Διαγραφή Vault
|
||||
removeVault.information=Το Cryptomator θα ξεχάσει αυτό το vault. Μπορείτε να το προσθέσετε ξανά αργότερα. Δεν θα διαγραφούν τα κωδικοποιημένα αρχεία σας από τον σκληρό σας δίσκο.
|
||||
removeVault.confirmBtn=Διαγραφή Vault
|
||||
removeVault.confirmBtn=Διαγραφή Κρύπτης
|
||||
|
||||
# Change Password
|
||||
changepassword.title=Αλλαγή κωδικού πρόσβασης
|
||||
@@ -265,7 +270,7 @@ main.vaultlist.contextMenu.unlock=Ξεκλείδωμα…
|
||||
main.vaultlist.contextMenu.unlockNow=Ξεκλείδωμα τώρα
|
||||
main.vaultlist.contextMenu.vaultoptions=Εμφάνιση επιλογών Vault
|
||||
main.vaultlist.contextMenu.reveal=Αποκάλυψη εικονικού δίσκου
|
||||
main.vaultlist.addVaultBtn=Προσθήκη Vault
|
||||
main.vaultlist.addVaultBtn=Προσθήκη Κρύπτης
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Ευχαριστούμε που επιλέξατε το Cryptomator για να προστατεύσετε τα αρχεία σας. Αν χρειάζεστε οποιαδήποτε βοήθεια, ελέγξτε τους οδηγούς για αρχάριους:
|
||||
@@ -308,7 +313,7 @@ wrongFileAlert.link=Για παραπάνω βοήθεια, επισκεφτεί
|
||||
# Vault Options
|
||||
## General
|
||||
vaultOptions.general=Γενικά
|
||||
vaultOptions.general.vaultName=Όνομα Vault
|
||||
vaultOptions.general.vaultName=Όνομα Κρύπτης
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Κλείδωμα όταν παραμένει σε αδράνεια για
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=λεπτά
|
||||
vaultOptions.general.unlockAfterStartup=Ξεκλείδωμα vault όταν ξεκινά το Cryptomator
|
||||
|
||||
@@ -59,43 +59,43 @@ addvaultwizard.new.generateRecoveryKeyChoice.yes=Si, per favore, è meglio esser
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.no=No grazie, non perderò la mia password
|
||||
### Information
|
||||
addvault.new.readme.storageLocation.fileName=IMPORTANTE.rtf
|
||||
addvault.new.readme.storageLocation.1=⚠ FILE CASSAFORTE ⚠
|
||||
addvault.new.readme.storageLocation.2=Questa è la posizione di archiviazione della tua cassaforte.
|
||||
addvault.new.readme.storageLocation.1=⚠️ FILE DELLA CASSAFORTE ⚠️
|
||||
addvault.new.readme.storageLocation.2=Questa è la posizione d'archiviazione della tua cassaforte.
|
||||
addvault.new.readme.storageLocation.3=NON
|
||||
addvault.new.readme.storageLocation.4=• modificare qualsiasi file in questa cartella o
|
||||
addvault.new.readme.storageLocation.5=• Incolla tutti i file da criptare in questa directory.
|
||||
addvault.new.readme.storageLocation.6=Se si desidera crittografare i file e visualizzare il contenuto della cassaforte, effettuare le seguenti operazioni:
|
||||
addvault.new.readme.storageLocation.4=• alterare alcun file in questa cartella o
|
||||
addvault.new.readme.storageLocation.5=• incollare alcun file per la crittografia in questa cartella.
|
||||
addvault.new.readme.storageLocation.6=Se vuoi crittografare i file e visualizzare il contenuto della cassaforte, fa quanto segue:
|
||||
addvault.new.readme.storageLocation.7=1. Aggiungi questa cassaforte a Cryptomator.
|
||||
addvault.new.readme.storageLocation.8=2. Sblocca la cassaforte in Criptomator.
|
||||
addvault.new.readme.storageLocation.9=3. Apri la posizione di accesso cliccando sul pulsante "Rivela".
|
||||
addvault.new.readme.storageLocation.10=Se hai bisogno di aiuto, leggi la documentazione: %s
|
||||
addvault.new.readme.storageLocation.8=2. Sblocca la cassaforte su Cryptomator.
|
||||
addvault.new.readme.storageLocation.9=3. Apri la posizione d'accesso cliccando sul pulsante "Rivela".
|
||||
addvault.new.readme.storageLocation.10=Se ti serve aiuto, visita la documentazione: %s
|
||||
addvault.new.readme.accessLocation.fileName=BENVENUTO.rtf
|
||||
addvault.new.readme.accessLocation.1=🔐 VOLUME CRIPTATO 🔐
|
||||
addvault.new.readme.accessLocation.2=Questa è la posizione di accesso della tua cassaforte.
|
||||
addvault.new.readme.accessLocation.3=Tutti i file aggiunti a questo volume verranno crittografati da Cryptomator. Puoi lavorare su di esso come su qualsiasi altra unità/cartella. Questa è solo una vista decriptata del suo contenuto, i file rimangono continuamente criptati sul disco rigido.
|
||||
addvault.new.readme.accessLocation.4=Sei libero di rimuovere questo file.
|
||||
addvault.new.readme.accessLocation.1=🔐 VOLUME CRITTOGRAFATO 🔐
|
||||
addvault.new.readme.accessLocation.2=Questa è la posizione d'accesso della tua cassaforte.
|
||||
addvault.new.readme.accessLocation.3=Ogni file aggiunto a questo volume sarà crittografato da Cryptomator. Puoi lavorarci come su ogni altra unità/cartella. Questa è solo una vista decrittografata del suo contenuto, i tuoi file restano sempre crittografati sul tuo disco rigido.
|
||||
addvault.new.readme.accessLocation.4=Sentiti libero di rimuovere questo file.
|
||||
## Existing
|
||||
addvaultwizard.existing.instruction=Scegliere il file "masterkey.cryptomator" del deposito esistente.
|
||||
addvaultwizard.existing.instruction=Scegli il file "masterkey.cryptomator" della tua cassaforte esistente.
|
||||
addvaultwizard.existing.chooseBtn=Scegli…
|
||||
addvaultwizard.existing.filePickerTitle=Seleziona file Masterkey
|
||||
addvaultwizard.existing.filePickerTitle=Seleziona il File Masterkey
|
||||
## Success
|
||||
addvaultwizard.success.nextStepsInstructions=Aggiunta cassaforte"%s".\nÈ necessario sbloccare questa cassaforte per accedere o aggiungere contenuti. In alternativa puoi sbloccarla in qualsiasi momento successivo.
|
||||
addvaultwizard.success.unlockNow=Sblocca adesso
|
||||
addvaultwizard.success.nextStepsInstructions=Cassaforte "%s" aggiunta.\nDevi sbloccare questa cassaforte per accedere o aggiungere contenuti. Altrimenti, puoi sbloccarla in qualsiasi momento successivo.
|
||||
addvaultwizard.success.unlockNow=Sblocca Ora
|
||||
|
||||
# Remove Vault
|
||||
removeVault.title=Rimuovi Cassaforte
|
||||
removeVault.information=Questo farà dimenticare Cryptomator a questo vault. Puoi aggiungerlo di nuovo in seguito. Nessun file crittografato verrà eliminato dal tuo disco rigido.
|
||||
removeVault.information=Questo farà solo dimenticare questa cassaforte a Cryptomator. Puoi aggiungerla nuovamente in seguito. Nessun file crittografato sarà eliminato dal tuo disco rigido.
|
||||
removeVault.confirmBtn=Rimuovi Cassaforte
|
||||
|
||||
# Change Password
|
||||
changepassword.title=Modifica password
|
||||
changepassword.enterOldPassword=Inserisci la password attuale per "%s"
|
||||
changepassword.finalConfirmation=Ho capito che non sarò in grado di accedere ai miei dati se dimentico la mia password
|
||||
changepassword.title=Modifica la Password
|
||||
changepassword.enterOldPassword=Inserisci la password corrente per "%s"
|
||||
changepassword.finalConfirmation=Capisco che non potrò accedere ai miei dati se dimentico la mia password
|
||||
|
||||
# Forget Password
|
||||
forgetPassword.title=Password dimenticata
|
||||
forgetPassword.information=Questo cancellerà la password salvata di questa cassaforte dal tuo portachiavi di sistema.
|
||||
forgetPassword.confirmBtn=Password dimenticata
|
||||
forgetPassword.title=Dimentica la Password
|
||||
forgetPassword.information=Questo eliminerà la password salvata di questa cassaforte dal portachiavi del tuo sistema.
|
||||
forgetPassword.confirmBtn=Dimentica Password
|
||||
|
||||
# Unlock
|
||||
unlock.title=Sblocca "%s"
|
||||
@@ -103,129 +103,129 @@ unlock.passwordPrompt=Inserisci la password per "%s":
|
||||
unlock.savePassword=Ricorda la Password
|
||||
unlock.unlockBtn=Sblocca
|
||||
##
|
||||
unlock.chooseMasterkey.prompt=Impossibile trovare il file masterkey per questa cassaforte nella posizione prevista. Scegliere manualmente il file chiave.
|
||||
unlock.chooseMasterkey.filePickerTitle=Seleziona file Masterkey
|
||||
unlock.chooseMasterkey.prompt=Impossibile trovare il file Masterkey per questa cassaforte alla sua posizione prevista. Sei pregato di sceglierlo manualmente.
|
||||
unlock.chooseMasterkey.filePickerTitle=Seleziona il File Masterkey
|
||||
## Success
|
||||
unlock.success.message="%s" sbloccato con successo! La tua cassaforte è ora accessibile tramite il suo drive virtuale.
|
||||
unlock.success.rememberChoice=Ricorda la scelta, non mostrare ancora
|
||||
unlock.success.revealBtn=Rivela Drive
|
||||
unlock.success.message="%s" sbloccato correttamente! La tua cassaforte è ora accessibile tramite la sua unità virtuale.
|
||||
unlock.success.rememberChoice=Ricorda la scelta, non mostrarmelo più
|
||||
unlock.success.revealBtn=Rivela l'Unità
|
||||
## Failure
|
||||
unlock.error.heading=Impossibile sbloccare la cassaforte
|
||||
### Invalid Mount Point
|
||||
unlock.error.invalidMountPoint.notExisting=Il punto di montaggio non è una directory vuota o non esiste: %s
|
||||
unlock.error.invalidMountPoint.existing=Il punto di Mount/cartella esiste già o la cartella superiore è mancante: %s
|
||||
unlock.error.invalidMountPoint.notExisting=Il punto di montaggio "%s" non è una cartella, non è vuoto o non esiste.
|
||||
unlock.error.invalidMountPoint.existing=Il punto di montaggio "%s" esiste già o la cartella madre è mancante.
|
||||
|
||||
# Lock
|
||||
## Force
|
||||
lock.forced.heading=Blocco normale fallito
|
||||
lock.forced.message=Il bloccaggio di "%s" è stato impedito da operazioni in sospeso o da file aperti. È possibile forzare il blocco di questa cassaforte, tuttavia interrompere I/O potrebbe causare la perdita di dati non salvati.
|
||||
lock.forced.message=Il bloccaggio di "%s" è stato impedito dalle operazioni in sospeso o dai file aperti. Puoi forzare il blocco di questa cassaforte, tuttavia, interrompere I/O potrebbe risultare nella perdita dei dati non salvati.
|
||||
lock.forced.confirmBtn=Forza Blocco
|
||||
## Failure
|
||||
lock.fail.heading=Blocco cassaforte fallito.
|
||||
lock.fail.message=Impossibile bloccare la cassaforte "%s". Assicurati che il lavoro non salvato sia salvato ovunque e che le operazioni di Lettura/Scrittura importanti siano concluse. Per chiudere la cassaforte, termina il processo di Cryptomator.
|
||||
lock.fail.heading=Blocco della cassaforte fallito.
|
||||
lock.fail.message=Impossibile bloccare la cassaforte "%s". Assicurati che il lavoro non salvato sia salvato altrove e che le importanti operazioni di Lettura/Scrittura siano terminate. Per chiudere la cassaforte, termina il processo di Cryptomator.
|
||||
|
||||
# Migration
|
||||
migration.title=Aggiorna Cassaforte
|
||||
migration.title=Aggiorna la Cassaforte
|
||||
## Start
|
||||
migration.start.prompt=La tua cassaforte "%s" deve essere aggiornata a un formato più recente. Prima di procedere, assicurati che non ci sia nessuna sincronizzazione in sospeso che influisca su questa cassaforte.
|
||||
migration.start.prompt=La tua cassaforte "%s" dev'esser aggiornata a un formato più recente. Prima di procedere, assicurati che non ci sia alcuna sincronizzazione in sospeso relativa a questa cassaforte.
|
||||
migration.start.confirm=Sì, la mia cassaforte è completamente sincronizzata
|
||||
## Run
|
||||
migration.run.enterPassword=Immettere la password per "%s"
|
||||
migration.run.startMigrationBtn=Migra Cassaforte
|
||||
migration.run.progressHint=Potrebbe richiedere un po' di tempo…
|
||||
migration.run.enterPassword=Inserisci la password per "%s"
|
||||
migration.run.startMigrationBtn=Migra la Cassaforte
|
||||
migration.run.progressHint=Questo potrebbe richiedere un po' di tempo…
|
||||
## Success
|
||||
migration.success.nextStepsInstructions=Migrato "%s" con successo.\nOra puoi sbloccare la tua cassaforte.
|
||||
migration.success.unlockNow=Sblocca adesso
|
||||
migration.success.nextStepsInstructions="%s" migrata con successo.\nPuoi ora sbloccare la tua cassaforte.
|
||||
migration.success.unlockNow=Sblocca Ora
|
||||
## Missing file system capabilities
|
||||
migration.error.missingFileSystemCapabilities.title=File System non supportato
|
||||
migration.error.missingFileSystemCapabilities.description=La migrazione non è stata avviata perché la cassaforte è situata su un file system inadeguato.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Il file system non supporta nomi di file lunghi.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Il file system non supporta percorsi lunghi.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Il file system non consente di essere letto.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Il file system non consente di essere scritto.
|
||||
migration.error.missingFileSystemCapabilities.title=File di Sistema Non Supportato
|
||||
migration.error.missingFileSystemCapabilities.description=Migrazione non avviata perché la tua cassaforte si trova su un file di sistema inadeguato.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Il file di sistema non supporta i nomi dei file lunghi.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Il file di sistema non supporta i percorsi lunghi.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Il file di sistema non consente di esser letto.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Il file di sistema non consente di esser scritto.
|
||||
## Impossible
|
||||
migration.impossible.heading=Impossibile migrare la cassaforte
|
||||
migration.impossible.reason=La cassaforte non può essere migrata automaticamente perché la sua posizione di archiviazione di accesso non è compatibile.
|
||||
migration.impossible.moreInfo=La cassaforte può ancora essere aperta con una versione precedente. Per istruzioni su come migrare manualmente una cassaforte, visita
|
||||
migration.impossible.reason=Impossibile migrare automaticamente la cassaforte perché la sua posizione d'archiviazione o punto d'accesso non sono compatibili.
|
||||
migration.impossible.moreInfo=La cassaforte è ancora apribile con una versione precedente. Per le istruzioni su come migrare manualmente una cassaforte, visita
|
||||
|
||||
# Health Check
|
||||
## Start
|
||||
health.title=Controllo Salute di "%s"
|
||||
health.intro.header=Controllo Salute
|
||||
health.intro.text=Il Controllo della Salute è una raccolta di controlli per rilevare e possibilmente risolvere i problemi nella struttura interna alla tua cassaforte. Sei pregato di tenere a mente:
|
||||
health.intro.remarkSync=Assicurati che tutti i dispositivi siano completamente sincronizzati, questo risolve la maggior parte dei problemi.
|
||||
health.intro.remarkFix=Non tutti i problemi possono essere corretti.
|
||||
health.intro.remarkBackup=Se i dati sono danneggiati, solo un backup può aiutare.
|
||||
health.intro.affirmation=Ho letto e capito le informazioni sopra
|
||||
health.intro.remarkSync=Assicurati che tutti i dispositivi siano completamente sincronizzati, questo risolve gran parte dei problemi.
|
||||
health.intro.remarkFix=Non tutti i problemi sono risolvibili.
|
||||
health.intro.remarkBackup=Se i dati sono corrotti, solo un backup può aiutare.
|
||||
health.intro.affirmation=Ho letto e compreso le informazioni suddette
|
||||
## Start Failure
|
||||
health.fail.header=Errore nel caricare la configurazione della cassaforte
|
||||
health.fail.ioError=Si è verificato un errore durante l'accesso e la lettura del file di configurazione.
|
||||
health.fail.parseError=Si è verificato un errore durante l'analisi della configurazione della cassaforte.
|
||||
health.fail.moreInfo=Ulteriori Informazioni
|
||||
health.fail.header=Errore caricando la Configurazione della Cassaforte
|
||||
health.fail.ioError=Si è verificato un errore accedendo e leggendo il file di configurazione.
|
||||
health.fail.parseError=Si è verificato un errore analizzando la configurazione della cassaforte.
|
||||
health.fail.moreInfo=Altre Info
|
||||
## Check Selection
|
||||
health.checkList.description=Seleziona i controlli nell'elenco a sinistra o utilizza i pulsanti in basso.
|
||||
health.checkList.selectAllButton=Seleziona Tutti I Controlli
|
||||
health.checkList.deselectAllButton=Deseleziona Tutti I Controlli
|
||||
health.check.runBatchBtn=Esegui i Controlli selezionati
|
||||
health.checkList.description=Seleziona i controlli nell'elenco a sinistra o usa i seguenti pulsanti.
|
||||
health.checkList.selectAllButton=Seleziona Tutti i Controlli
|
||||
health.checkList.deselectAllButton=Deseleziona Tutti i Controlli
|
||||
health.check.runBatchBtn=Esegui i Controlli Selezionati
|
||||
## Detail view
|
||||
health.check.detail.noSelectedCheck=Per i risultati seleziona un controllo di salute concluso nell'elenco a sinistra.
|
||||
health.check.detail.noSelectedCheck=Per i risultati seleziona un controllo di salute terminato nell'elenco a sinistra.
|
||||
health.check.detail.checkScheduled=Il controllo è pianificato.
|
||||
health.check.detail.checkRunning=Il controllo è attualmente in esecuzione…
|
||||
health.check.detail.checkRunning=Il controllo è correntemente in esecuzione…
|
||||
health.check.detail.checkSkipped=Il controllo non è stato selezionato per l'esecuzione.
|
||||
health.check.detail.checkFinished=Il controllo è terminato con successo.
|
||||
health.check.detail.checkFinishedAndFound=Il controllo ha terminato l'esecuzione. Si prega di rivedere i risultati.
|
||||
health.check.detail.checkFinished=Il controllo è terminato correttamente.
|
||||
health.check.detail.checkFinishedAndFound=Il controllo è terminato. Sei pregato di revisionare i risultati.
|
||||
health.check.detail.checkFailed=Il controllo è terminato a causa di un errore.
|
||||
health.check.detail.checkCancelled=Il controllo è stato annullato.
|
||||
health.check.exportBtn=Esporta Rapporto
|
||||
health.check.exportBtn=Esporta il Rapporto
|
||||
## Fix Application
|
||||
health.fix.fixBtn=Correggi
|
||||
health.fix.successTip=Correzione riuscita
|
||||
health.fix.failTip=Correzione fallita, vedi log per i dettagli
|
||||
health.fix.failTip=Correzione fallita, vedi i registri per i dettagli
|
||||
|
||||
# Preferences
|
||||
preferences.title=Impostazioni
|
||||
preferences.title=Preferenze
|
||||
## General
|
||||
preferences.general=Generali
|
||||
preferences.general=Generale
|
||||
preferences.general.theme=Aspetto
|
||||
preferences.general.theme.automatic=Automatico
|
||||
preferences.general.theme.light=Chiaro
|
||||
preferences.general.theme.dark=Scuro
|
||||
preferences.general.unlockThemes=Sblocca modalità scura
|
||||
preferences.general.showMinimizeButton=Mostra pulsante riduci a icona
|
||||
preferences.general.showTrayIcon=Mostra icona nel tray (richiede riavvio)
|
||||
preferences.general.startHidden=Nascondi la finestra all'avvio di Cryptomator
|
||||
preferences.general.debugLogging=Abilita i registri di debug
|
||||
preferences.general.debugDirectory=Mostra file log
|
||||
preferences.general.unlockThemes=Sblocca la modalità scura
|
||||
preferences.general.showMinimizeButton=Mostra il pulsante minimizza
|
||||
preferences.general.showTrayIcon=Mostra l'icona della barra d'applicazioni (richiede il riavvio)
|
||||
preferences.general.startHidden=Nascondi la finestra avviando Cryptomator
|
||||
preferences.general.debugLogging=Abilita la registrazione di debug
|
||||
preferences.general.debugDirectory=Rivela i file di registro
|
||||
preferences.general.autoStart=Avvia Cryptomator all'avvio del sistema
|
||||
preferences.general.keychainBackend=Memorizza password con
|
||||
preferences.general.interfaceOrientation=Orientamento Interfaccia
|
||||
preferences.general.keychainBackend=Memorizza le password con
|
||||
preferences.general.interfaceOrientation=Orientamento dell'Interfaccia
|
||||
preferences.general.interfaceOrientation.ltr=Da Sinistra a Destra
|
||||
preferences.general.interfaceOrientation.rtl=Da Destra a Sinistra
|
||||
## Volume
|
||||
preferences.volume=Drive virtuale
|
||||
preferences.volume.type=Tipo volume
|
||||
preferences.volume=Unità Virtuale
|
||||
preferences.volume.type=Tipo di Volume
|
||||
preferences.volume.webdav.port=Porta WebDAV
|
||||
preferences.volume.webdav.scheme=Schema WebDAV
|
||||
## Updates
|
||||
preferences.updates=Aggiornamenti
|
||||
preferences.updates.currentVersion=Versione attuale %s
|
||||
preferences.updates.autoUpdateCheck=Controlla automaticamente la presenza di aggiornamenti
|
||||
preferences.updates.checkNowBtn=Controlla adesso
|
||||
preferences.updates.updateAvailable=Disponibile aggiornamento alla versione %s.
|
||||
preferences.updates.currentVersion=Versione Corrente: %s
|
||||
preferences.updates.autoUpdateCheck=Cerca automaticamente gli aggiornamenti
|
||||
preferences.updates.checkNowBtn=Controlla Ora
|
||||
preferences.updates.updateAvailable=Aggiornamento alla versione %s disponibile.
|
||||
## Contribution
|
||||
preferences.contribute=Supportaci
|
||||
preferences.contribute.registeredFor=Certificato del supporto registrato per %s
|
||||
preferences.contribute.noCertificate=Supporta Cryptomator e ricevi un certificato di supporter. È come una chiave di licenza, ma per persone fantastiche che utilizzano software libero. ;-)
|
||||
preferences.contribute.getCertificate=Non ne hai già uno? Impara come puoi ottenerlo.
|
||||
preferences.contribute.promptText=Incolla qui il codice del certificato di supporter
|
||||
preferences.contribute.registeredFor=Certificato del sostenitore registrato per %s
|
||||
preferences.contribute.noCertificate=Supporta Cryptomator e ricevi il certificato da sostenitore. È come una chiave di licenza me per persone fantastiche che usano un software gratuito. ;-)
|
||||
preferences.contribute.getCertificate=Non ne hai ancora uno? Scopri come puoi ottenerlo.
|
||||
preferences.contribute.promptText=Incolla qui il codice del certificato da sostenitore
|
||||
#<-- Add entries for donations and code/translation/documentation contribution -->
|
||||
|
||||
## About
|
||||
preferences.about=Informazioni
|
||||
preferences.about=Info
|
||||
|
||||
# Vault Statistics
|
||||
stats.title=Statistiche per %s
|
||||
stats.cacheHitRate=Tasso di Colpo della Cache
|
||||
stats.cacheHitRate=Frequenza di Raggiungimento della Cache
|
||||
## Read
|
||||
stats.read.throughput.idle=Lettura: inattivo
|
||||
stats.read.throughput.kibs=Lettura: %.2f kiB/s
|
||||
@@ -234,13 +234,13 @@ stats.read.total.data.none=Dati letti: -
|
||||
stats.read.total.data.kib=Dati letti: %.1f kiB
|
||||
stats.read.total.data.mib=Dati letti: %.1f MiB
|
||||
stats.read.total.data.gib=Dati letti: %.1f GiB
|
||||
stats.decr.total.data.none=Dati decriptati: -
|
||||
stats.decr.total.data.none=Dati decrittografati: -
|
||||
stats.decr.total.data.kib=Dati decrittografati: %.1f kiB
|
||||
stats.decr.total.data.mib=Dati decriptati: %.1f MiB
|
||||
stats.decr.total.data.mib=Dati decrittografati: %.1f MiB
|
||||
stats.decr.total.data.gib=Dati decrittografati: %.1f GiB
|
||||
stats.read.accessCount=Totale lettura: %d
|
||||
stats.read.accessCount=Letture totali: %d
|
||||
## Write
|
||||
stats.write.throughput.idle=Scrivi: inattivo
|
||||
stats.write.throughput.idle=Scrittura: inattivo
|
||||
stats.write.throughput.kibs=Scrittura: %.2f kiB/s
|
||||
stats.write.throughput.mibs=Scrittura: %.2f MiB/s
|
||||
stats.write.total.data.none=Dati scritti: -
|
||||
@@ -251,85 +251,85 @@ stats.encr.total.data.none=Dati crittografati: -
|
||||
stats.encr.total.data.kib=Dati crittografati: %.1f kiB
|
||||
stats.encr.total.data.mib=Dati crittografati: %.1f MiB
|
||||
stats.encr.total.data.gib=Dati crittografati: %.1f GiB
|
||||
stats.write.accessCount=Totale scritture: %d
|
||||
stats.write.accessCount=Scritture totali: %d
|
||||
|
||||
# Main Window
|
||||
main.closeBtn.tooltip=Chiudi
|
||||
main.minimizeBtn.tooltip=Minimizza
|
||||
main.preferencesBtn.tooltip=Impostazioni
|
||||
main.preferencesBtn.tooltip=Preferenze
|
||||
main.debugModeEnabled.tooltip=La modalità di debug è abilitata
|
||||
main.donationKeyMissing.tooltip=Per favore considera una donazione
|
||||
main.donationKeyMissing.tooltip=Sei pregato di considerare di donare
|
||||
## Drag 'n' Drop
|
||||
main.dropZone.dropVault=Aggiungi questa cassaforte
|
||||
main.dropZone.unknownDragboardContent=Se vuoi aggiungere una cassaforte, trascinala in questa finestra
|
||||
main.dropZone.unknownDragboardContent=Se desideri aggiungere una cassaforte, trascinala a questa finestra
|
||||
## Vault List
|
||||
main.vaultlist.emptyList.onboardingInstruction=Clicca qui per aggiungere una cassaforte
|
||||
main.vaultlist.contextMenu.remove=Rimuovi…
|
||||
main.vaultlist.contextMenu.lock=Blocca
|
||||
main.vaultlist.contextMenu.unlock=Sblocca…
|
||||
main.vaultlist.contextMenu.unlockNow=Sblocca Ora
|
||||
main.vaultlist.contextMenu.vaultoptions=Mostra Opzioni Cassaforte
|
||||
main.vaultlist.contextMenu.reveal=Rivela Drive
|
||||
main.vaultlist.contextMenu.vaultoptions=Mostra le Opzioni della Cassaforte
|
||||
main.vaultlist.contextMenu.reveal=Rivela Unità
|
||||
main.vaultlist.addVaultBtn=Aggiungi Cassaforte
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Grazie per aver scelto Cryptomator per proteggere i tuoi file. Se hai bisogno di assistenza, dai un'occhiata alle guide per iniziare:
|
||||
main.vaultDetail.welcomeOnboarding=Grazie per aver scelto Cryptomator per proteggere i tuoi file. Se necessiti d'assistenza, dai un'occhiata alle nostre guide per iniziare:
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=BLOCCATO
|
||||
main.vaultDetail.unlockBtn=Sblocca…
|
||||
main.vaultDetail.unlockNowBtn=Sblocca adesso
|
||||
main.vaultDetail.optionsBtn=Opzioni Cassaforte
|
||||
main.vaultDetail.unlockNowBtn=Sblocca Ora
|
||||
main.vaultDetail.optionsBtn=Opzioni della Cassaforte
|
||||
main.vaultDetail.passwordSavedInKeychain=Password salvata
|
||||
### Unlocked
|
||||
main.vaultDetail.unlockedStatus=SBLOCCATO
|
||||
main.vaultDetail.unlockedStatus=SBLOCCATA
|
||||
main.vaultDetail.accessLocation=I contenuti della tua cassaforte sono accessibili qui:
|
||||
main.vaultDetail.revealBtn=Visualizza disco
|
||||
main.vaultDetail.revealBtn=Rivela Unità
|
||||
main.vaultDetail.lockBtn=Blocca
|
||||
main.vaultDetail.bytesPerSecondRead=Lettura:
|
||||
main.vaultDetail.bytesPerSecondWritten=Scrittura:
|
||||
main.vaultDetail.throughput.idle=inattivo
|
||||
main.vaultDetail.throughput.kbps=%.1f kiB/s
|
||||
main.vaultDetail.throughput.mbps=%.1f MiB/s
|
||||
main.vaultDetail.stats=Statistiche Cassaforte
|
||||
main.vaultDetail.stats=Statistiche della Cassaforte
|
||||
### Missing
|
||||
main.vaultDetail.missing.info=Cryptomator non ha potuto trovare una cassaforte in questo percorso.
|
||||
main.vaultDetail.missing.recheck=Ricontrollare
|
||||
main.vaultDetail.missing.remove=Rimuovi dalla Lista Cassaforte…
|
||||
main.vaultDetail.missing.changeLocation=Cambia posizione della Cassaforte…
|
||||
main.vaultDetail.missing.info=Cryptomator non è riuscito a trovare una cassaforte in questo percorso.
|
||||
main.vaultDetail.missing.recheck=Ricontrolla
|
||||
main.vaultDetail.missing.remove=Rimuovi dall'Elenco di Cassaforti…
|
||||
main.vaultDetail.missing.changeLocation=Cambia la Posizione della Cassaforte…
|
||||
### Needs Migration
|
||||
main.vaultDetail.migrateButton=Aggiorna la cassaforte
|
||||
main.vaultDetail.migratePrompt=Prima di potervi accedere la tua cassaforte deve essere aggiornata al nuovo formato
|
||||
main.vaultDetail.migrateButton=Aggiorna la Cassaforte
|
||||
main.vaultDetail.migratePrompt=La tua cassaforte dev'esser aggiornata a un nuovo formato, prima di potervi accedere
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.title=Come Criptare i File
|
||||
wrongFileAlert.header.title=Hai provato a cifrare questi file?
|
||||
wrongFileAlert.header.lead=A questo scopo, Cryptomator fornisce un volume nel file manager di sistema.
|
||||
wrongFileAlert.instruction.0=Per cifrare file, segui questi passi:
|
||||
wrongFileAlert.title=Come Crittografare i File
|
||||
wrongFileAlert.header.title=Hai tentato di crittografare questi file?
|
||||
wrongFileAlert.header.lead=Per questo scopo, Cryptomator fornisce un volume nel gestore dei tuoi file di sistema.
|
||||
wrongFileAlert.instruction.0=Per crittografare i file, segui questi passi:
|
||||
wrongFileAlert.instruction.1=1. Sblocca la tua cassaforte.
|
||||
wrongFileAlert.instruction.2=2. Clicca su "Rivela" per aprire il volume nel tuo file manager.
|
||||
wrongFileAlert.instruction.2=2. Clicca su "Rivela" per aprire il volume nel gestore dei tuoi file.
|
||||
wrongFileAlert.instruction.3=3. Aggiungi i tuoi file a questo volume.
|
||||
wrongFileAlert.link=Per ulteriore assistenza, visita
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
vaultOptions.general=Generali
|
||||
vaultOptions.general.vaultName=Nome Cassaforte
|
||||
vaultOptions.general=Generale
|
||||
vaultOptions.general.vaultName=Nome della Cassaforte
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Blocca quando inattivo per
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=minuti
|
||||
vaultOptions.general.unlockAfterStartup=Sblocca vault all'avvio di Cryptomator
|
||||
vaultOptions.general.actionAfterUnlock=Dopo aver sbloccato con successo
|
||||
vaultOptions.general.unlockAfterStartup=Sblocca la cassaforte all'avvio di Cryptomator
|
||||
vaultOptions.general.actionAfterUnlock=Dopo uno sblocco riuscito
|
||||
vaultOptions.general.actionAfterUnlock.ignore=Non fare nulla
|
||||
vaultOptions.general.actionAfterUnlock.reveal=Visualizza disco
|
||||
vaultOptions.general.actionAfterUnlock.reveal=Rivela Unità
|
||||
vaultOptions.general.actionAfterUnlock.ask=Chiedi
|
||||
vaultOptions.general.startHealthCheckBtn=Avvia il Controllo della Salute
|
||||
|
||||
## Mount
|
||||
vaultOptions.mount=Montaggio
|
||||
vaultOptions.mount.readonly=Sola lettura
|
||||
vaultOptions.mount.customMountFlags=Opzioni personalizzate
|
||||
vaultOptions.mount.readonly=Sola Lettura
|
||||
vaultOptions.mount.customMountFlags=Flag di Montaggio Personalizzati
|
||||
vaultOptions.mount.winDriveLetterOccupied=occupato
|
||||
vaultOptions.mount.mountPoint=Punto di mount
|
||||
vaultOptions.mount.mountPoint.auto=Scegli automaticamente una posizione adatta
|
||||
vaultOptions.mount.mountPoint=Punto di Montaggio
|
||||
vaultOptions.mount.mountPoint.auto=Scegli automaticamente una posizione idonea
|
||||
vaultOptions.mount.mountPoint.driveLetter=Usa la lettera del drive assegnata
|
||||
vaultOptions.mount.mountPoint.custom=Percorso personalizzato
|
||||
vaultOptions.mount.mountPoint.directoryPickerButton=Scegli…
|
||||
|
||||
@@ -13,6 +13,11 @@ generic.button.done=完了
|
||||
generic.button.next=次へ
|
||||
generic.button.print=印刷
|
||||
## Error
|
||||
generic.error.title=エラー %s
|
||||
generic.error.instruction=Cryptomator で予期できない問題が発生しました! 。このエラーの解決方法を検索することができ、まだ報告されていない場合は、報告を行うことができます。
|
||||
generic.error.hyperlink.lookup=このエラーを検索する
|
||||
generic.error.hyperlink.report=このエラーを報告する
|
||||
generic.error.technicalDetails=詳細:
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=金庫
|
||||
@@ -30,7 +35,7 @@ traymenu.vault.reveal=表示
|
||||
addvaultwizard.title=金庫を追加
|
||||
## Welcome
|
||||
addvaultwizard.welcome.newButton=新しい金庫を作成
|
||||
addvaultwizard.welcome.existingButton=既存の金庫を開く
|
||||
addvaultwizard.welcome.existingButton=すでにある金庫を開く
|
||||
## New
|
||||
### Name
|
||||
addvaultwizard.new.nameInstruction=金庫の名前を入力してください
|
||||
@@ -277,7 +282,7 @@ main.vaultDetail.optionsBtn=金庫のオプション
|
||||
main.vaultDetail.passwordSavedInKeychain=パスワードを保存しました
|
||||
### Unlocked
|
||||
main.vaultDetail.unlockedStatus=解錠済み
|
||||
main.vaultDetail.accessLocation=アクセス可能な金庫のコンテンツ:
|
||||
main.vaultDetail.accessLocation=金庫の内容はこちらからアクセスできます:
|
||||
main.vaultDetail.revealBtn=ドライブを表示
|
||||
main.vaultDetail.lockBtn=施錠
|
||||
main.vaultDetail.bytesPerSecondRead=読み取り:
|
||||
|
||||
@@ -13,6 +13,11 @@ generic.button.done=Concluído
|
||||
generic.button.next=Próximo
|
||||
generic.button.print=Imprimir
|
||||
## Error
|
||||
generic.error.title=Erro %s
|
||||
generic.error.instruction=Oops! Cryptomator não esperava que isso acontecesse. Você pode procurar soluções existentes para este erro. Ou se isso ainda não foi reportado, fique à vontade para fazê-lo.
|
||||
generic.error.hyperlink.lookup=Procure este erro
|
||||
generic.error.hyperlink.report=Reportar este erro
|
||||
generic.error.technicalDetails=Detalhes:
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Cofre
|
||||
|
||||
@@ -13,6 +13,11 @@ generic.button.done=Klar
|
||||
generic.button.next=Nästa
|
||||
generic.button.print=Skriv ut
|
||||
## Error
|
||||
generic.error.title=Fel: %s
|
||||
generic.error.instruction=Hoppsan! Cryptomator stötte på något oväntat. Du kan leta upp befintliga lösningar för detta fel. Om det inte har rapporterats ännu får du gärna rapportera in felet.
|
||||
generic.error.hyperlink.lookup=Slå upp detta fel
|
||||
generic.error.hyperlink.report=Rapportera fel
|
||||
generic.error.technicalDetails=Detaljer:
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Valv
|
||||
|
||||
@@ -13,6 +13,11 @@ generic.button.done=Tamam
|
||||
generic.button.next=Sonraki
|
||||
generic.button.print=Yazdır
|
||||
## Error
|
||||
generic.error.title=Hata: %s
|
||||
generic.error.instruction=Uups! Cryptomator bunun olmasını beklemiyordu. Bu hata için mevcut çözümlere bakabilirsiniz. Ya da henüz bildirilmediyse, bunu raporlamaktan çekinmeyin.
|
||||
generic.error.hyperlink.lookup=Bu hatayı ara
|
||||
generic.error.hyperlink.report=Bu hatayı bildir
|
||||
generic.error.technicalDetails=Detaylar:
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Kasa
|
||||
|
||||
@@ -17,10 +17,10 @@ Cryptomator uses 40 third-party dependencies under the following licenses:
|
||||
- jnr-a64asm (com.github.jnr:jnr-a64asm:1.0.0 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-a64asm)
|
||||
- jnr-constants (com.github.jnr:jnr-constants:0.9.15 - http://github.com/jnr/jnr-constants)
|
||||
- jnr-ffi (com.github.jnr:jnr-ffi:2.1.12 - http://github.com/jnr/jnr-ffi)
|
||||
- Gson (com.google.code.gson:gson:2.8.7 - https://github.com/google/gson/gson)
|
||||
- Dagger (com.google.dagger:dagger:2.38.1 - https://github.com/google/dagger)
|
||||
- Gson (com.google.code.gson:gson:2.8.8 - https://github.com/google/gson/gson)
|
||||
- Dagger (com.google.dagger:dagger:2.39 - https://github.com/google/dagger)
|
||||
- Guava InternalFutureFailureAccess and InternalFutures (com.google.guava:failureaccess:1.0.1 - https://github.com/google/guava/failureaccess)
|
||||
- Guava: Google Core Libraries for Java (com.google.guava:guava:30.1.1-jre - https://github.com/google/guava/guava)
|
||||
- Guava: Google Core Libraries for Java (com.google.guava:guava:31.0-jre - https://github.com/google/guava)
|
||||
- Apache Commons CLI (commons-cli:commons-cli:1.4 - http://commons.apache.org/proper/commons-cli/)
|
||||
- javax.inject (javax.inject:javax.inject:1 - http://code.google.com/p/atinject/)
|
||||
- Apache Commons Lang (org.apache.commons:commons-lang3:3.12.0 - https://commons.apache.org/proper/commons-lang/)
|
||||
@@ -52,31 +52,31 @@ Cryptomator uses 40 third-party dependencies under the following licenses:
|
||||
- Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:10.0.6 - https://eclipse.org/jetty/jetty-servlet)
|
||||
- Jetty :: Utilities (org.eclipse.jetty:jetty-util:10.0.6 - https://eclipse.org/jetty/jetty-util)
|
||||
Eclipse Public License - v 1.0:
|
||||
- Logback Classic Module (ch.qos.logback:logback-classic:1.2.3 - http://logback.qos.ch/logback-classic)
|
||||
- Logback Core Module (ch.qos.logback:logback-core:1.2.3 - http://logback.qos.ch/logback-core)
|
||||
- Logback Classic Module (ch.qos.logback:logback-classic:1.2.6 - http://logback.qos.ch/logback-classic)
|
||||
- Logback Core Module (ch.qos.logback:logback-core:1.2.6 - http://logback.qos.ch/logback-core)
|
||||
Eclipse Public License - v 2.0:
|
||||
- jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
|
||||
GNU Lesser General Public License:
|
||||
- Logback Classic Module (ch.qos.logback:logback-classic:1.2.3 - http://logback.qos.ch/logback-classic)
|
||||
- Logback Core Module (ch.qos.logback:logback-core:1.2.3 - http://logback.qos.ch/logback-core)
|
||||
- Logback Classic Module (ch.qos.logback:logback-classic:1.2.6 - http://logback.qos.ch/logback-classic)
|
||||
- Logback Core Module (ch.qos.logback:logback-core:1.2.6 - http://logback.qos.ch/logback-core)
|
||||
GPLv2:
|
||||
- jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
|
||||
GPLv2+CE:
|
||||
- javafx-base (org.openjfx:javafx-base:16 - https://openjdk.java.net/projects/openjfx/javafx-base/)
|
||||
- javafx-controls (org.openjfx:javafx-controls:16 - https://openjdk.java.net/projects/openjfx/javafx-controls/)
|
||||
- javafx-fxml (org.openjfx:javafx-fxml:16 - https://openjdk.java.net/projects/openjfx/javafx-fxml/)
|
||||
- javafx-graphics (org.openjfx:javafx-graphics:16 - https://openjdk.java.net/projects/openjfx/javafx-graphics/)
|
||||
- javafx-base (org.openjfx:javafx-base:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-base/)
|
||||
- javafx-controls (org.openjfx:javafx-controls:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-controls/)
|
||||
- javafx-fxml (org.openjfx:javafx-fxml:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-fxml/)
|
||||
- javafx-graphics (org.openjfx:javafx-graphics:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-graphics/)
|
||||
LGPL 2.1:
|
||||
- jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
|
||||
LGPL-2.1-or-later:
|
||||
- Java Native Access (net.java.dev.jna:jna:5.9.0 - https://github.com/java-native-access/jna)
|
||||
- Java Native Access Platform (net.java.dev.jna:jna-platform:5.9.0 - https://github.com/java-native-access/jna)
|
||||
MIT License:
|
||||
- java jwt (com.auth0:java-jwt:3.18.1 - https://github.com/auth0/java-jwt)
|
||||
- java jwt (com.auth0:java-jwt:3.18.2 - https://github.com/auth0/java-jwt)
|
||||
- jnr-x86asm (com.github.jnr:jnr-x86asm:1.0.2 - http://github.com/jnr/jnr-x86asm)
|
||||
- jnr-fuse (com.github.serceman:jnr-fuse:0.5.5 - https://github.com/SerCeMan/jnr-fuse)
|
||||
- zxcvbn4j (com.nulab-inc:zxcvbn:1.5.2 - https://github.com/nulab/zxcvbn4j)
|
||||
- SLF4J API Module (org.slf4j:slf4j-api:1.7.31 - http://www.slf4j.org)
|
||||
- SLF4J API Module (org.slf4j:slf4j-api:1.7.32 - http://www.slf4j.org)
|
||||
The BSD 2-Clause License:
|
||||
- EasyBind (com.tobiasdiez:easybind:2.2 - https://github.com/tobiasdiez/EasyBind)
|
||||
|
||||
|
||||
@@ -14,6 +14,11 @@ class MapKeychainAccess implements KeychainAccessProvider {
|
||||
|
||||
private final Map<String, char[]> map = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public String displayName() {
|
||||
return getClass().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void storePassphrase(String key, CharSequence passphrase) {
|
||||
char[] pw = new char[passphrase.length()];
|
||||
|
||||
Reference in New Issue
Block a user