Compare commits

..
Author SHA1 Message Date
Julian Raufelder 0fb5867bd8 Merge branch 'develop' into release/1.6.0 2021-09-29 16:43:26 +02:00
Julian Raufelder 3cc1bef4a6 Bump cryptomator.integrations-linux which fixes #1815 2021-09-29 13:30:29 +02:00
Sebastian Stenzel 907d097e2c store multiline string in env var (fixes #1808) 2021-09-29 11:31:31 +02:00
Tobias Hagemann c9907d6085 added manual build script for mac (missing: notarization, create-dmg)
[ci skip]
2021-09-28 11:45:49 +02:00
Julian Raufelder 5eac665a93 Fixes #1814
Add missing backslash while setting the pluginDir
2021-09-27 18:50:26 +02:00
Sebastian Stenzel 8795e5c8d2 Merge branch 'develop' into release/1.6.0
# Conflicts:
#	pom.xml
#	src/main/resources/license/THIRD-PARTY.txt
2021-09-27 13:52:29 +02:00
CryptobotandGitHub 069c07cbf1 New Crowdin updates (#1807)
* New translations strings.properties
[ci skip]
2021-09-27 13:49:32 +02:00
Sebastian Stenzel cda7cc8ef9 dependency bump 2021-09-27 13:41:02 +02:00
Sebastian Stenzel 1015542629 adjust to latest API 2021-09-27 13:31:05 +02:00
Sebastian Stenzel 18be4ba257 update integrations-api 2021-09-27 13:03:55 +02:00
Sebastian StenzelandGitHub 90bceb0f68 Update to OpenJFX 17 (#1809)
* update to openjfx 17.0.0.1
* use new javafx API instead of AWT
2021-09-24 21:01:19 +02:00
Armin Schrenk 53afaf1b12 Replace Files.isWritable() by real write test 2021-09-24 16:31:07 +02:00
Sebastian Stenzel 6b0625609b case insensitive semver validation 2021-09-24 15:43:52 +02:00
Armin Schrenk 5670e77908 closes #1783 2021-09-24 11:47:57 +02:00
Sebastian Stenzel 79c48778ce Be more lenient when handling open vault events
either via drag and drop or registered file extensions
2021-09-24 10:57:05 +02:00
Sebastian Stenzel f9889c16de attempted fix for #1808 2021-09-23 15:08:24 +02:00
Sebastian Stenzel cbe26d8a4f Merge branch 'develop' into release/1.6.0, fixing appimage version number 2021-09-23 14:04:54 +02:00
Sebastian Stenzel b3c2d68d9b Partial revert of 0d5a3346: Build PPA independently of other installers 2021-09-23 14:04:26 +02:00
Sebastian Stenzel d07c018670 adjust appimage launcher script to comply with appdir built during CI
fixes #1806
2021-09-23 14:01:07 +02:00
Armin Schrenk 0d5a3346f6 execute ppa _after_ all successufl installer builds 2021-09-22 17:54:08 +02:00
Armin Schrenk cfaa4ceffc fix draft release job in release workflow 2021-09-22 17:51:27 +02:00
Tobias Hagemann db843bb1d5 codesigning dylib/jnilib inside jars needs to be forced as well (they may already be signed but could be problematic for notarization) 2021-09-22 17:33:46 +02:00
Armin Schrenk b4539979a4 fix module-info 2021-09-22 16:43:47 +02:00
Armin Schrenk d241f022ab Merge branch 'develop' into release/1.6.0
# Conflicts:
#	pom.xml
2021-09-22 16:36:36 +02:00
CryptobotandGitHub 2a5e09bc32 New Crowdin updates (#1758)
New translations strings.properties

Turkish; Latvian; Slovak; Polish; Norwegian Nynorsk; Hungarian; Norwegian Bokmal; Russian; Catalan; Spanish; Portuguese; French; Japanese; German; Portuguese, Brazilian; Arabic; Latin); Czech; Italian; Punjabi; Greek; Swedish; Indonesian; Serbian (Cyrillic); Chinese Traditional; Hindi; Korean; Dutch; Bosnian; Romanian; Chinese Simplified; 

[ci skip]
2021-09-22 16:27:28 +02:00
Armin Schrenk 85a7383c56 bump fuse dependency 2021-09-22 16:21:06 +02:00
Armin Schrenk 526b2a1e72 Bump cryptofs and adjust usages 2021-09-22 16:20:48 +02:00
Sebastian Stenzel e4da494202 updated 3rd party licenses
[ci skip]
2021-09-22 12:18:35 +02:00
Sebastian Stenzel 55c7636a7b simplified toggle boolean
[ci skip]
2021-09-22 12:17:47 +02:00
Armin SchrenkandGitHub af4603f022 Merge pull request #1761 from cryptomator/feature/#1733-window-position
Persist last known window position and improve resizing
2021-09-22 11:39:51 +02:00
Armin Schrenk 09cf76df68 minor code cleanup 2021-09-22 11:28:45 +02:00
Armin SchrenkandGitHub cfe61a51b6 Merge pull request #1767 from cryptomator/feature/early-loading
Eagerly load vault config
2021-09-22 11:20:14 +02:00
Tobias Hagemann 9c83baabd5 fixes #1740 2021-09-22 09:25:16 +02:00
3e216ed0ac Added error codes to error screen (#1741)
Added error codes based on a translation of GeneratedErrorCode.kt (Cryptomator Android) into Java:

Source of GeneratedErrorCode.kt: https://github.com/cryptomator/android/blob/3ae90ab521a4aa69f394c0490f27e9db6106ce0e/presentation/src/main/java/org/cryptomator/presentation/logging/GeneratedErrorCode.kt

Co-authored-by: Sebastian Stenzel <sebastian.stenzel@gmail.com>
2021-09-21 17:41:54 +02:00
Armin Schrenk 0b488efbb3 remove another convinience method from vault class 2021-09-21 16:15:53 +02:00
Armin Schrenk ae2ad6e00f Replace ObjectProperty with atomicRef to prevent problems with background reloading 2021-09-21 12:32:36 +02:00
Armin Schrenk 76811f92e6 Improve error handling:
* Vault only returns the confiCache
* cache has safe and unsafe method to get config
2021-09-21 12:28:41 +02:00
Armin Schrenk 1fbd07b4a6 Refine impl:
* rename wrapper to cache
* reset the cache to null if error during config loading happens
* always set the the cache in the vault obj
2021-09-20 15:34:53 +02:00
Martin Beyer 21774784a1 Reduce ResizeRegion to 6px, only save positions at MouseRelease 2021-09-17 18:51:09 +02:00
Martin Beyer 4a13b4145d Use javaFx-graphics for display information 2021-09-17 17:46:54 +02:00
Armin Schrenk efc77e4997 updating dependencies 2021-09-17 17:46:28 +02:00
Martin Beyer cf17a3f9ca Saving settings on Drag release 2021-09-17 17:44:26 +02:00
Martin Beyer 560513d7e8 Rearrange Imports 2021-09-17 15:54:45 +02:00
Sebastian StenzelandGitHub 9e66f4b93e Release to PPA (#1791)
Create a Debian source package and dput it to the cryptomator-beta staging repo
2021-09-16 13:01:34 +02:00
Sebastian Stenzel 407718d0a1 fixes #1789 2021-09-16 10:02:38 +02:00
Sebastian StenzelandGitHub b98691ee52 Provide version string when manually triggering a build (#1790)
* fixed inclusion of launcher script in buildkit

* renamed variable

* version must be manually provided during workflow_dispatch
2021-09-15 15:25:52 +02:00
Armin Schrenk e482574aaf Block windows installation if old innosetup version is installed 2021-09-15 12:16:25 +02:00
Sebastian Stenzel 9f068d0b2c add playground workflow 2021-09-13 16:45:05 +02:00
Armin Schrenk bbb30ebe0f keep name of icon file 2021-09-03 12:54:24 +02:00
Armin Schrenk a0fd6618a7 Change logic on how the config wrapper is injected 2021-09-03 12:25:26 +02:00
Armin Schrenk 09a2f76e15 remove startFail controller entirely 2021-09-03 12:02:45 +02:00
Armin Schrenk 5cdd2e006b more bug fixing in release workflow 2021-09-02 15:25:27 +02:00
Armin Schrenk f187decf0a fix installer-ci bugs 2021-09-02 15:14:48 +02:00
Armin Schrenk 869407cded Win installer: use different icon file for Cryptomator files and make c9r/c9s file extensions non executing 2021-09-02 13:30:12 +02:00
Armin Schrenk 3a2420dd91 Add sha256 sum of release artifacts to release text 2021-08-31 16:02:46 +02:00
Armin Schrenk bca920c75e Upload release dmg and msi aritfacts with full version string 2021-08-31 14:15:50 +02:00
Armin Schrenk a457355a25 allow drive letters A and B as mount targets 2021-08-31 10:04:42 +02:00
Martin Beyer 947344e5bc remove border color, reduce default cursor size, enforce minWidth of 650 2021-08-30 17:13:46 +02:00
Armin Schrenk cc6471840f Update build for mac installer:
* use correct mime type for vault metadata
* add icons file for cryptomator files
2021-08-30 15:58:23 +02:00
Martin Beyer cf633d74d2 add extra regions to reset to cursor to the default (+coloring the borders red for debugging and testing) 2021-08-30 15:16:52 +02:00
Armin Schrenk 2f32ab1376 fix bug, where password is not saved to keychain 2021-08-30 13:19:40 +02:00
Armin Schrenk 460e6528bf Eagerly load vault config:
* wrap (re-)loading in new class
* assume existence of config in certain vault states
* deprecate classes which are not used anymore
2021-08-26 21:12:07 +02:00
Martin Beyer 348b015bdc reformat to use fxml to trigger resizing 2021-08-26 17:56:20 +02:00
Martin Beyer 903e022d29 change from LOG.debug "init..." to LOG.trace 2021-08-26 17:22:11 +02:00
Martin Beyer e5f66281c2 centering window as before, renaming 2021-08-26 17:20:53 +02:00
Martin Beyer 21f45d43f7 remove dead code 2021-08-26 11:15:19 +02:00
Martin Beyer 72286de9fe minor string rewriting 2021-08-26 10:46:28 +02:00
Martin Beyer 981902409c calculate new position on display configuration change 2021-08-26 10:33:31 +02:00
Sebastian Stenzel aef1bf821a fixed pluginDir path
thanks @purejava for noticing
[ci skip]
2021-08-25 11:57:40 +02:00
Martin Beyer 6b4ea9a9eb fix fullscreen binding 2021-08-25 11:31:29 +02:00
Sebastian StenzelandGitHub e7b9f73516 Merge pull request #1759 from cryptomator/feature/plugin-loader 2021-08-24 19:28:59 +02:00
Martin Beyer 957640b1ba block moving and resizing in fullscreen 2021-08-24 19:21:53 +02:00
Martin Beyer 31ca102263 update position in settings when moving 2021-08-24 19:09:27 +02:00
Martin Beyer 7df028b0b8 add top, right, bottom and left resizer 2021-08-24 18:52:55 +02:00
Martin Beyer 03eebfe486 add double click on titleBar to min/maximize application 2021-08-24 18:03:55 +02:00
Martin Beyer 58d65c609f set the position on illegal position 2021-08-24 17:38:01 +02:00
Martin Beyer b529764eb4 remove max width and max heigth 2021-08-24 17:37:15 +02:00
Sebastian Stenzel ec9a4465eb add cryptomator.pluginDir environment variable 2021-08-24 16:35:07 +02:00
Sebastian Stenzel e5509bd63f load certain services from jars located in plugin dir 2021-08-24 16:33:05 +02:00
Martin Beyer 4223d15c08 set stored window size to initial window size 2021-08-24 16:23:46 +02:00
Martin Beyer 396b541cd2 safe position settings 2021-08-24 15:36:10 +02:00
CryptobotandGitHub a097a42a9b New Crowdin updates (#1681)
[ci skip]
2021-08-20 10:07:50 +02:00
Armin Schrenk e811f5313d fixes #1755
use system property instead of package version
2021-08-19 12:23:00 +02:00
118 changed files with 2843 additions and 1095 deletions
+115 -22
View File
@@ -2,6 +2,11 @@ name: Installers and Release
on: on:
workflow_dispatch: workflow_dispatch:
inputs:
semver:
description: 'SemVer'
required: true
default: '0.99.99-SNAPSHOT'
push: push:
tags: # see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet tags: # see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet
- '[0-9]+.[0-9]+.[0-9]+' - '[0-9]+.[0-9]+.[0-9]+'
@@ -61,7 +66,7 @@ jobs:
target/libs target/libs
target/mods target/mods
target/LICENSE.txt target/LICENSE.txt
target/${{ matrix.launcher }} target/launcher*
if-no-files-found: error if-no-files-found: error
# #
@@ -71,8 +76,9 @@ jobs:
name: Determine Version Metadata name: Determine Version Metadata
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs: outputs:
versionStr: ${{ steps.versions.outputs.versionStr }} semVerNum: ${{ steps.versions.outputs.semVerNum }}
versionNum: ${{ steps.versions.outputs.versionNum }} semVerStr: ${{ steps.versions.outputs.semVerStr }}
ppaVerStr: ${{ steps.versions.outputs.ppaVerStr }}
revNum: ${{ steps.versions.outputs.revNum }} revNum: ${{ steps.versions.outputs.revNum }}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
@@ -81,14 +87,19 @@ jobs:
- id: versions - id: versions
run: | run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then if [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION_NUM=`echo ${GITHUB_REF##*/} | sed -E 's/([0-9]+\.[0-9]+\.[0-9]+).*/\1/'` SEM_VER_STR=${GITHUB_REF##*/}
echo "::set-output name=versionStr::${GITHUB_REF##*/}"
echo "::set-output name=versionNum::${VERSION_NUM}"
else else
echo "::set-output name=versionStr::SNAPSHOT" SEM_VER_STR=${{ github.event.inputs.semver }}
echo "::set-output name=versionNum::99.0.0"
fi fi
echo "::set-output name=revNum::`git rev-list --count HEAD`" SEM_VER_NUM=`echo ${SEM_VER_STR} | sed -E 's/([0-9]+\.[0-9]+\.[0-9]+).*/\1/'`
REVCOUNT=`git rev-list --count HEAD`
echo "::set-output name=semVerStr::${SEM_VER_STR}"
echo "::set-output name=semVerNum::${SEM_VER_NUM}"
echo "::set-output name=ppaVerStr::${SEM_VER_STR/-/\~}-${REVCOUNT}"
echo "::set-output name=revNum::${REVCOUNT}"
- uses: skymatic/semver-validation-action@v1
with:
version: ${{ steps.versions.outputs.semVerStr }}
# #
# Application Directory # Application Directory
@@ -104,9 +115,10 @@ jobs:
- os: ubuntu-latest - os: ubuntu-latest
profile: linux profile: linux
jpackageoptions: > jpackageoptions: >
--app-version "${{ needs.metadata.outputs.versionNum }}.${{ needs.metadata.outputs.revNum }}" --app-version "${{ needs.metadata.outputs.semVerNum }}.${{ needs.metadata.outputs.revNum }}"
--java-options "-Dfile.encoding=\"utf-8\"" --java-options "-Dfile.encoding=\"utf-8\""
--java-options "-Dcryptomator.logDir=\"~/.local/share/Cryptomator/logs\"" --java-options "-Dcryptomator.logDir=\"~/.local/share/Cryptomator/logs\""
--java-options "-Dcryptomator.pluginDir=\"~/.local/share/Cryptomator/plugins\""
--java-options "-Dcryptomator.settingsPath=\"~/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json\"" --java-options "-Dcryptomator.settingsPath=\"~/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json\""
--java-options "-Dcryptomator.ipcSocketPath=\"~/.config/Cryptomator/ipc.socket\"" --java-options "-Dcryptomator.ipcSocketPath=\"~/.config/Cryptomator/ipc.socket\""
--java-options "-Dcryptomator.mountPointsDir=\"~/.local/share/Cryptomator/mnt\"" --java-options "-Dcryptomator.mountPointsDir=\"~/.local/share/Cryptomator/mnt\""
@@ -116,9 +128,10 @@ jobs:
- os: windows-latest - os: windows-latest
profile: win profile: win
jpackageoptions: > jpackageoptions: >
--app-version "${{ needs.metadata.outputs.versionNum }}.${{ needs.metadata.outputs.revNum }}" --app-version "${{ needs.metadata.outputs.semVerNum }}.${{ needs.metadata.outputs.revNum }}"
--java-options "-Dfile.encoding=\"utf-8\"" --java-options "-Dfile.encoding=\"utf-8\""
--java-options "-Dcryptomator.logDir=\"~/AppData/Roaming/Cryptomator\"" --java-options "-Dcryptomator.logDir=\"~/AppData/Roaming/Cryptomator\""
--java-options "-Dcryptomator.pluginDir=\"~/AppData/Roaming/Cryptomator/Plugins\""
--java-options "-Dcryptomator.settingsPath=\"~/AppData/Roaming/Cryptomator/settings.json\"" --java-options "-Dcryptomator.settingsPath=\"~/AppData/Roaming/Cryptomator/settings.json\""
--java-options "-Dcryptomator.ipcSocketPath=\"~/AppData/Roaming/Cryptomator/ipc.socket\"" --java-options "-Dcryptomator.ipcSocketPath=\"~/AppData/Roaming/Cryptomator/ipc.socket\""
--java-options "-Dcryptomator.keychainPath=\"~/AppData/Roaming/Cryptomator/keychain.json\"" --java-options "-Dcryptomator.keychainPath=\"~/AppData/Roaming/Cryptomator/keychain.json\""
@@ -130,9 +143,10 @@ jobs:
- os: macos-latest - os: macos-latest
profile: mac profile: mac
jpackageoptions: > jpackageoptions: >
--app-version "${{ needs.metadata.outputs.versionNum }}" --app-version "${{ needs.metadata.outputs.semVerNum }}"
--java-options "-Dfile.encoding=\"utf-8\"" --java-options "-Dfile.encoding=\"utf-8\""
--java-options "-Dcryptomator.logDir=\"~/Library/Logs/Cryptomator\"" --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.settingsPath=\"~/Library/Application Support/Cryptomator/settings.json\""
--java-options "-Dcryptomator.ipcSocketPath=\"~/Library/Application Support/Cryptomator/ipc.socket\"" --java-options "-Dcryptomator.ipcSocketPath=\"~/Library/Application Support/Cryptomator/ipc.socket\""
--java-options "-Dcryptomator.showTrayIcon=true" --java-options "-Dcryptomator.showTrayIcon=true"
@@ -175,6 +189,7 @@ jobs:
--copyright "(C) 2016 - 2021 Skymatic GmbH" --copyright "(C) 2016 - 2021 Skymatic GmbH"
--java-options "-Xss5m" --java-options "-Xss5m"
--java-options "-Xmx256m" --java-options "-Xmx256m"
--java-options "-Dcryptomator.appVersion=\"${{ needs.metadata.outputs.semVerStr }}\""
${{ matrix.jpackageoptions }} ${{ matrix.jpackageoptions }}
- name: Create appdir.tar - name: Create appdir.tar
run: tar -cvf appdir.tar appdir run: tar -cvf appdir.tar appdir
@@ -185,6 +200,69 @@ jobs:
path: appdir.tar path: appdir.tar
if-no-files-found: error 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 # Linux Cryptomator.AppImage
# #
@@ -205,7 +283,7 @@ jobs:
run: | run: |
mv appdir/Cryptomator Cryptomator.AppDir mv appdir/Cryptomator Cryptomator.AppDir
cp -r dist/linux/appimage/resources/AppDir/* 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/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/Cryptomator.svg
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/.DirIcon ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/.DirIcon
@@ -213,6 +291,7 @@ jobs:
ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun
env: env:
REVISION_NO: ${{ needs.metadata.outputs.revNum }} 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 - name: Extract libjffi.so # workaround for https://github.com/cryptomator/cryptomator-linux/issues/27
run: | run: |
JFFI_NATIVE_JAR=`ls lib/app/ | grep -e 'jffi-[1-9]\.[0-9]\{1,2\}.[0-9]\{1,2\}-native.jar'` JFFI_NATIVE_JAR=`ls lib/app/ | grep -e 'jffi-[1-9]\.[0-9]\{1,2\}.[0-9]\{1,2\}-native.jar'`
@@ -233,7 +312,7 @@ 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.metadata.outputs.versionStr }}-x86_64.AppImage ./squashfs-root/AppRun Cryptomator.AppDir cryptomator-${{ needs.metadata.outputs.semVerStr }}-x86_64.AppImage
-u 'gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-x86_64.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: Upload AppImage - name: Upload AppImage
@@ -263,10 +342,11 @@ jobs:
- name: Patch Cryptomator.app - name: Patch Cryptomator.app
run: | run: |
mv appdir/Cryptomator.app Cryptomator.app mv appdir/Cryptomator.app Cryptomator.app
mv dist/mac/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_SHORT_VERSION_STRING###|${VERSION_NO}|g" Cryptomator.app/Contents/Info.plist
sed -i '' "s|###BUNDLE_VERSION###|${REVISION_NO}|g" Cryptomator.app/Contents/Info.plist sed -i '' "s|###BUNDLE_VERSION###|${REVISION_NO}|g" Cryptomator.app/Contents/Info.plist
env: env:
VERSION_NO: ${{ needs.metadata.outputs.versionNum }} VERSION_NO: ${{ needs.metadata.outputs.semVerNum }}
REVISION_NO: ${{ needs.metadata.outputs.revNum }} REVISION_NO: ${{ needs.metadata.outputs.revNum }}
- name: Install codesign certificate - name: Install codesign certificate
env: env:
@@ -300,8 +380,8 @@ jobs:
OUTPUT_PATH=${JAR_PATH%.*} OUTPUT_PATH=${JAR_PATH%.*}
echo "Codesigning libs in ${JAR_FILENAME}..." echo "Codesigning libs in ${JAR_FILENAME}..."
unzip -q ${JAR_PATH} -d ${OUTPUT_PATH} unzip -q ${JAR_PATH} -d ${OUTPUT_PATH}
find ${OUTPUT_PATH} -name '*.dylib' -exec codesign -s ${CODESIGN_IDENTITY} {} \; find ${OUTPUT_PATH} -name '*.dylib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \;
find ${OUTPUT_PATH} -name '*.jnilib' -exec codesign -s ${CODESIGN_IDENTITY} {} \; find ${OUTPUT_PATH} -name '*.jnilib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \;
rm ${JAR_PATH} rm ${JAR_PATH}
pushd ${OUTPUT_PATH} > /dev/null pushd ${OUTPUT_PATH} > /dev/null
zip -qr ../${JAR_FILENAME} * zip -qr ../${JAR_FILENAME} *
@@ -368,7 +448,7 @@ jobs:
--icon ".VolumeIcon.icns" 512 758 --icon ".VolumeIcon.icns" 512 758
Cryptomator-${VERSION_NO}.dmg dmg Cryptomator-${VERSION_NO}.dmg dmg
env: env:
VERSION_NO: ${{ needs.metadata.outputs.versionNum }} VERSION_NO: ${{ needs.metadata.outputs.semVerNum }}
- name: Install notarization credentials - name: Install notarization credentials
env: env:
NOTARIZATION_KEYCHAIN_PROFILE: ${{ secrets.MACOS_NOTARIZATION_KEYCHAIN_PROFILE }} NOTARIZATION_KEYCHAIN_PROFILE: ${{ secrets.MACOS_NOTARIZATION_KEYCHAIN_PROFILE }}
@@ -397,6 +477,8 @@ jobs:
- name: Clean up notarization credentials - name: Clean up notarization credentials
if: ${{ always() }} if: ${{ always() }}
run: security delete-keychain $RUNNER_TEMP/notarization.keychain-db run: security delete-keychain $RUNNER_TEMP/notarization.keychain-db
- name: Add possible alpha/beta tags to installer name
run: mv Cryptomator-*.dmg Cryptomator-${{ needs.metadata.outputs.semVerStr }}.dmg
- name: Upload mac-dmg - name: Upload mac-dmg
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v2
with: with:
@@ -449,12 +531,11 @@ jobs:
--name Cryptomator --name Cryptomator
--vendor "Skymatic GmbH" --vendor "Skymatic GmbH"
--copyright "(C) 2016 - 2021 Skymatic GmbH" --copyright "(C) 2016 - 2021 Skymatic GmbH"
--app-version "${{ needs.metadata.outputs.versionNum }}" --app-version "${{ needs.metadata.outputs.semVerNum }}"
--win-menu --win-menu
--win-dir-chooser --win-dir-chooser
--resource-dir dist/win/resources --resource-dir dist/win/resources
--license-file dist/win/resources/license.rtf --license-file dist/win/resources/license.rtf
--file-associations dist/win/resources/FAencryptedData.properties
--file-associations dist/win/resources/FAvaultFile.properties --file-associations dist/win/resources/FAvaultFile.properties
env: env:
JP_WIXWIZARD_RESOURCES: ${{ github.workspace }}/dist/win/resources # requires abs path, used in resources/main.wxs JP_WIXWIZARD_RESOURCES: ${{ github.workspace }}/dist/win/resources # requires abs path, used in resources/main.wxs
@@ -467,6 +548,8 @@ jobs:
description: Cryptomator Installer description: Cryptomator Installer
timestampUrl: 'http://timestamp.digicert.com' timestampUrl: 'http://timestamp.digicert.com'
folder: installer folder: installer
- name: Add possible alpha/beta tags to installer name
run: mv installer/Cryptomator-*.msi installer/Cryptomator-${{ needs.metadata.outputs.semVerStr }}.msi
- name: Upload win-msi - name: Upload win-msi
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v2
with: with:
@@ -480,12 +563,12 @@ jobs:
release: release:
name: Draft a release on Github name: Draft a release on Github
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [metadata,linux-appimage,mac-dmg,win-msi] needs: [metadata,linux-appimage,mac-dmg,win-msi,ppa]
if: startsWith(github.ref, 'refs/tags/') && github.repository == 'cryptomator/cryptomator' if: startsWith(github.ref, 'refs/tags/') && github.repository == 'cryptomator/cryptomator'
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Create tarball - name: Create tarball
run: git archive --prefix="cryptomator-${{ needs.metadata.outputs.versionStr }}/" -o "cryptomator-${{ needs.metadata.outputs.versionStr }}.tar.gz" ${{ github.ref }} run: git archive --prefix="cryptomator-${{ needs.metadata.outputs.semVerStr }}/" -o "cryptomator-${{ needs.metadata.outputs.semVerStr }}.tar.gz" ${{ github.ref }}
- name: Download linux appimage - name: Download linux appimage
uses: actions/download-artifact@v2 uses: actions/download-artifact@v2
with: with:
@@ -507,6 +590,13 @@ jobs:
env: env:
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }} GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }} GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
- name: Compute SHA256 checksums of release artifacts
run: |
SHA256_SUMS=`find . -name "*.AppImage" -o -name "*.dmg" -o -name "*.msi" -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 - name: Create release draft
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
with: with:
@@ -527,3 +617,6 @@ jobs:
## Misc ## Misc
--- ---
:scroll: A complete list of closed issues is available [here](LINK) :scroll: A complete list of closed issues is available [here](LINK)
---
Checksums of release artifacts:
${{ env.SHA256_SUMS }}"
+1 -1
View File
@@ -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="-Djdk.gtk.version=2 -Duser.language=en -Dcryptomator.settingsPath=&quot;~/.config/Cryptomator/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/.config/Cryptomator/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/.local/share/Cryptomator/logs&quot; -Dcryptomator.mountPointsDir=&quot;~/.local/share/Cryptomator/mnt&quot; -Dcryptomator.showTrayIcon=true -Xss20m -Xmx512m" /> <option name="VM_PARAMETERS" value="-Djdk.gtk.version=2 -Duser.language=en -Dcryptomator.settingsPath=&quot;~/.config/Cryptomator/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/.config/Cryptomator/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/.local/share/Cryptomator/logs&quot; -Dcryptomator.pluginDir=&quot;~/.local/share/Cryptomator/plugins&quot; -Dcryptomator.mountPointsDir=&quot;~/.local/share/Cryptomator/mnt&quot; -Dcryptomator.showTrayIcon=true -Xss20m -Xmx512m" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
+1 -1
View File
@@ -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="-Djdk.gtk.version=2 -Duser.language=en -Dcryptomator.settingsPath=&quot;~/.config/Cryptomator-Dev/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/.config/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/.local/share/Cryptomator-Dev/logs&quot; -Dcryptomator.mountPointsDir=&quot;~/.local/share/Cryptomator-Dev/mnt&quot; -Dcryptomator.showTrayIcon=true -Dfuse.experimental=&quot;true&quot; -Xss20m -Xmx512m" /> <option name="VM_PARAMETERS" value="-Djdk.gtk.version=2 -Duser.language=en -Dcryptomator.settingsPath=&quot;~/.config/Cryptomator-Dev/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/.config/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/.local/share/Cryptomator-Dev/logs&quot; -Dcryptomator.pluginDir=&quot;~/.local/share/Cryptomator-Dev/plugins&quot; -Dcryptomator.mountPointsDir=&quot;~/.local/share/Cryptomator-Dev/mnt&quot; -Dcryptomator.showTrayIcon=true -Dfuse.experimental=&quot;true&quot; -Xss20m -Xmx512m" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
+1 -1
View File
@@ -2,7 +2,7 @@
<configuration default="false" name="Cryptomator Windows" type="Application" factoryName="Application"> <configuration default="false" name="Cryptomator Windows" 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="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/AppData/Roaming/Cryptomator/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/AppData/Roaming/Cryptomator/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/AppData/Roaming/Cryptomator&quot; -Dcryptomator.keychainPath=&quot;~/AppData/Roaming/Cryptomator/keychain.json&quot; -Dcryptomator.mountPointsDir=&quot;~/Cryptomator&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m" /> <option name="VM_PARAMETERS" value="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/AppData/Roaming/Cryptomator/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/AppData/Roaming/Cryptomator/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/AppData/Roaming/Cryptomator&quot; -Dcryptomator.pluginDir=&quot;~/AppData/Roaming/Cryptomator/Plugins&quot; -Dcryptomator.keychainPath=&quot;~/AppData/Roaming/Cryptomator/keychain.json&quot; -Dcryptomator.mountPointsDir=&quot;~/Cryptomator&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
+1 -1
View File
@@ -2,7 +2,7 @@
<configuration default="false" name="Cryptomator Windows Dev" type="Application" factoryName="Application"> <configuration default="false" name="Cryptomator Windows 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="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/AppData/Roaming/Cryptomator-Dev/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/AppData/Roaming/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/AppData/Roaming/Cryptomator-Dev&quot; -Dcryptomator.keychainPath=&quot;~/AppData/Roaming/Cryptomator-Dev/keychain.json&quot; -Dcryptomator.mountPointsDir=&quot;~/Cryptomator-Dev&quot; -Dfuse.experimental=&quot;true&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m" /> <option name="VM_PARAMETERS" value="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/AppData/Roaming/Cryptomator-Dev/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/AppData/Roaming/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/AppData/Roaming/Cryptomator-Dev&quot; -Dcryptomator.pluginDir=&quot;~/AppData/Roaming/Cryptomator-Dev/Plugins&quot; -Dcryptomator.keychainPath=&quot;~/AppData/Roaming/Cryptomator-Dev/keychain.json&quot; -Dcryptomator.mountPointsDir=&quot;~/Cryptomator-Dev&quot; -Dfuse.experimental=&quot;true&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
+1 -1
View File
@@ -5,7 +5,7 @@
</envs> </envs>
<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="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/Library/Application Support/Cryptomator/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/Library/Application Support/Cryptomator/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/Library/Logs/Cryptomator&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m -ea" /> <option name="VM_PARAMETERS" value="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/Library/Application Support/Cryptomator/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/Library/Application Support/Cryptomator/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/Library/Logs/Cryptomator&quot; -Dcryptomator.pluginDir=&quot;~/Library/Application Support/Cryptomator/Plugins&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m -ea" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
+1 -1
View File
@@ -5,7 +5,7 @@
</envs> </envs>
<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="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/Library/Application Support/Cryptomator-Dev/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/Library/Application Support/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/Library/Logs/Cryptomator-Dev&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m -ea" /> <option name="VM_PARAMETERS" value="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/Library/Application Support/Cryptomator-Dev/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/Library/Application Support/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/Library/Logs/Cryptomator-Dev&quot; -Dcryptomator.pluginDir=&quot;~/Library/Application Support/Cryptomator-Dev/Plugins&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m -ea" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
+5 -2
View File
@@ -26,12 +26,15 @@ export LD_PRELOAD=lib/app/libjffi.so
./lib/runtime/bin/java \ ./lib/runtime/bin/java \
-p "lib/app/mods" \ -p "lib/app/mods" \
-cp "lib/app/*" \ -cp "lib/app/*" \
-Dfile.encoding="utf-8" \
-Dcryptomator.logDir="~/.local/share/Cryptomator/logs" \ -Dcryptomator.logDir="~/.local/share/Cryptomator/logs" \
-Dcryptomator.pluginDir="~/.local/share/Cryptomator/plugins" \
-Dcryptomator.mountPointsDir="~/.local/share/Cryptomator/mnt" \ -Dcryptomator.mountPointsDir="~/.local/share/Cryptomator/mnt" \
-Dcryptomator.settingsPath="~/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json" \ -Dcryptomator.settingsPath="~/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json" \
-Dcryptomator.ipcSocketPath="~/.config/Cryptomator/ipc.socket" \ -Dcryptomator.ipcSocketPath="~/.config/Cryptomator/ipc.socket" \
-Dcryptomator.buildNumber="appimage-${REVISION_NO}" \ -Dcryptomator.buildNumber="appimage-${REVISION_NO}" \
-Dcryptomator.appVersion="${SEMVER_STR}" \
$GTK_FLAG \ $GTK_FLAG \
-Xss2m \ -Xss5m \
-Xmx512m \ -Xmx256m \
-m org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator -m org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator
+5
View File
@@ -0,0 +1,5 @@
cryptomator (${PPA_VERSION}) focal; urgency=low
* Full changelog can be found on https://github.com/cryptomator/cryptomator/releases
-- Cryptobot <releases@cryptomator.org> ${RFC2822_TIMESTAMP}
+1
View File
@@ -0,0 +1 @@
10
+23
View File
@@ -0,0 +1,23 @@
Source: cryptomator
Maintainer: Cryptobot <releases@cryptomator.org>
Section: utils
Priority: optional
Build-Depends: debhelper (>=10), openjdk-16-jdk
Standards-Version: 4.5.0
Homepage: https://cryptomator.org
Vcs-Git: https://github.com/cryptomator/cryptomator.git
Vcs-browser: https://github.com/cryptomator/cryptomator
Package: cryptomator
Architecture: any
Section: utils
Priority: optional
Depends: ${shlibs:Depends}, ${misc:Depends}, libfuse2, xdg-utils, libjffi-jni
Recommends: gvfs-backends, gvfs-fuse, gnome-keyring
XB-AppName: Cryptomator
XB-Category: Utility;Security;FileTools;
Homepage: https://cryptomator.org
Description: Multi-platform client-side encryption of your cloud files.
Cryptomator provides free client-side AES encryption for your cloud files.
Create encrypted vaults, which get mounted as virtual volumes. Whatever
you save on one of these volumes will end up encrypted inside your vault.
+39
View File
@@ -0,0 +1,39 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: cryptomator
Upstream-Contact: Cryptomator <info@cryptomator.org>
Source: https://cryptomator.org
Files: *
Copyright: 2016-2021 Skymatic GmbH
License: GPL-3+
Files: debian/org.cryptomator.Cryptomator.appdata.xml
Copyright: 2016-2021 Skymatic GmbH
License: FSFAP
License: GPL-3+
This program is free software: you can redistribute it
and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation, either
version 3 of the License, or (at your option) any later
version.
.
This program is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU General Public License for more
details.
.
You should have received a copy of the GNU General Public
License along with this program. If not, see
<https://www.gnu.org/licenses/>.
.
On Debian systems, the full text of the GNU General Public
License version 3 can be found in the file
`/usr/share/common-licenses/GPL-3'.
License: FSFAP
Copying and distribution of this file, with or without modification, are
permitted in any medium without royalty provided the copyright notice and
this notice are preserved. This file is offered as-is, without any
warranty.
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-vnd.cryptomator-vault-metadata">
<comment>Cryptomator Vault Metadata</comment>
<glob pattern="*.cryptomator"/>
</mime-type>
</mime-info>
+7
View File
@@ -0,0 +1,7 @@
cryptomator usr/lib
debian/cryptomator.sh usr/lib/cryptomator/bin
debian/org.cryptomator.Cryptomator.desktop usr/share/applications
debian/org.cryptomator.Cryptomator.svg usr/share/icons/hicolor/scalable/apps
debian/org.cryptomator.Cryptomator.png usr/share/icons/hicolor/512x512/apps
debian/org.cryptomator.Cryptomator.appdata.xml usr/share/metainfo
debian/cryptomator-vault.xml usr/share/mime/packages
+1
View File
@@ -0,0 +1 @@
usr/lib/cryptomator/bin/cryptomator.sh usr/bin/cryptomator
+6
View File
@@ -0,0 +1,6 @@
#!/bin/sh
# fix for https://github.com/cryptomator/cryptomator/issues/1370
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/jni/libjffi-1.2.so
/usr/lib/cryptomator/bin/cryptomator
@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2018 Armin Schrenk <armin.schrenk@zoho.eu> -->
<component type="desktop-application">
<id>org.cryptomator.Cryptomator</id>
<metadata_license>FSFAP</metadata_license>
<project_license>GPL-3.0-or-later</project_license>
<name>Cryptomator</name>
<summary>Multi-platform client-side encryption tool optimized for cloud storages</summary>
<description>
<p>
Cryptomator offers multi-platform transparent client-side encryption of your files in the cloud.
</p>
<p>
Features:
<ul>
<li>Works with Dropbox, Google Drive, OneDrive, ownCloud, Nextcloud and any other cloud storage service which synchronizes with a local directory</li>
<li>Open Source means: No backdoors, control is better than trust</li>
<li>Client-side: No accounts, no data shared with any online service</li>
<li>Totally transparent: Just work on the virtual drive as if it were a USB flash drive</li>
<li>AES encryption with 256-bit key length</li>
<li>File names get encrypted</li>
<li>Folder structure gets obfuscated</li>
<li>Use as many vaults in your Dropbox as you want, each having individual passwords</li>
<li>One thousand commits for the security of your data!! :tada:</li>
</ul>
</p>
<p>
Privacy:
<ul>
<li>256-bit keys (unlimited strength policy bundled with native binaries)</li>
<li>Scrypt key derivation</li>
<li>Cryptographically secure random numbers for salts, IVs and the masterkey of course</li>
<li>Sensitive data is wiped from the heap asap</li>
<li>Lightweight: Complexity kills security</li>
</ul>
</p>
<p>
Consistency:
<ul>
<li>HMAC over file contents to recognize changed ciphertext before decryption</li>
<li>I/O operations are transactional and atomic, if the filesystems support it</li>
<li>Each file contains all information needed for decryption (except for the key of course), no common metadata means no Single Point of Failure</li>
</ul>
</p>
</description>
<categories>
<category>Office</category>
<category>Security</category>
<category>FileTools</category>
<category>Java</category>
</categories>
<url type="homepage">http://cryptomator.org</url>
<url type="bugtracker">https://github.com/cryptomator/cryptomator/issues</url>
<url type="faq">https://community.cryptomator.org/c/kb/faq</url>
<url type="help">https://community.cryptomator.org/</url>
<url type="donation">https://cryptomator.org/</url>
<content_rating type="oars-1.0">
<content_attribute id="violence-cartoon">none</content_attribute>
<content_attribute id="drugs-alcohol">none</content_attribute>
<content_attribute id="sex-nudity">none</content_attribute>
<content_attribute id="language-profanity">none</content_attribute>
<content_attribute id="social-info">mild</content_attribute> <!-- update checker conencts to https://api.cryptomator.org/updates/latestVersion.json -->
</content_rating>
<project_group>Cryptomator</project_group>
<provides>
<binary>cryptomator</binary>
</provides>
<launchable type="desktop-id">org.cryptomator.Cryptomator.desktop</launchable>
</component>
+11
View File
@@ -0,0 +1,11 @@
[Desktop Entry]
Name=Cryptomator
Version=${VERSION_STR}
Comment=Cloud Storage Encryption Utility
Exec=/usr/bin/cryptomator %f
Icon=org.cryptomator.Cryptomator
Terminal=false
Type=Application
Categories=Utility;Security;FileTools;
StartupWMClass=org.cryptomator.launcher.Cryptomator
MimeType=application/vnd.cryptomator.encrypted;application/x-vnd.cryptomator.vault-metadata;
Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

+1
View File
@@ -0,0 +1 @@
<svg width="1110" height="1110" viewBox="0 0 1108.12 940.2" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg"><path d="m552.69 0c-169.1 0-262.45 143.46-262.45 283.52h524.9c0-140.06-105.33-283.52-262.45-283.52z" fill="#cfcfcf"/><path d="m552.69 53.2c-137.37 0-213.21 116.54-213.21 230.32l213.21 24.18 213.21-24.18c0-113.78-85.57-230.32-213.21-230.32z" fill="#585e62"/><path d="m89.8 739.52a20 20 0 0 1 -2.23-39.88 42.8 42.8 0 1 0 -42.22-21.82 20 20 0 0 1 -35 19.31 82.79 82.79 0 1 1 81.76 42.26 21.78 21.78 0 0 1 -2.31.13z" fill="#585e62"/><rect fill="#cfcfcf" height="144.19" rx="49.42" transform="matrix(.8902923 .45538953 -.45538953 .8902923 261.57 -5.69)" width="104.68" x="90.27" y="467.98"/><path d="m149.47 401.27h62.8a0 0 0 0 1 0 0v94.55a31.4 31.4 0 0 1 -31.4 31.4 31.4 31.4 0 0 1 -31.4-31.4v-94.55a0 0 0 0 1 0 0z" fill="#585e62" transform="matrix(.8902923 .45538953 -.45538953 .8902923 231.23 -31.44)"/><circle cx="222.59" cy="387.53" fill="#cfcfcf" r="75.05"/><path d="m258.09 321.8a75.09 75.09 0 0 0 -91.23 14.64 75.06 75.06 0 0 1 51.58 126.06 75.06 75.06 0 0 0 39.65-140.7z" fill="#b1b1b1"/><path d="m1018.31 739.52a22.09 22.09 0 0 1 -2.28-.13 82.8 82.8 0 1 1 81.77-42.26 20 20 0 1 1 -35-19.31 42.8 42.8 0 1 0 -42.23 21.82 20 20 0 0 1 -2.23 39.88z" fill="#585e62"/><rect fill="#cfcfcf" height="144.19" rx="49.42" transform="matrix(-.8902923 .45538953 -.45538953 -.8902923 2071.05 581.27)" width="104.68" x="913.18" y="467.98"/><path d="m927.25 401.27a31.4 31.4 0 0 1 31.4 31.4v94.55a0 0 0 0 1 0 0h-62.8a0 0 0 0 1 0 0v-94.55a31.4 31.4 0 0 1 31.4-31.4z" fill="#585e62" transform="matrix(-.8902923 .45538953 -.45538953 -.8902923 1964.18 455.35)"/><circle cx="885.53" cy="387.53" fill="#cfcfcf" r="75.05"/><path d="m850 321.8a75.08 75.08 0 0 1 91.22 14.64 75.06 75.06 0 0 0 -51.54 126.06 75.05 75.05 0 0 1 -39.68-140.7z" fill="#b1b1b1"/><path d="m248.78 940.2c-36.67 0-67-39.85-75.51-99.15-4.56-31.83-2.26-65.19 6.48-94 9.41-31 25.51-53.59 45.32-63.72a51.72 51.72 0 0 1 23.69-5.84h103.52v262.71z" fill="#585e62"/><path d="m351.43 940.2c-21.26 0-38.85-39.85-43.78-99.15-2.64-31.83-1.31-65.19 3.76-94 5.45-31 14.78-53.59 26.27-63.72 4.39-3.87 9-5.84 13.73-5.84s9.34 2 13.75 5.8l49.7 43.83c17.37 15.32 23.39 64 20.23 102-2.43 29.28-10 52.18-20.19 61.28l-49.69 43.82c-4.44 3.99-9.08 5.98-13.78 5.98z" fill="#585e62"/><path d="m360.57 699 49.65 43.79c11.18 9.9 17.78 47.45 14.78 83.91-2 24.27-7.83 41.95-14.77 48.13l-49.65 43.79c-18.58 16.38-37.79-19.43-42.83-80.07s6-123.1 24.58-139.51c6.15-5.42 12.5-5.04 18.24-.04z" fill="#35393b"/><path d="m850.73 940.2c36.66 0 67-39.85 75.51-99.15 4.56-31.83 2.26-65.19-6.48-94-9.41-31-25.51-53.59-45.32-63.72a51.72 51.72 0 0 0 -23.69-5.84h-103.53v262.71z" fill="#585e62"/><path d="m748.08 940.2c21.26 0 38.85-39.85 43.78-99.15 2.64-31.83 1.31-65.19-3.76-94-5.45-31-14.79-53.59-26.27-63.72-4.4-3.87-9-5.84-13.73-5.84s-9.34 2-13.76 5.8l-49.69 43.83c-17.38 15.32-23.39 64-20.23 102 2.43 29.28 10 52.18 20.19 61.28l49.68 43.82c4.45 3.99 9.09 5.98 13.79 5.98z" fill="#585e62"/><path d="m738.94 699-49.65 43.79c-11.19 9.86-17.8 47.41-14.77 83.87 2 24.27 7.83 41.95 14.77 48.13l49.65 43.79c18.61 16.41 37.78-19.43 42.82-80.07s-6-123.1-24.58-139.51c-6.18-5.38-12.5-5-18.24 0z" fill="#35393b"/><path d="m848.63 451.38a83.62 83.62 0 0 1 -.56-45.6c14.74-53.13 5.06-111.78 5.06-111.78-185.07-57.77-300.13-.48-300.13-.48s-114.79-57.64-300-.45c0 0-9.86 58.64 4.72 111.83a83.69 83.69 0 0 1 -.69 45.59c-5.14 17.57-10.72 44.5-10.77 78.8-.37 249 306 326.08 306 326.08s306.58-76.15 306.95-325.16c0-34.3-5.49-61.21-10.58-78.83z" fill="#cfcfcf"/><path d="m552.34 808.87c-50.72-15.87-261.7-93.25-261.42-279.51 0-29.65 4.89-52.42 9-66.31a128.3 128.3 0 0 0 .91-70c-6.2-22.58-6.9-47.13-6.17-65.29 40.48-10.23 80.2-15.37 118.41-15.32 75.66.12 119.86 21 120.3 21.17l20.39 10.23 19.24-10.32c.11 0 44.36-20.75 120-20.64 38.21.06 77.91 5.32 118.37 15.68.67 18.14-.1 42.71-6.37 65.27a128.33 128.33 0 0 0 .69 70c4 13.91 8.82 36.69 8.77 66.35-.28 187.06-211.26 263.09-262.12 278.69z" fill="#49b04a"/><path d="m610.15 478.76a57.46 57.46 0 1 0 -70.15 55.92l-32.29 135.47 44.67 12.85 44.71-12.71-31.84-135.57a57.46 57.46 0 0 0 44.9-55.96z" fill="#35393b"/><g fill="#49b04a"><path d="m454.94 131.08a60.64 60.64 0 0 0 -60.64 60.64h121.28a60.64 60.64 0 0 0 -60.64-60.64z"/><path d="m642.38 131.08a60.64 60.64 0 0 0 -60.64 60.64h121.26a60.64 60.64 0 0 0 -60.62-60.64z"/><circle cx="483.23" cy="229.43" r="11.52"/><circle cx="528.52" cy="229.43" r="11.52"/><circle cx="573.8" cy="229.43" r="11.52"/><circle cx="619.09" cy="229.43" r="11.52"/></g></svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

+44
View File
@@ -0,0 +1,44 @@
#!/bin/sh
# postinst script for Cryptomator
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <postinst> `configure' <most-recently-configured-version>
# * <old-postinst> `abort-upgrade' <new version>
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
# <new-version>
# * <postinst> `abort-remove'
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
# <failed-install-package> <version> `removing'
# <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
case "$1" in
configure)
echo Adding shortcut to the menu
if [ ! -d "/usr/share/desktop-directories" ]; then
mkdir -p /usr/share/desktop-directories
fi
xdg-desktop-menu install --novendor /usr/share/applications/org.cryptomator.Cryptomator.desktop
xdg-mime install /usr/share/mime/packages/cryptomator-vault.xml
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0
+42
View File
@@ -0,0 +1,42 @@
#!/bin/sh
# prerm script for Cryptomator
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <prerm> `remove'
# * <old-prerm> `upgrade' <new-version>
# * <new-prerm> `failed-upgrade' <old-version>
# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
# * <deconfigured's-prerm> `deconfigure' `in-favour'
# <package-being-installed> <version> `removing'
# <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
case "$1" in
remove|upgrade|deconfigure)
echo Removing shortcut
xdg-desktop-menu uninstall --novendor /usr/share/applications/org.cryptomator.Cryptomator.desktop
xdg-mime uninstall /usr/share/mime/packages/cryptomator-vault.xml
;;
failed-upgrade)
;;
*)
echo "prerm called with unknown argument \`$1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0
Vendored Executable
+53
View File
@@ -0,0 +1,53 @@
#!/usr/bin/make -f
# -*- makefile -*-
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
%:
dh $@
override_dh_auto_clean:
rm -rf runtime
rm -rf cryptomator
rm -rf debian/cryptomator
override_dh_auto_build:
jlink \
--output runtime \
--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=2
jpackage \
--type app-image \
--runtime-image runtime \
--input libs \
--module-path 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 "-Dfile.encoding=\"utf-8\"" \
--java-options "-Dcryptomator.logDir=\"~/.local/share/Cryptomator/logs\"" \
--java-options "-Dcryptomator.pluginDir=\"~/.local/share/Cryptomator/plugins\"" \
--java-options "-Dcryptomator.settingsPath=\"~/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json\"" \
--java-options "-Dcryptomator.ipcSocketPath=\"~/.config/Cryptomator/ipc.socket\"" \
--java-options "-Dcryptomator.mountPointsDir=\"~/.local/share/Cryptomator/mnt\"" \
--java-options "-Dcryptomator.showTrayIcon=false" \
--java-options "-Dcryptomator.buildNumber=\"ppa-${REVISION_NUM}\"" \
--java-options "-Dcryptomator.appVersion=\"${VERSION_STR}\"" \
--app-version "${VERSION_NUM}.${REVISION_NUM}" \
--resource-dir resources \
--verbose
override_dh_fixperms:
dh_fixperms
chmod +x debian/cryptomator/usr/lib/cryptomator/bin/cryptomator.sh
# override_dh_strip:
# no-op
+1
View File
@@ -0,0 +1 @@
3.0 (quilt)
+2
View File
@@ -0,0 +1,2 @@
debian/org.cryptomator.Cryptomator.png
resources/cryptomator.png

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

+3
View File
@@ -0,0 +1,3 @@
# created during build
runtime/
*.app/
Vendored Executable
+96
View 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
+1 -1
View File
@@ -84,7 +84,7 @@
</array> </array>
<key>public.mime-type</key> <key>public.mime-type</key>
<array> <array>
<string>application/x-vnd.cryptomator.vault-metadata</string> <string>application/vnd.cryptomator.vault</string>
</array> </array>
</dict> </dict>
</dict> </dict>
Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

-4
View File
@@ -1,4 +0,0 @@
mime-type=application/vnd.cryptomator.encrypted
extension=c9r,c9s
description=Cryptomator Encrypted Data
icon=resources/Cryptomator.ico
+1 -1
View File
@@ -1,4 +1,4 @@
mime-type=application/vnd.cryptomator.vault mime-type=application/vnd.cryptomator.vault
extension=cryptomator extension=cryptomator
description=Cryptomator Vault File description=Cryptomator Vault File
icon=resources/Cryptomator.ico icon=resources/Cryptomator-Vault.ico
+25
View File
@@ -47,13 +47,38 @@
<CustomAction Id="JpDisallowDowngrade" Error="!(loc.DowngradeErrorMessage)" /> <CustomAction Id="JpDisallowDowngrade" Error="!(loc.DowngradeErrorMessage)" />
<?endif?> <?endif?>
<!-- Looking for legacy Cryptomator versions-->
<Property Id="OLDEXEINSTALLER">
<RegistrySearch Id="InnoSetupInstallation" Root="HKLM" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\Cryptomator_is1" Type="raw" Name="DisplayName" />
</Property>
<!-- Block installation if innosetup entry of Cryptomator is found -->
<!-- TODO: localize -->
<Condition Message="A lower version of [ProductName] is already installed. Uninstall it first and then start the setup again. Setup will now exit.">
<![CDATA[Installed OR NOT OLDEXEINSTALLER]]>
</Condition>
<!-- Standard required root --> <!-- Standard required root -->
<Directory Id="TARGETDIR" Name="SourceDir"/> <Directory Id="TARGETDIR" Name="SourceDir"/>
<!-- Non-Opening ProgID -->
<DirectoryRef Id="INSTALLDIR">
<Component Win64="yes" Id="nonStartingProgID" >
<File Id="IconFileForEncryptedData" KeyPath="yes" Source="$(env.JP_WIXWIZARD_RESOURCES)\Cryptomator-Vault.ico" Name="Cryptomator-Vault.ico"></File>
<ProgId Id="Cryptomator.Encrypted.1" Description="Cryptomator Encrypted Data" Icon="IconFileForEncryptedData" IconIndex="0">
<Extension Id="c9r" Advertise="no" ContentType="application/vnd.cryptomator.encrypted">
<MIME ContentType="application/vnd.cryptomator.encrypted" Default="yes"></MIME>
</Extension>
<Extension Id="c9s" Advertise="no" ContentType="application/vnd.cryptomator.encrypted"/>
</ProgId>
</Component>
</DirectoryRef>
<Feature Id="DefaultFeature" Title="!(loc.MainFeatureTitle)" Level="1"> <Feature Id="DefaultFeature" Title="!(loc.MainFeatureTitle)" Level="1">
<ComponentGroupRef Id="Shortcuts"/> <ComponentGroupRef Id="Shortcuts"/>
<ComponentGroupRef Id="Files"/> <ComponentGroupRef Id="Files"/>
<ComponentGroupRef Id="FileAssociations"/> <ComponentGroupRef Id="FileAssociations"/>
<!-- Ref to additional ProgIDs -->
<ComponentRef Id="nonStartingProgID" />
</Feature> </Feature>
<?ifdef JpInstallDirChooser ?> <?ifdef JpInstallDirChooser ?>
+16 -16
View File
@@ -27,30 +27,30 @@
<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> <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 dependencies -->
<cryptomator.cryptofs.version>2.1.0-beta11</cryptomator.cryptofs.version> <cryptomator.cryptofs.version>2.1.0-beta13</cryptomator.cryptofs.version>
<cryptomator.integrations.version>1.0.0-rc1</cryptomator.integrations.version> <cryptomator.integrations.version>1.0.0</cryptomator.integrations.version>
<cryptomator.integrations.win.version>1.0.0-beta2</cryptomator.integrations.win.version> <cryptomator.integrations.win.version>1.0.0-rc1</cryptomator.integrations.win.version>
<cryptomator.integrations.mac.version>1.0.0-beta2</cryptomator.integrations.mac.version> <cryptomator.integrations.mac.version>1.0.0-rc1</cryptomator.integrations.mac.version>
<cryptomator.integrations.linux.version>1.0.0-beta1</cryptomator.integrations.linux.version> <cryptomator.integrations.linux.version>1.0.0-rc2</cryptomator.integrations.linux.version>
<cryptomator.fuse.version>1.3.2</cryptomator.fuse.version> <cryptomator.fuse.version>1.3.2</cryptomator.fuse.version>
<cryptomator.dokany.version>1.3.1</cryptomator.dokany.version> <cryptomator.dokany.version>1.3.3</cryptomator.dokany.version>
<cryptomator.webdav.version>1.2.5</cryptomator.webdav.version> <cryptomator.webdav.version>1.2.6</cryptomator.webdav.version>
<!-- 3rd party dependencies --> <!-- 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> <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> <easybind.version>2.2</easybind.version>
<guava.version>30.1.1-jre</guava.version> <guava.version>31.0-jre</guava.version>
<dagger.version>2.38.1</dagger.version> <dagger.version>2.38.1</dagger.version>
<gson.version>2.8.7</gson.version> <gson.version>2.8.8</gson.version>
<zxcvbn.version>1.5.2</zxcvbn.version> <zxcvbn.version>1.5.2</zxcvbn.version>
<slf4j.version>1.7.31</slf4j.version> <slf4j.version>1.7.32</slf4j.version>
<logback.version>1.2.3</logback.version> <logback.version>1.2.6</logback.version>
<!-- test dependencies --> <!-- test dependencies -->
<junit.jupiter.version>5.7.2</junit.jupiter.version> <junit.jupiter.version>5.8.1</junit.jupiter.version>
<mockito.version>3.11.2</mockito.version> <mockito.version>3.12.4</mockito.version>
<hamcrest.version>2.2</hamcrest.version> <hamcrest.version>2.2</hamcrest.version>
</properties> </properties>
@@ -276,7 +276,7 @@
<plugin> <plugin>
<groupId>org.owasp</groupId> <groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId> <artifactId>dependency-check-maven</artifactId>
<version>6.2.2</version> <version>6.3.1</version>
</plugin> </plugin>
</plugins> </plugins>
</pluginManagement> </pluginManagement>
+1
View File
@@ -46,6 +46,7 @@ module org.cryptomator.desktop {
opens org.cryptomator.ui.fxapp to javafx.fxml; opens org.cryptomator.ui.fxapp to javafx.fxml;
opens org.cryptomator.ui.health to javafx.fxml; opens org.cryptomator.ui.health to javafx.fxml;
opens org.cryptomator.ui.keyloading.masterkeyfile to javafx.fxml; opens org.cryptomator.ui.keyloading.masterkeyfile to javafx.fxml;
opens org.cryptomator.ui.lock to javafx.fxml;
opens org.cryptomator.ui.mainwindow to javafx.fxml; opens org.cryptomator.ui.mainwindow to javafx.fxml;
opens org.cryptomator.ui.migration to javafx.fxml; opens org.cryptomator.ui.migration to javafx.fxml;
opens org.cryptomator.ui.preferences to javafx.fxml; opens org.cryptomator.ui.preferences to javafx.fxml;
@@ -5,6 +5,7 @@ public interface Constants {
String MASTERKEY_FILENAME = "masterkey.cryptomator"; String MASTERKEY_FILENAME = "masterkey.cryptomator";
String MASTERKEY_BACKUP_SUFFIX = ".bkup"; String MASTERKEY_BACKUP_SUFFIX = ".bkup";
String VAULTCONFIG_FILENAME = "vault.cryptomator"; String VAULTCONFIG_FILENAME = "vault.cryptomator";
String CRYPTOMATOR_FILENAME_EXT = ".cryptomator";
byte[] PEPPER = new byte[0]; byte[] PEPPER = new byte[0];
} }
@@ -36,8 +36,10 @@ public class Environment {
LOG.debug("cryptomator.ipcSocketPath: {}", System.getProperty("cryptomator.ipcSocketPath")); LOG.debug("cryptomator.ipcSocketPath: {}", System.getProperty("cryptomator.ipcSocketPath"));
LOG.debug("cryptomator.keychainPath: {}", System.getProperty("cryptomator.keychainPath")); LOG.debug("cryptomator.keychainPath: {}", System.getProperty("cryptomator.keychainPath"));
LOG.debug("cryptomator.logDir: {}", System.getProperty("cryptomator.logDir")); LOG.debug("cryptomator.logDir: {}", System.getProperty("cryptomator.logDir"));
LOG.debug("cryptomator.pluginDir: {}", System.getProperty("cryptomator.pluginDir"));
LOG.debug("cryptomator.mountPointsDir: {}", System.getProperty("cryptomator.mountPointsDir")); LOG.debug("cryptomator.mountPointsDir: {}", System.getProperty("cryptomator.mountPointsDir"));
LOG.debug("cryptomator.minPwLength: {}", System.getProperty("cryptomator.minPwLength")); LOG.debug("cryptomator.minPwLength: {}", System.getProperty("cryptomator.minPwLength"));
LOG.debug("cryptomator.appVersion: {}", System.getProperty("cryptomator.appVersion"));
LOG.debug("cryptomator.buildNumber: {}", System.getProperty("cryptomator.buildNumber")); LOG.debug("cryptomator.buildNumber: {}", System.getProperty("cryptomator.buildNumber"));
LOG.debug("cryptomator.showTrayIcon: {}", System.getProperty("cryptomator.showTrayIcon")); LOG.debug("cryptomator.showTrayIcon: {}", System.getProperty("cryptomator.showTrayIcon"));
LOG.debug("fuse.experimental: {}", Boolean.getBoolean("fuse.experimental")); LOG.debug("fuse.experimental: {}", Boolean.getBoolean("fuse.experimental"));
@@ -63,10 +65,18 @@ public class Environment {
return getPath("cryptomator.logDir").map(this::replaceHomeDir); return getPath("cryptomator.logDir").map(this::replaceHomeDir);
} }
public Optional<Path> getPluginDir() {
return getPath("cryptomator.pluginDir").map(this::replaceHomeDir);
}
public Optional<Path> getMountPointsDir() { public Optional<Path> getMountPointsDir() {
return getPath("cryptomator.mountPointsDir").map(this::replaceHomeDir); return getPath("cryptomator.mountPointsDir").map(this::replaceHomeDir);
} }
public Optional<String> getAppVersion() {
return Optional.ofNullable(System.getProperty("cryptomator.appVersion"));
}
public Optional<String> getBuildNumber() { public Optional<String> getBuildNumber() {
return Optional.ofNullable(System.getProperty("cryptomator.buildNumber")); return Optional.ofNullable(System.getProperty("cryptomator.buildNumber"));
} }
@@ -0,0 +1,121 @@
package org.cryptomator.common;
import com.google.common.base.Strings;
import com.google.common.base.Throwables;
import java.util.Locale;
import java.util.Objects;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
* Holds a throwable and provides a human-readable {@link #toString() three-component string representation}
* aiming to allow documentation and lookup of same or similar errors.
*/
public class ErrorCode {
private final static int A_PRIME = 31;
private final static int SEED = 0xdeadbeef;
public final static String DELIM = ":";
private final static int LATEST_FRAME = 1;
private final static int ALL_FRAMES = Integer.MAX_VALUE;
private final Throwable throwable;
private final Throwable rootCause;
private final int rootCauseSpecificFrames;
private ErrorCode(Throwable throwable, Throwable rootCause, int rootCauseSpecificFrames) {
this.throwable = Objects.requireNonNull(throwable);
this.rootCause = Objects.requireNonNull(rootCause);
this.rootCauseSpecificFrames = rootCauseSpecificFrames;
}
// visible for testing
String methodCode() {
return format(traceCode(rootCause, LATEST_FRAME));
}
// visible for testing
String rootCauseCode() {
return format(traceCode(rootCause, rootCauseSpecificFrames));
}
// visible for testing
String throwableCode() {
return format(traceCode(throwable, ALL_FRAMES));
}
/**
* Produces an error code consisting of three {@value DELIM}-separated components.
* <p>
* A full match of the error code indicates the exact same throwable (to the extent possible
* without hash collisions). A partial match of the first or second component indicates related problems
* with the same root cause.
*
* @return A three-part error code
*/
@Override
public String toString() {
return methodCode() + DELIM + rootCauseCode() + DELIM + throwableCode();
}
/**
* Deterministically creates an error code from the stack trace of the given <code>cause</code>.
* <p>
* The code consists of three parts separated by {@value DELIM}:
* <ul>
* <li>The first part depends on the root cause and the method that threw it</li>
* <li>The second part depends on the root cause and its stack trace</li>
* <li>The third part depends on all the cause hierarchy</li>
* </ul>
* <p>
* Parts may be identical if the cause is the root cause or the root cause has just one single item in its stack trace.
*
* @param throwable The exception
* @return A three-part error code
*/
public static ErrorCode of(Throwable throwable) {
var causalChain = Throwables.getCausalChain(throwable);
if (causalChain.size() > 1) {
var rootCause = causalChain.get(causalChain.size() - 1);
var parentOfRootCause = causalChain.get(causalChain.size() - 2);
var rootSpecificFrames = nonOverlappingFrames(parentOfRootCause.getStackTrace(), rootCause.getStackTrace());
return new ErrorCode(throwable, rootCause, rootSpecificFrames);
} else {
return new ErrorCode(throwable, throwable, ALL_FRAMES);
}
}
private String format(int value) {
// Cut off highest 12 bits (only leave 20 least significant bits) and XOR rest with cutoff
value = (value & 0xfffff) ^ (value >>> 20);
return Strings.padStart(Integer.toString(value, 32).toUpperCase(Locale.ROOT), 4, '0');
}
private int traceCode(Throwable e, int frameCount) {
int result = SEED;
if (e.getCause() != null) {
result = traceCode(e.getCause(), frameCount);
}
result = result * A_PRIME + e.getClass().getName().hashCode();
var stack = e.getStackTrace();
for (int i = 0; i < Math.min(stack.length, frameCount); i++) {
result = result * A_PRIME + stack[i].getClassName().hashCode();
result = result * A_PRIME + stack[i].getMethodName().hashCode();
}
return result;
}
private static int nonOverlappingFrames(StackTraceElement[] frames, StackTraceElement[] enclosingFrames) {
// Compute the number of elements in `frames` not contained in `enclosingFrames` by iterating backwards
// Result should usually be equal to the difference in size of both traces
var i = reverseStream(enclosingFrames).iterator();
return (int) reverseStream(frames).dropWhile(f -> i.hasNext() && i.next().equals(f)).count();
}
private static <T> Stream<T> reverseStream(T[] array) {
return IntStream.rangeClosed(1, array.length).mapToObj(i -> array[array.length - i]);
}
}
@@ -0,0 +1,66 @@
package org.cryptomator.common;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
@Singleton
public class PluginClassLoader extends URLClassLoader {
private static final Logger LOG = LoggerFactory.getLogger(PluginClassLoader.class);
private static final String NAME = "PluginClassLoader";
private static final String JAR_SUFFIX = ".jar";
@Inject
public PluginClassLoader(Environment env) {
super(NAME, env.getPluginDir().map(PluginClassLoader::findJars).orElse(new URL[0]), PluginClassLoader.class.getClassLoader());
}
private static URL[] findJars(Path path) {
if (!Files.isDirectory(path)) {
return new URL[0];
} else {
try {
var visitor = new JarVisitor();
Files.walkFileTree(path, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, visitor);
return visitor.urls.toArray(URL[]::new);
} catch (IOException e) {
LOG.warn("Failed to scan plugin dir " + path, e);
return new URL[0];
}
}
}
private static final class JarVisitor extends SimpleFileVisitor<Path> {
private final List<URL> urls = new ArrayList<>();
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (attrs.isRegularFile() && file.getFileName().toString().toLowerCase().endsWith(JAR_SUFFIX)) {
try {
urls.add(file.toUri().toURL());
} catch (MalformedURLException e) {
LOG.warn("Failed to create URL for jar file {}", file);
}
}
return FileVisitResult.CONTINUE;
}
}
}
@@ -38,6 +38,11 @@ public class KeychainManager implements KeychainAccessProvider {
return result; return result;
} }
@Override
public String displayName() {
return getClass().getName();
}
@Override @Override
public void storePassphrase(String key, CharSequence passphrase) throws KeychainAccessException { public void storePassphrase(String key, CharSequence passphrase) throws KeychainAccessException {
getKeychainOrFail().storePassphrase(key, passphrase); getKeychainOrFail().storePassphrase(key, passphrase);
@@ -2,6 +2,7 @@ package org.cryptomator.common.keychain;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import org.cryptomator.common.PluginClassLoader;
import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.Settings;
import org.cryptomator.integrations.keychain.KeychainAccessProvider; import org.cryptomator.integrations.keychain.KeychainAccessProvider;
@@ -17,8 +18,8 @@ public class KeychainModule {
@Provides @Provides
@Singleton @Singleton
static Set<ServiceLoader.Provider<KeychainAccessProvider>> provideAvailableKeychainAccessProviderFactories() { static Set<ServiceLoader.Provider<KeychainAccessProvider>> provideAvailableKeychainAccessProviderFactories(PluginClassLoader classLoader) {
return ServiceLoader.load(KeychainAccessProvider.class).stream().collect(Collectors.toUnmodifiableSet()); return ServiceLoader.load(KeychainAccessProvider.class, classLoader).stream().collect(Collectors.toUnmodifiableSet());
} }
@Provides @Provides
@@ -24,6 +24,6 @@ class AvailableDriveLetterChooser implements MountPointChooser {
@Override @Override
public Optional<Path> chooseMountPoint(Volume caller) { public Optional<Path> chooseMountPoint(Volume caller) {
return this.windowsDriveLetters.getAvailableDriveLetterPath(); return this.windowsDriveLetters.getDesiredAvailableDriveLetterPath();
} }
} }
@@ -43,6 +43,8 @@ public class Settings {
public static final NodeOrientation DEFAULT_USER_INTERFACE_ORIENTATION = NodeOrientation.LEFT_TO_RIGHT; public static final NodeOrientation DEFAULT_USER_INTERFACE_ORIENTATION = NodeOrientation.LEFT_TO_RIGHT;
public static final String DEFAULT_LICENSE_KEY = ""; public static final String DEFAULT_LICENSE_KEY = "";
public static final boolean DEFAULT_SHOW_MINIMIZE_BUTTON = false; public static final boolean DEFAULT_SHOW_MINIMIZE_BUTTON = false;
public static final String DEFAULT_DISPLAY_CONFIGURATION = "";
private final ObservableList<VaultSettings> directories = FXCollections.observableArrayList(VaultSettings::observables); private final ObservableList<VaultSettings> directories = FXCollections.observableArrayList(VaultSettings::observables);
private final BooleanProperty askedForUpdateCheck = new SimpleBooleanProperty(DEFAULT_ASKED_FOR_UPDATE_CHECK); private final BooleanProperty askedForUpdateCheck = new SimpleBooleanProperty(DEFAULT_ASKED_FOR_UPDATE_CHECK);
@@ -59,6 +61,12 @@ public class Settings {
private final StringProperty licenseKey = new SimpleStringProperty(DEFAULT_LICENSE_KEY); private final StringProperty licenseKey = new SimpleStringProperty(DEFAULT_LICENSE_KEY);
private final BooleanProperty showMinimizeButton = new SimpleBooleanProperty(DEFAULT_SHOW_MINIMIZE_BUTTON); private final BooleanProperty showMinimizeButton = new SimpleBooleanProperty(DEFAULT_SHOW_MINIMIZE_BUTTON);
private final BooleanProperty showTrayIcon; private final BooleanProperty showTrayIcon;
private final IntegerProperty windowXPosition = new SimpleIntegerProperty();
private final IntegerProperty windowYPosition = new SimpleIntegerProperty();
private final IntegerProperty windowWidth = new SimpleIntegerProperty();
private final IntegerProperty windowHeight = new SimpleIntegerProperty();
private final ObjectProperty<String> displayConfiguration = new SimpleObjectProperty<>(DEFAULT_DISPLAY_CONFIGURATION);
private Consumer<Settings> saveCmd; private Consumer<Settings> saveCmd;
@@ -83,6 +91,11 @@ public class Settings {
licenseKey.addListener(this::somethingChanged); licenseKey.addListener(this::somethingChanged);
showMinimizeButton.addListener(this::somethingChanged); showMinimizeButton.addListener(this::somethingChanged);
showTrayIcon.addListener(this::somethingChanged); showTrayIcon.addListener(this::somethingChanged);
windowXPosition.addListener(this::somethingChanged);
windowYPosition.addListener(this::somethingChanged);
windowWidth.addListener(this::somethingChanged);
windowHeight.addListener(this::somethingChanged);
displayConfiguration.addListener(this::somethingChanged);
} }
void setSaveCmd(Consumer<Settings> saveCmd) { void setSaveCmd(Consumer<Settings> saveCmd) {
@@ -141,7 +154,7 @@ public class Settings {
return theme; return theme;
} }
public ObjectProperty<String> keychainProvider() { return keychainProvider; } public ObjectProperty<String> keychainProvider() {return keychainProvider;}
public ObjectProperty<NodeOrientation> userInterfaceOrientation() { public ObjectProperty<NodeOrientation> userInterfaceOrientation() {
return userInterfaceOrientation; return userInterfaceOrientation;
@@ -158,4 +171,24 @@ public class Settings {
public BooleanProperty showTrayIcon() { public BooleanProperty showTrayIcon() {
return showTrayIcon; return showTrayIcon;
} }
public IntegerProperty windowXPositionProperty() {
return windowXPosition;
}
public IntegerProperty windowYPositionProperty() {
return windowYPosition;
}
public IntegerProperty windowWidthProperty() {
return windowWidth;
}
public IntegerProperty windowHeightProperty() {
return windowHeight;
}
public ObjectProperty<String> displayConfigurationProperty() {
return displayConfiguration;
}
} }
@@ -52,6 +52,12 @@ public class SettingsJsonAdapter extends TypeAdapter<Settings> {
out.name("licenseKey").value(value.licenseKey().get()); out.name("licenseKey").value(value.licenseKey().get());
out.name("showMinimizeButton").value(value.showMinimizeButton().get()); out.name("showMinimizeButton").value(value.showMinimizeButton().get());
out.name("showTrayIcon").value(value.showTrayIcon().get()); out.name("showTrayIcon").value(value.showTrayIcon().get());
out.name("windowXPosition").value((value.windowXPositionProperty().get()));
out.name("windowYPosition").value((value.windowYPositionProperty().get()));
out.name("windowWidth").value((value.windowWidthProperty().get()));
out.name("windowHeight").value((value.windowHeightProperty().get()));
out.name("displayConfiguration").value((value.displayConfigurationProperty().get()));
out.endObject(); out.endObject();
} }
@@ -86,6 +92,12 @@ public class SettingsJsonAdapter extends TypeAdapter<Settings> {
case "licenseKey" -> settings.licenseKey().set(in.nextString()); case "licenseKey" -> settings.licenseKey().set(in.nextString());
case "showMinimizeButton" -> settings.showMinimizeButton().set(in.nextBoolean()); case "showMinimizeButton" -> settings.showMinimizeButton().set(in.nextBoolean());
case "showTrayIcon" -> settings.showTrayIcon().set(in.nextBoolean()); case "showTrayIcon" -> settings.showTrayIcon().set(in.nextBoolean());
case "windowXPosition" -> settings.windowXPositionProperty().set(in.nextInt());
case "windowYPosition" -> settings.windowYPositionProperty().set(in.nextInt());
case "windowWidth" -> settings.windowWidthProperty().set(in.nextInt());
case "windowHeight" -> settings.windowHeightProperty().set(in.nextInt());
case "displayConfiguration" -> settings.displayConfigurationProperty().set(in.nextString());
default -> { default -> {
LOG.warn("Unsupported vault setting found in JSON: " + name); LOG.warn("Unsupported vault setting found in JSON: " + name);
in.skipValue(); in.skipValue();
@@ -17,9 +17,6 @@ import org.cryptomator.cryptofs.CryptoFileSystem;
import org.cryptomator.cryptofs.CryptoFileSystemProperties; import org.cryptomator.cryptofs.CryptoFileSystemProperties;
import org.cryptomator.cryptofs.CryptoFileSystemProperties.FileSystemFlags; import org.cryptomator.cryptofs.CryptoFileSystemProperties.FileSystemFlags;
import org.cryptomator.cryptofs.CryptoFileSystemProvider; import org.cryptomator.cryptofs.CryptoFileSystemProvider;
import org.cryptomator.cryptofs.VaultConfig;
import org.cryptomator.cryptofs.VaultConfig.UnverifiedVaultConfig;
import org.cryptomator.cryptofs.VaultConfigLoadException;
import org.cryptomator.cryptofs.common.FileSystemCapabilityChecker; import org.cryptomator.cryptofs.common.FileSystemCapabilityChecker;
import org.cryptomator.cryptolib.api.CryptoException; import org.cryptomator.cryptolib.api.CryptoException;
import org.cryptomator.cryptolib.api.MasterkeyLoader; import org.cryptomator.cryptolib.api.MasterkeyLoader;
@@ -38,8 +35,6 @@ import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty; import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleBooleanProperty;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.EnumSet; import java.util.EnumSet;
@@ -62,6 +57,7 @@ public class Vault {
private final AtomicReference<CryptoFileSystem> cryptoFileSystem; private final AtomicReference<CryptoFileSystem> cryptoFileSystem;
private final VaultState state; private final VaultState state;
private final ObjectProperty<Exception> lastKnownException; private final ObjectProperty<Exception> lastKnownException;
private final VaultConfigCache configCache;
private final VaultStats stats; private final VaultStats stats;
private final StringBinding displayName; private final StringBinding displayName;
private final StringBinding displayablePath; private final StringBinding displayablePath;
@@ -78,8 +74,9 @@ public class Vault {
private volatile Volume volume; private volatile Volume volume;
@Inject @Inject
Vault(VaultSettings vaultSettings, Provider<Volume> volumeProvider, @DefaultMountFlags StringBinding defaultMountFlags, AtomicReference<CryptoFileSystem> cryptoFileSystem, VaultState state, @Named("lastKnownException") ObjectProperty<Exception> lastKnownException, VaultStats stats) { Vault(VaultSettings vaultSettings, VaultConfigCache configCache, Provider<Volume> volumeProvider, @DefaultMountFlags StringBinding defaultMountFlags, AtomicReference<CryptoFileSystem> cryptoFileSystem, VaultState state, @Named("lastKnownException") ObjectProperty<Exception> lastKnownException, VaultStats stats) {
this.vaultSettings = vaultSettings; this.vaultSettings = vaultSettings;
this.configCache = configCache;
this.volumeProvider = volumeProvider; this.volumeProvider = volumeProvider;
this.defaultMountFlags = defaultMountFlags; this.defaultMountFlags = defaultMountFlags;
this.cryptoFileSystem = cryptoFileSystem; this.cryptoFileSystem = cryptoFileSystem;
@@ -107,10 +104,10 @@ public class Vault {
Set<FileSystemFlags> flags = EnumSet.noneOf(FileSystemFlags.class); Set<FileSystemFlags> flags = EnumSet.noneOf(FileSystemFlags.class);
if (vaultSettings.usesReadOnlyMode().get()) { if (vaultSettings.usesReadOnlyMode().get()) {
flags.add(FileSystemFlags.READONLY); flags.add(FileSystemFlags.READONLY);
} else if(vaultSettings.maxCleartextFilenameLength().get() == -1) { } else if (vaultSettings.maxCleartextFilenameLength().get() == -1) {
LOG.debug("Determining cleartext filename length limitations..."); LOG.debug("Determining cleartext filename length limitations...");
var checker = new FileSystemCapabilityChecker(); var checker = new FileSystemCapabilityChecker();
int shorteningThreshold = getUnverifiedVaultConfig().allegedShorteningThreshold(); int shorteningThreshold = configCache.get().allegedShorteningThreshold();
int ciphertextLimit = checker.determineSupportedCiphertextFileNameLength(getPath()); int ciphertextLimit = checker.determineSupportedCiphertextFileNameLength(getPath());
if (ciphertextLimit < shorteningThreshold) { if (ciphertextLimit < shorteningThreshold) {
int cleartextLimit = checker.determineSupportedCleartextFileNameLength(getPath()); int cleartextLimit = checker.determineSupportedCleartextFileNameLength(getPath());
@@ -328,19 +325,6 @@ public class Vault {
return stats; return stats;
} }
/**
* Attempts to read the vault config file and parse it without verifying its integrity.
*
* @return an unverified vault config
* @throws VaultConfigLoadException if the read file cannot be properly parsed
* @throws IOException if reading the file fails
*
*/
public UnverifiedVaultConfig getUnverifiedVaultConfig() throws IOException {
Path configPath = getPath().resolve(org.cryptomator.common.Constants.VAULTCONFIG_FILENAME);
String token = Files.readString(configPath, StandardCharsets.US_ASCII);
return VaultConfig.decode(token);
}
public Observable[] observables() { public Observable[] observables() {
return new Observable[]{state}; return new Observable[]{state};
@@ -375,6 +359,10 @@ public class Vault {
} }
} }
public VaultConfigCache getVaultConfigCache() {
return configCache;
}
public void setCustomMountFlags(String mountFlags) { public void setCustomMountFlags(String mountFlags) {
vaultSettings.mountFlags().set(mountFlags); vaultSettings.mountFlags().set(mountFlags);
} }
@@ -25,6 +25,9 @@ public interface VaultComponent {
@BindsInstance @BindsInstance
Builder vaultSettings(VaultSettings vaultSettings); Builder vaultSettings(VaultSettings vaultSettings);
@BindsInstance
Builder vaultConfigCache(VaultConfigCache configCache);
@BindsInstance @BindsInstance
Builder initialVaultState(VaultState.Value vaultState); Builder initialVaultState(VaultState.Value vaultState);
@@ -0,0 +1,65 @@
package org.cryptomator.common.vaults;
import org.cryptomator.common.Constants;
import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.cryptofs.VaultConfig;
import org.cryptomator.cryptofs.VaultConfigLoadException;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.concurrent.atomic.AtomicReference;
/**
* Wrapper for lazy loading and on-demand reloading of the vault configuration.
*/
public class VaultConfigCache {
private final VaultSettings settings;
private final AtomicReference<VaultConfig.UnverifiedVaultConfig> config;
VaultConfigCache(VaultSettings settings) {
this.settings = settings;
this.config = new AtomicReference<>(null);
}
void reloadConfig() throws IOException {
try {
config.set(readConfigFromStorage(this.settings.path().get()));
} catch (IOException e) {
config.set(null);
throw e;
}
}
public VaultConfig.UnverifiedVaultConfig get() throws IOException {
if (config.get() == null) {
reloadConfig();
}
return config.get();
}
public VaultConfig.UnverifiedVaultConfig getUnchecked() {
try {
return get();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
/**
* Attempts to read the vault config file and parse it without verifying its integrity.
*
* @throws VaultConfigLoadException if the read file cannot be properly parsed
* @throws IOException if reading the file fails
*/
static VaultConfig.UnverifiedVaultConfig readConfigFromStorage(Path vaultPath) throws IOException {
Path configPath = vaultPath.resolve(Constants.VAULTCONFIG_FILENAME);
String token = Files.readString(configPath, StandardCharsets.US_ASCII);
return VaultConfig.decode(token);
}
}
@@ -18,7 +18,6 @@ import org.slf4j.LoggerFactory;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
@@ -31,6 +30,7 @@ import java.util.ResourceBundle;
import static org.cryptomator.common.Constants.MASTERKEY_FILENAME; import static org.cryptomator.common.Constants.MASTERKEY_FILENAME;
import static org.cryptomator.common.Constants.VAULTCONFIG_FILENAME; import static org.cryptomator.common.Constants.VAULTCONFIG_FILENAME;
import static org.cryptomator.common.vaults.VaultState.Value.ERROR; import static org.cryptomator.common.vaults.VaultState.Value.ERROR;
import static org.cryptomator.common.vaults.VaultState.Value.LOCKED;
@Singleton @Singleton
public class VaultListManager { public class VaultListManager {
@@ -96,6 +96,11 @@ public class VaultListManager {
VaultComponent.Builder compBuilder = vaultComponentBuilder.vaultSettings(vaultSettings); VaultComponent.Builder compBuilder = vaultComponentBuilder.vaultSettings(vaultSettings);
try { try {
VaultState.Value vaultState = determineVaultState(vaultSettings.path().get()); VaultState.Value vaultState = determineVaultState(vaultSettings.path().get());
VaultConfigCache wrapper = new VaultConfigCache(vaultSettings);
compBuilder.vaultConfigCache(wrapper); //first set the wrapper in the builder, THEN try to load config
if (vaultState == LOCKED) { //for legacy reasons: pre v8 vault do not have a config, but they are in the NEEDS_MIGRATION state
wrapper.reloadConfig();
}
compBuilder.initialVaultState(vaultState); compBuilder.initialVaultState(vaultState);
} catch (IOException e) { } catch (IOException e) {
LOG.warn("Failed to determine vault state for " + vaultSettings.path().get(), e); LOG.warn("Failed to determine vault state for " + vaultSettings.path().get(), e);
@@ -112,6 +117,9 @@ public class VaultListManager {
case LOCKED, NEEDS_MIGRATION, MISSING -> { case LOCKED, NEEDS_MIGRATION, MISSING -> {
try { try {
var determinedState = determineVaultState(vault.getPath()); var determinedState = determineVaultState(vault.getPath());
if (determinedState == LOCKED) {
vault.getVaultConfigCache().reloadConfig();
}
state.set(determinedState); state.set(determinedState);
yield determinedState; yield determinedState;
} catch (IOException e) { } catch (IOException e) {
@@ -132,7 +140,9 @@ public class VaultListManager {
return switch (CryptoFileSystemProvider.checkDirStructureForVault(pathToVault, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME)) { return switch (CryptoFileSystemProvider.checkDirStructureForVault(pathToVault, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME)) {
case VAULT -> VaultState.Value.LOCKED; case VAULT -> VaultState.Value.LOCKED;
case UNRELATED -> VaultState.Value.MISSING; case UNRELATED -> VaultState.Value.MISSING;
case MAYBE_LEGACY -> Migrators.get().needsMigration(pathToVault, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME) ? VaultState.Value.NEEDS_MIGRATION : VaultState.Value.MISSING; case MAYBE_LEGACY -> Migrators.get().needsMigration(pathToVault, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME) ? //
VaultState.Value.NEEDS_MIGRATION //
: VaultState.Value.MISSING;
}; };
} }
@@ -70,7 +70,7 @@ public class WebDavVolume implements Volume {
//on windows, prevent an automatic drive letter selection in the upstream library. Either we choose already a specific one or there is no free. //on windows, prevent an automatic drive letter selection in the upstream library. Either we choose already a specific one or there is no free.
Supplier<String> driveLetterSupplier; Supplier<String> driveLetterSupplier;
if (System.getProperty("os.name").toLowerCase().contains("windows") && vaultSettings.winDriveLetter().isEmpty().get()) { if (System.getProperty("os.name").toLowerCase().contains("windows") && vaultSettings.winDriveLetter().isEmpty().get()) {
driveLetterSupplier = () -> windowsDriveLetters.getAvailableDriveLetter().orElse(null); driveLetterSupplier = () -> windowsDriveLetters.getDesiredAvailableDriveLetter().orElse(null);
} else { } else {
driveLetterSupplier = () -> vaultSettings.winDriveLetter().get(); driveLetterSupplier = () -> vaultSettings.winDriveLetter().get();
} }
@@ -22,11 +22,11 @@ import java.util.stream.StreamSupport;
@Singleton @Singleton
public final class WindowsDriveLetters { public final class WindowsDriveLetters {
private static final Set<String> C_TO_Z; private static final Set<String> A_TO_Z;
static { static {
try (IntStream stream = IntStream.rangeClosed('C', 'Z')) { try (IntStream stream = IntStream.rangeClosed('A', 'Z')) {
C_TO_Z = stream.mapToObj(i -> String.valueOf((char) i)).collect(ImmutableSet.toImmutableSet()); A_TO_Z = stream.mapToObj(i -> String.valueOf((char) i)).collect(ImmutableSet.toImmutableSet());
} }
} }
@@ -35,7 +35,7 @@ public final class WindowsDriveLetters {
} }
public Set<String> getAllDriveLetters() { public Set<String> getAllDriveLetters() {
return C_TO_Z; return A_TO_Z;
} }
public Set<String> getOccupiedDriveLetters() { public Set<String> getOccupiedDriveLetters() {
@@ -59,6 +59,26 @@ public final class WindowsDriveLetters {
return getAvailableDriveLetter().map(this::toPath); return getAvailableDriveLetter().map(this::toPath);
} }
/**
* Skips A and B and only returns them if all other are occupied.
*
* @return an Optional containing either the letter of a free drive letter or empty, if none is available
*/
public Optional<String> getDesiredAvailableDriveLetter() {
var availableDriveLetters = getAvailableDriveLetters();
var optString = availableDriveLetters.stream().filter(s -> !(s.equals("A") || s.equals("B"))).findFirst();
return optString.or(() -> availableDriveLetters.stream().findFirst());
}
/**
* Skips A and B and only returns them if all other are occupied.
*
* @return an Optional containing either the path to a free drive letter or empty, if none is available
*/
public Optional<Path> getDesiredAvailableDriveLetterPath() {
return getDesiredAvailableDriveLetter().map(this::toPath);
}
public Path toPath(String driveLetter) { public Path toPath(String driveLetter) {
return Path.of(driveLetter + ":\\"); return Path.of(driveLetter + ":\\");
} }
@@ -27,6 +27,7 @@ class Server implements IpcCommunicator {
} }
public static Server create(Path socketPath) throws IOException { public static Server create(Path socketPath) throws IOException {
Files.createDirectories(socketPath.getParent());
var address = UnixDomainSocketAddress.of(socketPath); var address = UnixDomainSocketAddress.of(socketPath);
var serverSocketChannel = ServerSocketChannel.open(StandardProtocolFamily.UNIX); var serverSocketChannel = ServerSocketChannel.open(StandardProtocolFamily.UNIX);
serverSocketChannel.bind(address); serverSocketChannel.bind(address);
@@ -38,18 +38,16 @@ public class Cryptomator {
private final DebugMode debugMode; private final DebugMode debugMode;
private final Environment env; private final Environment env;
private final Lazy<IpcMessageHandler> ipcMessageHandler; private final Lazy<IpcMessageHandler> ipcMessageHandler;
private final Optional<String> applicationVersion;
private final CountDownLatch shutdownLatch; private final CountDownLatch shutdownLatch;
private final ShutdownHook shutdownHook; private final ShutdownHook shutdownHook;
private final Lazy<UiLauncher> uiLauncher; private final Lazy<UiLauncher> uiLauncher;
@Inject @Inject
Cryptomator(LoggerConfiguration logConfig, DebugMode debugMode, Environment env, Lazy<IpcMessageHandler> ipcMessageHandler, @Named("applicationVersion") Optional<String> applicationVersion, @Named("shutdownLatch") CountDownLatch shutdownLatch, ShutdownHook shutdownHook, Lazy<UiLauncher> uiLauncher) { Cryptomator(LoggerConfiguration logConfig, DebugMode debugMode, Environment env, Lazy<IpcMessageHandler> ipcMessageHandler, @Named("shutdownLatch") CountDownLatch shutdownLatch, ShutdownHook shutdownHook, Lazy<UiLauncher> uiLauncher) {
this.logConfig = logConfig; this.logConfig = logConfig;
this.debugMode = debugMode; this.debugMode = debugMode;
this.env = env; this.env = env;
this.ipcMessageHandler = ipcMessageHandler; this.ipcMessageHandler = ipcMessageHandler;
this.applicationVersion = applicationVersion;
this.shutdownLatch = shutdownLatch; this.shutdownLatch = shutdownLatch;
this.shutdownHook = shutdownHook; this.shutdownHook = shutdownHook;
this.uiLauncher = uiLauncher; this.uiLauncher = uiLauncher;
@@ -69,7 +67,7 @@ public class Cryptomator {
*/ */
private int run(String[] args) { private int run(String[] args) {
logConfig.init(); logConfig.init();
LOG.info("Starting Cryptomator {} on {} {} ({})", applicationVersion.orElse("SNAPSHOT"), SystemUtils.OS_NAME, SystemUtils.OS_VERSION, SystemUtils.OS_ARCH); LOG.info("Starting Cryptomator {} on {} {} ({})", env.getAppVersion().orElse("SNAPSHOT"), SystemUtils.OS_NAME, SystemUtils.OS_VERSION, SystemUtils.OS_ARCH);
debugMode.initialize(); debugMode.initialize();
/* /*
@@ -18,11 +18,4 @@ class CryptomatorModule {
return new CountDownLatch(1); return new CountDownLatch(1);
} }
@Provides
@Singleton
@Named("applicationVersion")
static Optional<String> provideApplicationVersion() {
return Optional.ofNullable(Cryptomator.class.getPackage().getImplementationVersion());
}
} }
@@ -29,16 +29,20 @@ import javafx.scene.control.ToggleGroup;
import javafx.stage.DirectoryChooser; import javafx.stage.DirectoryChooser;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.UUID;
@AddVaultWizardScoped @AddVaultWizardScoped
public class CreateNewVaultLocationController implements FxController { public class CreateNewVaultLocationController implements FxController {
private static final Logger LOG = LoggerFactory.getLogger(CreateNewVaultLocationController.class); 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 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 Stage window;
private final Lazy<Scene> chooseNameScene; private final Lazy<Scene> chooseNameScene;
@@ -92,7 +96,7 @@ public class CreateNewVaultLocationController implements FxController {
statusText.set(resourceBundle.getString("addvaultwizard.new.locationDoesNotExist")); statusText.set(resourceBundle.getString("addvaultwizard.new.locationDoesNotExist"));
statusGraphic.set(badLocation); statusGraphic.set(badLocation);
return false; return false;
} else if (!Files.isWritable(p.getParent())) { } else if (!isActuallyWritable(p.getParent())) {
statusText.set(resourceBundle.getString("addvaultwizard.new.locationIsNotWritable")); statusText.set(resourceBundle.getString("addvaultwizard.new.locationIsNotWritable"));
statusGraphic.set(badLocation); statusGraphic.set(badLocation);
return false; 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 @FXML
public void initialize() { public void initialize() {
predefinedLocationToggler.selectedToggleProperty().addListener(this::togglePredefinedLocation); predefinedLocationToggler.selectedToggleProperty().addListener(this::togglePredefinedLocation);
@@ -182,7 +182,7 @@ public class CreateNewVaultPasswordController implements FxController {
// 2. initialize vault: // 2. initialize vault:
try { try {
MasterkeyLoader loader = ignored -> masterkey.clone(); MasterkeyLoader loader = ignored -> masterkey.copy();
CryptoFileSystemProperties fsProps = CryptoFileSystemProperties.cryptoFileSystemProperties().withCipherCombo(CryptorProvider.Scheme.SIV_CTRMAC).withKeyLoader(loader).build(); CryptoFileSystemProperties fsProps = CryptoFileSystemProperties.cryptoFileSystemProperties().withCipherCombo(CryptorProvider.Scheme.SIV_CTRMAC).withKeyLoader(loader).build();
CryptoFileSystemProvider.initialize(path, fsProps, DEFAULT_KEY_ID); CryptoFileSystemProvider.initialize(path, fsProps, DEFAULT_KEY_ID);
@@ -14,7 +14,7 @@ public class LocationPresets {
private static final String USER_HOME = System.getProperty("user.home"); private static final String USER_HOME = System.getProperty("user.home");
private static final String[] ICLOUDDRIVE_LOCATIONS = {"~/Library/Mobile Documents/iCloud~com~setolabs~Cryptomator/Documents", "~/iCloudDrive/iCloud~com~setolabs~Cryptomator"}; private static final String[] ICLOUDDRIVE_LOCATIONS = {"~/Library/Mobile Documents/iCloud~com~setolabs~Cryptomator/Documents", "~/iCloudDrive/iCloud~com~setolabs~Cryptomator"};
private static final String[] DROPBOX_LOCATIONS = {"~/Dropbox"}; private static final String[] DROPBOX_LOCATIONS = {"~/Dropbox"};
private static final String[] GDRIVE_LOCATIONS = {"~/Google Drive"}; private static final String[] GDRIVE_LOCATIONS = {"~/Google Drive/My Drive", "~/Google Drive"};
private static final String[] ONEDRIVE_LOCATIONS = {"~/OneDrive"}; private static final String[] ONEDRIVE_LOCATIONS = {"~/OneDrive"};
private static final String[] MEGA_LOCATIONS = {"~/MEGA"}; private static final String[] MEGA_LOCATIONS = {"~/MEGA"};
private static final String[] PCLOUD_LOCATIONS = {"~/pCloudDrive"}; private static final String[] PCLOUD_LOCATIONS = {"~/pCloudDrive"};
@@ -1,22 +1,47 @@
package org.cryptomator.ui.common; package org.cryptomator.ui.common;
import org.cryptomator.common.ErrorCode;
import org.cryptomator.common.Nullable; import org.cryptomator.common.Nullable;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class ErrorController implements FxController { public class ErrorController implements FxController {
private static final String SEARCH_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/categories/errors?discussions_q=category:Errors+%s";
private static final String REPORT_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/new?category=Errors&title=Error+%s&body=%s";
private static final String SEARCH_ERRORCODE_DELIM = " OR ";
private static final String REPORT_BODY_TEMPLATE = """
<!-- Please describe what happened as accurately as possible. -->
<!-- 📋 Please also copy and paste the detail text from the error window. -->
""";
private final Application application;
private final String stackTrace; private final String stackTrace;
private final ErrorCode errorCode;
private final Scene previousScene; private final Scene previousScene;
private final Stage window; private final Stage window;
private BooleanProperty copiedDetails = new SimpleBooleanProperty();
@Inject @Inject
ErrorController(@Named("stackTrace") String stackTrace, @Nullable Scene previousScene, Stage window) { ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window) {
this.application = application;
this.stackTrace = stackTrace; this.stackTrace = stackTrace;
this.errorCode = errorCode;
this.previousScene = previousScene; this.previousScene = previousScene;
this.window = window; this.window = window;
} }
@@ -33,6 +58,31 @@ public class ErrorController implements FxController {
window.close(); window.close();
} }
@FXML
public void searchError() {
var searchTerm = URLEncoder.encode(getErrorCode().replace(ErrorCode.DELIM, SEARCH_ERRORCODE_DELIM), StandardCharsets.UTF_8);
application.getHostServices().showDocument(SEARCH_URL_FORMAT.formatted(searchTerm));
}
@FXML
public void reportError() {
var title = URLEncoder.encode(getErrorCode(), StandardCharsets.UTF_8);
var body = URLEncoder.encode(REPORT_BODY_TEMPLATE, StandardCharsets.UTF_8);
application.getHostServices().showDocument(REPORT_URL_FORMAT.formatted(title, body));
}
@FXML
public void copyDetails() {
ClipboardContent clipboardContent = new ClipboardContent();
clipboardContent.putString(getDetailText());
Clipboard.getSystemClipboard().setContent(clipboardContent);
copiedDetails.set(true);
CompletableFuture.delayedExecutor(2, TimeUnit.SECONDS, Platform::runLater).execute(() -> {
copiedDetails.set(false);
});
}
/* Getter/Setter */ /* Getter/Setter */
public boolean isPreviousScenePresent() { public boolean isPreviousScenePresent() {
@@ -42,4 +92,20 @@ public class ErrorController implements FxController {
public String getStackTrace() { public String getStackTrace() {
return stackTrace; return stackTrace;
} }
public String getErrorCode() {
return errorCode.toString();
}
public String getDetailText() {
return "```\nError Code " + getErrorCode() + "\n" + getStackTrace() + "\n```";
}
public BooleanProperty copiedDetailsProperty() {
return copiedDetails;
}
public boolean getCopiedDetails() {
return copiedDetails.get();
}
} }
@@ -4,6 +4,7 @@ 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.ErrorCode;
import javax.inject.Named; import javax.inject.Named;
import javax.inject.Provider; import javax.inject.Provider;
@@ -31,6 +32,11 @@ abstract class ErrorModule {
return baos.toString(StandardCharsets.UTF_8); return baos.toString(StandardCharsets.UTF_8);
} }
@Provides
static ErrorCode provideErrorCode(Throwable cause) {
return ErrorCode.of(cause);
}
@Binds @Binds
@IntoMap @IntoMap
@FxControllerKey(ErrorController.class) @FxControllerKey(ErrorController.class)
@@ -12,7 +12,6 @@ public enum FxmlFile {
ERROR("/fxml/error.fxml"), // ERROR("/fxml/error.fxml"), //
FORGET_PASSWORD("/fxml/forget_password.fxml"), // FORGET_PASSWORD("/fxml/forget_password.fxml"), //
HEALTH_START("/fxml/health_start.fxml"), // HEALTH_START("/fxml/health_start.fxml"), //
HEALTH_START_FAIL("/fxml/health_start_fail.fxml"), //
HEALTH_CHECK_LIST("/fxml/health_check_list.fxml"), // HEALTH_CHECK_LIST("/fxml/health_check_list.fxml"), //
LOCK_FORCED("/fxml/lock_forced.fxml"), // LOCK_FORCED("/fxml/lock_forced.fxml"), //
LOCK_FAILED("/fxml/lock_failed.fxml"), // LOCK_FAILED("/fxml/lock_failed.fxml"), //
@@ -12,6 +12,7 @@ public enum FontAwesome5Icon {
CARET_RIGHT("\uF0Da"), // CARET_RIGHT("\uF0Da"), //
CHECK("\uF00C"), // CHECK("\uF00C"), //
CLOCK("\uF017"), // CLOCK("\uF017"), //
CLIPBOARD("\uF328"), //
COG("\uF013"), // COG("\uF013"), //
COGS("\uF085"), // COGS("\uF085"), //
COPY("\uF0C5"), // COPY("\uF0C5"), //
@@ -10,6 +10,7 @@ package org.cryptomator.ui.controls;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import javafx.application.Platform;
import javafx.beans.NamedArg; import javafx.beans.NamedArg;
import javafx.beans.Observable; import javafx.beans.Observable;
import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanProperty;
@@ -27,7 +28,6 @@ import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination; import javafx.scene.input.KeyCombination;
import javafx.scene.input.KeyEvent; import javafx.scene.input.KeyEvent;
import javafx.scene.input.TransferMode; import javafx.scene.input.TransferMode;
import java.awt.Toolkit;
import java.nio.CharBuffer; import java.nio.CharBuffer;
import java.text.Normalizer; import java.text.Normalizer;
import java.text.Normalizer.Form; import java.text.Normalizer.Form;
@@ -123,8 +123,7 @@ public class SecurePasswordField extends TextField {
} }
private void updateCapsLocked() { private void updateCapsLocked() {
//TODO: fixed in JavaFX 17. AWT code needed until update (see https://bugs.openjdk.java.net/browse/JDK-8259680) capsLocked.set(Platform.isKeyLocked(KeyCode.CAPS).orElse(false));
capsLocked.set(isFocused() && Toolkit.getDefaultToolkit().getLockingKeyState(java.awt.event.KeyEvent.VK_CAPS_LOCK));
} }
private void updateContainingNonPrintableChars() { private void updateContainingNonPrintableChars() {
@@ -1,5 +1,6 @@
package org.cryptomator.ui.fxapp; package org.cryptomator.ui.fxapp;
import org.cryptomator.common.Environment;
import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.Settings;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -31,9 +32,9 @@ public class UpdateChecker {
private final ScheduledService<String> updateCheckerService; private final ScheduledService<String> updateCheckerService;
@Inject @Inject
UpdateChecker(Settings settings, @Named("applicationVersion") Optional<String> applicationVersion, @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.settings = settings; this.settings = settings;
this.applicationVersion = applicationVersion; this.applicationVersion = env.getAppVersion();
this.latestVersionProperty = latestVersionProperty; this.latestVersionProperty = latestVersionProperty;
this.semVerComparator = semVerComparator; this.semVerComparator = semVerComparator;
this.updateCheckerService = updateCheckerService; this.updateCheckerService = updateCheckerService;
@@ -3,6 +3,7 @@ package org.cryptomator.ui.fxapp;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import org.apache.commons.lang3.SystemUtils; import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.Environment;
import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.Settings;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -51,9 +52,9 @@ public abstract class UpdateCheckerModule {
@Provides @Provides
@FxApplicationScoped @FxApplicationScoped
static HttpRequest provideCheckForUpdatesRequest(@Named("applicationVersion") Optional<String> applicationVersion) { static HttpRequest provideCheckForUpdatesRequest(Environment env) {
String userAgent = String.format("Cryptomator VersionChecker/%s %s %s (%s)", // String userAgent = String.format("Cryptomator VersionChecker/%s %s %s (%s)", //
applicationVersion.orElse("SNAPSHOT"), // env.getAppVersion().orElse("SNAPSHOT"), //
SystemUtils.OS_NAME, // SystemUtils.OS_NAME, //
SystemUtils.OS_VERSION, // SystemUtils.OS_VERSION, //
SystemUtils.OS_ARCH); // SystemUtils.OS_ARCH); //
@@ -67,7 +67,7 @@ public class CheckExecutor {
@Override @Override
protected Void call() throws Exception { protected Void call() throws Exception {
try (var masterkeyClone = masterkey.clone(); // try (var masterkeyClone = masterkey.copy(); //
var cryptor = CryptorProvider.forScheme(vaultConfig.getCipherCombo()).provide(masterkeyClone, csprng)) { var cryptor = CryptorProvider.forScheme(vaultConfig.getCipherCombo()).provide(masterkeyClone, csprng)) {
c.getHealthCheck().check(vaultPath, vaultConfig, masterkeyClone, cryptor, diagnosis -> { c.getHealthCheck().check(vaultPath, vaultConfig, masterkeyClone, cryptor, diagnosis -> {
Platform.runLater(() -> c.getResults().add(Result.create(diagnosis))); Platform.runLater(() -> c.getResults().add(Result.create(diagnosis)));
@@ -16,26 +16,15 @@ import javafx.stage.Stage;
@Subcomponent(modules = {HealthCheckModule.class}) @Subcomponent(modules = {HealthCheckModule.class})
public interface HealthCheckComponent { public interface HealthCheckComponent {
LoadUnverifiedConfigResult loadConfig();
@HealthCheckWindow @HealthCheckWindow
Stage window(); Stage window();
@FxmlScene(FxmlFile.HEALTH_START) @FxmlScene(FxmlFile.HEALTH_START)
Lazy<Scene> startScene(); Lazy<Scene> startScene();
@FxmlScene(FxmlFile.HEALTH_START_FAIL)
Lazy<Scene> failScene();
default Stage showHealthCheckWindow() { default Stage showHealthCheckWindow() {
Stage stage = window(); Stage stage = window();
// TODO reevaluate config loading, as soon as we have the new generic error screen stage.setScene(startScene().get());
var unverifiedConf = loadConfig();
if (unverifiedConf.config() != null) {
stage.setScene(startScene().get());
} else {
stage.setScene(failScene().get());
}
stage.show(); stage.show();
return stage; return stage;
} }
@@ -52,5 +41,4 @@ public interface HealthCheckComponent {
HealthCheckComponent build(); HealthCheckComponent build();
} }
record LoadUnverifiedConfigResult(VaultConfig.UnverifiedVaultConfig config, Throwable error) {}
} }
@@ -27,7 +27,6 @@ import javafx.scene.Scene;
import javafx.stage.Modality; import javafx.stage.Modality;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
@@ -37,18 +36,6 @@ import java.util.concurrent.atomic.AtomicReference;
@Module(subcomponents = {KeyLoadingComponent.class}) @Module(subcomponents = {KeyLoadingComponent.class})
abstract class HealthCheckModule { abstract class HealthCheckModule {
// TODO reevaluate config loading, as soon as we have the new generic error screen
@Provides
@HealthCheckScoped
static HealthCheckComponent.LoadUnverifiedConfigResult provideLoadConfigResult(@HealthCheckWindow Vault vault) {
try {
return new HealthCheckComponent.LoadUnverifiedConfigResult(vault.getUnverifiedVaultConfig(), null);
} catch (IOException e) {
return new HealthCheckComponent.LoadUnverifiedConfigResult(null, e);
}
}
@Provides @Provides
@HealthCheckScoped @HealthCheckScoped
static AtomicReference<Masterkey> provideMasterkeyRef() { static AtomicReference<Masterkey> provideMasterkeyRef() {
@@ -129,13 +116,6 @@ abstract class HealthCheckModule {
return fxmlLoaders.createScene(FxmlFile.HEALTH_START); return fxmlLoaders.createScene(FxmlFile.HEALTH_START);
} }
@Provides
@FxmlScene(FxmlFile.HEALTH_START_FAIL)
@HealthCheckScoped
static Scene provideHealthStartFailScene(@HealthCheckWindow FxmlLoaderFactory fxmlLoaders) {
return fxmlLoaders.createScene(FxmlFile.HEALTH_START_FAIL);
}
@Provides @Provides
@FxmlScene(FxmlFile.HEALTH_CHECK_LIST) @FxmlScene(FxmlFile.HEALTH_CHECK_LIST)
@HealthCheckScoped @HealthCheckScoped
@@ -148,11 +128,6 @@ abstract class HealthCheckModule {
@FxControllerKey(StartController.class) @FxControllerKey(StartController.class)
abstract FxController bindStartController(StartController controller); abstract FxController bindStartController(StartController controller);
@Binds
@IntoMap
@FxControllerKey(StartFailController.class)
abstract FxController bindStartFailController(StartFailController controller);
@Binds @Binds
@IntoMap @IntoMap
@FxControllerKey(CheckListController.class) @FxControllerKey(CheckListController.class)
@@ -50,7 +50,7 @@ class ResultFixApplier {
public void fix(DiagnosticResult diagnosis) { public void fix(DiagnosticResult diagnosis) {
Preconditions.checkArgument(diagnosis.getSeverity() == DiagnosticResult.Severity.WARN, "Unfixable result"); Preconditions.checkArgument(diagnosis.getSeverity() == DiagnosticResult.Severity.WARN, "Unfixable result");
try (var masterkeyClone = masterkey.clone(); // try (var masterkeyClone = masterkey.copy(); //
var cryptor = CryptorProvider.forScheme(vaultConfig.getCipherCombo()).provide(masterkeyClone, csprng)) { var cryptor = CryptorProvider.forScheme(vaultConfig.getCipherCombo()).provide(masterkeyClone, csprng)) {
diagnosis.fix(vaultPath, vaultConfig, masterkeyClone, cryptor); diagnosis.fix(vaultPath, vaultConfig, masterkeyClone, cryptor);
} catch (Exception e) { } catch (Exception e) {
@@ -1,7 +1,8 @@
package org.cryptomator.ui.health; package org.cryptomator.ui.health;
import com.google.common.base.Preconditions;
import dagger.Lazy; import dagger.Lazy;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultConfigCache;
import org.cryptomator.cryptofs.VaultConfig; import org.cryptomator.cryptofs.VaultConfig;
import org.cryptomator.cryptofs.VaultConfigLoadException; import org.cryptomator.cryptofs.VaultConfigLoadException;
import org.cryptomator.cryptofs.VaultKeyInvalidException; import org.cryptomator.cryptofs.VaultKeyInvalidException;
@@ -18,8 +19,6 @@ import org.slf4j.LoggerFactory;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.stage.Stage; import javafx.stage.Stage;
@@ -35,7 +34,7 @@ public class StartController implements FxController {
private final Stage window; private final Stage window;
private final Stage unlockWindow; private final Stage unlockWindow;
private final ObjectProperty<VaultConfig.UnverifiedVaultConfig> unverifiedVaultConfig; private final VaultConfigCache vaultConfig;
private final KeyLoadingStrategy keyLoadingStrategy; private final KeyLoadingStrategy keyLoadingStrategy;
private final ExecutorService executor; private final ExecutorService executor;
private final AtomicReference<Masterkey> masterkeyRef; private final AtomicReference<Masterkey> masterkeyRef;
@@ -44,11 +43,10 @@ public class StartController implements FxController {
private final Lazy<ErrorComponent.Builder> errorComponent; private final Lazy<ErrorComponent.Builder> errorComponent;
@Inject @Inject
public StartController(@HealthCheckWindow Stage window, HealthCheckComponent.LoadUnverifiedConfigResult configLoadResult, @HealthCheckWindow KeyLoadingStrategy keyLoadingStrategy, ExecutorService executor, AtomicReference<Masterkey> masterkeyRef, AtomicReference<VaultConfig> vaultConfigRef, @FxmlScene(FxmlFile.HEALTH_CHECK_LIST) Lazy<Scene> checkScene, Lazy<ErrorComponent.Builder> errorComponent, @Named("unlockWindow") Stage unlockWindow) { public StartController(@HealthCheckWindow Stage window, @HealthCheckWindow Vault vault, @HealthCheckWindow KeyLoadingStrategy keyLoadingStrategy, ExecutorService executor, AtomicReference<Masterkey> masterkeyRef, AtomicReference<VaultConfig> vaultConfigRef, @FxmlScene(FxmlFile.HEALTH_CHECK_LIST) Lazy<Scene> checkScene, Lazy<ErrorComponent.Builder> errorComponent, @Named("unlockWindow") Stage unlockWindow) {
Preconditions.checkNotNull(configLoadResult.config());
this.window = window; this.window = window;
this.unlockWindow = unlockWindow; this.unlockWindow = unlockWindow;
this.unverifiedVaultConfig = new SimpleObjectProperty<>(configLoadResult.config()); this.vaultConfig = vault.getVaultConfigCache();
this.keyLoadingStrategy = keyLoadingStrategy; this.keyLoadingStrategy = keyLoadingStrategy;
this.executor = executor; this.executor = executor;
this.masterkeyRef = masterkeyRef; this.masterkeyRef = masterkeyRef;
@@ -71,7 +69,6 @@ public class StartController implements FxController {
private void loadKey() { private void loadKey() {
assert !Platform.isFxApplicationThread(); assert !Platform.isFxApplicationThread();
assert unverifiedVaultConfig.get() != null;
try { try {
keyLoadingStrategy.use(this::verifyVaultConfig); keyLoadingStrategy.use(this::verifyVaultConfig);
} catch (VaultConfigLoadException | UnlockCancelledException e) { } catch (VaultConfigLoadException | UnlockCancelledException e) {
@@ -80,11 +77,11 @@ public class StartController implements FxController {
} }
private void verifyVaultConfig(KeyLoadingStrategy keyLoadingStrategy) throws VaultConfigLoadException { private void verifyVaultConfig(KeyLoadingStrategy keyLoadingStrategy) throws VaultConfigLoadException {
var unverifiedCfg = unverifiedVaultConfig.get(); var unverifiedCfg = vaultConfig.getUnchecked();
try (var masterkey = keyLoadingStrategy.loadKey(unverifiedCfg.getKeyId())) { try (var masterkey = keyLoadingStrategy.loadKey(unverifiedCfg.getKeyId())) {
var verifiedCfg = unverifiedCfg.verify(masterkey.getEncoded(), unverifiedCfg.allegedVaultVersion()); var verifiedCfg = unverifiedCfg.verify(masterkey.getEncoded(), unverifiedCfg.allegedVaultVersion());
vaultConfigRef.set(verifiedCfg); vaultConfigRef.set(verifiedCfg);
var old = masterkeyRef.getAndSet(masterkey.clone()); var old = masterkeyRef.getAndSet(masterkey.copy());
if (old != null) { if (old != null) {
old.destroy(); old.destroy();
} }
@@ -1,79 +0,0 @@
package org.cryptomator.ui.health;
import com.google.common.base.Preconditions;
import org.cryptomator.cryptofs.VaultConfigLoadException;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.controls.FontAwesome5Icon;
import javax.inject.Inject;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.scene.control.TitledPane;
import javafx.stage.Stage;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
// TODO reevaluate config loading, as soon as we have the new generic error screen
@HealthCheckScoped
public class StartFailController implements FxController {
private final Stage window;
private final ObjectProperty<Throwable> loadError;
private final ObjectProperty<FontAwesome5Icon> moreInfoIcon;
/* FXML */
public TitledPane moreInfoPane;
@Inject
public StartFailController(@HealthCheckWindow Stage window, HealthCheckComponent.LoadUnverifiedConfigResult configLoadResult) {
Preconditions.checkNotNull(configLoadResult.error());
this.window = window;
this.loadError = new SimpleObjectProperty<>(configLoadResult.error());
this.moreInfoIcon = new SimpleObjectProperty<>(FontAwesome5Icon.CARET_RIGHT);
}
public void initialize() {
moreInfoPane.expandedProperty().addListener(this::setMoreInfoIcon);
}
private void setMoreInfoIcon(ObservableValue<? extends Boolean> observable, boolean wasExpanded, boolean willExpand) {
moreInfoIcon.set(willExpand ? FontAwesome5Icon.CARET_DOWN : FontAwesome5Icon.CARET_RIGHT);
}
@FXML
public void close() {
window.close();
}
/* Getter & Setter */
public ObjectProperty<FontAwesome5Icon> moreInfoIconProperty() {
return moreInfoIcon;
}
public FontAwesome5Icon getMoreInfoIcon() {
return moreInfoIcon.getValue();
}
public String getStackTrace() {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
loadError.get().printStackTrace(new PrintStream(baos));
return baos.toString(StandardCharsets.UTF_8);
}
public String getLocalizedErrorMessage() {
return loadError.get().getLocalizedMessage();
}
public boolean isParseException() {
return loadError.get() instanceof VaultConfigLoadException;
}
public boolean isIoException() {
return !isParseException();
}
}
@@ -3,7 +3,6 @@ package org.cryptomator.ui.keyloading;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.Vault;
import org.cryptomator.cryptofs.VaultConfig.UnverifiedVaultConfig;
import org.cryptomator.ui.common.DefaultSceneFactory; import org.cryptomator.ui.common.DefaultSceneFactory;
import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.common.FxmlLoaderFactory; import org.cryptomator.ui.common.FxmlLoaderFactory;
@@ -11,9 +10,7 @@ import org.cryptomator.ui.keyloading.masterkeyfile.MasterkeyFileLoadingModule;
import javax.inject.Provider; import javax.inject.Provider;
import java.io.IOException; import java.io.IOException;
import java.net.URI;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.ResourceBundle; import java.util.ResourceBundle;
@Module(includes = {MasterkeyFileLoadingModule.class}) @Module(includes = {MasterkeyFileLoadingModule.class})
@@ -31,7 +28,7 @@ abstract class KeyLoadingModule {
@KeyLoadingScoped @KeyLoadingScoped
static KeyLoadingStrategy provideKeyLoaderProvider(@KeyLoading Vault vault, Map<String, Provider<KeyLoadingStrategy>> strategies) { static KeyLoadingStrategy provideKeyLoaderProvider(@KeyLoading Vault vault, Map<String, Provider<KeyLoadingStrategy>> strategies) {
try { try {
String scheme = vault.getUnverifiedVaultConfig().getKeyId().getScheme(); String scheme = vault.getVaultConfigCache().get().getKeyId().getScheme();
var fallback = KeyLoadingStrategy.failed(new IllegalArgumentException("Unsupported key id " + scheme)); var fallback = KeyLoadingStrategy.failed(new IllegalArgumentException("Unsupported key id " + scheme));
return strategies.getOrDefault(scheme, () -> fallback).get(); return strategies.getOrDefault(scheme, () -> fallback).get();
} catch (IOException e) { } catch (IOException e) {
@@ -77,6 +77,7 @@ public interface KeyLoadingStrategy extends MasterkeyLoader {
boolean success = false; boolean success = false;
try { try {
user.use(this); user.use(this);
success = true;
} catch (MasterkeyLoadingFailedException e) { } catch (MasterkeyLoadingFailedException e) {
if (recoverFromException(e)) { if (recoverFromException(e)) {
LOG.info("Unlock attempt threw {}. Reattempting...", e.getClass().getSimpleName()); LOG.info("Unlock attempt threw {}. Reattempting...", e.getClass().getSimpleName());
@@ -11,12 +11,11 @@ import javax.inject.Named;
import javax.inject.Singleton; import javax.inject.Singleton;
import javafx.application.Platform; import javafx.application.Platform;
import java.io.IOException; import java.io.IOException;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import static org.cryptomator.common.Constants.MASTERKEY_FILENAME; import static org.cryptomator.common.Constants.CRYPTOMATOR_FILENAME_EXT;
@Singleton @Singleton
class AppLaunchEventHandler { class AppLaunchEventHandler {
@@ -69,7 +68,7 @@ class AppLaunchEventHandler {
assert Platform.isFxApplicationThread(); assert Platform.isFxApplicationThread();
try { try {
final Vault v; final Vault v;
if (potentialVaultPath.getFileName().toString().equals(MASTERKEY_FILENAME)) { if (potentialVaultPath.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT)) {
v = vaultListManager.add(potentialVaultPath.getParent()); v = vaultListManager.add(potentialVaultPath.getParent());
} else { } else {
v = vaultListManager.add(potentialVaultPath); v = vaultListManager.add(potentialVaultPath);
@@ -2,6 +2,7 @@ package org.cryptomator.ui.launcher;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import org.cryptomator.common.PluginClassLoader;
import org.cryptomator.integrations.autostart.AutoStartProvider; import org.cryptomator.integrations.autostart.AutoStartProvider;
import org.cryptomator.integrations.tray.TrayIntegrationProvider; import org.cryptomator.integrations.tray.TrayIntegrationProvider;
import org.cryptomator.integrations.uiappearance.UiAppearanceProvider; import org.cryptomator.integrations.uiappearance.UiAppearanceProvider;
@@ -33,21 +34,21 @@ public abstract class UiLauncherModule {
@Provides @Provides
@Singleton @Singleton
static Optional<UiAppearanceProvider> provideAppearanceProvider() { static Optional<UiAppearanceProvider> provideAppearanceProvider(PluginClassLoader classLoader) {
return ServiceLoader.load(UiAppearanceProvider.class).findFirst(); return ServiceLoader.load(UiAppearanceProvider.class, classLoader).findFirst();
} }
@Provides @Provides
@Singleton @Singleton
static Optional<AutoStartProvider> provideAutostartProvider() { static Optional<AutoStartProvider> provideAutostartProvider(PluginClassLoader classLoader) {
return ServiceLoader.load(AutoStartProvider.class).findFirst(); return ServiceLoader.load(AutoStartProvider.class, classLoader).findFirst();
} }
@Provides @Provides
@Singleton @Singleton
static Optional<TrayIntegrationProvider> provideTrayIntegrationProvider() { static Optional<TrayIntegrationProvider> provideTrayIntegrationProvider(PluginClassLoader classLoader) {
return ServiceLoader.load(TrayIntegrationProvider.class).findFirst(); return ServiceLoader.load(TrayIntegrationProvider.class, classLoader).findFirst();
} }
@Provides @Provides
@@ -23,12 +23,11 @@ import javafx.scene.layout.StackPane;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; 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.MASTERKEY_FILENAME;
import static org.cryptomator.common.Constants.VAULTCONFIG_FILENAME; import static org.cryptomator.common.Constants.VAULTCONFIG_FILENAME;
@@ -55,7 +54,7 @@ public class MainWindowController implements FxController {
@FXML @FXML
public void initialize() { public void initialize() {
LOG.debug("init MainWindowController"); LOG.trace("init MainWindowController");
root.setOnDragEntered(this::handleDragEvent); root.setOnDragEntered(this::handleDragEvent);
root.setOnDragOver(this::handleDragEvent); root.setOnDragOver(this::handleDragEvent);
root.setOnDragDropped(this::handleDragEvent); root.setOnDragDropped(this::handleDragEvent);
@@ -96,6 +95,9 @@ public class MainWindowController implements FxController {
private boolean containsVault(Path path) { private boolean containsVault(Path path) {
try { try {
if (path.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT)) {
path = path.getParent();
}
return CryptoFileSystemProvider.checkDirStructureForVault(path, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME) != DirStructure.UNRELATED; return CryptoFileSystemProvider.checkDirStructureForVault(path, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME) != DirStructure.UNRELATED;
} catch (IOException e) { } catch (IOException e) {
return false; return false;
@@ -104,7 +106,7 @@ public class MainWindowController implements FxController {
private void addVault(Path pathToVault) { private void addVault(Path pathToVault) {
try { try {
if (pathToVault.getFileName().toString().equals(VAULTCONFIG_FILENAME)) { if (pathToVault.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT)) {
vaultListManager.add(pathToVault.getParent()); vaultListManager.add(pathToVault.getParent());
} else { } else {
vaultListManager.add(pathToVault); vaultListManager.add(pathToVault);
@@ -6,17 +6,17 @@ import dagger.Provides;
import dagger.multibindings.IntoMap; import dagger.multibindings.IntoMap;
import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.Vault;
import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent; import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent;
import org.cryptomator.ui.common.FxmlLoaderFactory;
import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.common.FxControllerKey; import org.cryptomator.ui.common.FxControllerKey;
import org.cryptomator.ui.common.FxmlFile; import org.cryptomator.ui.common.FxmlFile;
import org.cryptomator.ui.common.FxmlLoaderFactory;
import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.common.FxmlScene;
import org.cryptomator.ui.common.StageFactory; import org.cryptomator.ui.common.StageFactory;
import org.cryptomator.ui.health.HealthCheckComponent; import org.cryptomator.ui.health.HealthCheckComponent;
import org.cryptomator.ui.migration.MigrationComponent; import org.cryptomator.ui.migration.MigrationComponent;
import org.cryptomator.ui.removevault.RemoveVaultComponent; import org.cryptomator.ui.removevault.RemoveVaultComponent;
import org.cryptomator.ui.vaultoptions.VaultOptionsComponent;
import org.cryptomator.ui.stats.VaultStatisticsComponent; import org.cryptomator.ui.stats.VaultStatisticsComponent;
import org.cryptomator.ui.vaultoptions.VaultOptionsComponent;
import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent; import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent;
import javax.inject.Provider; import javax.inject.Provider;
@@ -49,11 +49,8 @@ abstract class MainWindowModule {
@MainWindowScoped @MainWindowScoped
static Stage provideStage(StageFactory factory) { static Stage provideStage(StageFactory factory) {
Stage stage = factory.create(StageStyle.UNDECORATED); Stage stage = factory.create(StageStyle.UNDECORATED);
// TODO: min/max values chosen arbitrarily. We might wanna take a look at the user's resolution...
stage.setMinWidth(650); stage.setMinWidth(650);
stage.setMinHeight(440); stage.setMinHeight(440);
stage.setMaxWidth(1000);
stage.setMaxHeight(700);
stage.setTitle("Cryptomator"); stage.setTitle("Cryptomator");
return stage; return stage;
} }
@@ -16,6 +16,7 @@ import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding; import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.ReadOnlyBooleanProperty; import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.stage.Stage; import javafx.stage.Stage;
@@ -53,22 +54,43 @@ public class MainWindowTitleController implements FxController {
@FXML @FXML
public void initialize() { public void initialize() {
LOG.debug("init MainWindowTitleController"); LOG.trace("init MainWindowTitleController");
updateChecker.automaticallyCheckForUpdatesIfEnabled(); updateChecker.automaticallyCheckForUpdatesIfEnabled();
titleBar.setOnMousePressed(event -> { titleBar.setOnMousePressed(event -> {
xOffset = event.getSceneX(); xOffset = event.getSceneX();
yOffset = event.getSceneY(); yOffset = event.getSceneY();
});
titleBar.setOnMouseClicked(event -> {
if (event.getButton().equals(MouseButton.PRIMARY) && event.getClickCount() == 2) {
window.setFullScreen(!window.isFullScreen());
}
}); });
titleBar.setOnMouseDragged(event -> { titleBar.setOnMouseDragged(event -> {
if (window.isFullScreen()) return;
window.setX(event.getScreenX() - xOffset); window.setX(event.getScreenX() - xOffset);
window.setY(event.getScreenY() - yOffset); window.setY(event.getScreenY() - yOffset);
}); });
titleBar.setOnDragDetected(mouseDragEvent -> {
titleBar.startFullDrag();
});
titleBar.setOnMouseDragReleased(mouseDragEvent -> {
saveWindowSettings();
});
window.setOnCloseRequest(event -> { window.setOnCloseRequest(event -> {
close(); close();
event.consume(); event.consume();
}); });
} }
private void saveWindowSettings() {
settings.windowYPositionProperty().setValue(window.getY());
settings.windowXPositionProperty().setValue(window.getX());
settings.windowWidthProperty().setValue(window.getWidth());
settings.windowHeightProperty().setValue(window.getHeight());
}
@FXML @FXML
public void close() { public void close() {
if (trayMenuInitialized) { if (trayMenuInitialized) {
@@ -1,41 +1,100 @@
package org.cryptomator.ui.mainwindow; package org.cryptomator.ui.mainwindow;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject; import javax.inject.Inject;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.geometry.Rectangle2D;
import javafx.scene.input.MouseEvent; import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Region; import javafx.scene.layout.Region;
import javafx.stage.Screen;
import javafx.stage.Stage; import javafx.stage.Stage;
@MainWindow @MainWindow
public class ResizeController implements FxController { public class ResizeController implements FxController {
private static final Logger LOG = LoggerFactory.getLogger(ResizeController.class);
private final Stage window; private final Stage window;
public Region tlResizer; public Region tlResizer;
public Region trResizer; public Region trResizer;
public Region blResizer; public Region blResizer;
public Region brResizer; public Region brResizer;
public Region tResizer;
public Region rResizer;
public Region bResizer;
public Region lResizer;
public Region lDefaultRegion;
public Region tDefaultRegion;
public Region rDefaultRegion;
public Region bDefaultRegion;
private double origX, origY, origW, origH; private double origX, origY, origW, origH;
private final Settings settings;
private final BooleanBinding showResizingArrows;
@Inject @Inject
ResizeController(@MainWindow Stage window) { ResizeController(@MainWindow Stage window, Settings settings) {
this.window = window; this.window = window;
// TODO inject settings and save current position and size this.settings = settings;
this.showResizingArrows = Bindings.createBooleanBinding(this::isShowResizingArrows, window.fullScreenProperty());
} }
@FXML @FXML
public void initialize() { public void initialize() {
tlResizer.setOnMousePressed(this::startResize); LOG.trace("init ResizeController");
trResizer.setOnMousePressed(this::startResize);
blResizer.setOnMousePressed(this::startResize); if (neverTouched()) {
brResizer.setOnMousePressed(this::startResize); settings.displayConfigurationProperty().setValue(getMonitorSizes());
tlResizer.setOnMouseDragged(this::resizeTopLeft); return;
trResizer.setOnMouseDragged(this::resizeTopRight); } else {
blResizer.setOnMouseDragged(this::resizeBottomLeft); if (didDisplayConfigurationChange()) {
brResizer.setOnMouseDragged(this::resizeBottomRight); //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.windowHeightProperty().get() > window.getMinHeight() ? settings.windowHeightProperty().get() : window.getMinHeight());
window.setWidth(settings.windowWidthProperty().get() > window.getMinWidth() ? settings.windowWidthProperty().get() : window.getMinWidth());
window.setX(settings.windowXPositionProperty().get());
window.setY(settings.windowYPositionProperty().get());
}
}
savePositionalSettings();
}
private boolean neverTouched() {
return (settings.windowHeightProperty().get() == 0) && (settings.windowWidthProperty().get() == 0) && (settings.windowXPositionProperty().get() == 0) && (settings.windowYPositionProperty().get() == 0);
}
private boolean didDisplayConfigurationChange() {
String currentDisplayConfiguration = getMonitorSizes();
String settingsDisplayConfiguration = settings.displayConfigurationProperty().get();
boolean configurationHasChanged = !settingsDisplayConfiguration.equals(currentDisplayConfiguration);
if (configurationHasChanged) settings.displayConfigurationProperty().setValue(currentDisplayConfiguration);
return configurationHasChanged;
}
private String getMonitorSizes() {
ObservableList<Screen> screens = Screen.getScreens();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < screens.size(); i++) {
Rectangle2D screenBounds = screens.get(i).getBounds();
if (!sb.isEmpty()) sb.append(" ");
sb.append("displayId: " + i + ", " + screenBounds.getWidth() + "x" + screenBounds.getHeight() + ";");
}
return sb.toString();
} }
private void startResize(MouseEvent evt) { private void startResize(MouseEvent evt) {
@@ -45,27 +104,33 @@ public class ResizeController implements FxController {
origH = window.getHeight(); origH = window.getHeight();
} }
@FXML
private void resizeTopLeft(MouseEvent evt) { private void resizeTopLeft(MouseEvent evt) {
resizeTop(evt); resizeTop(evt);
resizeLeft(evt); resizeLeft(evt);
} }
@FXML
private void resizeTopRight(MouseEvent evt) { private void resizeTopRight(MouseEvent evt) {
resizeTop(evt); resizeTop(evt);
resizeRight(evt); resizeRight(evt);
} }
@FXML
private void resizeBottomLeft(MouseEvent evt) { private void resizeBottomLeft(MouseEvent evt) {
resizeBottom(evt); resizeBottom(evt);
resizeLeft(evt); resizeLeft(evt);
} }
@FXML
private void resizeBottomRight(MouseEvent evt) { private void resizeBottomRight(MouseEvent evt) {
resizeBottom(evt); resizeBottom(evt);
resizeRight(evt); resizeRight(evt);
} }
@FXML
private void resizeTop(MouseEvent evt) { private void resizeTop(MouseEvent evt) {
startResize(evt);
double newY = evt.getScreenY(); double newY = evt.getScreenY();
double dy = newY - origY; double dy = newY - origY;
double newH = origH - dy; double newH = origH - dy;
@@ -75,7 +140,9 @@ public class ResizeController implements FxController {
} }
} }
@FXML
private void resizeLeft(MouseEvent evt) { private void resizeLeft(MouseEvent evt) {
startResize(evt);
double newX = evt.getScreenX(); double newX = evt.getScreenX();
double dx = newX - origX; double dx = newX - origX;
double newW = origW - dx; double newW = origW - dx;
@@ -85,6 +152,7 @@ public class ResizeController implements FxController {
} }
} }
@FXML
private void resizeBottom(MouseEvent evt) { private void resizeBottom(MouseEvent evt) {
double newH = evt.getSceneY(); double newH = evt.getSceneY();
if (newH < window.getMaxHeight() && newH > window.getMinHeight()) { if (newH < window.getMaxHeight() && newH > window.getMinHeight()) {
@@ -92,6 +160,7 @@ public class ResizeController implements FxController {
} }
} }
@FXML
private void resizeRight(MouseEvent evt) { private void resizeRight(MouseEvent evt) {
double newW = evt.getSceneX(); double newW = evt.getSceneX();
if (newW < window.getMaxWidth() && newW > window.getMinWidth()) { if (newW < window.getMaxWidth() && newW > window.getMinWidth()) {
@@ -99,4 +168,21 @@ public class ResizeController implements FxController {
} }
} }
} @FXML
public void savePositionalSettings() {
settings.windowHeightProperty().setValue(window.getHeight());
settings.windowWidthProperty().setValue(window.getWidth());
settings.windowYPositionProperty().setValue(window.getY());
settings.windowXPositionProperty().setValue(window.getX());
}
public BooleanBinding showResizingArrowsProperty() {
return showResizingArrows;
}
public boolean isShowResizingArrows() {
//If in fullscreen resizing is not be possible;
return !window.isFullScreen();
}
}
+32 -3
View File
@@ -1,12 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import org.cryptomator.ui.controls.FontAwesome5IconView?> <?import org.cryptomator.ui.controls.FontAwesome5IconView?>
<?import org.cryptomator.ui.controls.FormattedLabel?>
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?> <?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?> <?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.control.Hyperlink?>
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextArea?> <?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Region?>
<?import javafx.scene.layout.StackPane?> <?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?> <?import javafx.scene.shape.Circle?>
@@ -15,7 +18,7 @@
fx:controller="org.cryptomator.ui.common.ErrorController" fx:controller="org.cryptomator.ui.common.ErrorController"
prefWidth="450" prefWidth="450"
prefHeight="450" prefHeight="450"
spacing="12" spacing="18"
alignment="TOP_CENTER"> alignment="TOP_CENTER">
<padding> <padding>
<Insets topRightBottomLeft="24"/> <Insets topRightBottomLeft="24"/>
@@ -27,12 +30,38 @@
<FontAwesome5IconView styleClass="glyph-icon-white" glyph="EXCLAMATION" glyphSize="24"/> <FontAwesome5IconView styleClass="glyph-icon-white" glyph="EXCLAMATION" glyphSize="24"/>
</StackPane> </StackPane>
<VBox spacing="6" HBox.hgrow="ALWAYS"> <VBox spacing="6" HBox.hgrow="ALWAYS">
<Label text="%generic.error.title" wrapText="true"/> <FormattedLabel styleClass="label-large" format="%generic.error.title" arg1="${controller.errorCode}"/>
<Label text="%generic.error.instruction" wrapText="true"/> <Label text="%generic.error.instruction" wrapText="true"/>
<Hyperlink styleClass="hyperlink-underline" text="%generic.error.hyperlink.lookup" onAction="#searchError" contentDisplay="LEFT">
<graphic>
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
</graphic>
</Hyperlink>
<Hyperlink styleClass="hyperlink-underline" text="%generic.error.hyperlink.report" onAction="#reportError" contentDisplay="LEFT">
<graphic>
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
</graphic>
</Hyperlink>
</VBox> </VBox>
</HBox> </HBox>
<TextArea VBox.vgrow="ALWAYS" text="${controller.stackTrace}" prefRowCount="5" editable="false"/> <VBox spacing="6" VBox.vgrow="ALWAYS">
<HBox>
<Label text="%generic.error.technicalDetails"/>
<Region HBox.hgrow="ALWAYS"/>
<Hyperlink styleClass="hyperlink-underline" text="%generic.button.copy" onAction="#copyDetails" contentDisplay="LEFT" visible="${!controller.copiedDetails}" managed="${!controller.copiedDetails}">
<graphic>
<FontAwesome5IconView glyph="CLIPBOARD" glyphSize="12"/>
</graphic>
</Hyperlink>
<Hyperlink styleClass="hyperlink-underline" text="%generic.button.copied" onAction="#copyDetails" contentDisplay="LEFT" visible="${controller.copiedDetails}" managed="${controller.copiedDetails}">
<graphic>
<FontAwesome5IconView glyph="CHECK" glyphSize="12"/>
</graphic>
</Hyperlink>
</HBox>
<TextArea VBox.vgrow="ALWAYS" text="${controller.detailText}" prefRowCount="5" editable="false"/>
</VBox>
<ButtonBar buttonMinWidth="120" buttonOrder="B+C"> <ButtonBar buttonMinWidth="120" buttonOrder="B+C">
<buttons> <buttons>
@@ -1,44 +0,0 @@
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.TitledPane?>
<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
<?import javafx.scene.layout.Region?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.text.TextFlow?>
<?import javafx.scene.text.Text?>
<VBox xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="org.cryptomator.ui.health.StartFailController"
prefWidth="600"
prefHeight="400"
spacing="12">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
<Label text="%health.fail.header" styleClass="label-large" />
<TextFlow fx:id="ioErrorLabel" visible="${controller.ioException}" managed="${controller.ioException}">
<Text text="%health.fail.ioError" />
<Text text="${controller.localizedErrorMessage}"/>
</TextFlow>
<Label fx:id="parseErrorLabel" text="%health.fail.parseError" visible="${controller.parseException}" managed="${controller.parseException}"/>
<TitledPane fx:id="moreInfoPane" text="%health.fail.moreInfo" expanded="false">
<graphic>
<HBox alignment="CENTER" minWidth="8">
<FontAwesome5IconView glyph="${controller.moreInfoIcon}"/>
</HBox>
</graphic>
<content>
<TextArea VBox.vgrow="ALWAYS" text="${controller.stackTrace}" prefRowCount="20" editable="false" />
</content>
</TitledPane>
<Region VBox.vgrow="ALWAYS"/>
<ButtonBar buttonMinWidth="120" buttonOrder="+CX">
<buttons>
<Button text="%generic.button.close" ButtonBar.buttonData="CANCEL_CLOSE" cancelButton="true" onAction="#close"/>
</buttons>
</ButtonBar>
</VBox>
+1 -1
View File
@@ -12,7 +12,7 @@
fx:id="root" fx:id="root"
fx:controller="org.cryptomator.ui.mainwindow.MainWindowController" fx:controller="org.cryptomator.ui.mainwindow.MainWindowController"
styleClass="main-window"> styleClass="main-window">
<VBox> <VBox minWidth="650">
<fx:include source="main_window_title.fxml" VBox.vgrow="NEVER"/> <fx:include source="main_window_title.fxml" VBox.vgrow="NEVER"/>
<StackPane VBox.vgrow="ALWAYS"> <StackPane VBox.vgrow="ALWAYS">
<SplitPane dividerPositions="0.33" orientation="HORIZONTAL"> <SplitPane dividerPositions="0.33" orientation="HORIZONTAL">
@@ -9,9 +9,22 @@
<fx:define> <fx:define>
<Cursor fx:id="nwResize" fx:constant="NW_RESIZE"/> <Cursor fx:id="nwResize" fx:constant="NW_RESIZE"/>
<Cursor fx:id="neResize" fx:constant="NE_RESIZE"/> <Cursor fx:id="neResize" fx:constant="NE_RESIZE"/>
<Cursor fx:id="nsResize" fx:constant="N_RESIZE"/>
<Cursor fx:id="ewResize" fx:constant="E_RESIZE"/>
<Cursor fx:id="default" fx:constant="DEFAULT"/>
</fx:define> </fx:define>
<Region fx:id="tlResizer" cursor="${nwResize}" prefWidth="10" prefHeight="10" maxWidth="-Infinity" maxHeight="-Infinity" AnchorPane.topAnchor="0" AnchorPane.leftAnchor="0"/>
<Region fx:id="trResizer" cursor="${neResize}" prefWidth="10" prefHeight="10" maxWidth="-Infinity" maxHeight="-Infinity" AnchorPane.topAnchor="0" AnchorPane.rightAnchor="0"/> <Region fx:id="tlResizer" cursor="${nwResize}" prefWidth="10" prefHeight="10" maxWidth="-Infinity" maxHeight="-Infinity" visible="${controller.showResizingArrows}" managed="${controller.showResizingArrows}" onMouseDragged="#resizeTopLeft" onMouseReleased="#savePositionalSettings" AnchorPane.topAnchor="0" AnchorPane.leftAnchor="0"/>
<Region fx:id="blResizer" cursor="${neResize}" prefWidth="10" prefHeight="10" maxWidth="-Infinity" maxHeight="-Infinity" AnchorPane.bottomAnchor="0" AnchorPane.leftAnchor="0"/> <Region fx:id="trResizer" cursor="${neResize}" prefWidth="10" prefHeight="10" maxWidth="-Infinity" maxHeight="-Infinity" visible="${controller.showResizingArrows}" managed="${controller.showResizingArrows}" onMouseDragged="#resizeTopRight" onMouseReleased="#savePositionalSettings" AnchorPane.topAnchor="0" AnchorPane.rightAnchor="0"/>
<Region fx:id="brResizer" cursor="${nwResize}" prefWidth="10" prefHeight="10" maxWidth="-Infinity" maxHeight="-Infinity" AnchorPane.bottomAnchor="0" AnchorPane.rightAnchor="0"/> <Region fx:id="blResizer" cursor="${neResize}" prefWidth="10" prefHeight="10" maxWidth="-Infinity" maxHeight="-Infinity" visible="${controller.showResizingArrows}" managed="${controller.showResizingArrows}" onMouseDragged="#resizeBottomLeft" onMouseReleased="#savePositionalSettings" AnchorPane.bottomAnchor="0" AnchorPane.leftAnchor="0"/>
<Region fx:id="brResizer" cursor="${nwResize}" prefWidth="10" prefHeight="10" maxWidth="-Infinity" maxHeight="-Infinity" visible="${controller.showResizingArrows}" managed="${controller.showResizingArrows}" onMouseDragged="#resizeBottomRight" onMouseReleased="#savePositionalSettings" AnchorPane.bottomAnchor="0" AnchorPane.rightAnchor="0"/>
<Region fx:id="tResizer" cursor="${nsResize}" prefWidth="0" prefHeight="6" maxWidth="-Infinity" maxHeight="-Infinity" visible="${controller.showResizingArrows}" managed="${controller.showResizingArrows}" onMouseDragged="#resizeTop" onMouseReleased="#savePositionalSettings" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="0.0"/>
<Region fx:id="rResizer" cursor="${ewResize}" prefWidth="6" prefHeight="0" maxWidth="-Infinity" maxHeight="-Infinity" visible="${controller.showResizingArrows}" managed="${controller.showResizingArrows}" onMouseDragged="#resizeRight" onMouseReleased="#savePositionalSettings" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="10.0"/>
<Region fx:id="bResizer" cursor="${nsResize}" prefWidth="6" prefHeight="6" maxWidth="-Infinity" maxHeight="-Infinity" visible="${controller.showResizingArrows}" managed="${controller.showResizingArrows}" onMouseDragged="#resizeBottom" onMouseReleased="#savePositionalSettings" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0"/>
<Region fx:id="lResizer" cursor="${ewResize}" prefWidth="6" prefHeight="6" maxWidth="-Infinity" maxHeight="-Infinity" visible="${controller.showResizingArrows}" managed="${controller.showResizingArrows}" onMouseDragged="#resizeLeft" onMouseReleased="#savePositionalSettings" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="10.0"/>
<Region fx:id="lDefaultRegion" cursor="${default}" prefWidth="1" prefHeight="1" maxWidth="-Infinity" maxHeight="-Infinity" AnchorPane.bottomAnchor="-1" AnchorPane.leftAnchor="-1" AnchorPane.topAnchor="-1"/>
<Region fx:id="tDefaultRegion" cursor="${default}" prefWidth="1" prefHeight="1" maxWidth="-Infinity" maxHeight="-Infinity" AnchorPane.leftAnchor="-1" AnchorPane.topAnchor="-1" AnchorPane.rightAnchor="-1"/>
<Region fx:id="rDefaultRegion" cursor="${default}" prefWidth="1" prefHeight="1" maxWidth="-Infinity" maxHeight="-Infinity" AnchorPane.topAnchor="-1" AnchorPane.rightAnchor="-1" AnchorPane.bottomAnchor="-1"/>
<Region fx:id="bDefaultRegion" cursor="${default}" prefWidth="1" prefHeight="1" maxWidth="-Infinity" maxHeight="-Infinity" AnchorPane.rightAnchor="-1" AnchorPane.bottomAnchor="-1" AnchorPane.leftAnchor="-1"/>
</AnchorPane> </AnchorPane>
+5 -2
View File
@@ -14,8 +14,11 @@ generic.button.done=Done
generic.button.next=Next generic.button.next=Next
generic.button.print=Print generic.button.print=Print
## Error ## Error
generic.error.title=An unexpected error occurred generic.error.title=Error %s
generic.error.instruction=This should not have happened. Please report the error text below and include a description of what steps did lead to this error. generic.error.instruction=Oops! Cryptomator didn't expect this to happen. You can look up existing solutions for this error. Or if it has not been reported yet, feel free to do so.
generic.error.hyperlink.lookup=Look up this error
generic.error.hyperlink.report=Report this error
generic.error.technicalDetails=Details:
# Defaults # Defaults
defaults.vault.vaultName=Vault defaults.vault.vaultName=Vault
+8 -11
View File
@@ -13,8 +13,6 @@ generic.button.done=تم
generic.button.next=التالي generic.button.next=التالي
generic.button.print=طباعة generic.button.print=طباعة
## Error ## Error
generic.error.title=حدث خطأ غير متوقع
generic.error.instruction=ما كان ينبغي أن يحدث هذا. يرجى الإبلاغ عن نص الخطأ أدناه وإدراج وصف للخطوات التي أدت إلى هذا الخطأ.
# Defaults # Defaults
defaults.vault.vaultName=مخزن defaults.vault.vaultName=مخزن
@@ -95,7 +93,6 @@ forgetPassword.information=سيؤدي هذا إلى حذف كلمة المرور
forgetPassword.confirmBtn=نسيت كلمة المرور forgetPassword.confirmBtn=نسيت كلمة المرور
# Unlock # Unlock
unlock.title=افتح الحافظة
unlock.passwordPrompt=‮أدخل كلمة السر لـ "%s": unlock.passwordPrompt=‮أدخل كلمة السر لـ "%s":
unlock.savePassword=تذكر كلمة المرور unlock.savePassword=تذكر كلمة المرور
unlock.unlockBtn=افتح unlock.unlockBtn=افتح
@@ -129,7 +126,7 @@ migration.start.confirm=نعم, محفظتي متزامنة بالكامل
migration.run.enterPassword=أدخل كلمة المرور لـ "%s" migration.run.enterPassword=أدخل كلمة المرور لـ "%s"
migration.run.startMigrationBtn=ترقية الحافظة migration.run.startMigrationBtn=ترقية الحافظة
migration.run.progressHint=قد يستغرق هذا بعض الوقت… migration.run.progressHint=قد يستغرق هذا بعض الوقت…
## Sucess ## Success
migration.success.nextStepsInstructions=تم ترحيل "%s" بنجاح.\nيمكنك الآن فتح مخزنك. migration.success.nextStepsInstructions=تم ترحيل "%s" بنجاح.\nيمكنك الآن فتح مخزنك.
migration.success.unlockNow=افتح الان migration.success.unlockNow=افتح الان
## Missing file system capabilities ## Missing file system capabilities
@@ -145,8 +142,11 @@ migration.impossible.reason=لا يمكن ترحيل المخزن تلقائيا
migration.impossible.moreInfo=لا يزال ممكناً فتح المخزن باستخدام إصدار قديم. للحصول على تعليمات حول كيفية ترحيل المخزن يدوياً، قم بزيارة migration.impossible.moreInfo=لا يزال ممكناً فتح المخزن باستخدام إصدار قديم. للحصول على تعليمات حول كيفية ترحيل المخزن يدوياً، قم بزيارة
# Health Check # Health Check
## Start
## Start Failure
## Check Selection
## Detail view ## Detail view
## Checks ## Fix Application
# Preferences # Preferences
preferences.title=تفضيلات preferences.title=تفضيلات
@@ -164,10 +164,6 @@ preferences.general.debugLogging=تمكين سجلات التصحيح
preferences.general.debugDirectory=عرض ملفات السجل preferences.general.debugDirectory=عرض ملفات السجل
preferences.general.autoStart=تشغيل Cryptomator عند بدء تشغيل النظام preferences.general.autoStart=تشغيل Cryptomator عند بدء تشغيل النظام
preferences.general.keychainBackend=تخزين كلمات المرور مع preferences.general.keychainBackend=تخزين كلمات المرور مع
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=محفظة KDE
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=الوصول إلى سلسلة مفاتيح ماك
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=حماية بيانات ويندوز
preferences.general.interfaceOrientation=اتجاه الواجهة preferences.general.interfaceOrientation=اتجاه الواجهة
preferences.general.interfaceOrientation.ltr=من اليسار إلى اليمين preferences.general.interfaceOrientation.ltr=من اليسار إلى اليمين
preferences.general.interfaceOrientation.rtl=من اليمين إلى اليسار preferences.general.interfaceOrientation.rtl=من اليمين إلى اليسار
@@ -268,6 +264,7 @@ 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
vaultOptions.mount=القرص الوهمي vaultOptions.mount=القرص الوهمي
vaultOptions.mount.readonly=للقراءة فقط vaultOptions.mount.readonly=للقراءة فقط
@@ -283,10 +280,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=اختر مجلد فارغ
vaultOptions.masterkey=كلمة المرور vaultOptions.masterkey=كلمة المرور
vaultOptions.masterkey.changePasswordBtn=تغيير كلمة المرور vaultOptions.masterkey.changePasswordBtn=تغيير كلمة المرور
vaultOptions.masterkey.forgetSavedPasswordBtn=نسيان كلمة المرور المحفوظة vaultOptions.masterkey.forgetSavedPasswordBtn=نسيان كلمة المرور المحفوظة
vaultOptions.masterkey.recoveryKeyExpanation=مفتاح الاسترداد هو وسيلتك الوحيدة لاستعادة الوصول إلى مخزنك إذا فقدت كلمة المرور. vaultOptions.masterkey.recoveryKeyExplanation=مفتاح الاسترداد هو وسيلتك الوحيدة لاستعادة الوصول إلى مخزنك إذا فقدت كلمة المرور.
vaultOptions.masterkey.showRecoveryKeyBtn=عرض مفتاح الاسترداد vaultOptions.masterkey.showRecoveryKeyBtn=عرض مفتاح الاسترداد
vaultOptions.masterkey.recoverPasswordBtn=استرجاع كلمة المرور vaultOptions.masterkey.recoverPasswordBtn=استرجاع كلمة المرور
## Auto Lock
# Recovery Key # Recovery Key
recoveryKey.title=مفتاح الاسترداد recoveryKey.title=مفتاح الاسترداد
+12 -11
View File
@@ -13,8 +13,6 @@ generic.button.done=Gotovo
generic.button.next=Sljedeće generic.button.next=Sljedeće
generic.button.print=Ispis generic.button.print=Ispis
## Error ## Error
generic.error.title=Došlo je do neočekivane greške
generic.error.instruction=Ovo se nije trebalo dogoditi. Molimo da prijavite opis greške ispod, kao i korake koji su do greške doveli.
# Defaults # Defaults
defaults.vault.vaultName=Sef defaults.vault.vaultName=Sef
@@ -44,6 +42,10 @@ addvaultwizard.new.locationPrompt=…
addvaultwizard.new.directoryPickerLabel=Prilagođena lokacija addvaultwizard.new.directoryPickerLabel=Prilagođena lokacija
addvaultwizard.new.directoryPickerButton=Odaberi… addvaultwizard.new.directoryPickerButton=Odaberi…
addvaultwizard.new.directoryPickerTitle=Izaberi folder addvaultwizard.new.directoryPickerTitle=Izaberi folder
addvaultwizard.new.fileAlreadyExists=Upozorenje: Fajl ili mapa s tim nazivom već postoji
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.locationIsOk=Pogodno mjesto za vaš sef
addvaultwizard.new.invalidName=Naziv sefa neispravan. Molimo razmislite o drugom nazivu. addvaultwizard.new.invalidName=Naziv sefa neispravan. Molimo razmislite o drugom nazivu.
### Password ### Password
addvaultwizard.new.createVaultBtn=Kreiraj novi sef addvaultwizard.new.createVaultBtn=Kreiraj novi sef
@@ -91,7 +93,6 @@ forgetPassword.information=Ovo će izbrisati sačuvanu lozinku ovog sefa iz vaš
forgetPassword.confirmBtn=Zaboravili ste šifru forgetPassword.confirmBtn=Zaboravili ste šifru
# Unlock # Unlock
unlock.title=Otključaj sef
unlock.passwordPrompt=Unesite lozinku za "%s": unlock.passwordPrompt=Unesite lozinku za "%s":
unlock.savePassword=Zapamti šifru unlock.savePassword=Zapamti šifru
unlock.unlockBtn=Otključaj unlock.unlockBtn=Otključaj
@@ -125,7 +126,7 @@ migration.start.confirm=Da, moj sef je u potpunosti sinhroniziran
migration.run.enterPassword=Unesite lozinku za "%s" migration.run.enterPassword=Unesite lozinku za "%s"
migration.run.startMigrationBtn=Nadogradi sef migration.run.startMigrationBtn=Nadogradi sef
migration.run.progressHint=Ovo bi moglo potrajati… migration.run.progressHint=Ovo bi moglo potrajati…
## Sucess ## Success
migration.success.nextStepsInstructions="%s" je uspješno nadograđen.\nSada možete otključati svoj sef. migration.success.nextStepsInstructions="%s" je uspješno nadograđen.\nSada možete otključati svoj sef.
migration.success.unlockNow=Otključaj sada migration.success.unlockNow=Otključaj sada
## Missing file system capabilities ## Missing file system capabilities
@@ -141,8 +142,11 @@ migration.impossible.reason=Sef se ne može automatski migrirati jer njegovo mje
migration.impossible.moreInfo=Sef se i dalje može otvoriti sa starijom verzijom. Za upute o ručnom migriranju sefa posjetite migration.impossible.moreInfo=Sef se i dalje može otvoriti sa starijom verzijom. Za upute o ručnom migriranju sefa posjetite
# Health Check # Health Check
## Start
## Start Failure
## Check Selection
## Detail view ## Detail view
## Checks ## Fix Application
# Preferences # Preferences
preferences.title=Postavke preferences.title=Postavke
@@ -160,10 +164,6 @@ preferences.general.debugLogging=Omogući evidenciju otklanjanja pogrešaka
preferences.general.debugDirectory=Pokaži dnevnik podataka preferences.general.debugDirectory=Pokaži dnevnik podataka
preferences.general.autoStart=Pokreni Cryptomator pri pokretanju sistema preferences.general.autoStart=Pokreni Cryptomator pri pokretanju sistema
preferences.general.keychainBackend=Pohrani lozinku sa preferences.general.keychainBackend=Pohrani lozinku sa
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Keychain Access
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection
preferences.general.interfaceOrientation=Orijentacija Interfejsa preferences.general.interfaceOrientation=Orijentacija Interfejsa
preferences.general.interfaceOrientation.ltr=S lijeva ka desno preferences.general.interfaceOrientation.ltr=S lijeva ka desno
preferences.general.interfaceOrientation.rtl=Sa desna ka lijevo preferences.general.interfaceOrientation.rtl=Sa desna ka lijevo
@@ -280,6 +280,7 @@ vaultOptions.general.actionAfterUnlock=Nakon uspješnog otključavanja
vaultOptions.general.actionAfterUnlock.ignore=Ne radi ništa vaultOptions.general.actionAfterUnlock.ignore=Ne radi ništa
vaultOptions.general.actionAfterUnlock.reveal=Otkrij pogon vaultOptions.general.actionAfterUnlock.reveal=Otkrij pogon
vaultOptions.general.actionAfterUnlock.ask=Pitaj vaultOptions.general.actionAfterUnlock.ask=Pitaj
## Mount ## Mount
vaultOptions.mount=Povezivanje vaultOptions.mount=Povezivanje
vaultOptions.mount.readonly=Samo čitanje vaultOptions.mount.readonly=Samo čitanje
@@ -295,10 +296,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Izaberi praznu mapu
vaultOptions.masterkey=Šifra vaultOptions.masterkey=Šifra
vaultOptions.masterkey.changePasswordBtn=Promjeni lozinku vaultOptions.masterkey.changePasswordBtn=Promjeni lozinku
vaultOptions.masterkey.forgetSavedPasswordBtn=Zaborav spremljenu šifru vaultOptions.masterkey.forgetSavedPasswordBtn=Zaborav spremljenu šifru
vaultOptions.masterkey.recoveryKeyExpanation=Ključ za oporavak je vaše jedino sredstvo za vraćanje pristupa sefu ako izgubite lozinku. vaultOptions.masterkey.recoveryKeyExplanation=Ključ za oporavak je vaše jedino sredstvo za vraćanje pristupa sefu ako izgubite lozinku.
vaultOptions.masterkey.showRecoveryKeyBtn=Pokaži ključ za oporavak vaultOptions.masterkey.showRecoveryKeyBtn=Pokaži ključ za oporavak
vaultOptions.masterkey.recoverPasswordBtn=Povrati šifru vaultOptions.masterkey.recoverPasswordBtn=Povrati šifru
## Auto Lock
# Recovery Key # Recovery Key
recoveryKey.title=Ključ za oporavak recoveryKey.title=Ključ za oporavak
+39 -22
View File
@@ -13,8 +13,6 @@ generic.button.done=Fet
generic.button.next=Següent generic.button.next=Següent
generic.button.print=Imprimeix generic.button.print=Imprimeix
## Error ## Error
generic.error.title=S'ha produït un error inesperat
generic.error.instruction=Això no hauria d'haver passat. Si us plau, informeu del text de l'error i inclogueu una descripció de quins passos han dut a aquest error.
# Defaults # Defaults
defaults.vault.vaultName=Caixa forta defaults.vault.vaultName=Caixa forta
@@ -45,7 +43,9 @@ addvaultwizard.new.directoryPickerLabel=Ubicació personalitzada
addvaultwizard.new.directoryPickerButton=Trieu… addvaultwizard.new.directoryPickerButton=Trieu…
addvaultwizard.new.directoryPickerTitle=Seleccioneu el directori addvaultwizard.new.directoryPickerTitle=Seleccioneu el directori
addvaultwizard.new.fileAlreadyExists=Ja existeix un fitxer o un directori amb el nom de la caixa forta addvaultwizard.new.fileAlreadyExists=Ja existeix un fitxer o un directori amb el nom de la caixa forta
addvaultwizard.new.locationDoesNotExist=Un directori de la ruta especificada no existeix o no s'hi pot accedir
addvaultwizard.new.locationIsNotWritable=No teniu permís d'escriptura en la ruta especificada addvaultwizard.new.locationIsNotWritable=No teniu permís d'escriptura en la ruta especificada
addvaultwizard.new.locationIsOk=Localització per a la vostra caixa forta
addvaultwizard.new.invalidName=El nom de la caixa forta no és vàlid. Si us plau, escribiu un mom de directori amb caràcters estàndard. addvaultwizard.new.invalidName=El nom de la caixa forta no és vàlid. Si us plau, escribiu un mom de directori amb caràcters estàndard.
### Password ### Password
addvaultwizard.new.createVaultBtn=Crea la caixa forta addvaultwizard.new.createVaultBtn=Crea la caixa forta
@@ -93,7 +93,7 @@ forgetPassword.information=Això eliminarà la contrasenya desada d'aquesta caix
forgetPassword.confirmBtn=He oblidat la contrasenya forgetPassword.confirmBtn=He oblidat la contrasenya
# Unlock # Unlock
unlock.title=Desbloquejar la caixa forta unlock.title=Desbloca "%s"
unlock.passwordPrompt=Introduïu la contrasenya de "%s": unlock.passwordPrompt=Introduïu la contrasenya de "%s":
unlock.savePassword=Recorda la contrasenya unlock.savePassword=Recorda la contrasenya
unlock.unlockBtn=Desbloqueja unlock.unlockBtn=Desbloqueja
@@ -128,7 +128,7 @@ migration.start.confirm=Sí, la meua caixa forta està completament sicronitzada
migration.run.enterPassword=Introduïu la contrasenya per a "%s" migration.run.enterPassword=Introduïu la contrasenya per a "%s"
migration.run.startMigrationBtn=Migrar la caixa forta migration.run.startMigrationBtn=Migrar la caixa forta
migration.run.progressHint=Això pot trigar una mica... migration.run.progressHint=Això pot trigar una mica...
## Sucess ## Success
migration.success.nextStepsInstructions="%s" s'ha migrat correctament.\nJa podeu desbloquejar la vostra caixa forta. migration.success.nextStepsInstructions="%s" s'ha migrat correctament.\nJa podeu desbloquejar la vostra caixa forta.
migration.success.unlockNow=Desbloqueja ara migration.success.unlockNow=Desbloqueja ara
## Missing file system capabilities ## Missing file system capabilities
@@ -144,19 +144,38 @@ migration.impossible.reason=La caixa forta no es pot migrar automàticament perq
migration.impossible.moreInfo=La caixa forta es pot obrir amb una versió anterior. Per saber com poder fer la migració de manera manual, visiteu migration.impossible.moreInfo=La caixa forta es pot obrir amb una versió anterior. Per saber com poder fer la migració de manera manual, visiteu
# Health Check # Health Check
health.title=Comprovació de la caixa forta ## Start
health.start.configInvalid=S'ha produït un problema en la lectura i anàlisi del fitxer de configuració de la caixa forta. health.title=Comprovació de "%s"
health.checkList.selectAllBox=Selecciona-ho tot health.intro.header=Comprovació d'estat
health.intro.text=La comprovació de salut és una col·lecció de comprovacions per a detectar la possibilitat de resoldre problemes en l'estructura interna de la vostra caixa forta. Tingueu en compte:
health.intro.remarkSync=Assegureu que tots els dispositius s'han sincronitzat completament, això resol la major part dels problemes.
health.intro.remarkFix=No s'han pogut resoldre tots els problemes.
health.intro.remarkBackup=Si les dades s'han corromput, solament una còpia de seguretat ho podrà resoldre.
health.intro.affirmation=He llegit i entès la informació anterior
## Start Failure
health.fail.header=Error en desar la configuració de la caixa forta
health.fail.ioError=S'ha trobat un error mentre s'accedia al fitxer de configuració.
health.fail.parseError=S'ha trobat un error mentre es processava la configuració de la caixa forta.
health.fail.moreInfo=Més informació
## Check Selection
health.checkList.description=Selecciona les caselles en la llista de l'esquerra o feu servir els botons de la part inferior.
health.checkList.selectAllButton=Selecciona tots
health.checkList.deselectAllButton=Deselecciona tots
health.check.runBatchBtn=Executa les proves seleccionades health.check.runBatchBtn=Executa les proves seleccionades
## Detail view ## Detail view
health.check.detail.header=Resultats de %s health.check.detail.noSelectedCheck=Per a obtenir-ne els resultats trieu una de les comprovacions finalitzades de la llista de l'esquerra.
health.check.detail.taskNotStarted=La prova no ha estat seleccionada per a executar-la. health.check.detail.checkScheduled=La comprovació s'ha programat.
health.check.detail.taskRunning=La prova és en procés… health.check.detail.checkRunning=La prova és en procés…
health.check.detail.taskSucceeded=La prova ha finalitzat amb èxit després de %d mil·lisegons. health.check.detail.checkSkipped=La prova no ha estat seleccionada per a executar-la.
health.check.detail.taskCancelled=S'ha cancel·lat la prova. health.check.detail.checkFinished=La prova ha finalitzat amb èxit.
health.check.detail.problemCount=S'hi han trobat %d problemes i %d errades irrecuperables. health.check.detail.checkFinishedAndFound=La comprovació ha finalitzat. Si us plau, comproveu-ne es resultat.
health.check.detail.checkFailed=La comprovació ha acabat a causa d'un error.
health.check.detail.checkCancelled=S'ha cancel·lat la prova.
health.check.exportBtn=Exporta informe health.check.exportBtn=Exporta informe
## Checks ## Fix Application
health.fix.fixBtn=Corregeix
health.fix.successTip=S'ha corregit amb èxit
health.fix.failTip=La correcció ha fallat, vegeu-ne els detalls al registre
# Preferences # Preferences
preferences.title=Preferències preferences.title=Preferències
@@ -174,10 +193,6 @@ preferences.general.debugLogging=Habilita el registre de depuració
preferences.general.debugDirectory=Mostra els fitxers de registres preferences.general.debugDirectory=Mostra els fitxers de registres
preferences.general.autoStart=Executa Cryptomator en engegar el sistema preferences.general.autoStart=Executa Cryptomator en engegar el sistema
preferences.general.keychainBackend=Desar contrasenyes amb preferences.general.keychainBackend=Desar contrasenyes amb
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Anell de claus de Gnome
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=Cartera de KDE
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=Accés a clauers macOS
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection
preferences.general.interfaceOrientation=Orientació de la interfície preferences.general.interfaceOrientation=Orientació de la interfície
preferences.general.interfaceOrientation.ltr=Esquerra a dreta preferences.general.interfaceOrientation.ltr=Esquerra a dreta
preferences.general.interfaceOrientation.rtl=Dreta a esquerra preferences.general.interfaceOrientation.rtl=Dreta a esquerra
@@ -294,12 +309,15 @@ wrongFileAlert.link=Per rebre assistència, visiteu
## General ## General
vaultOptions.general=General vaultOptions.general=General
vaultOptions.general.vaultName=Nom de la caixa forta vaultOptions.general.vaultName=Nom de la caixa forta
vaultOptions.general.autoLock.lockAfterTimePart1=Bloca després de
vaultOptions.general.autoLock.lockAfterTimePart2=minuts
vaultOptions.general.unlockAfterStartup=Desbloqueja la caixa forta quan s'inicia Cryptomator vaultOptions.general.unlockAfterStartup=Desbloqueja la caixa forta quan s'inicia Cryptomator
vaultOptions.general.actionAfterUnlock=Després d'un desbloqueig correcte vaultOptions.general.actionAfterUnlock=Després d'un desbloqueig correcte
vaultOptions.general.actionAfterUnlock.ignore=No facis res vaultOptions.general.actionAfterUnlock.ignore=No facis res
vaultOptions.general.actionAfterUnlock.reveal=Mostra la unitat vaultOptions.general.actionAfterUnlock.reveal=Mostra la unitat
vaultOptions.general.actionAfterUnlock.ask=Pregunta vaultOptions.general.actionAfterUnlock.ask=Pregunta
vaultOptions.general.healthBtn=Inicia la comprovació vaultOptions.general.startHealthCheckBtn=Inicia la comprovació
## Mount ## Mount
vaultOptions.mount=Muntatge vaultOptions.mount=Muntatge
vaultOptions.mount.readonly=Només lectura vaultOptions.mount.readonly=Només lectura
@@ -315,11 +333,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Esculliu un directori buit
vaultOptions.masterkey=Contrasenya vaultOptions.masterkey=Contrasenya
vaultOptions.masterkey.changePasswordBtn=Canvi de contrasenya vaultOptions.masterkey.changePasswordBtn=Canvi de contrasenya
vaultOptions.masterkey.forgetSavedPasswordBtn=Oblida la contrasenya desada vaultOptions.masterkey.forgetSavedPasswordBtn=Oblida la contrasenya desada
vaultOptions.masterkey.recoveryKeyExpanation=La clau de recuperació és l'unic mitjà de restaurar l'accès a la caixa forta en cas de perdre la contrasenya. vaultOptions.masterkey.recoveryKeyExplanation=La clau de recuperació és l'unic mitjà de restaurar l'accès a la caixa forta en cas de perdre la contrasenya.
vaultOptions.masterkey.showRecoveryKeyBtn=Mostra la clau de recuperació vaultOptions.masterkey.showRecoveryKeyBtn=Mostra la clau de recuperació
vaultOptions.masterkey.recoverPasswordBtn=Recupera la contrasenya vaultOptions.masterkey.recoverPasswordBtn=Recupera la contrasenya
## Auto Lock
vaultOptions.autoLock.lockAfterTimePart2=minuts
# Recovery Key # Recovery Key
recoveryKey.title=Clau de recuperació recoveryKey.title=Clau de recuperació
+41 -31
View File
@@ -13,8 +13,11 @@ generic.button.done=Hotovo
generic.button.next=Další generic.button.next=Další
generic.button.print=Tisk generic.button.print=Tisk
## Error ## Error
generic.error.title=Došlo k neočekávané chybě generic.error.title=Chyba %s
generic.error.instruction=Tohle se nemělo stát. Prosím, nahlaste níže uvedený chybový text a popište, jaké kroky vedly k této chybě. generic.error.instruction=Jejda! Tohle Cryptomator nečekal. Můžete najít již existující řešení pro tuto chybu. Nebo pokud ještě nebyla nahlášena, neváhejte tak učinit.
generic.error.hyperlink.lookup=Vyhledat tuto chybu
generic.error.hyperlink.report=Nahlásit tuto chybu
generic.error.technicalDetails=Podrobnosti:
# Defaults # Defaults
defaults.vault.vaultName=Trezor defaults.vault.vaultName=Trezor
@@ -95,7 +98,7 @@ forgetPassword.information=Toto smaže uložené heslo pro tento trezor.
forgetPassword.confirmBtn=Zapomenout heslo forgetPassword.confirmBtn=Zapomenout heslo
# Unlock # Unlock
unlock.title=Odemknout trezor unlock.title=Odemknout "%s"
unlock.passwordPrompt=Zadejte heslo pro "%s": unlock.passwordPrompt=Zadejte heslo pro "%s":
unlock.savePassword=Zapamatovat heslo unlock.savePassword=Zapamatovat heslo
unlock.unlockBtn=Odemknout unlock.unlockBtn=Odemknout
@@ -130,7 +133,7 @@ migration.start.confirm=Ano, můj trezor je plně synchronizován.
migration.run.enterPassword=Zadejte heslo pro "%s" migration.run.enterPassword=Zadejte heslo pro "%s"
migration.run.startMigrationBtn=Migrovat trezor migration.run.startMigrationBtn=Migrovat trezor
migration.run.progressHint=Může to chvíli trvat… migration.run.progressHint=Může to chvíli trvat…
## Sucess ## Success
migration.success.nextStepsInstructions=Migrace "%s" byla úspěšná.\nNyní můžete svůj trezor odemknout. migration.success.nextStepsInstructions=Migrace "%s" byla úspěšná.\nNyní můžete svůj trezor odemknout.
migration.success.unlockNow=Odemknout nyní migration.success.unlockNow=Odemknout nyní
## Missing file system capabilities ## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=Trezor nemůže být automaticky zmigrován, protož
migration.impossible.moreInfo=Trezor může být stále otevřen starší verzí. Pro pokyny, jak ručně migrovat trezor, navštivte migration.impossible.moreInfo=Trezor může být stále otevřen starší verzí. Pro pokyny, jak ručně migrovat trezor, navštivte
# Health Check # Health Check
health.title=Kontrola stavu trezoru ## Start
health.start.introduction=Kontrola stavu trezoru je soubor kontrol, jejichž cílem je odhalit a případně odstranit problémy ve vnitřní struktuře trezoru. Upozorňujeme, že ne všechny problémy lze opravit. K provedení kontrol potřebujete heslo k trezoru. health.title=Kontrola stavu "%s"
health.start.configValid=Načtení a analýza konfiguračního souboru trezoru proběhly úspěšně. Pokračujte ve výběru kontrol. health.intro.header=Kontrola stavu
health.start.configInvalid=Chyba při čtení a analýze konfiguračního souboru trezoru. health.intro.text=Kontrola stavu je soubor kontrol, které odhalí a případně opraví problémy ve vnitřní struktuře vašeho trezoru. Mějte prosím na paměti, že:
health.checkList.header=Dostupné kontroly stavu health.intro.remarkSync=Ujistěte se, že jsou všechna zařízení plně synchronizována, toto řeší většinu problémů.
health.checkList.selectAllBox=Vybrat vše health.intro.remarkFix=Ne všechny problémy lze vyřešit.
health.intro.remarkBackup=Pokud jsou data poškozena, může pomoci pouze záloha.
health.intro.affirmation=Přečetl jsem si výše uvedené informace a rozumím jim
## Start Failure
health.fail.header=Chyba při načítání konfigurace trezoru
health.fail.ioError=Došlo k chybě při přístupu a čtení konfiguračního souboru.
health.fail.parseError=Při analýze nastavení trezoru došlo k chybě.
health.fail.moreInfo=Více informací
## Check Selection
health.checkList.description=Vyberte kontroly z levého seznamu nebo použijte tlačítka níže.
health.checkList.selectAllButton=Vybrat všechny kontroly
health.checkList.deselectAllButton=Zrušit výběr všech kontrol
health.check.runBatchBtn=Spustit vybrané kontroly health.check.runBatchBtn=Spustit vybrané kontroly
## Detail view ## Detail view
health.check.detail.noSelectedCheck=Pro výsledky vyberte dokončenou kontrolu stavu v levém seznamu. health.check.detail.noSelectedCheck=Pro výsledky vyberte dokončenou kontrolu stavu v levém seznamu.
health.check.detail.header=Výsledky pro %s health.check.detail.checkScheduled=Kontrola je naplánována.
health.check.detail.taskNotStarted=Kontrola nebyla vybrána ke spuštění. health.check.detail.checkRunning=Kontrola právě probíhá…
health.check.detail.taskScheduled=Kontrola je naplánována. health.check.detail.checkSkipped=Kontrola nebyla vybrána ke spuštění.
health.check.detail.taskRunning=Kontrola právě probíhá… health.check.detail.checkFinished=Kontrola byla úspěšně dokončena.
health.check.detail.taskSucceeded=Kontrola byla úspěšně dokončena po %d milisekundách. health.check.detail.checkFinishedAndFound=Kontrola byla dokončena. Zkontrolujte prosím výsledky.
health.check.detail.taskFailed=Kontrola byla ukončena z důvodu chyby. health.check.detail.checkFailed=Kontrola byla ukončena z důvodu chyby.
health.check.detail.taskCancelled=Kontrola byla zrušena. health.check.detail.checkCancelled=Kontrola byla zrušena.
health.check.detail.problemCount=Nalezeno %d problémů a %d neopravitelných chyb.
health.check.exportBtn=Exportovat sestavu health.check.exportBtn=Exportovat sestavu
health.check.fixBtn=Opravit ## Fix Application
## Checks health.fix.fixBtn=Opravit
health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Kontrola adresáře health.fix.successTip=Oprava byla úspěšná
health.fix.failTip=Oprava selhala, podrobnosti naleznete v logu
# Preferences # Preferences
preferences.title=Nastavení preferences.title=Nastavení
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Ladicí režim
preferences.general.debugDirectory=Ukázat soubory se záznamy událostí (log) preferences.general.debugDirectory=Ukázat soubory se záznamy událostí (log)
preferences.general.autoStart=Spustit Cryptomator při spuštění systému preferences.general.autoStart=Spustit Cryptomator při spuštění systému
preferences.general.keychainBackend=Ukládat hesla pomocí preferences.general.keychainBackend=Ukládat hesla pomocí
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome klíčenka
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE KWallet
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Svazek klíčů
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection klíčenka
preferences.general.interfaceOrientation=Orientace prostředí preferences.general.interfaceOrientation=Orientace prostředí
preferences.general.interfaceOrientation.ltr=Zleva doprava preferences.general.interfaceOrientation.ltr=Zleva doprava
preferences.general.interfaceOrientation.rtl=Zprava doleva preferences.general.interfaceOrientation.rtl=Zprava doleva
@@ -304,12 +314,15 @@ wrongFileAlert.link=Pro další informace navštivte
## General ## General
vaultOptions.general=Obecné vaultOptions.general=Obecné
vaultOptions.general.vaultName=Název trezoru vaultOptions.general.vaultName=Název trezoru
vaultOptions.general.autoLock.lockAfterTimePart1=Uzamknout při nečinnosti po
vaultOptions.general.autoLock.lockAfterTimePart2=minut
vaultOptions.general.unlockAfterStartup=Odemknout trezor při spuštění Cryptomator vaultOptions.general.unlockAfterStartup=Odemknout trezor při spuštění Cryptomator
vaultOptions.general.actionAfterUnlock=Po úspěšném odemčení vaultOptions.general.actionAfterUnlock=Po úspěšném odemčení
vaultOptions.general.actionAfterUnlock.ignore=Nedělat nic vaultOptions.general.actionAfterUnlock.ignore=Nedělat nic
vaultOptions.general.actionAfterUnlock.reveal=Zobrazit jednotku vaultOptions.general.actionAfterUnlock.reveal=Zobrazit jednotku
vaultOptions.general.actionAfterUnlock.ask=Zeptat se vaultOptions.general.actionAfterUnlock.ask=Zeptat se
vaultOptions.general.healthBtn=Spuštění kontroly stavu vaultOptions.general.startHealthCheckBtn=Zahájit kontrolu stavu
## Mount ## Mount
vaultOptions.mount=Připojení vaultOptions.mount=Připojení
vaultOptions.mount.readonly=Pouze pro čtení vaultOptions.mount.readonly=Pouze pro čtení
@@ -325,13 +338,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Vyberte prázdný adresář
vaultOptions.masterkey=Heslo vaultOptions.masterkey=Heslo
vaultOptions.masterkey.changePasswordBtn=Změnit heslo vaultOptions.masterkey.changePasswordBtn=Změnit heslo
vaultOptions.masterkey.forgetSavedPasswordBtn=Zapomenout uložené heslo vaultOptions.masterkey.forgetSavedPasswordBtn=Zapomenout uložené heslo
vaultOptions.masterkey.recoveryKeyExpanation=Obnovovací klíč je váš jediný způsob, jak obnovit přístup k trezoru, pokud ztratíte své heslo. vaultOptions.masterkey.recoveryKeyExplanation=Obnovovací klíč je váš jediný způsob, jak obnovit přístup k trezoru, pokud ztratíte své heslo.
vaultOptions.masterkey.showRecoveryKeyBtn=Zobrazit klíč k obnově vaultOptions.masterkey.showRecoveryKeyBtn=Zobrazit klíč k obnově
vaultOptions.masterkey.recoverPasswordBtn=Obnovit heslo vaultOptions.masterkey.recoverPasswordBtn=Obnovit heslo
## Auto Lock
vaultOptions.autoLock=Automatické uzamčení
vaultOptions.autoLock.lockAfterTimePart1=Uzamknout při nečinnosti po
vaultOptions.autoLock.lockAfterTimePart2=minut
# Recovery Key # Recovery Key
recoveryKey.title=Klíč k obnově recoveryKey.title=Klíč k obnově
+49 -39
View File
@@ -13,8 +13,11 @@ generic.button.done=Fertig
generic.button.next=Weiter generic.button.next=Weiter
generic.button.print=Drucken generic.button.print=Drucken
## Error ## Error
generic.error.title=Ein unerwarteter Fehler ist aufgetreten generic.error.title=Fehler %s
generic.error.instruction=Das hätte nicht passieren dürfen. Bitte melde den folgenden Fehlertext und beschreibe kurz, durch welche Schritte der Fehler aufgetreten ist. generic.error.instruction=Ups! Das hat sich Cryptomator anders vorgestellt. Du kannst Lösungen für diesen Fehler nachschlagen oder einen neuen Fehlerbericht einreichen.
generic.error.hyperlink.lookup=Diesen Fehler nachschlagen
generic.error.hyperlink.report=Diesen Fehler melden
generic.error.technicalDetails=Details:
# Defaults # Defaults
defaults.vault.vaultName=Tresor defaults.vault.vaultName=Tresor
@@ -45,7 +48,7 @@ addvaultwizard.new.directoryPickerLabel=Eigener Ort
addvaultwizard.new.directoryPickerButton=Durchsuchen … addvaultwizard.new.directoryPickerButton=Durchsuchen …
addvaultwizard.new.directoryPickerTitle=Verzeichnis auswählen addvaultwizard.new.directoryPickerTitle=Verzeichnis auswählen
addvaultwizard.new.fileAlreadyExists=Eine Datei oder ein Ordner mit diesem Namen ist bereits vorhanden addvaultwizard.new.fileAlreadyExists=Eine Datei oder ein Ordner mit diesem Namen ist bereits vorhanden
addvaultwizard.new.locationDoesNotExist=Der Ordner im angegebenen Pfad existiert nicht oder kann nicht geöffnet werden addvaultwizard.new.locationDoesNotExist=Ein Ordner im angegebenen Pfad existiert nicht oder kann nicht geöffnet werden
addvaultwizard.new.locationIsNotWritable=Kein Schreibzugriff auf den angegebenen Pfad addvaultwizard.new.locationIsNotWritable=Kein Schreibzugriff auf den angegebenen Pfad
addvaultwizard.new.locationIsOk=Geeigneter Ort für deinen Tresor addvaultwizard.new.locationIsOk=Geeigneter Ort für deinen Tresor
addvaultwizard.new.invalidName=Ungültiger Tresorname. Bitte wähle einen regulären Namen, mit dem auch Verzeichnisse erstellt werden können. addvaultwizard.new.invalidName=Ungültiger Tresorname. Bitte wähle einen regulären Namen, mit dem auch Verzeichnisse erstellt werden können.
@@ -59,7 +62,7 @@ addvault.new.readme.storageLocation.fileName=WICHTIG.rtf
addvault.new.readme.storageLocation.1=⚠️ TRESOR-DATEIEN ⚠️ addvault.new.readme.storageLocation.1=⚠️ TRESOR-DATEIEN ⚠️
addvault.new.readme.storageLocation.2=Dies ist der Speicherort deines Tresors. addvault.new.readme.storageLocation.2=Dies ist der Speicherort deines Tresors.
addvault.new.readme.storageLocation.3=NICHT addvault.new.readme.storageLocation.3=NICHT
addvault.new.readme.storageLocation.4=• in diesem Verzeichnis Dateien ändern oder addvault.new.readme.storageLocation.4= Dateien in diesem Verzeichnis ändern oder
addvault.new.readme.storageLocation.5=• zu verschlüsselnde Dateien in diesem Verzeichnis ablegen. addvault.new.readme.storageLocation.5=• zu verschlüsselnde Dateien in diesem Verzeichnis ablegen.
addvault.new.readme.storageLocation.6=Falls du Dateien verschlüsseln und den Inhalt des Tresors anzeigen möchtest, befolge folgende Schritte: addvault.new.readme.storageLocation.6=Falls du Dateien verschlüsseln und den Inhalt des Tresors anzeigen möchtest, befolge folgende Schritte:
addvault.new.readme.storageLocation.7=1. Füge diesen Tresor zu Cryptomator hinzu. addvault.new.readme.storageLocation.7=1. Füge diesen Tresor zu Cryptomator hinzu.
@@ -73,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. addvault.new.readme.accessLocation.4=Diese Datei kannst du löschen.
## Existing ## Existing
addvaultwizard.existing.instruction=Wähle die Datei „masterkey.cryptomator“ deines vorhandenen Tresors aus. 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 addvaultwizard.existing.filePickerTitle=Masterkey-Datei auswählen
## Success ## 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. 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.
@@ -95,7 +98,7 @@ forgetPassword.information=Dies löscht das gespeicherte Passwort dieses Tresors
forgetPassword.confirmBtn=Passwort vergessen forgetPassword.confirmBtn=Passwort vergessen
# Unlock # Unlock
unlock.title=Tresor entsperren unlock.title="%s" entsperren
unlock.passwordPrompt=Gib das Passwort für „%s“ ein: unlock.passwordPrompt=Gib das Passwort für „%s“ ein:
unlock.savePassword=Passwort merken unlock.savePassword=Passwort merken
unlock.unlockBtn=Entsperren unlock.unlockBtn=Entsperren
@@ -119,7 +122,7 @@ lock.forced.message=Aufgrund von Zugriffen laufender Prozesse oder geöffneter D
lock.forced.confirmBtn=Sperren erzwingen lock.forced.confirmBtn=Sperren erzwingen
## Failure ## Failure
lock.fail.heading=Tresor konnte nicht gesperrt werden. lock.fail.heading=Tresor konnte nicht gesperrt werden.
lock.fail.message=Der Tresor „%s“ konnte nicht gesperrt werden. Stellen Sie sicher, dass Sie Ihre ungespeicherten Arbeit an anderer Stelle speichern und wichtige Lese-/Schreibvorgänge abgeschlossen sind. Um den Tresor zu schließen, beenden Sie den Cryptomator-Prozess. lock.fail.message=Der Tresor „%s“ konnte nicht gesperrt werden. Stelle sicher, dass du deine ungespeicherte Arbeit an anderer Stelle speicherst und wichtige Lese-/Schreibvorgänge abgeschlossen sind. Um den Tresor zu schließen, beende den Cryptomator-Prozess.
# Migration # Migration
migration.title=Tresor aktualisieren migration.title=Tresor aktualisieren
@@ -130,7 +133,7 @@ migration.start.confirm=Ja, mein Tresor ist vollständig synchronisiert
migration.run.enterPassword=Gib das Passwort für „%s“ ein migration.run.enterPassword=Gib das Passwort für „%s“ ein
migration.run.startMigrationBtn=Tresor migrieren migration.run.startMigrationBtn=Tresor migrieren
migration.run.progressHint=Dies kann einige Zeit dauern … migration.run.progressHint=Dies kann einige Zeit dauern …
## Sucess ## Success
migration.success.nextStepsInstructions=„%s“ erfolgreich migriert.\nDu kannst deinen Tresor jetzt entsperren. migration.success.nextStepsInstructions=„%s“ erfolgreich migriert.\nDu kannst deinen Tresor jetzt entsperren.
migration.success.unlockNow=Jetzt entsperren migration.success.unlockNow=Jetzt entsperren
## Missing file system capabilities ## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=Der Tresor kann nicht automatisch migriert werden, d
migration.impossible.moreInfo=Der Tresor kann auch jetzt noch mit einer älteren Version geöffnet werden. Eine Anleitung zum manuellen Migrieren eines Tresors findest du unter migration.impossible.moreInfo=Der Tresor kann auch jetzt noch mit einer älteren Version geöffnet werden. Eine Anleitung zum manuellen Migrieren eines Tresors findest du unter
# Health Check # Health Check
health.title=Tresor-Integritätsprüfung ## Start
health.start.introduction=Die Tresor-Integritätsprüfung ist eine Sammlung von Prüfungen, um Probleme in der internen Struktur deines Tresors zu erkennen und zu beheben. Bitte beachte, dass nicht alle Probleme behoben werden können. Du benötigst das Tresor-Passwort, um die Prüfungen durchzuführen. health.title=Integritätstest von "%s"
health.start.configValid=Das Lesen und Verarbeiten der Tresorkonfigurationsdatei war erfolgreich. Fahre fort, um Überprüfungen auszuwählen. health.intro.header=Zustandsprüfung
health.start.configInvalid=Fehler beim Lesen und Verarbeiten der Tresorkonfigurationsdatei. health.intro.text=Der Zustandscheck ist eine Sammlung von Tests, um Probleme mit der internen Struktur deines Tresores zu finden und möglicherweise zu reparieren. Bitte bedenke:
health.checkList.header=Verfügbare Integritätsprüfungen health.intro.remarkSync=Stelle sicher, dass alle Geräte vollständig synchronisiert sind. Dies löst die meisten Probleme.
health.checkList.selectAllBox=Alles auswählen health.intro.remarkFix=Nicht alle Probleme können gelöst werden.
health.intro.remarkBackup=Wenn Daten beschädigt sind, kann nur ein Backup helfen.
health.intro.affirmation=Ich habe die obenstehende Information gelesen und verstanden
## Start Failure
health.fail.header=Fehler beim Laden der Tresorkonfiguration
health.fail.ioError=Beim Lesezugriff auf die Konfigurationsdatei ist ein Fehler aufgetreten.
health.fail.parseError=Beim Parsen der Tresor-Konfiguration ist ein Fehler aufgetreten.
health.fail.moreInfo=Weitere Informationen
## Check Selection
health.checkList.description=Markiere Prüfungen in der linken Liste oder benutze die Knöpfe darunter.
health.checkList.selectAllButton=Alle Prüfungen auswählen
health.checkList.deselectAllButton=Alle Prüfungen abwählen
health.check.runBatchBtn=Ausgewählte Prüfungen ausführen health.check.runBatchBtn=Ausgewählte Prüfungen ausführen
## Detail view ## Detail view
health.check.detail.noSelectedCheck=Wähle für die Ergebnisse eine abgeschlossene Intregritätsprüfung in der Liste links aus. health.check.detail.noSelectedCheck=Wähle für die Ergebnisse eine abgeschlossene Integritätsprüfung in der Liste links aus.
health.check.detail.header=Ergebnisse für %s health.check.detail.checkScheduled=Die Prüfung ist geplant.
health.check.detail.taskNotStarted=Die Prüfung wurde nicht zum Ausführen ausgewählt. health.check.detail.checkRunning=Prüfung läuft…
health.check.detail.taskScheduled=Die Prüfung ist geplant. health.check.detail.checkSkipped=Die Prüfung wurde nicht zur Ausführung ausgewählt.
health.check.detail.taskRunning=Die Prüfung läuft derzeit … health.check.detail.checkFinished=Die Prüfung wurde erfolgreich abgeschlossen.
health.check.detail.taskSucceeded=Die Prüfung wurde nach %d Millisekunden erfolgreich beendet. health.check.detail.checkFinishedAndFound=Die Überprüfung wurde beendet. Bitte sichte die Ergebnisse.
health.check.detail.taskFailed=Die Prüfung wurde wegen eines Fehlers beendet. health.check.detail.checkFailed=Die Prüfung wurde wegen eines Fehlers beendet.
health.check.detail.taskCancelled=Die Prüfung wurde abgebrochen. health.check.detail.checkCancelled=Die Prüfung wurde abgebrochen.
health.check.detail.problemCount=%d Probleme und %d unbehebbare Fehler gefunden.
health.check.exportBtn=Bericht exportieren health.check.exportBtn=Bericht exportieren
health.check.fixBtn=Reparieren ## Fix Application
## Checks health.fix.fixBtn=Beheben
health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Verzeichnisüberprüfung health.fix.successTip=Fehlerbehebung erfolgreich
health.fix.failTip=Reparatur fehlgeschlagen, siehe Log für Details
# Preferences # Preferences
preferences.title=Einstellungen preferences.title=Einstellungen
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Diagnoseprotokoll aktivieren
preferences.general.debugDirectory=Protokolldateien anzeigen preferences.general.debugDirectory=Protokolldateien anzeigen
preferences.general.autoStart=Cryptomator beim Systemstart starten preferences.general.autoStart=Cryptomator beim Systemstart starten
preferences.general.keychainBackend=Passwörter speichern mit preferences.general.keychainBackend=Passwörter speichern mit
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome-Schlüsselbund
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS-Schlüsselbund-Zugriff
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows-Datenschutz
preferences.general.interfaceOrientation=Oberflächenausrichtung preferences.general.interfaceOrientation=Oberflächenausrichtung
preferences.general.interfaceOrientation.ltr=Von links nach rechts preferences.general.interfaceOrientation.ltr=Von links nach rechts
preferences.general.interfaceOrientation.rtl=Von rechts nach links preferences.general.interfaceOrientation.rtl=Von rechts nach links
@@ -251,7 +261,7 @@ main.debugModeEnabled.tooltip=Diagnosemodus ist aktiviert
main.donationKeyMissing.tooltip=Zieh bitte eine Spende in Betracht main.donationKeyMissing.tooltip=Zieh bitte eine Spende in Betracht
## Drag 'n' Drop ## Drag 'n' Drop
main.dropZone.dropVault=Diesen Tresor hinzufügen main.dropZone.dropVault=Diesen Tresor hinzufügen
main.dropZone.unknownDragboardContent=Wenn Sie einen Tresor hinzufügen möchten, ziehen Sie ihn in dieses Fenster main.dropZone.unknownDragboardContent=Falls du einen Tresor hinzufügen möchtest, zieh ihn in dieses Fenster
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klicke hier, um einen Tresor hinzuzufügen main.vaultlist.emptyList.onboardingInstruction=Klicke hier, um einen Tresor hinzuzufügen
main.vaultlist.contextMenu.remove=Entfernen … main.vaultlist.contextMenu.remove=Entfernen …
@@ -284,8 +294,8 @@ main.vaultDetail.stats=Tresorstatistik
### Missing ### Missing
main.vaultDetail.missing.info=Cryptomator konnte keinen Tresor mit diesem Pfad finden. main.vaultDetail.missing.info=Cryptomator konnte keinen Tresor mit diesem Pfad finden.
main.vaultDetail.missing.recheck=Erneut prüfen main.vaultDetail.missing.recheck=Erneut prüfen
main.vaultDetail.missing.remove=Aus Tresorliste entfernen… main.vaultDetail.missing.remove=Aus Tresorliste entfernen
main.vaultDetail.missing.changeLocation=Speicherort des Tresors ändern… main.vaultDetail.missing.changeLocation=Speicherort des Tresors ändern
### Needs Migration ### Needs Migration
main.vaultDetail.migrateButton=Tresor aktualisieren main.vaultDetail.migrateButton=Tresor aktualisieren
main.vaultDetail.migratePrompt=Dein Tresor muss auf ein neues Format aktualisiert werden, bevor du auf ihn zugreifen kannst main.vaultDetail.migratePrompt=Dein Tresor muss auf ein neues Format aktualisiert werden, bevor du auf ihn zugreifen kannst
@@ -304,12 +314,15 @@ wrongFileAlert.link=Besuche für weitere Hilfe
## General ## General
vaultOptions.general=Allgemein vaultOptions.general=Allgemein
vaultOptions.general.vaultName=Tresorname vaultOptions.general.vaultName=Tresorname
vaultOptions.general.autoLock.lockAfterTimePart1=Nach
vaultOptions.general.autoLock.lockAfterTimePart2=Minuten Inaktivität sperren
vaultOptions.general.unlockAfterStartup=Tresor beim Start von Cryptomator entsperren vaultOptions.general.unlockAfterStartup=Tresor beim Start von Cryptomator entsperren
vaultOptions.general.actionAfterUnlock=Nach erfolgreichem Entsperren vaultOptions.general.actionAfterUnlock=Nach erfolgreichem Entsperren
vaultOptions.general.actionAfterUnlock.ignore=Nichts tun vaultOptions.general.actionAfterUnlock.ignore=Nichts tun
vaultOptions.general.actionAfterUnlock.reveal=Laufwerk anzeigen vaultOptions.general.actionAfterUnlock.reveal=Laufwerk anzeigen
vaultOptions.general.actionAfterUnlock.ask=Nachfragen vaultOptions.general.actionAfterUnlock.ask=Nachfragen
vaultOptions.general.healthBtn=Integritätsprüfung starten vaultOptions.general.startHealthCheckBtn=Integritätsprüfung starten
## Mount ## Mount
vaultOptions.mount=Laufwerk vaultOptions.mount=Laufwerk
vaultOptions.mount.readonly=Schreibgeschützt vaultOptions.mount.readonly=Schreibgeschützt
@@ -325,13 +338,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Wähle ein leeres Verzeichnis
vaultOptions.masterkey=Passwort vaultOptions.masterkey=Passwort
vaultOptions.masterkey.changePasswordBtn=Passwort ändern vaultOptions.masterkey.changePasswordBtn=Passwort ändern
vaultOptions.masterkey.forgetSavedPasswordBtn=Gespeichertes Passwort vergessen vaultOptions.masterkey.forgetSavedPasswordBtn=Gespeichertes Passwort vergessen
vaultOptions.masterkey.recoveryKeyExpanation=Dein Wiederherstellungsschlüssel gehört nur dir! Dieser wird benötigt, um deinen Tresor wiederherzustellen, für den Fall das du dein Passwort verloren hast. vaultOptions.masterkey.recoveryKeyExplanation=Dein Wiederherstellungsschlüssel gehört nur dir! Dieser wird benötigt, um deinen Tresor wiederherzustellen, für den Fall das du dein Passwort verloren hast.
vaultOptions.masterkey.showRecoveryKeyBtn=Wiederherstellungsschlüssel anzeigen vaultOptions.masterkey.showRecoveryKeyBtn=Wiederherstellungsschlüssel anzeigen
vaultOptions.masterkey.recoverPasswordBtn=Passwort wiederherstellen vaultOptions.masterkey.recoverPasswordBtn=Passwort wiederherstellen
## Auto Lock
vaultOptions.autoLock=Autom. Sperren
vaultOptions.autoLock.lockAfterTimePart1=Nach
vaultOptions.autoLock.lockAfterTimePart2=Minuten Inaktivität sperren
# Recovery Key # Recovery Key
recoveryKey.title=Wiederherstellungsschlüssel recoveryKey.title=Wiederherstellungsschlüssel
+36 -31
View File
@@ -13,8 +13,6 @@ generic.button.done=Κλείσιμο
generic.button.next=Επόμενο generic.button.next=Επόμενο
generic.button.print=Εκτύπωση generic.button.print=Εκτύπωση
## Error ## Error
generic.error.title=Παρουσιάστηκε ένα απροσδόκητο σφάλμα
generic.error.instruction=Αυτό δεν έπρεπε να συμβεί. Παρακαλώ αντιγράψτε το κείμενο του σφάλματος και επισυνάψτε μια περιγραφή των βημάτων που οδήγησαν σε αυτό το σφάλμα.
# Defaults # Defaults
defaults.vault.vaultName=Vault defaults.vault.vaultName=Vault
@@ -95,7 +93,7 @@ forgetPassword.information=Ο αποθηκευμένος κωδικός αυτο
forgetPassword.confirmBtn=Ξέχασα τον κωδικό πρόσβασης forgetPassword.confirmBtn=Ξέχασα τον κωδικό πρόσβασης
# Unlock # Unlock
unlock.title=Ξεκλείδωμα Vault unlock.title=Ξεκλειδώστε "%s"
unlock.passwordPrompt=Εισάγετε τον κωδικό για "%s": unlock.passwordPrompt=Εισάγετε τον κωδικό για "%s":
unlock.savePassword=Απομνημόνευση κωδικού πρόσβασης unlock.savePassword=Απομνημόνευση κωδικού πρόσβασης
unlock.unlockBtn=Ξεκλείδωμα unlock.unlockBtn=Ξεκλείδωμα
@@ -130,7 +128,7 @@ migration.start.confirm=Ναι, το vault μου είναι πλήρως συγ
migration.run.enterPassword=Εισάγετε τον κωδικό για "%s" migration.run.enterPassword=Εισάγετε τον κωδικό για "%s"
migration.run.startMigrationBtn=Ενσωμάτωση Vault migration.run.startMigrationBtn=Ενσωμάτωση Vault
migration.run.progressHint=Αυτό θα πάρει αρκετό χρόνο… migration.run.progressHint=Αυτό θα πάρει αρκετό χρόνο…
## Sucess ## Success
migration.success.nextStepsInstructions="%s" συγχωνεύτηκε επιτυχώς.\nΜπορείτε να ξεκλειδώσετε το vault σας. migration.success.nextStepsInstructions="%s" συγχωνεύτηκε επιτυχώς.\nΜπορείτε να ξεκλειδώσετε το vault σας.
migration.success.unlockNow=Ξεκλείδωμα τώρα migration.success.unlockNow=Ξεκλείδωμα τώρα
## Missing file system capabilities ## Missing file system capabilities
@@ -146,27 +144,38 @@ migration.impossible.reason=Το vault δεν μπορεί να συγχωνευ
migration.impossible.moreInfo=Το vault μπορεί να ανοιχθεί με παλαιότερη έκδοση. Για οδηγίες χειροκίνητης συγχώνευσης του vault, επισκεφτείτε migration.impossible.moreInfo=Το vault μπορεί να ανοιχθεί με παλαιότερη έκδοση. Για οδηγίες χειροκίνητης συγχώνευσης του vault, επισκεφτείτε
# Health Check # Health Check
health.title=Έλεγχος Υγείας Vault ## Start
health.start.introduction=Ο Έλεγχος Υγείας του Vault είναι μια σειρά από ελέγχους για ανίχνευση και επιδιόρθωση των προβλημάτων στην εσωτερική δομή του Vault σας. Παρακαλώ σημειώστε, ότι δεν μπορούν να διορθωθούν όλα τα προβλήματα. Χρειάζεστε τον κωδικό πρόσβασης Vault για να εκτελέσετε τους ελέγχους. health.title=Έλεγχος υγείας του "%s"
health.start.configValid=Η ανάγνωση και η ανάλυση του αρχείου ρυθμίσεων του Vault ήταν επιτυχής. Συνεχίστε για να επιλέξετε ελέγχους. health.intro.header=Έλεγχος υγείας
health.start.configInvalid=Σφάλμα κατά την ανάγνωση και ανάλυση του αρχείου ρυθμίσεων του Vault. health.intro.text=Ο Έλεγχος Υγείας είναι μια συλλογή ελέγχων για τον εντοπισμό και ενδεχομένως την επίλυση προβλημάτων στην εσωτερική δομή του vault σας. Παρακαλώ λάβετε υπόψη:
health.checkList.header=Διαθέσιμοι Έλεγχοι Υγείας health.intro.remarkSync=Βεβαιωθείτε ότι όλες οι συσκευές είναι πλήρως συγχρονισμένες, αυτό επιλύει τα περισσότερα προβλήματα.
health.checkList.selectAllBox=Επιλογή όλων health.intro.remarkFix=Δεν μπορούν να διορθωθούν όλα τα προβλήματα.
health.intro.remarkBackup=Εάν τα δεδομένα είναι κατεστραμμένα, μόνο ένα αντίγραφο ασφαλείας μπορεί να βοηθήσει.
health.intro.affirmation=Έχω διαβάσει και κατανοήσει τις παραπάνω πληροφορίες
## Start Failure
health.fail.header=Σφάλμα κατά τη φόρτωση παραμέτρων του Vault
health.fail.ioError=Παρουσιάστηκε σφάλμα κατά την πρόσβαση και ανάγνωση του αρχείου ρυθμίσεων.
health.fail.parseError=Παρουσιάστηκε σφάλμα κατά την ανάλυση των ρυθμίσεων του vault.
health.fail.moreInfo=Περισσότερες Πληροφορίες
## Check Selection
health.checkList.description=Επιλέξτε τους ελέγχους στην αριστερή λίστα ή χρησιμοποιήστε τα παρακάτω κουμπιά.
health.checkList.selectAllButton=Επιλογή Όλων Των Ελέγχων
health.checkList.deselectAllButton=Αποεπιλογή Όλων Των Ελέγχων
health.check.runBatchBtn=Εκτέλεση επιλεγμένων ελέγχων health.check.runBatchBtn=Εκτέλεση επιλεγμένων ελέγχων
## Detail view ## Detail view
health.check.detail.noSelectedCheck=Για τα αποτελέσματα επιλέξτε έναν ολοκληρωμένο έλεγχο υγείας στην αριστερή λίστα. health.check.detail.noSelectedCheck=Για τα αποτελέσματα επιλέξτε έναν ολοκληρωμένο έλεγχο υγείας στην αριστερή λίστα.
health.check.detail.header=Αποτελέσματα από %s health.check.detail.checkScheduled=Ο έλεγχος έχει προγραμματιστεί.
health.check.detail.taskNotStarted=Ο έλεγχος δεν επιλέχθηκε για εκτέλεση. health.check.detail.checkRunning=Ο έλεγχος εκτελείται αυτήν τη στιγμή…
health.check.detail.taskScheduled=Ο έλεγχος έχει προγραμματιστεί. health.check.detail.checkSkipped=Ο έλεγχος δεν επιλέχθηκε για εκτέλεση.
health.check.detail.taskRunning=Ο έλεγχος εκτελείται αυτήν τη στιγμή… health.check.detail.checkFinished=Ο έλεγχος ολοκληρώθηκε με επιτυχία.
health.check.detail.taskSucceeded=Ο έλεγχος ολοκληρώθηκε επιτυχώς μετά από %d χιλιοστά του δευτερολέπτου. health.check.detail.checkFinishedAndFound=Ο έλεγχος σταμάτησε να εκτελείται. Παρακαλώ εξετάστε τα αποτελέσματα.
health.check.detail.taskFailed=Ο έλεγχος τερματίστηκε λόγω σφάλματος. health.check.detail.checkFailed=Ο έλεγχος τερματίστηκε λόγω σφάλματος.
health.check.detail.taskCancelled=Ο έλεγχος ακυρώθηκε. health.check.detail.checkCancelled=Ο έλεγχος ακυρώθηκε.
health.check.detail.problemCount=Βρέθηκαν %d προβλήματα και %d μη επιδιορθώσιμα σφάλματα.
health.check.exportBtn=Εξαγωγή Αναφοράς health.check.exportBtn=Εξαγωγή Αναφοράς
health.check.fixBtn=Επιδιόρθωση ## Fix Application
## Checks health.fix.fixBtn=Επιδιόρθωση
health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Έλεγχος Φακέλου health.fix.successTip=Επιτυχής επιδιόρθωση
health.fix.failTip=Επιδιόρθωση απέτυχε, δείτε το αρχείο καταγραφής για λεπτομέρειες
# Preferences # Preferences
preferences.title=Προτιμήσεις preferences.title=Προτιμήσεις
@@ -184,10 +193,6 @@ preferences.general.debugLogging=Ενεργοποίηση καταγραφής
preferences.general.debugDirectory=Αποκάλυψη αρχείων καταγραφής preferences.general.debugDirectory=Αποκάλυψη αρχείων καταγραφής
preferences.general.autoStart=Εκκίνηση Cryptomator στην εκκίνηση του συστήματος preferences.general.autoStart=Εκκίνηση Cryptomator στην εκκίνηση του συστήματος
preferences.general.keychainBackend=Αποθήκευση κωδικού πρόσβασης με preferences.general.keychainBackend=Αποθήκευση κωδικού πρόσβασης με
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Keychain πρόσβαση
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Προστασία δεδομένων Windows
preferences.general.interfaceOrientation=Προσανατολισμός εφαρμογής preferences.general.interfaceOrientation=Προσανατολισμός εφαρμογής
preferences.general.interfaceOrientation.ltr=Αριστερά προς δεξιά preferences.general.interfaceOrientation.ltr=Αριστερά προς δεξιά
preferences.general.interfaceOrientation.rtl=Δεξιά προς αριστερά preferences.general.interfaceOrientation.rtl=Δεξιά προς αριστερά
@@ -304,12 +309,15 @@ wrongFileAlert.link=Για παραπάνω βοήθεια, επισκεφτεί
## General ## General
vaultOptions.general=Γενικά vaultOptions.general=Γενικά
vaultOptions.general.vaultName=Όνομα Vault vaultOptions.general.vaultName=Όνομα Vault
vaultOptions.general.autoLock.lockAfterTimePart1=Κλείδωμα όταν παραμένει σε αδράνεια για
vaultOptions.general.autoLock.lockAfterTimePart2=λεπτά
vaultOptions.general.unlockAfterStartup=Ξεκλείδωμα vault όταν ξεκινά το Cryptomator vaultOptions.general.unlockAfterStartup=Ξεκλείδωμα vault όταν ξεκινά το 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=Ρώτα
vaultOptions.general.healthBtn=Έναρξη ελέγχου Υγείας Vault vaultOptions.general.startHealthCheckBtn=Έναρξη ελέγχου Υγείας
## Mount ## Mount
vaultOptions.mount=Προσάρτηση vaultOptions.mount=Προσάρτηση
vaultOptions.mount.readonly=Μόνο για ανάγνωση vaultOptions.mount.readonly=Μόνο για ανάγνωση
@@ -325,13 +333,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Επιλέξτε ένα άδ
vaultOptions.masterkey=Κωδικός πρόσβασης vaultOptions.masterkey=Κωδικός πρόσβασης
vaultOptions.masterkey.changePasswordBtn=Αλλαγή κωδικού πρόσβασης vaultOptions.masterkey.changePasswordBtn=Αλλαγή κωδικού πρόσβασης
vaultOptions.masterkey.forgetSavedPasswordBtn=Διαγραφή αποθηκευμένου κωδικού vaultOptions.masterkey.forgetSavedPasswordBtn=Διαγραφή αποθηκευμένου κωδικού
vaultOptions.masterkey.recoveryKeyExpanation=Το κλειδί ασφαλείας είναι ο μόνος τρόπος ανάκτησης πρόσβασης στο vault αν χάσετε τον κωδικό σας. vaultOptions.masterkey.recoveryKeyExplanation=Το κλειδί ασφαλείας είναι ο μόνος τρόπος ανάκτησης πρόσβασης σε ένα vault αν χάσετε τον κωδικό σας.
vaultOptions.masterkey.showRecoveryKeyBtn=Προβολή κλειδιού ανάκτησης vaultOptions.masterkey.showRecoveryKeyBtn=Προβολή κλειδιού ανάκτησης
vaultOptions.masterkey.recoverPasswordBtn=Ανάκτηση κωδικού vaultOptions.masterkey.recoverPasswordBtn=Ανάκτηση κωδικού
## Auto Lock
vaultOptions.autoLock=Αυτόματο Κλείδωμα
vaultOptions.autoLock.lockAfterTimePart1=Κλείδωμα όταν παραμένει σε αδράνεια για
vaultOptions.autoLock.lockAfterTimePart2=λεπτά
# Recovery Key # Recovery Key
recoveryKey.title=Κλειδί Ανάκτησης recoveryKey.title=Κλειδί Ανάκτησης
+46 -31
View File
@@ -13,8 +13,11 @@ generic.button.done=Hecho
generic.button.next=Continuar generic.button.next=Continuar
generic.button.print=Imprimir generic.button.print=Imprimir
## Error ## Error
generic.error.title=Ocurrió un error inesperado generic.error.title=Error %s
generic.error.instruction=Esto no debió suceder. Notifique el error de abajo e incluya una descripción de los pasos que llevaron a este error. generic.error.instruction=¡Ups! Cryptomator no esperaba que esto sucediera. Puede buscar soluciones existentes para este error. O si aún no se ha notiicado, siéntase libre de hacerlo.
generic.error.hyperlink.lookup=Buscar este error
generic.error.hyperlink.report=Notificar este error
generic.error.technicalDetails=Detalles:
# Defaults # Defaults
defaults.vault.vaultName=Bóveda defaults.vault.vaultName=Bóveda
@@ -95,7 +98,7 @@ forgetPassword.information=Esto eliminará la contraseña guardada de esta bóve
forgetPassword.confirmBtn=Olvidar contraseña forgetPassword.confirmBtn=Olvidar contraseña
# Unlock # Unlock
unlock.title=Desbloquear bóveda unlock.title=Desbloquear "%s"
unlock.passwordPrompt=Ingresar contraseña para "%s": unlock.passwordPrompt=Ingresar contraseña para "%s":
unlock.savePassword=Recordar contraseña unlock.savePassword=Recordar contraseña
unlock.unlockBtn=Desbloquear unlock.unlockBtn=Desbloquear
@@ -130,7 +133,7 @@ migration.start.confirm=Sí, mi bóveda está sincronizada
migration.run.enterPassword=Ingresar la contraseña para "%s" migration.run.enterPassword=Ingresar la contraseña para "%s"
migration.run.startMigrationBtn=Migrar bóveda migration.run.startMigrationBtn=Migrar bóveda
migration.run.progressHint=Esto puede tardar un poco… migration.run.progressHint=Esto puede tardar un poco…
## Sucess ## Success
migration.success.nextStepsInstructions="%s" se migró con éxito.\nYa se puede desbloquear la bóveda. migration.success.nextStepsInstructions="%s" se migró con éxito.\nYa se puede desbloquear la bóveda.
migration.success.unlockNow=Desbloquear ahora migration.success.unlockNow=Desbloquear ahora
## Missing file system capabilities ## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=La bóveda no puede migrarse automáticamente porque
migration.impossible.moreInfo=La bóveda aún se puede abrir con una versión anterior. Para obtener instrucciones en cómo migrar manualmente una bóveda, visite migration.impossible.moreInfo=La bóveda aún se puede abrir con una versión anterior. Para obtener instrucciones en cómo migrar manualmente una bóveda, visite
# Health Check # Health Check
health.title=Comprobación del Estado de la Bóveda ## Start
health.start.introduction=La comprobación del estado de la bóveda es un conjunto de pruebas para detectar y posiblemente solucionar los problemas de la estructura interna de la bóveda. Tenga en cuenta que no todos los problemas son corregibles. Necesita la contraseña de la bóveda para realizar las comprobaciones. health.title=Comprobador de estado de "%s"
health.start.configValid=La lectura y análisis del archivo de configuración de la bóveda fueron correctos. Proceda a seleccionar las comprobaciones. health.intro.header=Comprobador de estado
health.start.configInvalid=Error al leer y analizar el archivo de configuración de la bóveda. health.intro.text=El comprobador de estado es una colección de comprobaciones para detectar y posiblemente corregir problemas en la estructura interna de su bóveda. Tome en cuenta:
health.checkList.header=Comprobaciones del estado disponibles health.intro.remarkSync=Asegúrese de que todos los dispositivos están completamente sincronizados, esto resuelve la mayoría de los problemas.
health.checkList.selectAllBox=Seleccionar todo health.intro.remarkFix=No todos los problemas se pueden solucionar.
health.intro.remarkBackup=Si los datos están dañados, solo una copia de seguridad puede ayudar.
health.intro.affirmation=He leído y entendido la información anterior
## Start Failure
health.fail.header=Error al cargar la configuración de la bóveda
health.fail.ioError=Ocurrió un error al acceder y leer el archivo de configuración.
health.fail.parseError=Ocurrió un error mientras se analizaba la configuración de la bóveda.
health.fail.moreInfo=Más información
## Check Selection
health.checkList.description=Seleccione las comprobaciones en la lista de la izquierda o utilice los botones de abajo.
health.checkList.selectAllButton=Seleccionar todas las comprobaciones
health.checkList.deselectAllButton=Deseleccionar todas las comprobaciones
health.check.runBatchBtn=Ejecutar las comprobaciones seleccionadas health.check.runBatchBtn=Ejecutar las comprobaciones seleccionadas
## Detail view ## Detail view
health.check.detail.noSelectedCheck=Para los resultados seleccione una comprobación del estado en la lista de la izquierda health.check.detail.noSelectedCheck=Para los resultados seleccione una comprobación del estado en la lista de la izquierda
health.check.detail.header=Resultados de %s health.check.detail.checkScheduled=La comprobación está programada.
health.check.detail.taskNotStarted=No se ha seleccionado la comprobación para ejecutarse. health.check.detail.checkRunning=La comprobación se está ejecutando…
health.check.detail.taskScheduled=La comprobación está programada. health.check.detail.checkSkipped=No se ha seleccionado la comprobación para ejecutarse.
health.check.detail.taskRunning=La comprobación se está ejecutando… health.check.detail.checkFinished=La comprobación terminó con éxito.
health.check.detail.taskSucceeded=La comprobación finalizó correctamente después de %d milisegundos. health.check.detail.checkFinishedAndFound=La comprobación terminó de ejecutarse. Revise los resultados.
health.check.detail.taskFailed=La comprobación terminó debido a un error. health.check.detail.checkFailed=La comprobación terminó debido a un error.
health.check.detail.taskCancelled=La comprobación se canceló. health.check.detail.checkCancelled=La comprobación se canceló.
health.check.detail.problemCount=Se encontraron %d problemas y %d errores no corregibles.
health.check.exportBtn=Exportar informe health.check.exportBtn=Exportar informe
health.check.fixBtn=Reparar ## Fix Application
## Checks health.fix.fixBtn=Reparar
health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Comprobar directorio health.fix.successTip=Reparación exitosa
health.fix.failTip=Reparación fallida, ver el registro para más detalles
# Preferences # Preferences
preferences.title=Preferencias preferences.title=Preferencias
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Habilitar registro de depuración
preferences.general.debugDirectory=Revelar archivos de registro preferences.general.debugDirectory=Revelar archivos de registro
preferences.general.autoStart=Cargar Cryptomator al iniciar el sistema preferences.general.autoStart=Cargar Cryptomator al iniciar el sistema
preferences.general.keychainBackend=Guardar contraseñas con preferences.general.keychainBackend=Guardar contraseñas con
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=Acceso a llaveros macOS
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Protección de Datos de Windows
preferences.general.interfaceOrientation=Orientación de la interfaz preferences.general.interfaceOrientation=Orientación de la interfaz
preferences.general.interfaceOrientation.ltr=Izquierda a derecha preferences.general.interfaceOrientation.ltr=Izquierda a derecha
preferences.general.interfaceOrientation.rtl=Derecha a izquierda preferences.general.interfaceOrientation.rtl=Derecha a izquierda
@@ -203,6 +213,11 @@ preferences.updates.autoUpdateCheck=Buscar actualizaciones automáticamente
preferences.updates.checkNowBtn=Buscar ahora preferences.updates.checkNowBtn=Buscar ahora
preferences.updates.updateAvailable=Actualización a la versión %s disponible. preferences.updates.updateAvailable=Actualización a la versión %s disponible.
## Contribution ## Contribution
preferences.contribute=Apóyenos
preferences.contribute.registeredFor=Certificado de soporte registrado para %s
preferences.contribute.noCertificate=Apoye a Cryptomator y reciba un certificado de seguidor. Es como una clave de licencia, pero para gente asombrosa usando software libre. ;-)
preferences.contribute.getCertificate=¿Aún no tiene una? Aprenda cómo puede obtenerlo.
preferences.contribute.promptText=Pegue aquí el código de certificado de seguidor
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -299,12 +314,15 @@ wrongFileAlert.link=Para más ayuda, visite
## General ## General
vaultOptions.general=General vaultOptions.general=General
vaultOptions.general.vaultName=Nombre de la bóveda vaultOptions.general.vaultName=Nombre de la bóveda
vaultOptions.general.autoLock.lockAfterTimePart1=Bloquear después de
vaultOptions.general.autoLock.lockAfterTimePart2=minutos
vaultOptions.general.unlockAfterStartup=Desbloquear bóveda al iniciar Cryptomator vaultOptions.general.unlockAfterStartup=Desbloquear bóveda al iniciar Cryptomator
vaultOptions.general.actionAfterUnlock=Después de desbloquear exitosamente vaultOptions.general.actionAfterUnlock=Después de desbloquear exitosamente
vaultOptions.general.actionAfterUnlock.ignore=No hacer nada vaultOptions.general.actionAfterUnlock.ignore=No hacer nada
vaultOptions.general.actionAfterUnlock.reveal=Revelar unidad vaultOptions.general.actionAfterUnlock.reveal=Revelar unidad
vaultOptions.general.actionAfterUnlock.ask=Preguntar vaultOptions.general.actionAfterUnlock.ask=Preguntar
vaultOptions.general.healthBtn=Iniciar comprobación del estado vaultOptions.general.startHealthCheckBtn=Iniciar comprobación de estado
## Mount ## Mount
vaultOptions.mount=Montaje vaultOptions.mount=Montaje
vaultOptions.mount.readonly=Sólo lectura vaultOptions.mount.readonly=Sólo lectura
@@ -320,13 +338,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Elegir un directorio vacío
vaultOptions.masterkey=Contraseña vaultOptions.masterkey=Contraseña
vaultOptions.masterkey.changePasswordBtn=Cambiar contraseña vaultOptions.masterkey.changePasswordBtn=Cambiar contraseña
vaultOptions.masterkey.forgetSavedPasswordBtn=Olvidar contraseña guardada vaultOptions.masterkey.forgetSavedPasswordBtn=Olvidar contraseña guardada
vaultOptions.masterkey.recoveryKeyExpanation=Una clave de recuperación es el único medio para restaurar el acceso a una bóveda si pierde su contraseña. vaultOptions.masterkey.recoveryKeyExplanation=Una clave de recuperación es el único medio para restaurar el acceso a una bóveda si pierde su contraseña.
vaultOptions.masterkey.showRecoveryKeyBtn=Mostrar clave de recuperación vaultOptions.masterkey.showRecoveryKeyBtn=Mostrar clave de recuperación
vaultOptions.masterkey.recoverPasswordBtn=Recuperar contraseña vaultOptions.masterkey.recoverPasswordBtn=Recuperar contraseña
## Auto Lock
vaultOptions.autoLock=Autobloqueo
vaultOptions.autoLock.lockAfterTimePart1=Bloquear después de
vaultOptions.autoLock.lockAfterTimePart2=minutos
# Recovery Key # Recovery Key
recoveryKey.title=Clave de recuperación recoveryKey.title=Clave de recuperación
+44 -34
View File
@@ -13,8 +13,11 @@ generic.button.done=Terminé
generic.button.next=Suivant generic.button.next=Suivant
generic.button.print=Imprimer generic.button.print=Imprimer
## Error ## Error
generic.error.title=Une erreur inattendue est survenue generic.error.title=Erreur: %s
generic.error.instruction=Cela n'aurait pas dû se produire. Veuillez reporter le texte d'erreur ci-dessous et inclure une description des étapes qui ont conduit à cette erreur. generic.error.instruction=Oups ! Cryptomator ne s'attendait pas à ce que cela se produise. Vous pouvez rechercher des solutions existantes pour cette erreur. Ou si elle n'a pas encore été signalée, n'hésitez pas à le faire.
generic.error.hyperlink.lookup=Rechercher cette erreur
generic.error.hyperlink.report=Signaler cette erreur
generic.error.technicalDetails=Détails:
# Defaults # Defaults
defaults.vault.vaultName=Coffre defaults.vault.vaultName=Coffre
@@ -60,7 +63,7 @@ addvault.new.readme.storageLocation.1=Fichiers de coffre-fort
addvault.new.readme.storageLocation.2=Ceci est le chemin de votre coffre-fort. addvault.new.readme.storageLocation.2=Ceci est le chemin de votre coffre-fort.
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 n'importe quel fichier dans ce répertoire ou
addvault.new.readme.storageLocation.5=Collez n'importe quel fichier à crypter dans ce répertoire. addvault.new.readme.storageLocation.5=Collez n'importe quel 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.
addvault.new.readme.storageLocation.8=2. Déverrouillez le coffre-fort dans Cryptomator. addvault.new.readme.storageLocation.8=2. Déverrouillez le coffre-fort dans Cryptomator.
@@ -69,7 +72,7 @@ addvault.new.readme.storageLocation.10=Si vous avez besoin d'aide, consultez la
addvault.new.readme.accessLocation.fileName=BIENVENUE.rtf addvault.new.readme.accessLocation.fileName=BIENVENUE.rtf
addvault.new.readme.accessLocation.1=🔐 VOLUME CHIFFRÉ 🔐 addvault.new.readme.accessLocation.1=🔐 VOLUME CHIFFRÉ 🔐
addvault.new.readme.accessLocation.2=Ceci est le chemin d'accès de votre coffre-fort. addvault.new.readme.accessLocation.2=Ceci est le chemin d'accès de votre coffre-fort.
addvault.new.readme.accessLocation.3=Tous les fichiers ajoutés à ce volume seront crypté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 à tout le temps. 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 à tout le temps.
addvault.new.readme.accessLocation.4=Vous pouvez supprimer ce fichier. addvault.new.readme.accessLocation.4=Vous pouvez supprimer ce fichier.
## Existing ## Existing
addvaultwizard.existing.instruction=Sélectionner le fichier "masterkey.cryptomator" de votre coffre existant. addvaultwizard.existing.instruction=Sélectionner le fichier "masterkey.cryptomator" de votre coffre existant.
@@ -90,12 +93,12 @@ changepassword.enterOldPassword=Entrez le mot de passe actuel pour "%s"
changepassword.finalConfirmation=Je comprends que je ne pourrai pas récupérer mes données si j'oublie mon mot de passe changepassword.finalConfirmation=Je comprends que je ne pourrai pas récupérer mes données si j'oublie mon mot de passe
# Forget Password # Forget Password
forgetPassword.title=Mot de passe oublié forgetPassword.title=Oublier le mot de passe
forgetPassword.information=Ceci supprimera le mot de passe enregistré pour ce coffre de votre chaîne de clés système. forgetPassword.information=Ceci supprimera le mot de passe enregistré pour ce coffre de votre chaîne de clés système.
forgetPassword.confirmBtn=Oublier le mot de passe forgetPassword.confirmBtn=Oublier le mot de passe
# Unlock # Unlock
unlock.title=Déverrouiller le coffre unlock.title=Déverrouiller %s
unlock.passwordPrompt=Entrez le mot de passe pour “%s” : unlock.passwordPrompt=Entrez le mot de passe pour “%s” :
unlock.savePassword=Mémoriser le mot de passe unlock.savePassword=Mémoriser le mot de passe
unlock.unlockBtn=Déverrouiller unlock.unlockBtn=Déverrouiller
@@ -130,7 +133,7 @@ migration.start.confirm=Oui, mon coffre est bien synchronisé
migration.run.enterPassword=Entrez le mot de passe pour %s migration.run.enterPassword=Entrez le mot de passe pour %s
migration.run.startMigrationBtn=Migrer le coffre migration.run.startMigrationBtn=Migrer le coffre
migration.run.progressHint=Ceci peut prendre un certain temps… migration.run.progressHint=Ceci peut prendre un certain temps…
## Sucess ## Success
migration.success.nextStepsInstructions=“%s” migré.\nVous pouvez à présent déverrouiller ce coffre. migration.success.nextStepsInstructions=“%s” migré.\nVous pouvez à présent déverrouiller ce coffre.
migration.success.unlockNow=Déverrouiller migration.success.unlockNow=Déverrouiller
## Missing file system capabilities ## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=Le coffre-fort ne peut pas être migré automatiquem
migration.impossible.moreInfo=Le coffre-fort peut encore être ouvert avec une version plus ancienne. Pour obtenir des instructions sur la façon de migrer manuellement un coffre-fort, visitez migration.impossible.moreInfo=Le coffre-fort peut encore être ouvert avec une version plus ancienne. Pour obtenir des instructions sur la façon de migrer manuellement un coffre-fort, visitez
# Health Check # Health Check
health.title=Vérification de l'état de la chambre forte ## Start
health.start.introduction=La vérification d'état du coffre fort est une collection de vérifications pour détecter et possiblement corriger certains problèmes dans sa structure. Notez que tous les problèmes ne peuvent pas être réglés. Il vous faut le mot de passe de votre coffre fort pour effectuer ces vérifications. health.title=Vérifier l'état de "%s"
health.start.configValid=La lecture et le parcours de la configuration se sont déroulés avec succès. Continuez avec la sélection des vérifications. health.intro.header=Vérifier l'état
health.start.configInvalid=Erreur lors de la lecture et de l'analyse du fichier de configuration du coffre. health.intro.text=Le bilan de santé est une série de vérifications pour détecter et corriger d'éventuels problèmes de structure interne au coffre. Rappelez-vous :
health.checkList.header=Tests de santé disponibles health.intro.remarkSync=S'assurer que tous les appareils sont complètement synchronisés résout la plupart des problèmes.
health.checkList.selectAllBox=Tout sélectionner health.intro.remarkFix=Certains problèmes ne peuvent pas être corrigés.
health.intro.remarkBackup=Si des données sont corrompues, la seule solution est une sauvegarde.
health.intro.affirmation=J'ai lu et compris les informations ci-dessus
## Start Failure
health.fail.header=Erreur lors du chargement de la configuration du coffre
health.fail.ioError=Une erreur s'est produite lors de l'accès et de la lecture du fichier de configuration.
health.fail.parseError=Une erreur est survenue pendant la lecture de la configuration du coffre.
health.fail.moreInfo=Plus d'informations
## Check Selection
health.checkList.description=Sélectionnez les contrôles dans la liste de gauche ou utilisez les boutons ci-dessous.
health.checkList.selectAllButton=Sélectionner toutes les vérifications
health.checkList.deselectAllButton=Désélectionner toutes les vérifications
health.check.runBatchBtn=Exécuter les vérifications sélectionnées health.check.runBatchBtn=Exécuter les vérifications sélectionnées
## Detail view ## Detail view
health.check.detail.noSelectedCheck=Pour les résultats, sélectionnez un bilan de santé terminé dans la liste de gauche. health.check.detail.noSelectedCheck=Pour les résultats, sélectionnez un bilan de santé terminé dans la liste de gauche.
health.check.detail.header=Résultats de %s health.check.detail.checkScheduled=La vérification est programmée.
health.check.detail.taskNotStarted=La vérification n'a pas été sélectionnée pour être exécutée. health.check.detail.checkRunning=Vérification en cours d'exécution…
health.check.detail.taskScheduled=La vérification est programmée. health.check.detail.checkSkipped=La vérification n'a pas été sélectionnée pour être exécutée.
health.check.detail.taskRunning=Vérification en cours d'exécution… health.check.detail.checkFinished=La vérification s'est terminée avec succès.
health.check.detail.taskSucceeded=La vérification s'est terminée avec succès après %d millisecondes. health.check.detail.checkFinishedAndFound=La vérification s'est terminée. Veuillez vérifier les résultats.
health.check.detail.taskFailed=La vérification s'est arrêté en raison d'une erreur. health.check.detail.checkFailed=La vérification s'est arrêtée en raison d'une erreur.
health.check.detail.taskCancelled=Vérification annulée. health.check.detail.checkCancelled=Vérification annulée.
health.check.detail.problemCount=%d problèmes trouvés et %d erreurs non corrigeables.
health.check.exportBtn=Exporter le rapport health.check.exportBtn=Exporter le rapport
health.check.fixBtn=Corriger ## Fix Application
## Checks health.fix.fixBtn=Réparer
health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Vérification du répertoire health.fix.successTip=Réparation réussie
health.fix.failTip=Correction échouée, voir le journal pour plus de détails
# Preferences # Preferences
preferences.title=Préférences preferences.title=Préférences
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Activer les logs debug
preferences.general.debugDirectory=Afficher le journal preferences.general.debugDirectory=Afficher le journal
preferences.general.autoStart=Lancer Cryptomator au démarrage du système preferences.general.autoStart=Lancer Cryptomator au démarrage du système
preferences.general.keychainBackend=Stocker les mots de passe avec preferences.general.keychainBackend=Stocker les mots de passe avec
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Trousseau Gnome
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=Portefeuille KDE
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=Accès au trousseau macOS
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Protection des données Windows
preferences.general.interfaceOrientation=Orientation de l'interface preferences.general.interfaceOrientation=Orientation de l'interface
preferences.general.interfaceOrientation.ltr=De gauche à droite preferences.general.interfaceOrientation.ltr=De gauche à droite
preferences.general.interfaceOrientation.rtl=De droite à gauche preferences.general.interfaceOrientation.rtl=De droite à gauche
@@ -304,12 +314,15 @@ wrongFileAlert.link=Pour toute aide supplémentaire, visitez
## General ## General
vaultOptions.general=Général vaultOptions.general=Général
vaultOptions.general.vaultName=Nom de voûte vaultOptions.general.vaultName=Nom de voûte
vaultOptions.general.autoLock.lockAfterTimePart1=Verrouiler en cas d'inactivité pendant
vaultOptions.general.autoLock.lockAfterTimePart2=minutes
vaultOptions.general.unlockAfterStartup=Déverrouiller le coffre au démarrage vaultOptions.general.unlockAfterStartup=Déverrouiller le coffre au démarrage
vaultOptions.general.actionAfterUnlock=Après un déverrouillage réussi vaultOptions.general.actionAfterUnlock=Après un déverrouillage réussi
vaultOptions.general.actionAfterUnlock.ignore=Ne rien faire vaultOptions.general.actionAfterUnlock.ignore=Ne rien faire
vaultOptions.general.actionAfterUnlock.reveal=Afficher le disque vaultOptions.general.actionAfterUnlock.reveal=Afficher le disque
vaultOptions.general.actionAfterUnlock.ask=Demander vaultOptions.general.actionAfterUnlock.ask=Demander
vaultOptions.general.healthBtn=Commencer le contrôle de santé vaultOptions.general.startHealthCheckBtn=Commencer le contrôle de santé
## Mount ## Mount
vaultOptions.mount=Montage vaultOptions.mount=Montage
vaultOptions.mount.readonly=Lecture seule vaultOptions.mount.readonly=Lecture seule
@@ -325,13 +338,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Choisir un répertoire vide
vaultOptions.masterkey=Mot de passe vaultOptions.masterkey=Mot de passe
vaultOptions.masterkey.changePasswordBtn=Modifier le mot de passe vaultOptions.masterkey.changePasswordBtn=Modifier le mot de passe
vaultOptions.masterkey.forgetSavedPasswordBtn=Oublier le mot de passe enregistré vaultOptions.masterkey.forgetSavedPasswordBtn=Oublier le mot de passe enregistré
vaultOptions.masterkey.recoveryKeyExpanation=Une clé de récupération est votre seul moyen de rétablir l'accès à un coffre-fort, si vous perdez votre mot de passe. vaultOptions.masterkey.recoveryKeyExplanation=Une clé de récupération est votre seul moyen de rétablir l'accès à un coffre-fort, si vous perdez votre mot de passe.
vaultOptions.masterkey.showRecoveryKeyBtn=Afficher la clé de récupération vaultOptions.masterkey.showRecoveryKeyBtn=Afficher la clé de récupération
vaultOptions.masterkey.recoverPasswordBtn=Récupération du mot de passe vaultOptions.masterkey.recoverPasswordBtn=Récupération du mot de passe
## Auto Lock
vaultOptions.autoLock=Verrouillage automatique
vaultOptions.autoLock.lockAfterTimePart1=Verrouiler en cas d'inactivité pendant
vaultOptions.autoLock.lockAfterTimePart2=minutes
# Recovery Key # Recovery Key
recoveryKey.title=Clé de récupération recoveryKey.title=Clé de récupération
@@ -13,8 +13,6 @@ generic.button.done=हो गया
generic.button.next=अगला generic.button.next=अगला
generic.button.print=प्रिंट करें generic.button.print=प्रिंट करें
## Error ## Error
generic.error.title=कोई अनपेक्षित त्रुटि हो गई है
generic.error.instruction=ऐसा नहीं होना चाहिए था। कृपया नीचे त्रुटि पाठ की रिपोर्ट करें और इस त्रुटि के लिए क्या कदम उठाए, इसका विवरण शामिल करें।
# Defaults # Defaults
defaults.vault.vaultName=गुप्त तिजोरी defaults.vault.vaultName=गुप्त तिजोरी
@@ -83,13 +81,16 @@ unlock.unlockBtn=अनलॉक करें
migration.title=वाउल्ट को अपग्रेड करें migration.title=वाउल्ट को अपग्रेड करें
## Start ## Start
## Run ## Run
## Sucess ## Success
## Missing file system capabilities ## Missing file system capabilities
## Impossible ## Impossible
# Health Check # Health Check
## Start
## Start Failure
## Check Selection
## Detail view ## Detail view
## Checks ## Fix Application
# Preferences # Preferences
preferences.title=प्राथमिकताएं preferences.title=प्राथमिकताएं
@@ -132,6 +133,7 @@ wrongFileAlert.link=और मदद के लिए, यह जाएं
## General ## General
vaultOptions.general=सामान्य vaultOptions.general=सामान्य
vaultOptions.general.vaultName=वॉल्ट का नाम vaultOptions.general.vaultName=वॉल्ट का नाम
## Mount ## Mount
vaultOptions.mount=माउंट हो रहा है vaultOptions.mount=माउंट हो रहा है
vaultOptions.mount.winDriveLetterOccupied=इसका इस्तेमाल किया जा रहा है vaultOptions.mount.winDriveLetterOccupied=इसका इस्तेमाल किया जा रहा है
@@ -144,7 +146,7 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=कोई खाली जग
## Master Key ## Master Key
vaultOptions.masterkey=पासवर्ड vaultOptions.masterkey=पासवर्ड
vaultOptions.masterkey.changePasswordBtn=पासवर्ड बदलें vaultOptions.masterkey.changePasswordBtn=पासवर्ड बदलें
## Auto Lock
# Recovery Key # Recovery Key
@@ -37,13 +37,16 @@
# Migration # Migration
## Start ## Start
## Run ## Run
## Sucess ## Success
## Missing file system capabilities ## Missing file system capabilities
## Impossible ## Impossible
# Health Check # Health Check
## Start
## Start Failure
## Check Selection
## Detail view ## Detail view
## Checks ## Fix Application
# Preferences # Preferences
## General ## General
@@ -72,9 +75,10 @@
# Vault Options # Vault Options
## General ## General
## Mount ## Mount
## Master Key ## Master Key
## Auto Lock
# Recovery Key # Recovery Key
@@ -13,8 +13,6 @@ generic.button.done=Kész
generic.button.next=Következő generic.button.next=Következő
generic.button.print=Nyomtatás generic.button.print=Nyomtatás
## Error ## Error
generic.error.title=Egy váratlan hiba történt
generic.error.instruction=Ennek nem lett volna szabad megtörténnie. Kérjük jelezze a hibát az alábbi szöveggel valamint a hiba reprodukálásához szükséges lépésekkel.
# Defaults # Defaults
defaults.vault.vaultName=Széf defaults.vault.vaultName=Széf
@@ -90,7 +88,6 @@ forgetPassword.information=Eltávolítja a széf mentett jelszavát a rendszere
forgetPassword.confirmBtn=Jelszó elfelejtése forgetPassword.confirmBtn=Jelszó elfelejtése
# Unlock # Unlock
unlock.title=Széf feloldása
unlock.passwordPrompt=Írja be a jelszavát a következő széfhez "%s": unlock.passwordPrompt=Írja be a jelszavát a következő széfhez "%s":
unlock.unlockBtn=Feloldás unlock.unlockBtn=Feloldás
## ##
@@ -117,7 +114,7 @@ migration.start.confirm=Igen, a széfem teljes mértékben szinkronizálva van
migration.run.enterPassword=Írja be a jelszót a következőhöz Enter the password for "%s" migration.run.enterPassword=Írja be a jelszót a következőhöz Enter the password for "%s"
migration.run.startMigrationBtn=Széf frissítése migration.run.startMigrationBtn=Széf frissítése
migration.run.progressHint=Ez eltarthat egy darabig… migration.run.progressHint=Ez eltarthat egy darabig…
## Sucess ## Success
migration.success.nextStepsInstructions=A "%s" sikeresen migrálva. \nMost már feloldhatja a széfet. migration.success.nextStepsInstructions=A "%s" sikeresen migrálva. \nMost már feloldhatja a széfet.
migration.success.unlockNow=Azonnali feloldás migration.success.unlockNow=Azonnali feloldás
## Missing file system capabilities ## Missing file system capabilities
@@ -133,8 +130,11 @@ migration.impossible.reason=A széfet nem lehet automatikusan frissíteni, mert
migration.impossible.moreInfo=A széf továbbra is megnyitható marad egy régebbi verzióval. A széf kézi frissítésével kapcsolatos utasításokért keresse fel a következő címet: migration.impossible.moreInfo=A széf továbbra is megnyitható marad egy régebbi verzióval. A széf kézi frissítésével kapcsolatos utasításokért keresse fel a következő címet:
# Health Check # Health Check
## Start
## Start Failure
## Check Selection
## Detail view ## Detail view
## Checks ## Fix Application
# Preferences # Preferences
preferences.title=Beállítások preferences.title=Beállítások
@@ -259,6 +259,7 @@ vaultOptions.general.actionAfterUnlock=Sikeres feloldás után
vaultOptions.general.actionAfterUnlock.ignore=Ne tegyen semmit vaultOptions.general.actionAfterUnlock.ignore=Ne tegyen semmit
vaultOptions.general.actionAfterUnlock.reveal=Jelenítse meg a kötetet vaultOptions.general.actionAfterUnlock.reveal=Jelenítse meg a kötetet
vaultOptions.general.actionAfterUnlock.ask=Kérdez vaultOptions.general.actionAfterUnlock.ask=Kérdez
## Mount ## Mount
vaultOptions.mount=Felcsatolás vaultOptions.mount=Felcsatolás
vaultOptions.mount.readonly=Csak-olvasható vaultOptions.mount.readonly=Csak-olvasható
@@ -274,10 +275,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Válasszon egy üres könyvt
vaultOptions.masterkey=Jelszó vaultOptions.masterkey=Jelszó
vaultOptions.masterkey.changePasswordBtn=Jelszó megváltoztatása vaultOptions.masterkey.changePasswordBtn=Jelszó megváltoztatása
vaultOptions.masterkey.forgetSavedPasswordBtn=Mentett jelszó törlése vaultOptions.masterkey.forgetSavedPasswordBtn=Mentett jelszó törlése
vaultOptions.masterkey.recoveryKeyExpanation=A helyreállítási kulcs az egyetlen módja annak, hogy visszaállítsa a széfhez való hozzáférést, ha elveíti a jelszavát. vaultOptions.masterkey.recoveryKeyExplanation=A helyreállítási kulcs az egyetlen módja annak, hogy visszaállítsa a széfhez való hozzáférést, ha elveíti a jelszavát.
vaultOptions.masterkey.showRecoveryKeyBtn=Visszaállítási kulcs megjelenítése vaultOptions.masterkey.showRecoveryKeyBtn=Visszaállítási kulcs megjelenítése
vaultOptions.masterkey.recoverPasswordBtn=Jelszó visszaállítása vaultOptions.masterkey.recoverPasswordBtn=Jelszó visszaállítása
## Auto Lock
# Recovery Key # Recovery Key
recoveryKey.title=Visszaállítási kulcs recoveryKey.title=Visszaállítási kulcs
+7 -26
View File
@@ -13,8 +13,6 @@ generic.button.done=Selesai
generic.button.next=Lanjut generic.button.next=Lanjut
generic.button.print=Cetak generic.button.print=Cetak
## Error ## Error
generic.error.title=Telah terjadi kesalahan tak terduga
generic.error.instruction=Ini harusnya tidak terjadi. Harap laporkan pesan kesalahan dibawah dan tulis deskripsi kenapa ini bisa terjadi.
# Defaults # Defaults
defaults.vault.vaultName=Brankas defaults.vault.vaultName=Brankas
@@ -95,7 +93,6 @@ forgetPassword.information=Kata sandi vault yang tersimpan akan dihapus dari key
forgetPassword.confirmBtn=Lupa Kata Sandi forgetPassword.confirmBtn=Lupa Kata Sandi
# Unlock # Unlock
unlock.title=Buka Vault
unlock.passwordPrompt=Masukkan kata sandi untuk "%s": unlock.passwordPrompt=Masukkan kata sandi untuk "%s":
unlock.savePassword=Simpan Kata Sandi unlock.savePassword=Simpan Kata Sandi
unlock.unlockBtn=Buka Gembok unlock.unlockBtn=Buka Gembok
@@ -130,7 +127,7 @@ migration.start.confirm=Ya, vault saya sepenuhnya tersinkronisasi
migration.run.enterPassword=Masukkan kata sandi untuk "%s" migration.run.enterPassword=Masukkan kata sandi untuk "%s"
migration.run.startMigrationBtn=Pindahkan Vault migration.run.startMigrationBtn=Pindahkan Vault
migration.run.progressHint=Proses ini mungkin akan memakan waktu cukup lama… migration.run.progressHint=Proses ini mungkin akan memakan waktu cukup lama…
## Sucess ## Success
migration.success.nextStepsInstructions="%s" telah berhasil dipindahkan.\nAnda sekarang dapat membuka vault Anda. migration.success.nextStepsInstructions="%s" telah berhasil dipindahkan.\nAnda sekarang dapat membuka vault Anda.
migration.success.unlockNow=Buka Kunci Sekarang migration.success.unlockNow=Buka Kunci Sekarang
## Missing file system capabilities ## Missing file system capabilities
@@ -146,27 +143,14 @@ migration.impossible.reason=Vault tidak dapat dipindahkan secara otomatis karena
migration.impossible.moreInfo=Vault dapat dibuka dengan program versi lebih lama. Apabila Anda ingin memindahkan vault secara manual, silahkan buka migration.impossible.moreInfo=Vault dapat dibuka dengan program versi lebih lama. Apabila Anda ingin memindahkan vault secara manual, silahkan buka
# Health Check # Health Check
health.title=Pemeriksaan Kesehatan Vault ## Start
health.start.introduction=Pemeriksaan Kesehatan Vault adalah kumpulan pemeriksaan untuk mendeteksi dan mungkin memperbaiki masalah dalam struktur internal brankas Anda. Harap dicatat, bahwa tidak semua masalah dapat diperbaiki. Anda memerlukan kata sandi brankas untuk melakukan pemeriksaan. ## Start Failure
health.start.configValid=Membaca dan mengurai file konfigurasi vault berhasil. Lanjutkan untuk memilih pemeriksaan. ## Check Selection
health.start.configInvalid=Kesalahan saat membaca dan menguraikan file pengaturan vault.
health.checkList.header=Pemeriksaan Kesehatan yang Tersedia
health.checkList.selectAllBox=Pilih Semua
health.check.runBatchBtn=Cek Jalankan yang dipilih health.check.runBatchBtn=Cek Jalankan yang dipilih
## Detail view ## Detail view
health.check.detail.noSelectedCheck=Untuk hasil, pilih pemeriksaan kesehatan yang sudah selesai di sebelah kiri. health.check.detail.noSelectedCheck=Untuk hasil, pilih pemeriksaan kesehatan yang sudah selesai di sebelah kiri.
health.check.detail.header=Hasil dari %s
health.check.detail.taskNotStarted=Cek tidak dipilih untuk dijalankan.
health.check.detail.taskScheduled=Pemeriksaan Terjadwal.
health.check.detail.taskRunning=Saat ini pemeriksaan sedang berjalan…
health.check.detail.taskSucceeded=Pemeriksaan berhasil diselesaikan setelah %d milidetik.
health.check.detail.taskFailed=Cek keluar karena kesalahan.
health.check.detail.taskCancelled=Cek dibatalkan.
health.check.detail.problemCount=Ditemukan %d masalah dan %d kesalahan yang tidak dapat diperbaiki.
health.check.exportBtn=Ekspor Laporan health.check.exportBtn=Ekspor Laporan
health.check.fixBtn=Memperbaiki ## Fix Application
## Checks
health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Pemeriksaan Direktori
# Preferences # Preferences
preferences.title=Preferensi preferences.title=Preferensi
@@ -184,10 +168,6 @@ preferences.general.debugLogging=Aktifkan pencatatan debug
preferences.general.debugDirectory=Buka file log preferences.general.debugDirectory=Buka file log
preferences.general.autoStart=Luncurkan Cryptomator pada awal sistem preferences.general.autoStart=Luncurkan Cryptomator pada awal sistem
preferences.general.keychainBackend=Simpan kata sandi dengan preferences.general.keychainBackend=Simpan kata sandi dengan
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gantungan Kunci Gnome
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=Dompet KDE
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=akses Kunci Rantai mac-OS
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Perlindungan Data Windows
preferences.general.interfaceOrientation=Orientasi Antarmuka preferences.general.interfaceOrientation=Orientasi Antarmuka
preferences.general.interfaceOrientation.ltr=Kiri ke kanan preferences.general.interfaceOrientation.ltr=Kiri ke kanan
preferences.general.interfaceOrientation.rtl=Kanan ke kiri preferences.general.interfaceOrientation.rtl=Kanan ke kiri
@@ -242,11 +222,12 @@ main.vaultDetail.migrateButton=Tingkatkan Vault
vaultOptions.general=Umum vaultOptions.general=Umum
vaultOptions.general.vaultName=Nama Brankas vaultOptions.general.vaultName=Nama Brankas
vaultOptions.general.actionAfterUnlock.reveal=Buka Drive vaultOptions.general.actionAfterUnlock.reveal=Buka Drive
## Mount ## Mount
vaultOptions.mount.mountPoint.directoryPickerButton=Pilih… vaultOptions.mount.mountPoint.directoryPickerButton=Pilih…
## Master Key ## Master Key
vaultOptions.masterkey.changePasswordBtn=Ubah Kata Sandi vaultOptions.masterkey.changePasswordBtn=Ubah Kata Sandi
## Auto Lock
# Recovery Key # Recovery Key
+164 -142
View File
@@ -13,20 +13,23 @@ generic.button.done=Fatto
generic.button.next=Avanti generic.button.next=Avanti
generic.button.print=Stampa generic.button.print=Stampa
## Error ## Error
generic.error.title=Si è verificato un errore inatteso generic.error.title=Errore %s
generic.error.instruction=Questo non dovrebbe essere accaduto. Si prega di segnalare il testo dell'errore qui sotto e includere una descrizione delle fasi che hanno portato a questo errore. generic.error.instruction=Ops! Cryptomator non si aspettava che ciò succedesse. Puoi cercare le soluzioni esistenti per questo errore. O se non è stato ancora segnalato, sentiti libero di farlo.
generic.error.hyperlink.lookup=Cerca questo errore
generic.error.hyperlink.report=Segnala questo errore
generic.error.technicalDetails=Dettagli:
# Defaults # Defaults
defaults.vault.vaultName=Cassaforte defaults.vault.vaultName=Cassaforte
# Tray Menu # Tray Menu
traymenu.showMainWindow=Visualizza traymenu.showMainWindow=Mostra
traymenu.showPreferencesWindow=Impostazioni traymenu.showPreferencesWindow=Preferenze
traymenu.lockAllVaults=Blocca Tutto traymenu.lockAllVaults=Blocca Tutto
traymenu.quitApplication=Esci traymenu.quitApplication=Esci
traymenu.vault.unlock=Sblocca traymenu.vault.unlock=Sblocca
traymenu.vault.lock=Blocca traymenu.vault.lock=Blocca
traymenu.vault.reveal=Mostra traymenu.vault.reveal=Rivela
# Add Vault Wizard # Add Vault Wizard
addvaultwizard.title=Aggiungi Cassaforte addvaultwizard.title=Aggiungi Cassaforte
@@ -35,179 +38,194 @@ addvaultwizard.welcome.newButton=Crea Nuova Cassaforte
addvaultwizard.welcome.existingButton=Apri Cassaforte Esistente addvaultwizard.welcome.existingButton=Apri Cassaforte Esistente
## New ## New
### Name ### Name
addvaultwizard.new.nameInstruction=Scegli un nome per la tua cassaforte addvaultwizard.new.nameInstruction=Scegli un nome per la cassaforte
addvaultwizard.new.namePrompt=Nome Cassaforte addvaultwizard.new.namePrompt=Nome della Cassaforte
### Location ### Location
addvaultwizard.new.locationInstruction=Dove dovrebbe memorizzare Cryptomator i file crittografati della tua cassaforte? addvaultwizard.new.locationInstruction=Dove Cryptomator dovrebbe memorizzare i file crittografati della tua cassaforte?
addvaultwizard.new.locationLabel=Posizione archivio addvaultwizard.new.locationLabel=Posizione d'archiviazione
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Posizione personalizzata addvaultwizard.new.directoryPickerLabel=Posizione Personalizzata
addvaultwizard.new.directoryPickerButton=Scegli… addvaultwizard.new.directoryPickerButton=Scegli…
addvaultwizard.new.directoryPickerTitle=Seleziona cartella addvaultwizard.new.directoryPickerTitle=Seleziona la Cartella
addvaultwizard.new.fileAlreadyExists=Un file o una cartella con il nome del vault esiste già addvaultwizard.new.fileAlreadyExists=Un file o una cartella con il nome della cassaforte esiste già
addvaultwizard.new.locationDoesNotExist=Una cartella nel percorso specificato non esiste o non è accessibile addvaultwizard.new.locationDoesNotExist=Una cartella nel percorso specificato non esiste o non è accessibile
addvaultwizard.new.locationIsNotWritable=Non c'è accesso in scrittura nel percorso specificato addvaultwizard.new.locationIsNotWritable=Nessun accesso di scrittura al percorso specificato
addvaultwizard.new.locationIsOk=Posizione adatta per il tuo vault addvaultwizard.new.locationIsOk=Posizione idonea per la tua cassaforte
addvaultwizard.new.invalidName=Nome della cassaforte non valido. Si prega di considerare un nome di directory regolare. addvaultwizard.new.invalidName=Nome della cassaforte non valido. Sei pregato di considerare un nome della cartella regolare.
### Password ### Password
addvaultwizard.new.createVaultBtn=Crea Cassaforte addvaultwizard.new.createVaultBtn=Crea Cassaforte
addvaultwizard.new.generateRecoveryKeyChoice=Non sarai in grado di accedere ai tuoi dati senza password. Vuoi una chiave di recupero nel caso in cui perdi la password? addvaultwizard.new.generateRecoveryKeyChoice=Non potrai accedere ai tuoi dati senza la tua password. Desideri una chiave di recupero nel caso dovessi perdere la password?
addvaultwizard.new.generateRecoveryKeyChoice.yes=Si, per favore, è meglio essere al sicuro addvaultwizard.new.generateRecoveryKeyChoice.yes=Si, per favore, è meglio essere al sicuro
addvaultwizard.new.generateRecoveryKeyChoice.no=No grazie, non perderò la mia password addvaultwizard.new.generateRecoveryKeyChoice.no=No grazie, non perderò la mia password
### Information ### Information
addvault.new.readme.storageLocation.fileName=IMPORTANTE.rtf addvault.new.readme.storageLocation.fileName=IMPORTANTE.rtf
addvault.new.readme.storageLocation.1=⚠ FILE CASSAFORTE addvault.new.readme.storageLocation.1= FILE DELLA CASSAFORTE ⚠️
addvault.new.readme.storageLocation.2=Questa è la posizione di archiviazione della tua cassaforte. addvault.new.readme.storageLocation.2=Questa è la posizione d'archiviazione della tua cassaforte.
addvault.new.readme.storageLocation.3=NON addvault.new.readme.storageLocation.3=NON
addvault.new.readme.storageLocation.4=modificare qualsiasi file in questa cartella o addvault.new.readme.storageLocation.4=alterare alcun file in questa cartella o
addvault.new.readme.storageLocation.5=Incolla tutti i file da criptare in questa directory. addvault.new.readme.storageLocation.5=incollare alcun file per la crittografia in questa cartella.
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.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.7=1. Aggiungi questa cassaforte a Cryptomator.
addvault.new.readme.storageLocation.8=2. Sblocca la cassaforte in Criptomator. addvault.new.readme.storageLocation.8=2. Sblocca la cassaforte su Cryptomator.
addvault.new.readme.storageLocation.9=3. Apri la posizione di accesso cliccando sul pulsante "Rivela". addvault.new.readme.storageLocation.9=3. Apri la posizione d'accesso cliccando sul pulsante "Rivela".
addvault.new.readme.storageLocation.10=Se hai bisogno di aiuto, leggi la documentazione: %s addvault.new.readme.storageLocation.10=Se ti serve aiuto, visita la documentazione: %s
addvault.new.readme.accessLocation.fileName=BENVENUTO.rtf addvault.new.readme.accessLocation.fileName=BENVENUTO.rtf
addvault.new.readme.accessLocation.1=🔐 VOLUME CRIPTATO 🔐 addvault.new.readme.accessLocation.1=🔐 VOLUME CRITTOGRAFATO 🔐
addvault.new.readme.accessLocation.2=Questa è la posizione di accesso della tua cassaforte. addvault.new.readme.accessLocation.2=Questa è la posizione d'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.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=Sei libero di rimuovere questo file. addvault.new.readme.accessLocation.4=Sentiti libero di rimuovere questo file.
## Existing ## 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.chooseBtn=Scegli…
addvaultwizard.existing.filePickerTitle=Seleziona file Masterkey addvaultwizard.existing.filePickerTitle=Seleziona il File Masterkey
## Success ## 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.nextStepsInstructions=Cassaforte "%s" aggiunta.\nDevi sbloccare questa cassaforte per accedere o aggiungere contenuti. Altrimenti, puoi sbloccarla in qualsiasi momento successivo.
addvaultwizard.success.unlockNow=Sblocca adesso addvaultwizard.success.unlockNow=Sblocca Ora
# Remove Vault # Remove Vault
removeVault.title=Rimuovi Cassaforte 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 removeVault.confirmBtn=Rimuovi Cassaforte
# Change Password # Change Password
changepassword.title=Modifica password changepassword.title=Modifica la Password
changepassword.enterOldPassword=Inserisci la password attuale per "%s" changepassword.enterOldPassword=Inserisci la password corrente per "%s"
changepassword.finalConfirmation=Ho capito che non sarò in grado di accedere ai miei dati se dimentico la mia password changepassword.finalConfirmation=Capisco che non potrò accedere ai miei dati se dimentico la mia password
# Forget Password # Forget Password
forgetPassword.title=Password dimenticata forgetPassword.title=Dimentica la Password
forgetPassword.information=Questo cancellerà la password salvata di questa cassaforte dal tuo portachiavi di sistema. forgetPassword.information=Questo eliminerà la password salvata di questa cassaforte dal portachiavi del tuo sistema.
forgetPassword.confirmBtn=Password dimenticata forgetPassword.confirmBtn=Dimentica Password
# Unlock # Unlock
unlock.title=Sblocca Cassaforte unlock.title=Sblocca "%s"
unlock.passwordPrompt=Inserisci la password per "%s": unlock.passwordPrompt=Inserisci la password per "%s":
unlock.savePassword=Ricorda la Password unlock.savePassword=Ricorda la Password
unlock.unlockBtn=Sblocca unlock.unlockBtn=Sblocca
## ##
unlock.chooseMasterkey.prompt=Impossibile trovare il file masterkey per questa cassaforte nella posizione prevista. Scegliere manualmente il file chiave. unlock.chooseMasterkey.prompt=Impossibile trovare il file Masterkey per questa cassaforte alla sua posizione prevista. Sei pregato di sceglierlo manualmente.
unlock.chooseMasterkey.filePickerTitle=Seleziona file Masterkey unlock.chooseMasterkey.filePickerTitle=Seleziona il File Masterkey
## Success ## Success
unlock.success.message="%s" sbloccato con successo! La tua cassaforte è ora accessibile tramite il suo drive virtuale. unlock.success.message="%s" sbloccato correttamente! La tua cassaforte è ora accessibile tramite la sua unità virtuale.
unlock.success.rememberChoice=Ricorda la scelta, non mostrare ancora unlock.success.rememberChoice=Ricorda la scelta, non mostrarmelo più
unlock.success.revealBtn=Rivela Drive unlock.success.revealBtn=Rivela l'Unità
## Failure ## Failure
unlock.error.heading=Impossibile sbloccare la cassaforte unlock.error.heading=Impossibile sbloccare la cassaforte
### Invalid Mount Point ### Invalid Mount Point
unlock.error.invalidMountPoint.notExisting=Il punto di montaggio non è una directory vuota o non esiste: %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 Mount/cartella esiste già o la cartella superiore è mancante: %s unlock.error.invalidMountPoint.existing=Il punto di montaggio "%s" esiste già o la cartella madre è mancante.
# Lock # Lock
## Force ## Force
lock.forced.heading=Blocco normale fallito 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 lock.forced.confirmBtn=Forza Blocco
## Failure ## Failure
lock.fail.heading=Blocco cassaforte fallito. lock.fail.heading=Blocco della 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.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
migration.title=Aggiorna Cassaforte migration.title=Aggiorna la Cassaforte
## Start ## 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 migration.start.confirm=Sì, la mia cassaforte è completamente sincronizzata
## Run ## Run
migration.run.enterPassword=Immettere la password per "%s" migration.run.enterPassword=Inserisci la password per "%s"
migration.run.startMigrationBtn=Migra Cassaforte migration.run.startMigrationBtn=Migra la Cassaforte
migration.run.progressHint=Potrebbe richiedere un po' di tempo… migration.run.progressHint=Questo potrebbe richiedere un po' di tempo…
## Sucess ## Success
migration.success.nextStepsInstructions=Migrato "%s" con successo.\nOra puoi sbloccare la tua cassaforte. migration.success.nextStepsInstructions="%s" migrata con successo.\nPuoi ora sbloccare la tua cassaforte.
migration.success.unlockNow=Sblocca adesso migration.success.unlockNow=Sblocca Ora
## Missing file system capabilities ## Missing file system capabilities
migration.error.missingFileSystemCapabilities.title=File System non supportato migration.error.missingFileSystemCapabilities.title=File di Sistema Non Supportato
migration.error.missingFileSystemCapabilities.description=La migrazione non è stata avviata perché la cassaforte è situata su un file system inadeguato. 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 system non supporta nomi di file lunghi. 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 system non supporta percorsi lunghi. migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Il file di sistema non supporta i percorsi lunghi.
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Il file system non consente di essere letto. migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Il file di sistema non consente di esser letto.
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Il file system non consente di essere scritto. migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Il file di sistema non consente di esser scritto.
## Impossible ## Impossible
migration.impossible.heading=Impossibile migrare la cassaforte 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.reason=Impossibile migrare automaticamente la cassaforte perché la sua posizione d'archiviazione o punto d'accesso non sono compatibili.
migration.impossible.moreInfo=La cassaforte può ancora essere aperta con una versione precedente. Per istruzioni su come migrare manualmente una cassaforte, visita migration.impossible.moreInfo=La cassaforte è ancora apribile con una versione precedente. Per le istruzioni su come migrare manualmente una cassaforte, visita
# Health Check # Health Check
health.title=Controllo Salute Cassaforte ## Start
health.start.introduction=Il Controllo di Salute della Cassaforte è una raccolta di controlli per rilevare e possibilmente risolvere i problemi nella struttura interna della tua cassaforte. Sei pregato di notare che non tutti i problemi sono risolvibili. Ti serve la password della cassaforte per eseguire i controlli. health.title=Controllo Salute di "%s"
health.start.configValid=La lettura e l'analisi del file di configurazione è riuscita. Procedi per selezionare i controlli. health.intro.header=Controllo Salute
health.start.configInvalid=Errore leggendo e analizzando il file di configurazione della cassaforte. 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.checkList.header=Controlli di Salute Disponibili health.intro.remarkSync=Assicurati che tutti i dispositivi siano completamente sincronizzati, questo risolve gran parte dei problemi.
health.checkList.selectAllBox=Seleziona Tutto health.intro.remarkFix=Non tutti i problemi sono risolvibili.
health.check.runBatchBtn=Esegui i Controlli selezionati 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 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 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 ## 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.header=Risultati di %s health.check.detail.checkScheduled=Il controllo è pianificato.
health.check.detail.taskNotStarted=Il controllo non è stato selezionato per l'esecuzione. health.check.detail.checkRunning=Il controllo è correntemente in esecuzione
health.check.detail.taskScheduled=Il controllo è pianificato. health.check.detail.checkSkipped=Il controllo non è stato selezionato per l'esecuzione.
health.check.detail.taskRunning=Il controllo è correntemente in esecuzione… health.check.detail.checkFinished=Il controllo è terminato correttamente.
## Checks 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 il Rapporto
## Fix Application
health.fix.fixBtn=Correggi
health.fix.successTip=Correzione riuscita
health.fix.failTip=Correzione fallita, vedi i registri per i dettagli
# Preferences # Preferences
preferences.title=Impostazioni preferences.title=Preferenze
## General ## General
preferences.general=Generali preferences.general=Generale
preferences.general.theme=Aspetto preferences.general.theme=Aspetto
preferences.general.theme.automatic=Automatico preferences.general.theme.automatic=Automatico
preferences.general.theme.light=Chiaro preferences.general.theme.light=Chiaro
preferences.general.theme.dark=Scuro preferences.general.theme.dark=Scuro
preferences.general.unlockThemes=Sblocca modalità scura preferences.general.unlockThemes=Sblocca la modalità scura
preferences.general.showMinimizeButton=Mostra pulsante riduci a icona preferences.general.showMinimizeButton=Mostra il pulsante minimizza
preferences.general.showTrayIcon=Mostra icona nel tray (richiede riavvio) preferences.general.showTrayIcon=Mostra l'icona della barra d'applicazioni (richiede il riavvio)
preferences.general.startHidden=Nascondi la finestra all'avvio di Cryptomator preferences.general.startHidden=Nascondi la finestra avviando Cryptomator
preferences.general.debugLogging=Abilita i registri di debug preferences.general.debugLogging=Abilita la registrazione di debug
preferences.general.debugDirectory=Mostra file log preferences.general.debugDirectory=Rivela i file di registro
preferences.general.autoStart=Avvia Cryptomator all'avvio del sistema preferences.general.autoStart=Avvia Cryptomator all'avvio del sistema
preferences.general.keychainBackend=Memorizza password con preferences.general.keychainBackend=Memorizza le password con
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Portachiavi Gnome preferences.general.interfaceOrientation=Orientamento dell'Interfaccia
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=Portafoglio KDE
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=accesso portachiavi macOS
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Protezione Dati Di Windows
preferences.general.interfaceOrientation=Orientamento Interfaccia
preferences.general.interfaceOrientation.ltr=Da Sinistra a Destra preferences.general.interfaceOrientation.ltr=Da Sinistra a Destra
preferences.general.interfaceOrientation.rtl=Da Destra a Sinistra preferences.general.interfaceOrientation.rtl=Da Destra a Sinistra
## Volume ## Volume
preferences.volume=Drive virtuale preferences.volume=Unità Virtuale
preferences.volume.type=Tipo volume preferences.volume.type=Tipo di Volume
preferences.volume.webdav.port=Porta WebDAV preferences.volume.webdav.port=Porta WebDAV
preferences.volume.webdav.scheme=Schema WebDAV preferences.volume.webdav.scheme=Schema WebDAV
## Updates ## Updates
preferences.updates=Aggiornamenti preferences.updates=Aggiornamenti
preferences.updates.currentVersion=Versione attuale %s preferences.updates.currentVersion=Versione Corrente: %s
preferences.updates.autoUpdateCheck=Controlla automaticamente la presenza di aggiornamenti preferences.updates.autoUpdateCheck=Cerca automaticamente gli aggiornamenti
preferences.updates.checkNowBtn=Controlla adesso preferences.updates.checkNowBtn=Controlla Ora
preferences.updates.updateAvailable=Disponibile aggiornamento alla versione %s. preferences.updates.updateAvailable=Aggiornamento alla versione %s disponibile.
## Contribution ## Contribution
preferences.contribute=Supportaci preferences.contribute=Supportaci
preferences.contribute.registeredFor=Certificato del supporto registrato per %s preferences.contribute.registeredFor=Certificato del sostenitore 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.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 già uno? Impara come puoi ottenerlo. preferences.contribute.getCertificate=Non ne hai ancora uno? Scopri come puoi ottenerlo.
preferences.contribute.promptText=Incolla qui il codice del certificato di supporter preferences.contribute.promptText=Incolla qui il codice del certificato da sostenitore
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
preferences.about=Informazioni preferences.about=Info
# Vault Statistics # Vault Statistics
stats.title=Statistiche per %s stats.title=Statistiche per %s
stats.cacheHitRate=Frequenza di Raggiungimento della Cache
## Read ## Read
stats.read.throughput.idle=Lettura: inattivo stats.read.throughput.idle=Lettura: inattivo
stats.read.throughput.kibs=Lettura: %.2f kiB/s stats.read.throughput.kibs=Lettura: %.2f kiB/s
@@ -216,13 +234,13 @@ stats.read.total.data.none=Dati letti: -
stats.read.total.data.kib=Dati letti: %.1f kiB stats.read.total.data.kib=Dati letti: %.1f kiB
stats.read.total.data.mib=Dati letti: %.1f MiB stats.read.total.data.mib=Dati letti: %.1f MiB
stats.read.total.data.gib=Dati letti: %.1f GiB 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.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.decr.total.data.gib=Dati decrittografati: %.1f GiB
stats.read.accessCount=Totale lettura: %d stats.read.accessCount=Letture totali: %d
## Write ## Write
stats.write.throughput.idle=Scrivi: inattivo stats.write.throughput.idle=Scrittura: inattivo
stats.write.throughput.kibs=Scrittura: %.2f kiB/s stats.write.throughput.kibs=Scrittura: %.2f kiB/s
stats.write.throughput.mibs=Scrittura: %.2f MiB/s stats.write.throughput.mibs=Scrittura: %.2f MiB/s
stats.write.total.data.none=Dati scritti: - stats.write.total.data.none=Dati scritti: -
@@ -233,81 +251,85 @@ stats.encr.total.data.none=Dati crittografati: -
stats.encr.total.data.kib=Dati crittografati: %.1f kiB stats.encr.total.data.kib=Dati crittografati: %.1f kiB
stats.encr.total.data.mib=Dati crittografati: %.1f MiB stats.encr.total.data.mib=Dati crittografati: %.1f MiB
stats.encr.total.data.gib=Dati crittografati: %.1f GiB stats.encr.total.data.gib=Dati crittografati: %.1f GiB
stats.write.accessCount=Totale scritture: %d stats.write.accessCount=Scritture totali: %d
# Main Window # Main Window
main.closeBtn.tooltip=Chiudi main.closeBtn.tooltip=Chiudi
main.minimizeBtn.tooltip=Minimizza main.minimizeBtn.tooltip=Minimizza
main.preferencesBtn.tooltip=Impostazioni main.preferencesBtn.tooltip=Preferenze
main.debugModeEnabled.tooltip=La modalità di debug è abilitata 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 ## Drag 'n' Drop
main.dropZone.dropVault=Aggiungi questa cassaforte 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 ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Clicca qui per aggiungere una cassaforte main.vaultlist.emptyList.onboardingInstruction=Clicca qui per aggiungere una cassaforte
main.vaultlist.contextMenu.remove=Rimuovi… main.vaultlist.contextMenu.remove=Rimuovi…
main.vaultlist.contextMenu.lock=Blocca main.vaultlist.contextMenu.lock=Blocca
main.vaultlist.contextMenu.unlock=Sblocca… main.vaultlist.contextMenu.unlock=Sblocca…
main.vaultlist.contextMenu.unlockNow=Sblocca Ora main.vaultlist.contextMenu.unlockNow=Sblocca Ora
main.vaultlist.contextMenu.vaultoptions=Mostra Opzioni Cassaforte main.vaultlist.contextMenu.vaultoptions=Mostra le Opzioni della Cassaforte
main.vaultlist.contextMenu.reveal=Rivela Drive main.vaultlist.contextMenu.reveal=Rivela Unità
main.vaultlist.addVaultBtn=Aggiungi Cassaforte main.vaultlist.addVaultBtn=Aggiungi Cassaforte
## Vault Detail ## Vault Detail
### Welcome ### 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 ### Locked
main.vaultDetail.lockedStatus=BLOCCATO main.vaultDetail.lockedStatus=BLOCCATO
main.vaultDetail.unlockBtn=Sblocca… main.vaultDetail.unlockBtn=Sblocca…
main.vaultDetail.unlockNowBtn=Sblocca adesso main.vaultDetail.unlockNowBtn=Sblocca Ora
main.vaultDetail.optionsBtn=Opzioni Cassaforte main.vaultDetail.optionsBtn=Opzioni della Cassaforte
main.vaultDetail.passwordSavedInKeychain=Password salvata main.vaultDetail.passwordSavedInKeychain=Password salvata
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=SBLOCCATO main.vaultDetail.unlockedStatus=SBLOCCATA
main.vaultDetail.accessLocation=I contenuti della tua cassaforte sono accessibili qui: 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.lockBtn=Blocca
main.vaultDetail.bytesPerSecondRead=Lettura: main.vaultDetail.bytesPerSecondRead=Lettura:
main.vaultDetail.bytesPerSecondWritten=Scrittura: main.vaultDetail.bytesPerSecondWritten=Scrittura:
main.vaultDetail.throughput.idle=inattivo main.vaultDetail.throughput.idle=inattivo
main.vaultDetail.throughput.kbps=%.1f kiB/s main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s main.vaultDetail.throughput.mbps=%.1f MiB/s
main.vaultDetail.stats=Statistiche Cassaforte main.vaultDetail.stats=Statistiche della Cassaforte
### Missing ### Missing
main.vaultDetail.missing.info=Cryptomator non ha potuto trovare una cassaforte in questo percorso. main.vaultDetail.missing.info=Cryptomator non è riuscito a trovare una cassaforte in questo percorso.
main.vaultDetail.missing.recheck=Ricontrollare main.vaultDetail.missing.recheck=Ricontrolla
main.vaultDetail.missing.remove=Rimuovi dalla Lista Cassaforte main.vaultDetail.missing.remove=Rimuovi dall'Elenco di Cassaforti
main.vaultDetail.missing.changeLocation=Cambia posizione della Cassaforte… main.vaultDetail.missing.changeLocation=Cambia la Posizione della Cassaforte…
### Needs Migration ### Needs Migration
main.vaultDetail.migrateButton=Aggiorna la cassaforte main.vaultDetail.migrateButton=Aggiorna la Cassaforte
main.vaultDetail.migratePrompt=Prima di potervi accedere la tua cassaforte deve essere aggiornata al nuovo formato main.vaultDetail.migratePrompt=La tua cassaforte dev'esser aggiornata a un nuovo formato, prima di potervi accedere
# Wrong File Alert # Wrong File Alert
wrongFileAlert.title=Come Criptare i File wrongFileAlert.title=Come Crittografare i File
wrongFileAlert.header.title=Hai provato a cifrare questi file? wrongFileAlert.header.title=Hai tentato di crittografare questi file?
wrongFileAlert.header.lead=A questo scopo, Cryptomator fornisce un volume nel file manager di sistema. wrongFileAlert.header.lead=Per questo scopo, Cryptomator fornisce un volume nel gestore dei tuoi file di sistema.
wrongFileAlert.instruction.0=Per cifrare file, segui questi passi: wrongFileAlert.instruction.0=Per crittografare i file, segui questi passi:
wrongFileAlert.instruction.1=1. Sblocca la tua cassaforte. 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.instruction.3=3. Aggiungi i tuoi file a questo volume.
wrongFileAlert.link=Per ulteriore assistenza, visita wrongFileAlert.link=Per ulteriore assistenza, visita
# Vault Options # Vault Options
## General ## General
vaultOptions.general=Generali vaultOptions.general=Generale
vaultOptions.general.vaultName=Nome Cassaforte vaultOptions.general.vaultName=Nome della Cassaforte
vaultOptions.general.unlockAfterStartup=Sblocca vault all'avvio di Cryptomator vaultOptions.general.autoLock.lockAfterTimePart1=Blocca quando inattivo per
vaultOptions.general.actionAfterUnlock=Dopo aver sbloccato con successo vaultOptions.general.autoLock.lockAfterTimePart2=minuti
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.ignore=Non fare nulla
vaultOptions.general.actionAfterUnlock.reveal=Visualizza disco vaultOptions.general.actionAfterUnlock.reveal=Rivela Unità
vaultOptions.general.actionAfterUnlock.ask=Chiedi vaultOptions.general.actionAfterUnlock.ask=Chiedi
vaultOptions.general.startHealthCheckBtn=Avvia il Controllo della Salute
## Mount ## Mount
vaultOptions.mount=Montaggio vaultOptions.mount=Montaggio
vaultOptions.mount.readonly=Sola lettura vaultOptions.mount.readonly=Sola Lettura
vaultOptions.mount.customMountFlags=Opzioni personalizzate vaultOptions.mount.customMountFlags=Flag di Montaggio Personalizzati
vaultOptions.mount.winDriveLetterOccupied=occupato vaultOptions.mount.winDriveLetterOccupied=occupato
vaultOptions.mount.mountPoint=Punto di mount vaultOptions.mount.mountPoint=Punto di Montaggio
vaultOptions.mount.mountPoint.auto=Scegli automaticamente una posizione adatta vaultOptions.mount.mountPoint.auto=Scegli automaticamente una posizione idonea
vaultOptions.mount.mountPoint.driveLetter=Usa la lettera del drive assegnata vaultOptions.mount.mountPoint.driveLetter=Usa la lettera del drive assegnata
vaultOptions.mount.mountPoint.custom=Percorso personalizzato vaultOptions.mount.mountPoint.custom=Percorso personalizzato
vaultOptions.mount.mountPoint.directoryPickerButton=Scegli… vaultOptions.mount.mountPoint.directoryPickerButton=Scegli…
@@ -316,10 +338,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Scegli una directory vuota
vaultOptions.masterkey=Password vaultOptions.masterkey=Password
vaultOptions.masterkey.changePasswordBtn=Modifica password vaultOptions.masterkey.changePasswordBtn=Modifica password
vaultOptions.masterkey.forgetSavedPasswordBtn=Dimentica Password Salvata vaultOptions.masterkey.forgetSavedPasswordBtn=Dimentica Password Salvata
vaultOptions.masterkey.recoveryKeyExpanation=Una chiave di recupero è il tuo unico mezzo per ripristinare l'accesso a una cassaforte se perdi la tua password. vaultOptions.masterkey.recoveryKeyExplanation=Una chiave di recupero è il tuo unico mezzo per ripristinare l'accesso a una cassaforte se perdi la tua password.
vaultOptions.masterkey.showRecoveryKeyBtn=Visualizza la chiave di recupero vaultOptions.masterkey.showRecoveryKeyBtn=Visualizza la chiave di recupero
vaultOptions.masterkey.recoverPasswordBtn=Recupera password vaultOptions.masterkey.recoverPasswordBtn=Recupera password
## Auto Lock
# Recovery Key # Recovery Key
recoveryKey.title=Chiave di recupero recoveryKey.title=Chiave di recupero
+54 -21
View File
@@ -13,8 +13,11 @@ generic.button.done=完了
generic.button.next=次へ generic.button.next=次へ
generic.button.print=印刷 generic.button.print=印刷
## Error ## Error
generic.error.title=予期しないエラーが発生しました generic.error.title=エラー %s
generic.error.instruction=予期しないことが発生しました。下部のエラーテキストとエラーに至った経緯の説明を報告していただけると幸いです。 generic.error.instruction=Cryptomator で予期できない問題が発生しました! 。このエラーの解決方法を検索することができ、まだ報告されていない場合は、報告を行うことができます。
generic.error.hyperlink.lookup=このエラーを検索する
generic.error.hyperlink.report=このエラーを報告する
generic.error.technicalDetails=詳細:
# Defaults # Defaults
defaults.vault.vaultName=金庫 defaults.vault.vaultName=金庫
@@ -32,7 +35,7 @@ traymenu.vault.reveal=表示
addvaultwizard.title=金庫を追加 addvaultwizard.title=金庫を追加
## Welcome ## Welcome
addvaultwizard.welcome.newButton=新しい金庫を作成 addvaultwizard.welcome.newButton=新しい金庫を作成
addvaultwizard.welcome.existingButton=既存の金庫を開く addvaultwizard.welcome.existingButton=すでにある金庫を開く
## New ## New
### Name ### Name
addvaultwizard.new.nameInstruction=金庫の名前を入力してください addvaultwizard.new.nameInstruction=金庫の名前を入力してください
@@ -95,7 +98,7 @@ forgetPassword.information=システムから金庫の保存済みパスワー
forgetPassword.confirmBtn=パスワードを削除 forgetPassword.confirmBtn=パスワードを削除
# Unlock # Unlock
unlock.title=金庫を解錠 unlock.title="%s" を解錠
unlock.passwordPrompt="%s" のパスワードを入力してください: unlock.passwordPrompt="%s" のパスワードを入力してください:
unlock.savePassword=パスワードを記憶させる unlock.savePassword=パスワードを記憶させる
unlock.unlockBtn=解錠 unlock.unlockBtn=解錠
@@ -130,24 +133,54 @@ migration.start.confirm=はい。同期が完了しています
migration.run.enterPassword="%s" のパスワードを入力してください migration.run.enterPassword="%s" のパスワードを入力してください
migration.run.startMigrationBtn=金庫を移行 migration.run.startMigrationBtn=金庫を移行
migration.run.progressHint=時間がかかる場合があります... migration.run.progressHint=時間がかかる場合があります...
## Sucess ## Success
migration.success.nextStepsInstructions="%s" の移行が成功しました。\n金庫を解錠できるようになりました。 migration.success.nextStepsInstructions="%s" の移行が成功しました。\n金庫を解錠できるようになりました。
migration.success.unlockNow=今すぐ解錠 migration.success.unlockNow=今すぐ解錠
## Missing file system capabilities ## Missing file system capabilities
migration.error.missingFileSystemCapabilities.title=サポートされないファイルタイプ migration.error.missingFileSystemCapabilities.title=サポートされないファイル システム
migration.error.missingFileSystemCapabilities.description=金庫が不適切なファイルシステムにあるため、移行が開始されませんでした。 migration.error.missingFileSystemCapabilities.description=金庫が不適切なファイル システムにあるため、移行が開始されませんでした。
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=ファイルシステムが長いファイル名をサポートしていません。 migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=ファイル システムが長いファイル名をサポートしていません。
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=ファイルシステムが長いパスをサポートしていません。 migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=ファイル システムが長いパスをサポートしていません。
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=ファイルシステムによって読み込みが許可されていません。 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.reason=ストレージ場所またはアクセスポイントに互換性がないため、金庫を自動的に移行できません。
migration.impossible.moreInfo=金庫を古いバージョンで開くことは可能です。手動による金庫の移行方法については次をご覧ください: migration.impossible.moreInfo=金庫を古いバージョンで開くことは可能です。手動による金庫の移行方法については次をご覧ください:
# Health Check # Health Check
## Start
health.title="%s" の正常性チェック
health.intro.header=正常性チェック
health.intro.text=正常性チェックは、金庫内部で修復できる可能性のある問題を収集します。次の点に注意してください:
health.intro.remarkSync=すべてのデバイスが完全に同期されていることを確認してください。これによってほとんどの問題は解決します。
health.intro.remarkFix=すべての問題を修復できるわけではありません。
health.intro.remarkBackup=データが破損しているときは、バックアップからのみ可能です。
health.intro.affirmation=上記の情報を理解しました。
## Start Failure
health.fail.header=金庫の構成を読み込み中にエラーが発生しました
health.fail.ioError=設定ファイルへのアクセスと読み込み中にエラーが発生しました。
health.fail.parseError=金庫の構成を解析中にエラーが発生しました。
health.fail.moreInfo=詳細
## Check Selection
health.checkList.description=左のリストを使用してチェックを選択するか、下のボタンで選択してください。
health.checkList.selectAllButton=すべてのチェックを選択
health.checkList.deselectAllButton=すべてのチェックを解除
health.check.runBatchBtn=選択したチェックを実行
## Detail view ## Detail view
## Checks 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.exportBtn=結果をエクスポート
## Fix Application
health.fix.fixBtn=修正
health.fix.successTip=正常に修正されました
health.fix.failTip=修正に失敗しました。詳細はログを参照してください。
# Preferences # Preferences
preferences.title=設定 preferences.title=設定
@@ -165,10 +198,6 @@ preferences.general.debugLogging=ログを有効にする
preferences.general.debugDirectory=ログ ファイルを表示 preferences.general.debugDirectory=ログ ファイルを表示
preferences.general.autoStart=システム開始時にCryptomatorを起動する preferences.general.autoStart=システム開始時にCryptomatorを起動する
preferences.general.keychainBackend=次を利用してパスワードを保存する preferences.general.keychainBackend=次を利用してパスワードを保存する
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS のキーチェーンアクセス
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows のデータ保護
preferences.general.interfaceOrientation=インターフェイスの向き preferences.general.interfaceOrientation=インターフェイスの向き
preferences.general.interfaceOrientation.ltr=左から右 preferences.general.interfaceOrientation.ltr=左から右
preferences.general.interfaceOrientation.rtl=右から左 preferences.general.interfaceOrientation.rtl=右から左
@@ -187,7 +216,7 @@ preferences.updates.updateAvailable=利用可能なバージョン %s に更新
preferences.contribute=サポートする preferences.contribute=サポートする
preferences.contribute.registeredFor=サポーター証明書が %s に登録されました preferences.contribute.registeredFor=サポーター証明書が %s に登録されました
preferences.contribute.noCertificate=Cryptomator を支援し、サポーター証明書を受け取りましょう。ライセンスキーに似ていますがフリーソフトを使う寄付者向けのキーです。 ;-) preferences.contribute.noCertificate=Cryptomator を支援し、サポーター証明書を受け取りましょう。ライセンスキーに似ていますがフリーソフトを使う寄付者向けのキーです。 ;-)
preferences.contribute.getCertificate=まだ証明書を手に入れていませんか? 詳細を確認しましょう preferences.contribute.getCertificate=まだ証明書を手に入れていませんか? 詳細はこちらから確認できます
preferences.contribute.promptText=サポーター証明書をここに張り付けてください preferences.contribute.promptText=サポーター証明書をここに張り付けてください
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -253,7 +282,7 @@ main.vaultDetail.optionsBtn=金庫のオプション
main.vaultDetail.passwordSavedInKeychain=パスワードを保存しました main.vaultDetail.passwordSavedInKeychain=パスワードを保存しました
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=解錠済み main.vaultDetail.unlockedStatus=解錠済み
main.vaultDetail.accessLocation=アクセス可能な金庫のコンテンツ: main.vaultDetail.accessLocation=金庫の内容はこちらからアクセスできます:
main.vaultDetail.revealBtn=ドライブを表示 main.vaultDetail.revealBtn=ドライブを表示
main.vaultDetail.lockBtn=施錠 main.vaultDetail.lockBtn=施錠
main.vaultDetail.bytesPerSecondRead=読み取り: main.vaultDetail.bytesPerSecondRead=読み取り:
@@ -261,7 +290,7 @@ main.vaultDetail.bytesPerSecondWritten=書き込み:
main.vaultDetail.throughput.idle=アイドル main.vaultDetail.throughput.idle=アイドル
main.vaultDetail.throughput.kbps=%.1f kiB/s main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s main.vaultDetail.throughput.mbps=%.1f MiB/s
main.vaultDetail.stats=保管庫の統計情報 main.vaultDetail.stats=庫の統計情報
### Missing ### Missing
main.vaultDetail.missing.info=Cryptomator はこのパスの金庫を見つけることができませんでした。 main.vaultDetail.missing.info=Cryptomator はこのパスの金庫を見つけることができませんでした。
main.vaultDetail.missing.recheck=再確認 main.vaultDetail.missing.recheck=再確認
@@ -285,11 +314,15 @@ wrongFileAlert.link=より詳細な手順については、次のページをご
## General ## General
vaultOptions.general=基本設定 vaultOptions.general=基本設定
vaultOptions.general.vaultName=金庫の名前 vaultOptions.general.vaultName=金庫の名前
vaultOptions.general.autoLock.lockAfterTimePart1=アイドル時に施錠する
vaultOptions.general.autoLock.lockAfterTimePart2=
vaultOptions.general.unlockAfterStartup=Cryptomatorの起動時に金庫を解錠する vaultOptions.general.unlockAfterStartup=Cryptomatorの起動時に金庫を解錠する
vaultOptions.general.actionAfterUnlock=解錠に成功したあと vaultOptions.general.actionAfterUnlock=解錠に成功したあと
vaultOptions.general.actionAfterUnlock.ignore=何もしない vaultOptions.general.actionAfterUnlock.ignore=何もしない
vaultOptions.general.actionAfterUnlock.reveal=ドライブを表示 vaultOptions.general.actionAfterUnlock.reveal=ドライブを表示
vaultOptions.general.actionAfterUnlock.ask=尋ねる vaultOptions.general.actionAfterUnlock.ask=尋ねる
vaultOptions.general.startHealthCheckBtn=正常性チェックを開始
## Mount ## Mount
vaultOptions.mount=マウント vaultOptions.mount=マウント
vaultOptions.mount.readonly=読み取り専用 vaultOptions.mount.readonly=読み取り専用
@@ -305,10 +338,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=空のディレクトリを
vaultOptions.masterkey=パスワード vaultOptions.masterkey=パスワード
vaultOptions.masterkey.changePasswordBtn=パスワードの変更 vaultOptions.masterkey.changePasswordBtn=パスワードの変更
vaultOptions.masterkey.forgetSavedPasswordBtn=保存したパスワードを削除する vaultOptions.masterkey.forgetSavedPasswordBtn=保存したパスワードを削除する
vaultOptions.masterkey.recoveryKeyExpanation=回復キーはパスワードを忘れてしまった場合でも、金庫へのアクセスを回復する唯一の手段です。 vaultOptions.masterkey.recoveryKeyExplanation=回復キーはパスワードを忘れてしまった場合でも、金庫へのアクセスを回復する唯一の手段です。
vaultOptions.masterkey.showRecoveryKeyBtn=回復キーを表示 vaultOptions.masterkey.showRecoveryKeyBtn=回復キーを表示
vaultOptions.masterkey.recoverPasswordBtn=パスワードの回復 vaultOptions.masterkey.recoverPasswordBtn=パスワードの回復
## Auto Lock
# Recovery Key # Recovery Key
recoveryKey.title=回復キー recoveryKey.title=回復キー
+28 -11
View File
@@ -13,8 +13,6 @@ generic.button.done=완료
generic.button.next=다음 generic.button.next=다음
generic.button.print=인쇄 generic.button.print=인쇄
## Error ## Error
generic.error.title=예기치 않은 오류가 발생되었습니다.
generic.error.instruction=이러한 일은 일어나지 말아야 합니다. 아래의 텍스트와 이 오류를 발생시킨 단계에 대한 설명을 포함하여 제출하여 주십시요.
# Defaults # Defaults
defaults.vault.vaultName=Vault defaults.vault.vaultName=Vault
@@ -95,7 +93,7 @@ forgetPassword.information=시스템 키체인에서 이 Vault의 저장된 비
forgetPassword.confirmBtn=비밀번호 분실 forgetPassword.confirmBtn=비밀번호 분실
# Unlock # Unlock
unlock.title=Vault 잠금해제 unlock.title="%s" 잠금 해제
unlock.passwordPrompt="%s"의 비밀번호를 입력하십시요. unlock.passwordPrompt="%s"의 비밀번호를 입력하십시요.
unlock.savePassword=비밀번호 기억 unlock.savePassword=비밀번호 기억
unlock.unlockBtn=잠금해제 unlock.unlockBtn=잠금해제
@@ -130,7 +128,7 @@ migration.start.confirm=네, 이 Vault는 동기화가 완전히 된 상태입
migration.run.enterPassword="%s"의 비밀번호를 입력하십시요. migration.run.enterPassword="%s"의 비밀번호를 입력하십시요.
migration.run.startMigrationBtn=Vault 마이그레이션 migration.run.startMigrationBtn=Vault 마이그레이션
migration.run.progressHint=이 작업은 시간이 조금 소요됩니다. migration.run.progressHint=이 작업은 시간이 조금 소요됩니다.
## Sucess ## Success
migration.success.nextStepsInstructions="%s" 의 마이그레이션이 성공적으로 완료되었습니다. 이제 Vault를 잠금해제할 수 있습니다. migration.success.nextStepsInstructions="%s" 의 마이그레이션이 성공적으로 완료되었습니다. 이제 Vault를 잠금해제할 수 있습니다.
migration.success.unlockNow=지금 잠금해제 migration.success.unlockNow=지금 잠금해제
## Missing file system capabilities ## Missing file system capabilities
@@ -146,8 +144,27 @@ migration.impossible.reason=저장소 위치 또는 접근 지점이 호환되
migration.impossible.moreInfo=Vault를 이전 버전으로 계속 열수 있습니다. Vault를 직접 마이그레이션 하는 설명을 보시려면, 다음을 방문하십시요. migration.impossible.moreInfo=Vault를 이전 버전으로 계속 열수 있습니다. Vault를 직접 마이그레이션 하는 설명을 보시려면, 다음을 방문하십시요.
# Health Check # Health Check
## Start
health.title="%s"의 상태 검사
health.intro.header=상태 검사
health.intro.text=상태 검사는 Vault의 내부 구조의 문제점을 점검하고 해결할 수 있는 기능입니다. 다음 사항을 유의하시기 바랍니다:
## Start Failure
health.fail.moreInfo=더 많은 정보
## Check Selection
health.checkList.selectAllButton=모든 항목 선택
health.checkList.deselectAllButton=모든 항목 선택 해제
health.check.runBatchBtn=선택된 검사항목 실행
## Detail view ## Detail view
## Checks health.check.detail.noSelectedCheck=결과를 보려면 왼쪽 목록에서 완료된 상태 검사항목을 선택하십시오.
health.check.detail.checkScheduled=검사가 예약되었습니다.
health.check.detail.checkRunning=검사가 현재 실행중입니다...
health.check.detail.checkSkipped=선택된 검사항목이 없습니다.
health.check.detail.checkFinished=검사가 성공적으로 완료되었습니다.
health.check.exportBtn=보고서 내보내기
## Fix Application
health.fix.fixBtn=문제해결
health.fix.successTip=문제 해결이 성공적으로 완료되었습니다
health.fix.failTip=문제 해결 실패, 상세 정보는 로그를 참조하십시요.
# Preferences # Preferences
preferences.title=환경설정 preferences.title=환경설정
@@ -165,10 +182,6 @@ preferences.general.debugLogging=디버그 로그기록을 사용하도록 설
preferences.general.debugDirectory=Log 파일 표시 preferences.general.debugDirectory=Log 파일 표시
preferences.general.autoStart=시스템 시작 시 Cryptomator 실행 preferences.general.autoStart=시스템 시작 시 Cryptomator 실행
preferences.general.keychainBackend=다음 경로에 비밀번호 저장 preferences.general.keychainBackend=다음 경로에 비밀번호 저장
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS 키체인 엑세스
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=윈도우 데이터 보호
preferences.general.interfaceOrientation=인터페이스 방향 preferences.general.interfaceOrientation=인터페이스 방향
preferences.general.interfaceOrientation.ltr=왼쪽에서 오른쪽으로 preferences.general.interfaceOrientation.ltr=왼쪽에서 오른쪽으로
preferences.general.interfaceOrientation.rtl=오른쪽에서 왼쪽으로 preferences.general.interfaceOrientation.rtl=오른쪽에서 왼쪽으로
@@ -285,11 +298,15 @@ wrongFileAlert.link=추후 지원을 위해, 다음을 방문하십시요
## General ## General
vaultOptions.general=일반 vaultOptions.general=일반
vaultOptions.general.vaultName=Vault 이름 vaultOptions.general.vaultName=Vault 이름
vaultOptions.general.autoLock.lockAfterTimePart1=다음 시간동안 유휴상태 시 잠금 :
vaultOptions.general.autoLock.lockAfterTimePart2=
vaultOptions.general.unlockAfterStartup=Cryptomator를 시작할 때 Vault 잠금 해제 vaultOptions.general.unlockAfterStartup=Cryptomator를 시작할 때 Vault 잠금 해제
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=요청
vaultOptions.general.startHealthCheckBtn=상태 검사 시작
## Mount ## Mount
vaultOptions.mount=드라이브 구성 vaultOptions.mount=드라이브 구성
vaultOptions.mount.readonly=읽기 전용 vaultOptions.mount.readonly=읽기 전용
@@ -305,10 +322,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=빈 디렉터리를 선택
vaultOptions.masterkey=비밀번호 vaultOptions.masterkey=비밀번호
vaultOptions.masterkey.changePasswordBtn=비밀번호 변경 vaultOptions.masterkey.changePasswordBtn=비밀번호 변경
vaultOptions.masterkey.forgetSavedPasswordBtn=저장된 비밀번호 삭제 vaultOptions.masterkey.forgetSavedPasswordBtn=저장된 비밀번호 삭제
vaultOptions.masterkey.recoveryKeyExpanation=복구 키는 비밀번호를 잊어버렸을 때, Vault의 접근을 복원 할 수 있는 유일한 방법입니다. vaultOptions.masterkey.recoveryKeyExplanation=복구 키는 비밀번호를 잊어버렸을 때, Vault의 접근을 복원 할 수 있는 유일한 방법입니다.
vaultOptions.masterkey.showRecoveryKeyBtn=복구 키 표시 vaultOptions.masterkey.showRecoveryKeyBtn=복구 키 표시
vaultOptions.masterkey.recoverPasswordBtn=비밀번호 복구 vaultOptions.masterkey.recoverPasswordBtn=비밀번호 복구
## Auto Lock
# Recovery Key # Recovery Key
recoveryKey.title=복구 키 recoveryKey.title=복구 키
@@ -13,8 +13,6 @@ generic.button.done=Darīts
generic.button.next=Tālāk generic.button.next=Tālāk
generic.button.print=Drukāt generic.button.print=Drukāt
## Error ## Error
generic.error.title=Radās neparedzēta kļūda
generic.error.instruction=Šis vēl nav atgadījies. Lūdzu ziņo zemāk redzamo kļūdas tekstu un iekļauj aprakstu, kas noveda pie šīs kļūdas.
# Defaults # Defaults
@@ -90,7 +88,6 @@ forgetPassword.information=Tas dzēsīs saglabāto glabātuves paroli no jūsu s
forgetPassword.confirmBtn=Aizmirst paroli forgetPassword.confirmBtn=Aizmirst paroli
# Unlock # Unlock
unlock.title=Atslēgt glabātuvi
unlock.passwordPrompt=Ievadiet "%s" paroli: unlock.passwordPrompt=Ievadiet "%s" paroli:
unlock.unlockBtn=Atslēgt unlock.unlockBtn=Atslēgt
## ##
@@ -112,7 +109,7 @@ migration.start.confirm=Jā, mana glabātuve ir pilnībā sinhronizēta
## Run ## Run
migration.run.enterPassword=Ievadiet "%s" paroli migration.run.enterPassword=Ievadiet "%s" paroli
migration.run.startMigrationBtn=Migrēt glabātuvi migration.run.startMigrationBtn=Migrēt glabātuvi
## Sucess ## Success
migration.success.nextStepsInstructions="%s" sekmīgi migrēta.\nJūs tagad variet atslēgt jūsu glabātuvi. migration.success.nextStepsInstructions="%s" sekmīgi migrēta.\nJūs tagad variet atslēgt jūsu glabātuvi.
migration.success.unlockNow=Atslēgt tagad migration.success.unlockNow=Atslēgt tagad
## Missing file system capabilities ## Missing file system capabilities
@@ -125,8 +122,11 @@ migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Nav atļaujas
## Impossible ## Impossible
# Health Check # Health Check
## Start
## Start Failure
## Check Selection
## Detail view ## Detail view
## Checks ## Fix Application
# Preferences # Preferences
preferences.title=Iestatījumi preferences.title=Iestatījumi
@@ -215,6 +215,7 @@ vaultOptions.general=Vispārēji
vaultOptions.general.vaultName=Glabātuves nosaukums vaultOptions.general.vaultName=Glabātuves nosaukums
vaultOptions.general.unlockAfterStartup=Atslēgt glabātuvi startējot Cryptomator vaultOptions.general.unlockAfterStartup=Atslēgt glabātuvi startējot Cryptomator
vaultOptions.general.actionAfterUnlock.reveal=Atklāt disku vaultOptions.general.actionAfterUnlock.reveal=Atklāt disku
## Mount ## Mount
vaultOptions.mount=Montē vaultOptions.mount=Montē
vaultOptions.mount.readonly=Tikai lasīt vaultOptions.mount.readonly=Tikai lasīt
@@ -229,10 +230,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Izvēlies tukšu mapi
## Master Key ## Master Key
vaultOptions.masterkey=Parole vaultOptions.masterkey=Parole
vaultOptions.masterkey.changePasswordBtn=Mainīt paroli vaultOptions.masterkey.changePasswordBtn=Mainīt paroli
vaultOptions.masterkey.recoveryKeyExpanation=Atkopšanas atslēga ir jūsu vienīgais līdzeklis, lai atjaunotu piekļuvi glabātuvei, ja pazaudējat paroli. vaultOptions.masterkey.recoveryKeyExplanation=Atkopšanas atslēga ir jūsu vienīgais līdzeklis, lai atjaunotu piekļuvi glabātuvei, ja pazaudējat paroli.
vaultOptions.masterkey.showRecoveryKeyBtn=Rādīt atkopšanas atslēgu vaultOptions.masterkey.showRecoveryKeyBtn=Rādīt atkopšanas atslēgu
vaultOptions.masterkey.recoverPasswordBtn=Atjaunot paroli vaultOptions.masterkey.recoverPasswordBtn=Atjaunot paroli
## Auto Lock
# Recovery Key # Recovery Key
recoveryKey.title=Atjaunošanas atslēga recoveryKey.title=Atjaunošanas atslēga
+19 -11
View File
@@ -13,8 +13,6 @@ generic.button.done=Ferdig
generic.button.next=Neste generic.button.next=Neste
generic.button.print=Skriv ut generic.button.print=Skriv ut
## Error ## Error
generic.error.title=Det oppstod en uventet feil
generic.error.instruction=Dette skulle ikke ha skjedd. Rapporter feilteksten nedenfor og legg inn en beskrivelse av hvilke trinn som førte til denne feilen.
# Defaults # Defaults
defaults.vault.vaultName=Hvelv defaults.vault.vaultName=Hvelv
@@ -44,6 +42,8 @@ addvaultwizard.new.locationPrompt=…
addvaultwizard.new.directoryPickerLabel=Tilpasset lagringssted addvaultwizard.new.directoryPickerLabel=Tilpasset lagringssted
addvaultwizard.new.directoryPickerButton=Velg… addvaultwizard.new.directoryPickerButton=Velg…
addvaultwizard.new.directoryPickerTitle=Velg mappe addvaultwizard.new.directoryPickerTitle=Velg mappe
addvaultwizard.new.fileAlreadyExists=En fil eller mappe med det hvelvnavnet finnes allerede
addvaultwizard.new.locationIsOk=Egnet sted for hvelvet ditt
addvaultwizard.new.invalidName=Ugyldig navn på hvelvet. Vennligst vurder et vanlig mappenavn. addvaultwizard.new.invalidName=Ugyldig navn på hvelvet. Vennligst vurder et vanlig mappenavn.
### Password ### Password
addvaultwizard.new.createVaultBtn=Opprett hvelv addvaultwizard.new.createVaultBtn=Opprett hvelv
@@ -91,7 +91,7 @@ forgetPassword.information=Dette vil slette det lagrede passordet til dette hvel
forgetPassword.confirmBtn=Glem passord forgetPassword.confirmBtn=Glem passord
# Unlock # Unlock
unlock.title=Lås opp hvelvet unlock.title=Lås opp "%s"
unlock.passwordPrompt=Skriv inn passordet for "%s": unlock.passwordPrompt=Skriv inn passordet for "%s":
unlock.savePassword=Husk passord unlock.savePassword=Husk passord
unlock.unlockBtn=Lås opp unlock.unlockBtn=Lås opp
@@ -124,7 +124,7 @@ migration.start.confirm=Ja, hvelvet mitt er fullstendig synkronisert
migration.run.enterPassword=Skriv inn passordet for "%s" migration.run.enterPassword=Skriv inn passordet for "%s"
migration.run.startMigrationBtn=Overfør hvelv migration.run.startMigrationBtn=Overfør hvelv
migration.run.progressHint=Dette kan ta litt tid… migration.run.progressHint=Dette kan ta litt tid…
## Sucess ## Success
migration.success.nextStepsInstructions=Vellykket overføring av "%s".\nDu kan nå låse opp hvelvet ditt. migration.success.nextStepsInstructions=Vellykket overføring av "%s".\nDu kan nå låse opp hvelvet ditt.
migration.success.unlockNow=Lås opp nå migration.success.unlockNow=Lås opp nå
## Missing file system capabilities ## Missing file system capabilities
@@ -140,8 +140,16 @@ migration.impossible.reason=Hvelvet kan ikke overføres automatisk fordi lagring
migration.impossible.moreInfo=Hvelvet kan fortsatt åpnes hvis du bruker en eldre versjon. For instruksjoner om hvordan man overfører et hvelv, besøk migration.impossible.moreInfo=Hvelvet kan fortsatt åpnes hvis du bruker en eldre versjon. For instruksjoner om hvordan man overfører et hvelv, besøk
# Health Check # Health Check
## Start
health.intro.remarkFix=Ikke alle problemer kan løses.
## Start Failure
health.fail.moreInfo=Mer informasjon
## Check Selection
## Detail view ## Detail view
## Checks ## Fix Application
health.fix.fixBtn=Reparer
health.fix.successTip=Vellykket reparering
health.fix.failTip=Repareringen feilet. Se loggen for detaljer
# Preferences # Preferences
preferences.title=Innstillinger preferences.title=Innstillinger
@@ -159,10 +167,6 @@ preferences.general.debugLogging=Aktiver loggføring av feilsøk
preferences.general.debugDirectory=Vis loggfiler preferences.general.debugDirectory=Vis loggfiler
preferences.general.autoStart=Start Cryptomator ved systemstart preferences.general.autoStart=Start Cryptomator ved systemstart
preferences.general.keychainBackend=Lagre passord med preferences.general.keychainBackend=Lagre passord med
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS nøkkelringtilgang
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection
preferences.general.interfaceOrientation=Grensesnittorientering preferences.general.interfaceOrientation=Grensesnittorientering
preferences.general.interfaceOrientation.ltr=Fra venstre til høyre preferences.general.interfaceOrientation.ltr=Fra venstre til høyre
preferences.general.interfaceOrientation.rtl=Fra høyre til venstre preferences.general.interfaceOrientation.rtl=Fra høyre til venstre
@@ -178,6 +182,7 @@ preferences.updates.autoUpdateCheck=Se etter oppdateringer automatisk
preferences.updates.checkNowBtn=Sjekk nå preferences.updates.checkNowBtn=Sjekk nå
preferences.updates.updateAvailable=Oppdatering til versjon %s er tilgjengelig. preferences.updates.updateAvailable=Oppdatering til versjon %s er tilgjengelig.
## Contribution ## Contribution
preferences.contribute=Støtt oss
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -224,6 +229,7 @@ main.dropZone.dropVault=Legg til dette hvelvet
main.dropZone.unknownDragboardContent=Hvis du vil legge til et hvelv, kan du dra det til dette vinduet main.dropZone.unknownDragboardContent=Hvis du vil legge til et hvelv, kan du dra det til dette vinduet
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klikk her for å legge til et hvelv main.vaultlist.emptyList.onboardingInstruction=Klikk her for å legge til et hvelv
main.vaultlist.contextMenu.remove=Fjern…
main.vaultlist.contextMenu.lock=Lås main.vaultlist.contextMenu.lock=Lås
main.vaultlist.contextMenu.unlock=Lås opp… main.vaultlist.contextMenu.unlock=Lås opp…
main.vaultlist.contextMenu.unlockNow=Lås opp nå main.vaultlist.contextMenu.unlockNow=Lås opp nå
@@ -272,11 +278,13 @@ wrongFileAlert.link=For ytterligere hjelp, besøk
## General ## General
vaultOptions.general=Generelt vaultOptions.general=Generelt
vaultOptions.general.vaultName=Navn på hvelvet vaultOptions.general.vaultName=Navn på hvelvet
vaultOptions.general.autoLock.lockAfterTimePart2=minutter
vaultOptions.general.unlockAfterStartup=Lås opp hvelvet når du starter Cryptomator vaultOptions.general.unlockAfterStartup=Lås opp hvelvet når du starter Cryptomator
vaultOptions.general.actionAfterUnlock=Etter vellykket opplåsing vaultOptions.general.actionAfterUnlock=Etter vellykket opplåsing
vaultOptions.general.actionAfterUnlock.ignore=Ikke gjør noe vaultOptions.general.actionAfterUnlock.ignore=Ikke gjør noe
vaultOptions.general.actionAfterUnlock.reveal=Gjør enheten synlig vaultOptions.general.actionAfterUnlock.reveal=Gjør enheten synlig
vaultOptions.general.actionAfterUnlock.ask=Spør vaultOptions.general.actionAfterUnlock.ask=Spør
## Mount ## Mount
vaultOptions.mount=Montering vaultOptions.mount=Montering
vaultOptions.mount.readonly=Skrivebeskyttet vaultOptions.mount.readonly=Skrivebeskyttet
@@ -292,10 +300,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Velg en tom mappe
vaultOptions.masterkey=Passord vaultOptions.masterkey=Passord
vaultOptions.masterkey.changePasswordBtn=Endre passord vaultOptions.masterkey.changePasswordBtn=Endre passord
vaultOptions.masterkey.forgetSavedPasswordBtn=Glem passord vaultOptions.masterkey.forgetSavedPasswordBtn=Glem passord
vaultOptions.masterkey.recoveryKeyExpanation=En gjenopprettingsnøkkel er den eneste måten å gjenopprette tilgangen til et hvelv på hvis du mister passordet. vaultOptions.masterkey.recoveryKeyExplanation=En gjenopprettingsnøkkel er den eneste måten å gjenopprette tilgangen til et hvelv på hvis du mister passordet.
vaultOptions.masterkey.showRecoveryKeyBtn=Vis gjenopprettingsnøkkelen vaultOptions.masterkey.showRecoveryKeyBtn=Vis gjenopprettingsnøkkelen
vaultOptions.masterkey.recoverPasswordBtn=Gjenopprett passord vaultOptions.masterkey.recoverPasswordBtn=Gjenopprett passord
## Auto Lock
# Recovery Key # Recovery Key
recoveryKey.title=Gjenopprettingsnøkkel recoveryKey.title=Gjenopprettingsnøkkel
+41 -28
View File
@@ -13,8 +13,11 @@ generic.button.done=Klaar
generic.button.next=Volgende generic.button.next=Volgende
generic.button.print=Afdrukken generic.button.print=Afdrukken
## Error ## Error
generic.error.title=Er is een onverwachte fout opgetreden generic.error.title=Fout %s
generic.error.instruction=Dit had niet moeten gebeuren. Rapporteer de onderstaande fouttekst en voeg een beschrijving toe van de stappen die tot deze fout hebben geleid. generic.error.instruction=Oeps! Cryptomator verwachtte niet dat dit zou gebeuren. U kunt bestaande oplossingen opzoeken voor deze fout, of indien er nog geen melding van deze fout is gemaakt mag u dit ook gerust doen.
generic.error.hyperlink.lookup=Deze fout opzoeken
generic.error.hyperlink.report=Deze fout melden
generic.error.technicalDetails=Details:
# Defaults # Defaults
defaults.vault.vaultName=Kluis defaults.vault.vaultName=Kluis
@@ -95,7 +98,7 @@ forgetPassword.information=Dit zal het opgeslagen wachtwoord van deze kluis uit
forgetPassword.confirmBtn=Wachtwoord vergeten forgetPassword.confirmBtn=Wachtwoord vergeten
# Unlock # Unlock
unlock.title=Kluis ontgrendelen unlock.title=Ontgrendel "%s"
unlock.passwordPrompt=Voer wachtwoord voor "%s" in: unlock.passwordPrompt=Voer wachtwoord voor "%s" in:
unlock.savePassword=Wachtwoord Onthouden unlock.savePassword=Wachtwoord Onthouden
unlock.unlockBtn=Ontgrendel unlock.unlockBtn=Ontgrendel
@@ -130,7 +133,7 @@ migration.start.confirm=Ja, mijn kluis is volledig gesynchroniseerd
migration.run.enterPassword=Voer wachtwoord voor "%s" in migration.run.enterPassword=Voer wachtwoord voor "%s" in
migration.run.startMigrationBtn=Kluis migreren migration.run.startMigrationBtn=Kluis migreren
migration.run.progressHint=Dit kan enige tijd duren… migration.run.progressHint=Dit kan enige tijd duren…
## Sucess ## Success
migration.success.nextStepsInstructions="%s" is succesvol gemigreerd.\nU kunt nu uw kluis ontgrendelen. migration.success.nextStepsInstructions="%s" is succesvol gemigreerd.\nU kunt nu uw kluis ontgrendelen.
migration.success.unlockNow=Nu Ontgrendelen migration.success.unlockNow=Nu Ontgrendelen
## Missing file system capabilities ## Missing file system capabilities
@@ -146,27 +149,38 @@ migration.impossible.reason=De kluis kan niet automatisch gemigreerd worden omda
migration.impossible.moreInfo=De kluis is nog te openen met een oudere versie. Instructies voor het handmatig migreren van een kluis zijn te vinden op migration.impossible.moreInfo=De kluis is nog te openen met een oudere versie. Instructies voor het handmatig migreren van een kluis zijn te vinden op
# Health Check # Health Check
health.title=Gezondheidcheck kluis ## Start
health.start.introduction=De gezondheidscheck van de kluis is een verzameling controles om problemen in de interne structuur van uw kluis op te sporen en op te lossen. Houd er rekening mee dat niet alle problemen opgelost zijn. Je hebt het kluiswachtwoord nodig om de controles uit te voeren. health.title=Controle van "%s"
health.start.configValid=Het lezen en verwerken van het configuratiebestand van de kluis is gelukt. Ga door en selecteer controles. health.intro.header=Controle
health.start.configInvalid=Fout bij het lezen en verwerken van het configuratiebestand van de kluis. health.intro.text=Controles zijn er voor het detecteren en indien mogelijk oplossen van problemen met de interne structuur van uw kluis. Houd daarbij rekening met het volgende:
health.checkList.header=Beschikbare gezondheidscontroles health.intro.remarkSync=Zorg er voor dat alle apparaten volledig gesynchroniseerd zijn. Dit lost de meeste problemen op.
health.checkList.selectAllBox=Alles selecteren health.intro.remarkFix=Niet alle problemen kunnen opgelost worden.
health.intro.remarkBackup=Als data is beschadigd, kan alleen een back-up helpen.
health.intro.affirmation=Ik heb de informatie hierboven gelezen en begrepen
## Start Failure
health.fail.header=Fout bij het laden van de kluisconfiguratie
health.fail.ioError=Er is een fout opgetreden tijdens het openen en lezen van het configuratiebestand.
health.fail.parseError=Er is een fout opgetreden bij het inladen van de kluisconfiguratie.
health.fail.moreInfo=Meer informatie
## Check Selection
health.checkList.description=Selecteer controles in de lijst aan de linkerkant, of gebruik de onderstaande knoppen.
health.checkList.selectAllButton=Selecteer alle controles
health.checkList.deselectAllButton=Deselecteer alle controles
health.check.runBatchBtn=Geselecteerde controles uitvoeren health.check.runBatchBtn=Geselecteerde controles uitvoeren
## Detail view ## Detail view
health.check.detail.noSelectedCheck=Voor resultaten selecteert u een voltooide gezondheidscontrole in de linker lijst. health.check.detail.noSelectedCheck=Voor resultaten selecteert u een voltooide gezondheidscontrole in de linker lijst.
health.check.detail.header=Resultaten voor: %s health.check.detail.checkScheduled=De controle is ingepland.
health.check.detail.taskNotStarted=De controle werd niet geselecteerd om uit te voeren. health.check.detail.checkRunning=De controle wordt momenteel uitgevoerd…
health.check.detail.taskScheduled=De controle is ingepland. health.check.detail.checkSkipped=De controle was niet geselecteerd om uit te voeren.
health.check.detail.taskRunning=De controle wordt momenteel uitgevoerd… health.check.detail.checkFinished=De controle is succesvol beëindigd.
health.check.detail.taskSucceeded=De controle is succesvol uitgevoerd na %d milliseconden. health.check.detail.checkFinishedAndFound=De controle is beëindigd. Bekijk alstublieft de resultaten.
health.check.detail.taskFailed=De controle is afgesloten door een fout. health.check.detail.checkFailed=De controle is afgesloten door een fout.
health.check.detail.taskCancelled=De controle is geannuleerd. health.check.detail.checkCancelled=De controle werd geannuleerd.
health.check.detail.problemCount=%d problemen gevonden en %d onoplosbare fouten.
health.check.exportBtn=Exporteer rapport health.check.exportBtn=Exporteer rapport
health.check.fixBtn=Repareren ## Fix Application
## Checks health.fix.fixBtn=Herstel
health.org.cryptomator.cryptofs.health.dirid.DirIdCheck=Map Controle health.fix.successTip=Hersteld
health.fix.failTip=Herstellen mislukt, zie logboek voor details
# Preferences # Preferences
preferences.title=Voorkeuren preferences.title=Voorkeuren
@@ -184,10 +198,6 @@ preferences.general.debugLogging=Debug logging aanzetten
preferences.general.debugDirectory=Logboekbestanden bekijken preferences.general.debugDirectory=Logboekbestanden bekijken
preferences.general.autoStart=Start Cryptomator als het systeem opstart preferences.general.autoStart=Start Cryptomator als het systeem opstart
preferences.general.keychainBackend=Bewaar wachtwoorden met preferences.general.keychainBackend=Bewaar wachtwoorden met
preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome sleutelhanger
preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS-sleutelhangertoegang
preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows-gegevensbescherming
preferences.general.interfaceOrientation=Interface oriëntatie preferences.general.interfaceOrientation=Interface oriëntatie
preferences.general.interfaceOrientation.ltr=Links naar rechts preferences.general.interfaceOrientation.ltr=Links naar rechts
preferences.general.interfaceOrientation.rtl=Rechts naar links preferences.general.interfaceOrientation.rtl=Rechts naar links
@@ -304,12 +314,15 @@ wrongFileAlert.link=Voor verdere ondersteuning, bezoek
## General ## General
vaultOptions.general=Algemeen vaultOptions.general=Algemeen
vaultOptions.general.vaultName=Kluisnaam vaultOptions.general.vaultName=Kluisnaam
vaultOptions.general.autoLock.lockAfterTimePart1=Vergrendel wanneer inactief voor
vaultOptions.general.autoLock.lockAfterTimePart2=minuten
vaultOptions.general.unlockAfterStartup=Ontgrendel kluis bij het starten van Cryptomator vaultOptions.general.unlockAfterStartup=Ontgrendel kluis bij het starten van Cryptomator
vaultOptions.general.actionAfterUnlock=Na een succesvolle ontgrendeling vaultOptions.general.actionAfterUnlock=Na een succesvolle ontgrendeling
vaultOptions.general.actionAfterUnlock.ignore=Niets doen vaultOptions.general.actionAfterUnlock.ignore=Niets doen
vaultOptions.general.actionAfterUnlock.reveal=Toon Schijf vaultOptions.general.actionAfterUnlock.reveal=Toon Schijf
vaultOptions.general.actionAfterUnlock.ask=Vragen vaultOptions.general.actionAfterUnlock.ask=Vragen
vaultOptions.general.healthBtn=Start gezondheidscontrole vaultOptions.general.startHealthCheckBtn=Start controle
## Mount ## Mount
vaultOptions.mount=Aankoppelen vaultOptions.mount=Aankoppelen
vaultOptions.mount.readonly=Alleen-Lezen vaultOptions.mount.readonly=Alleen-Lezen
@@ -325,10 +338,10 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Kies een lege map
vaultOptions.masterkey=Wachtwoord vaultOptions.masterkey=Wachtwoord
vaultOptions.masterkey.changePasswordBtn=Wijzig wachtwoord vaultOptions.masterkey.changePasswordBtn=Wijzig wachtwoord
vaultOptions.masterkey.forgetSavedPasswordBtn=Opgeslagen wachtwoord vergeten vaultOptions.masterkey.forgetSavedPasswordBtn=Opgeslagen wachtwoord vergeten
vaultOptions.masterkey.recoveryKeyExpanation=Een herstelsleutel is je enige manier om de toegang tot een kluis te herstellen als je je wachtwoord kwijtraakt. vaultOptions.masterkey.recoveryKeyExplanation=Een herstelsleutel is je enige manier om de toegang tot een kluis te herstellen als je je wachtwoord kwijtraakt.
vaultOptions.masterkey.showRecoveryKeyBtn=Toon herstelsleutel vaultOptions.masterkey.showRecoveryKeyBtn=Toon herstelsleutel
vaultOptions.masterkey.recoverPasswordBtn=Wachtwoord herstellen vaultOptions.masterkey.recoverPasswordBtn=Wachtwoord herstellen
## Auto Lock
# Recovery Key # Recovery Key
recoveryKey.title=Herstelsleutel recoveryKey.title=Herstelsleutel

Some files were not shown because too many files have changed in this diff Show More