Merge branch 'develop' into feature/displayName

# Conflicts:
#	pom.xml
This commit is contained in:
Sebastian Stenzel
2021-12-02 08:52:40 +01:00
89 changed files with 1715 additions and 439 deletions

View File

@@ -39,15 +39,11 @@ jobs:
profile: mac
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
- uses: actions/setup-java@v2
with:
distribution: 'temurin'
java-version: ${{ env.JAVA_VERSION }}
- uses: actions/cache@v2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
cache: 'maven'
- name: Ensure to use tagged version
run: mvn versions:set -DnewVersion=${GITHUB_REF##*/} # use shell parameter expansion to strip of 'refs/tags'
if: startsWith(github.ref, 'refs/tags/')
@@ -145,6 +141,7 @@ jobs:
jpackageoptions: >
--app-version "${{ needs.metadata.outputs.semVerNum }}"
--java-options "-Dfile.encoding=\"utf-8\""
--java-options "-Dapple.awt.enableTemplateImages=true"
--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\""
@@ -155,8 +152,9 @@ jobs:
--resource-dir dist/mac/resources
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
- uses: actions/setup-java@v2
with:
distribution: 'temurin'
java-version: ${{ env.JAVA_VERSION }}
- name: Download ${{ matrix.profile }}-buildkit
uses: actions/download-artifact@v2
@@ -206,7 +204,7 @@ jobs:
ppa:
name: Upload source package to PPA
needs: [buildkit, metadata]
runs-on: ubuntu-latest
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- name: install build tools
@@ -380,8 +378,8 @@ jobs:
OUTPUT_PATH=${JAR_PATH%.*}
echo "Codesigning libs in ${JAR_FILENAME}..."
unzip -q ${JAR_PATH} -d ${OUTPUT_PATH}
find ${OUTPUT_PATH} -name '*.dylib' -exec codesign -s ${CODESIGN_IDENTITY} {} \;
find ${OUTPUT_PATH} -name '*.jnilib' -exec codesign -s ${CODESIGN_IDENTITY} {} \;
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} *
@@ -501,8 +499,9 @@ jobs:
name: win-appdir
- name: Untar appdir.tar
run: tar -xvf appdir.tar
- uses: actions/setup-java@v1
- uses: actions/setup-java@v2
with:
distribution: 'temurin'
java-version: ${{ env.JAVA_VERSION }}
- name: Patch Application Directory
run: |
@@ -534,6 +533,9 @@ jobs:
--app-version "${{ needs.metadata.outputs.semVerNum }}"
--win-menu
--win-dir-chooser
--win-shortcut-prompt
--win-update-url "https:\\cryptomator.org"
--win-menu-group Cryptomator
--resource-dir dist/win/resources
--license-file dist/win/resources/license.rtf
--file-associations dist/win/resources/FAvaultFile.properties
@@ -549,7 +551,7 @@ jobs:
timestampUrl: 'http://timestamp.digicert.com'
folder: installer
- name: Add possible alpha/beta tags to installer name
run: mv installer/Cryptomator-*.msi installer/Cryptomator-${{ needs.metadata.outputs.semVerStr }}.msi
run: mv installer/Cryptomator-*.msi installer/Cryptomator-${{ needs.metadata.outputs.semVerStr }}-x64.msi
- name: Upload win-msi
uses: actions/upload-artifact@v2
with:
@@ -563,12 +565,8 @@ jobs:
release:
name: Draft a release on Github
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'
env:
APPIMAGE_SHA256_MSG: undefined
DMG_SHA256_MSG: undefined
MSI_SHA256_MSG: undefined
steps:
- uses: actions/checkout@v2
- name: Create tarball
@@ -594,14 +592,13 @@ jobs:
env:
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
- name: Compute SHA256 checksums of release artifacts # sha256sum is split on the whitespace with sed and reorderd. env keys are file name extensions in uppercase
- name: Compute SHA256 checksums of release artifacts
run: |
for FILE in `find . -name "*.AppImage" -o -name "*.dmg" -o -name "*.msi" -o -name "*.zsync" -o -name "*.tar.gz"`; do
CHECKSUM_MSG=$(sha256sum ${FILE})
VALUE=$(echo ${CHECKSUM_MSG} | sed 's/\([0-9,a-f]\{64\}\)[[:blank:]]\([Cc]ryptomator-.*$\)/\2: `\1`/' )
KEY=$(echo ${CHECKSUM_MSG} | sed 's/.*[[:blank:]].*\.\(.*$\)/\1/')
echo "{${KEY^^}_SHA256_MSG}={${VALUE}} >> $GITHUB_ENV
done
SHA256_SUMS=`find . -name "*.AppImage" -o -name "*.dmg" -o -name "*.msi" -o -name "*.tar.gz" | xargs sha256sum`
echo "SHA256_SUMS<<EOF" >> $GITHUB_ENV
echo "${SHA256_SUMS}" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
continue-on-error: true
- name: Create release draft
uses: softprops/action-gh-release@v1
with:
@@ -623,7 +620,7 @@ jobs:
---
:scroll: A complete list of closed issues is available [here](LINK)
---
Checksums of release artifacts:
* ${{ env.APPIMAGE_SHA256_MSG}}
* ${{ env.DMG_SHA256_MSG}}
* ${{ env.MSI_SHA_256_MSG}}
:floppy_disk: SHA-256 checksums of release artifacts:
```
${{ env.SHA256_SUMS }}
```

1
.idea/icon.svg generated Normal file
View File

@@ -0,0 +1 @@
<svg width="1110" height="942" 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

View File

@@ -5,7 +5,7 @@
</envs>
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.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.pluginDir=&quot;~/Library/Application Support/Cryptomator/Plugins&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m -ea" />
<option name="VM_PARAMETERS" value="-Duser.language=en -Dapple.awt.enableTemplateImages=true -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">
<option name="Make" enabled="true" />
</method>

View File

@@ -5,7 +5,7 @@
</envs>
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.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.pluginDir=&quot;~/Library/Application Support/Cryptomator-Dev/Plugins&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m -ea" />
<option name="VM_PARAMETERS" value="-Duser.language=en -Dapple.awt.enableTemplateImages=true -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">
<option name="Make" enabled="true" />
</method>

View File

@@ -28,6 +28,14 @@ Cryptomator is provided free of charge as an open-source project despite the hig
### Silver Sponsors
<table>
<tbody>
<tr>
<td><a href="https://mowcapital.com/"><img src="https://cryptomator.org/img/sponsors/mowcapital.svg" alt="Mow Capital" height="40"></a></td>
</tr>
</tbody>
</table>
- [Jameson Lopp](https://www.lopp.net/)
---

View File

@@ -8,8 +8,11 @@ if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/pat
command -v mvn >/dev/null 2>&1 || { echo >&2 "mvn not found."; exit 1; }
command -v curl >/dev/null 2>&1 || { echo >&2 "curl not found."; exit 1; }
VERSION=$(mvn -f ../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout)
# compile
mvn -B -f../../pom.xml clean package -DskipTests -Plinux
mvn -B -f ../../../pom.xml clean package -DskipTests -Plinux
cp ../../../target/cryptomator-*.jar ../../../target/mods
# add runtime
${JAVA_HOME}/bin/jlink \
@@ -26,8 +29,8 @@ ${JAVA_HOME}/bin/jpackage \
--verbose \
--type app-image \
--runtime-image runtime \
--input buildkit/libs \
--module-path buildkit/mods \
--input ../../../target/libs \
--module-path ../../../target/mods \
--module org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator \
--dest . \
--name Cryptomator \
@@ -35,19 +38,20 @@ ${JAVA_HOME}/bin/jpackage \
--copyright "(C) 2016 - 2021 Skymatic GmbH" \
--java-options "-Xss5m" \
--java-options "-Xmx256m" \
--app-version "${{ needs.metadata.outputs.versionNum }}.${{ needs.metadata.outputs.revNum }}" \
--app-version "${VERSION}.${REVISION_NO}" \
--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=\"appimage-${{ needs.metadata.outputs.revNum }}\"" \
--java-options "-Dcryptomator.buildNumber=\"appimage-${REVISION_NO}\"" \
--resource-dir ../resources
# transform AppDir
mv Cryptomator Cryptomator.AppDir
cp -r dist/linux/appimage/resources/AppDir/* Cryptomator.AppDir/
cp -r resources/AppDir/* Cryptomator.AppDir/
chmod +x Cryptomator.AppDir/lib/runtime/bin/java
envsubst '${REVISION_NO}' < 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
@@ -70,4 +74,4 @@ chmod +x /tmp/appimagetool.AppImage
/tmp/appimagetool.AppImage \
Cryptomator.AppDir \
cryptomator-SNAPSHOT-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'

View File

@@ -1,4 +1,4 @@
cryptomator (${PPA_VERSION}) focal; urgency=low
cryptomator (${PPA_VERSION}) bionic; urgency=low
* Full changelog can be found on https://github.com/cryptomator/cryptomator/releases

View File

@@ -1,3 +1,4 @@
# created during build
runtime/
*.app/
dmg/
*.dmg

28
dist/mac/dmg/build.sh vendored
View File

@@ -16,13 +16,14 @@ shift "$((OPTIND-1))"
# prepare working dir and variables
cd $(dirname $0)
rm -rf runtime *.app
rm -rf runtime dmg
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; }
command -v create-dmg >/dev/null 2>&1 || { echo >&2 "create-dmg 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
@@ -59,6 +60,7 @@ ${JAVA_HOME}/bin/jpackage \
--java-options "-Dcryptomator.appVersion=\"${VERSION_NO}\"" \
--app-version "${VERSION_NO}" \
--java-options "-Dfile.encoding=\"utf-8\"" \
--java-options "-Dapple.awt.enableTemplateImages=true" \
--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\"" \
@@ -94,3 +96,27 @@ if [ -n "${CODESIGN_IDENTITY}" ]; then
echo "Codesigning Cryptomator.app..."
codesign --force --deep --entitlements ../Cryptomator.entitlements -o runtime -s ${CODESIGN_IDENTITY} Cryptomator.app
fi
# prepare dmg contents
mkdir dmg
mv Cryptomator.app dmg
cp resources/macFUSE.webloc dmg
# create dmg
create-dmg \
--volname Cryptomator \
--volicon "resources/Cryptomator-Volume.icns" \
--background "resources/Cryptomator-background.tiff" \
--window-pos 400 100 \
--window-size 640 694 \
--icon-size 128 \
--icon "Cryptomator.app" 128 245 \
--hide-extension "Cryptomator.app" \
--icon "macFUSE.webloc" 320 501 \
--hide-extension "macFUSE.webloc" \
--app-drop-link 512 245 \
--eula "resources/license.rtf" \
--icon ".background" 128 758 \
--icon ".fseventsd" 320 758 \
--icon ".VolumeIcon.icns" 512 758 \
Cryptomator-${VERSION_NO}.dmg dmg

3
dist/win/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
runtime
Cryptomator
installer

2
dist/win/build.bat vendored Normal file
View File

@@ -0,0 +1,2 @@
@echo off
powershell -NoLogo -NoExit -ExecutionPolicy Unrestricted -Command .\build.ps1

90
dist/win/build.ps1 vendored Normal file
View File

@@ -0,0 +1,90 @@
# check preconditions
if ((Get-Command "git" -ErrorAction SilentlyContinue) -eq $null)
{
Write-Host "Unable to find git.exe in your PATH (try: choco install git)"
exit 1
}
if ((Get-Command "mvn" -ErrorAction SilentlyContinue) -eq $null)
{
Write-Host "Unable to find mvn.cmd in your PATH (try: choco install maven)"
exit 1
}
$buildDir = Split-Path -Parent $PSCommandPath
$version = $(mvn -f $buildDir/../../pom.xml help:evaluate -Dexpression="project.version" -q -DforceStdout)
$semVerNo = $version -replace '(\d\.\d\.\d).*','$1'
$revisionNo = $(git rev-list --count HEAD)
Write-Output "`$version=$version"
Write-Output "`$semVerNo=$semVerNo"
Write-Output "`$revisionNo=$revisionNo"
Write-Output "`$buildDir=$buildDir"
Write-Output "`$Env:JAVA_HOME=$Env:JAVA_HOME"
# compile
&mvn -B -f $buildDir/../../pom.xml clean package -DskipTests -Pwin
Copy-Item "$buildDir\..\..\target\cryptomator-*.jar" -Destination "$buildDir\..\..\target\mods"
# add runtime
& "$Env:JAVA_HOME\bin\jlink" `
--verbose `
--output runtime `
--module-path "$Env: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
& "$Env: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=`"$semVerNo`"" `
--app-version "$semVerNo.$revisionNo" `
--java-options "-Dfile.encoding=`"utf-8`"" `
--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.ipcSocketPath=`"~/AppData/Roaming/Cryptomator/ipc.socket`"" `
--java-options "-Dcryptomator.keychainPath=`"~/AppData/Roaming/Cryptomator/keychain.json`"" `
--java-options "-Dcryptomator.mountPointsDir=`"~/Cryptomator`"" `
--java-options "-Dcryptomator.showTrayIcon=true" `
--java-options "-Dcryptomator.buildNumber=`"msi-$revisionNo`"" `
--resource-dir resources `
--icon resources/Cryptomator.ico
# patch app dir
Copy-Item "contrib\*" -Destination "Cryptomator"
attrib -r "Cryptomator\Cryptomator.exe"
# create .msi bundle
$Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources"
& "$Env:JAVA_HOME\bin\jpackage" `
--verbose `
--type msi `
--win-upgrade-uuid bda45523-42b1-4cae-9354-a45475ed4775 `
--app-image Cryptomator `
--dest installer `
--name Cryptomator `
--vendor "Skymatic GmbH" `
--copyright "(C) 2016 - 2021 Skymatic GmbH" `
--app-version "$semVerNo" `
--win-menu `
--win-dir-chooser `
--win-shortcut-prompt `
--win-update-url "https:\\cryptomator.org" `
--win-menu-group Cryptomator `
--resource-dir resources `
--license-file resources/license.rtf `
--file-associations resources/FAvaultFile.properties

3
dist/win/contrib/patchWebDAV.bat vendored Normal file
View File

@@ -0,0 +1,3 @@
@echo off
cd %~dp0
powershell -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -Command .\patchWebDAV.ps1

61
dist/win/contrib/patchWebDAV.ps1 vendored Normal file
View File

@@ -0,0 +1,61 @@
#Requires -RunAsAdministrator
# Adds for address 127.0.0.1 the 'cryptomator-vault' alias to the hosts file
function Add-AliasToHost {
$sysdir = [Environment]::SystemDirectory
$hostsFile = "$sysdir\drivers\etc\hosts"
$aliasLine = '127.0.0.1 cryptomator-vault'
foreach ($line in Get-Content $hostsFile) {
if ($line -eq $aliasLine){
return
}
}
Add-Content -Path $hostsFile -Encoding ascii -Value "`r`n$aliasLine"
}
# Sets in the registry the webclient file size limit to the maximum value
function Set-WebDAVFileSizeLimit {
# Set variables to indicate value and key to set
$RegistryPath = 'HKLM:\SYSTEM\CurrentControlSet\Services\WebClient\Parameters'
$Name = 'FileSizeLimitInBytes'
$Value = '0xffffffff'
# Create the key if it does not exist
If (-NOT (Test-Path $RegistryPath)) {
New-Item -Path $RegistryPath -Force | Out-Null
}
# Now set the value
New-ItemProperty -Path $RegistryPath -Name $Name -Value $Value -PropertyType DWORD -Force | Out-Null
}
# Changes the network provider order such that the builtin Windows webclient is always first
function Edit-ProviderOrder {
$RegistryPath = 'HKLM:\SYSTEM\CurrentControlSet\Control\NetworkProvider\HwOrder'
$Name = 'ProviderOrder'
$WebClientString = 'webclient'
$CurrentOrder = (Get-ItemProperty $RegistryPath $Name).$Name
$OrderWithoutWebclientArray = $CurrentOrder -split ',' | Where-Object {$_ -ne $WebClientString}
$WebClientArray = @($WebClientString)
$UpdatedOrder = ($WebClientArray + $OrderWithoutWebclientArray) -join ","
New-ItemProperty -Path $RegistryPath -Name $Name -Value $UpdatedOrder -PropertyType String -Force | Out-Null
}
Add-AliasToHost
Write-Output 'Ensured alias exists in hosts file'
Set-WebDAVFileSizeLimit
Write-Output 'Set WebDAV file size limit'
Edit-ProviderOrder
Write-Output 'Ensured correct provider order'
exit 0

View File

@@ -11,36 +11,30 @@ This program is distributed in the hope that it will be useful, but WITHOUT ANY
\par
You should have received a copy of the GNU General Public License along with this program. If not, see {{\field{\*\fldinst{HYPERLINK http://www.gnu.org/licenses/ }}{\fldrslt{http://www.gnu.org/licenses/\ul0\cf0}}}}\f0\fs16 .\par
\par
\b Cryptomator uses 49 third-party dependencies under the following licenses:\b0\par
\b Cryptomator uses 40 third-party dependencies under the following licenses:\b0\par
\tab Apache License v2.0:\par
\tab\tab - HKDF-RFC5869 (at.favre.lib:hkdf:1.0.2 - {{\field{\*\fldinst{HYPERLINK https://github.com/patrickfav/hkdf }}{\fldrslt{https://github.com/patrickfav/hkdf\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - jffi (com.github.jnr:jffi:1.2.23 - {{\field{\*\fldinst{HYPERLINK http://github.com/jnr/jffi }}{\fldrslt{http://github.com/jnr/jffi\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - jnr-a64asm (com.github.jnr:jnr-a64asm:1.0.0 - {{\field{\*\fldinst{HYPERLINK http://nexus.sonatype.org/oss-repository-hosting.html/jnr-a64asm }}{\fldrslt{http://nexus.sonatype.org/oss-repository-hosting.html/jnr-a64asm\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - jnr-constants (com.github.jnr:jnr-constants:0.9.15 - {{\field{\*\fldinst{HYPERLINK http://github.com/jnr/jnr-constants }}{\fldrslt{http://github.com/jnr/jnr-constants\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - jnr-ffi (com.github.jnr:jnr-ffi:2.1.12 - {{\field{\*\fldinst{HYPERLINK http://github.com/jnr/jnr-ffi }}{\fldrslt{http://github.com/jnr/jnr-ffi\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - FindBugs-jsr305 (com.google.code.findbugs:jsr305:3.0.2 - {{\field{\*\fldinst{HYPERLINK http://findbugs.sourceforge.net/ }}{\fldrslt{http://findbugs.sourceforge.net/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Gson (com.google.code.gson:gson:2.8.6 - {{\field{\*\fldinst{HYPERLINK https://github.com/google/gson/gson }}{\fldrslt{https://github.com/google/gson/gson\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Dagger (com.google.dagger:dagger:2.27 - {{\field{\*\fldinst{HYPERLINK https://github.com/google/dagger }}{\fldrslt{https://github.com/google/dagger\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - error-prone annotations (com.google.errorprone:error_prone_annotations:2.3.4 - {{\field{\*\fldinst{HYPERLINK http://nexus.sonatype.org/oss-repository-hosting.html/error_prone_parent/error_prone_annotations }}{\fldrslt{http://nexus.sonatype.org/oss-repository-hosting.html/error_prone_parent/error_prone_annotations\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Gson (com.google.code.gson:gson:2.8.7 - {{\field{\*\fldinst{HYPERLINK https://github.com/google/gson/gson }}{\fldrslt{https://github.com/google/gson/gson\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Dagger (com.google.dagger:dagger:2.38.1 - {{\field{\*\fldinst{HYPERLINK https://github.com/google/dagger }}{\fldrslt{https://github.com/google/dagger\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Guava InternalFutureFailureAccess and InternalFutures (com.google.guava:failureaccess:1.0.1 - {{\field{\*\fldinst{HYPERLINK https://github.com/google/guava/failureaccess }}{\fldrslt{https://github.com/google/guava/failureaccess\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Guava: Google Core Libraries for Java (com.google.guava:guava:28.2-jre - {{\field{\*\fldinst{HYPERLINK https://github.com/google/guava/guava }}{\fldrslt{https://github.com/google/guava/guava\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Guava ListenableFuture only (com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava - {{\field{\*\fldinst{HYPERLINK https://github.com/google/guava/listenablefuture }}{\fldrslt{https://github.com/google/guava/listenablefuture\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - J2ObjC Annotations (com.google.j2objc:j2objc-annotations:1.3 - {{\field{\*\fldinst{HYPERLINK https://github.com/google/j2objc/ }}{\fldrslt{https://github.com/google/j2objc/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Guava: Google Core Libraries for Java (com.google.guava:guava:30.1.1-jre - {{\field{\*\fldinst{HYPERLINK https://github.com/google/guava/guava }}{\fldrslt{https://github.com/google/guava/guava\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Apache Commons CLI (commons-cli:commons-cli:1.4 - {{\field{\*\fldinst{HYPERLINK http://commons.apache.org/proper/commons-cli/ }}{\fldrslt{http://commons.apache.org/proper/commons-cli/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - javax.inject (javax.inject:javax.inject:1 - {{\field{\*\fldinst{HYPERLINK http://code.google.com/p/atinject/ }}{\fldrslt{http://code.google.com/p/atinject/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Java Native Access (net.java.dev.jna:jna:5.1.0 - {{\field{\*\fldinst{HYPERLINK https://github.com/java-native-access/jna }}{\fldrslt{https://github.com/java-native-access/jna\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Java Native Access Platform (net.java.dev.jna:jna-platform:5.1.0 - {{\field{\*\fldinst{HYPERLINK https://github.com/java-native-access/jna }}{\fldrslt{https://github.com/java-native-access/jna\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Apache Commons Lang (org.apache.commons:commons-lang3:3.9 - {{\field{\*\fldinst{HYPERLINK http://commons.apache.org/proper/commons-lang/ }}{\fldrslt{http://commons.apache.org/proper/commons-lang/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jackrabbit WebDAV Library (org.apache.jackrabbit:jackrabbit-webdav:2.19.0 - {{\field{\*\fldinst{HYPERLINK http://jackrabbit.apache.org/jackrabbit-webdav/ }}{\fldrslt{http://jackrabbit.apache.org/jackrabbit-webdav/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Utilities :: Ajax(JSON) (org.eclipse.jetty:jetty-util-ajax:9.4.35.v20201120 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-util-ajax }}{\fldrslt{{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Java Native Access (net.java.dev.jna:jna:5.7.0 - {{\field{\*\fldinst{HYPERLINK https://github.com/java-native-access/jna }}{\fldrslt{https://github.com/java-native-access/jna\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Java Native Access Platform (net.java.dev.jna:jna-platform:5.7.0 - {{\field{\*\fldinst{HYPERLINK https://github.com/java-native-access/jna }}{\fldrslt{https://github.com/java-native-access/jna\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Apache Commons Lang (org.apache.commons:commons-lang3:3.12.0 - {{\field{\*\fldinst{HYPERLINK https://commons.apache.org/proper/commons-lang/ }}{\fldrslt{https://commons.apache.org/proper/commons-lang/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Apache HttpCore (org.apache.httpcomponents:httpcore:4.4.14 - {{\field{\*\fldinst{HYPERLINK http://hc.apache.org/httpcomponents-core-ga }}{\fldrslt{http://hc.apache.org/httpcomponents-core-ga\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jackrabbit WebDAV Library (org.apache.jackrabbit:jackrabbit-webdav:2.21.5 - {{\field{\*\fldinst{HYPERLINK http://jackrabbit.apache.org/jackrabbit-webdav/ }}{\fldrslt{http://jackrabbit.apache.org/jackrabbit-webdav/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Http Utility (org.eclipse.jetty:jetty-http:10.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-http }}{\fldrslt{https://eclipse.org/jetty/jetty-http\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: IO Utility (org.eclipse.jetty:jetty-io:10.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-io }}{\fldrslt{https://eclipse.org/jetty/jetty-io\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Security (org.eclipse.jetty:jetty-security:10.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-security }}{\fldrslt{https://eclipse.org/jetty/jetty-security\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Server Core (org.eclipse.jetty:jetty-server:10.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-server }}{\fldrslt{https://eclipse.org/jetty/jetty-server\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:10.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-servlet }}{\fldrslt{https://eclipse.org/jetty/jetty-servlet\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Utilities (org.eclipse.jetty:jetty-util:10.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-util }}{\fldrslt{https://eclipse.org/jetty/jetty-util\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Servlet API and Schemas for JPMS and OSGi (org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-servlet-api }}{\fldrslt{https://eclipse.org/jetty/jetty-servlet-api\ul0\cf0}}}}\f0\fs16 )\par
\tab BSD:\par
\tab\tab - asm (org.ow2.asm:asm:7.1 - {{\field{\*\fldinst{HYPERLINK http://asm.ow2.org/ }}{\fldrslt{http://asm.ow2.org/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - asm-analysis (org.ow2.asm:asm-analysis:7.1 - {{\field{\*\fldinst{HYPERLINK http://asm.ow2.org/ }}{\fldrslt{http://asm.ow2.org/\ul0\cf0}}}}\f0\fs16 )\par
@@ -48,45 +42,44 @@ You should have received a copy of the GNU General Public License along with thi
\tab\tab - asm-tree (org.ow2.asm:asm-tree:7.1 - {{\field{\*\fldinst{HYPERLINK http://asm.ow2.org/ }}{\fldrslt{http://asm.ow2.org/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - asm-util (org.ow2.asm:asm-util:7.1 - {{\field{\*\fldinst{HYPERLINK http://asm.ow2.org/ }}{\fldrslt{http://asm.ow2.org/\ul0\cf0}}}}\f0\fs16 )\par
\tab Eclipse Public License - Version 1.0:\par
\tab\tab - Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Utilities :: Ajax(JSON) (org.eclipse.jetty:jetty-util-ajax:9.4.35.v20201120 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-util-ajax }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.17.v20190418 - {{\field{\*\fldinst{HYPERLINK http://www.eclipse.org/jetty }}{\fldrslt{http://www.eclipse.org/jetty\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Servlet API and Schemas for JPMS and OSGi (org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-servlet-api }}{\fldrslt{https://eclipse.org/jetty/jetty-servlet-api\ul0\cf0}}}}\f0\fs16 )\par
\tab Eclipse Public License - Version 2.0:\par
\tab\tab - Jetty :: Http Utility (org.eclipse.jetty:jetty-http:10.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-http }}{\fldrslt{https://eclipse.org/jetty/jetty-http\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: IO Utility (org.eclipse.jetty:jetty-io:10.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-io }}{\fldrslt{https://eclipse.org/jetty/jetty-io\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Security (org.eclipse.jetty:jetty-security:10.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-security }}{\fldrslt{https://eclipse.org/jetty/jetty-security\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Server Core (org.eclipse.jetty:jetty-server:10.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-server }}{\fldrslt{https://eclipse.org/jetty/jetty-server\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:10.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-servlet }}{\fldrslt{https://eclipse.org/jetty/jetty-servlet\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Jetty :: Utilities (org.eclipse.jetty:jetty-util:10.0.6 - {{\field{\*\fldinst{HYPERLINK https://eclipse.org/jetty/jetty-util }}{\fldrslt{https://eclipse.org/jetty/jetty-util\ul0\cf0}}}}\f0\fs16 )\par
\tab Eclipse Public License - v 1.0:\par
\tab\tab - Logback Classic Module (ch.qos.logback:logback-classic:1.2.3 - {{\field{\*\fldinst{HYPERLINK http://logback.qos.ch/logback-classic }}{\fldrslt{http://logback.qos.ch/logback-classic\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Logback Core Module (ch.qos.logback:logback-core:1.2.3 - {{\field{\*\fldinst{HYPERLINK http://logback.qos.ch/logback-core }}{\fldrslt{http://logback.qos.ch/logback-core\ul0\cf0}}}}\f0\fs16 )\par
\tab Eclipse Public License - v 2.0:\par
\tab\tab - jnr-posix (com.github.jnr:jnr-posix:3.0.54 - {{\field{\*\fldinst{HYPERLINK http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix }}{\fldrslt{http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix\ul0\cf0}}}}\f0\fs16 )\par
\tab GNU Lesser General Public License:\par
\tab\tab - Logback Classic Module (ch.qos.logback:logback-classic:1.2.3 - {{\field{\*\fldinst{HYPERLINK http://logback.qos.ch/logback-classic }}{\fldrslt{http://logback.qos.ch/logback-classic\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Logback Core Module (ch.qos.logback:logback-core:1.2.3 - {{\field{\*\fldinst{HYPERLINK http://logback.qos.ch/logback-core }}{\fldrslt{http://logback.qos.ch/logback-core\ul0\cf0}}}}\f0\fs16 )\par
\tab GPLv2:\par
\tab\tab - jnr-posix (com.github.jnr:jnr-posix:3.0.54 - {{\field{\*\fldinst{HYPERLINK http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix }}{\fldrslt{http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix\ul0\cf0}}}}\f0\fs16 )\par
\tab GPLv2+CE:\par
\tab\tab - Java Servlet API (javax.servlet:javax.servlet-api:3.1.0 - {{\field{\*\fldinst{HYPERLINK http://servlet-spec.java.net }}{\fldrslt{http://servlet-spec.java.net\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - javafx-base (org.openjfx:javafx-base:14 - {{\field{\*\fldinst{HYPERLINK https://openjdk.java.net/projects/openjfx/javafx-base/ }}{\fldrslt{https://openjdk.java.net/projects/openjfx/javafx-base/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - javafx-controls (org.openjfx:javafx-controls:14 - {{\field{\*\fldinst{HYPERLINK https://openjdk.java.net/projects/openjfx/javafx-controls/ }}{\fldrslt{https://openjdk.java.net/projects/openjfx/javafx-controls/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - javafx-fxml (org.openjfx:javafx-fxml:14 - {{\field{\*\fldinst{HYPERLINK https://openjdk.java.net/projects/openjfx/javafx-fxml/ }}{\fldrslt{https://openjdk.java.net/projects/openjfx/javafx-fxml/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - javafx-graphics (org.openjfx:javafx-graphics:14 - {{\field{\*\fldinst{HYPERLINK https://openjdk.java.net/projects/openjfx/javafx-graphics/ }}{\fldrslt{https://openjdk.java.net/projects/openjfx/javafx-graphics/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - javafx-base (org.openjfx:javafx-base:16 - {{\field{\*\fldinst{HYPERLINK https://openjdk.java.net/projects/openjfx/javafx-base/ }}{\fldrslt{https://openjdk.java.net/projects/openjfx/javafx-base/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - javafx-controls (org.openjfx:javafx-controls:16 - {{\field{\*\fldinst{HYPERLINK https://openjdk.java.net/projects/openjfx/javafx-controls/ }}{\fldrslt{https://openjdk.java.net/projects/openjfx/javafx-controls/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - javafx-fxml (org.openjfx:javafx-fxml:16 - {{\field{\*\fldinst{HYPERLINK https://openjdk.java.net/projects/openjfx/javafx-fxml/ }}{\fldrslt{https://openjdk.java.net/projects/openjfx/javafx-fxml/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - javafx-graphics (org.openjfx:javafx-graphics:16 - {{\field{\*\fldinst{HYPERLINK https://openjdk.java.net/projects/openjfx/javafx-graphics/ }}{\fldrslt{https://openjdk.java.net/projects/openjfx/javafx-graphics/\ul0\cf0}}}}\f0\fs16 )\par
\tab LGPL 2.1:\par
\tab\tab - dbus-java (com.github.hypfvieh:dbus-java:3.0.2 - {{\field{\*\fldinst{HYPERLINK https://github.com/hypfvieh/dbus-java/dbus-java }}{\fldrslt{https://github.com/hypfvieh/dbus-java/dbus-java\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - jnr-posix (com.github.jnr:jnr-posix:3.0.54 - {{\field{\*\fldinst{HYPERLINK http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix }}{\fldrslt{http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Java Native Access (net.java.dev.jna:jna:5.1.0 - {{\field{\*\fldinst{HYPERLINK https://github.com/java-native-access/jna }}{\fldrslt{https://github.com/java-native-access/jna\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Java Native Access Platform (net.java.dev.jna:jna-platform:5.1.0 - {{\field{\*\fldinst{HYPERLINK https://github.com/java-native-access/jna }}{\fldrslt{https://github.com/java-native-access/jna\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Java Native Access (net.java.dev.jna:jna:5.7.0 - {{\field{\*\fldinst{HYPERLINK https://github.com/java-native-access/jna }}{\fldrslt{https://github.com/java-native-access/jna\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Java Native Access Platform (net.java.dev.jna:jna-platform:5.7.0 - {{\field{\*\fldinst{HYPERLINK https://github.com/java-native-access/jna }}{\fldrslt{https://github.com/java-native-access/jna\ul0\cf0}}}}\f0\fs16 )\par
\tab MIT License:\par
\tab\tab - java jwt (com.auth0:java-jwt:3.10.2 - {{\field{\*\fldinst{HYPERLINK https://github.com/auth0/java-jwt }}{\fldrslt{https://github.com/auth0/java-jwt\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - java-utils (com.github.hypfvieh:java-utils:1.0.5 - {{\field{\*\fldinst{HYPERLINK https://github.com/hypfvieh/java-utils }}{\fldrslt{https://github.com/hypfvieh/java-utils\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - java jwt (com.auth0:java-jwt:3.18.1 - {{\field{\*\fldinst{HYPERLINK https://github.com/auth0/java-jwt }}{\fldrslt{https://github.com/auth0/java-jwt\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - jnr-x86asm (com.github.jnr:jnr-x86asm:1.0.2 - {{\field{\*\fldinst{HYPERLINK http://github.com/jnr/jnr-x86asm }}{\fldrslt{http://github.com/jnr/jnr-x86asm\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - jnr-fuse (com.github.serceman:jnr-fuse:0.5.4 - no url defined)\par
\tab\tab - zxcvbn4j (com.nulab-inc:zxcvbn:1.3.0 - {{\field{\*\fldinst{HYPERLINK https://github.com/nulab/zxcvbn4j }}{\fldrslt{https://github.com/nulab/zxcvbn4j\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - secret-service (de.swiesend:secret-service:1.0.0-RC.3 - {{\field{\*\fldinst{HYPERLINK https://github.com/swiesend/secret-service }}{\fldrslt{https://github.com/swiesend/secret-service\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - Checker Qual (org.checkerframework:checker-qual:2.10.0 - {{\field{\*\fldinst{HYPERLINK https://checkerframework.org }}{\fldrslt{https://checkerframework.org\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - SLF4J API Module (org.slf4j:slf4j-api:1.7.30 - {{\field{\*\fldinst{HYPERLINK http://www.slf4j.org }}{\fldrslt{http://www.slf4j.org\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - jnr-fuse (com.github.serceman:jnr-fuse:0.5.5 - {{\field{\*\fldinst{HYPERLINK https://github.com/SerCeMan/jnr-fuse }}{\fldrslt{https://github.com/SerCeMan/jnr-fuse\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - zxcvbn4j (com.nulab-inc:zxcvbn:1.5.2 - {{\field{\*\fldinst{HYPERLINK https://github.com/nulab/zxcvbn4j }}{\fldrslt{https://github.com/nulab/zxcvbn4j\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - SLF4J API Module (org.slf4j:slf4j-api:1.7.31 - {{\field{\*\fldinst{HYPERLINK http://www.slf4j.org }}{\fldrslt{http://www.slf4j.org\ul0\cf0}}}}\f0\fs16 )\par
\tab The BSD 2-Clause License:\par
\tab\tab - EasyBind (org.fxmisc.easybind:easybind:1.0.3 - {{\field{\*\fldinst{HYPERLINK http://www.fxmisc.org/easybind/ }}{\fldrslt{http://www.fxmisc.org/easybind/\ul0\cf0}}}}\f0\fs16 )\par
\tab\tab - EasyBind (com.tobiasdiez:easybind:2.2 - {{\field{\*\fldinst{HYPERLINK https://github.com/tobiasdiez/EasyBind }}{\fldrslt{https://github.com/tobiasdiez/EasyBind\ul0\cf0}}}}\f0\fs16 )\par
\par
\b Cryptomator uses other third-party assets under the following licenses:\b0\par
\tab SIL OFL 1.1 License:\par
\tab\tab - Font Awesome 5.12.0 ({{\field{\*\fldinst{HYPERLINK https://fontawesome.com/ }}{\fldrslt{https://fontawesome.com/\ul0\cf0}}}}\f0\fs16 )\par
\par
\tab\tab - Font Awesome 5.12.0 ({{\field{\*\fldinst{HYPERLINK https://fontawesome.com/ }}{\fldrslt{https://fontawesome.com/\ul0\cf0}}}}\f0\fs16 )\b\par
}

View File

@@ -1,15 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Cryptomator's Jpackage Wix installer file
Remark: Expressions like $(var.name) are preprocessor variables, see also https://wixtoolset.org/documentation/manual/v3/overview/preprocessor.html
-->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<?ifdef JpIsSystemWide ?>
<?define JpInstallScope="perMachine"?>
<?define JpInstallScope="perMachine"?>
<?else?>
<?define JpInstallScope="perUser"?>
<?define JpInstallScope="perUser"?>
<?endif?>
<?define JpProductLanguage=1033 ?>
@@ -17,27 +13,49 @@
<?define JpCompressedMsi=yes ?>
<?ifdef JpAllowUpgrades ?>
<?define JpUpgradeVersionOnlyDetectUpgrade="no"?>
<?define JpUpgradeVersionOnlyDetectUpgrade="no"?>
<?else?>
<?define JpUpgradeVersionOnlyDetectUpgrade="yes"?>
<?define JpUpgradeVersionOnlyDetectUpgrade="yes"?>
<?endif?>
<?ifdef JpAllowDowngrades ?>
<?define JpUpgradeVersionOnlyDetectDowngrade="no"?>
<?define JpUpgradeVersionOnlyDetectDowngrade="no"?>
<?else?>
<?define JpUpgradeVersionOnlyDetectDowngrade="yes"?>
<?define JpUpgradeVersionOnlyDetectDowngrade="yes"?>
<?endif?>
<?include $(var.JpConfigDir)/overrides.wxi ?>
<Product Id="$(var.JpProductCode)" Name="$(var.JpAppName)" Language="$(var.JpProductLanguage)" Version="$(var.JpAppVersion)" Manufacturer="$(var.JpAppVendor)" UpgradeCode="$(var.JpProductUpgradeCode)">
<Product
Id="$(var.JpProductCode)"
Name="$(var.JpAppName)"
Language="$(var.JpProductLanguage)"
Version="$(var.JpAppVersion)"
Manufacturer="$(var.JpAppVendor)"
UpgradeCode="$(var.JpProductUpgradeCode)">
<Package Description="$(var.JpAppDescription)" Manufacturer="$(var.JpAppVendor)" InstallerVersion="$(var.JpInstallerVersion)" Compressed="$(var.JpCompressedMsi)" InstallScope="$(var.JpInstallScope)" Platform="x64" />
<Package
Description="$(var.JpAppDescription)"
Manufacturer="$(var.JpAppVendor)"
InstallerVersion="$(var.JpInstallerVersion)"
Compressed="$(var.JpCompressedMsi)"
InstallScope="$(var.JpInstallScope)" Platform="x64"
/>
<Media Id="1" Cabinet="Data.cab" EmbedCab="yes" />
<Upgrade Id="$(var.JpProductUpgradeCode)">
<UpgradeVersion OnlyDetect="$(var.JpUpgradeVersionOnlyDetectUpgrade)" Property="JP_UPGRADABLE_FOUND" Maximum="$(var.JpAppVersion)" MigrateFeatures="yes" IncludeMaximum="$(var.JpUpgradeVersionOnlyDetectUpgrade)" />
<UpgradeVersion OnlyDetect="$(var.JpUpgradeVersionOnlyDetectDowngrade)" Property="JP_DOWNGRADABLE_FOUND" Minimum="$(var.JpAppVersion)" MigrateFeatures="yes" IncludeMinimum="$(var.JpUpgradeVersionOnlyDetectDowngrade)" />
<UpgradeVersion
OnlyDetect="$(var.JpUpgradeVersionOnlyDetectUpgrade)"
Property="JP_UPGRADABLE_FOUND"
Maximum="$(var.JpAppVersion)"
MigrateFeatures="yes"
IncludeMaximum="$(var.JpUpgradeVersionOnlyDetectUpgrade)" />
<UpgradeVersion
OnlyDetect="$(var.JpUpgradeVersionOnlyDetectDowngrade)"
Property="JP_DOWNGRADABLE_FOUND"
Minimum="$(var.JpAppVersion)"
MigrateFeatures="yes"
IncludeMinimum="$(var.JpUpgradeVersionOnlyDetectDowngrade)" />
</Upgrade>
<?ifndef JpAllowUpgrades ?>
@@ -47,6 +65,7 @@
<CustomAction Id="JpDisallowDowngrade" Error="!(loc.DowngradeErrorMessage)" />
<?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" />
@@ -56,9 +75,13 @@
<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 -->
<Directory Id="TARGETDIR" Name="SourceDir"/>
<!-- Cryptomator uses UNIX Sockets, which are supported starting with Windows 10 v1803-->
<Property Id="WINDOWSBUILDNUMBER" Secure="yes">
<RegistrySearch Id="BuildNumberSearch" Root="HKLM" Key="SOFTWARE\Microsoft\Windows NT\CurrentVersion" Name="CurrentBuildNumber" Type="raw" />
</Property>
<Condition Message="This application requires Windows 10 version 1803 (build 17134) or newer.">
<![CDATA[Installed OR (WINDOWSBUILDNUMBER >= 17134)]]>
</Condition>
<!-- Non-Opening ProgID -->
<DirectoryRef Id="INSTALLDIR">
@@ -73,6 +96,9 @@
</Component>
</DirectoryRef>
<!-- Standard required root -->
<Directory Id="TARGETDIR" Name="SourceDir"/>
<Feature Id="DefaultFeature" Title="!(loc.MainFeatureTitle)" Level="1">
<ComponentGroupRef Id="Shortcuts"/>
<ComponentGroupRef Id="Files"/>
@@ -81,68 +107,48 @@
<ComponentRef Id="nonStartingProgID" />
</Feature>
<?ifdef JpInstallDirChooser ?>
<Binary Id="JpCaDll" SourceFile="wixhelper.dll"/>
<CustomAction Id="JpCheckInstallDir" BinaryKey="JpCaDll" DllEntry="CheckInstallDir" />
<CustomAction Id="JpSetARPINSTALLLOCATION" Property="ARPINSTALLLOCATION" Value="[INSTALLDIR]" />
<CustomAction Id="JpSetARPCOMMENTS" Property="ARPCOMMENTS" Value="$(var.JpAppDescription)" />
<CustomAction Id="JpSetARPCONTACT" Property="ARPCONTACT" Value="$(var.JpAppVendor)" />
<CustomAction Id="JpSetARPSIZE" Property="ARPSIZE" Value="$(var.JpAppSizeKb)" />
<?ifdef JpHelpURL ?>
<CustomAction Id="JpSetARPHELPLINK" Property="ARPHELPLINK" Value="$(var.JpHelpURL)" />
<?endif?>
<CustomAction Id="JpSetARPINSTALLLOCATION" Property="ARPINSTALLLOCATION" Value="[INSTALLDIR]" />
<?ifdef JpAboutURL ?>
<CustomAction Id="JpSetARPURLINFOABOUT" Property="ARPURLINFOABOUT" Value="$(var.JpAboutURL)" />
<?endif?>
<?ifdef JpUpdateURL ?>
<CustomAction Id="JpSetARPURLUPDATEINFO" Property="ARPURLUPDATEINFO" Value="$(var.JpUpdateURL)" />
<?endif?>
<!-- WebDAV patches -->
<CustomAction Id="PatchWebDAV" Impersonate="no" ExeCommand="[INSTALLDIR]patchWebDAV.bat" Directory="INSTALLDIR" Execute="deferred" Return="asyncWait" />
<?ifdef JpIcon ?>
<Property Id="ARPPRODUCTICON" Value="JpARPPRODUCTICON"/>
<Icon Id="JpARPPRODUCTICON" SourceFile="$(var.JpIcon)"/>
<?endif?>
<UI>
<?ifdef JpInstallDirChooser ?>
<Dialog Id="JpInvalidInstallDir" Width="300" Height="85" Title="[ProductName] Setup" NoMinimize="yes">
<Control Id="JpInvalidInstallDirYes" Type="PushButton" X="100" Y="55" Width="50" Height="15" Default="no" Cancel="no" Text="Yes">
<Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
</Control>
<Control Id="JpInvalidInstallDirNo" Type="PushButton" X="150" Y="55" Width="50" Height="15" Default="yes" Cancel="yes" Text="No">
<Publish Event="NewDialog" Value="InstallDirDlg">1</Publish>
</Control>
<Control Id="Text" Type="Text" X="25" Y="15" Width="250" Height="30" TabSkip="no">
<Text>!(loc.message.install.dir.exist)</Text>
</Control>
</Dialog>
<!--
Run our custom wizard in the default install directory.
-->
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"/>
<!-- included at the end -->
<UIRef Id="CustomWizard" />
<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="JpCheckInstallDir" Order="3">1</Publish>
<Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="JpInvalidInstallDir" Order="5">INSTALLDIR_VALID="0"</Publish>
<Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="5">INSTALLDIR_VALID="1"</Publish>
<?ifndef JpLicenseRtf ?>
<!--
No license file provided.
Override the dialog sequence in built-in dialog set "WixUI_InstallDir"
to exclude license dialog.
-->
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2">1</Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">1</Publish>
<?endif?>
<?else?>
<?ifdef JpLicenseRtf ?>
<UIRef Id="WixUI_Minimal" />
<?endif?>
<?endif?>
</UI>
<?ifdef JpLicenseRtf ?>
<WixVariable Id="WixUILicenseRtf" Value="$(var.JpLicenseRtf)"/>
<?endif?>
<UIRef Id="JpUI"/>
<InstallExecuteSequence>
<Custom Action="JpSetARPINSTALLLOCATION" After="CostFinalize">Not Installed</Custom>
<Custom Action="JpSetARPCOMMENTS" After="CostFinalize">Not Installed</Custom>
<Custom Action="JpSetARPCONTACT" After="CostFinalize">Not Installed</Custom>
<Custom Action="JpSetARPSIZE" After="CostFinalize">Not Installed</Custom>
<?ifdef JpHelpURL ?>
<Custom Action="JpSetARPHELPLINK" After="CostFinalize">Not Installed</Custom>
<?endif?>
<?ifdef JpAboutURL ?>
<Custom Action="JpSetARPURLINFOABOUT" After="CostFinalize">Not Installed</Custom>
<?endif?>
<?ifdef JpUpdateURL ?>
<Custom Action="JpSetARPURLUPDATEINFO" After="CostFinalize">Not Installed</Custom>
<?endif?>
<?ifndef JpAllowUpgrades ?>
<Custom Action="JpDisallowUpgrade" After="FindRelatedProducts">JP_UPGRADABLE_FOUND</Custom>
<?endif?>
@@ -150,11 +156,12 @@
<Custom Action="JpDisallowDowngrade" After="FindRelatedProducts">JP_DOWNGRADABLE_FOUND</Custom>
<?endif?>
<RemoveExistingProducts Before="CostInitialize"/>
<Custom Action="PatchWebDAV" After="InstallFiles">NOT Installed OR REINSTALL</Custom>
</InstallExecuteSequence>
<WixVariable Id="WixUIBannerBmp" Value="$(env.JP_WIXWIZARD_RESOURCES)\banner.bmp" />
<WixVariable Id="WixUIDialogBmp" Value="$(env.JP_WIXWIZARD_RESOURCES)\background.bmp" />
</Product>
<?include $(env.JP_WIXWIZARD_RESOURCES)\customWizard.wxi ?>
</Wix>

16
dist/win/resources/ui.wxf vendored Normal file
View File

@@ -0,0 +1,16 @@
<?xml version="1.0" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Fragment>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"></Property>
<WixVariable Id="WixUILicenseRtf" Value="$(var.JpLicenseRtf)"></WixVariable>
<UI Id="JpUI">
<UIRef Id="CustomWizard" />
<DialogRef Id="InstallDirNotEmptyDlg"></DialogRef>
<Publish Dialog="ShortcutPromptDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg">1</Publish>
<Publish Dialog="ShortcutPromptDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="ShortcutPromptDlg" Order="6">NOT Installed</Publish>
<UIRef Id="CustomWizard" />
</UI>
</Fragment>
<?include $(env.JP_WIXWIZARD_RESOURCES)\customWizard.wxi ?>
</Wix>

18
pom.xml
View File

@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.cryptomator</groupId>
<artifactId>cryptomator</artifactId>
<version>1.6.0-SNAPSHOT</version>
<version>1.7.0-SNAPSHOT</version>
<name>Cryptomator Desktop App</name>
<organization>
@@ -27,26 +27,26 @@
<nonModularGroupIds>com.github.serceman,com.github.jnr,org.ow2.asm,net.java.dev.jna,org.apache.jackrabbit,org.apache.httpcomponents,de.swiesend,org.purejava,com.github.hypfvieh</nonModularGroupIds>
<!-- cryptomator dependencies -->
<cryptomator.cryptofs.version>2.1.0-beta13</cryptomator.cryptofs.version>
<cryptomator.cryptofs.version>2.3.0</cryptomator.cryptofs.version>
<cryptomator.integrations.version>1.1.0-beta1</cryptomator.integrations.version>
<cryptomator.integrations.win.version>1.0.0-rc1</cryptomator.integrations.win.version>
<cryptomator.integrations.mac.version>1.0.0-rc1</cryptomator.integrations.mac.version>
<cryptomator.integrations.linux.version>1.0.0-rc2</cryptomator.integrations.linux.version>
<cryptomator.fuse.version>1.3.2</cryptomator.fuse.version>
<cryptomator.integrations.win.version>1.0.0</cryptomator.integrations.win.version>
<cryptomator.integrations.mac.version>1.0.0</cryptomator.integrations.mac.version>
<cryptomator.integrations.linux.version>1.0.1</cryptomator.integrations.linux.version>
<cryptomator.fuse.version>1.3.3</cryptomator.fuse.version>
<cryptomator.dokany.version>1.3.3</cryptomator.dokany.version>
<cryptomator.webdav.version>1.2.6</cryptomator.webdav.version>
<!-- 3rd party dependencies -->
<javafx.version>17.0.0.1</javafx.version>
<javafx.version>17.0.1</javafx.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<jwt.version>3.18.2</jwt.version>
<easybind.version>2.2</easybind.version>
<guava.version>31.0-jre</guava.version>
<dagger.version>2.39</dagger.version>
<gson.version>2.8.8</gson.version>
<gson.version>2.8.9</gson.version>
<zxcvbn.version>1.5.2</zxcvbn.version>
<slf4j.version>1.7.32</slf4j.version>
<logback.version>1.2.6</logback.version>
<logback.version>1.2.7</logback.version>
<!-- test dependencies -->
<junit.jupiter.version>5.8.1</junit.jupiter.version>

View File

@@ -46,6 +46,7 @@ module org.cryptomator.desktop {
opens org.cryptomator.ui.fxapp to javafx.fxml;
opens org.cryptomator.ui.health 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.migration to javafx.fxml;
opens org.cryptomator.ui.preferences to javafx.fxml;

View File

@@ -1,5 +1,6 @@
package org.cryptomator.common;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.base.Throwables;
@@ -80,7 +81,7 @@ public class ErrorCode {
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());
var rootSpecificFrames = countTopmostFrames(rootCause.getStackTrace(), parentOfRootCause.getStackTrace());
return new ErrorCode(throwable, rootCause, rootSpecificFrames);
} else {
return new ErrorCode(throwable, throwable, ALL_FRAMES);
@@ -107,11 +108,31 @@ public class ErrorCode {
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();
/**
* Counts the number of <em>additional</em> frames contained in <code>allFrames</code> but not in <code>bottomFrames</code>.
* <p>
* If <code>allFrames</code> does not end with <code>bottomFrames</code>, it is considered distinct and all its frames are counted.
*
* @param allFrames Some stack frames
* @param bottomFrames Other stack frames, potentially forming the bottom of the stack of <code>allFrames</code>
* @return The number of additional frames in <code>allFrames</code>. In most cases this should be equal to the difference in size.
*/
// visible for testing
static int countTopmostFrames(StackTraceElement[] allFrames, StackTraceElement[] bottomFrames) {
if (allFrames.length < bottomFrames.length) {
// if frames had been stacked on top of bottomFrames, allFrames would be larger
return allFrames.length;
} else {
return allFrames.length - commonSuffixLength(allFrames, bottomFrames);
}
}
// visible for testing
static <T> int commonSuffixLength(T[] set, T[] subset) {
Preconditions.checkArgument(set.length >= subset.length);
// iterate items backwards as long as they are identical
var iterator = reverseStream(subset).iterator();
return (int) reverseStream(set).takeWhile(item -> iterator.hasNext() && iterator.next().equals(item)).count();
}
private static <T> Stream<T> reverseStream(T[] array) {

View File

@@ -44,7 +44,9 @@ public interface IpcCommunicator extends Closeable {
}
// Didn't get any connection yet? I.e. we're the first app instance, so let's launch a server:
try {
return Server.create(socketPaths.iterator().next());
final var socketPath = socketPaths.iterator().next();
Files.deleteIfExists(socketPath); // ensure path does not exist before creating it
return Server.create(socketPath);
} catch (IOException e) {
LOG.warn("Failed to create IPC server", e);
return new LoopbackCommunicator();

View File

@@ -56,11 +56,10 @@ public class ChooseExistingVaultController implements FxController {
@FXML
public void initialize() {
final String resource = SystemUtils.IS_OS_MAC ? "/img/select-masterkey-mac.png" : "/img/select-masterkey-win.png";
try (InputStream in = getClass().getResourceAsStream(resource)) {
this.screenshot = new Image(in);
} catch (IOException e) {
throw new UncheckedIOException(e);
if (SystemUtils.IS_OS_MAC) {
this.screenshot = new Image(getClass().getResource("/img/select-masterkey-mac.png").toString());
} else {
this.screenshot = new Image(getClass().getResource("/img/select-masterkey-win.png").toString());
}
}
@@ -73,7 +72,7 @@ public class ChooseExistingVaultController implements FxController {
public void chooseFileAndNext() {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(resourceBundle.getString("addvaultwizard.existing.filePickerTitle"));
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Cryptomator Masterkey", "*.cryptomator"));
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Cryptomator Vault", "*.cryptomator"));
File masterkeyFile = fileChooser.showOpenDialog(window);
if (masterkeyFile != null) {
vaultPath.setValue(masterkeyFile.toPath().toAbsolutePath().getParent());

View File

@@ -2,7 +2,7 @@ package org.cryptomator.ui.changepassword;
import org.cryptomator.common.keychain.KeychainManager;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.cryptofs.common.MasterkeyBackupHelper;
import org.cryptomator.cryptofs.common.BackupHelper;
import org.cryptomator.cryptolib.api.CryptoException;
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.common.MasterkeyFileAccess;
@@ -83,7 +83,7 @@ public class ChangePasswordController implements FxController {
Path masterkeyPath = vault.getPath().resolve(MASTERKEY_FILENAME);
byte[] oldMasterkeyBytes = Files.readAllBytes(masterkeyPath);
byte[] newMasterkeyBytes = masterkeyFileAccess.changePassphrase(oldMasterkeyBytes, oldPassphrase, newPassphrase);
Path backupKeyPath = vault.getPath().resolve(MASTERKEY_FILENAME + MasterkeyBackupHelper.generateFileIdSuffix(oldMasterkeyBytes) + MASTERKEY_BACKUP_SUFFIX);
Path backupKeyPath = vault.getPath().resolve(MASTERKEY_FILENAME + BackupHelper.generateFileIdSuffix(oldMasterkeyBytes) + MASTERKEY_BACKUP_SUFFIX);
Files.move(masterkeyPath, backupKeyPath, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE);
Files.write(masterkeyPath, newMasterkeyBytes, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE);
LOG.info("Successfully changed password for {}", vault.getDisplayName());

View File

@@ -1,5 +1,6 @@
package org.cryptomator.ui.common;
import org.cryptomator.common.Environment;
import org.cryptomator.common.ErrorCode;
import org.cryptomator.common.Nullable;
@@ -25,7 +26,11 @@ public class ErrorController implements FxController {
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 = """
OS: %s / %s
App: %s / %s
<!-- ✏️ Please describe what happened as accurately as possible. -->
<!-- 📋 Please also copy and paste the detail text from the error window. -->
""";
@@ -34,16 +39,18 @@ public class ErrorController implements FxController {
private final ErrorCode errorCode;
private final Scene previousScene;
private final Stage window;
private final Environment environment;
private BooleanProperty copiedDetails = new SimpleBooleanProperty();
@Inject
ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window) {
ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment) {
this.application = application;
this.stackTrace = stackTrace;
this.errorCode = errorCode;
this.previousScene = previousScene;
this.window = window;
this.environment = environment;
}
@FXML
@@ -67,7 +74,12 @@ public class ErrorController implements FxController {
@FXML
public void reportError() {
var title = URLEncoder.encode(getErrorCode(), StandardCharsets.UTF_8);
var body = URLEncoder.encode(REPORT_BODY_TEMPLATE, StandardCharsets.UTF_8);
var enhancedTemplate = String.format(REPORT_BODY_TEMPLATE, //
System.getProperty("os.name"), //
System.getProperty("os.version"), //
environment.getAppVersion().orElse("undefined"), //
environment.getBuildNumber().orElse("undefined"));
var body = URLEncoder.encode(enhancedTemplate, StandardCharsets.UTF_8);
application.getHostServices().showDocument(REPORT_URL_FORMAT.formatted(title, body));
}

View File

@@ -16,7 +16,11 @@ public class UserInteractionLock<E extends Enum> {
private volatile E state;
public UserInteractionLock(E initialValue) {
state = initialValue;
this.state = initialValue;
}
public synchronized void reset(E value) {
this.state = value;
}
public void interacted(E result) {

View File

@@ -3,6 +3,7 @@ package org.cryptomator.ui.keyloading.masterkeyfile;
import com.google.common.base.Preconditions;
import dagger.Lazy;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.cryptofs.common.BackupHelper;
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.api.Masterkey;
import org.cryptomator.cryptolib.api.MasterkeyLoadingFailedException;
@@ -20,6 +21,7 @@ import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.Window;
import java.io.IOException;
import java.net.URI;
import java.nio.CharBuffer;
import java.nio.file.Files;
@@ -61,14 +63,24 @@ public class MasterkeyFileLoadingStrategy implements KeyLoadingStrategy {
@Override
public Masterkey loadKey(URI keyId) throws MasterkeyLoadingFailedException {
Preconditions.checkArgument(SCHEME.equalsIgnoreCase(keyId.getScheme()), "Only supports keys with scheme " + SCHEME);
try {
Path filePath = vault.getPath().resolve(keyId.getSchemeSpecificPart());
if (!Files.exists(filePath)) {
filePath = getAlternateMasterkeyFilePath();
}
CharSequence passphrase = getPassphrase();
return masterkeyFileAccess.load(filePath, passphrase);
var masterkey = masterkeyFileAccess.load(filePath, passphrase);
//backup
if (filePath.startsWith(vault.getPath())) {
try {
BackupHelper.attemptBackup(filePath);
} catch (IOException e) {
LOG.warn("Unable to create backup for masterkey file.");
}
} else {
LOG.info("Masterkey file not stored inside vault. Not creating a backup.");
}
return masterkey;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new UnlockCancelledException("Unlock interrupted", e);

View File

@@ -35,7 +35,13 @@ public class LockForcedController implements FxController {
}
@FXML
public void confirmForcedLock() {
public void retry() {
forceLockDecisionLock.interacted(LockModule.ForceLockDecision.RETRY);
window.close();
}
@FXML
public void force() {
forceLockDecisionLock.interacted(LockModule.ForceLockDecision.FORCE);
window.close();
}
@@ -54,4 +60,8 @@ public class LockForcedController implements FxController {
return vault.getDisplayName();
}
public boolean isForceSupported() {
return vault.supportsForcedUnmount();
}
}

View File

@@ -28,6 +28,7 @@ abstract class LockModule {
enum ForceLockDecision {
CANCEL,
RETRY,
FORCE;
}

View File

@@ -51,20 +51,26 @@ public class LockWorkflow extends Task<Void> {
@Override
protected Void call() throws Volume.VolumeException, InterruptedException, LockNotCompletedException {
try {
vault.lock(false);
} catch (Volume.VolumeException | LockNotCompletedException e) {
LOG.debug("Regular lock of {} failed.", vault.getDisplayName(), e);
var decision = askUserForAction();
switch (decision) {
case FORCE -> vault.lock(true);
case CANCEL -> cancel(false);
}
}
lock(false);
return null;
}
private void lock(boolean forced) throws InterruptedException {
try {
vault.lock(forced);
} catch (Volume.VolumeException | LockNotCompletedException e) {
LOG.info("Locking {} failed (forced: {}).", vault.getDisplayName(), forced, e);
var decision = askUserForAction();
switch (decision) {
case RETRY -> lock(false);
case FORCE -> lock(true);
case CANCEL -> cancel(false);
}
}
}
private LockModule.ForceLockDecision askUserForAction() throws InterruptedException {
forceLockDecisionLock.reset(null);
// show forcedLock dialogue ...
Platform.runLater(() -> {
lockWindow.setScene(lockForcedScene.get());

View File

@@ -34,10 +34,10 @@ public class SupporterCertificateController implements FxController {
public void initialize() {
supporterCertificateField.setText(licenseHolder.getLicenseKey().orElse(null));
supporterCertificateField.textProperty().addListener(this::registrationKeyChanged);
supporterCertificateField.setTextFormatter(new TextFormatter<>(this::checkVaultNameLength));
supporterCertificateField.setTextFormatter(new TextFormatter<>(this::removeWhitespaces));
}
private TextFormatter.Change checkVaultNameLength(TextFormatter.Change change) {
private TextFormatter.Change removeWhitespaces(TextFormatter.Change change) {
if (change.isContentChange()) {
var strippedText = CharMatcher.whitespace().removeFrom(change.getText());
change.setText(strippedText);

View File

@@ -2,7 +2,7 @@ package org.cryptomator.ui.recoverykey;
import com.google.common.base.Preconditions;
import com.google.common.hash.Hashing;
import org.cryptomator.cryptofs.common.MasterkeyBackupHelper;
import org.cryptomator.cryptofs.common.BackupHelper;
import org.cryptomator.cryptolib.api.CryptoException;
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.api.Masterkey;
@@ -86,7 +86,7 @@ public class RecoveryKeyFactory {
if (Files.exists(masterkeyPath)) {
byte[] oldMasterkeyBytes = Files.readAllBytes(masterkeyPath);
// TODO: deduplicate with ChangePasswordController:
Path backupKeyPath = vaultPath.resolve(MASTERKEY_FILENAME + MasterkeyBackupHelper.generateFileIdSuffix(oldMasterkeyBytes) + MASTERKEY_BACKUP_SUFFIX);
Path backupKeyPath = vaultPath.resolve(MASTERKEY_FILENAME + BackupHelper.generateFileIdSuffix(oldMasterkeyBytes) + MASTERKEY_BACKUP_SUFFIX);
Files.move(masterkeyPath, backupKeyPath, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE);
}
masterkeyFileAccess.persist(masterkey, masterkeyPath, newPassword);

View File

@@ -2,9 +2,6 @@ package org.cryptomator.ui.traymenu;
import com.google.common.base.Preconditions;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.integrations.uiappearance.Theme;
import org.cryptomator.integrations.uiappearance.UiAppearanceException;
import org.cryptomator.integrations.uiappearance.UiAppearanceProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -12,38 +9,25 @@ import javax.inject.Inject;
import java.awt.AWTException;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.util.Optional;
@TrayMenuScoped
public class TrayIconController {
private static final Logger LOG = LoggerFactory.getLogger(TrayIconController.class);
private final TrayImageFactory imageFactory;
private final Optional<UiAppearanceProvider> appearanceProvider;
private final TrayMenuController trayMenuController;
private final TrayIcon trayIcon;
private volatile boolean initialized;
@Inject
TrayIconController(TrayImageFactory imageFactory, TrayMenuController trayMenuController, Optional<UiAppearanceProvider> appearanceProvider) {
TrayIconController(TrayImageFactory imageFactory, TrayMenuController trayMenuController) {
this.trayMenuController = trayMenuController;
this.imageFactory = imageFactory;
this.appearanceProvider = appearanceProvider;
this.trayIcon = new TrayIcon(imageFactory.loadImage(), "Cryptomator", trayMenuController.getMenu());
}
public synchronized void initializeTrayIcon() throws IllegalStateException {
Preconditions.checkState(!initialized);
appearanceProvider.ifPresent(appearanceProvider -> {
try {
appearanceProvider.addListener(this::systemInterfaceThemeChanged);
} catch (UiAppearanceException e) {
LOG.error("Failed to enable automatic tray icon theme switching.");
}
});
trayIcon.setImageAutoSize(true);
if (SystemUtils.IS_OS_WINDOWS) {
trayIcon.addActionListener(trayMenuController::showMainWindow);
@@ -61,10 +45,6 @@ public class TrayIconController {
this.initialized = true;
}
private void systemInterfaceThemeChanged(Theme theme) {
trayIcon.setImage(imageFactory.loadImage()); // TODO refactor "theme" is re-queried in loadImage()
}
public boolean isInitialized() {
return initialized;
}

View File

@@ -25,11 +25,7 @@ class TrayImageFactory {
}
private String getMacResourceName() {
var theme = appearanceProvider.map(UiAppearanceProvider::getSystemTheme).orElse(Theme.LIGHT);
return switch (theme) {
case DARK -> "/img/tray_icon_mac_white.png";
case LIGHT -> "/img/tray_icon_mac_black.png";
};
return "/img/tray_icon_mac.png";
}
private String getWinOrLinuxResourceName() {

View File

@@ -47,7 +47,7 @@ public class GeneralVaultOptionsController implements FxController {
public void initialize() {
vaultName.textProperty().set(vault.getVaultSettings().displayName().get());
vaultName.focusedProperty().addListener(this::trimVaultNameOnFocusLoss);
vaultName.setTextFormatter(new TextFormatter<>(this::removeWhitespaces));
vaultName.setTextFormatter(new TextFormatter<>(this::checkVaultNameLength));
unlockOnStartupCheckbox.selectedProperty().bindBidirectional(vault.getVaultSettings().unlockAfterStartup());
actionAfterUnlockChoiceBox.getItems().addAll(WhenUnlocked.values());
actionAfterUnlockChoiceBox.valueProperty().bindBidirectional(vault.getVaultSettings().actionAfterUnlock());
@@ -63,7 +63,7 @@ public class GeneralVaultOptionsController implements FxController {
}
}
private TextFormatter.Change removeWhitespaces(TextFormatter.Change change) {
private TextFormatter.Change checkVaultNameLength(TextFormatter.Change change) {
if (change.isContentChange() && change.getControlNewText().length() > VAULTNAME_TRUNCATE_THRESHOLD) {
return null; // reject any change that would lead to a text exceeding threshold
} else {

View File

@@ -33,11 +33,11 @@
</HBox>
<VBox alignment="BOTTOM_CENTER" VBox.vgrow="ALWAYS">
<ButtonBar buttonMinWidth="120" buttonOrder="+CI">
<ButtonBar buttonMinWidth="100" buttonOrder="+CIU">
<buttons>
<Button text="%generic.button.cancel" ButtonBar.buttonData="CANCEL_CLOSE" defaultButton="true" cancelButton="true" onAction="#cancel"/>
<!-- TODO: third button with retry? -->
<Button text="%lock.forced.confirmBtn" ButtonBar.buttonData="FINISH" onAction="#confirmForcedLock"/>
<Button text="%lock.forced.retryBtn" ButtonBar.buttonData="FINISH" onAction="#retry"/>
<Button text="%lock.forced.forceBtn" ButtonBar.buttonData="OTHER" onAction="#force" disable="${!controller.forceSupported}"/>
</buttons>
</ButtonBar>
</VBox>

View File

@@ -76,9 +76,9 @@ addvault.new.readme.accessLocation.2=This is your vault's access location.
addvault.new.readme.accessLocation.3=Any files added to this volume will be encrypted by Cryptomator. You can work on it like on any other drive/folder. This is only a decrypted view of its content, your files stay encrypted on your hard drive all the time.
addvault.new.readme.accessLocation.4=Feel free to remove this file.
## Existing
addvaultwizard.existing.instruction=Choose the "masterkey.cryptomator" file of your existing vault.
addvaultwizard.existing.instruction=Choose the "vault.cryptomator" file of your existing vault. If only a file named "masterkey.cryptomator" exists, select that instead.
addvaultwizard.existing.chooseBtn=Choose…
addvaultwizard.existing.filePickerTitle=Select Masterkey File
addvaultwizard.existing.filePickerTitle=Select Vault File
## Success
addvaultwizard.success.nextStepsInstructions=Added vault "%s".\nYou need to unlock this vault to access or add contents. Alternatively you can unlock it at any later point in time.
addvaultwizard.success.unlockNow=Unlock Now
@@ -118,9 +118,10 @@ unlock.error.invalidMountPoint.existing=Mount point "%s" already exists or paren
# Lock
## Force
lock.forced.heading=Graceful lock failed
lock.forced.heading=Lock failed
lock.forced.message=Locking "%s" was blocked by pending operations or open files. You can force lock this vault, however interrupting I/O may result in the loss of unsaved data.
lock.forced.confirmBtn=Force Lock
lock.forced.retryBtn=Retry
lock.forced.forceBtn=Force Lock
## Failure
lock.fail.heading=Locking vault failed.
lock.fail.message=Vault "%s" could not be locked. Ensure unsaved work is saved elsewhere and important Read/Write operations are finished. In order to close the vault, kill the Cryptomator process.

View File

@@ -70,9 +70,7 @@ addvault.new.readme.accessLocation.2=هذا هو موقع الوصول للخر
addvault.new.readme.accessLocation.3=سيتم تشفير أي ملفات تضاف إلى هذا المجلد من قبل Cryptomator. يمكنك العمل عليه كأي مجلد آخر. هذه فقط طريقة عرض غير مشفرة لمحتوياتها، ملفاتك تبقى مشفرة على القرص الصلب الخاص بك طوال الوقت.
addvault.new.readme.accessLocation.4=لا تتردد في إزالة هذا الملف.
## Existing
addvaultwizard.existing.instruction=اختر ملف "masterkey.cryptomator" الخاص بالخزنة الموجودة لديك سابقاً.
addvaultwizard.existing.chooseBtn=اختر…
addvaultwizard.existing.filePickerTitle=اختر ملف الـ Masterkey
## Success
addvaultwizard.success.nextStepsInstructions=تم إضافة مخزن "%s".\nتحتاج إلى فتح هذا المخزن للوصول أو إضافة محتويات إليه. بدلاً من ذلك، يمكنك فتحه في أي وقت لاحق.
addvaultwizard.success.unlockNow=افتح الان
@@ -110,9 +108,8 @@ unlock.error.invalidMountPoint.existing=نقطة/مجلد التحميل موج
# Lock
## Force
lock.forced.heading=فشل عملية القفل
lock.forced.message=تم حظر قفل "%s" بواسطة العمليات المعلقة أو الملفات المفتوحة. يمكنك فرض قفل هذا المخزن، ولكن مقاطعة عمليات الادخال والاخراج I/O قد تؤدي لفقدان البيانات غير المحفوظة.
lock.forced.confirmBtn=فرض القفل
lock.forced.retryBtn=اعد المحاولة
## Failure
lock.fail.heading=فشلت عملية اقفال الخزنة.
lock.fail.message=فشل عملية قفل %s". تأكد من حفظ العمل غير المحفوظ في مكان آخر وأن العمليات الهامة للقراءة/الكتابة قد انتهت. من أجل إغلاق المخزن، اقتل تطبيق Cryptomator.
@@ -244,6 +241,7 @@ main.vaultDetail.missing.changeLocation=تغيير موقع الخزنة…
### Needs Migration
main.vaultDetail.migrateButton=ترقية الحافظة
main.vaultDetail.migratePrompt=يجب ترقية المخزن الخاص بك إلى تنسيق جديد، قبل أن تتمكن من الوصول إليه
### Error
# Wrong File Alert
wrongFileAlert.title=كيفية تشفير الملفات

View File

@@ -70,9 +70,7 @@ addvault.new.readme.accessLocation.2=Ovo je pristupna lokacija vašeg sefa.
addvault.new.readme.accessLocation.3=Sve datoteke dodane u ovaj prostor enkriptovati će Cryptomator. Na njemu možete raditi kao na bilo kojem drugom pogonu / folderu. Ovo je samo dešifrirani prikaz njegovog sadržaja, vaše datoteke stalno ostaju enkriptovane na vašem disku.
addvault.new.readme.accessLocation.4=Slobodno uklonite ovu datoteku.
## Existing
addvaultwizard.existing.instruction=Odaberite datoteku "masterkey.cryptomator" vašeg postojećeg sefa.
addvaultwizard.existing.chooseBtn=Odaberi…
addvaultwizard.existing.filePickerTitle=Odaberite Masterkey Datoteku
## Success
addvaultwizard.success.nextStepsInstructions=Dodan je sef "%s".\nZa pristup ili dodavanje sadržaja morate otključati ovaj sef. Možete ga otključati u bilo kojem kasnijem trenutku.
addvaultwizard.success.unlockNow=Otključaj sada
@@ -110,9 +108,7 @@ unlock.error.invalidMountPoint.existing=Tačka povezivanja "%s" već postoji ili
# Lock
## Force
lock.forced.heading=Zaključavanje nije uspjelo
lock.forced.message=Zaključavanje "%s" blokirano je operacijama na čekanju ili otvorenim datotekama. Možete prisilno zaključati ovaj sef, međutim prekid U / I-a može rezultirati gubitkom nespremljenih podataka.
lock.forced.confirmBtn=Prisilno zaključaj
## Failure
lock.fail.heading=Zaključavanje sefa nije uspjelo.
lock.fail.message=Sef "%s" nije moguće zaključati. Osigurajte da je nespremljeni rad sačuvan negdje drugdje i da su važne operacije čitanja / pisanja završene. Da biste zatvorili sef, zaustavite Cryptomator proces.
@@ -260,6 +256,7 @@ main.vaultDetail.missing.changeLocation=Promijeni lokaciju sefa…
### Needs Migration
main.vaultDetail.migrateButton=Nadogradi sef
main.vaultDetail.migratePrompt=Da biste mogli pristupiti svom sefu, morate ga nadograditi na novi format
### Error
# Wrong File Alert
wrongFileAlert.title=Kako enkriptovati podatke

View File

@@ -13,6 +13,11 @@ generic.button.done=Fet
generic.button.next=Següent
generic.button.print=Imprimeix
## Error
generic.error.title=Error %s
generic.error.instruction=Ui! Cryptomator no esperava que passés això. Podeu cercar alguna de les solucions existents per a aquest error. Si no ha estat reportat encara, sentiu-vos lliure de fer-ho vós mateix.
generic.error.hyperlink.lookup=Cerca aquest error
generic.error.hyperlink.report=Notifica un error
generic.error.technicalDetails=Detalls:
# Defaults
defaults.vault.vaultName=Caixa forta
@@ -70,9 +75,9 @@ addvault.new.readme.accessLocation.2=Aquesta és la ubicació d'accès de la vos
addvault.new.readme.accessLocation.3=Cryptomator xifra tots els fitxers afegits a aquest volum. Podeu treballar en aquest volum com en qualsevol altra unitat o carpeta. La vista mostra el contingut desxifrat però els fitxers sempre estan xifrats en el vostre disc dur.
addvault.new.readme.accessLocation.4=Pots esborrar aquest fitxer si vols.
## Existing
addvaultwizard.existing.instruction=Seleccioneu el fitxer "masterkey.cryptomator" de la vostra caixa forta.
addvaultwizard.existing.instruction=Selecciona el fitxer "vault.cryptomator" de la teva caixa forta. Si només existeix un fitxer anomenat "masterkey.cryptomator", selecciona aquest.
addvaultwizard.existing.chooseBtn=Trieu…
addvaultwizard.existing.filePickerTitle=Seleccioneu el fitxer Masterkey
addvaultwizard.existing.filePickerTitle=Selecciona el fitxer de la Caixa forta
## Success
addvaultwizard.success.nextStepsInstructions=S'ha afegit la caixa forta "%s".\nHeu de desbloquejar-la si voleu accedir-hi o afegir nou contingut. També podeu desbloquejar-la en qualsevol altre moment.
addvaultwizard.success.unlockNow=Desbloqueja ara
@@ -112,9 +117,10 @@ unlock.error.invalidMountPoint.existing=El punt de muntatge o la carpeta ja exis
# Lock
## Force
lock.forced.heading=Ha fallat el blocatge
lock.forced.heading=El bloqueig ha fallat
lock.forced.message=No s'ha blocat "%s" perquè hi ha operacions pendents o fitxers oberts. Podeu forçar-ne el blocatge però heu de saber que interrompre l'entrada/sortida pot produir la pèrdua de dades.
lock.forced.confirmBtn=Força el blocatge
lock.forced.retryBtn=Reintenta
lock.forced.forceBtn=Forçar bloqueig
## Failure
lock.fail.heading=Ha fallat el blocatge de la caixa forta.
lock.fail.message=La caixa forta "%s" no s'ha pogut blocar. Assegureu-vos que el treball s'ha desat en algun altre lloc i que les operacions de lectura/escriptura han acabat. Per tal de tancar la caixa, mateu el procés Cryptomator.
@@ -294,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Canvia la localització de la caixa fort
### Needs Migration
main.vaultDetail.migrateButton=Actualitza la caixa forta
main.vaultDetail.migratePrompt=Per accedir a la vostra caixa forta abans cal actualitzar-la al nou format
### Error
main.vaultDetail.error.info=Hi ha hagut un error mentre es carregava la caixa forta del disc.
main.vaultDetail.error.reload=Torna a carregar
main.vaultDetail.error.windowTitle=Error en carregar la caixa forta
# Wrong File Alert
wrongFileAlert.title=Com xifrar fitxers

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Toto je místo přístupu vašeho trezoru.
addvault.new.readme.accessLocation.3=Všechny soubory přidané do tohoto svazku budou šifrovány Cryptomatorem. Můžete na něm pracovat na jiném disku/složce. Toto je pouze dešifrovaný pohled na jeho obsah, vaše soubory zůstávají na pevném disku stále zašifrovány.
addvault.new.readme.accessLocation.4=Tento soubor můžete odstranit.
## Existing
addvaultwizard.existing.instruction=Vyberte soubor "masterkey.cryptomator" z vašeho stávajícího trezoru.
addvaultwizard.existing.instruction=Vyberte soubor "vault.cryptomator" z existujícího trezoru. Pokud existuje pouze soubor s názvem "masterkey.cryptomator", vyberte jej.
addvaultwizard.existing.chooseBtn=Vybrat...
addvaultwizard.existing.filePickerTitle=Vyberte soubor s hlavním klíčem
addvaultwizard.existing.filePickerTitle=Vyberte soubor trezoru
## Success
addvaultwizard.success.nextStepsInstructions=Vytvořen trezor "%s".\nNejprve odemkněte tento trezor, pak do něj můžete přidat svůj obsah. Nebo jej můžete odemknout kdykoliv v budoucnu.
addvaultwizard.success.unlockNow=Odemknout nyní
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Připojovací bod %s již existuje nebo
# Lock
## Force
lock.forced.heading=Běžné uzamčení selhalo
lock.forced.heading=Zamknutí se nezdařilo
lock.forced.message=Uzamčení "%s" bylo zablokováno nevyřízenými operacemi nebo otevřenými soubory. Můžete vynutit uzamčení tohoto trezoru, ale přerušení I/O může mít za následek ztrátu neuložených dat.
lock.forced.confirmBtn=Přesto uzamknout
lock.forced.retryBtn=Opakovat
lock.forced.forceBtn=Přesto uzamknout
## Failure
lock.fail.heading=Uzamčení trezoru selhalo.
lock.fail.message=Trezor "%s" nelze uzamknout. Ujistěte se, že je neuložená práce uložena jinde a že jsou dokončeny důležité operace čtení/zápis. Za účelem uzavření trezoru ukončte proces Cryptomatoru.
@@ -299,6 +300,9 @@ main.vaultDetail.missing.changeLocation=Změnit umístění trezoru…
### Needs Migration
main.vaultDetail.migrateButton=Upgrade trezoru
main.vaultDetail.migratePrompt=Váš trezor musí být aktualizován na nový formát, než k němu budete mít přístup
### Error
main.vaultDetail.error.reload=Obnovit
main.vaultDetail.error.windowTitle=Chyba při načítání trezoru
# Wrong File Alert
wrongFileAlert.title=Jak šifrovat soubory

View File

@@ -68,16 +68,16 @@ addvault.new.readme.storageLocation.6=Falls du Dateien verschlüsseln und den In
addvault.new.readme.storageLocation.7=1. Füge diesen Tresor zu Cryptomator hinzu.
addvault.new.readme.storageLocation.8=2. Entsperre den Tresor in Cryptomator.
addvault.new.readme.storageLocation.9=3. Öffne den Zugangsort durch Klicken auf die Schaltfläche „Anzeigen“.
addvault.new.readme.storageLocation.10=Falls du Hilfe brauchst, lies die Dokumentation: %s
addvault.new.readme.storageLocation.10=Falls Du Hilfe brauchst, lies die Dokumentation: %s
addvault.new.readme.accessLocation.fileName=WILLKOMMEN.rtf
addvault.new.readme.accessLocation.1=🔐️ VERSCHLÜSSELTES LAUFWERK 🔐️
addvault.new.readme.accessLocation.2=Dies ist der Zugangsort deines Tresors.
addvault.new.readme.accessLocation.3=Alle zu diesem Laufwerk hinzugefügten Dateien werden von Cryptomator verschlüsselt. Du kannst mit diesem arbeiten wie mit jedem anderen Laufwerk bzw. Ordner. Dies ist lediglich eine unverschlüsselte Ansicht des Laufwerkinhalts; auf deiner Festplatte bleiben deine Dateien weiterhin verschlüsselt.
addvault.new.readme.accessLocation.4=Diese Datei kannst du löschen.
## Existing
addvaultwizard.existing.instruction=Wähle die Datei „masterkey.cryptomator deines vorhandenen Tresors aus.
addvaultwizard.existing.instruction=Wähle die Datei "vault.cryptomator" deines bestehenden Tresors aus. Falls nur eine Datei mit der Bezeichnung "masterkey.cryptomator" vorhanden ist, nutze stattdessen diese.
addvaultwizard.existing.chooseBtn=Durchsuchen…
addvaultwizard.existing.filePickerTitle=Masterkey-Datei auswählen
addvaultwizard.existing.filePickerTitle=Tresor Datei auswählen
## Success
addvaultwizard.success.nextStepsInstructions=Tresor „%s“ hinzugefügt.\nUm auf Inhalte zuzugreifen oder welche hinzuzufügen, musst du den Tresor entsperren. Du kannst ihn aber auch zu jedem späteren Zeitpunkt entsperren.
addvaultwizard.success.unlockNow=Jetzt entsperren
@@ -113,13 +113,14 @@ unlock.success.revealBtn=Laufwerk anzeigen
unlock.error.heading=Tresor konnte nicht entsperrt werden
### Invalid Mount Point
unlock.error.invalidMountPoint.notExisting=Einhängepunkt ist kein leeres Verzeichnis oder existiert nicht: %s
unlock.error.invalidMountPoint.existing=Einhängepunkt/Ordner bereits vorhanden oder übergeordneter Ordner fehlt: %s
unlock.error.invalidMountPoint.existing=Einhängepunkt/Ordner bereits vorhanden oder übergeordneter Ordner fehlt: %s.
# Lock
## Force
lock.forced.heading=Sperren fehlgeschlagen
lock.forced.message=Aufgrund von Zugriffen laufender Prozesse oder geöffneter Dateien konnte „%s“ nicht gesperrt werden. Du kannst das Sperren dieses Tresors erzwingen, allerdings kann dies zum Verlust ungespeicherter Daten führen.
lock.forced.confirmBtn=Sperren erzwingen
lock.forced.retryBtn=Wiederholen
lock.forced.forceBtn=Sperren erzwingen
## Failure
lock.fail.heading=Tresor konnte nicht gesperrt werden.
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.
@@ -191,7 +192,7 @@ preferences.general.theme.automatic=Automatisch
preferences.general.theme.light=Hell
preferences.general.theme.dark=Dunkel
preferences.general.unlockThemes=Dunklen Modus freischalten
preferences.general.showMinimizeButton=Minimieren-Schaltfläche anzeigen
preferences.general.showMinimizeButton=Schaltfläche zum Minimieren anzeigen
preferences.general.showTrayIcon=Symbol im Infobereich anzeigen (Neustart erforderlich)
preferences.general.startHidden=Cryptomator im Hintergrund starten
preferences.general.debugLogging=Diagnoseprotokoll aktivieren
@@ -299,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Speicherort des Tresors ändern …
### Needs Migration
main.vaultDetail.migrateButton=Tresor aktualisieren
main.vaultDetail.migratePrompt=Dein Tresor muss auf ein neues Format aktualisiert werden, bevor du auf ihn zugreifen kannst
### Error
main.vaultDetail.error.info=Beim Laden des Tresors von der Festplatte ist ein Fehler aufgetreten.
main.vaultDetail.error.reload=Erneut laden
main.vaultDetail.error.windowTitle=Fehler beim Laden des Tresors
# Wrong File Alert
wrongFileAlert.title=Verschlüsseln von Dateien

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Αυτή είναι η τοποθεσία
addvault.new.readme.accessLocation.3=Κάθε αρχείο που θα προστεθεί σε αυτό τον τόμο θα κωδικοποιηθεί από το Cryptomator. Μπορείτε να το επεξεργαστείτε όπως θα κάνατε σε κάθε δίσκο/φάκελο. Αυτή είναι μόνο για αποκρυπτογραφημένη μορφή των περιεχομένων του, τα αρχεία σας μένουν κωδικοποιημένα στον σκληρό σας δίσκο συνέχεια.
addvault.new.readme.accessLocation.4=Μπορείτε ελεύθερα να αφαιρέσετε το αρχείο.
## Existing
addvaultwizard.existing.instruction=Επιλέξτε το αρχείο "masterkey.cryptomator" του υπάρχοντος vault σας.
addvaultwizard.existing.instruction=Επιλέξτε το αρχείο "vault.cryptomator" της υπάρχοντος κρύπτης. Αν υπάρχει μόνο ένα αρχείο με όνομα "masterkey.cryptomator", επιλέξτε αυτό.
addvaultwizard.existing.chooseBtn=Επιλογή…
addvaultwizard.existing.filePickerTitle=Επιλέξτε το αρχείο Masterkey
addvaultwizard.existing.filePickerTitle=Επιλέξτε Αρχείο Κρύπτης
## Success
addvaultwizard.success.nextStepsInstructions=Προστέθηκε το vault "%s".\nΠρέπει να ξεκλειδώσετε αυτό το vault για να έχετε πρόσβαση ή να προσθέσετε περιεχόμενο. Εναλλακτικά μπορείτε να το ξεκλειδώσετε κάποια άλλη στιγμή.
addvaultwizard.success.unlockNow=Ξεκλείδωμα τώρα
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Το σημείο/φάκελος προ
# Lock
## Force
lock.forced.heading=Το κανονικό κλείδωμα απέτυχε
lock.forced.heading=Το κλείδωμα απέτυχε
lock.forced.message=Το κλείδωμα "%s" μπλοκαρίστηκε από εκκρεμείς διεργασίες ή ανοιχτά αρχεία. Μπορείτε να εξαναγκάσετε το κλείδωμα του vault, αλλά η διακοπή Ι/Ο ενδέχεται να οδηγήσει σε απώλεια μη αποθηκευμένων δεδομένων.
lock.forced.confirmBtn=Εξαναγκασμένο κλείδωμα
lock.forced.retryBtn=Επανάληψη
lock.forced.forceBtn=Εξαναγκασμός Κλειδώματος
## Failure
lock.fail.heading=Το κλείδωμα του vault απέτυχε.
lock.fail.message=Το Vault "%s" δεν κλειδώθηκε. Εξασφαλίστε την αποθήκευση της εργασίας σε άλλο σημείο και πως οι σημαντικές διεργασίας Ανάγνωσης/Εγγραφής έχουν ολοκληρωθεί. Για να κλείσετε το vault, τερματίστε τη διεργασία του Cryptomator.
@@ -299,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Αλλαγή τοποθεσίας Vault
### Needs Migration
main.vaultDetail.migrateButton=Αναβάθμιση Vault
main.vaultDetail.migratePrompt=Το vault σας πρέπει να αναβαθμιστεί σε νέα μορφή, προτού να έχετε πρόσβαση σε αυτό
### Error
main.vaultDetail.error.info=Παρουσιάστηκε σφάλμα κατά τη φόρτωση της κρύπτης από το δίσκο.
main.vaultDetail.error.reload=Επαναφόρτωση
main.vaultDetail.error.windowTitle=Σφάλμα φόρτωσης κρύπτης
# Wrong File Alert
wrongFileAlert.title=Πως να κωδικοποιήσετε αρχεία

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Este es el lugar de acceso de la bóveda.
addvault.new.readme.accessLocation.3=Los archivos agregados a este volumen serán cifrados por Cryptomator. Se puede trabajar con ellos como en cualquier otra unidad/carpeta. Esta es sólo una vista descifrada del contenido, sus archivos permanecen cifrados en el disco duro todo el tiempo.
addvault.new.readme.accessLocation.4=No dude en eliminar este archivo.
## Existing
addvaultwizard.existing.instruction=Elegir el archivo "masterkey.cryptomator" de la bóveda existente.
addvaultwizard.existing.instruction=Elija el archivo "vault.cryptomator" de su bóveda existente. Si solo existe un archivo llamado "masterkey.cryptomator", selecciónelo en su lugar.
addvaultwizard.existing.chooseBtn=Elegir…
addvaultwizard.existing.filePickerTitle=Seleccionar archivo Masterkey
addvaultwizard.existing.filePickerTitle=Seleccionar archivo de bóveda
## Success
addvaultwizard.success.nextStepsInstructions=Bóveda "%s" añadida.\nSe necesita desbloquear esta bóveda para acceder o añadir contenido. Alternativamente se \n puede desbloquear en otro momento.
addvaultwizard.success.unlockNow=Desbloquear ahora
@@ -117,17 +117,18 @@ unlock.error.invalidMountPoint.existing=El punto de montaje/carpeta ya existe o
# Lock
## Force
lock.forced.heading=Bloqueo automático fallido
lock.forced.heading=Error al bloquear
lock.forced.message=El bloqueo de "%s" fue bloqueado por operaciones pendientes o archivos abiertos. Puede forzar el bloqueo de esta bóveda, sin embargo, interrumpir la I/O puede provocar la pérdida de datos no guardados.
lock.forced.confirmBtn=Forzar bloqueo
lock.forced.retryBtn=Reintentar
lock.forced.forceBtn=Forzar bloqueo
## Failure
lock.fail.heading=Falló al bloquear la bóveda.
lock.fail.message=No se pudo bloquear la bóveda "%s". Asegúrese de que el trabajo no guardado se ha guardado en otro lugar y las operaciones de lectura/escritura importantes han finalizado. Para cerrar la bóveda termine el proceso de Cryptomator.
# Migration
migration.title=Mejorar bóveda
migration.title=Actualizar bóveda
## Start
migration.start.prompt=La bóveda "%s" necesita ser actualizada a un formato más nuevo. Antes de continuar, asegurarse de que no haya ninguna sincronización pendiente afectando esta bóveda.
migration.start.prompt=La bóveda "%s" necesita ser actualizada a un formato más nuevo. Antes de continuar, asegúrese de que no haya ninguna sincronización pendiente afectando esta bóveda.
migration.start.confirm=Sí, mi bóveda está sincronizada
## Run
migration.run.enterPassword=Ingresar la contraseña para "%s"
@@ -299,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Cambiar ubicación de la bóveda…
### Needs Migration
main.vaultDetail.migrateButton=Mejorar bóveda
main.vaultDetail.migratePrompt=Su bóveda necesita ser actualizada a un formato nuevo antes de poder acceder a ella
### Error
main.vaultDetail.error.info=Se produjo un error al cargar la bóveda del disco.
main.vaultDetail.error.reload=Recargar
main.vaultDetail.error.windowTitle=Error al cargar la bóveda
# Wrong File Alert
wrongFileAlert.title=Cómo encriptar archivos

View File

@@ -0,0 +1,133 @@
# Locale Specific CSS files such as CJK, RTL,...
# Generics
## Button
generic.button.apply=I-apply
generic.button.back=Bumalik
generic.button.cancel=Kanselahin
generic.button.change=Baguhin
generic.button.close=Isara
generic.button.copy=Kopyahin
generic.button.copied=Nakopya na!
generic.button.done=Tapos na
generic.button.next=Sunod
generic.button.print=I-print
## Error
generic.error.title=Error %s
generic.error.instruction=Oops! Hindi inaasahan ng Cryptomator na ito'y mangyari. Maaari kang humanap ng umiiral na solusyon sa problemang ito. Maaaring i-report ito kung hindi pa umiiral.
generic.error.hyperlink.lookup=Hanapin ang solusyon
generic.error.hyperlink.report=I-report ang problema
generic.error.technicalDetails=Mga detalye:
# Defaults
defaults.vault.vaultName=Vault
# Tray Menu
traymenu.showMainWindow=Ipakita
traymenu.showPreferencesWindow=Mga Kagustuhan
traymenu.lockAllVaults=I-lock lahat
traymenu.quitApplication=Umalis
traymenu.vault.unlock=I-unlock
traymenu.vault.lock=I-lock
traymenu.vault.reveal=Ipakita
# Add Vault Wizard
addvaultwizard.title=Magdagdag ng Vault
## Welcome
addvaultwizard.welcome.newButton=Gumawa ng Bagong Vault
addvaultwizard.welcome.existingButton=Magbukas ng Umiiral na Vault
## New
### Name
addvaultwizard.new.nameInstruction=Pangalanan ang vault
addvaultwizard.new.namePrompt=Pangalan ng Vault
### Location
addvaultwizard.new.locationInstruction=Saan maaaring ilagay ng Cryptomator ang mga encrypted files ng iyong vault?
addvaultwizard.new.locationLabel=Storage location
addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Custom Location
addvaultwizard.new.directoryPickerButton=Mamili…
addvaultwizard.new.directoryPickerTitle=Pumili ng Direktoryo
### Password
### Information
## Existing
addvaultwizard.existing.chooseBtn=Mamili…
## Success
# Remove Vault
# Change Password
# Forget Password
# Unlock
unlock.unlockBtn=I-unlock
##
## Success
## Failure
### Invalid Mount Point
# Lock
## Force
lock.forced.retryBtn=Subukan muli
## Failure
# Migration
## Start
## Run
## Success
## Missing file system capabilities
## Impossible
# Health Check
## Start
## Start Failure
## Check Selection
## Detail view
## Fix Application
# Preferences
preferences.title=Mga Kagustuhan
## General
## Volume
## Updates
## Contribution
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
# Vault Statistics
## Read
## Write
# Main Window
main.closeBtn.tooltip=Isara
main.preferencesBtn.tooltip=Mga Kagustuhan
## Drag 'n' Drop
## Vault List
main.vaultlist.contextMenu.lock=I-lock
main.vaultlist.addVaultBtn=Magdagdag ng Vault
## Vault Detail
### Welcome
### Locked
### Unlocked
main.vaultDetail.lockBtn=I-lock
### Missing
### Needs Migration
### Error
# Wrong File Alert
# Vault Options
## General
vaultOptions.general.vaultName=Pangalan ng Vault
## Mount
vaultOptions.mount.mountPoint.directoryPickerButton=Mamili…
## Master Key
# Recovery Key
# New Password
# Quit

View File

@@ -9,15 +9,15 @@ generic.button.change=Modifier
generic.button.close=Fermer
generic.button.copy=Copier
generic.button.copied=Copié !
generic.button.done=Terminé
generic.button.done=Ok
generic.button.next=Suivant
generic.button.print=Imprimer
## Error
generic.error.title=Erreur: %s
generic.error.title=Erreur : %s
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:
generic.error.technicalDetails=Détails :
# Defaults
defaults.vault.vaultName=Coffre
@@ -72,12 +72,12 @@ addvault.new.readme.storageLocation.10=Si vous avez besoin d'aide, consultez la
addvault.new.readme.accessLocation.fileName=BIENVENUE.rtf
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.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.3=Tous les fichiers ajoutés à ce volume seront chiffrés par Cryptomator. Vous pouvez l'utiliser comme n'importe quel lecteur/répertoire. Ceci est seulement une vue déchiffrée de son contenu, vos fichiers restent chiffrés dans votre disque dur en permanence.
addvault.new.readme.accessLocation.4=Vous pouvez supprimer ce fichier.
## Existing
addvaultwizard.existing.instruction=Sélectionner le fichier "masterkey.cryptomator" de votre coffre existant.
addvaultwizard.existing.instruction=Choisissez le fichier "vault.cryptomator" de votre coffre existant. S'il existe seulement un fichier "masterkey.cryptomator", sélectionnez celui-ci.
addvaultwizard.existing.chooseBtn=Choisir...
addvaultwizard.existing.filePickerTitle=Sélectionner le fichier clef
addvaultwizard.existing.filePickerTitle=Sélectionnez le fichier du coffre
## Success
addvaultwizard.success.nextStepsInstructions=Coffre “%s” ajouté.\nIl faudra déverrouiller ce coffre afin dy accéder ou dy ajouter du contenu. Cette action peut être réalisée ultérieurement.
addvaultwizard.success.unlockNow=Déverrouiller
@@ -93,7 +93,7 @@ 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
# Forget Password
forgetPassword.title=Oublier le mot de passe
forgetPassword.title=Mot de passe oublié
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
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Le point de montage/le répertoire exist
# Lock
## Force
lock.forced.heading=Le verrouillage normal a échoué
lock.forced.heading=Échec du verrouillage
lock.forced.message=Le verrouillage de «%s» a été bloqué par des opérations en attente ou des fichiers ouverts. Vous pouvez forcer le verrouillage de ce coffre, mais l'interruption d'E/S peut entraîner la perte de données non enregistrées.
lock.forced.confirmBtn=Forcer le verrouillage
lock.forced.retryBtn=Réessayer
lock.forced.forceBtn=Forcer le verrouillage
## Failure
lock.fail.heading=Le verrouillage du coffre a échoué.
lock.fail.message=Le coffre-fort "%s" n'a pas pu être verrouillé. Assurez-vous que le travail non sauvegardé est sauvegardé ailleurs et que les opérations importantes de lecture/écriture sont bien terminées. Pour fermer le coffre-fort, tuez le processus Cryptomator.
@@ -299,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Changer l'Emplacement du Coffre…
### Needs Migration
main.vaultDetail.migrateButton=Mettre à jour le coffre
main.vaultDetail.migratePrompt=Votre coffre doit être converti dans un nouveau format avant d'y accéder
### Error
main.vaultDetail.error.info=Une erreur s'est produite lors du chargement du coffre depuis le disque.
main.vaultDetail.error.reload=Actualiser
main.vaultDetail.error.windowTitle=Erreur lors du chargement du coffre
# Wrong File Alert
wrongFileAlert.title=Comment chiffrer ses données

View File

@@ -0,0 +1,156 @@
# Locale Specific CSS files such as CJK, RTL,...
# Generics
## Button
generic.button.apply=החל
generic.button.back=חזור
generic.button.cancel=ביטול
generic.button.change=שנה
generic.button.close=סגור
generic.button.copy=העתק
generic.button.copied=הועתק!
generic.button.done=סיום
generic.button.next=המשך
generic.button.print=הדפס
## Error
generic.error.title=שגיאה %s
generic.error.instruction=אופס! Cryptomator לא ציפה שזה יקרה. את/ה יכול/ה לחפש פתרונות קיימים לשגיאה זו. או שבמקרה והשגיאה לא דווחה עדיין, תרגיש/י בנוח לעשות זאת.
generic.error.hyperlink.lookup=חפש שגיאה זו
generic.error.hyperlink.report=דווח על שגיאה זו
generic.error.technicalDetails=פרטים:
# Defaults
defaults.vault.vaultName=כספת
# Tray Menu
traymenu.showMainWindow=הצג
traymenu.showPreferencesWindow=העדפות
traymenu.lockAllVaults=נעל הכל
traymenu.quitApplication=צא
traymenu.vault.unlock=בטל נעילה
traymenu.vault.lock=נעילה
traymenu.vault.reveal=חשוף
# Add Vault Wizard
addvaultwizard.title=הוסף כספת
## Welcome
addvaultwizard.welcome.newButton=צור כספת חדשה
addvaultwizard.welcome.existingButton=פתח כספת קיימת
## New
### Name
addvaultwizard.new.nameInstruction=בחר שם עבור הכספת שלך
addvaultwizard.new.namePrompt=שם הכספת
### Location
addvaultwizard.new.locationInstruction=היכן Cryptomator צריך לשמור את הקבצים המוצפנים של הכספת שלך?
addvaultwizard.new.locationLabel=מיקום אחסון
addvaultwizard.new.directoryPickerLabel=מיקום מותאם אישית
addvaultwizard.new.directoryPickerButton=בחר...
addvaultwizard.new.directoryPickerTitle=בחירת ספרייה
addvaultwizard.new.fileAlreadyExists=שם הקובץ או שם התיקייה עם שם הכספת כבר קיים
addvaultwizard.new.locationDoesNotExist=מחיצה בנתיב הנקוב לא קיימת או אין אפשרות לקבל אליה גישה
addvaultwizard.new.locationIsNotWritable=אין הרשאת כתיבה בנתיב הנקוב
addvaultwizard.new.locationIsOk=מיקום מתאים לכספת שלך
addvaultwizard.new.invalidName=שם כספת שגוי. אנא שקול שם מחיצה רגיל.
### Password
addvaultwizard.new.createVaultBtn=צור כספת חדשה
addvaultwizard.new.generateRecoveryKeyChoice=לא תיהיה אפשרות לקבל גישה למידע שלך בלי הסיסמה שלך. האם תרצה/י מפתח שחזור למקרה ותאבד/י את הסיסמה שלך?
addvaultwizard.new.generateRecoveryKeyChoice.yes=כן בבקשה, עדיף ללכת על בטוח
addvaultwizard.new.generateRecoveryKeyChoice.no=לא תודה, אני לא אאבד את הסיסמה שלי
### Information
addvault.new.readme.storageLocation.fileName=חשוב.rtf
addvault.new.readme.storageLocation.1=⚠️ קבצי כספת ⚠️
addvault.new.readme.storageLocation.2=זהו מיקום אחסון לכספת שלך.
addvault.new.readme.storageLocation.3=אל
addvault.new.readme.storageLocation.4=תשנה קבצים במחיצה זו או
addvault.new.readme.storageLocation.5=תדביק קבצים כלשהם להצפנה במחיצה זו.
addvault.new.readme.storageLocation.6=אם תרצה להצפין קבצים ולצפות בתוכן של הכספת, עשה את הבא:
addvault.new.readme.storageLocation.7=1. הוסף כספת זו ל-Cryptomator.
addvault.new.readme.storageLocation.8=2. בטל נעילת כספת ב-Cryptomator.
addvault.new.readme.storageLocation.9=3. פתח את מיקום הגישה ע"י לחיצה על מקש "חשוף".
addvault.new.readme.storageLocation.10=אם הנך נדרש/ת בעזרה, בקר/י את התיעוד: %s
addvault.new.readme.accessLocation.fileName=ברוכים הבאים.rtf
addvault.new.readme.accessLocation.1=ספרייה מוצפנת
addvault.new.readme.accessLocation.2=זהו מיקום גישה לכספת שלך.
addvault.new.readme.accessLocation.3=כל קובץ אשר יצורף לספרייה זו יעבור הצפנה באמצעות Cryptomator. את/ה תוכל/י לעבוד עליו כמו עם כל קבוץ/מחיצה רגילים. זהו מצב הצגה מפוענח של התוכן, הקבצים שלך נשארים מוצפנים על הדיסק הקשיח שלך בכל רגע.
addvault.new.readme.accessLocation.4=תרגיש/י בנוח להסיר את הקובץ הזה.
## Existing
addvaultwizard.existing.chooseBtn=בחר...
## Success
# Remove Vault
# Change Password
# Forget Password
# Unlock
unlock.unlockBtn=בטל נעילה
##
## Success
## Failure
### Invalid Mount Point
# Lock
## Force
## Failure
# Migration
## Start
## Run
## Success
## Missing file system capabilities
## Impossible
# Health Check
## Start
## Start Failure
## Check Selection
## Detail view
## Fix Application
# Preferences
preferences.title=העדפות
## General
## Volume
## Updates
## Contribution
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
# Vault Statistics
## Read
## Write
# Main Window
main.closeBtn.tooltip=סגור
main.preferencesBtn.tooltip=העדפות
## Drag 'n' Drop
## Vault List
main.vaultlist.contextMenu.lock=נעילה
main.vaultlist.addVaultBtn=הוסף כספת
## Vault Detail
### Welcome
### Locked
### Unlocked
main.vaultDetail.lockBtn=נעילה
### Missing
### Needs Migration
### Error
# Wrong File Alert
# Vault Options
## General
vaultOptions.general.vaultName=שם הכספת
## Mount
vaultOptions.mount.mountPoint.directoryPickerButton=בחר...
## Master Key
# Recovery Key
# New Password
# Quit

View File

@@ -75,6 +75,7 @@ unlock.unlockBtn=अनलॉक करें
# Lock
## Force
lock.forced.retryBtn=पुन: प्रयास करें
## Failure
# Migration
@@ -124,6 +125,7 @@ main.vaultDetail.lockBtn=लॉक करें
### Missing
### Needs Migration
main.vaultDetail.migrateButton=वाउल्ट को अपग्रेड करें
### Error
# Wrong File Alert
wrongFileAlert.instruction.1=अपना वाउल्ट खोलें।

View File

@@ -70,6 +70,7 @@
### Unlocked
### Missing
### Needs Migration
### Error
# Wrong File Alert

View File

@@ -13,6 +13,11 @@ generic.button.done=Kész
generic.button.next=Következő
generic.button.print=Nyomtatás
## Error
generic.error.title=Hiba: %s
generic.error.instruction=Upsz! A Cryptomator nem számított rá, hogy ez megtörténik. Keressen meglévő megoldást erre a hibára. Vagy ha még nem jelentették, bátran tegye ezt meg.
generic.error.hyperlink.lookup=Hiba okának keresése
generic.error.hyperlink.report=Hiba jelentése
generic.error.technicalDetails=Részletek:
# Defaults
defaults.vault.vaultName=Széf
@@ -38,9 +43,14 @@ addvaultwizard.new.namePrompt=A széf neve
### Location
addvaultwizard.new.locationInstruction=Hova mentse a Cryptomator a széf titkosított fájljait?
addvaultwizard.new.locationLabel=Tárolási hely
addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Egyedi hely
addvaultwizard.new.directoryPickerButton=Választás…
addvaultwizard.new.directoryPickerTitle=Könyvtár kiválasztása
addvaultwizard.new.fileAlreadyExists=Már létezik fájl/könyvtár ezzel a trezornévvel
addvaultwizard.new.locationDoesNotExist=A megadott elérési úton lévő könyvtár nem létezik, vagy nem érhető el
addvaultwizard.new.locationIsNotWritable=Nincs írási hozzáférés a megadott elérési úthoz
addvaultwizard.new.locationIsOk=Megfelelő hely a trezornak
addvaultwizard.new.invalidName=Érvénytelen széf elnevezés. Kérjük vegye figyelembe a szabályos könyvtárelnevezésre vonatkozó szabályokat.
### Password
addvaultwizard.new.createVaultBtn=Új széf létrehozása
@@ -65,9 +75,9 @@ addvault.new.readme.accessLocation.2=Ez a széf hozzáférési helye.
addvault.new.readme.accessLocation.3=Bármilyen, a kötethez hozzáadott fájl titkosításra kerül a Cryptomator által. Úgy dolgozhat vele, mint minden más meghajtóval/mappával. Ez az egyetlen dekódolt tartalmi nézet. A fájlai folyamatosan titkosítva maradnak a merevlemezén.
addvault.new.readme.accessLocation.4=Bátran eltávolíthatja ezt a fájlt.
## Existing
addvaultwizard.existing.instruction=Válassza ki a már létező széfjéhez tartozó "masterkey.cryptomator" fájlt.
addvaultwizard.existing.instruction=Válassza ki a "vault.cryptomatotor" fájlt a meglévő tárolóhoz. Ha csak egy "masterkey.cryptomatotor" nevű fájl létezik, válassza azt.
addvaultwizard.existing.chooseBtn=Kiválaszt…
addvaultwizard.existing.filePickerTitle=Mesterkulcs fájl kiválasztása
addvaultwizard.existing.filePickerTitle=Trezor fájl kiválasztása
## Success
addvaultwizard.success.nextStepsInstructions=Széf létrehozva "%s".\nA tartalom eléréséhez, vagy hozzáadásához fel kell oldania a széfet. Alternatív megoldásként később bármikor feloldhatja.
addvaultwizard.success.unlockNow=Azonnali feloldás
@@ -88,11 +98,15 @@ forgetPassword.information=Eltávolítja a széf mentett jelszavát a rendszere
forgetPassword.confirmBtn=Jelszó elfelejtése
# Unlock
unlock.title="%s" feloldása
unlock.passwordPrompt=Írja be a jelszavát a következő széfhez "%s":
unlock.savePassword=Jelszó megjegyzése
unlock.unlockBtn=Feloldás
##
unlock.chooseMasterkey.prompt=Nem található a tároló kulcsfájlja a várt helyen. Kérjük válassza ki a kulcsfájlt manuálisan.
unlock.chooseMasterkey.filePickerTitle=Mesterkulcs fájl kiválasztása
## Success
unlock.success.message="%s" sikreresen feloldásra került! Mostmár hozzáférhet a virtuális trezorhoz.
unlock.success.rememberChoice=Jegyezze meg a választást és ne mutassa többet
unlock.success.revealBtn=Széf megjelenítése
## Failure
@@ -103,7 +117,11 @@ unlock.error.invalidMountPoint.existing=A csatolási pont "%s" már létezik vag
# Lock
## Force
lock.forced.message=A „%s” zárolását függőben lévő műveletek vagy megnyitott fájlok blokkolták. Kényszerítheti a tároló zárolását, bár az I/O megszakítása a nem mentett adatok elvesztéséhez vezethet.
lock.forced.retryBtn=Újra
## Failure
lock.fail.heading=Zárolás sikertelen.
lock.fail.message=A "%s" tárolót nem lehetett zárolni. Győződjön meg arról, hogy a nem mentett munkát máshová menti, és a fontos olvasási/írási műveletek befejeződtek. A trezor bezárásához szakítsa meg a Cryptomator folyamatot.
# Migration
migration.title=Széf frissítése
@@ -131,7 +149,18 @@ migration.impossible.moreInfo=A széf továbbra is megnyitható marad egy régeb
# Health Check
## Start
health.title="%s" állapotellenőrzése
health.intro.header=Állapotfelmérés
health.intro.text=Az állapotfelmérés olyan ellenőrzéscsomag, amely felderíti és esetlegesen kijavítja a trezor belső szerkezetében fellépő problémákat. Kérjük, ne feledje:
health.intro.remarkSync=Győződjön meg arról, hogy minden eszköz teljesen szinkronizálva van, ez megoldja a legtöbb problémát.
health.intro.remarkFix=Nem minden probléma javítható.
health.intro.remarkBackup=Ha az adatok sérültek, csak a biztonsági mentés segíthet.
health.intro.affirmation=Elolvastam és megértettem a fenti információkat
## Start Failure
health.fail.header=Hiba a Trezor konfiguráció betöltésekor
health.fail.ioError=Hiba történt a konfigurációs fájl elérése és olvasása közben.
health.fail.parseError=Hiba történt a tároló konfigurációjának elemzése közben.
health.fail.moreInfo=További infó
## Check Selection
## Detail view
## Fix Application
@@ -239,6 +268,9 @@ main.vaultDetail.missing.changeLocation=A széf helyének megváltoztatása…
### Needs Migration
main.vaultDetail.migrateButton=Széf frissítése
main.vaultDetail.migratePrompt=A széfet új formátumra kell frissíteni, mielőtt hozzáférhet
### Error
main.vaultDetail.error.reload=Újratöltés
main.vaultDetail.error.windowTitle=Hiba az adatok betöltése közben
# Wrong File Alert
wrongFileAlert.title=Hogyan lehet fájlokat titkosítani

View File

@@ -13,6 +13,11 @@ generic.button.done=Selesai
generic.button.next=Lanjut
generic.button.print=Cetak
## Error
generic.error.title=Kesalahan %s
generic.error.instruction=Ups! Cryptomator tidak mengharapkan ini terjadi. Anda dapat mencari solusi yang ada untuk kesalahan ini. Atau jika belum dilaporkan, jangan ragu untuk melakukannya.
generic.error.hyperlink.lookup=Cari kesalahan
generic.error.hyperlink.report=Laporkan kesalahan
generic.error.technicalDetails=Rincian:
# Defaults
defaults.vault.vaultName=Brankas
@@ -70,9 +75,9 @@ addvault.new.readme.accessLocation.2=Ini adalah lokasi akses brankas kamu.
addvault.new.readme.accessLocation.3=File yang ditambahkan ke volume ini akan dienkripsi oleh Cryptomator. Anda dapat mempergunakan isi vault seperti dalam folder lain. Saat ini Anda sedang mengakses tampilan versi dekripsi, file Anda selalu terenkripsi di dalam cakram keras Anda.
addvault.new.readme.accessLocation.4=Anda dapat menghapus file ini.
## Existing
addvaultwizard.existing.instruction=Pilih file "masterkey.cryptomator" dalam vault Anda.
addvaultwizard.existing.instruction=Pilih file "vault.cryptomator" Anda dari vault yang ada. Jika hanya ada file bernama "masterkey.cryptomator", pilih file tersebut.
addvaultwizard.existing.chooseBtn=Pilih…
addvaultwizard.existing.filePickerTitle=Pilih File Kunci Induk
addvaultwizard.existing.filePickerTitle=Pilih File Vault
## Success
addvaultwizard.success.nextStepsInstructions=Vault "%s" telah dibuat.\nAnda harus membuka kunci vault ini untuk mengakses atau menambahkan konten. Anda juga dapat membuka kunci vault ini kapan saja di kemudian hari.
addvaultwizard.success.unlockNow=Buka Kunci Sekarang
@@ -93,6 +98,7 @@ forgetPassword.information=Kata sandi vault yang tersimpan akan dihapus dari key
forgetPassword.confirmBtn=Lupa Kata Sandi
# Unlock
unlock.title=Membuka "%s"
unlock.passwordPrompt=Masukkan kata sandi untuk "%s":
unlock.savePassword=Simpan Kata Sandi
unlock.unlockBtn=Buka Gembok
@@ -111,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Poin mount "%s" sudah ada atau folder in
# Lock
## Force
lock.forced.heading=Gagal mengunci secara normal
lock.forced.heading=Gagal mengunci
lock.forced.message=Penguncian "%s" terblokir oleh operasi yang sedang berjalan atau file yang masih terbuka. Anda dapat mengunci paksa vault ini, namun ada kemungkinan mengganggu I/O akan menghilangkan data yang belum disimpan.
lock.forced.confirmBtn=Kunci Paksa
lock.forced.retryBtn=Coba lagi
lock.forced.forceBtn=Kunci Paksa
## Failure
lock.fail.heading=Gagal mengunci vault.
lock.fail.message=Vault "%s" tidak dapat dikunci. Pastikan bahwa file yang belum tersimpan telah disimpan di lokasi lain, dan operasi Baca/Tulis yang penting telah selesai. Untuk menutup vault ini, matikan proses Cryptomator.
@@ -144,13 +151,37 @@ migration.impossible.moreInfo=Vault dapat dibuka dengan program versi lebih lama
# Health Check
## Start
health.title=Pemeriksaan Kesehatan "%s"
health.intro.header=Pemeriksaan Kesehatan
health.intro.text=Pemeriksaan Kesehatan adalah kumpulan pemeriksaan untuk mendeteksi dan mungkin memperbaiki masalah dalam struktur internal brankas Anda. Harap diingat:
health.intro.remarkSync=Pastikan semua perangkat disinkronkan sepenuhnya, ini menyelesaikan sebagian besar masalah.
health.intro.remarkFix=Tidak semua masalah bisa diperbaiki.
health.intro.remarkBackup=Jika data rusak, hanya cadangan yang dapat membantu.
health.intro.affirmation=Saya telah membaca dan memahami informasi di atas
## Start Failure
health.fail.header=Kesalahan saat memuat Konfigurasi Vault
health.fail.ioError=Terjadi kesalahan saat mengakses dan membaca file konfigurasi.
health.fail.parseError=Terjadi kesalahan saat mengurai konfigurasi vault.
health.fail.moreInfo=Info Selengkapnya
## Check Selection
health.checkList.description=Centang daftar di bagian kiri atau gunakan tombol di bawah.
health.checkList.selectAllButton=Centang Semua
health.checkList.deselectAllButton=Jangan Centang Semua
health.check.runBatchBtn=Cek Jalankan yang dipilih
## Detail view
health.check.detail.noSelectedCheck=Untuk hasil, pilih pemeriksaan kesehatan yang sudah selesai di sebelah kiri.
health.check.detail.checkScheduled=Pemeriksaan dijadwalkan.
health.check.detail.checkRunning=Saat ini pemeriksaan sedang berjalan…
health.check.detail.checkSkipped=Pemeriksaan tidak dipilih untuk dijalankan.
health.check.detail.checkFinished=Pemeriksaan berhasil diselesaikan.
health.check.detail.checkFinishedAndFound=Pemeriksaan selesai berjalan. Harap tinjau hasilnya.
health.check.detail.checkFailed=Pemeriksaan terhenti karena terjadi kesalahan.
health.check.detail.checkCancelled=Pemeriksaan dibatalkan.
health.check.exportBtn=Ekspor Laporan
## Fix Application
health.fix.fixBtn=Perbaiki
health.fix.successTip=Perbaikan berhasil
health.fix.failTip=Perbaikan gagal, lihat log untuk detailnya
# Preferences
preferences.title=Preferensi
@@ -185,53 +216,153 @@ preferences.updates.updateAvailable=Pembaharuan ke versi %s tersedia.
## Contribution
preferences.contribute=Dukung Kami
preferences.contribute.registeredFor=Sertifikat pendukung terdaftar untuk %s
preferences.contribute.noCertificate=Dukung Cryptomator dan terima sertifikat pendukung. Ini seperti kunci lisensi tetapi untuk orang-orang hebat yang menggunakan perangkat lunak gratis. ;-)
preferences.contribute.getCertificate=Belum punya? Pelajari bagaimana Anda bisa mendapatkannya.
preferences.contribute.promptText=Tempel kode sertifikat pendukung di sini
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
preferences.about=Tentang
# Vault Statistics
stats.title=Statistik untuk %s
stats.cacheHitRate=Tingkat Hit Cache
## Read
stats.read.throughput.idle=Read: idle
stats.read.throughput.kibs=Read: %.2f kiB/s
stats.read.throughput.mibs=Read: %.2f MiB/s
stats.read.total.data.none=Data read: -
stats.read.total.data.kib=Data read: %.1f kiB
stats.read.total.data.mib=Data read: %.1f MiB
stats.read.total.data.gib=Data read: %.1f GiB
stats.decr.total.data.none=Data decrypted: -
stats.decr.total.data.kib=Data decrypted: %.1f kiB
stats.decr.total.data.mib=Data decrypted: %.1f MiB
stats.decr.total.data.gib=Data decrypted: %.1f GiB
stats.read.accessCount=Total reads: %d
## Write
stats.write.throughput.idle=Write: idle
stats.write.throughput.kibs=Write: %.2f kiB/s
stats.write.throughput.mibs=Write: %.2f MiB/s
stats.write.total.data.none=Data tertulis: -
stats.write.total.data.kib=Data tertulis: %.1f kiB
stats.write.total.data.mib=Data tertulis: %.1f MiB
stats.write.total.data.gib=Data tertulis: %.1f GiB
stats.encr.total.data.none=Data terenkripsi: -
stats.encr.total.data.kib=Data terenkripsi: %.1f kiB
stats.encr.total.data.mib=Data terenkripsi: %.1f MiB
stats.encr.total.data.gib=Data terenkripsi: %.1f GiB
stats.write.accessCount=Total menulis: %d
# Main Window
main.closeBtn.tooltip=Tutup
main.minimizeBtn.tooltip=Minimalkan
main.preferencesBtn.tooltip=Preferensi
main.debugModeEnabled.tooltip=Mode Debug diaktifkan
main.donationKeyMissing.tooltip=Pertimbangjan untuk donasi
## Drag 'n' Drop
main.dropZone.dropVault=Tambah vault ini
main.dropZone.unknownDragboardContent=Jika Anda ingin menambahkan vault, seret ke jendela ini
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klik untuk tambah vault
main.vaultlist.contextMenu.remove=Hapus…
main.vaultlist.contextMenu.lock=Gembok
main.vaultlist.contextMenu.unlock=Membuka…
main.vaultlist.contextMenu.unlockNow=Buka Kunci Sekarang
main.vaultlist.contextMenu.vaultoptions=Tampilkan Opsi Vault
main.vaultlist.contextMenu.reveal=Buka Drive
main.vaultlist.addVaultBtn=Tambah Brankas
## Vault Detail
### Welcome
main.vaultDetail.welcomeOnboarding=Terima kasih telah memilih Cryptomator untuk melindungi file Anda. Jika Anda memerlukan bantuan, lihat panduan awal kami:
### Locked
main.vaultDetail.lockedStatus=TERKUNCI
main.vaultDetail.unlockBtn=Membuka…
main.vaultDetail.unlockNowBtn=Buka Kunci Sekarang
main.vaultDetail.optionsBtn=Opsi Vault
main.vaultDetail.passwordSavedInKeychain=Kata Sandi tersimpan
### Unlocked
main.vaultDetail.unlockedStatus=TERBUKA
main.vaultDetail.accessLocation=Konten vault Anda dapat diakses di sini:
main.vaultDetail.revealBtn=Buka Drive
main.vaultDetail.lockBtn=Gembok
main.vaultDetail.bytesPerSecondRead=Read:
main.vaultDetail.bytesPerSecondWritten=Write:
main.vaultDetail.throughput.idle=idle
main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/detik
main.vaultDetail.stats=Statistik Vault
### Missing
main.vaultDetail.missing.info=Cryptomator tidak dapat menemukan vault di path ini.
main.vaultDetail.missing.recheck=Periksa kembali
main.vaultDetail.missing.remove=Hapus dari Daftar Vault…
main.vaultDetail.missing.changeLocation=Ganti Lokasi Vault…
### Needs Migration
main.vaultDetail.migrateButton=Tingkatkan Vault
main.vaultDetail.migratePrompt=Vault Anda perlu ditingkatkan ke format baru, sebelum Anda dapat mengaksesnya
### Error
main.vaultDetail.error.info=Terjadi kesalahan saat memuat vault dari disk.
main.vaultDetail.error.reload=Muat Ulang
main.vaultDetail.error.windowTitle=Terjadi kesalahan saat memuat vault
# Wrong File Alert
wrongFileAlert.title=Cara Mengenkripsi File
wrongFileAlert.header.title=Apakah Anda mencoba mengenkripsi file-file ini?
wrongFileAlert.header.lead=Untuk itu, Cryptomator menyediakan volume di sistem file manager Anda.
wrongFileAlert.instruction.0=Untuk mengenkripsi file, ikuti langkah-langkah berikut:
wrongFileAlert.instruction.1=1. Membuka vault Anda.
wrongFileAlert.instruction.2=Klik "Reveal" untuk membuka volume di file manager Anda.
wrongFileAlert.instruction.3=3. Tambahkan file Anda ke volume ini.
wrongFileAlert.link=Untuk bantuan lebih lanjut, kunjungi
# Vault Options
## General
vaultOptions.general=Umum
vaultOptions.general.vaultName=Nama Brankas
vaultOptions.general.autoLock.lockAfterTimePart1=Kunci saat idle untuk
vaultOptions.general.autoLock.lockAfterTimePart2=menit
vaultOptions.general.unlockAfterStartup=Buka vault saat memulai Cryptomator
vaultOptions.general.actionAfterUnlock=Setelah berhasil membuka
vaultOptions.general.actionAfterUnlock.ignore=Biarkan
vaultOptions.general.actionAfterUnlock.reveal=Buka Drive
vaultOptions.general.actionAfterUnlock.ask=Tanya
vaultOptions.general.startHealthCheckBtn=Mulai Pemeriksaan Kesehatan
## Mount
vaultOptions.mount=Pemasangan
vaultOptions.mount.readonly=Read-Only
vaultOptions.mount.customMountFlags=Custom Mount Flags
vaultOptions.mount.winDriveLetterOccupied=terisi
vaultOptions.mount.mountPoint=Titik Pasang
vaultOptions.mount.mountPoint.auto=Secara otomatis memilih lokasi yang sesuai
vaultOptions.mount.mountPoint.driveLetter=Gunakan huruf drive yang ditetapkan
vaultOptions.mount.mountPoint.custom=Path khusus
vaultOptions.mount.mountPoint.directoryPickerButton=Pilih…
vaultOptions.mount.mountPoint.directoryPickerTitle=Pilih direktori kosong
## Master Key
vaultOptions.masterkey=Kata Sandi
vaultOptions.masterkey.changePasswordBtn=Ubah Kata Sandi
vaultOptions.masterkey.forgetSavedPasswordBtn=Lupa Kata Sandi
vaultOptions.masterkey.recoveryKeyExplanation=Kunci pemulihan adalah satu-satunya cara Anda untuk memulihkan akses ke vault jika Anda kehilangan kata sandi.
vaultOptions.masterkey.showRecoveryKeyBtn=Tampilkan Kunci Pemulihan
vaultOptions.masterkey.recoverPasswordBtn=Pemulihan Kata Sandi
# Recovery Key
recoveryKey.title=Kunci Pemulihan
recoveryKey.enterPassword.prompt=Masukkan kata sandi untuk menampilkan kunci pemulikan untuk "%s":
recoveryKey.display.message=Kunci pemulihan berikut dapat digunakan untuk memulihkan akses ke "%s":
recoveryKey.display.StorageHints=Simpan di tempat yang sangat aman, misal.:\n • Simpan menggunakan password manager\n • Simpan di USB\n • cetak di kertas
recoveryKey.recover.prompt=Masukkan kunci pemulihan untuk "%s":
recoveryKey.recover.validKey=Ini adalah kunci pemulihan yang valid
recoveryKey.printout.heading=Kunci Pemulihan Cryptomator\n"%s"\n
# New Password
newPassword.promptText=Masukkan kata sandi baru
newPassword.reenterPassword=Konfirmasi kata sandi baru
newPassword.passwordsMatch=Kasmta Sandi sesuai!
newPassword.passwordsDoNotMatch=Kata Sandi tidak sesuai
passwordStrength.messageLabel.tooShort=Gunakan minimal %d characters
passwordStrength.messageLabel.0=Sangat lemah
passwordStrength.messageLabel.1=Lemah
passwordStrength.messageLabel.2=Cukup

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Questa è la posizione d'accesso della tua
addvault.new.readme.accessLocation.3=Ogni file aggiunto a questo volume sarà crittografato da Cryptomator. Puoi lavorarci come su ogni altra unità/cartella. Questa è solo una vista decrittografata del suo contenuto, i tuoi file restano sempre crittografati sul tuo disco rigido.
addvault.new.readme.accessLocation.4=Sentiti libero di rimuovere questo file.
## Existing
addvaultwizard.existing.instruction=Scegli il file "masterkey.cryptomator" della tua cassaforte esistente.
addvaultwizard.existing.instruction=Scegliere il file "vault.cryptomator" della tua cassaforte. Se esiste solo un file chiamato "masterkey.cryptomator", allora scegli quello.
addvaultwizard.existing.chooseBtn=Scegli…
addvaultwizard.existing.filePickerTitle=Seleziona il File Masterkey
addvaultwizard.existing.filePickerTitle=Seleziona file cassaforte
## Success
addvaultwizard.success.nextStepsInstructions=Cassaforte "%s" aggiunta.\nDevi sbloccare questa cassaforte per accedere o aggiungere contenuti. Altrimenti, puoi sbloccarla in qualsiasi momento successivo.
addvaultwizard.success.unlockNow=Sblocca Ora
@@ -117,9 +117,8 @@ unlock.error.invalidMountPoint.existing=Il punto di montaggio "%s" esiste già o
# Lock
## Force
lock.forced.heading=Blocco normale fallito
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.retryBtn=Riprova
## Failure
lock.fail.heading=Blocco della cassaforte fallito.
lock.fail.message=Impossibile bloccare la cassaforte "%s". Assicurati che il lavoro non salvato sia salvato altrove e che le importanti operazioni di Lettura/Scrittura siano terminate. Per chiudere la cassaforte, termina il processo di Cryptomator.
@@ -299,6 +298,10 @@ main.vaultDetail.missing.changeLocation=Cambia la Posizione della Cassaforte…
### Needs Migration
main.vaultDetail.migrateButton=Aggiorna la Cassaforte
main.vaultDetail.migratePrompt=La tua cassaforte dev'esser aggiornata a un nuovo formato, prima di potervi accedere
### Error
main.vaultDetail.error.info=Si è verificato un errore durante il caricamento della cassaforte dal disco.
main.vaultDetail.error.reload=Ricarica
main.vaultDetail.error.windowTitle=Errore nel caricare la cassaforte
# Wrong File Alert
wrongFileAlert.title=Come Crittografare i File

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=ここは金庫のアクセス先です。
addvault.new.readme.accessLocation.3=このボリュームに追加したファイルは Cryptomator によって暗号化されます。一般的なドライブ/フォルダー上のように作業することができます。ここでは復号したコンテンツのビューにすぎず、ファイルは常にハードドライブ上で暗号化されています。
addvault.new.readme.accessLocation.4=このファイルはいつでも削除できます。
## Existing
addvaultwizard.existing.instruction=既存の金庫の "masterkey.cryptomator" ファイルを選択してください。
addvaultwizard.existing.instruction=すでにある金庫の "vault.cryptomator" ファイルを選択してください。"masterkey.cryptomator" という名前のファイルだけが存在する場合は、このファイルを代わりに選択してください。
addvaultwizard.existing.chooseBtn=選択...
addvaultwizard.existing.filePickerTitle=Masterkey ファイルを選択
addvaultwizard.existing.filePickerTitle=金庫のファイルを選択
## Success
addvaultwizard.success.nextStepsInstructions=金庫 "%s" を追加しました。\n金庫にアクセスしたり、コンテンツを追加したりするには、金庫を解錠する必要があります。あるいは、後で解錠することが可能です。
addvaultwizard.success.unlockNow=今すぐ解錠
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=マウント ポイント "%s" が既に
# Lock
## Force
lock.forced.heading=正常な施錠に失敗しました
lock.forced.heading=施錠に失敗
lock.forced.message=保留中の操作または、開かれたファイルによって、"%s" の施錠が中断されました。この金庫を強制的に施錠することはできますが、I/O を中断すると保存されていないデータを失う可能性があります。
lock.forced.confirmBtn=強制施錠
lock.forced.retryBtn=再試行
lock.forced.forceBtn=強制的に施錠
## Failure
lock.fail.heading=金庫の施錠に失敗しました。
lock.fail.message=金庫 "%s" を施錠できませんでした。保存されていないデータがほかの場所に保存され、重要な読み込み/書き込み操作が完了していることを確認してください。金庫を閉じるには、Cryptomator のプロセスを強制終了してください。
@@ -299,6 +300,10 @@ main.vaultDetail.missing.changeLocation=金庫の場所を変更...
### Needs Migration
main.vaultDetail.migrateButton=金庫をアップグレード
main.vaultDetail.migratePrompt=金庫にアクセスする前に、 金庫を新しい形式にアップグレードする必要があります
### Error
main.vaultDetail.error.info=ディスクから金庫の読み込み中にエラーが発生しました。
main.vaultDetail.error.reload=再読み込み
main.vaultDetail.error.windowTitle=金庫の読み込みエラー
# Wrong File Alert
wrongFileAlert.title=ファイルを暗号化するには

View File

@@ -3,7 +3,7 @@
# Generics
## Button
generic.button.apply=적용
generic.button.back=뒤로
generic.button.back=이전
generic.button.cancel=취소
generic.button.change=변경
generic.button.close=닫기
@@ -13,6 +13,9 @@ generic.button.done=완료
generic.button.next=다음
generic.button.print=인쇄
## Error
generic.error.title=에러 %s
generic.error.hyperlink.report=에러 보고하기
generic.error.technicalDetails=세부정보:
# Defaults
defaults.vault.vaultName=Vault
@@ -70,9 +73,7 @@ addvault.new.readme.accessLocation.2=이것은 당신의 Vault 접근 위치입
addvault.new.readme.accessLocation.3=이 볼륨에 추가된 모든 파일은 Cryptomator로 암호화됩니다. 다른 드라이브/폴더처럼 작업할 수 있습니다. 볼륨의 내용은 복호화 된 것 처럼 보여지지만, 모든 파일은 항상 암호화되어 하드디스크에 저장됩니다.
addvault.new.readme.accessLocation.4=이 파일은 지우셔도 무방합니다.
## Existing
addvaultwizard.existing.instruction=기존 Vault 의 "masterkey.cryptomator" 파일을 선택하여 주십시요.
addvaultwizard.existing.chooseBtn=선택
addvaultwizard.existing.filePickerTitle=마스터키 파일 선택
## Success
addvaultwizard.success.nextStepsInstructions="%s" Vault가 추가되었습니다.\n이 Vault를 접근하거나 컨텐츠를 추가하려면 잠금해제가 필요합니다. 그렇지만 언제든지 잠금해제가 가능합니다.
addvaultwizard.success.unlockNow=지금 잠금해제
@@ -112,9 +113,8 @@ unlock.error.invalidMountPoint.existing=구성지점/폴더가 이미 존재하
# Lock
## Force
lock.forced.heading=정상적인 잠금을 실패하였습니다.
lock.forced.message=대기 중인 작동이나 파일이 열려있어 "%s"를 잠그는데 실패하였습니다. 이 Vault를 강제로 잠글 수 있으나, 입/출력의 중단은 저장되지 않은 데이터의 유실을 초래할 수 있습니다.
lock.forced.confirmBtn=강제 잠금
lock.forced.retryBtn=재시도
## Failure
lock.fail.heading=Vault 잠금에 실패하였습니다.
lock.fail.message="%s" Vault를 잠글 수 없습니다. 저장되지 않은 작업이 다른 곳에 저장된 것과 중요한 읽기/쓰기 동작이 완료되었는지 확인 하십시요. Vault를 닫기 위해, Cryptomator 프로세스를 강제로 종료 하십시요.
@@ -148,7 +148,12 @@ migration.impossible.moreInfo=Vault를 이전 버전으로 계속 열수 있습
health.title="%s"의 상태 검사
health.intro.header=상태 검사
health.intro.text=상태 검사는 Vault의 내부 구조의 문제점을 점검하고 해결할 수 있는 기능입니다. 다음 사항을 유의하시기 바랍니다:
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.selectAllButton=모든 항목 선택
@@ -283,6 +288,7 @@ main.vaultDetail.missing.changeLocation=Vault 위치 변경
### Needs Migration
main.vaultDetail.migrateButton=Vault 업그레이드
main.vaultDetail.migratePrompt=Vault에 접근하기 전, 새로운 포멧으로 업그레이드가 필요합니다.
### Error
# Wrong File Alert
wrongFileAlert.title=파일 암호화 방법

View File

@@ -65,9 +65,7 @@ addvault.new.readme.accessLocation.2=Šī ir jūsu glabātuves piekļuves vieta.
addvault.new.readme.accessLocation.3=Visas šeit pievienotās datnes tiks šifrētas ar Cryptomator. Jūs variet ar to strādāt kā ar jebkuru citu disku/mapi. Šis it tikai atšifrēts satura skats, jūsu dati diskā visu laiku ir šifrēti.
addvault.new.readme.accessLocation.4=Jūs variet droši noņemt šo datni.
## Existing
addvaultwizard.existing.instruction=Izvēlieties "masterkey.cryptomator" datni no jūsu esošās glabātuves.
addvaultwizard.existing.chooseBtn=Izvēlies...
addvaultwizard.existing.filePickerTitle=Atlasīt galveno atslēgas datni
## Success
addvaultwizard.success.nextStepsInstructions=Pievienota "%s" glabātuve.\nlai piekļūtu vai pievienotu datus, jums šo glabātuvi ir jāatslēdz. Vai arī jūs to variet atslēgt vēlāk jebkurā laikā.
addvaultwizard.success.unlockNow=Atslēgt tagad
@@ -198,6 +196,7 @@ main.vaultDetail.missing.info=Cryptomator šajā ceļā nevarēja atrast glabāt
### Needs Migration
main.vaultDetail.migrateButton=Jaunināt glabātuvi
main.vaultDetail.migratePrompt=Lai jūsu varētu piekļūt glabātuvei to ir nepieciešms jaunināt uz jaunu formātu
### Error
# Wrong File Alert
wrongFileAlert.title=Kā šifrēt datnes

View File

@@ -0,0 +1,88 @@
# Locale Specific CSS files such as CJK, RTL,...
# Generics
## Button
## Error
# Defaults
# Tray Menu
# Add Vault Wizard
## Welcome
## New
### Name
### Location
### Password
### Information
## Existing
## Success
# Remove Vault
# Change Password
# Forget Password
# Unlock
##
## Success
## Failure
### Invalid Mount Point
# Lock
## Force
## Failure
# Migration
## Start
## Run
## Success
## Missing file system capabilities
## Impossible
# Health Check
## Start
## Start Failure
## Check Selection
## Detail view
## Fix Application
# Preferences
## General
## Volume
## Updates
## Contribution
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
# Vault Statistics
## Read
## Write
# Main Window
## Drag 'n' Drop
## Vault List
## Vault Detail
### Welcome
### Locked
### Unlocked
### Missing
### Needs Migration
### Error
# Wrong File Alert
# Vault Options
## General
## Mount
## Master Key
# Recovery Key
# New Password
# Quit

View File

@@ -68,9 +68,7 @@ addvault.new.readme.accessLocation.2=Dette er hvelvets lagringssted.
addvault.new.readme.accessLocation.3=Alle filer som er lagt til i dette volumet, blir kryptert av Cryptomator. Du kan jobbe med dem som på alle andre enheter/mapper. Dette er bare en dekryptert visning av innholdet, filene dine forblir kryptert på harddisken hele tiden.
addvault.new.readme.accessLocation.4=Denne filen kan fjernes hvis ønskelig.
## Existing
addvaultwizard.existing.instruction=Velg filen "masterkey.cryptomator" i det eksisterende hvelvet.
addvaultwizard.existing.chooseBtn=Velg…
addvaultwizard.existing.filePickerTitle=Velg hovednøkkelfil
## Success
addvaultwizard.success.nextStepsInstructions=Lagt til hvelvet "%s".\nDu må låse opp dette hvelvet for å få tilgang til eller legge til innhold. Alternativt kan du låse det opp på et hvilket som helst senere tidspunkt.
addvaultwizard.success.unlockNow=Lås opp nå
@@ -108,9 +106,8 @@ unlock.error.invalidMountPoint.existing=Monteringspunktet "%s" finnes enten alle
# Lock
## Force
lock.forced.heading=Låsingen mislyktes
lock.forced.message=Låsing "%s" ble blokkert av ventende operasjoner eller åpne filer. Du kan tvinge låsing av dette hvelvet, men avbrytelse av I/O kan føre til tap av ulagrede data.
lock.forced.confirmBtn=Tving låsing
lock.forced.retryBtn=Prøv igjen
## Failure
lock.fail.heading=Låsing av hvelvet mislyktes.
lock.fail.message=Hvelvet "%s" kunne ikke låses. Forsikre deg om at ulagrede arbeider lagres andre steder, og at viktige lese/skrive-operasjoner er fullført. For å lukke hvelvet må du avbryte Cryptomatorprosessen.
@@ -263,6 +260,7 @@ main.vaultDetail.missing.changeLocation=Endre hvelvplassering…
### Needs Migration
main.vaultDetail.migrateButton=Oppgrader hvelv
main.vaultDetail.migratePrompt=Hvelvet ditt må oppgraderes til et nytt format før du kan få tilgang til det
### Error
# Wrong File Alert
wrongFileAlert.title=Slik krypterer du filer

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Dit is de opslaglocatie van uw kluis.
addvault.new.readme.accessLocation.3=Alle bestanden die aan dit volume worden toegevoegd zullen worden versleuteld door Cryptomator. U kunt deze bestanden gebruiken zoals in elke andere map/schijf. Dit is alleen een ontsleutelde weergave van de inhoud, uw bestanden blijven ten alle tijden versleuteld op uw harde schijf.
addvault.new.readme.accessLocation.4=Voel je vrij om dit bestand te verwijderen.
## Existing
addvaultwizard.existing.instruction=Kies het "masterkey.cryptomator" bestand van uw bestaande kluis.
addvaultwizard.existing.instruction=Kies het "vault.cryptomator"-bestand van uw bestaande kluis. Indien er enkel een bestand genaamd "masterkey.cryptomator" anwezig is, kies deze dan in de plaats.
addvaultwizard.existing.chooseBtn=Kies…
addvaultwizard.existing.filePickerTitle=Selecteer het Masterkey-bestand
addvaultwizard.existing.filePickerTitle=Kies kluisbestand
## Success
addvaultwizard.success.nextStepsInstructions=Toegevoegde kluis "%s".\nOntgrendel deze kluis om toegang te krijgen tot of om inhoud toe te voegen. Optioneel kunt u deze op elk later tijdstip ontgrendelen.
addvaultwizard.success.unlockNow=Nu Ontgrendelen
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Koppelpunt "%s" bestaat reeds of de bove
# Lock
## Force
lock.forced.heading=De kluis kon niet op een gecontroleerde manier vergrendeld worden
lock.forced.heading=Vergrendelen mislukt
lock.forced.message=Het vergrendelen van "%s" werd voorkomen door lopende processen of geopende bestanden. U kunt de vergrendeling op deze kluis forceren, maar dit kan leiden tot het verlies van niet-opgeslagen gegevens.
lock.forced.confirmBtn=Forceer vergrendeling
lock.forced.retryBtn=Opnieuw proberen
lock.forced.forceBtn=Forceer vergrendeling
## Failure
lock.fail.heading=Kluis kan niet vergrendeld worden.
lock.fail.message=Kluis "%s" kan niet vergrendeld worden. Zorg ervoor dat u uw niet-opgeslagen werk ergens anders opslaat en belangrijke lees-/schrijfbewerkingen hebt voltooid. Om de kluis te sluiten, beëindigt u het Cryptomator-proces.
@@ -299,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Verander de locatie van de kluis…
### Needs Migration
main.vaultDetail.migrateButton=Kluis upgraden
main.vaultDetail.migratePrompt=Uw kluis moet worden bijgewerkt naar een nieuw formaat, voordat u deze kunt openen
### Error
main.vaultDetail.error.info=Er is een fout opgetreden bij het laden van de kluis vanaf de vaste schijf.
main.vaultDetail.error.reload=Herladen
main.vaultDetail.error.windowTitle=Fout bij laden van kluis
# Wrong File Alert
wrongFileAlert.title=Hoe bestanden te versleutelen

View File

@@ -65,9 +65,7 @@ addvault.new.readme.accessLocation.2=Dette er lagringsstaden til kvelven.
addvault.new.readme.accessLocation.3=Alle filer som er lagt til i dette volumet, blir kryptert av Cryptomator. Du kan jobba med dei som på alle andre einingar/mapper. Dette er berre ein dekryptert visning av innhaldet, filene dine blir verande kryptert på harddisken heile tida.
addvault.new.readme.accessLocation.4=Du kan fjerna denne fila viss ønskeleg.
## Existing
addvaultwizard.existing.instruction=Vel fila "masterkey.cryptomator" i den eksisterande kvelven.
addvaultwizard.existing.chooseBtn=Vel…
addvaultwizard.existing.filePickerTitle=Vel hovudnøkkelfil
## Success
addvaultwizard.success.nextStepsInstructions=Lagt til kvelven "%s".\nDu må låsa opp denne kvelven for å få tilgang til eller legga til innhald. Alternativt kan du låsa det opp på eit kva som helst seinare tidspunkt.
addvaultwizard.success.unlockNow=Lås opp no
@@ -208,6 +206,7 @@ main.vaultDetail.missing.recheck=Kontroller igjen
### Needs Migration
main.vaultDetail.migrateButton=Oppgrader kvelv
main.vaultDetail.migratePrompt=Kvelven din må oppgraderast til eit nytt format før du kan få tilgang til det
### Error
# Wrong File Alert
wrongFileAlert.title=Slik krypterer du filer

View File

@@ -66,9 +66,7 @@ addvault.new.readme.accessLocation.2=ਇਹ ਤੁਹਾਡੇ ਵਾਲਟ ਦ
addvault.new.readme.accessLocation.3=ਇਸ ਵਾਲੀਅਮ ਵਿੱਚ ਜੋੜੀ ਗਈ ਕੋਈ ਵੀ ਫਾਇਲ Cryptomator ਵਲੋਂ ਇੰਕ੍ਰਿਪਟ ਕੀਤੀ ਜਾਵੇਗੀ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਕਿਸੇ ਵੀ ਆਮ ਡਰਾਇਵ/ਫੋਲਡਰ ਵਾਂਗ ਵਰਤ ਸਕਦੇ ਹੋ। ਇਹ ਕੇਵਲ ਇਸ ਦੀ ਸਮੱਗਰੀ ਵੇਖਣ ਲਈ ਹੀ ਡਿ-ਕ੍ਰਿਪਟ ਹੁੰਦਾ ਹੈ, ਤੁਹਾਡੀਆਂ ਫਾਇਲਾਂ ਤੁਹਾਡੀ ਹਾਰਡ ਡਰਾਇਵ ਉੱਤੇ ਹਮੇਸ਼ਾਂ ਇੰਕ੍ਰਿਪਟ ਰਹਿੰਦੀਆਂ ਹਨ।
addvault.new.readme.accessLocation.4=ਇਹ ਫਾਇਲ ਕਿਸੇ ਵੀ ਵੇਲੇ ਹਟਾ ਸਕਦੇ ਹੋ।
## Existing
addvaultwizard.existing.instruction=ਆਪਣੇ ਮੌਜੂਦਾ ਵਾਲਟ ਦੀ "masterkey.cryptomator" ਫਾਇਲ ਚੁਣੋ।
addvaultwizard.existing.chooseBtn=…ਚੁਣੋ
addvaultwizard.existing.filePickerTitle=ਮਾਸਟਰ-ਕੁੰਜੀ ਫਾਇਲ ਚੁਣੋ
## Success
addvaultwizard.success.nextStepsInstructions="%s" ਵਾਲਟ ਜੋੜਿਆ ਗਿਆ।\nਇਸ ਵਾਲਟ ਲਈ ਪਹੁੰਚ ਜਾਂ ਸਮੱਗਰੀ ਜੋੜਨ ਵਾਸਤੇ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਅਣ-ਲਾਕ ਕਰਨਾ ਹੋਵੇਗਾ। ਬਦਲਵੇਂ ਰੂਪ ਵਿੱਚ ਤੁਸੀਂ ਕਿਸੇ ਵੀ ਵੇਲੇ ਇਸ ਨੂੰ ਅਣ-ਲਾਕ ਕਰ ਸਕਦੇ ਹੋ।
addvaultwizard.success.unlockNow=ਹੁਣੇ ਅਣ-ਲਾਕ ਕਰੋ
@@ -105,9 +103,7 @@ unlock.error.invalidMountPoint.existing="%s" ਮਾਊਂਟ ਪੁਆਇੰਟ
# Lock
## Force
lock.forced.heading=ਸਧਾਰਨ ਲਾਕ ਕਰਨਾ ਅਸਫ਼ਲ ਹੈ
lock.forced.message=ਬਾਕੀ ਰਹਿੰਦੀਆਂ ਕਾਰਵਾਈਆਂ ਜਾਂ ਫ਼ਾਈਲਾਂ ਖੁੱਲ੍ਹਣ ਕਰਕੇ "%s" ਲਾਕ ਕਰਨ ਨੂੰ ਰੋਕਿਆ ਗਿਆ ਹੈ। ਤੁਸੀਂ ਇਸ ਵਾਲਟ ਨੂੰ ਧੱਕੇ ਨਾਲ ਲਾਕ ਕਰ ਸਕਦੇ ਹੋ, ਪਰ I/O ਵਿੱਚ ਰੁਕਾਵਟ ਪਾਉਣ ਨਾਲ ਨਾ-ਸੰਭਾਲਿਆ ਡਾਟਾ ਖਤਮ ਹੋ ਜਾ ਸਕਦਾ ਹੈ।
lock.forced.confirmBtn=ਧੱਕੇ ਨਾਲ ਲਾਕ ਕਰੋ
## Failure
lock.fail.heading=ਵਾਲਟ ਲਾਕ ਕਰਨਾ ਅਸਫ਼ਲ ਹੈ।
lock.fail.message=ਵਾਲਟ "%s" ਨੂੰ ਲਾਕ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਨਾ-ਸੰਭਾਲੇ ਕੰਮ ਨੂੰ ਹੋਰ ਥਾਂ ਸੰਭਾਲ ਲਿਆ ਹੈ ਅਤੇ ਖਾਸ ਪੜ੍ਹਨ/ਲਿਖਣ ਕਾਰਵਾਈਆਂ ਪੂਰੀਆਂ ਹੋਈਆਂ ਹਨ। ਵਾਲਟ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ Cryptomator ਕਾਰਵਾਈ ਨੂੰ ਖਤਮ ਕਰੋ।
@@ -253,6 +249,7 @@ main.vaultDetail.missing.changeLocation=ਵਾਲਟ ਟਿਕਾਣੇ ਨੂ
### Needs Migration
main.vaultDetail.migrateButton=ਵਾਲਟ ਅੱਪਗਰੇਡ ਕਰੋ
main.vaultDetail.migratePrompt=ਤੁਹਾਡੇ ਵਾਲਟ ਨੂੰ ਵਰਤੇ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਨਵੇਂ ਫਾਰਮੈਟ ਲਈ ਅੱਪਗਰੇਡ ਕਰਨ ਦੀ ਲੋੜ ਹੈ
### Error
# Wrong File Alert
wrongFileAlert.title=ਫਾਇਲਾਂ ਇੰਕ੍ਰਿਪਟ ਕਿਵੇਂ ਹੁੰਦੀਆਂ ਹਨ

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Tu są przechowywane pliki Twojego sejfu.
addvault.new.readme.accessLocation.3=Wszystkie pliki dodane tutaj zostaną zaszyfrowane przez Cryptomator. Możesz tu wykonywać operacje jak na każdym innym dysku czy katalogu. To jest jedynie odszyfrowany podgląd Twoich plików, wszystkie pozostają cały czas zaszyfrowane na Twoim dysku twardym.
addvault.new.readme.accessLocation.4=Jeśli chcesz możesz spokojnie usunąć ten plik.
## Existing
addvaultwizard.existing.instruction=Wybierz plik "masterkey.cryptomator" w swoim istniejącym sejfie.
addvaultwizard.existing.instruction=Wybierz plik "vault.cryptomator" w istniejącym sejfie. Jeśli istnieje tylko plik "masterkey.cryptomator", wybierz ten plik.
addvaultwizard.existing.chooseBtn=Wybierz…
addvaultwizard.existing.filePickerTitle=Wybierz plik Masterkey
addvaultwizard.existing.filePickerTitle=Wybierz plik sejfu
## Success
addvaultwizard.success.nextStepsInstructions=Dodano sejf "%s".\nMusisz odblokować ten sejf, aby uzyskać dostęp lub dodać zawartość. Możesz go również odblokować kiedy indziej.
addvaultwizard.success.unlockNow=Odblokuj teraz
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Punkt montowania już istnieje lub braku
# Lock
## Force
lock.forced.heading=Blokada nie powiodła się
lock.forced.heading=Nieudana próba blokady
lock.forced.message=Zamknięcie "%s" zostało zablokowane przez oczekujące operacje lub otwarte pliki. Możesz wymusić zamknięcie tego sejfu, ale może to spowodować utratę niezapisanych danych.
lock.forced.confirmBtn=Wymuś zablokowanie
lock.forced.retryBtn=Ponów
lock.forced.forceBtn=Wymuś blokowanie
## Failure
lock.fail.heading=Błąd blokowania sejfu.
lock.fail.message=Nie można zablokować sejfu "%s". Zapisz wszelkie zmiany w bezpiecznym miejscu i upewnij się, że nie ma żadnych ważnych oczekujących operacji odczytu/zapisu. W celu zamknięcia sejfu ubij Cryptomator.
@@ -299,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Zmień lokalizację sejfu…
### Needs Migration
main.vaultDetail.migrateButton=Aktualizuj sejf
main.vaultDetail.migratePrompt=Twój sejf musi zostać zaktualizowany do nowego formatu, zanim będziesz mógł go używać
### Error
main.vaultDetail.error.info=Wystąpił błąd podczas ładowania sejfu z dysku.
main.vaultDetail.error.reload=Przeładuj
main.vaultDetail.error.windowTitle=Błąd ładowania sejfu
# Wrong File Alert
wrongFileAlert.title=Jak szyfrować pliki

View File

@@ -13,6 +13,11 @@ generic.button.done=Ok
generic.button.next=Seguinte
generic.button.print=Imprimir
## Error
generic.error.title=Erro %s
generic.error.instruction=Opa! Cryptomator não esperava que isto acontecesse. Pode procurar as soluções existentes para este erro. Ou se ainda não tiver sido relatado, sinta-se à vontade para o fazer.
generic.error.hyperlink.lookup=Procure este erro
generic.error.hyperlink.report=Relatar este erro
generic.error.technicalDetails=Detalhes:
# Defaults
defaults.vault.vaultName=Cofre
@@ -43,6 +48,9 @@ addvaultwizard.new.directoryPickerLabel=Outro Local
addvaultwizard.new.directoryPickerButton=Escolher…
addvaultwizard.new.directoryPickerTitle=Selecionar diretório
addvaultwizard.new.fileAlreadyExists=Aviso: Já existe um Ficheiro ou Diretório com o mesmo nome
addvaultwizard.new.locationDoesNotExist=Um diretório no caminho especificado não existe ou não pode ser acessado
addvaultwizard.new.locationIsNotWritable=Sem acesso de escrita no caminho especificado
addvaultwizard.new.locationIsOk=Localização adequada para o seu cofre
addvaultwizard.new.invalidName=Nome de cofre inválido. Por favor considere um nome de diretório regular.
### Password
addvaultwizard.new.createVaultBtn=Criar Cofre
@@ -53,6 +61,9 @@ addvaultwizard.new.generateRecoveryKeyChoice.no=Não obrigado, não vou perder a
addvault.new.readme.storageLocation.fileName=IMPORTANTE.rtf
addvault.new.readme.storageLocation.1=⚠ ARQUIVOS DO COFRE ⚠
addvault.new.readme.storageLocation.2=Este é o local de armazenamento do seu cofre.
addvault.new.readme.storageLocation.3=NÃO FAÇA
addvault.new.readme.storageLocation.4=- alterar quaisquer ficheiros dentro deste directório ou
addvault.new.readme.storageLocation.5=- colar quaisquer ficheiros para encriptação neste directório.
addvault.new.readme.storageLocation.6=Se deseja criptografar arquivos e visualizar o conteúdo do cofre, faça o seguinte:
addvault.new.readme.storageLocation.7=1. Adicione este cofre ao Cryptomator.
addvault.new.readme.storageLocation.8=2. Desbloqueie o cofre no Cryptomator.
@@ -60,10 +71,10 @@ addvault.new.readme.storageLocation.9=3. Abra o local de acesso clicando no bot
addvault.new.readme.storageLocation.10=Se precisar de ajuda, visite a documentação: %s
addvault.new.readme.accessLocation.fileName=BEM-VINDO.rtf
addvault.new.readme.accessLocation.1=🔐 VOLUME CRIPTOGRAFADO 🔐
addvault.new.readme.accessLocation.2=Este é o local de acesso do seu cofre.
addvault.new.readme.accessLocation.4=Sinta-se livre para remover este ficheiro.
## Existing
addvaultwizard.existing.chooseBtn=Escolher…
addvaultwizard.existing.filePickerTitle=Selecionar ficheiro MasterKey
## Success
addvaultwizard.success.nextStepsInstructions=Adicionado cofre "%s".\nPrecisa de destrancar este cofre para aceder ou adicionar conteúdo. Como alternativa, pode destrancá-lo a qualquer momento mais tarde.
addvaultwizard.success.unlockNow=Destrancar agora
@@ -93,7 +104,9 @@ unlock.success.rememberChoice=Lembrar escolha, não mostrar isto novamente
# Lock
## Force
lock.forced.confirmBtn=Forçar Bloqueio
lock.forced.heading=Cadeado falhou\nOr\nBloqueio falhou
lock.forced.retryBtn=Tente novamente
lock.forced.forceBtn=Forçar bloqueio
## Failure
# Migration
@@ -160,6 +173,7 @@ main.vaultDetail.missing.info=O Cryptomator não conseguiu encontrar um cofre ne
### Needs Migration
main.vaultDetail.migrateButton=Atualizar Cofre
main.vaultDetail.migratePrompt=O cofre precisa de ser atualizado para um novo formato, antes que possa acessá-lo
### Error
# Wrong File Alert
wrongFileAlert.title=Como criptografar arquivos

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Este é o local de acesso ao seu cofre.
addvault.new.readme.accessLocation.3=Todos os arquivos adicionados a este volume serão encriptados pelo Cryptomator. Você pode trabalhar nele tal como em qualquer outra unidade/pasta. Esta é apenas uma visão desencriptada do seu conteúdo, seus arquivos ficam encriptados em seu disco rígido o tempo todo.
addvault.new.readme.accessLocation.4=Sinta-se livre para apagar este arquivo.
## Existing
addvaultwizard.existing.instruction=Selecione o arquivo "masterkey.cryptomator" do seu cofre existente.
addvaultwizard.existing.instruction=Escolha o arquivo "vault.cryptomator" do seu cofre existente. Se existir apenas um arquivo chamado "masterkey.cryptomator", selecione outro.
addvaultwizard.existing.chooseBtn=Selecionar…
addvaultwizard.existing.filePickerTitle=Selecionar Arquivo Masterkey
addvaultwizard.existing.filePickerTitle=Selecionar arquivo do Cofre
## Success
addvaultwizard.success.nextStepsInstructions=Cofre "%s" adicionado.\nVocê precisa desbloquear este cofre para acessar ou adicionar conteúdo. Você também pode desbloqueá-lo a qualquer momento.
addvaultwizard.success.unlockNow=Desbloquear Agora
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Ponto de montagem/pasta já existe ou a
# Lock
## Force
lock.forced.heading=Bloqueio normal falhou
lock.forced.heading=Bloqueio falhou
lock.forced.message=Trancar "%s" foi bloqueado por operações pendentes ou arquivos abertos. Você pode forçar o bloqueio deste cofre, no entanto, a interrupção pode resultar em perda de dados não salvos.
lock.forced.confirmBtn=Forçar Bloqueio
lock.forced.retryBtn=Tentar Novamente
lock.forced.forceBtn=Forçar Bloqueio
## Failure
lock.fail.heading=O bloqueio do cofre falhou.
lock.fail.message=Cofre "%s" não pôde ser bloqueado. Certifique-se de que o trabalho não salvo está salvo em outro lugar e que operações de Leitura/Escrita importantes sejam concluídas. Para fechar o cofre, encerre o processo do Cryptomator.
@@ -299,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Alterar Localização do Cofre…
### Needs Migration
main.vaultDetail.migrateButton=Atualizar Cofre
main.vaultDetail.migratePrompt=Seu cofre precisa ser atualizado para um novo formato antes de poder acessá-lo
### Error
main.vaultDetail.error.info=Ocorreu um erro ao carregar o cofre do disco.
main.vaultDetail.error.reload=Recarregar
main.vaultDetail.error.windowTitle=Erro ao carregar cofre
# Wrong File Alert
wrongFileAlert.title=Como Encriptar Arquivos

View File

@@ -70,9 +70,7 @@ addvault.new.readme.accessLocation.2=Aceasta este locația de acces a seifului d
addvault.new.readme.accessLocation.3=Orice fișier adăugat la acest volum va fi criptat de către Cryptomator. Puteți lucra la el ca pe orice altă unitate/folder. Aceasta este doar o vizualizare decriptată a conținutului său, fișierele sunt criptate tot timpul pe hard disk-ul tău.
addvault.new.readme.accessLocation.4=Puteți să ștergeți acest fișier.
## Existing
addvaultwizard.existing.instruction=Alegeți fișierul "masterkey.cryptomator" din seiful dvs. existent.
addvaultwizard.existing.chooseBtn=Alege…
addvaultwizard.existing.filePickerTitle=Selectaţi fişierul Masterkey
## Success
addvaultwizard.success.nextStepsInstructions=Seiful "%s" a fost adăugat.\nTrebuie să deblocați acest seif pentru a accesa sau adăuga conținut. Alternativ, îl puteți debloca în orice moment ulterior.
addvaultwizard.success.unlockNow=Deblochează acum
@@ -112,9 +110,8 @@ unlock.error.invalidMountPoint.existing=Punctul de montare "%s" există deja sau
# Lock
## Force
lock.forced.heading=Blocarea elegantă a eșuat
lock.forced.message=Blocarea "%s" a fost blocată de operațiile în așteptare sau de fișierele deschise. Puteți forța blocarea acestui seif, dar întreruperea I/O poate duce la pierderea datelor nesalvate.
lock.forced.confirmBtn=Forțați blocarea
lock.forced.retryBtn=Încercați din nou
## Failure
lock.fail.heading=Blocarea seifului a eșuat.
lock.fail.message=Seiful "%s" nu a putut fi blocat. Asigurați-vă că lucrările nesalvate sunt salvate altundeva și că operațiunile importante de citire/scriere sunt terminate. Pentru a închide seiful omoară procesul Cryptomator.
@@ -294,6 +291,7 @@ main.vaultDetail.missing.changeLocation=Schimbați locația seifului…
### Needs Migration
main.vaultDetail.migrateButton=Îmbunătățește seiful
main.vaultDetail.migratePrompt=Înainte de a-l putea accesa, seiful dumneavoastră trebuie actualizat la format nou
### Error
# Wrong File Alert
wrongFileAlert.title=Cum să criptați fișierele

View File

@@ -14,8 +14,8 @@ generic.button.next=Далее
generic.button.print=Печать
## Error
generic.error.title=Ошибка: %s
generic.error.instruction=Произошла непредвиденная ситуация. Попробуйте найти уже имеющиеся решения этой ошибки. Если об этой ошибке ещё не сообщали, то сделайте это.
generic.error.hyperlink.lookup=Найти ошибку
generic.error.instruction=Ой! Криптоматор не ожидал, что так произойдет. Вы можете поискать существующие решения этой ошибки. Или если об этом еще не сообщалось, не стесняйтесь сделать это.
generic.error.hyperlink.lookup=Искать ошибку
generic.error.hyperlink.report=Сообщить об ошибке
generic.error.technicalDetails=Подробности:
@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Это место доступа к ваш
addvault.new.readme.accessLocation.3=Любые файлы, добавленные в этот том, будут зашифрованы Cryptomator. Вы можете работать с ним как с любым другим диском или папкой. Здесь отображается только расшифрованное содержимое тома, ваши файлы остаются зашифрованными на жёстком диске постоянно.
addvault.new.readme.accessLocation.4=Этот файл можно удалить.
## Existing
addvaultwizard.existing.instruction=Выберите файл "masterkey.cryptomator" от имеющегося хранилища.
addvaultwizard.existing.instruction=Выберите файл "vault.cryptomator" существующего хранилища. Если имеется только файл "masterkey.cryptomator", выберите его.
addvaultwizard.existing.chooseBtn=Выбрать…
addvaultwizard.existing.filePickerTitle=Выберите файл MasterKey
addvaultwizard.existing.filePickerTitle=Выберите файл хранилища
## Success
addvaultwizard.success.nextStepsInstructions=Добавлено хранилище "%s".\nДля добавления данных или доступа к содержимому нужно разблокировать хранилище. Его можно разблокировать и позже.
addvaultwizard.success.unlockNow=Разблокировать
@@ -95,7 +95,7 @@ changepassword.finalConfirmation=Я понимаю, что не смогу по
# Forget Password
forgetPassword.title=Не помню пароль
forgetPassword.information=Сохранённый пароль от этого хранилища будет удалён из вашей связки ключей.
forgetPassword.confirmBtn=Не помню пароль
forgetPassword.confirmBtn=Забыть сохранённый пароль
# Unlock
unlock.title=Разблокировать "%s"
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Точка монтирования %s
# Lock
## Force
lock.forced.heading=Ошибка мягкой блокировки
lock.forced.heading=Не удалось заблокировать
lock.forced.message=Блокировка "%s" невозможна из-за незавершённых операций или открытых файлов. Вы можете заблокировать это хранилище принудительно, однако прерывание ввода-вывода может привести к потере несохранённых данных.
lock.forced.confirmBtn=Принудительная блокировка
lock.forced.retryBtn=Повторить
lock.forced.forceBtn=Принудительная блокировка
## Failure
lock.fail.heading=Не удалось заблокировать хранилище.
lock.fail.message=Хранилище "%s" не удалось заблокировать. Убедитесь, что несохранённые данные сохранены в другом месте и завершены важные операции чтения/записи. Чтобы закрыть хранилище, завершите процесс Cryptomator.
@@ -299,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Изменить расположени
### Needs Migration
main.vaultDetail.migrateButton=Обновить хранилище
main.vaultDetail.migratePrompt=Чтобы получить доступ к хранилищу, его нужно преобразовать в новый формат
### Error
main.vaultDetail.error.info=Произошла ошибка при загрузке хранилища с диска.
main.vaultDetail.error.reload=Перезагрузить
main.vaultDetail.error.windowTitle=Ошибка загрузки хранилища
# Wrong File Alert
wrongFileAlert.title=Как шифровать файлы

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Toto je prístupové miesto vášho trezoru
addvault.new.readme.accessLocation.3=Všetky súbory pridané do tohto zväzku budú šifrované programom Cryptomator. Môžete na tom pracovať ako na akomkoľvek inom disku / priečinku. Toto je iba dešifrované zobrazenie jeho obsahu, vaše súbory zostávajú stále šifrované na pevnom disku.
addvault.new.readme.accessLocation.4=Tento súbor môžete kedykoľvek odstrániť.
## Existing
addvaultwizard.existing.instruction=Vyberte súbor „masterkey.cryptomator“ existujúceho trezoru.
addvaultwizard.existing.instruction=Zvoľte "vault.cryptomator" súbor Vášho existujúceho trezora. Ak existuje iba súbor s menom "masterkey.cryptomator", vyberte ho namiesto.
addvaultwizard.existing.chooseBtn=Vybrať…
addvaultwizard.existing.filePickerTitle=Zvoľte hlavný kľúčový súbor
addvaultwizard.existing.filePickerTitle=Zvoľte súbor trezora
## Success
addvaultwizard.success.nextStepsInstructions=Pridaný trezor "%s".\nAk chcete získať prístup alebo pridať obsah, musíte tento trezor odomknúť. Prípadne ju môžete odomknúť kedykoľvek neskôr.
addvaultwizard.success.unlockNow=Odomknúť teraz
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Bod pripojenia "%s" už existuje alebo c
# Lock
## Force
lock.forced.heading=Bežné uzamknutie zlyhalo
lock.forced.heading=Uzamknutie zlyhalo
lock.forced.message=Zamknutie "%s" bolo zablokované prebiehajúcimi operáciami alebo otvorenými súbormi. Smiete vynútiť uzamknutie tohto trezoru, ale prerušením I/O môže viesť k strate alebo neuloženiu dát.
lock.forced.confirmBtn=Vynútené uzamknutie
lock.forced.retryBtn=Skúsiť znovu
lock.forced.forceBtn=Vynútené uzamknutie
## Failure
lock.fail.heading=Uzatváranie trezoru zlyhalo.
lock.fail.message=Trezor "%s" nie je možné uzamknúť. Uistite sa že neuložená páca je uložená inde a dôležité Read/Write operácie sú ukončené. Ináč uzavretím trezoru, ukončíte proces Cryptomator-a.
@@ -299,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Zmeniť umiestnenie trezora…
### Needs Migration
main.vaultDetail.migrateButton=Aktualizácia trezora
main.vaultDetail.migratePrompt=Váš trezor vyžaduje aktualizáciu na nový formát predtým ako ho použijete
### Error
main.vaultDetail.error.info=Vyskytla sa chyba pri načítavaní trezora z disku.
main.vaultDetail.error.reload=Znovu načítať
main.vaultDetail.error.windowTitle=Chyba pri načítavaní trezora
# Wrong File Alert
wrongFileAlert.title=Ako zašifrovať súbory

View File

@@ -70,9 +70,7 @@ addvault.new.readme.accessLocation.2=Ово је приступна локаци
addvault.new.readme.accessLocation.3=Било која датотека додата у ову партицију биће шифровани са Cryptomator. Можете да радите у њој баш као у било којој другој партицији или директоријуму. Ово је само дешифрован преглед њеног садржаја, ваше датотеке остају шифроване на вашем тврдом диску све време.
addvault.new.readme.accessLocation.4=Слободно можете да обришете ову датотеку.
## Existing
addvaultwizard.existing.instruction=Изабери "masterkey.cryptomator" датотеку свог постојећег сефа.
addvaultwizard.existing.chooseBtn=Изабери…
addvaultwizard.existing.filePickerTitle=Изабери "Masterkey" датотеку
## Success
addvaultwizard.success.nextStepsInstructions=Додат је сеф "%s".\nМорате да откључате овај сеф да бисте приступили или додали садржај. Такође можете да га откључате касније у било ком тренутку.
addvaultwizard.success.unlockNow=Откључај сада
@@ -110,9 +108,7 @@ unlock.error.invalidMountPoint.existing=Тачка везивања "%s" већ
# Lock
## Force
lock.forced.heading=Нормално закључавање није успело
lock.forced.message=Закључавање "%s" је блокирано операцијама на чекању или отвореним датотекама. Можете присилно закључати овај сеф, међутим прекид "I/O" операција може резултирати губитком несачуваних података.
lock.forced.confirmBtn=Присилно закључај
## Failure
lock.fail.heading=Закључавање сефа није успело.
lock.fail.message=Сеф "%s" није могуће закључати. Будите сигурни да је несачувани рад сачуван негде другде и да су важне операције читања/писања завршене. Како бисте затворили сеф, зауставите Cryptomator процес у систему.
@@ -265,6 +261,7 @@ main.vaultDetail.missing.changeLocation=Промени локацију сефа
### Needs Migration
main.vaultDetail.migrateButton=Надогради сеф
main.vaultDetail.migratePrompt=Да бисте приступили вашем сефу, он мора бити надограђен на нови формат
### Error
# Wrong File Alert
wrongFileAlert.title=Како шифровати датотеке

View File

@@ -70,9 +70,7 @@ addvault.new.readme.accessLocation.2=Ovo je pristupna lokacija vašeg sefa.
addvault.new.readme.accessLocation.3=Bilo koja datoteka dodata u ovu particiju biće šifrovana sa Cryptomator. Možete da radite u njoj baš kao i u bilo kojoj drugoj particiji ili direktorijumu. Ovo je samo dešifrovan pregled njenog sadržaja, vaše datoteke ostaju šifrovane na vašem tvrdom disku sve vreme.
addvault.new.readme.accessLocation.4=Slobodno možete da obrišete ovu datoteku.
## Existing
addvaultwizard.existing.instruction=Izaberi "masterkey.cryptomator" datoteku svog postojećeg sefa.
addvaultwizard.existing.chooseBtn=Izaberi…
addvaultwizard.existing.filePickerTitle=Izaberi "Masterkey" datoteku
## Success
addvaultwizard.success.nextStepsInstructions=Dodat je sef "%s".\nMorate da otključate ovaj sef da biste pristupili ili dodali sadržaj. Takođe možete da ga otključate kasnije u bilo kom trenutku.
addvaultwizard.success.unlockNow=Otključaj sada
@@ -110,9 +108,7 @@ unlock.error.invalidMountPoint.existing=Tačka vezivanja "%s" već postoji ili j
# Lock
## Force
lock.forced.heading=Normalno zaključavanje nije uspelo
lock.forced.message=Zaključavanje "%s" je blokirano operacijama na čekanju ili otvorenim datotekama. Možete prisilno zaključati ovaj sef, međutim prekid "I/O" operacija može rezultirati gubitkom nesačuvanih podataka.
lock.forced.confirmBtn=Prisilno zaključaj
## Failure
lock.fail.heading=Zaključavanje sefa nije uspelo.
lock.fail.message=Sef "%s" nije moguće zaključati. Budite sigurni da je nesačuvani rad sačuvan negde drugde i da su važne operacije čitanja/pisanja završene. Kako biste zatvorili sef, zaustavite Cryptomator proces u sistemu.
@@ -225,6 +221,7 @@ main.vaultDetail.lockBtn=Zaključaj
### Missing
### Needs Migration
main.vaultDetail.migrateButton=Nadogradi sef
### Error
# Wrong File Alert

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Detta är ditt valvs åtkomstplats.
addvault.new.readme.accessLocation.3=Alla filer som läggs till denna volym kommer att krypteras av Cryptomator. Du kan arbeta med dem som i vilken annan enhet/mapp som helst. Detta är bara en dekrypterad vy av dess innehåll, dina filer förblir krypterade på din hårddisk hela tiden.
addvault.new.readme.accessLocation.4=Du kan ta bort denna fil.
## Existing
addvaultwizard.existing.instruction=Välj "masterkey.cryptomator" för ditt befintliga valv.
addvaultwizard.existing.instruction=Välj filen "vault.cryptomator" i ditt befintliga valv. Om det endast finns en fil som heter "masterkey.cryptomator", välj den istället.
addvaultwizard.existing.chooseBtn=Välj…
addvaultwizard.existing.filePickerTitle=Välj Masterkey-fil
addvaultwizard.existing.filePickerTitle=Välj valvfil
## Success
addvaultwizard.success.nextStepsInstructions=Lade till valv "%s".\nDu måste låsa upp detta valv för att komma åt eller lägga till innehåll. Du kan även låsa upp det vid ett senare tillfälle.
addvaultwizard.success.unlockNow=Lås upp nu
@@ -117,9 +117,8 @@ unlock.error.invalidMountPoint.existing=Monteringspunkten "%s" finns redan eller
# Lock
## Force
lock.forced.heading=Normal låsning misslyckades
lock.forced.message=Låsning av "%s" förhindras av pågående operationer eller öppna filer. Du kan tvinga låsning av detta valv, men det kan resultera i förlust av osparade data.
lock.forced.confirmBtn=Tvinga låsning
lock.forced.retryBtn=Försök igen
## Failure
lock.fail.heading=Låsning av valv misslyckades.
lock.fail.message=Valvet "%s" kunde inte låsas. Se till att osparat arbete sparas någon annanstans och viktiga läs- och skrivfunktioner är klara. För att stänga valvet, avsluta Cryptomator-processen.
@@ -299,6 +298,10 @@ main.vaultDetail.missing.changeLocation=Ändra valvets plats…
### Needs Migration
main.vaultDetail.migrateButton=Uppgradera valv
main.vaultDetail.migratePrompt=Ditt valv behöver uppgraderas till ett nytt format innan du kan använda det
### Error
main.vaultDetail.error.info=Ett fel inträffade när valvet skulle laddas in.
main.vaultDetail.error.reload=Ladda om
main.vaultDetail.error.windowTitle=Fel vid inläsning av valv
# Wrong File Alert
wrongFileAlert.title=Hur man krypterar filer

View File

@@ -0,0 +1,89 @@
# Locale Specific CSS files such as CJK, RTL,...
# Generics
## Button
## Error
# Defaults
# Tray Menu
# Add Vault Wizard
## Welcome
## New
### Name
### Location
### Password
### Information
## Existing
## Success
# Remove Vault
# Change Password
# Forget Password
# Unlock
##
## Success
## Failure
### Invalid Mount Point
# Lock
## Force
lock.forced.retryBtn=மீண்டும் முயற்சிக்கவும்
## Failure
# Migration
## Start
## Run
## Success
## Missing file system capabilities
## Impossible
# Health Check
## Start
## Start Failure
## Check Selection
## Detail view
## Fix Application
# Preferences
## General
## Volume
## Updates
## Contribution
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
# Vault Statistics
## Read
## Write
# Main Window
## Drag 'n' Drop
## Vault List
## Vault Detail
### Welcome
### Locked
### Unlocked
### Missing
### Needs Migration
### Error
# Wrong File Alert
# Vault Options
## General
## Mount
## Master Key
# Recovery Key
# New Password
# Quit

View File

@@ -0,0 +1,89 @@
# Locale Specific CSS files such as CJK, RTL,...
# Generics
## Button
## Error
# Defaults
# Tray Menu
# Add Vault Wizard
## Welcome
## New
### Name
### Location
### Password
### Information
## Existing
## Success
# Remove Vault
# Change Password
# Forget Password
# Unlock
##
## Success
## Failure
### Invalid Mount Point
# Lock
## Force
lock.forced.retryBtn=మళ్ళీ చేయండి
## Failure
# Migration
## Start
## Run
## Success
## Missing file system capabilities
## Impossible
# Health Check
## Start
## Start Failure
## Check Selection
## Detail view
## Fix Application
# Preferences
## General
## Volume
## Updates
## Contribution
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
# Vault Statistics
## Read
## Write
# Main Window
## Drag 'n' Drop
## Vault List
## Vault Detail
### Welcome
### Locked
### Unlocked
### Missing
### Needs Migration
### Error
# Wrong File Alert
# Vault Options
## General
## Mount
## Master Key
# Recovery Key
# New Password
# Quit

View File

@@ -70,6 +70,7 @@
### Unlocked
### Missing
### Needs Migration
### Error
# Wrong File Alert

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Burası kasanızın erişim konumudur.
addvault.new.readme.accessLocation.3=Bu birime eklenen tüm dosyalar Cryptomator tarafından şifrelenecektir. Başka herhangi bir sürücü/klasörde olduğu gibi üzerinde çalışabilirsiniz. Bu sadece içeriğinin şifresi çözülmüş bir görünümüdür, dosyalarınız her zaman sabit sürücünüzde şifrelenmiş halde kalır.
addvault.new.readme.accessLocation.4=Bu dosyayı silmeye çekinmeyin.
## Existing
addvaultwizard.existing.instruction=Varolan kasanızın "masterkey.cryptomator" dosyasını seçin.
addvaultwizard.existing.instruction=Mevcut kasanızın "vault.cryptomator" dosyasını seçin. Yalnızca "masterkey.cryptomator" adlı bir dosya varsa, bunun yerine onu seçin.
addvaultwizard.existing.chooseBtn=Seç…
addvaultwizard.existing.filePickerTitle=Masterkey Dosyasını Seç
addvaultwizard.existing.filePickerTitle=Kasa Dosyasını Seçin
## Success
addvaultwizard.success.nextStepsInstructions="%s" kasası eklendi.\nİçeriğe erişmek veya içerik eklemek için bu kasanın kilidini açmanız gerekir. Alternatif olarak, daha sonra herhangi bir zamanda kilidini açabilirsiniz.
addvaultwizard.success.unlockNow=Kilidi Şimdi Aç
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Bağlama noktası / klasör zaten var ve
# Lock
## Force
lock.forced.heading=Normal kilitleme başarısız oldu
lock.forced.heading=Kilitleme başarısız
lock.forced.message="%s" nin kilitlenmesi, bekleyen işlemler veya açık dosyalar tarafından engellendi. Bu kasayı zorla kilitleyebilirsiniz, ancak G/Ç'nin kesilmesi kaydedilmemiş verilerin kaybına neden olabilir.
lock.forced.confirmBtn=Kilitlemeyi Zorla
lock.forced.retryBtn=Yeniden dene
lock.forced.forceBtn=Kilitlemeye zorla
## Failure
lock.fail.heading=Kasa kilitlenemedi.
lock.fail.message="%s" kasası kilitlenemedi. Kaydedilmemiş çalışmanın başka bir yere kaydedildiğinden ve önemli Okuma / Yazma işlemlerinin tamamlandığından emin olun. Kasayı kapatmak için Cryptomator işlemini sonlandırın.
@@ -299,6 +300,10 @@ main.vaultDetail.missing.changeLocation=Kasa Yerini Değiştir…
### Needs Migration
main.vaultDetail.migrateButton=Kasayı Yükselt
main.vaultDetail.migratePrompt=Kasaya erişmeden önce kasanızın yeni bir formata yükseltilmesi gerekiyor
### Error
main.vaultDetail.error.info=Kasa diskten yüklenirken bir hata oluştu.
main.vaultDetail.error.reload=Tekrar yükle
main.vaultDetail.error.windowTitle=Kasa yüklenirken hata oluştu
# Wrong File Alert
wrongFileAlert.title=Dosyalar Nasıl Şifrelenir

View File

@@ -0,0 +1,136 @@
# Locale Specific CSS files such as CJK, RTL,...
# Generics
## Button
generic.button.apply=Застосувати
generic.button.back=Назад
generic.button.cancel=Відмінити
generic.button.change=Змінити
generic.button.close=Закрити
generic.button.copy=Копіювати
generic.button.copied=Скопійовано!
generic.button.done=Готово
generic.button.next=Далі
generic.button.print=Друкувати
## Error
generic.error.title=Помилка %s
generic.error.instruction=Ой! Cryptomator не очікував, що таке трапиться. Ви можете знайти існуючі рішення цієї помилки. Або, якщо про це ще не повідомили, то не соромтеся зробити це.
generic.error.hyperlink.lookup=Дізнатися більше про цю помилку
generic.error.hyperlink.report=Повідомити про помилку
generic.error.technicalDetails=Докладно:
# Defaults
defaults.vault.vaultName=Сховище
# Tray Menu
traymenu.showMainWindow=Показати
traymenu.showPreferencesWindow=Властивості
traymenu.lockAllVaults=Заблокувати все
traymenu.quitApplication=Вийти
traymenu.vault.unlock=Розблокувати
traymenu.vault.lock=Заблокувати
traymenu.vault.reveal=Показати
# Add Vault Wizard
addvaultwizard.title=Додати сховище
## Welcome
addvaultwizard.welcome.newButton=Створити нове сховище
addvaultwizard.welcome.existingButton=Відкрити існуюче сховище
## New
### Name
addvaultwizard.new.nameInstruction=Оберіть назву для сховища
addvaultwizard.new.namePrompt=Назва сховища
### Location
addvaultwizard.new.locationInstruction=Де Cryptomator має зберігати зашифровані файли вашого сховища?
addvaultwizard.new.locationLabel=Розташування сховища
addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Власне розташування
addvaultwizard.new.directoryPickerButton=Обрати…
addvaultwizard.new.directoryPickerTitle=Оберіть директорію
addvaultwizard.new.fileAlreadyExists=Файл чи папка з іменем сховища вже існує
### Password
### Information
## Existing
addvaultwizard.existing.chooseBtn=Обрати…
## Success
# Remove Vault
# Change Password
# Forget Password
# Unlock
unlock.unlockBtn=Розблокувати
##
## Success
## Failure
### Invalid Mount Point
# Lock
## Force
lock.forced.heading=Помилка блокування
lock.forced.retryBtn=Повторити
lock.forced.forceBtn=Примусове блокування
## Failure
# Migration
## Start
## Run
## Success
## Missing file system capabilities
## Impossible
# Health Check
## Start
## Start Failure
## Check Selection
## Detail view
## Fix Application
# Preferences
preferences.title=Властивості
## General
## Volume
## Updates
## Contribution
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
# Vault Statistics
## Read
## Write
# Main Window
main.closeBtn.tooltip=Закрити
main.preferencesBtn.tooltip=Властивості
## Drag 'n' Drop
## Vault List
main.vaultlist.contextMenu.lock=Заблокувати
main.vaultlist.addVaultBtn=Додати сховище
## Vault Detail
### Welcome
### Locked
### Unlocked
main.vaultDetail.lockBtn=Заблокувати
### Missing
### Needs Migration
### Error
# Wrong File Alert
# Vault Options
## General
vaultOptions.general.vaultName=Назва сховища
## Mount
vaultOptions.mount.mountPoint.directoryPickerButton=Обрати…
## Master Key
# Recovery Key
# New Password
# Quit

View File

@@ -75,17 +75,17 @@ addvault.new.readme.accessLocation.2=这是您的保险库的访问路径。
addvault.new.readme.accessLocation.3=任何添加到此卷的文件都将被 Cryptomator 加密。您可以像在一般磁盘/文件夹上那样操作它。 这只是对其内容的解密查看,您的文件会在硬盘上一直保持加密。
addvault.new.readme.accessLocation.4=您可以随时删除此文件。
## Existing
addvaultwizard.existing.instruction=请选择现有保险库中的 "masterkey.cryptomator" 文件
addvaultwizard.existing.instruction=请选择现有保险库中的“vault.cryptomator”文件。如果只有一个名为“masterkey.cryptomator”的文件,则改为选择该文件。
addvaultwizard.existing.chooseBtn=选择...
addvaultwizard.existing.filePickerTitle=选择 Masterkey 文件
addvaultwizard.existing.filePickerTitle=选择保险库对应文件
## Success
addvaultwizard.success.nextStepsInstructions=已添加保险库 "%s"\n您需要先解锁此保险库才能访问或添加内容。或者您可以在稍后任何时候再解锁它
addvaultwizard.success.unlockNow=立即解锁
# Remove Vault
removeVault.title=除保险库
removeVault.title=除保险库
removeVault.information=这将只会使 Cryptomator 忘记这个保险库,您可以稍后再添加它。任何加密的文件不会从您的硬盘中删除。
removeVault.confirmBtn=除保险库
removeVault.confirmBtn=除保险库
# Change Password
changepassword.title=更改密码
@@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=挂载点 "%s" 已存在或缺少父文
# Lock
## Force
lock.forced.heading=常规锁定失败
lock.forced.heading=锁定失败
lock.forced.message=锁定 "%s" 被挂起的操作或使用中的文件中断。您可以强制锁定此保险库,不过请注意打断 I/O 可能导致未保存的数据丢失
lock.forced.confirmBtn=强制锁定
lock.forced.retryBtn=重试
lock.forced.forceBtn=强制锁定
## Failure
lock.fail.heading=锁定保险库失败
lock.fail.message=保险库 "%s" 无法锁定。请确保在其他地方保存未保存的工作,以及重要的 "读/写" 操作已完成。为了顺利关闭保险库,请查杀 Cryptomator 进程
@@ -188,8 +189,8 @@ preferences.title=首选项
preferences.general=常规​​​​​
preferences.general.theme=界面外观
preferences.general.theme.automatic=自动
preferences.general.theme.light=
preferences.general.theme.dark=
preferences.general.theme.light=
preferences.general.theme.dark=
preferences.general.unlockThemes=解锁暗黑模式
preferences.general.showMinimizeButton=显示最小化按钮
preferences.general.showTrayIcon=显示托盘图标 (需重启)
@@ -264,7 +265,7 @@ main.dropZone.dropVault=添加此保险库
main.dropZone.unknownDragboardContent=如果您想要添加一个保险库,将其拖动到此窗口
## Vault List
main.vaultlist.emptyList.onboardingInstruction=点击此处添加一个保险库
main.vaultlist.contextMenu.remove=除…
main.vaultlist.contextMenu.remove=除…
main.vaultlist.contextMenu.lock=锁定
main.vaultlist.contextMenu.unlock=解锁…
main.vaultlist.contextMenu.unlockNow=立即解锁
@@ -298,7 +299,11 @@ main.vaultDetail.missing.remove=从保险库列表中移除...
main.vaultDetail.missing.changeLocation=更改保险库位置…
### Needs Migration
main.vaultDetail.migrateButton=升级保险库
main.vaultDetail.migratePrompt=您的保险库需要升级到新格式,然后才能访问
main.vaultDetail.migratePrompt=您的保险库需要升级到新格式后才能访问
### Error
main.vaultDetail.error.info=从磁盘加载保险库时发生错误
main.vaultDetail.error.reload=重新加载
main.vaultDetail.error.windowTitle=加载保险库时出错
# Wrong File Alert
wrongFileAlert.title=如何加密文件

View File

@@ -13,6 +13,11 @@ generic.button.done=完成
generic.button.next=繼續
generic.button.print=列印
## Error
generic.error.title=錯誤:%s
generic.error.instruction=糟糕Cryptomator 發生了錯誤。您可以嘗試查找該錯誤的現有解決方案,如果是新錯誤,請隨時向我們報告。
generic.error.hyperlink.lookup=查找該錯誤
generic.error.hyperlink.report=報告這個錯誤
generic.error.technicalDetails=詳情:
# Defaults
defaults.vault.vaultName=加密檔案庫
@@ -70,9 +75,9 @@ addvault.new.readme.accessLocation.2=這是您加密檔案庫的存取位置。
addvault.new.readme.accessLocation.3=所有被加進這個磁區的檔案都將被 Cryptomator 加密。你可以把它當做磁碟或資料夾使用。這裡式顯示出解密後內容,您的檔案總是以被加密的狀態儲存在磁碟中。
addvault.new.readme.accessLocation.4=您可以放心移除這個檔案。
## Existing
addvaultwizard.existing.instruction=請選取您現有加密檔案庫的 "masterkey.cryptomator" 檔案。
addvaultwizard.existing.instruction=請選擇現有保險庫中名為「vault.cryptomator」的檔案。如果只有一個名為「masterkey.cryptomator」的檔案,則選擇該檔案。
addvaultwizard.existing.chooseBtn=選取
addvaultwizard.existing.filePickerTitle=選擇主金鑰檔案
addvaultwizard.existing.filePickerTitle=選擇保險庫對應檔案
## Success
addvaultwizard.success.nextStepsInstructions=已加入加密檔案庫 "%s"。您需要將這個加密檔案庫解鎖以存取內容,或是您也可以之後再解鎖。
addvaultwizard.success.unlockNow=立即解鎖
@@ -112,9 +117,8 @@ unlock.error.invalidMountPoint.existing=掛載點已經存在或上層資料夾
# Lock
## Force
lock.forced.heading=正常鎖定失敗
lock.forced.message=仍有未完成的操作或開啟中的檔案以致無法鎖定 "%s"。您可以強制鎖定這個加密檔案庫,不過中斷讀寫可能會導致資料遺失或未被儲存。
lock.forced.confirmBtn=強制鎖定
lock.forced.retryBtn=重試
## Failure
lock.fail.heading=鎖定加密檔案庫失敗。
lock.fail.message=加密檔案庫 "%s" 無法被鎖定。請確保未存檔的工作已儲存在別的地方以及重要的讀寫工作都已經完成。請強制結束 Cryptomator 以關閉加密檔案庫。
@@ -294,6 +298,10 @@ main.vaultDetail.missing.changeLocation=更改加密檔案庫位置…
### Needs Migration
main.vaultDetail.migrateButton=升級加密檔案庫
main.vaultDetail.migratePrompt=您必須先更新加密檔案庫才能存取內容
### Error
main.vaultDetail.error.info=從磁盤加載保管庫時發生錯誤。
main.vaultDetail.error.reload=重新載入
main.vaultDetail.error.windowTitle=載入加密檔案庫時出錯
# Wrong File Alert
wrongFileAlert.title=如何加密檔案

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 359 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 733 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 749 B

View File

@@ -13,11 +13,10 @@ along with this program. If not, see http://www.gnu.org/licenses/.
Cryptomator uses 40 third-party dependencies under the following licenses:
Apache License v2.0:
- jffi (com.github.jnr:jffi:1.2.23 - http://github.com/jnr/jffi)
- jffi (com.github.jnr:jffi:1.3.5 - http://github.com/jnr/jffi)
- jnr-a64asm (com.github.jnr:jnr-a64asm:1.0.0 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-a64asm)
- jnr-constants (com.github.jnr:jnr-constants:0.9.15 - http://github.com/jnr/jnr-constants)
- jnr-ffi (com.github.jnr:jnr-ffi:2.1.12 - http://github.com/jnr/jnr-ffi)
- Gson (com.google.code.gson:gson:2.8.8 - https://github.com/google/gson/gson)
- jnr-constants (com.github.jnr:jnr-constants:0.10.2 - http://github.com/jnr/jnr-constants)
- jnr-ffi (com.github.jnr:jnr-ffi:2.2.7 - http://github.com/jnr/jnr-ffi)
- Dagger (com.google.dagger:dagger:2.39 - https://github.com/google/dagger)
- Guava InternalFutureFailureAccess and InternalFutures (com.google.guava:failureaccess:1.0.1 - https://github.com/google/guava/failureaccess)
- Guava: Google Core Libraries for Java (com.google.guava:guava:31.0-jre - https://github.com/google/guava)
@@ -34,14 +33,15 @@ Cryptomator uses 40 third-party dependencies under the following licenses:
- Jetty :: Utilities (org.eclipse.jetty:jetty-util:10.0.6 - https://eclipse.org/jetty/jetty-util)
- Jetty :: Servlet API and Schemas for JPMS and OSGi (org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.6 - https://eclipse.org/jetty/jetty-servlet-api)
Apache-2.0:
- Gson (com.google.code.gson:gson:2.8.9 - https://github.com/google/gson/gson)
- Java Native Access (net.java.dev.jna:jna:5.9.0 - https://github.com/java-native-access/jna)
- Java Native Access Platform (net.java.dev.jna:jna-platform:5.9.0 - https://github.com/java-native-access/jna)
BSD:
- asm (org.ow2.asm:asm:7.1 - http://asm.ow2.org/)
- asm-analysis (org.ow2.asm:asm-analysis:7.1 - http://asm.ow2.org/)
- asm-commons (org.ow2.asm:asm-commons:7.1 - http://asm.ow2.org/)
- asm-tree (org.ow2.asm:asm-tree:7.1 - http://asm.ow2.org/)
- asm-util (org.ow2.asm:asm-util:7.1 - http://asm.ow2.org/)
BSD-3-Clause:
- asm (org.ow2.asm:asm:9.2 - http://asm.ow2.io/)
- asm-analysis (org.ow2.asm:asm-analysis:9.2 - http://asm.ow2.io/)
- asm-commons (org.ow2.asm:asm-commons:9.2 - http://asm.ow2.io/)
- asm-tree (org.ow2.asm:asm-tree:9.2 - http://asm.ow2.io/)
- asm-util (org.ow2.asm:asm-util:9.2 - http://asm.ow2.io/)
Eclipse Public License - Version 1.0:
- Jetty :: Servlet API and Schemas for JPMS and OSGi (org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.6 - https://eclipse.org/jetty/jetty-servlet-api)
Eclipse Public License - Version 2.0:
@@ -52,29 +52,29 @@ Cryptomator uses 40 third-party dependencies under the following licenses:
- Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:10.0.6 - https://eclipse.org/jetty/jetty-servlet)
- Jetty :: Utilities (org.eclipse.jetty:jetty-util:10.0.6 - https://eclipse.org/jetty/jetty-util)
Eclipse Public License - v 1.0:
- Logback Classic Module (ch.qos.logback:logback-classic:1.2.6 - http://logback.qos.ch/logback-classic)
- Logback Core Module (ch.qos.logback:logback-core:1.2.6 - http://logback.qos.ch/logback-core)
- Logback Classic Module (ch.qos.logback:logback-classic:1.2.7 - http://logback.qos.ch/logback-classic)
- Logback Core Module (ch.qos.logback:logback-core:1.2.7 - http://logback.qos.ch/logback-core)
Eclipse Public License - v 2.0:
- jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
- jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
GNU Lesser General Public License:
- Logback Classic Module (ch.qos.logback:logback-classic:1.2.6 - http://logback.qos.ch/logback-classic)
- Logback Core Module (ch.qos.logback:logback-core:1.2.6 - http://logback.qos.ch/logback-core)
- Logback Classic Module (ch.qos.logback:logback-classic:1.2.7 - http://logback.qos.ch/logback-classic)
- Logback Core Module (ch.qos.logback:logback-core:1.2.7 - http://logback.qos.ch/logback-core)
GPLv2:
- jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
- jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
GPLv2+CE:
- javafx-base (org.openjfx:javafx-base:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-base/)
- javafx-controls (org.openjfx:javafx-controls:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-controls/)
- javafx-fxml (org.openjfx:javafx-fxml:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-fxml/)
- javafx-graphics (org.openjfx:javafx-graphics:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-graphics/)
- javafx-base (org.openjfx:javafx-base:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-base/)
- javafx-controls (org.openjfx:javafx-controls:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-controls/)
- javafx-fxml (org.openjfx:javafx-fxml:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-fxml/)
- javafx-graphics (org.openjfx:javafx-graphics:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-graphics/)
LGPL 2.1:
- jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
- jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
LGPL-2.1-or-later:
- Java Native Access (net.java.dev.jna:jna:5.9.0 - https://github.com/java-native-access/jna)
- Java Native Access Platform (net.java.dev.jna:jna-platform:5.9.0 - https://github.com/java-native-access/jna)
MIT License:
- java jwt (com.auth0:java-jwt:3.18.2 - https://github.com/auth0/java-jwt)
- jnr-x86asm (com.github.jnr:jnr-x86asm:1.0.2 - http://github.com/jnr/jnr-x86asm)
- jnr-fuse (com.github.serceman:jnr-fuse:0.5.5 - https://github.com/SerCeMan/jnr-fuse)
- jnr-fuse (com.github.serceman:jnr-fuse:0.5.7 - https://github.com/SerCeMan/jnr-fuse)
- zxcvbn4j (com.nulab-inc:zxcvbn:1.5.2 - https://github.com/nulab/zxcvbn4j)
- SLF4J API Module (org.slf4j:slf4j-api:1.7.32 - http://www.slf4j.org)
The BSD 2-Clause License:

View File

@@ -1,59 +1,119 @@
package org.cryptomator.common;
import com.google.common.base.CharMatcher;
import com.google.common.base.Splitter;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.converter.ConvertWith;
import org.junit.jupiter.params.converter.SimpleArgumentConverter;
import org.junit.jupiter.params.provider.CsvSource;
import org.mockito.Mockito;
public class ErrorCodeTest {
private static ErrorCode codeCaughtFrom(RunnableThrowingException<RuntimeException> runnable) {
try {
runnable.run();
throw new IllegalStateException("should not reach this point");
} catch (RuntimeException e) {
return ErrorCode.of(e);
}
}
private final StackTraceElement foo = new StackTraceElement("ErrorCodeTest", "foo", null, 0);
private final StackTraceElement bar = new StackTraceElement("ErrorCodeTest", "bar", null, 0);
private final StackTraceElement baz = new StackTraceElement("ErrorCodeTest", "baz", null, 0);
private final Exception fooException = Mockito.mock(NullPointerException.class, "fooException");
@Test
@DisplayName("same exception leads to same error code")
public void testDifferentErrorCodes() {
var code1 = codeCaughtFrom(this::throwNpe);
var code2 = codeCaughtFrom(this::throwNpe);
public void testDeterministicErrorCode() {
Mockito.doReturn(new StackTraceElement[]{foo, bar, baz}).when(fooException).getStackTrace();
var code1 = ErrorCode.of(fooException);
var code2 = ErrorCode.of(fooException);
Assertions.assertEquals(code1.toString(), code2.toString());
}
private void throwNpe() {
throwException(new NullPointerException());
@Test
@DisplayName("three error code segments change independently")
public void testErrorCodeSegments() {
Exception fooBarException = Mockito.mock(IndexOutOfBoundsException.class, "fooBarException");
Mockito.doReturn(new StackTraceElement[]{foo, foo, foo}).when(fooBarException).getStackTrace();
Mockito.doReturn(fooException).when(fooBarException).getCause();
Mockito.doReturn(new StackTraceElement[]{bar, bar, bar, foo, foo, foo}).when(fooException).getStackTrace();
var code = ErrorCode.of(fooBarException);
Assertions.assertNotEquals(code.throwableCode(), code.rootCauseCode());
Assertions.assertNotEquals(code.rootCauseCode(), code.methodCode());
}
private void throwException(RuntimeException e) throws RuntimeException {
throw e;
@DisplayName("commonSuffixLength()")
@ParameterizedTest
@CsvSource({"1 2 3, 1 2 3, 3", "1 2 3, 0 2 3, 2", "1 2 3 4, 3 4, 2", "1 2 3 4, 5 6, 0", "1 2 3 4 5 6,, 0",})
public void commonSuffixLength1(@ConvertWith(IntegerArrayConverter.class) Integer[] set, @ConvertWith(IntegerArrayConverter.class) Integer[] subset, int expected) {
var result = ErrorCode.commonSuffixLength(set, subset);
Assertions.assertEquals(expected, result);
}
@DisplayName("when different cause but same root cause")
@DisplayName("commonSuffixLength() with too short array")
@ParameterizedTest
@CsvSource({"1 2, 3 4 5 6", ",1 2 3 4 5 6",})
public void commonSuffixLength2(@ConvertWith(IntegerArrayConverter.class) Integer[] set, @ConvertWith(IntegerArrayConverter.class) Integer[] subset) {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
ErrorCode.commonSuffixLength(set, subset);
});
}
@Test
@DisplayName("countTopmostFrames() with partially overlapping suffix")
public void testCountTopmostFrames1() {
var allFrames = new StackTraceElement[]{foo, bar, baz, bar, foo};
var bottomFrames = new StackTraceElement[]{baz, bar, foo};
int result = ErrorCode.countTopmostFrames(allFrames, bottomFrames);
Assertions.assertEquals(2, result);
}
@Test
@DisplayName("countTopmostFrames() without overlapping suffix")
public void testCountTopmostFrames2() {
var allFrames = new StackTraceElement[]{foo, foo, foo};
var bottomFrames = new StackTraceElement[]{bar, bar, bar};
int result = ErrorCode.countTopmostFrames(allFrames, bottomFrames);
Assertions.assertEquals(3, result);
}
@Test
@DisplayName("countUniqueFrames() fully overlapping")
public void testCountUniqueFrames3() {
var allFrames = new StackTraceElement[]{foo, bar, baz};
var bottomFrames = new StackTraceElement[]{foo, bar, baz};
int result = ErrorCode.countTopmostFrames(allFrames, bottomFrames);
Assertions.assertEquals(0, result);
}
@DisplayName("when different exception with same root cause")
@Nested
public class SameRootCauseDifferentCause {
public class DifferentExceptionWithSameRootCause {
private final ErrorCode code1 = codeCaughtFrom(this::foo);
private final ErrorCode code2 = codeCaughtFrom(this::bar);
private final Exception fooBarException = Mockito.mock(IllegalArgumentException.class, "fooBarException");
private final Exception fooBazException = Mockito.mock(IndexOutOfBoundsException.class, "fooBazException");
private void foo() throws IllegalArgumentException {
try {
throwNpe();
} catch (NullPointerException e) {
throw new IllegalArgumentException(e);
}
}
private ErrorCode code1;
private ErrorCode code2;
private void bar() throws IllegalStateException {
try {
throwNpe();
} catch (NullPointerException e) {
throw new IllegalStateException(e);
}
@BeforeEach
public void setup() {
Mockito.doReturn(new StackTraceElement[]{baz, bar, foo}).when(fooException).getStackTrace();
Mockito.doReturn(new StackTraceElement[]{foo}).when(fooBarException).getStackTrace();
Mockito.doReturn(new StackTraceElement[]{foo}).when(fooBazException).getStackTrace();
Mockito.doReturn(fooException).when(fooBarException).getCause();
Mockito.doReturn(fooException).when(fooBazException).getCause();
this.code1 = ErrorCode.of(fooBarException);
this.code2 = ErrorCode.of(fooBazException);
}
@Test
@@ -82,23 +142,21 @@ public class ErrorCodeTest {
}
@DisplayName("when same cause but different call stack")
@DisplayName("when same exception with different call stacks")
@Nested
public class SameCauseDifferentCallStack {
public class SameExceptionDifferentCallStack {
private final ErrorCode code1 = codeCaughtFrom(this::foo);
private final ErrorCode code2 = codeCaughtFrom(this::bar);
private final Exception barException = Mockito.mock(NullPointerException.class, "barException");
private void foo() throws NullPointerException {
try {
throwNpe();
} catch (NullPointerException e) {
throw new IllegalArgumentException(e);
}
}
private ErrorCode code1;
private ErrorCode code2;
private void bar() throws NullPointerException {
foo();
@BeforeEach
public void setup() {
Mockito.doReturn(new StackTraceElement[]{foo, bar, baz}).when(fooException).getStackTrace();
Mockito.doReturn(new StackTraceElement[]{foo, baz, bar}).when(barException).getStackTrace();
this.code1 = ErrorCode.of(fooException);
this.code2 = ErrorCode.of(barException);
}
@Test
@@ -114,9 +172,9 @@ public class ErrorCodeTest {
}
@Test
@DisplayName("rootCauseCodes are equal")
@DisplayName("rootCauseCodes are different")
public void testSameRootCauseCodes() {
Assertions.assertEquals(code1.rootCauseCode(), code2.rootCauseCode());
Assertions.assertNotEquals(code1.rootCauseCode(), code2.rootCauseCode());
}
@Test
@@ -127,4 +185,19 @@ public class ErrorCodeTest {
}
public static class IntegerArrayConverter extends SimpleArgumentConverter {
@Override
protected Integer[] convert(Object source, Class<?> targetType) {
if (source == null) {
return new Integer[0];
} else if (source instanceof String s && Integer[].class.isAssignableFrom(targetType)) {
return Splitter.on(CharMatcher.inRange('0', '9').negate()).splitToStream(s).map(Integer::valueOf).toArray(Integer[]::new);
} else {
throw new IllegalArgumentException("Conversion from " + source.getClass() + " to " + targetType + " not supported.");
}
}
}
}