mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-16 01:31:28 +00:00
Compare commits
139 Commits
ci/windows
...
1.19.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
390bdc33e0 | ||
|
|
2284d1fcee | ||
|
|
62a439e10e | ||
|
|
ddad663489 | ||
|
|
f08e7d9b92 | ||
|
|
6c2865a09d | ||
|
|
4be327608a | ||
|
|
929ef37ded | ||
|
|
6fce1807f0 | ||
|
|
c1d72650cc | ||
|
|
dab368e44b | ||
|
|
7548174e4f | ||
|
|
b513060744 | ||
|
|
311a9ef70b | ||
|
|
7331144f9d | ||
|
|
d576b36f7b | ||
|
|
7a6340aac6 | ||
|
|
6b82abcd80 | ||
|
|
97bde05422 | ||
|
|
3bc50eee47 | ||
|
|
b95a220de7 | ||
|
|
2896e18429 | ||
|
|
29db91f976 | ||
|
|
1e3dfe3de1 | ||
|
|
dcb1f5e80f | ||
|
|
5c75eeab27 | ||
|
|
8e4bff8c19 | ||
|
|
e066f155b2 | ||
|
|
c3c7a23ccd | ||
|
|
c816411644 | ||
|
|
f752490624 | ||
|
|
d196b66b4e | ||
|
|
d803a1d71e | ||
|
|
c75430cde2 | ||
|
|
f44c3531c7 | ||
|
|
596829bc77 | ||
|
|
096aeb0c54 | ||
|
|
1a12684557 | ||
|
|
998664acc3 | ||
|
|
c52b3fc4ad | ||
|
|
1fde3650ca | ||
|
|
57614f59e4 | ||
|
|
a95883f98b | ||
|
|
6cf18c33a1 | ||
|
|
232e6fbf71 | ||
|
|
d15731d5a4 | ||
|
|
45d7421e4f | ||
|
|
4d0aabfe6e | ||
|
|
db0e266fde | ||
|
|
6281561ab4 | ||
|
|
b981f0dc19 | ||
|
|
bc41429982 | ||
|
|
a31621cfde | ||
|
|
aa68224d63 | ||
|
|
b8413a21a3 | ||
|
|
af59196f19 | ||
|
|
3a58f560fc | ||
|
|
a2cca0b624 | ||
|
|
0c4ba94f10 | ||
|
|
0f8b6a8f51 | ||
|
|
8ca6946fe6 | ||
|
|
e583b70931 | ||
|
|
6f6d0d8771 | ||
|
|
9d3d67b605 | ||
|
|
8da27e36d6 | ||
|
|
1123fa28a3 | ||
|
|
be3ecc536a | ||
|
|
94c8dd911b | ||
|
|
7e888b0e3b | ||
|
|
a066afe37d | ||
|
|
21c8cbf709 | ||
|
|
ea236d45a3 | ||
|
|
fab5ac3726 | ||
|
|
57666a620c | ||
|
|
e49fe23b35 | ||
|
|
254a7696c8 | ||
|
|
62bd43ef9b | ||
|
|
b73510ec0f | ||
|
|
3fba62ef72 | ||
|
|
7daca70a15 | ||
|
|
90228a1d5c | ||
|
|
4090413290 | ||
|
|
29bfbdc524 | ||
|
|
688090095e | ||
|
|
98db9649c3 | ||
|
|
7a4c8f113e | ||
|
|
50f6a87788 | ||
|
|
d601088948 | ||
|
|
4d62f2303d | ||
|
|
792734b486 | ||
|
|
f884861373 | ||
|
|
da3c5e901f | ||
|
|
f7ccc326de | ||
|
|
246eb19c3c | ||
|
|
c073b26d8f | ||
|
|
227a3258ec | ||
|
|
3279df68c7 | ||
|
|
bf6598302b | ||
|
|
dccb4ef072 | ||
|
|
cbae2413ae | ||
|
|
113ab66a49 | ||
|
|
34eb336e5f | ||
|
|
2cab0c59a1 | ||
|
|
3822136e69 | ||
|
|
1fa4d42d27 | ||
|
|
d5bc0914f4 | ||
|
|
ee5165320d | ||
|
|
1dab85d265 | ||
|
|
423752e720 | ||
|
|
4efcec7e93 | ||
|
|
619d981ded | ||
|
|
72d93e943b | ||
|
|
f07523267d | ||
|
|
5409470750 | ||
|
|
70b7f39bcc | ||
|
|
3fb0e9328f | ||
|
|
eb369ba5bd | ||
|
|
738bd56270 | ||
|
|
5e29f08d2b | ||
|
|
b3a5265b98 | ||
|
|
d7d439947d | ||
|
|
2eda795219 | ||
|
|
18ce7d333d | ||
|
|
f32d0c463f | ||
|
|
7275ec9a61 | ||
|
|
0fa34dba33 | ||
|
|
49f070977a | ||
|
|
35f39a9eaf | ||
|
|
b9d21b1b7a | ||
|
|
2e698317e5 | ||
|
|
9c88fbab5e | ||
|
|
1a51642eb1 | ||
|
|
fdaf5d1c36 | ||
|
|
00e824a1ba | ||
|
|
9c5ab7e311 | ||
|
|
ad240eb18b | ||
|
|
04bdb2d8c4 | ||
|
|
f32d24c1c0 | ||
|
|
3f06460667 |
3
.github/dependabot.yml
vendored
3
.github/dependabot.yml
vendored
@@ -14,6 +14,9 @@ updates:
|
||||
versions: ["2.0.1.MR"]
|
||||
- dependency-name: "org.openjfx:*"
|
||||
update-types: ["version-update:semver-major"]
|
||||
# due to https://github.com/fabriciorby/maven-surefire-junit5-tree-reporter/issues/68
|
||||
- dependency-name: "org.apache.maven.plugins:maven-surefire-plugin"
|
||||
versions: [ "3.5.4", "3.5.5" ]
|
||||
groups:
|
||||
java-test-dependencies:
|
||||
patterns:
|
||||
|
||||
124
.github/workflows/appimage.yml
vendored
124
.github/workflows/appimage.yml
vendored
@@ -8,6 +8,10 @@ on:
|
||||
version:
|
||||
description: 'Version'
|
||||
required: false
|
||||
create-pr:
|
||||
description: 'Create a PR for aur-bin repo'
|
||||
type: boolean
|
||||
default: false
|
||||
push:
|
||||
branches-ignore:
|
||||
- 'dependabot/**'
|
||||
@@ -31,18 +35,24 @@ jobs:
|
||||
name: Build AppImage
|
||||
runs-on: ${{ matrix.os }}
|
||||
needs: [get-version]
|
||||
env:
|
||||
SEMVER_STR: ${{ needs.get-version.outputs.semVerStr }}
|
||||
SEMVER_NUM: ${{ needs.get-version.outputs.semVerNum }}
|
||||
REV_NUM: ${{ needs.get-version.outputs.revNum }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
appimage-suffix: x86_64
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/25/openjfx-25_linux-x64_bin-jmods.zip'
|
||||
openjfx-sha: '96e520f48610d8ffb94ca30face1f11ffe8a977ddc1c4ff80b1a9e9f048bd94e'
|
||||
arch: x86_64
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-x64_bin-jmods.zip'
|
||||
openjfx-sha: 'e0a9c29d8cf3af9b8b48848b43f87b5785bc107c53a951b19668ce05842bba1b'
|
||||
appimagetool-sha: 'ed4ce84f0d9caff66f50bcca6ff6f35aae54ce8135408b3fa33abfc3cb384eb0'
|
||||
- os: ubuntu-24.04-arm
|
||||
appimage-suffix: aarch64
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/25/openjfx-25_linux-aarch64_bin-jmods.zip'
|
||||
openjfx-sha: '9ad4ca7b769ca4ee6419f1e99143dd6ff812f8be4fddb46a7d7cacbeea148af4'
|
||||
arch: aarch64
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-aarch64_bin-jmods.zip'
|
||||
openjfx-sha: 'c3408f818693cce09e59829a8e862a82c7695fdfcd585c41cfd527f5fc3fe646'
|
||||
appimagetool-sha: 'f0837e7448a0c1e4e650a93bb3e85802546e60654ef287576f46c71c126a9158'
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- name: Setup Java
|
||||
@@ -55,7 +65,7 @@ jobs:
|
||||
- name: Download OpenJFX jmods
|
||||
id: download-jmods
|
||||
run: |
|
||||
curl -L ${{ matrix.openjfx-url }} -o openjfx-jmods.zip
|
||||
curl --silent --fail-with-body --proto "=https" -L ${{ matrix.openjfx-url }} -o openjfx-jmods.zip
|
||||
echo "${{ matrix.openjfx-sha }} openjfx-jmods.zip" | shasum -a256 --check
|
||||
mkdir -p openjfx-jmods
|
||||
unzip -j openjfx-jmods.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d openjfx-jmods
|
||||
@@ -73,7 +83,7 @@ jobs:
|
||||
exit 1
|
||||
fi
|
||||
- name: Set version
|
||||
run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }}
|
||||
run : mvn versions:set -DnewVersion="$SEMVER_STR"
|
||||
- name: Run maven
|
||||
run: mvn -B clean package -Plinux -DskipTests
|
||||
- name: Patch target dir
|
||||
@@ -94,13 +104,15 @@ jobs:
|
||||
${JAVA_HOME}/bin/jlink
|
||||
--verbose
|
||||
--output runtime
|
||||
--module-path "${{ steps.jep-493-check.outputs.jmod_paths }}"
|
||||
--module-path "${JMOD_PATHS}"
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.crypto.cryptoki,jdk.crypto.ec,jdk.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net,java.compiler
|
||||
--strip-native-commands
|
||||
--no-header-files
|
||||
--no-man-pages
|
||||
--strip-debug
|
||||
--compress zip-0
|
||||
env:
|
||||
JMOD_PATHS: ${{ steps.jep-493-check.outputs.jmod_paths }}
|
||||
- name: Run jpackage
|
||||
run: >
|
||||
${JAVA_HOME}/bin/jpackage
|
||||
@@ -114,12 +126,12 @@ jobs:
|
||||
--name Cryptomator
|
||||
--vendor "Skymatic GmbH"
|
||||
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
||||
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
|
||||
--app-version "${SEMVER_NUM}.${REV_NUM}"
|
||||
--java-options "--enable-preview"
|
||||
--java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator"
|
||||
--java-options "-Xss5m"
|
||||
--java-options "-Xmx256m"
|
||||
--java-options "-Dcryptomator.appVersion=\"${{ needs.get-version.outputs.semVerStr }}\""
|
||||
--java-options "-Dcryptomator.appVersion=\"${SEMVER_STR}\""
|
||||
--java-options "-Dfile.encoding=\"utf-8\""
|
||||
--java-options "-Djava.net.useSystemProxies=true"
|
||||
--java-options "-Dcryptomator.adminConfigPath=\"/etc/cryptomator/config.properties\""
|
||||
@@ -130,8 +142,9 @@ jobs:
|
||||
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/.local/share/Cryptomator/mnt\""
|
||||
--java-options "-Dcryptomator.showTrayIcon=true"
|
||||
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"@{appdir}/usr/share/icons/hicolor/symbolic/apps\""
|
||||
--java-options "-Dcryptomator.buildNumber=\"appimage-${{ needs.get-version.outputs.revNum }}\""
|
||||
--java-options "-Dcryptomator.buildNumber=\"appimage-${REV_NUM}\""
|
||||
--java-options "-Dcryptomator.networking.truststore.p12Path=\"/etc/cryptomator/certs.p12\""
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true"
|
||||
--java-options "-XX:ErrorFile=/cryptomator/cryptomator_crash.log"
|
||||
--resource-dir dist/linux/resources
|
||||
- name: Patch Cryptomator.AppDir
|
||||
@@ -155,7 +168,8 @@ jobs:
|
||||
ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun
|
||||
- name: Download AppImageKit
|
||||
run: |
|
||||
curl -L https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-${{ matrix.appimage-suffix }}.AppImage -o appimagetool.AppImage
|
||||
curl --silent --fail-with-body --proto "=https" -L "https://github.com/AppImage/appimagetool/releases/download/1.9.1/appimagetool-${{ matrix.arch }}.AppImage" -o appimagetool.AppImage
|
||||
echo "${{ matrix.appimagetool-sha }} appimagetool.AppImage" | shasum -a256 --check
|
||||
chmod +x appimagetool.AppImage
|
||||
./appimagetool.AppImage --appimage-extract
|
||||
- name: Prepare GPG-Agent for signing with key 615D449FE6E6A235
|
||||
@@ -167,17 +181,17 @@ jobs:
|
||||
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
|
||||
- name: Build AppImage
|
||||
run: >
|
||||
./squashfs-root/AppRun Cryptomator.AppDir cryptomator-${{ needs.get-version.outputs.semVerStr }}-${{ matrix.appimage-suffix }}.AppImage
|
||||
-u "gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-${{ matrix.appimage-suffix }}.AppImage.zsync"
|
||||
./squashfs-root/AppRun Cryptomator.AppDir cryptomator-${SEMVER_STR}-${{ matrix.arch }}.AppImage
|
||||
-u "gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-${{ matrix.arch }}.AppImage.zsync"
|
||||
--sign --sign-key=615D449FE6E6A235
|
||||
- name: Create detached GPG signatures
|
||||
run: |
|
||||
gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a cryptomator-*.AppImage
|
||||
gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a cryptomator-*.AppImage.zsync
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
with:
|
||||
name: appimage-${{ matrix.appimage-suffix }}
|
||||
name: appimage-${{ matrix.arch }}
|
||||
path: |
|
||||
cryptomator-*.AppImage
|
||||
cryptomator-*.AppImage.zsync
|
||||
@@ -196,65 +210,77 @@ jobs:
|
||||
|
||||
create-aur-bin-pr:
|
||||
name: Create PR for aur-bin repo
|
||||
needs: [build, get-version]
|
||||
if: github.event_name == 'workflow_dispatch' && inputs.create-pr || github.event_name == 'release' && needs.get-version.outputs.versionType == 'stable'
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name == 'release' && needs.get-version.outputs.versionType == 'stable'
|
||||
needs: [build, get-version]
|
||||
container:
|
||||
image: archlinux:base-devel
|
||||
env:
|
||||
SEMVER_STR: ${{ needs.get-version.outputs.semVerStr }}
|
||||
PKGDEST: ${{ github.workspace }}/pkgdest
|
||||
SRCDEST: ${{ github.workspace }}/srcdest
|
||||
steps:
|
||||
- name: Download AppImages
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
with:
|
||||
path: downloads/
|
||||
merge-multiple: true
|
||||
- name: Compute sha256 hash of AppImages
|
||||
id: checksums
|
||||
- name: Prepare pacman
|
||||
run: |
|
||||
X64_SHA256=$(sha256sum downloads/cryptomator-*-x86_64.AppImage | cut -d ' ' -f1)
|
||||
echo "x64-sha256sum=${X64_SHA256}" >> "$GITHUB_OUTPUT"
|
||||
AARCH64_SHA256=$(sha256sum downloads/cryptomator-*-aarch64.AppImage | cut -d ' ' -f1)
|
||||
echo "aarch64-sha256sum=${AARCH64_SHA256}" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
pacman-key --init
|
||||
pacman-key --populate archlinux
|
||||
pacman -Syu --noconfirm --needed git base-devel sudo gnupg maven unzip github-cli curl pacman-contrib
|
||||
- name: Checkout cryptomator/aur-bin
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
repository: 'cryptomator/aur-bin'
|
||||
token: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||
- name: Install dependencies
|
||||
- name: Create build user
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get -y install makepkg pacman-package-manager
|
||||
useradd -m builder
|
||||
echo 'builder ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/builder
|
||||
chown -R builder:builder "$GITHUB_WORKSPACE"
|
||||
install -d -m 0755 -o builder -g builder "$PKGDEST" "$SRCDEST"
|
||||
- name: Import Cryptomator release signing key
|
||||
# try first ubuntu. on failure try openpgp keyservers
|
||||
run: >
|
||||
sudo -u builder gpg --batch --keyserver hkps://keyserver.ubuntu.com --recv-keys 58117AFA1F85B3EEC154677D615D449FE6E6A235
|
||||
|| sudo -u builder gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys 58117AFA1F85B3EEC154677D615D449FE6E6A235
|
||||
- name: Checkout release branch
|
||||
run: |
|
||||
git checkout -b release/${{ needs.get-version.outputs.semVerStr }}
|
||||
git config --global safe.directory '*'
|
||||
git checkout -b "release/${SEMVER_STR}"
|
||||
- name: Update build file
|
||||
run: |
|
||||
sed -i -e 's|^pkgver=.*$|pkgver=${{ needs.get-version.outputs.semVerStr }}|' PKGBUILD
|
||||
sed -i -e "s|^pkgver=.*$|pkgver=${SEMVER_STR}|" PKGBUILD
|
||||
sed -i -e 's|^pkgrel=.*$|pkgrel=1|' PKGBUILD
|
||||
sed -i -e "s|^sha256sums_x86_64=.*$|sha256sums_x86_64=('${{ steps.checksums.outputs.x64-sha256sum }}'|" PKGBUILD
|
||||
sed -i -e "s|^sha256sums_aarch64=.*$|sha256sums_aarch64=('${{ steps.checksums.outputs.aarch64-sha256sum}}'|" PKGBUILD
|
||||
makepkg --printsrcinfo > .SRCINFO
|
||||
sudo -u builder updpkgsums
|
||||
sudo -u builder makepkg --printsrcinfo > .SRCINFO
|
||||
- name: Build package with makepkg
|
||||
run: >
|
||||
sudo -u builder
|
||||
env PKGDEST="$PKGDEST" SRCDEST="$SRCDEST"
|
||||
makepkg --syncdeps --cleanbuild --noconfirm --log
|
||||
- name: Commit and push
|
||||
run: |
|
||||
git config user.name "${{ github.actor }}"
|
||||
git config user.email "${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com"
|
||||
git config user.name "cryptobot"
|
||||
git config user.email "cryptobot@users.noreply.github.com"
|
||||
git config push.autoSetupRemote true
|
||||
git stage .
|
||||
git commit -m "Prepare release ${{needs.get-version.outputs.semVerStr}}"
|
||||
git stage PKGBUILD .SRCINFO
|
||||
git commit -m "Prepare release ${SEMVER_STR}"
|
||||
git push
|
||||
- name: Create pull request
|
||||
id: create-pr
|
||||
run: |
|
||||
printf "> [!IMPORTANT]\n> Todos:\n> - [ ] Update build instructions\n> - [ ] Check for JDK update\n> - [ ] Check for JFX update" > pr_body.md
|
||||
URL=$(gh pr create --title "Release ${{ needs.get-version.outputs.semVerStr }}" --body-file pr_body.md)
|
||||
echo "PR_URL=$URL" >> "$GITHUB_OUTPUT"
|
||||
printf "Created by $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" > pr_body.md
|
||||
PR_URL=$(gh pr create --title "Release ${SEMVER_STR}" --body-file pr_body.md)
|
||||
echo "url=$PR_URL" >> "$GITHUB_OUTPUT"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||
- name: Slack Notification
|
||||
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3
|
||||
env:
|
||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
|
||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }}
|
||||
SLACK_USERNAME: 'Cryptobot'
|
||||
SLACK_ICON: false
|
||||
SLACK_ICON_EMOJI: ':bot:'
|
||||
SLACK_CHANNEL: 'cryptomator-desktop'
|
||||
SLACK_TITLE: "AUR-bin release PR for ${{ github.event.repository.name }} ${{ github.event.release.tag_name }} created."
|
||||
SLACK_MESSAGE: "See <${{ steps.create-pr.outputs.PR_URL }}|PR> on how to proceed."
|
||||
SLACK_TITLE: "AUR-bin release PR for ${{ github.event.repository.name }} ${{ needs.get-version.outputs.semVerStr }} created."
|
||||
SLACK_MESSAGE: "See <${{ steps.create-pr.outputs.url }}|PR> on how to proceed."
|
||||
SLACK_FOOTER: false
|
||||
MSG_MINIMAL: true
|
||||
|
||||
95
.github/workflows/aur.yml
vendored
95
.github/workflows/aur.yml
vendored
@@ -1,95 +0,0 @@
|
||||
name: Create PR for AUR
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag:
|
||||
description: 'Release tag'
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
get-version:
|
||||
uses: ./.github/workflows/get-version.yml
|
||||
with:
|
||||
version: ${{ inputs.tag }}
|
||||
tarball:
|
||||
name: Determines tarball url and compute checksum
|
||||
runs-on: ubuntu-latest
|
||||
needs: [get-version]
|
||||
if: github.event_name == 'workflow_dispatch' || needs.get-version.outputs.versionType == 'stable'
|
||||
env:
|
||||
INPUT_TAG: ${{ inputs.tag }}
|
||||
outputs:
|
||||
url: ${{ steps.url.outputs.url}}
|
||||
sha256: ${{ steps.sha256.outputs.sha256}}
|
||||
steps:
|
||||
- name: Determine tarball url
|
||||
id: url
|
||||
run: |
|
||||
URL="";
|
||||
if [[ -n "${INPUT_TAG}" ]]; then
|
||||
URL="https://github.com/cryptomator/cryptomator/archive/refs/tags/${INPUT_TAG}.tar.gz"
|
||||
else
|
||||
URL="https://github.com/cryptomator/cryptomator/archive/refs/tags/${{ github.event.release.tag_name }}.tar.gz"
|
||||
fi
|
||||
echo "url=${URL}" >> "$GITHUB_OUTPUT"
|
||||
- name: Download source tarball and compute checksum
|
||||
id: sha256
|
||||
run: |
|
||||
curl --silent --fail-with-body -L -H "Accept: application/vnd.github+json" ${{ steps.url.outputs.url }} --output cryptomator.tar.gz
|
||||
TARBALL_SHA256=$(sha256sum cryptomator.tar.gz | cut -d ' ' -f1)
|
||||
echo "sha256=${TARBALL_SHA256}" >> "$GITHUB_OUTPUT"
|
||||
aur:
|
||||
name: Create PR for AUR
|
||||
runs-on: ubuntu-latest
|
||||
needs: [tarball, get-version]
|
||||
env:
|
||||
AUR_PR_URL: tbd
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
repository: 'cryptomator/aur'
|
||||
token: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install makepkg pacman-package-manager
|
||||
- name: Checkout release branch
|
||||
run: |
|
||||
git checkout -b release/${{ needs.get-version.outputs.semVerStr }}
|
||||
- name: Update build file
|
||||
run: |
|
||||
sed -i -e 's|^pkgver=.*$|pkgver=${{ needs.get-version.outputs.semVerStr }}|' PKGBUILD
|
||||
sed -i -e 's|^pkgrel=.*$|pkgrel=1|' PKGBUILD
|
||||
sed -i -e "s|^sha256sums=.*$|sha256sums=('${{ needs.tarball.outputs.sha256 }}'|" PKGBUILD
|
||||
makepkg --printsrcinfo > .SRCINFO
|
||||
- name: Commit and push
|
||||
run: |
|
||||
git config user.name "${{ github.actor }}"
|
||||
git config user.email "${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com"
|
||||
git config push.autoSetupRemote true
|
||||
git stage .
|
||||
git commit -m "Prepare release ${{needs.get-version.outputs.semVerStr}}"
|
||||
git push
|
||||
- name: Create pull request
|
||||
run: |
|
||||
printf "> [!IMPORTANT]\n> Todos:\n> - [ ] Update build instructions\n> - [ ] Check for JDK update\n> - [ ] Check for JFX update" > pr_body.md
|
||||
PR_URL=$(gh pr create --title "Release ${{ needs.get-version.outputs.semVerStr }}" --body-file pr_body.md)
|
||||
echo "AUR_PR_URL=$PR_URL" >> "$GITHUB_ENV"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||
- name: Slack Notification
|
||||
if: github.event_name == 'release'
|
||||
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3
|
||||
env:
|
||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
|
||||
SLACK_USERNAME: 'Cryptobot'
|
||||
SLACK_ICON: false
|
||||
SLACK_ICON_EMOJI: ':bot:'
|
||||
SLACK_CHANNEL: 'cryptomator-desktop'
|
||||
SLACK_TITLE: "AUR release PR created for ${{ github.event.repository.name }} ${{ github.event.release.tag_name }} created."
|
||||
SLACK_MESSAGE: "See <${{ env.AUR_PR_URL }}|PR> on how to proceed."
|
||||
SLACK_FOOTER: false
|
||||
MSG_MINIMAL: true
|
||||
8
.github/workflows/av-whitelist.yml
vendored
8
.github/workflows/av-whitelist.yml
vendored
@@ -49,9 +49,9 @@ jobs:
|
||||
url="${INPUT_URL}"
|
||||
echo "fileName=${url##*/}" >> $GITHUB_OUTPUT
|
||||
- name: Download file
|
||||
run: curl "${INPUT_URL}" -L -o "${{steps.extractName.outputs.fileName}}" --fail-with-body
|
||||
run: curl --silent --fail-with-body --proto "=https" -L "${INPUT_URL}" -o "${{steps.extractName.outputs.fileName}}"
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
with:
|
||||
name: ${{ steps.extractName.outputs.fileName }}
|
||||
path: ${{ steps.extractName.outputs.fileName }}
|
||||
@@ -63,7 +63,7 @@ jobs:
|
||||
if: inputs.kaspersky
|
||||
steps:
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
|
||||
with:
|
||||
name: ${{ needs.download-file.outputs.fileName }}
|
||||
path: upload
|
||||
@@ -83,7 +83,7 @@ jobs:
|
||||
if: inputs.avast
|
||||
steps:
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
|
||||
with:
|
||||
name: ${{ needs.download-file.outputs.fileName }}
|
||||
path: upload
|
||||
|
||||
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -67,7 +67,7 @@ jobs:
|
||||
### Other Changes 📎
|
||||
END REPLACE-->
|
||||
|
||||
Feel free to also read our [CHANGELOG.md](https://github.com/cryptomator/cryptomator/blob/develop/CHANGELOG.md).
|
||||
For a comprehensive view of changes, read the [CHANGELOG](https://github.com/cryptomator/cryptomator/blob/develop/CHANGELOG.md).
|
||||
|
||||
---
|
||||
|
||||
|
||||
14
.github/workflows/debian.yml
vendored
14
.github/workflows/debian.yml
vendored
@@ -25,10 +25,10 @@ env:
|
||||
JAVA_DIST: 'temurin'
|
||||
JAVA_VERSION: '25.0.2+10.0.LTS'
|
||||
DEB_BUILD_DEPENDS: 'debhelper (>=10), openjdk-25-jdk (>= 25+36), libgtk-3-0 (>= 3.20.0), libxxf86vm1, libgl1'
|
||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/25/openjfx-25_linux-x64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AMD64_HASH: '96e520f48610d8ffb94ca30face1f11ffe8a977ddc1c4ff80b1a9e9f048bd94e'
|
||||
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/25/openjfx-25_linux-aarch64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AARCH64_HASH: '9ad4ca7b769ca4ee6419f1e99143dd6ff812f8be4fddb46a7d7cacbeea148af4'
|
||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-x64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AMD64_HASH: 'e0a9c29d8cf3af9b8b48848b43f87b5785bc107c53a951b19668ce05842bba1b'
|
||||
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-aarch64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AARCH64_HASH: 'c3408f818693cce09e59829a8e862a82c7695fdfcd585c41cfd527f5fc3fe646'
|
||||
|
||||
jobs:
|
||||
get-version:
|
||||
@@ -71,11 +71,11 @@ jobs:
|
||||
- name: Download OpenJFX jmods
|
||||
id: download-jmods
|
||||
run: |
|
||||
curl -L ${{ env.OPENJFX_JMODS_AMD64 }} -o openjfx-amd64.zip
|
||||
curl --silent --fail-with-body --proto "=https" -L ${{ env.OPENJFX_JMODS_AMD64 }} -o openjfx-amd64.zip
|
||||
echo "${{ env.OPENJFX_JMODS_AMD64_HASH }} openjfx-amd64.zip" | shasum -a256 --check
|
||||
mkdir -p jmods/amd64
|
||||
unzip -j openjfx-amd64.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d jmods/amd64
|
||||
curl -L ${{ env.OPENJFX_JMODS_AARCH64 }} -o openjfx-aarch64.zip
|
||||
curl --silent --fail-with-body --proto "=https" -L ${{ env.OPENJFX_JMODS_AARCH64 }} -o openjfx-aarch64.zip
|
||||
echo "${{ env.OPENJFX_JMODS_AARCH64_HASH }} openjfx-aarch64.zip" | shasum -a256 --check
|
||||
mkdir -p jmods/aarch64
|
||||
unzip -j openjfx-aarch64.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d jmods/aarch64
|
||||
@@ -143,7 +143,7 @@ jobs:
|
||||
run: |
|
||||
gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a cryptomator_*_amd64.deb
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
with:
|
||||
name: linux-deb-package
|
||||
path: |
|
||||
|
||||
2
.github/workflows/flathub.yml
vendored
2
.github/workflows/flathub.yml
vendored
@@ -33,7 +33,7 @@ jobs:
|
||||
- name: Download source tarball and compute checksum
|
||||
id: sha512
|
||||
run: |
|
||||
curl --silent --fail-with-body -L -H "Accept: application/vnd.github+json" ${{ steps.url.outputs.url }} --output cryptomator.tar.gz
|
||||
curl --silent --fail-with-body --proto "=https" -L -H "Accept: application/vnd.github+json" ${{ steps.url.outputs.url }} --output cryptomator.tar.gz
|
||||
TARBALL_SHA512=$(sha512sum cryptomator.tar.gz | cut -d ' ' -f1)
|
||||
echo "sha512=${TARBALL_SHA512}" >> "$GITHUB_OUTPUT"
|
||||
flathub:
|
||||
|
||||
200
.github/workflows/linux-makepkg.yml
vendored
Normal file
200
.github/workflows/linux-makepkg.yml
vendored
Normal file
@@ -0,0 +1,200 @@
|
||||
name: Build Arch package
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: 'Version'
|
||||
required: false
|
||||
create-pr:
|
||||
description: 'Create a PR for aur repo'
|
||||
type: boolean
|
||||
default: false
|
||||
push:
|
||||
branches-ignore:
|
||||
- 'dependabot/**'
|
||||
paths:
|
||||
- '.github/workflows/linux-makepkg.yml'
|
||||
- 'dist/linux/makepkg/**'
|
||||
- 'dist/linux/common/**'
|
||||
- 'dist/linux/resources/**'
|
||||
|
||||
jobs:
|
||||
get-version:
|
||||
uses: ./.github/workflows/get-version.yml
|
||||
with:
|
||||
version: ${{ inputs.version }}
|
||||
|
||||
makepkg:
|
||||
name: Build with makepkg
|
||||
needs: [get-version]
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: archlinux:base-devel
|
||||
env:
|
||||
PKGDEST: ${{ github.workspace }}/pkgdest
|
||||
SRCDEST: ${{ github.workspace }}/srcdest
|
||||
steps:
|
||||
- name: Prepare pacman
|
||||
run: |
|
||||
pacman-key --init
|
||||
pacman-key --populate archlinux
|
||||
pacman -Syu --noconfirm --needed git base-devel sudo gnupg maven unzip
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
path: cryptomator
|
||||
- name: Create build user
|
||||
run: |
|
||||
useradd -m builder
|
||||
echo 'builder ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/builder
|
||||
chown -R builder:builder "$GITHUB_WORKSPACE"
|
||||
install -d -m 0755 -o builder -g builder "$PKGDEST" "$SRCDEST"
|
||||
- name: Prepare PKGBUILD
|
||||
# cannot use github.workspace due to https://github.com/actions/runner/issues/2058
|
||||
run: |
|
||||
export SOURCES="${SOURCES_1}${GITHUB_WORKSPACE}${SOURCES_2}"
|
||||
envsubst '$PKG_VERSION $PKG_RELEASE $SOURCES $SOURCES_SHA' < cryptomator/dist/linux/makepkg/PKGBUILD.template > PKGBUILD
|
||||
env:
|
||||
PKG_VERSION: ${{ needs.get-version.outputs.semVerNum }}
|
||||
PKG_RELEASE: 1
|
||||
SOURCES_1: '"${_src_app_dir}::git+file://'
|
||||
SOURCES_2: '/cryptomator"'
|
||||
SOURCES_SHA: "'SKIP'"
|
||||
- name: Build package with makepkg
|
||||
run: >
|
||||
sudo -u builder
|
||||
env PKGDEST="$PKGDEST" SRCDEST="$SRCDEST"
|
||||
makepkg --syncdeps --cleanbuild --noconfirm --log
|
||||
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
with:
|
||||
name: arch-package
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
${{ env.PKGDEST }}/*.pkg.tar.zst
|
||||
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
with:
|
||||
name: pkgbuild-file
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
cryptomator/dist/linux/makepkg/PKGBUILD.template
|
||||
|
||||
create-pr:
|
||||
name: Create PR for aur repo
|
||||
if: github.event_name == 'workflow_dispatch' && inputs.create-pr || github.event_name == 'release' && needs.get-version.outputs.versionType == 'stable'
|
||||
runs-on: ubuntu-latest
|
||||
needs: [get-version, makepkg]
|
||||
container:
|
||||
image: archlinux:base-devel
|
||||
env:
|
||||
PKGDEST: ${{ github.workspace }}/pkgdest
|
||||
SRCDEST: ${{ github.workspace }}/srcdest
|
||||
steps:
|
||||
- name: Prepare pacman
|
||||
run: |
|
||||
pacman-key --init
|
||||
pacman-key --populate archlinux
|
||||
pacman -Syu --noconfirm --needed git base-devel sudo gnupg maven unzip github-cli curl
|
||||
- name: Download source tarball and compute checksum
|
||||
id: sha256
|
||||
run: |
|
||||
URL="https://github.com/cryptomator/cryptomator/archive/refs/tags/${TAG}.tar.gz"
|
||||
curl --silent --fail-with-body --proto "=https" -L -H "Accept: application/vnd.github+json" ${URL} --output cryptomator.tar.gz
|
||||
TARBALL_SHA256=$(sha256sum cryptomator.tar.gz | cut -d ' ' -f1)
|
||||
echo "value=${TARBALL_SHA256}" >> "$GITHUB_OUTPUT"
|
||||
env:
|
||||
TAG: ${{ needs.get-version.outputs.semVerStr || github.event.release.tag_name }}
|
||||
- name: Checkout cryptomator/aur repo
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
repository: 'cryptomator/aur'
|
||||
token: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||
- name: Create build user
|
||||
run: |
|
||||
useradd -m builder
|
||||
echo 'builder ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/builder
|
||||
chown -R builder:builder "$GITHUB_WORKSPACE"
|
||||
install -d -m 0755 -o builder -g builder "$PKGDEST" "$SRCDEST"
|
||||
- name: Import Cryptomator release signing key
|
||||
# try first ubuntu. on failure try openpgp keyservers
|
||||
run: >
|
||||
sudo -u builder gpg --batch --keyserver hkps://keyserver.ubuntu.com --recv-keys 58117AFA1F85B3EEC154677D615D449FE6E6A235
|
||||
|| sudo -u builder gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys 58117AFA1F85B3EEC154677D615D449FE6E6A235
|
||||
- name: Checkout release branch
|
||||
run: |
|
||||
git config --global safe.directory '*'
|
||||
git checkout -b release/${VERSION}
|
||||
env:
|
||||
VERSION: ${{ needs.get-version.outputs.semVerStr }}
|
||||
- name: Determine pkgrel
|
||||
id: pkgrel
|
||||
run: |
|
||||
TARGET_VERSION='${{ needs.get-version.outputs.semVerStr }}'
|
||||
CURRENT_VERSION="$(sed -nE 's/^pkgver=(.*)$/\1/p' PKGBUILD | head -n1)"
|
||||
CURRENT_REL="$(sed -nE 's/^pkgrel=([0-9]+).*$/\1/p' PKGBUILD | head -n1)"
|
||||
|
||||
if [[ "$CURRENT_VERSION" == "$TARGET_VERSION" && "$CURRENT_REL" =~ ^[0-9]+$ ]]; then
|
||||
NEXT_REL=$((CURRENT_REL + 1))
|
||||
else
|
||||
NEXT_REL=1
|
||||
fi
|
||||
|
||||
echo "value=${NEXT_REL}" >> "$GITHUB_OUTPUT"
|
||||
echo "dist-version=${VERSION}-${NEXT_REL}" >> "$GITHUB_OUTPUT"
|
||||
env:
|
||||
VERSION: ${{ needs.get-version.outputs.semVerStr }}
|
||||
- name: Download PKGBUILD template
|
||||
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
|
||||
with:
|
||||
name: pkgbuild-file
|
||||
- name: Prepare PKGBUILD
|
||||
run: |
|
||||
envsubst '$PKG_VERSION $PKG_RELEASE $SOURCES $SOURCES_SHA' < PKGBUILD.template > PKGBUILD
|
||||
sudo -u builder makepkg --printsrcinfo > .SRCINFO
|
||||
env:
|
||||
PKG_VERSION: ${{ needs.get-version.outputs.semVerNum }}
|
||||
PKG_RELEASE: ${{ steps.pkgrel.outputs.value }}
|
||||
SOURCES: |-
|
||||
"cryptomator-${pkgver//_/-}.tar.gz::https://github.com/cryptomator/cryptomator/archive/refs/tags/${pkgver//_/-}.tar.gz"
|
||||
"cryptomator-${pkgver//_/-}.tar.gz.asc::https://github.com/cryptomator/cryptomator/releases/download/${pkgver//_/-}/cryptomator-${pkgver//_/-}.tar.gz.asc"
|
||||
SOURCES_SHA: |-
|
||||
'${{steps.sha256.outputs.value}}'
|
||||
'SKIP'
|
||||
- name: Build package with makepkg
|
||||
run: >
|
||||
sudo -u builder
|
||||
env PKGDEST="$PKGDEST" SRCDEST="$SRCDEST"
|
||||
makepkg --syncdeps --cleanbuild --noconfirm --log
|
||||
- name: Commit and push
|
||||
run: |
|
||||
git config user.name "cryptobot"
|
||||
git config user.email "cryptobot@users.noreply.github.com"
|
||||
git config push.autoSetupRemote true
|
||||
git stage PKGBUILD .SRCINFO
|
||||
git commit -m "Prepare release ${DIST_VERSION}"
|
||||
git push
|
||||
env:
|
||||
DIST_VERSION: ${{ steps.pkgrel.outputs.dist-version }}
|
||||
- name: Create pull request
|
||||
id: create-pr
|
||||
run: |
|
||||
printf "Created by $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" > pr_body.md
|
||||
PR_URL=$(gh pr create --title "Release $DIST_VERSION" --body-file pr_body.md)
|
||||
echo "url=$PR_URL" >> "$GITHUB_OUTPUT"
|
||||
env:
|
||||
DIST_VERSION: ${{ steps.pkgrel.outputs.dist-version }}
|
||||
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||
- name: Slack Notification
|
||||
if: github.event_name == 'release'
|
||||
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3
|
||||
env:
|
||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }}
|
||||
SLACK_USERNAME: 'Cryptobot'
|
||||
SLACK_ICON: false
|
||||
SLACK_ICON_EMOJI: ':bot:'
|
||||
SLACK_CHANNEL: 'cryptomator-desktop'
|
||||
SLACK_TITLE: "AUR release PR created for ${{ github.event.repository.name }} ${{ steps.pkgrel.outputs.dist-version }} ."
|
||||
SLACK_MESSAGE: "See <${{ steps.create-pr.outputs.url }}|PR> on how to proceed."
|
||||
SLACK_FOOTER: false
|
||||
MSG_MINIMAL: true
|
||||
24
.github/workflows/mac-dmg-x64.yml
vendored
24
.github/workflows/mac-dmg-x64.yml
vendored
@@ -44,8 +44,8 @@ jobs:
|
||||
architecture: x64
|
||||
output-suffix: x64
|
||||
fuse-lib: macFUSE
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/25/openjfx-25_osx-x64_bin-jmods.zip'
|
||||
openjfx-sha: '0eba73fb28a24c845175d16fa2f8c081c936ce6de1be9b79eb6119fa32e53d52'
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_osx-x64_bin-jmods.zip'
|
||||
openjfx-sha: '0b4d8463f03901b7425d94628e4116b7078abb8dd540fbec415266fac20bda5c'
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- name: Setup Java
|
||||
@@ -59,7 +59,7 @@ jobs:
|
||||
- name: Download OpenJFX jmods
|
||||
id: download-jmods
|
||||
run: |
|
||||
curl -L ${{ matrix.openjfx-url }} -o openjfx-jmods.zip
|
||||
curl --silent --fail-with-body --proto "=https" -L ${{ matrix.openjfx-url }} -o openjfx-jmods.zip
|
||||
echo "${{ matrix.openjfx-sha }} *openjfx-jmods.zip" | shasum -a256 --check
|
||||
mkdir -p openjfx-jmods/
|
||||
unzip -jo openjfx-jmods.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d openjfx-jmods
|
||||
@@ -138,12 +138,14 @@ jobs:
|
||||
--java-options "-Dcryptomator.showTrayIcon=true"
|
||||
--java-options "-Dcryptomator.updateMechanism=org.cryptomator.macos.update.DmgUpdateMechanism"
|
||||
--java-options "-Dcryptomator.buildNumber=\"dmg-${{ needs.get-version.outputs.revNum }}\""
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true"
|
||||
--mac-package-identifier org.cryptomator
|
||||
--resource-dir dist/mac/resources
|
||||
- name: Patch Cryptomator.app
|
||||
run: |
|
||||
mv appdir/Cryptomator.app Cryptomator.app
|
||||
mv dist/mac/resources/Cryptomator-Vault.icns Cryptomator.app/Contents/Resources/
|
||||
cp dist/mac/resources/Assets.car Cryptomator.app/Contents/Resources/
|
||||
sed -i '' "s|###BUNDLE_SHORT_VERSION_STRING###|${VERSION_NO}|g" Cryptomator.app/Contents/Info.plist
|
||||
sed -i '' "s|###BUNDLE_VERSION###|${REVISION_NO}|g" Cryptomator.app/Contents/Info.plist
|
||||
echo -n "$PROVISIONING_PROFILE_BASE64" | base64 --decode --output Cryptomator.app/Contents/embedded.provisionprofile
|
||||
@@ -151,20 +153,6 @@ jobs:
|
||||
VERSION_NO: ${{ needs.get-version.outputs.semVerNum }}
|
||||
REVISION_NO: ${{ needs.get-version.outputs.revNum }}
|
||||
PROVISIONING_PROFILE_BASE64: ${{ secrets.MACOS_PROVISIONING_PROFILE_BASE64 }}
|
||||
- name: Build and install DockTilePlugin
|
||||
env:
|
||||
DERIVED_DATA_PATH: dist/mac/DockTilePlugin/build
|
||||
run: |
|
||||
xcodebuild -project dist/mac/DockTilePlugin/DockTilePlugin.xcodeproj \
|
||||
-scheme DockTilePlugin \
|
||||
-configuration Release \
|
||||
-destination "platform=macOS,arch=x86_64" \
|
||||
-derivedDataPath ${DERIVED_DATA_PATH} \
|
||||
-quiet \
|
||||
clean build
|
||||
mkdir -p Cryptomator.app/Contents/PlugIns
|
||||
cp -R ${DERIVED_DATA_PATH}/Build/Products/Release/Cryptomator.docktileplugin Cryptomator.app/Contents/PlugIns/
|
||||
rm -rf ${DERIVED_DATA_PATH}
|
||||
- name: Generate license for dmg
|
||||
run: >
|
||||
mvn -B license:add-third-party
|
||||
@@ -283,7 +271,7 @@ jobs:
|
||||
run: security delete-keychain $RUNNER_TEMP/codesign.keychain-db
|
||||
continue-on-error: true
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
with:
|
||||
name: dmg-${{ matrix.output-suffix }}
|
||||
path: |
|
||||
|
||||
24
.github/workflows/mac-dmg.yml
vendored
24
.github/workflows/mac-dmg.yml
vendored
@@ -42,8 +42,8 @@ jobs:
|
||||
architecture: aarch64
|
||||
output-suffix: arm64
|
||||
fuse-lib: FUSE-T
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/25/openjfx-25_osx-aarch64_bin-jmods.zip'
|
||||
openjfx-sha: '13f8c0513c40c95881479fbcf0465a29a60217393fb0656f5e4eab78a9442fba'
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_osx-aarch64_bin-jmods.zip'
|
||||
openjfx-sha: '4cd258001c75af7047005c5c891e2400ed11d24fbb09412324c0cbaf8b503c5a'
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- name: Setup Java
|
||||
@@ -57,7 +57,7 @@ jobs:
|
||||
- name: Download OpenJFX jmods
|
||||
id: download-jmods
|
||||
run: |
|
||||
curl -L ${{ matrix.openjfx-url }} -o openjfx-jmods.zip
|
||||
curl --silent --fail-with-body --proto "=https" -L ${{ matrix.openjfx-url }} -o openjfx-jmods.zip
|
||||
echo "${{ matrix.openjfx-sha }} *openjfx-jmods.zip" | shasum -a256 --check
|
||||
mkdir -p openjfx-jmods/
|
||||
unzip -jo openjfx-jmods.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d openjfx-jmods
|
||||
@@ -137,12 +137,14 @@ jobs:
|
||||
--java-options "-Dcryptomator.updateMechanism=org.cryptomator.macos.update.DmgUpdateMechanism"
|
||||
--java-options "-Dcryptomator.buildNumber=\"dmg-${{ needs.get-version.outputs.revNum }}\""
|
||||
--java-options "-XX:ErrorFile=/cryptomator/cryptomator_crash.log"
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true"
|
||||
--mac-package-identifier org.cryptomator
|
||||
--resource-dir dist/mac/resources
|
||||
- name: Patch Cryptomator.app
|
||||
run: |
|
||||
mv appdir/Cryptomator.app Cryptomator.app
|
||||
mv dist/mac/resources/Cryptomator-Vault.icns Cryptomator.app/Contents/Resources/
|
||||
cp dist/mac/resources/Assets.car Cryptomator.app/Contents/Resources/
|
||||
sed -i '' "s|###BUNDLE_SHORT_VERSION_STRING###|${VERSION_NO}|g" Cryptomator.app/Contents/Info.plist
|
||||
sed -i '' "s|###BUNDLE_VERSION###|${REVISION_NO}|g" Cryptomator.app/Contents/Info.plist
|
||||
echo -n "$PROVISIONING_PROFILE_BASE64" | base64 --decode --output Cryptomator.app/Contents/embedded.provisionprofile
|
||||
@@ -150,20 +152,6 @@ jobs:
|
||||
VERSION_NO: ${{ needs.get-version.outputs.semVerNum }}
|
||||
REVISION_NO: ${{ needs.get-version.outputs.revNum }}
|
||||
PROVISIONING_PROFILE_BASE64: ${{ secrets.MACOS_PROVISIONING_PROFILE_BASE64 }}
|
||||
- name: Build and install DockTilePlugin
|
||||
env:
|
||||
DERIVED_DATA_PATH: dist/mac/DockTilePlugin/build
|
||||
run: |
|
||||
xcodebuild -project dist/mac/DockTilePlugin/DockTilePlugin.xcodeproj \
|
||||
-scheme DockTilePlugin \
|
||||
-configuration Release \
|
||||
-destination "platform=macOS,arch=arm64" \
|
||||
-derivedDataPath ${DERIVED_DATA_PATH} \
|
||||
-quiet \
|
||||
clean build
|
||||
mkdir -p Cryptomator.app/Contents/PlugIns
|
||||
cp -R ${DERIVED_DATA_PATH}/Build/Products/Release/Cryptomator.docktileplugin Cryptomator.app/Contents/PlugIns/
|
||||
rm -rf ${DERIVED_DATA_PATH}
|
||||
- name: Generate license for dmg
|
||||
run: >
|
||||
mvn -B license:add-third-party
|
||||
@@ -282,7 +270,7 @@ jobs:
|
||||
run: security delete-keychain $RUNNER_TEMP/codesign.keychain-db
|
||||
continue-on-error: true
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
with:
|
||||
name: dmg-${{ matrix.output-suffix }}
|
||||
path: |
|
||||
|
||||
2
.github/workflows/no-response.yml
vendored
2
.github/workflows/no-response.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1
|
||||
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0
|
||||
with:
|
||||
days-before-stale: 14
|
||||
days-before-close: 0
|
||||
|
||||
4
.github/workflows/post-publish.yml
vendored
4
.github/workflows/post-publish.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
||||
steps:
|
||||
- name: Download source tarball
|
||||
run: |
|
||||
curl -L -H "Accept: application/vnd.github+json" https://github.com/cryptomator/cryptomator/archive/refs/tags/${{ github.event.release.tag_name }}.tar.gz --output cryptomator-${{ github.event.release.tag_name }}.tar.gz
|
||||
curl --silent --fail-with-body --proto "=https" -L -H "Accept: application/vnd.github+json" https://github.com/cryptomator/cryptomator/archive/refs/tags/${{ github.event.release.tag_name }}.tar.gz --output cryptomator-${{ github.event.release.tag_name }}.tar.gz
|
||||
- name: Sign source tarball with key 615D449FE6E6A235
|
||||
run: |
|
||||
echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
- name: Slack Notification
|
||||
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3
|
||||
env:
|
||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
|
||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }}
|
||||
SLACK_USERNAME: 'Cryptobot'
|
||||
SLACK_ICON: false
|
||||
SLACK_ICON_EMOJI: ':bot:'
|
||||
|
||||
1
.github/workflows/release-check.yml
vendored
1
.github/workflows/release-check.yml
vendored
@@ -43,6 +43,7 @@ jobs:
|
||||
exit 1
|
||||
fi
|
||||
- name: Validate release in org.cryptomator.Cryptomator.metainfo.xml file
|
||||
if: ${{ ! (contains(github.event.head_commit.message, '[skip metadata check]') || contains(github.event.head_commit.message, '[metadata check skip]')) }}
|
||||
run: |
|
||||
if ! grep -q "<release date=\".*\" version=\"${{ steps.validate-pom-version.outputs.semVerStr }}\">" dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml; then
|
||||
echo "Release not set in dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml"
|
||||
|
||||
2
.github/workflows/stale.yml
vendored
2
.github/workflows/stale.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1
|
||||
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0
|
||||
with:
|
||||
days-before-stale: 365
|
||||
days-before-close: 90
|
||||
|
||||
55
.github/workflows/win-exe.yml
vendored
55
.github/workflows/win-exe.yml
vendored
@@ -22,11 +22,12 @@ on:
|
||||
|
||||
|
||||
env:
|
||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/25/openjfx-25_windows-x64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AMD64_HASH: 'c8eb9fd039b00e0020cf6c3db8ed7876bf3ee4d27860aa697a247b83b8296ae7'
|
||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_windows-x64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AMD64_HASH: '33d878dfac85590c4d77c518ed413e512d34a8479d90132b230a7ddd173576b3'
|
||||
WINFSP_MSI: 'https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi'
|
||||
WINFSP_MSI_HASH: '073a70e00f77423e34bed98b86e600def93393ba5822204fac57a29324db9f7a'
|
||||
WINFSP_UNINSTALLER: 'https://github.com/cryptomator/winfsp-uninstaller/releases/latest/download/winfsp-uninstaller.exe'
|
||||
WIX_VERSION: '6.0.2'
|
||||
|
||||
defaults:
|
||||
run:
|
||||
@@ -47,8 +48,8 @@ jobs:
|
||||
include:
|
||||
- arch: x64
|
||||
os: windows-latest
|
||||
java-dist: 'temurin' #cannot use temurin, see https://github.com/cryptomator/cryptomator/issues/3824#issuecomment-2829827427
|
||||
java-version: '25.0.2+10.0.LTS'
|
||||
java-dist: 'zulu' #cannot use temurin, see https://github.com/cryptomator/cryptomator/issues/3824#issuecomment-2829827427
|
||||
java-version: '25.0.1+8'
|
||||
java-package: 'jdk'
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
@@ -62,14 +63,16 @@ jobs:
|
||||
cache: 'maven'
|
||||
- name: Install wix and extensions
|
||||
run: |
|
||||
dotnet tool install --global wix --version 6.0.0
|
||||
wix.exe extension add WixToolset.UI.wixext/6.0.0 --global
|
||||
wix.exe extension add WixToolset.Util.wixext/6.0.0 --global
|
||||
dotnet tool install --global wix --version ${WIX_VERSION}
|
||||
wix.exe extension add --global WixToolset.UI.wixext/${WIX_VERSION}
|
||||
wix.exe extension add --global WixToolset.Util.wixext/${WIX_VERSION}
|
||||
env:
|
||||
WIX_VERSION: ${{ env.WIX_VERSION }}
|
||||
- name: Download and extract JavaFX jmods from Gluon
|
||||
if: matrix.arch == 'x64'
|
||||
#In the last step we move all jmods files a dir level up because jmods are placed inside a directory in the zip
|
||||
run: |
|
||||
curl --output openjfx-jmods.zip -L "${{ env.OPENJFX_JMODS_AMD64 }}"
|
||||
curl --silent --fail-with-body --proto "=https" -L "${{ env.OPENJFX_JMODS_AMD64 }}" --output openjfx-jmods.zip
|
||||
if(!(Get-FileHash -Path openjfx-jmods.zip -Algorithm SHA256).Hash.ToLower().equals("${{ env.OPENJFX_JMODS_AMD64_HASH }}")) {
|
||||
throw "Wrong checksum of JMOD archive downloaded from ${{ env.OPENJFX_JMODS_AMD64 }}.";
|
||||
}
|
||||
@@ -154,6 +157,7 @@ jobs:
|
||||
--java-options "-Dcryptomator.integrationsWin.windowsHelloKeychainPaths=\"@{appdata}/Cryptomator/windowsHelloKeychain.json\""
|
||||
--java-options "-Dcryptomator.disableUpdateCheck=false"
|
||||
--java-options "-XX:ErrorFile=C:/cryptomator/cryptomator_crash.log"
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true"
|
||||
--resource-dir dist/win/resources
|
||||
--icon dist/win/resources/Cryptomator.ico
|
||||
--add-launcher "Cryptomator (Debug)=dist/win/debug-launcher.properties"
|
||||
@@ -185,18 +189,9 @@ jobs:
|
||||
- name: Extract wixhelper.dll for Codesigning #see https://github.com/cryptomator/cryptomator/issues/3130
|
||||
shell: pwsh
|
||||
run: |
|
||||
$extractDir = "appdir/jpackage-jimage"
|
||||
New-Item -Path $extractDir -ItemType Directory -Force | Out-Null
|
||||
|
||||
& "$env:JAVA_HOME\bin\jimage.exe" extract --dir $extractDir "$env:JAVA_HOME\lib\modules"
|
||||
|
||||
$wixhelper = Get-ChildItem -Path $extractDir -Recurse -File -Filter "wixhelper.dll" | Select-Object -First 1
|
||||
if (-not $wixhelper) {
|
||||
throw "wixhelper.dll not found in $env:JAVA_HOME\lib\modules"
|
||||
}
|
||||
|
||||
Copy-Item -Path $wixhelper.FullName -Destination "appdir/wixhelper.dll" -Force
|
||||
Remove-Item -Path $extractDir -Recurse -Force
|
||||
New-Item -Path appdir/jpackage-jmod -ItemType Directory
|
||||
& $env:JAVA_HOME\bin\jmod.exe extract --dir jpackage-jmod "${env:JAVA_HOME}\jmods\jdk.jpackage.jmod"
|
||||
Get-ChildItem -Recurse -Path "jpackage-jmod" -File wixhelper.dll | Select-Object -Last 1 | Copy-Item -Destination "appdir"
|
||||
- name: Sign DLLs with Azure Trusted Signing
|
||||
if: inputs.sign || github.event_name == 'release'
|
||||
uses: ./.github/actions/win-sign-action
|
||||
@@ -286,7 +281,7 @@ jobs:
|
||||
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
|
||||
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
with:
|
||||
name: msi-${{ matrix.arch }}
|
||||
path: |
|
||||
@@ -311,11 +306,13 @@ jobs:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- name: Install wix and extensions
|
||||
run: |
|
||||
dotnet tool install --global wix --version 6.0.0
|
||||
wix.exe extension add WixToolset.BootstrapperApplications.wixext/6.0.0 --global
|
||||
wix.exe extension add WixToolset.Util.wixext/6.0.0 --global
|
||||
dotnet tool install --global wix --version ${WIX_VERSION}
|
||||
wix.exe extension add --global WixToolset.BootstrapperApplications.wixext/${WIX_VERSION}
|
||||
wix.exe extension add --global WixToolset.Util.wixext/${WIX_VERSION}
|
||||
env:
|
||||
WIX_VERSION: ${{ env.WIX_VERSION }}
|
||||
- name: Download .msi
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
|
||||
with:
|
||||
name: msi-${{ matrix.arch }}
|
||||
path: dist/win/bundle/resources
|
||||
@@ -342,7 +339,7 @@ jobs:
|
||||
shell: pwsh
|
||||
- name: Download WinFsp
|
||||
run: |
|
||||
curl --output $env:WINFSP_PATH -L ${{ env.WINFSP_MSI }}
|
||||
curl --silent --fail-with-body --proto "=https" -L ${{ env.WINFSP_MSI }} --output $env:WINFSP_PATH
|
||||
$computedHash = (Get-FileHash -Path $env:WINFSP_PATH -Algorithm SHA256).Hash.ToLower()
|
||||
if ($computedHash -ne "${{ env.WINFSP_MSI_HASH }}") {
|
||||
throw "Checksum mismatch for $env:WINFSP_PATH (expected ${{ env.WINFSP_MSI_HASH }}, got $computedHash)."
|
||||
@@ -352,7 +349,7 @@ jobs:
|
||||
shell: pwsh
|
||||
- name: Download Legacy-WinFsp uninstaller
|
||||
run: |
|
||||
curl --output dist/win/bundle/resources/winfsp-uninstaller.exe -L ${{ env.WINFSP_UNINSTALLER }}
|
||||
curl --silent --fail-with-body --proto "=https" -L ${{ env.WINFSP_UNINSTALLER }} --output dist/win/bundle/resources/winfsp-uninstaller.exe
|
||||
shell: pwsh
|
||||
- name: Create Wix Burn bundle
|
||||
working-directory: dist/win
|
||||
@@ -427,7 +424,7 @@ jobs:
|
||||
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
|
||||
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
with:
|
||||
name: exe-${{ matrix.executable-suffix }}
|
||||
path: |
|
||||
@@ -445,7 +442,7 @@ jobs:
|
||||
download-url-exe-x64: ${{ fromJSON(steps.publish.outputs.assets)[2].browser_download_url }}
|
||||
steps:
|
||||
- name: Download installers
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
|
||||
with:
|
||||
merge-multiple: true
|
||||
- name: Publish installers on GitHub Releases
|
||||
|
||||
2
.idea/runConfigurations/Cryptomator_Linux.xml
generated
2
.idea/runConfigurations/Cryptomator_Linux.xml
generated
@@ -2,7 +2,7 @@
|
||||
<configuration default="false" name="Cryptomator Linux" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{userhome}/.config/Cryptomator/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/Cryptomator/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/Cryptomator/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/Cryptomator/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/Cryptomator/mnt" -Dcryptomator.showTrayIcon=true -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator,javafx.graphics" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{userhome}/.config/Cryptomator/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/Cryptomator/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/Cryptomator/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/Cryptomator/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/Cryptomator/mnt" -Dcryptomator.showTrayIcon=true -Dcryptomator.hub.enableTrustOnFirstUse=true -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator,javafx.graphics" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<configuration default="false" name="Cryptomator Linux Dev" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{userhome}/.config/Cryptomator-Dev/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/Cryptomator-Dev/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/Cryptomator-Dev/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/Cryptomator-Dev/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/Cryptomator-Dev/mnt" -Dcryptomator.showTrayIcon=true -Dfuse.experimental="true" -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator,javafx.graphics" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{userhome}/.config/Cryptomator-Dev/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/Cryptomator-Dev/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/Cryptomator-Dev/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/Cryptomator-Dev/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/Cryptomator-Dev/mnt" -Dcryptomator.showTrayIcon=true -Dcryptomator.hub.enableTrustOnFirstUse=true -Dfuse.experimental="true" -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator,javafx.graphics" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
2
.idea/runConfigurations/Cryptomator_Windows.xml
generated
2
.idea/runConfigurations/Cryptomator_Windows.xml
generated
@@ -2,7 +2,7 @@
|
||||
<configuration default="false" name="Cryptomator Windows" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{appdata}/Cryptomator/settings.json;@{userhome}/AppData/Roaming/Cryptomator/settings.json" -Dcryptomator.ipcSocketPath="@{localappdata}/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{localappdata}/Cryptomator" -Dcryptomator.pluginDir="@{appdata}/Cryptomator/Plugins" -Dcryptomator.integrationsWin.keychainPaths="@{appdata}/Cryptomator/keychain.json;@{userhome}/AppData/Roaming/Cryptomator/keychain.json" -Dcryptomator.integrationsWin.windowsHelloKeychainPaths="@{appdata}/Cryptomator/windowsHelloKeychain.json;@{userhome}/AppData/Roaming/Cryptomator/windowsHelloKeychain.json" -Dcryptomator.p12Path="@{appdata}/Cryptomator/key.p12;@{userhome}/AppData/Roaming/Cryptomator/key.p12" -Dcryptomator.mountPointsDir="@{userhome}/Cryptomator" -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win,javafx.graphics" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{appdata}/Cryptomator/settings.json;@{userhome}/AppData/Roaming/Cryptomator/settings.json" -Dcryptomator.ipcSocketPath="@{localappdata}/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{localappdata}/Cryptomator" -Dcryptomator.pluginDir="@{appdata}/Cryptomator/Plugins" -Dcryptomator.integrationsWin.keychainPaths="@{appdata}/Cryptomator/keychain.json;@{userhome}/AppData/Roaming/Cryptomator/keychain.json" -Dcryptomator.integrationsWin.windowsHelloKeychainPaths="@{appdata}/Cryptomator/windowsHelloKeychain.json;@{userhome}/AppData/Roaming/Cryptomator/windowsHelloKeychain.json" -Dcryptomator.p12Path="@{appdata}/Cryptomator/key.p12;@{userhome}/AppData/Roaming/Cryptomator/key.p12" -Dcryptomator.mountPointsDir="@{userhome}/Cryptomator" -Dcryptomator.showTrayIcon=true -Dcryptomator.hub.enableTrustOnFirstUse=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win,javafx.graphics" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<configuration default="false" name="Cryptomator Windows Dev" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{appdata}/Cryptomator-Dev/settings.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/settings.json" -Dcryptomator.ipcSocketPath="@{localappdata}/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{localappdata}/Cryptomator-Dev" -Dcryptomator.pluginDir="@{appdata}/Cryptomator-Dev/Plugins" -Dcryptomator.integrationsWin.keychainPaths="@{appdata}/Cryptomator-Dev/keychain.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/keychain.json" -Dcryptomator.integrationsWin.windowsHelloKeychainPaths="@{appdata}/Cryptomator-Dev/windowsHelloKeychain.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/windowsHelloKeychain.json" -Dcryptomator.p12Path="@{appdata}/Cryptomator-Dev/key.p12;@{userhome}/AppData/Roaming/Cryptomator-Dev/key.p12" -Dcryptomator.mountPointsDir="@{userhome}/Cryptomator-Dev" -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win,javafx.graphics" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{appdata}/Cryptomator-Dev/settings.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/settings.json" -Dcryptomator.ipcSocketPath="@{localappdata}/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{localappdata}/Cryptomator-Dev" -Dcryptomator.pluginDir="@{appdata}/Cryptomator-Dev/Plugins" -Dcryptomator.integrationsWin.keychainPaths="@{appdata}/Cryptomator-Dev/keychain.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/keychain.json" -Dcryptomator.integrationsWin.windowsHelloKeychainPaths="@{appdata}/Cryptomator-Dev/windowsHelloKeychain.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/windowsHelloKeychain.json" -Dcryptomator.p12Path="@{appdata}/Cryptomator-Dev/key.p12;@{userhome}/AppData/Roaming/Cryptomator-Dev/key.p12" -Dcryptomator.mountPointsDir="@{userhome}/Cryptomator-Dev" -Dcryptomator.showTrayIcon=true -Dcryptomator.hub.enableTrustOnFirstUse=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win,javafx.graphics" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
2
.idea/runConfigurations/Cryptomator_macOS.xml
generated
2
.idea/runConfigurations/Cryptomator_macOS.xml
generated
@@ -5,7 +5,7 @@
|
||||
</envs>
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath="@{userhome}/Library/Application Support/Cryptomator/settings.json" -Dcryptomator.p12Path="@{userhome}/Library/Application Support/Cryptomator/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/Library/Application Support/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{userhome}/Library/Logs/Cryptomator" -Dcryptomator.pluginDir="@{userhome}/Library/Application Support/Cryptomator/Plugins" -Dcryptomator.mountPointsDir="@{userhome}/Cryptomator" -Dcryptomator.showTrayIcon=true -Dcryptomator.integrationsMac.keychainServiceName=Cryptomator -Dcryptomator.updateMechanism=org.cryptomator.macos.update.DmgUpdateMechanism -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac,javafx.graphics" />
|
||||
<option name="VM_PARAMETERS" value="-Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath="@{userhome}/Library/Application Support/Cryptomator/settings.json" -Dcryptomator.p12Path="@{userhome}/Library/Application Support/Cryptomator/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/Library/Application Support/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{userhome}/Library/Logs/Cryptomator" -Dcryptomator.pluginDir="@{userhome}/Library/Application Support/Cryptomator/Plugins" -Dcryptomator.mountPointsDir="@{userhome}/Cryptomator" -Dcryptomator.showTrayIcon=true -Dcryptomator.integrationsMac.keychainServiceName=Cryptomator -Dcryptomator.updateMechanism=org.cryptomator.macos.update.DmgUpdateMechanism -Dcryptomator.hub.enableTrustOnFirstUse=true -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac,javafx.graphics" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
</envs>
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath="@{userhome}/Library/Application Support/Cryptomator-Dev/settings.json" -Dcryptomator.p12Path="@{userhome}/Library/Application Support/Cryptomator-Dev/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/Library/Application Support/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{userhome}/Library/Logs/Cryptomator-Dev" -Dcryptomator.pluginDir="@{userhome}/Library/Application Support/Cryptomator-Dev/Plugins" -Dcryptomator.mountPointsDir="@{userhome}/Library/Application Support/Cryptomator-Dev/mnt" -Dcryptomator.showTrayIcon=true -Dcryptomator.integrationsMac.keychainServiceName=Cryptomator -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac,javafx.graphics" />
|
||||
<option name="VM_PARAMETERS" value="-Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath="@{userhome}/Library/Application Support/Cryptomator-Dev/settings.json" -Dcryptomator.p12Path="@{userhome}/Library/Application Support/Cryptomator-Dev/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/Library/Application Support/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{userhome}/Library/Logs/Cryptomator-Dev" -Dcryptomator.pluginDir="@{userhome}/Library/Application Support/Cryptomator-Dev/Plugins" -Dcryptomator.mountPointsDir="@{userhome}/Library/Application Support/Cryptomator-Dev/mnt" -Dcryptomator.showTrayIcon=true -Dcryptomator.integrationsMac.keychainServiceName=Cryptomator -Dcryptomator.hub.enableTrustOnFirstUse=true -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac,javafx.graphics" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
60
CHANGELOG.md
60
CHANGELOG.md
@@ -7,7 +7,38 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
The changelog starts with version 1.19.0.
|
||||
Changes to prior versions can be found on the [Github release page](https://github.com/cryptomator/cryptomator/releases).
|
||||
|
||||
## [Unreleased](https://github.com/cryptomator/cryptomator/compare/1.18.0...HEAD)
|
||||
## [1.19.2](https://github.com/cryptomator/cryptomator/releases/1.19.2) - 2026-03-20
|
||||
|
||||
### Security
|
||||
* Cryptomamtor Hub Vaults: Additional patch for (#4179, [GHSA-34rf-rwr3-7g43](https://github.com/cryptomator/cryptomator/security/advisories/GHSA-34rf-rwr3-7g43))
|
||||
|
||||
|
||||
## [1.19.1](https://github.com/cryptomator/cryptomator/releases/1.19.1) - 2026-03-12
|
||||
|
||||
### Security
|
||||
* Cryptomamtor Hub Vaults: Fixed possible man-in-the-middle attack with tampered vault config (#4179, [GHSA-34rf-rwr3-7g43](https://github.com/cryptomator/cryptomator/security/advisories/GHSA-34rf-rwr3-7g43))
|
||||
* Disallow unencrypted http connections to hub by default ([CVE-2026-32309](https://github.com/cryptomator/cryptomator/security/advisories/GHSA-vv33-h7qx-c264))
|
||||
* Disallow loading of masterkey file from arbitrary paths (#4180, [CVE-2026-32310](https://github.com/cryptomator/cryptomator/security/advisories/GHSA-5phc-5pfx-hr52))
|
||||
* Fixed not-configured plugin directory does not disable plugin search ([#4176](https://github.com/cryptomator/cryptomator/pull/4176))
|
||||
|
||||
### Added
|
||||
* Trust on first use, adding new config properties `cryptomator.hub.allowedHosts` and `cryptomator.hub.enableTrustOnFirstUse` (#4179)
|
||||
|
||||
### Fixed
|
||||
* Fixed Finder window opens twice when revealing vault on macOS ([#4177](https://github.com/cryptomator/cryptomator/pull/4177))
|
||||
* Fixed app does not start due to secret service detection failure on Linux ([#4175](https://github.com/cryptomator/cryptomator/pull/4175))
|
||||
|
||||
### Changed
|
||||
* Pin version of appimagetool([#4181](https://github.com/cryptomator/cryptomator/pull/4181))
|
||||
* Updated translations
|
||||
* Updated dependencies:
|
||||
* `org.cryptomator:integrations-api` from 1.8.0-beta1 to 1.8.0
|
||||
* `org.cryptomator:integrations-linux` from 1.7.0-beta4 to 1.7.0
|
||||
* `org.cryptomator:integrations-mac` from 1.5.0-beta3 to 1.5.0
|
||||
|
||||
|
||||
|
||||
## [1.19.0](https://github.com/cryptomator/cryptomator/releases/tag/1.19.0) - 2026-03-09
|
||||
|
||||
### Added
|
||||
* Self-Update Mechanism ([#3948](https://github.com/cryptomator/cryptomator/pull/3948))
|
||||
@@ -19,25 +50,34 @@ Changes to prior versions can be found on the [Github release page](https://gith
|
||||
* Show Archived Vault Dialog on unlock when Hub returns 410 ([#4081](https://github.com/cryptomator/cryptomator/pull/4081))
|
||||
* Support automatic app theme selection according to OS theme on Linux ([#4027](https://github.com/cryptomator/cryptomator/issues/4027))
|
||||
* Admin configuration: Allow overwriting certain app properties by external config file ([#4105](https://github.com/cryptomator/cryptomator/pull/4105))
|
||||
* New keychain backend using [secret service API](https://specifications.freedesktop.org/secret-service/0.2) for Linux ([#4025](https://github.com/cryptomator/cryptomator/pull/4025))
|
||||
* Liquid Glass icon for macOS ([#4166](https://github.com/cryptomator/cryptomator/pull/4166))
|
||||
|
||||
### Fixed
|
||||
* Fixed password reset/show recovery possible for vaults without masterkey file ([#4120](https://github.com/cryptomator/cryptomator/pull/4120))
|
||||
* Fixed restore vault config failed due to selecting a directory instead of file ([#4141](https://github.com/cryptomator/cryptomator/issues/4141))
|
||||
* Fixed leaking of cleartext paths into application log ([GHSA-j83j-mwhc-rcgw](https://github.com/cryptomator/cryptomator/security/advisories/GHSA-j83j-mwhc-rcgw))
|
||||
|
||||
### Changed
|
||||
* Built using JDK 25 ([#4031](https://github.com/cryptomator/cryptomator/issues/4031))
|
||||
* Modernized Template for GitHub Releases
|
||||
* Disable user defined app start config on Windows ([#4132](https://github.com/cryptomator/cryptomator/issues/4132))
|
||||
* Disable plugin loading by default ([#4136](https://github.com/cryptomator/cryptomator/4136))
|
||||
* Use JDK 25 ([#4031](https://github.com/cryptomator/cryptomator/pull/4031))
|
||||
* Update JavaFX to 25.0.2 ([#4145](https://github.com/cryptomator/cryptomator/pull/4145))
|
||||
* Updated translations
|
||||
* Updated dependencies
|
||||
* `ch.qos.logback:*` from 1.5.19 to 1.5.31
|
||||
* `com.fasterxml.jackson.core:jackson-databind` from 2.20.0 to 2.21.0
|
||||
* `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.20.0 to 2.21.0
|
||||
* `ch.qos.logback:*` from 1.5.19 to 1.5.32
|
||||
* `com.fasterxml.jackson.core:jackson-databind` from 2.20.0 to 2.21.1
|
||||
* `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.20.0 to 2.21.1
|
||||
* `com.github.ben-manes.caffeine:caffeine` from 3.2.2 to 3.2.3
|
||||
* `com.google.dagger:*` from 2.57.2 to 2.59.1
|
||||
* `com.google.dagger:*` from 2.57.2 to 2.59.2
|
||||
* `org.apache.commons:commons-lang3` from 3.19.0 to 3.20.0
|
||||
* `org.cryptomator:cryptofs` from 2.9.0 to 2.10.0-beta3
|
||||
* `org.cryptomator:cryptofs` from 2.9.0 to 2.10.0
|
||||
* `org.cryptomator:cryptolib` from 2.2.1 to 2.2.2
|
||||
* `org.cryptomator:fuse-nio-adapter` from 5.1.0 to 6.0.0
|
||||
* `org.cryptomator:fuse-nio-adapter` from 5.1.0 to 6.0.1
|
||||
* `org.cryptomator:integrations-api` from 1.7.0 to 1.8.0-beta1
|
||||
* `org.cryptomator:integrations-linux` from 1.6.1 to 1.7.0-beta4
|
||||
* `org.cryptomator:integrations-mac` from 1.4.1 to 1.5.0-beta3
|
||||
* `org.cryptomator:integrations-win` from 1.5.1 to 1.6.0
|
||||
* `org.cryptomator:webdav-nio-adapter` from 3.0.0 to 3.0.1
|
||||
|
||||
* `org.cryptomator:webdav-nio-adapter-servlet` to 1.2.12
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ For more information on the security details visit [cryptomator.org](https://doc
|
||||
|
||||
### Dependencies
|
||||
|
||||
* JDK 24 (e.g. temurin, zulu)
|
||||
* JDK 25 (e.g. temurin, zulu)
|
||||
* Maven 3
|
||||
|
||||
### Run Maven
|
||||
|
||||
9
dist/linux/appimage/build.sh
vendored
9
dist/linux/appimage/build.sh
vendored
@@ -23,12 +23,12 @@ mvn -B -f ../../../pom.xml clean package -Plinux -DskipTests
|
||||
cp ../../../LICENSE.txt ../../../target
|
||||
cp ../../../target/cryptomator-*.jar ../../../target/mods
|
||||
|
||||
JAVAFX_VERSION=25
|
||||
JAVAFX_VERSION=25.0.2
|
||||
JAVAFX_ARCH="x64"
|
||||
JAVAFX_JMODS_SHA256='96e520f48610d8ffb94ca30face1f11ffe8a977ddc1c4ff80b1a9e9f048bd94e'
|
||||
JAVAFX_JMODS_SHA256='e0a9c29d8cf3af9b8b48848b43f87b5785bc107c53a951b19668ce05842bba1b'
|
||||
if [ "${CPU_ARCH}" = "aarch64" ]; then
|
||||
JAVAFX_ARCH="aarch64"
|
||||
JAVAFX_JMODS_SHA256='951c52481af0ec5885b06f1ebaa8a10da7e8ea23c5e1ef3e2f6f11fa1b3a7ce1'
|
||||
JAVAFX_JMODS_SHA256='c3408f818693cce09e59829a8e862a82c7695fdfcd585c41cfd527f5fc3fe646'
|
||||
fi
|
||||
|
||||
# download javaFX jmods
|
||||
@@ -99,6 +99,7 @@ ${JAVA_HOME}/bin/jpackage \
|
||||
--java-options "-Dcryptomator.buildNumber=\"appimage-${REVISION_NO}\"" \
|
||||
--java-options "-Dcryptomator.networking.truststore.p12Path=\"/etc/cryptomator/certs.p12\"" \
|
||||
--java-options "-XX:ErrorFile=/cryptomator/cryptomator_crash.log" \
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true" \
|
||||
--resource-dir ../resources
|
||||
|
||||
# transform AppDir
|
||||
@@ -123,7 +124,7 @@ ln -s org.cryptomator.Cryptomator.metainfo.xml Cryptomator.AppDir/usr/share/meta
|
||||
ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun
|
||||
|
||||
# load AppImageTool
|
||||
curl -L https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-${CPU_ARCH}.AppImage -o /tmp/appimagetool.AppImage
|
||||
curl -L https://github.com/AppImage/appimagetool/releases/download/1.9.1/appimagetool-${CPU_ARCH}.AppImage -o /tmp/appimagetool.AppImage
|
||||
chmod +x /tmp/appimagetool.AppImage
|
||||
|
||||
# create AppImage
|
||||
|
||||
@@ -73,6 +73,7 @@
|
||||
<url type="faq">https://community.cryptomator.org/c/kb/faq</url>
|
||||
<url type="help">https://docs.cryptomator.org/</url>
|
||||
<url type="translate">https://translate.cryptomator.org</url>
|
||||
<url type="vcs-browser">https://github.com/cryptomator/cryptomator</url>
|
||||
|
||||
<developer id="de.skymatic">
|
||||
<name>Skymatic GmbH</name>
|
||||
@@ -83,6 +84,15 @@
|
||||
</content_rating>
|
||||
|
||||
<releases>
|
||||
<release date="2026-03-20" version="1.19.2">
|
||||
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.19.2</url>
|
||||
</release>
|
||||
<release date="2026-03-12" version="1.19.1">
|
||||
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.19.1</url>
|
||||
</release>
|
||||
<release date="2026-03-09" version="1.19.0">
|
||||
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.19.0</url>
|
||||
</release>
|
||||
<release date="2025-11-12" version="1.18.0">
|
||||
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.18.0</url>
|
||||
</release>
|
||||
|
||||
1
dist/linux/debian/rules
vendored
1
dist/linux/debian/rules
vendored
@@ -64,6 +64,7 @@ override_dh_auto_build:
|
||||
--java-options "-Dcryptomator.disableUpdateCheck=\"${DISABLE_UPDATE_CHECK}\"" \
|
||||
--java-options "-Dcryptomator.integrationsLinux.autoStartCmd=\"cryptomator\"" \
|
||||
--java-options "-Dcryptomator.networking.truststore.p12Path=\"/etc/cryptomator/certs.p12\"" \
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true" \
|
||||
--app-version "${VERSION_NUM}.${REVISION_NUM}" \
|
||||
--resource-dir resources \
|
||||
--verbose
|
||||
|
||||
119
dist/linux/makepkg/PKGBUILD.template
vendored
Normal file
119
dist/linux/makepkg/PKGBUILD.template
vendored
Normal file
@@ -0,0 +1,119 @@
|
||||
# Maintainer: Aaron Graves <linux@ajgraves.com>
|
||||
# Contributor: Julian Raufelder <arch@raufelder.com>
|
||||
# Contributor: Morten Linderud <morten@linderud.pw>
|
||||
# Contributor: Sebastian Stenzel <sebastian.stenzel@gmail.com>
|
||||
# Contributor: Armin Schrenk <armin.schrenk@skymatic.de>
|
||||
|
||||
pkgname=cryptomator
|
||||
pkgver=$PKG_VERSION
|
||||
pkgrel=$PKG_RELEASE
|
||||
pkgdesc="Multiplatform transparent client-side encryption of your files in the cloud."
|
||||
arch=('any')
|
||||
url="https://cryptomator.org/"
|
||||
license=('GPL3')
|
||||
depends=('fuse3' 'alsa-lib' 'hicolor-icon-theme' 'libxtst' 'libnet' 'libxrender')
|
||||
makedepends=('maven' 'unzip')
|
||||
optdepends=('keepassxc-cryptomator: Use KeePassXC to store vault passwords' 'ttf-hanazono: Install this font when using Japanese system language')
|
||||
_jdkver=25.0.2+10
|
||||
_jfxver=25.0.2
|
||||
_src_app_dir=cryptomator-${pkgver//_/-}
|
||||
source=($SOURCES);
|
||||
source_x86_64=("jdk-${_jdkver}.tar.gz::https://github.com/adoptium/temurin${_jdkver:0:2}-binaries/releases/download/jdk-${_jdkver//\+/%2B}/OpenJDK${_jdkver:0:2}U-jdk_x64_linux_hotspot_${_jdkver//\+/_}.tar.gz"
|
||||
"openjfx-${_jfxver}.zip::https://download2.gluonhq.com/openjfx/${_jfxver}/openjfx-${_jfxver}_linux-x64_bin-jmods.zip")
|
||||
source_aarch64=("jdk-${_jdkver}.tar.gz::https://github.com/adoptium/temurin${_jdkver:0:2}-binaries/releases/download/jdk-${_jdkver//\+/%2B}/OpenJDK${_jdkver:0:2}U-jdk_aarch64_linux_hotspot_${_jdkver//\+/_}.tar.gz"
|
||||
"openjfx-${_jfxver}.zip::https://download2.gluonhq.com/openjfx/${_jfxver}/openjfx-${_jfxver}_linux-aarch64_bin-jmods.zip")
|
||||
noextract=("jdk-${_jdkver}.tar.gz" "openjfx-${_jfxver}.zip")
|
||||
sha256sums=($SOURCES_SHA)
|
||||
sha256sums_x86_64=('987387933b64b9833846dee373b640440d3e1fd48a04804ec01a6dbf718e8ab8'
|
||||
'e0a9c29d8cf3af9b8b48848b43f87b5785bc107c53a951b19668ce05842bba1b')
|
||||
sha256sums_aarch64=('a9d73e711d967dc44896d4f430f73a68fd33590dabc29a7f2fb9f593425b854c'
|
||||
'c3408f818693cce09e59829a8e862a82c7695fdfcd585c41cfd527f5fc3fe646')
|
||||
options=('!strip')
|
||||
|
||||
validpgpkeys=('58117AFA1F85B3EEC154677D615D449FE6E6A235')
|
||||
|
||||
build() {
|
||||
export JAVA_HOME="${srcdir}/jdk-${_jdkver}"
|
||||
JMODS_PATH="${srcdir}/openjfx-${_jfxver}-jmods"
|
||||
#JEP 493
|
||||
if ! $(${JAVA_HOME}/bin/jlink --help | grep -q "Linking from run-time image enabled"); then
|
||||
JMODS_PATH="${JMODS_PATH}:${JAVA_HOME}/jmods:"
|
||||
fi
|
||||
|
||||
tar xfz "jdk-${_jdkver}.tar.gz"
|
||||
|
||||
mkdir "openjfx-${_jfxver}-jmods"
|
||||
unzip -j "openjfx-${_jfxver}.zip" \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d "openjfx-${_jfxver}-jmods"
|
||||
|
||||
cd "${srcdir}/${_src_app_dir}"
|
||||
|
||||
mvn -B clean package -DskipTests -Plinux
|
||||
|
||||
cp LICENSE.txt target
|
||||
cp target/cryptomator-*.jar target/mods
|
||||
|
||||
cd target
|
||||
|
||||
"$JAVA_HOME/bin/jlink" \
|
||||
--output runtime \
|
||||
--module-path "$JMODS_PATH" \
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.crypto.ec,jdk.crypto.cryptoki,jdk.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net,java.compiler \
|
||||
--strip-native-commands \
|
||||
--no-header-files \
|
||||
--no-man-pages \
|
||||
--strip-debug \
|
||||
--compress=zip-0
|
||||
|
||||
##Note: jpackage does not allow -beta suffixes, have to strip those
|
||||
"$JAVA_HOME/bin/jpackage" \
|
||||
--type app-image \
|
||||
--runtime-image runtime \
|
||||
--input libs \
|
||||
--module-path mods \
|
||||
--module org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator \
|
||||
--dest . \
|
||||
--name cryptomator \
|
||||
--vendor "Skymatic GmbH" \
|
||||
--copyright "(C) 2016 - 2026 Skymatic GmbH" \
|
||||
--java-options "--enable-preview" \
|
||||
--java-options '--enable-native-access=javafx.graphics,org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator' \
|
||||
--java-options "-Xss5m" \
|
||||
--java-options "-Xmx256m" \
|
||||
--java-options "-Dfile.encoding=\"utf-8\"" \
|
||||
--java-options "-Djava.net.useSystemProxies=true" \
|
||||
--java-options "-Dcryptomator.adminConfigPath=\"/etc/cryptomator/config.properties\"" \
|
||||
--java-options "-Dcryptomator.appVersion=\"${pkgver//_/-}\"" \
|
||||
--java-options "-Dcryptomator.buildNumber=\"aur-${pkgrel}\"" \
|
||||
--java-options "-Dcryptomator.disableUpdateCheck=true" \
|
||||
--java-options "-Dcryptomator.integrationsLinux.autoStartCmd=\"cryptomator\"" \
|
||||
--java-options "-Dcryptomator.ipcSocketPath=\"@{userhome}/.config/Cryptomator/ipc.socket\"" \
|
||||
--java-options "-Dcryptomator.logDir=\"@{userhome}/.local/share/Cryptomator/logs\"" \
|
||||
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/.local/share/Cryptomator/mnt\"" \
|
||||
--java-options "-Dcryptomator.networking.truststore.p12Path=\"/etc/cryptomator/certs.p12\"" \
|
||||
--java-options "-Dcryptomator.pluginDir=\"@{userhome}/.local/share/Cryptomator/plugins\"" \
|
||||
--java-options "-Dcryptomator.p12Path=\"@{userhome}/.config/Cryptomator/key.p12\"" \
|
||||
--java-options "-Dcryptomator.settingsPath=\"@{userhome}/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json\"" \
|
||||
--java-options "-Dcryptomator.showTrayIcon=true" \
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true" \
|
||||
--app-version "${pkgver//_*/}" \
|
||||
--verbose
|
||||
}
|
||||
|
||||
package() {
|
||||
install -Dm644 "${srcdir}/${_src_app_dir}/dist/linux/common/application-vnd.cryptomator.vault.xml" "${pkgdir}/usr/share/mime/packages/cryptomator-vault.xml"
|
||||
install -Dm644 "${srcdir}/${_src_app_dir}/dist/linux/common/org.cryptomator.Cryptomator.desktop" "${pkgdir}/usr/share/applications/org.cryptomator.Cryptomator.desktop"
|
||||
install -Dm644 "${srcdir}/${_src_app_dir}/dist/linux/common/org.cryptomator.Cryptomator256.png" "${pkgdir}/usr/share/icons/hicolor/256x256/apps/org.cryptomator.Cryptomator.png"
|
||||
install -Dm644 "${srcdir}/${_src_app_dir}/dist/linux/common/org.cryptomator.Cryptomator512.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/org.cryptomator.Cryptomator.png"
|
||||
install -Dm644 "${srcdir}/${_src_app_dir}/dist/linux/common/org.cryptomator.Cryptomator.svg" "${pkgdir}/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg"
|
||||
install -Dm644 "${srcdir}/${_src_app_dir}/dist/linux/common/org.cryptomator.Cryptomator.tray.svg" "${pkgdir}/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.tray.svg"
|
||||
install -Dm644 "${srcdir}/${_src_app_dir}/dist/linux/common/org.cryptomator.Cryptomator.tray-unlocked.svg" "${pkgdir}/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.tray-unlocked.svg"
|
||||
install -Dm644 "${srcdir}/${_src_app_dir}/dist/linux/common/org.cryptomator.Cryptomator.tray.svg" "${pkgdir}/usr/share/icons/hicolor/symbolic/apps/org.cryptomator.Cryptomator.tray-symbolic.svg"
|
||||
install -Dm644 "${srcdir}/${_src_app_dir}/dist/linux/common/org.cryptomator.Cryptomator.tray-unlocked.svg" "${pkgdir}/usr/share/icons/hicolor/symbolic/apps/org.cryptomator.Cryptomator.tray-unlocked-symbolic.svg"
|
||||
|
||||
mkdir -p "${pkgdir}/opt/cryptomator/"
|
||||
cp -R "${srcdir}/${_src_app_dir}/target/cryptomator" "${pkgdir}/opt/"
|
||||
install -Dm644 "${srcdir}/${_src_app_dir}/target/LICENSE.txt" -t "${pkgdir}/usr/share/licenses/${pkgname}"
|
||||
|
||||
mkdir -p "${pkgdir}/usr/bin"
|
||||
ln -s "/opt/cryptomator/bin/cryptomator" "${pkgdir}/usr/bin/cryptomator"
|
||||
}
|
||||
1
dist/mac/.gitignore
vendored
1
dist/mac/.gitignore
vendored
@@ -1,2 +1 @@
|
||||
embedded.provisionprofile
|
||||
xcuserdata/
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
//
|
||||
// CryptomatorDockTilePlugin.swift
|
||||
// Integrations
|
||||
//
|
||||
// Created by Tobias Hagemann on 22.09.25.
|
||||
// Copyright © 2025 Cryptomator. All rights reserved.
|
||||
//
|
||||
|
||||
import AppKit
|
||||
|
||||
class CryptomatorDockTilePlugin: NSObject, NSDockTilePlugIn {
|
||||
func setDockTile(_ dockTile: NSDockTile?) {
|
||||
guard let dockTile = dockTile, let image = Bundle(for: Self.self).image(forResource: "Cryptomator") else {
|
||||
return
|
||||
}
|
||||
dockTile.contentView = NSImageView(image: image)
|
||||
dockTile.display()
|
||||
}
|
||||
}
|
||||
@@ -1,314 +0,0 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 77;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
74E08DE12E8584DE007E665C /* CryptomatorDockTilePlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74E08DE02E85847E007E665C /* CryptomatorDockTilePlugin.swift */; };
|
||||
74E08DED2E858532007E665C /* Cryptomator.icns in Resources */ = {isa = PBXBuildFile; fileRef = 74E08DEC2E858532007E665C /* Cryptomator.icns */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
74E08DD92E858467007E665C /* Cryptomator.docktileplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Cryptomator.docktileplugin; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
74E08DE02E85847E007E665C /* CryptomatorDockTilePlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CryptomatorDockTilePlugin.swift; sourceTree = "<group>"; };
|
||||
74E08DEC2E858532007E665C /* Cryptomator.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Cryptomator.icns; path = ../resources/Cryptomator.icns; sourceTree = SOURCE_ROOT; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
74E08DD62E858467007E665C /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
74E08DD02E858467007E665C = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
74E08DE02E85847E007E665C /* CryptomatorDockTilePlugin.swift */,
|
||||
74E08DEC2E858532007E665C /* Cryptomator.icns */,
|
||||
74E08DDA2E858467007E665C /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
74E08DDA2E858467007E665C /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
74E08DD92E858467007E665C /* Cryptomator.docktileplugin */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
74E08DD82E858467007E665C /* DockTilePlugin */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 74E08DDD2E858467007E665C /* Build configuration list for PBXNativeTarget "DockTilePlugin" */;
|
||||
buildPhases = (
|
||||
74E08DD52E858467007E665C /* Sources */,
|
||||
74E08DD62E858467007E665C /* Frameworks */,
|
||||
74E08DD72E858467007E665C /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = DockTilePlugin;
|
||||
packageProductDependencies = (
|
||||
);
|
||||
productName = DockTilePlugin;
|
||||
productReference = 74E08DD92E858467007E665C /* Cryptomator.docktileplugin */;
|
||||
productType = "com.apple.product-type.bundle";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
74E08DD12E858467007E665C /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
BuildIndependentTargetsInParallel = 1;
|
||||
LastUpgradeCheck = 2600;
|
||||
ORGANIZATIONNAME = Cryptomator;
|
||||
TargetAttributes = {
|
||||
74E08DD82E858467007E665C = {
|
||||
CreatedOnToolsVersion = 26.0.1;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 74E08DD42E858467007E665C /* Build configuration list for PBXProject "DockTilePlugin" */;
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
);
|
||||
mainGroup = 74E08DD02E858467007E665C;
|
||||
minimizedProjectReferenceProxies = 1;
|
||||
preferredProjectObjectVersion = 77;
|
||||
productRefGroup = 74E08DDA2E858467007E665C /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
74E08DD82E858467007E665C /* DockTilePlugin */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
74E08DD72E858467007E665C /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
74E08DED2E858532007E665C /* Cryptomator.icns in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
74E08DD52E858467007E665C /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
74E08DE12E8584DE007E665C /* CryptomatorDockTilePlugin.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
74E08DDB2E858467007E665C /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = YZQJQUHA3L;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 11.5;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
74E08DDC2E858467007E665C /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = YZQJQUHA3L;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 11.5;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
74E08DDE2E858467007E665C /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 Cryptomator. All rights reserved.";
|
||||
INFOPLIST_KEY_NSPrincipalClass = CryptomatorDockTilePlugin;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles";
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cryptomator.DockTilePlugin;
|
||||
PRODUCT_NAME = Cryptomator;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
WRAPPER_EXTENSION = docktileplugin;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
74E08DDF2E858467007E665C /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 Cryptomator. All rights reserved.";
|
||||
INFOPLIST_KEY_NSPrincipalClass = CryptomatorDockTilePlugin;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles";
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cryptomator.DockTilePlugin;
|
||||
PRODUCT_NAME = Cryptomator;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
WRAPPER_EXTENSION = docktileplugin;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
74E08DD42E858467007E665C /* Build configuration list for PBXProject "DockTilePlugin" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
74E08DDB2E858467007E665C /* Debug */,
|
||||
74E08DDC2E858467007E665C /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
74E08DDD2E858467007E665C /* Build configuration list for PBXNativeTarget "DockTilePlugin" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
74E08DDE2E858467007E665C /* Debug */,
|
||||
74E08DDF2E858467007E665C /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 74E08DD12E858467007E665C /* Project object */;
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
@@ -1,67 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "2600"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES"
|
||||
buildArchitectures = "Automatic">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "74E08DD82E858467007E665C"
|
||||
BuildableName = "Cryptomator.docktileplugin"
|
||||
BlueprintName = "DockTilePlugin"
|
||||
ReferencedContainer = "container:DockTilePlugin.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
shouldAutocreateTestPlan = "YES">
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "74E08DD82E858467007E665C"
|
||||
BuildableName = "Cryptomator.docktileplugin"
|
||||
BlueprintName = "DockTilePlugin"
|
||||
ReferencedContainer = "container:DockTilePlugin.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
21
dist/mac/dmg/build.sh
vendored
21
dist/mac/dmg/build.sh
vendored
@@ -32,15 +32,15 @@ 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'`
|
||||
FUSE_LIB="FUSE-T"
|
||||
|
||||
JAVAFX_VERSION=25
|
||||
JAVAFX_VERSION=25.0.2
|
||||
JAVAFX_ARCH="undefined"
|
||||
JAVAFX_JMODS_SHA256="undefined"
|
||||
if [ "$(machine)" = "arm64e" ]; then
|
||||
JAVAFX_ARCH="aarch64"
|
||||
JAVAFX_JMODS_SHA256="13f8c0513c40c95881479fbcf0465a29a60217393fb0656f5e4eab78a9442fba"
|
||||
JAVAFX_JMODS_SHA256="4cd258001c75af7047005c5c891e2400ed11d24fbb09412324c0cbaf8b503c5a"
|
||||
else
|
||||
JAVAFX_ARCH="x64"
|
||||
JAVAFX_JMODS_SHA256="0eba73fb28a24c845175d16fa2f8c081c936ce6de1be9b79eb6119fa32e53d52"
|
||||
JAVAFX_JMODS_SHA256="0b4d8463f03901b7425d94628e4116b7078abb8dd540fbec415266fac20bda5c"
|
||||
fi
|
||||
JAVAFX_JMODS_URL="https://download2.gluonhq.com/openjfx/${JAVAFX_VERSION}/openjfx-${JAVAFX_VERSION}_osx-${JAVAFX_ARCH}_bin-jmods.zip"
|
||||
|
||||
@@ -125,28 +125,17 @@ ${JAVA_HOME}/bin/jpackage \
|
||||
--java-options "-Dcryptomator.showTrayIcon=true" \
|
||||
--java-options "-Dcryptomator.updateMechanism=org.cryptomator.macos.update.DmgUpdateMechanism" \
|
||||
--java-options "-Dcryptomator.buildNumber=\"dmg-${REVISION_NO}\"" \
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true" \
|
||||
--mac-package-identifier ${PACKAGE_IDENTIFIER} \
|
||||
--resource-dir ../resources
|
||||
|
||||
# transform app dir
|
||||
cp ../resources/${APP_NAME}-Vault.icns ${APP_NAME}.app/Contents/Resources/
|
||||
cp ../resources/Assets.car ${APP_NAME}.app/Contents/Resources/
|
||||
sed -i '' "s|###BUNDLE_SHORT_VERSION_STRING###|${VERSION_NO}|g" ${APP_NAME}.app/Contents/Info.plist
|
||||
sed -i '' "s|###BUNDLE_VERSION###|${REVISION_NO}|g" ${APP_NAME}.app/Contents/Info.plist
|
||||
cp ../embedded.provisionprofile ${APP_NAME}.app/Contents/
|
||||
|
||||
# build and install dock tile plugin
|
||||
echo "Building and installing Cryptomator.docktileplugin..."
|
||||
DERIVED_DATA_PATH=../DockTilePlugin/build
|
||||
xcodebuild -project ../DockTilePlugin/DockTilePlugin.xcodeproj \
|
||||
-scheme DockTilePlugin \
|
||||
-configuration Release \
|
||||
-derivedDataPath ${DERIVED_DATA_PATH} \
|
||||
-quiet \
|
||||
clean build
|
||||
mkdir -p ${APP_NAME}.app/Contents/PlugIns
|
||||
cp -R ${DERIVED_DATA_PATH}/Build/Products/Release/Cryptomator.docktileplugin ${APP_NAME}.app/Contents/PlugIns/
|
||||
rm -rf ${DERIVED_DATA_PATH}
|
||||
|
||||
# generate license
|
||||
mvn -B -f../../../pom.xml license:add-third-party \
|
||||
-Dlicense.thirdPartyFilename=license.rtf \
|
||||
|
||||
BIN
dist/mac/resources/Assets.car
vendored
Normal file
BIN
dist/mac/resources/Assets.car
vendored
Normal file
Binary file not shown.
5
dist/mac/resources/Info.plist
vendored
5
dist/mac/resources/Info.plist
vendored
@@ -12,6 +12,8 @@
|
||||
<string>Cryptomator</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>Cryptomator.icns</string>
|
||||
<key>CFBundleIconName</key>
|
||||
<string>Cryptomator</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>org.cryptomator</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
@@ -117,8 +119,5 @@
|
||||
<!-- allow utilization of integrated GPU, see https://developer.apple.com/library/mac/qa/qa1734/_index.html -->
|
||||
<key>NSSupportsAutomaticGraphicsSwitching</key>
|
||||
<true/>
|
||||
<!-- register dock tile plugin -->
|
||||
<key>NSDockTilePlugIn</key>
|
||||
<string>Cryptomator.docktileplugin</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
13
dist/win/build.ps1
vendored
13
dist/win/build.ps1
vendored
@@ -34,20 +34,20 @@ if ((Get-Command "mvn" -ErrorAction SilentlyContinue) -eq $null)
|
||||
}
|
||||
if ((Get-Command 'wix' -ErrorAction SilentlyContinue) -eq $null)
|
||||
{
|
||||
Write-Error 'Unable to find wix in your PATH (try: dotnet tool install --global wix --version 6.0.0)'
|
||||
Write-Error 'Unable to find wix in your PATH (try: dotnet tool install --global wix --version 6.0.2)'
|
||||
exit 1
|
||||
}
|
||||
$wixExtensions = & wix.exe extension list --global | Out-String
|
||||
if ($wixExtensions -notmatch 'WixToolset.UI.wixext') {
|
||||
Write-Error 'Wix UI extension missing. Please install it with: wix.exe extension add WixToolset.UI.wixext/6.0.0 --global)'
|
||||
Write-Error 'Wix UI extension missing. Please install it with: wix.exe extension add WixToolset.UI.wixext/6.0.2 --global)'
|
||||
exit 1
|
||||
}
|
||||
if ($wixExtensions -notmatch 'WixToolset.Util.wixext') {
|
||||
Write-Error 'Wix Util extension missing. Please install it with: wix.exe extension add WixToolset.Util.wixext/6.0.0 --global)'
|
||||
Write-Error 'Wix Util extension missing. Please install it with: wix.exe extension add WixToolset.Util.wixext/6.0.2 --global)'
|
||||
exit 1
|
||||
}
|
||||
if ($wixExtensions -notmatch 'WixToolset.BootstrapperApplications.wixext') {
|
||||
Write-Error 'Wix Bootstrapper extension missing. Please install it with: wix.exe extension add WixToolset.BootstrapperApplications.wixext/6.0.0 --global)'
|
||||
Write-Error 'Wix Bootstrapper extension missing. Please install it with: wix.exe extension add WixToolset.BootstrapperApplications.wixext/6.0.2 --global)'
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -93,9 +93,9 @@ switch ($archName) {
|
||||
$jmodPaths = "$Env:JAVA_HOME/jmods"
|
||||
}
|
||||
'x64' {
|
||||
$javaFxVersion='25'
|
||||
$javaFxVersion='25.0.2'
|
||||
$javaFxJmodsUrl = "https://download2.gluonhq.com/openjfx/${javaFxVersion}/openjfx-${javaFxVersion}_windows-x64_bin-jmods.zip"
|
||||
$javaFxJmodsSHA256 = 'c8eb9fd039b00e0020cf6c3db8ed7876bf3ee4d27860aa697a247b83b8296ae7'
|
||||
$javaFxJmodsSHA256 = '33d878dfac85590c4d77c518ed413e512d34a8479d90132b230a7ddd173576b3'
|
||||
$javaFxJmods = '.\resources\jfxJmods.zip'
|
||||
|
||||
if( !(Test-Path -Path $javaFxJmods) ) {
|
||||
@@ -167,6 +167,7 @@ $javaOptions = @(
|
||||
"--java-options", "-Dcryptomator.showTrayIcon=true"
|
||||
"--java-options", "-Dcryptomator.buildNumber=`"msi-$revisionNo`""
|
||||
"--java-options", "-Dcryptomator.disableUpdateCheck=false"
|
||||
"--java-options", "-Dcryptomator.hub.enableTrustOnFirstUse=true"
|
||||
)
|
||||
|
||||
|
||||
|
||||
2
dist/win/resources/main.wxs
vendored
2
dist/win/resources/main.wxs
vendored
@@ -109,7 +109,7 @@
|
||||
</ns0:CreateFolder>
|
||||
</ns0:Component>
|
||||
<ns0:Component Id="AdminConfigFile" NeverOverwrite="yes" Permanent="yes">
|
||||
<ns0:File Id="EmptyAdminConfig" Source="$(env.JP_WIXWIZARD_RESOURCES)\..\..\common\cryptomator.config" Name="cryptomator.config" KeyPath="yes">
|
||||
<ns0:File Id="EmptyAdminConfig" Source="$(env.JP_WIXWIZARD_RESOURCES)\..\..\common\config.properties" Name="config.properties" KeyPath="yes">
|
||||
<util:PermissionEx User="SYSTEM" GenericAll="yes"/>
|
||||
<util:PermissionEx User="Administrators" GenericAll="yes"/>
|
||||
<util:PermissionEx User="Users" GenericRead="yes" GenericExecute="yes"/>
|
||||
|
||||
50
pom.xml
50
pom.xml
@@ -3,7 +3,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>cryptomator</artifactId>
|
||||
<version>1.19.0-SNAPSHOT</version>
|
||||
<version>1.19.2</version>
|
||||
<name>Cryptomator Desktop App</name>
|
||||
|
||||
<organization>
|
||||
@@ -33,45 +33,46 @@
|
||||
<nonModularGroupIds>org.ow2.asm,org.apache.jackrabbit,org.apache.httpcomponents</nonModularGroupIds>
|
||||
|
||||
<!-- cryptomator dependencies -->
|
||||
<cryptomator.cryptofs.version>2.10.0-beta3</cryptomator.cryptofs.version>
|
||||
<cryptomator.cryptofs.version>2.10.0</cryptomator.cryptofs.version>
|
||||
<cryptomator.cryptolib.version>2.2.2</cryptomator.cryptolib.version>
|
||||
<cryptomator.integrations.version>1.8.0-beta1</cryptomator.integrations.version>
|
||||
<cryptomator.integrations.version>1.8.0</cryptomator.integrations.version>
|
||||
<cryptomator.integrations.win.version>1.6.0</cryptomator.integrations.win.version>
|
||||
<cryptomator.integrations.mac.version>1.5.0-beta3</cryptomator.integrations.mac.version>
|
||||
<cryptomator.integrations.linux.version>1.7.0-beta4</cryptomator.integrations.linux.version>
|
||||
<cryptomator.fuse.version>6.0.0</cryptomator.fuse.version>
|
||||
<cryptomator.integrations.mac.version>1.5.0</cryptomator.integrations.mac.version>
|
||||
<cryptomator.integrations.linux.version>1.7.0</cryptomator.integrations.linux.version>
|
||||
<cryptomator.fuse.version>6.0.1</cryptomator.fuse.version>
|
||||
<cryptomator.webdav.version>3.0.1</cryptomator.webdav.version>
|
||||
<cryptomator.webdav-servlet.version>1.2.12</cryptomator.webdav-servlet.version>
|
||||
|
||||
<!-- 3rd party dependencies -->
|
||||
<caffeine.version>3.2.3</caffeine.version>
|
||||
<commons-lang3.version>3.20.0</commons-lang3.version>
|
||||
<dagger.version>2.59.1</dagger.version>
|
||||
<dagger.version>2.59.2</dagger.version>
|
||||
<easybind.version>2.2</easybind.version>
|
||||
<jackson.version>2.21.0</jackson.version>
|
||||
<javafx.version>25</javafx.version>
|
||||
<jwt.version>4.5.0</jwt.version>
|
||||
<jackson.version>2.21.1</jackson.version>
|
||||
<javafx.version>25.0.2</javafx.version>
|
||||
<jwt.version>4.5.1</jwt.version>
|
||||
<nimbus-jose.version>10.5</nimbus-jose.version>
|
||||
<logback.version>1.5.31</logback.version>
|
||||
<logback.version>1.5.32</logback.version>
|
||||
<slf4j.version>2.0.17</slf4j.version>
|
||||
<tinyoauth2.version>0.8.1</tinyoauth2.version>
|
||||
<zxcvbn.version>1.9.0</zxcvbn.version>
|
||||
|
||||
<!-- test dependencies -->
|
||||
<junit.jupiter.version>5.13.4</junit.jupiter.version>
|
||||
<mockito.version>5.20.0</mockito.version>
|
||||
<junit.jupiter.version>6.0.3</junit.jupiter.version>
|
||||
<mockito.version>5.22.0</mockito.version>
|
||||
<hamcrest.version>3.0</hamcrest.version>
|
||||
|
||||
<!-- build-time dependencies -->
|
||||
<jetbrains.annotations.version>26.0.2-1</jetbrains.annotations.version>
|
||||
<dependency-check.version>12.1.5</dependency-check.version>
|
||||
<jetbrains.annotations.version>26.1.0</jetbrains.annotations.version>
|
||||
<dependency-check.version>12.2.0</dependency-check.version>
|
||||
<jacoco.version>0.8.14</jacoco.version>
|
||||
<license-generator.version>2.7.0</license-generator.version>
|
||||
<junit-tree-reporter.version>1.4.0</junit-tree-reporter.version>
|
||||
<mvn-compiler.version>3.14.1</mvn-compiler.version>
|
||||
<mvn-resources.version>3.3.1</mvn-resources.version>
|
||||
<mvn-dependency.version>3.8.1</mvn-dependency.version>
|
||||
<mvn-surefire.version>3.5.4</mvn-surefire.version>
|
||||
<mvn-jar.version>3.4.2</mvn-jar.version>
|
||||
<license-generator.version>2.7.1</license-generator.version>
|
||||
<junit-tree-reporter.version>1.5.1</junit-tree-reporter.version>
|
||||
<mvn-compiler.version>3.15.0</mvn-compiler.version>
|
||||
<mvn-resources.version>3.5.0</mvn-resources.version>
|
||||
<mvn-dependency.version>3.10.0</mvn-dependency.version>
|
||||
<mvn-surefire.version>3.5.3</mvn-surefire.version>
|
||||
<mvn-jar.version>3.5.0</mvn-jar.version>
|
||||
|
||||
<!-- Property used by surefire to determine jacoco engine -->
|
||||
<surefire.jacoco.args></surefire.jacoco.args>
|
||||
@@ -93,6 +94,11 @@
|
||||
|
||||
<dependencies>
|
||||
<!-- Cryptomator Libs -->
|
||||
<dependency>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>webdav-nio-adapter-servlet</artifactId>
|
||||
<version>${cryptomator.webdav-servlet.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>cryptolib</artifactId>
|
||||
|
||||
@@ -13,6 +13,7 @@ import org.cryptomator.common.locationpresets.OneDriveLinuxLocationPresetsProvid
|
||||
import org.cryptomator.common.locationpresets.OneDriveMacLocationPresetsProvider;
|
||||
import org.cryptomator.common.locationpresets.OneDriveWindowsLocationPresetsProvider;
|
||||
import org.cryptomator.common.locationpresets.PCloudLocationPresetsProvider;
|
||||
import org.cryptomator.integrations.revealpath.RevealPathService;
|
||||
import org.cryptomator.integrations.tray.TrayMenuController;
|
||||
import org.cryptomator.integrations.uiappearance.UiAppearanceProvider;
|
||||
import org.cryptomator.logging.LogbackConfiguratorFactory;
|
||||
@@ -20,6 +21,7 @@ import org.cryptomator.networking.SSLContextProvider;
|
||||
import org.cryptomator.networking.SSLContextWithMacKeychain;
|
||||
import org.cryptomator.networking.SSLContextWithPKCS12TrustStore;
|
||||
import org.cryptomator.networking.SSLContextWithWindowsCertStore;
|
||||
import org.cryptomator.ui.fxapp.JfxRevealPathService;
|
||||
import org.cryptomator.ui.fxapp.JfxUiAppearanceProvider;
|
||||
import org.cryptomator.ui.traymenu.AwtTrayMenuController;
|
||||
|
||||
@@ -64,6 +66,7 @@ open module org.cryptomator.desktop {
|
||||
uses org.cryptomator.event.NotificationHandler;
|
||||
|
||||
provides UiAppearanceProvider with JfxUiAppearanceProvider;
|
||||
provides RevealPathService with JfxRevealPathService;
|
||||
provides TrayMenuController with AwtTrayMenuController;
|
||||
provides Configurator with LogbackConfiguratorFactory;
|
||||
provides SSLContextProvider with SSLContextWithWindowsCertStore, SSLContextWithMacKeychain, SSLContextWithPKCS12TrustStore;
|
||||
|
||||
@@ -22,8 +22,6 @@ import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.Comparator;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.SynchronousQueue;
|
||||
@@ -76,8 +74,8 @@ public abstract class CommonsModule {
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
static Optional<RevealPathService> provideRevealPathService() {
|
||||
return RevealPathService.get().findFirst();
|
||||
static RevealPathService provideRevealPathService() {
|
||||
return RevealPathService.get().findFirst().orElseThrow();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -9,10 +9,13 @@ import org.slf4j.LoggerFactory;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.Spliterator;
|
||||
import java.util.Spliterators;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
@@ -20,20 +23,22 @@ public class Environment {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(Environment.class);
|
||||
private static final int DEFAULT_MIN_PW_LENGTH = 8;
|
||||
private static final String SETTINGS_PATH_PROP_NAME = "cryptomator.settingsPath";
|
||||
private static final String IPC_SOCKET_PATH_PROP_NAME = "cryptomator.ipcSocketPath";
|
||||
private static final String KEYCHAIN_PATHS_PROP_NAME = "cryptomator.integrationsWin.keychainPaths";
|
||||
private static final String WINDOWS_HELLO_KEYCHAIN_PATHS_PROP_NAME = "cryptomator.integrationsWin.windowsHelloKeychainPaths";
|
||||
private static final String P12_PATH_PROP_NAME = "cryptomator.p12Path";
|
||||
private static final String LOG_DIR_PROP_NAME = "cryptomator.logDir";
|
||||
private static final String LOOPBACK_ALIAS_PROP_NAME = "cryptomator.loopbackAlias";
|
||||
private static final String MOUNTPOINT_DIR_PROP_NAME = "cryptomator.mountPointsDir";
|
||||
private static final String MIN_PW_LENGTH_PROP_NAME = "cryptomator.minPwLength";
|
||||
private static final String APP_VERSION_PROP_NAME = "cryptomator.appVersion";
|
||||
private static final String BUILD_NUMBER_PROP_NAME = "cryptomator.buildNumber";
|
||||
private static final String PLUGIN_DIR_PROP_NAME = "cryptomator.pluginDir";
|
||||
private static final String TRAY_ICON_PROP_NAME = "cryptomator.showTrayIcon";
|
||||
private static final String DISABLE_UPDATE_CHECK_PROP_NAME = "cryptomator.disableUpdateCheck";
|
||||
public static final String SETTINGS_PATH_PROP_NAME = "cryptomator.settingsPath";
|
||||
public static final String IPC_SOCKET_PATH_PROP_NAME = "cryptomator.ipcSocketPath";
|
||||
public static final String KEYCHAIN_PATHS_PROP_NAME = "cryptomator.integrationsWin.keychainPaths";
|
||||
public static final String WINDOWS_HELLO_KEYCHAIN_PATHS_PROP_NAME = "cryptomator.integrationsWin.windowsHelloKeychainPaths";
|
||||
public static final String P12_PATH_PROP_NAME = "cryptomator.p12Path";
|
||||
public static final String LOG_DIR_PROP_NAME = "cryptomator.logDir";
|
||||
public static final String LOOPBACK_ALIAS_PROP_NAME = "cryptomator.loopbackAlias";
|
||||
public static final String MOUNTPOINT_DIR_PROP_NAME = "cryptomator.mountPointsDir";
|
||||
public static final String MIN_PW_LENGTH_PROP_NAME = "cryptomator.minPwLength";
|
||||
public static final String APP_VERSION_PROP_NAME = "cryptomator.appVersion";
|
||||
public static final String BUILD_NUMBER_PROP_NAME = "cryptomator.buildNumber";
|
||||
public static final String PLUGIN_DIR_PROP_NAME = "cryptomator.pluginDir";
|
||||
public static final String TRAY_ICON_PROP_NAME = "cryptomator.showTrayIcon";
|
||||
public static final String DISABLE_UPDATE_CHECK_PROP_NAME = "cryptomator.disableUpdateCheck";
|
||||
public static final String HUB_ALLOWED_HOSTS_PROP_NAME = "cryptomator.hub.allowedHosts";
|
||||
public static final String HUB_TOFU_PROP_NAME = "cryptomator.hub.enableTrustOnFirstUse";
|
||||
|
||||
private Environment() {}
|
||||
|
||||
@@ -57,6 +62,8 @@ public class Environment {
|
||||
logCryptomatorSystemProperty(PLUGIN_DIR_PROP_NAME);
|
||||
logCryptomatorSystemProperty(TRAY_ICON_PROP_NAME);
|
||||
logCryptomatorSystemProperty(DISABLE_UPDATE_CHECK_PROP_NAME);
|
||||
logCryptomatorSystemProperty(HUB_ALLOWED_HOSTS_PROP_NAME);
|
||||
logCryptomatorSystemProperty(HUB_TOFU_PROP_NAME);
|
||||
}
|
||||
|
||||
public static Environment getInstance() {
|
||||
@@ -145,6 +152,18 @@ public class Environment {
|
||||
return Boolean.getBoolean(DISABLE_UPDATE_CHECK_PROP_NAME);
|
||||
}
|
||||
|
||||
public Set<String> hubAllowedHosts() {
|
||||
var allowedHubHostsString = System.getProperty(HUB_ALLOWED_HOSTS_PROP_NAME, "");
|
||||
return Arrays.stream(allowedHubHostsString.split(","))
|
||||
.map(String::trim)
|
||||
.filter(Predicate.not(String::isEmpty))
|
||||
.collect(Collectors.toUnmodifiableSet());
|
||||
}
|
||||
|
||||
public boolean hubTrustOnFirstUse() {
|
||||
return Boolean.getBoolean(HUB_TOFU_PROP_NAME);
|
||||
}
|
||||
|
||||
private Optional<Path> getPath(String propertyName) {
|
||||
String value = System.getProperty(propertyName);
|
||||
return Optional.ofNullable(value).map(Paths::get);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package org.cryptomator.common;
|
||||
|
||||
import org.jetbrains.annotations.VisibleForTesting;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
@@ -13,10 +13,12 @@ public class SubstitutingProperties extends PropertiesDecorator {
|
||||
private static final Pattern TEMPLATE = Pattern.compile("@\\{(\\w+)}");
|
||||
|
||||
private final Map<String, String> env;
|
||||
private final Logger logger;
|
||||
|
||||
public SubstitutingProperties(Properties props, Map<String, String> systemEnvironment) {
|
||||
public SubstitutingProperties(Properties props, Map<String, String> systemEnvironment, Logger logger) {
|
||||
super(props);
|
||||
this.env = systemEnvironment;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -44,7 +46,7 @@ public class SubstitutingProperties extends PropertiesDecorator {
|
||||
case "localappdata" -> resolveFrom("LOCALAPPDATA", Source.ENV);
|
||||
case "userhome" -> resolveFrom("user.home", Source.PROPS);
|
||||
default -> {
|
||||
LoggerFactory.getLogger(SubstitutingProperties.class).warn("Unknown variable {} in property value {}.", match.group(), value);
|
||||
logger.warn("Unknown variable {} in property value {}.", match.group(), value);
|
||||
yield match.group();
|
||||
}
|
||||
});
|
||||
@@ -56,7 +58,7 @@ public class SubstitutingProperties extends PropertiesDecorator {
|
||||
case PROPS -> delegate.getProperty(key);
|
||||
};
|
||||
if (val == null) {
|
||||
LoggerFactory.getLogger(SubstitutingProperties.class).warn("Variable {} used for substitution not found in {}. Replaced with empty string.", key, src);
|
||||
logger.warn("Variable {} used for substitution not found in {}. Replaced with empty string.", key, src);
|
||||
return "";
|
||||
} else {
|
||||
return Matcher.quoteReplacement(val);
|
||||
|
||||
@@ -24,9 +24,12 @@ import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.collections.ObservableSet;
|
||||
import javafx.geometry.NodeOrientation;
|
||||
import java.nio.file.Path;
|
||||
import java.time.Instant;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class Settings {
|
||||
|
||||
@@ -78,6 +81,7 @@ public class Settings {
|
||||
public final ObjectProperty<Instant> lastSuccessfulUpdateCheck;
|
||||
public final ObjectProperty<Path> previouslyUsedVaultDirectory;
|
||||
public final StringProperty lastUpdateAttemptedByVersion;
|
||||
public final ObservableSet<String> trustedHosts;
|
||||
|
||||
public static Settings create(SettingsProvider provider, Environment env) {
|
||||
var defaults = new SettingsJson();
|
||||
@@ -118,6 +122,7 @@ public class Settings {
|
||||
this.lastSuccessfulUpdateCheck = new SimpleObjectProperty<>(this, "lastSuccessfulUpdateCheck", json.lastSuccessfulUpdateCheck);
|
||||
this.previouslyUsedVaultDirectory = new SimpleObjectProperty<>(this, "previouslyUsedVaultDirectory", json.previouslyUsedVaultDirectory);
|
||||
this.lastUpdateAttemptedByVersion = new SimpleStringProperty(this, "lastUpdateAttemptedByVersion", json.lastUpdateAttemptedByVersion);
|
||||
this.trustedHosts = FXCollections.observableSet(json.trustedHosts);
|
||||
|
||||
this.directories.addAll(json.directories.stream().map(VaultSettings::new).toList());
|
||||
|
||||
@@ -149,6 +154,7 @@ public class Settings {
|
||||
lastSuccessfulUpdateCheck.addListener(this::somethingChanged);
|
||||
previouslyUsedVaultDirectory.addListener(this::somethingChanged);
|
||||
lastUpdateAttemptedByVersion.addListener(this::somethingChanged);
|
||||
trustedHosts.addListener(this::somethingChanged);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@@ -207,6 +213,7 @@ public class Settings {
|
||||
json.lastSuccessfulUpdateCheck = lastSuccessfulUpdateCheck.get();
|
||||
json.previouslyUsedVaultDirectory = previouslyUsedVaultDirectory.get();
|
||||
json.lastUpdateAttemptedByVersion = lastUpdateAttemptedByVersion.get();
|
||||
json.trustedHosts = Set.copyOf(trustedHosts);
|
||||
return json;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,17 +4,23 @@ import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.annotation.JsonSetter;
|
||||
import com.fasterxml.jackson.annotation.Nulls;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
class SettingsJson {
|
||||
|
||||
@JsonProperty("directories")
|
||||
List<VaultSettingsJson> directories = List.of();
|
||||
@JsonSetter(nulls = Nulls.AS_EMPTY)
|
||||
List<VaultSettingsJson> directories = new ArrayList<>();
|
||||
|
||||
@JsonProperty("writtenByVersion")
|
||||
String writtenByVersion;
|
||||
@@ -99,4 +105,8 @@ class SettingsJson {
|
||||
|
||||
@JsonProperty("lastUpdateAttemptedByVersion")
|
||||
String lastUpdateAttemptedByVersion;
|
||||
|
||||
@JsonProperty("trustedHosts")
|
||||
@JsonSetter(nulls = Nulls.AS_EMPTY)
|
||||
Set<String> trustedHosts = new HashSet<>();
|
||||
}
|
||||
|
||||
@@ -27,6 +27,8 @@ import java.util.Set;
|
||||
* <li>cryptomator.p12Path</li>
|
||||
* <li>cryptomator.mountPointsDir</li>
|
||||
* <li>cryptomator.disableUpdateCheck</li>
|
||||
* <li>cryptomator.hub.allowedHosts</li>
|
||||
* <li>cryptomator.hub.enableTrustOnFirstUse</li>
|
||||
* </ul>
|
||||
*
|
||||
* @see Properties
|
||||
@@ -42,7 +44,9 @@ class AdminPropertiesFactory {
|
||||
"cryptomator.pluginDir", //
|
||||
"cryptomator.p12Path", //
|
||||
"cryptomator.mountPointsDir", //
|
||||
"cryptomator.disableUpdateCheck");
|
||||
"cryptomator.disableUpdateCheck", //
|
||||
"cryptomator.hub.allowedHosts", //
|
||||
"cryptomator.hub.enableTrustOnFirstUse");
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -36,7 +36,7 @@ public class Cryptomator {
|
||||
|
||||
static {
|
||||
var adminProps = AdminPropertiesFactory.create();
|
||||
var lazyProcessedProps = new SubstitutingProperties(adminProps, System.getenv());
|
||||
var lazyProcessedProps = new SubstitutingProperties(adminProps, System.getenv(), EventualLogger.INSTANCE);
|
||||
System.setProperties(lazyProcessedProps);
|
||||
CRYPTOMATOR_COMPONENT = DaggerCryptomatorComponent.factory().create(STARTUP_TIME);
|
||||
LOG = LoggerFactory.getLogger(Cryptomator.class);
|
||||
@@ -65,7 +65,6 @@ public class Cryptomator {
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
EventualLogger.INSTANCE.drainTo(LOG);
|
||||
var printVersion = Optional.ofNullable(args) //
|
||||
.stream() //Streams either one element (the args-array) or zero elements
|
||||
.flatMap(Arrays::stream) //
|
||||
@@ -91,10 +90,11 @@ public class Cryptomator {
|
||||
* @return Nonzero exit code in case of an error.
|
||||
*/
|
||||
private int run(String[] args) {
|
||||
debugMode.initialize();
|
||||
EventualLogger.INSTANCE.drainTo(LOG);
|
||||
env.log();
|
||||
LOG.debug("Dagger graph initialized after {}ms", System.currentTimeMillis() - STARTUP_TIME);
|
||||
LOG.info("Starting Cryptomator {} on {} {} ({})", env.getAppVersion(), SystemUtils.OS_NAME, SystemUtils.OS_VERSION, SystemUtils.OS_ARCH);
|
||||
debugMode.initialize();
|
||||
supportedLanguages.applyPreferred();
|
||||
changeDefaultSSLContext();
|
||||
/*
|
||||
|
||||
@@ -18,7 +18,7 @@ abstract class SSLContextDifferentTrustStoreBase implements SSLContextProvider {
|
||||
public SSLContext getContext(SecureRandom csprng) throws SSLContextBuildException {
|
||||
try {
|
||||
KeyStore truststore = getTruststore();
|
||||
truststore.load(null, null);
|
||||
ensureLoaded(truststore);
|
||||
|
||||
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
|
||||
tmf.init(truststore);
|
||||
@@ -30,4 +30,13 @@ abstract class SSLContextDifferentTrustStoreBase implements SSLContextProvider {
|
||||
throw new SSLContextBuildException(e);
|
||||
}
|
||||
}
|
||||
|
||||
static void ensureLoaded(KeyStore truststore) throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
|
||||
try {
|
||||
truststore.aliases();
|
||||
} catch (KeyStoreException e) {
|
||||
// Not initialized yet (e.g. custom KeyStore SPI); initialize without replacing preloaded stores.
|
||||
truststore.load(null, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,73 @@
|
||||
package org.cryptomator.networking;
|
||||
|
||||
import org.cryptomator.common.Nullable;
|
||||
import org.cryptomator.integrations.common.OperatingSystem;
|
||||
import org.jetbrains.annotations.VisibleForTesting;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.security.KeyStore;
|
||||
import java.security.KeyStoreException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.Provider;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* SSLContextProvider for Windows using the Windows certificate store as trust store
|
||||
* SSLContextProvider for Windows using the Windows certificate store as trust store and the bundled JDK cacerts as fallback
|
||||
* <p>
|
||||
* In order to work, the jdk.crypto.mscapi jmod is needed
|
||||
*/
|
||||
@OperatingSystem(OperatingSystem.Value.WINDOWS)
|
||||
public class SSLContextWithWindowsCertStore extends SSLContextDifferentTrustStoreBase implements SSLContextProvider {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(SSLContextWithWindowsCertStore.class);
|
||||
private static final String DEFAULT_TRUSTSTORE_PASSWORD = "changeit"; //default JDK cacerts password
|
||||
|
||||
@Override
|
||||
KeyStore getTruststore() throws KeyStoreException {
|
||||
return KeyStore.getInstance("WINDOWS-ROOT");
|
||||
KeyStore getTruststore() throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
|
||||
var windowsKeyStore = KeyStore.getInstance("WINDOWS-ROOT");
|
||||
var jdkKeyStore = getShippedCaCertsStore();
|
||||
if (jdkKeyStore == null) {
|
||||
return windowsKeyStore;
|
||||
}
|
||||
|
||||
ensureLoaded(windowsKeyStore);
|
||||
ensureLoaded(jdkKeyStore);
|
||||
try {
|
||||
CombinedKeyStoreSpi spi = CombinedKeyStoreSpi.create(windowsKeyStore, jdkKeyStore);
|
||||
Provider dummyProvider = new Provider("CombinedKeyStoreProvider", "1.0", "Provides a combined, read-only KeyStore") {};
|
||||
return new KeyStore(spi, dummyProvider, "CombinedKeyStoreProvider") {};
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new KeyStoreException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
KeyStore getShippedCaCertsStore() {
|
||||
return getCaCertsStoreByProperties(System.getProperties());
|
||||
}
|
||||
|
||||
//for testability
|
||||
@VisibleForTesting
|
||||
@Nullable
|
||||
KeyStore getCaCertsStoreByProperties(Properties props) {
|
||||
var javaHome = Path.of(props.getProperty("java.home"));
|
||||
var trustStorePassword = props.getProperty("javax.net.ssl.trustStorePassword", DEFAULT_TRUSTSTORE_PASSWORD).toCharArray();
|
||||
for (var candidate : List.of(javaHome.resolve("lib/security/cacerts"), javaHome.resolve("conf/security/cacerts"))) {
|
||||
try {
|
||||
if (Files.isRegularFile(candidate)) {
|
||||
return KeyStore.getInstance(candidate.toFile(), trustStorePassword);
|
||||
}
|
||||
} catch (CertificateException | KeyStoreException | IOException | NoSuchAlgorithmException e) {
|
||||
LOG.info("Unable to load fallback cacerts {} file. Skipping fallback.", candidate, e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ public enum FxmlFile {
|
||||
HEALTH_START("/fxml/health_start.fxml"), //
|
||||
HEALTH_CHECK_LIST("/fxml/health_check_list.fxml"), //
|
||||
HUB_NO_KEYCHAIN("/fxml/hub_no_keychain.fxml"), //
|
||||
HUB_CHECK_HOST_TRUST("/fxml/hub_check_host_trust.fxml"), //
|
||||
HUB_AUTH_FLOW("/fxml/hub_auth_flow.fxml"), //
|
||||
HUB_INVALID_LICENSE("/fxml/hub_invalid_license.fxml"), //
|
||||
HUB_RECEIVE_KEY("/fxml/hub_receive_key.fxml"), //
|
||||
@@ -29,6 +30,7 @@ public enum FxmlFile {
|
||||
HUB_REGISTER_FAILED("/fxml/hub_register_failed.fxml"), //
|
||||
HUB_REGISTER_DEVICE("/fxml/hub_register_device.fxml"), //
|
||||
HUB_UNAUTHORIZED_DEVICE("/fxml/hub_unauthorized_device.fxml"), //
|
||||
HUB_UNTRUSTED_HOST("/fxml/hub_untrusted_host.fxml"), //
|
||||
HUB_REQUIRE_ACCOUNT_INIT("/fxml/hub_require_account_init.fxml"), //
|
||||
LOCK_FORCED("/fxml/lock_forced.fxml"), //
|
||||
LOCK_FAILED("/fxml/lock_failed.fxml"), //
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
package org.cryptomator.ui.common;
|
||||
|
||||
import dagger.Lazy;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.common.vaults.VaultState;
|
||||
import org.cryptomator.integrations.mount.Mountpoint;
|
||||
import org.cryptomator.integrations.mount.UnmountFailedException;
|
||||
import org.cryptomator.integrations.revealpath.RevealFailedException;
|
||||
import org.cryptomator.integrations.revealpath.RevealPathService;
|
||||
import org.cryptomator.ui.fxapp.FxApplicationScoped;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.application.Application;
|
||||
import javafx.application.HostServices;
|
||||
import javafx.concurrent.Task;
|
||||
import javafx.stage.Stage;
|
||||
import java.io.IOException;
|
||||
@@ -28,12 +27,12 @@ public class VaultService {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(VaultService.class);
|
||||
|
||||
private final Lazy<Application> application;
|
||||
private final RevealPathService revealPathService;
|
||||
private final ExecutorService executorService;
|
||||
|
||||
@Inject
|
||||
public VaultService(Lazy<Application> application, ExecutorService executorService) {
|
||||
this.application = application;
|
||||
public VaultService(RevealPathService revealPathService, ExecutorService executorService) {
|
||||
this.revealPathService = revealPathService;
|
||||
this.executorService = executorService;
|
||||
}
|
||||
|
||||
@@ -47,9 +46,9 @@ public class VaultService {
|
||||
* @param vault The vault to reveal
|
||||
*/
|
||||
public Task<Vault> createRevealTask(Vault vault) {
|
||||
Task<Vault> task = new RevealVaultTask(vault, application.get().getHostServices());
|
||||
task.setOnSucceeded(evt -> LOG.info("Revealed {}", vault.getDisplayName()));
|
||||
task.setOnFailed(evt -> LOG.error("Failed to reveal " + vault.getDisplayName(), evt.getSource().getException()));
|
||||
Task<Vault> task = new RevealVaultTask(vault, revealPathService);
|
||||
task.setOnSucceeded(_ -> LOG.info("Revealed {}", vault.getDisplayName()));
|
||||
task.setOnFailed(evt -> LOG.warn("Failed to reveal {}", vault.getDisplayName(), evt.getSource().getException()));
|
||||
return task;
|
||||
}
|
||||
|
||||
@@ -110,19 +109,18 @@ public class VaultService {
|
||||
private static class RevealVaultTask extends Task<Vault> {
|
||||
|
||||
private final Vault vault;
|
||||
private final HostServices hostServices;
|
||||
private final RevealPathService rs;
|
||||
|
||||
public RevealVaultTask(Vault vault, HostServices hostServices) {
|
||||
public RevealVaultTask(Vault vault, RevealPathService revealPathService) {
|
||||
this.vault = vault;
|
||||
this.hostServices = hostServices;
|
||||
setOnFailed(evt -> LOG.error("Failed to reveal " + vault.getDisplayName(), getException()));
|
||||
this.rs = revealPathService;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Vault call() {
|
||||
protected Vault call() throws RevealFailedException {
|
||||
switch (vault.getMountPoint()) {
|
||||
case null -> LOG.warn("Not currently mounted");
|
||||
case Mountpoint.WithPath m -> hostServices.showDocument(m.uri().toString());
|
||||
case Mountpoint.WithPath m -> rs.reveal(m.path());
|
||||
case Mountpoint.WithUri m -> LOG.info("Vault mounted at {}", m.uri()); // TODO show in UI?
|
||||
}
|
||||
return vault;
|
||||
|
||||
@@ -2,18 +2,17 @@ package org.cryptomator.ui.eventview;
|
||||
|
||||
import org.apache.commons.lang3.SystemUtils;
|
||||
import org.cryptomator.common.Constants;
|
||||
import org.cryptomator.cryptofs.event.FileIsInUseEvent;
|
||||
import org.cryptomator.event.FSEventBucket;
|
||||
import org.cryptomator.event.FSEventBucketContent;
|
||||
import org.cryptomator.event.FileSystemEventAggregator;
|
||||
import org.cryptomator.common.Nullable;
|
||||
import org.cryptomator.common.ObservableUtil;
|
||||
import org.cryptomator.cryptofs.CryptoPath;
|
||||
import org.cryptomator.cryptofs.event.BrokenDirFileEvent;
|
||||
import org.cryptomator.cryptofs.event.BrokenFileNodeEvent;
|
||||
import org.cryptomator.cryptofs.event.ConflictResolutionFailedEvent;
|
||||
import org.cryptomator.cryptofs.event.ConflictResolvedEvent;
|
||||
import org.cryptomator.cryptofs.event.DecryptionFailedEvent;
|
||||
import org.cryptomator.cryptofs.event.FileIsInUseEvent;
|
||||
import org.cryptomator.event.FSEventBucket;
|
||||
import org.cryptomator.event.FSEventBucketContent;
|
||||
import org.cryptomator.event.FileSystemEventAggregator;
|
||||
import org.cryptomator.integrations.revealpath.RevealFailedException;
|
||||
import org.cryptomator.integrations.revealpath.RevealPathService;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
@@ -46,7 +45,6 @@ import java.time.ZoneId;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.format.FormatStyle;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.function.Function;
|
||||
|
||||
@@ -57,7 +55,6 @@ public class EventListCellController implements FxController {
|
||||
private static final DateTimeFormatter LOCAL_TIME_FORMATTER = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).withZone(ZoneId.systemDefault());
|
||||
|
||||
private final FileSystemEventAggregator fileSystemEventAggregator;
|
||||
@Nullable
|
||||
private final RevealPathService revealService;
|
||||
private final ResourceBundle resourceBundle;
|
||||
private final ObjectProperty<Map.Entry<FSEventBucket, FSEventBucketContent>> eventEntry;
|
||||
@@ -82,15 +79,17 @@ public class EventListCellController implements FxController {
|
||||
Button eventActionsButton;
|
||||
|
||||
@Inject
|
||||
public EventListCellController(FileSystemEventAggregator fileSystemEventAggregator, Optional<RevealPathService> revealService, ResourceBundle resourceBundle) {
|
||||
public EventListCellController(FileSystemEventAggregator fileSystemEventAggregator,
|
||||
RevealPathService revealService,
|
||||
ResourceBundle resourceBundle) {
|
||||
this.fileSystemEventAggregator = fileSystemEventAggregator;
|
||||
this.revealService = revealService.orElseGet(() -> null);
|
||||
this.revealService = revealService;
|
||||
this.resourceBundle = resourceBundle;
|
||||
this.eventEntry = new SimpleObjectProperty<>(null);
|
||||
this.eventMessage = new SimpleStringProperty();
|
||||
this.eventDescription = new SimpleStringProperty();
|
||||
this.eventIcon = new SimpleObjectProperty<>();
|
||||
this.eventCount = ObservableUtil.mapWithDefault(eventEntry, e -> e.getValue().count() == 1? "" : "("+ e.getValue().count() +")", "");
|
||||
this.eventCount = ObservableUtil.mapWithDefault(eventEntry, e -> e.getValue().count() == 1 ? "" : "(" + e.getValue().count() + ")", "");
|
||||
this.vaultUnlocked = ObservableUtil.mapWithDefault(eventEntry.flatMap(e -> e.getKey().vault().unlockedProperty()), Function.identity(), false);
|
||||
this.readableTime = ObservableUtil.mapWithDefault(eventEntry, e -> LOCAL_TIME_FORMATTER.format(e.getValue().mostRecentEvent().getTimestamp()), "");
|
||||
this.readableDate = ObservableUtil.mapWithDefault(eventEntry, e -> LOCAL_DATE_FORMATTER.format(e.getValue().mostRecentEvent().getTimestamp()), "");
|
||||
@@ -136,13 +135,8 @@ public class EventListCellController implements FxController {
|
||||
eventMessage.setValue(resourceBundle.getString("eventView.entry.inUse.message"));
|
||||
var indexFileName = fiiue.cleartextPath().lastIndexOf("/");
|
||||
eventDescription.setValue(fiiue.cleartextPath().substring(indexFileName + 1));
|
||||
if (revealService != null) {
|
||||
addLocalizedAction("eventView.entry.inUse.showDecrypted", () -> reveal(revealService, convertVaultPathToSystemPath(fiiue.cleartextPath())));
|
||||
addLocalizedAction("eventView.entry.inUse.showEncrypted", () -> reveal(revealService, fiiue.ciphertextPath()));
|
||||
} else {
|
||||
addLocalizedAction("eventView.entry.inUse.copyDecrypted", () -> copyToClipboard(convertVaultPathToSystemPath(fiiue.cleartextPath()).toString()));
|
||||
addLocalizedAction("eventView.entry.inUse.copyEncrypted", () -> copyToClipboard(fiiue.ciphertextPath().toString()));
|
||||
}
|
||||
addLocalizedAction("eventView.entry.inUse.showDecrypted", () -> reveal(revealService, convertVaultPathToSystemPath(fiiue.cleartextPath())));
|
||||
addLocalizedAction("eventView.entry.inUse.showEncrypted", () -> reveal(revealService, fiiue.ciphertextPath()));
|
||||
|
||||
var userAndDevice = fiiue.owner().split(Constants.HUB_USER_DEVICE_SEPARATOR);
|
||||
var user = userAndDevice[0];
|
||||
@@ -156,11 +150,7 @@ public class EventListCellController implements FxController {
|
||||
eventIcon.setValue(FontAwesome5Icon.TIMES);
|
||||
eventMessage.setValue(resourceBundle.getString("eventView.entry.brokenFileNode.message"));
|
||||
eventDescription.setValue(bfe.ciphertextPath().getFileName().toString());
|
||||
if (revealService != null) {
|
||||
addLocalizedAction("eventView.entry.brokenFileNode.showEncrypted", () -> reveal(revealService, bfe.ciphertextPath()));
|
||||
} else {
|
||||
addLocalizedAction("eventView.entry.brokenFileNode.copyEncrypted", () -> copyToClipboard(bfe.ciphertextPath().toString()));
|
||||
}
|
||||
addLocalizedAction("eventView.entry.brokenFileNode.showEncrypted", () -> reveal(revealService, bfe.ciphertextPath()));
|
||||
addLocalizedAction("eventView.entry.brokenFileNode.copyDecrypted", () -> copyToClipboard(convertVaultPathToSystemPath(bfe.cleartextPath()).toString()));
|
||||
}
|
||||
|
||||
@@ -168,46 +158,29 @@ public class EventListCellController implements FxController {
|
||||
eventIcon.setValue(FontAwesome5Icon.CHECK);
|
||||
eventMessage.setValue(resourceBundle.getString("eventView.entry.conflictResolved.message"));
|
||||
eventDescription.setValue(cre.resolvedCiphertextPath().getFileName().toString());
|
||||
if (revealService != null) {
|
||||
addLocalizedAction("eventView.entry.conflictResolved.showDecrypted", () -> reveal(revealService, convertVaultPathToSystemPath(cre.resolvedCleartextPath())));
|
||||
} else {
|
||||
addLocalizedAction("eventView.entry.conflictResolved.copyDecrypted", () -> copyToClipboard(convertVaultPathToSystemPath(cre.resolvedCleartextPath()).toString()));
|
||||
}
|
||||
addLocalizedAction("eventView.entry.conflictResolved.showDecrypted", () -> reveal(revealService, convertVaultPathToSystemPath(cre.resolvedCleartextPath())));
|
||||
}
|
||||
|
||||
private void adjustToConflictEvent(ConflictResolutionFailedEvent cfe) {
|
||||
eventIcon.setValue(FontAwesome5Icon.COMPRESS_ALT);
|
||||
eventMessage.setValue(resourceBundle.getString("eventView.entry.conflict.message"));
|
||||
eventDescription.setValue(cfe.conflictingCiphertextPath().getFileName().toString());
|
||||
if (revealService != null) {
|
||||
addLocalizedAction("eventView.entry.conflict.showDecrypted", () -> reveal(revealService, convertVaultPathToSystemPath(cfe.canonicalCleartextPath())));
|
||||
addLocalizedAction("eventView.entry.conflict.showEncrypted", () -> reveal(revealService, cfe.conflictingCiphertextPath()));
|
||||
} else {
|
||||
addLocalizedAction("eventView.entry.conflict.copyDecrypted", () -> copyToClipboard(convertVaultPathToSystemPath(cfe.canonicalCleartextPath()).toString()));
|
||||
addLocalizedAction("eventView.entry.conflict.copyEncrypted", () -> copyToClipboard(cfe.conflictingCiphertextPath().toString()));
|
||||
}
|
||||
addLocalizedAction("eventView.entry.conflict.showDecrypted", () -> reveal(revealService, convertVaultPathToSystemPath(cfe.canonicalCleartextPath())));
|
||||
addLocalizedAction("eventView.entry.conflict.showEncrypted", () -> reveal(revealService, cfe.conflictingCiphertextPath()));
|
||||
}
|
||||
|
||||
private void adjustToDecryptionFailedEvent(DecryptionFailedEvent dfe) {
|
||||
eventIcon.setValue(FontAwesome5Icon.BAN);
|
||||
eventMessage.setValue(resourceBundle.getString("eventView.entry.decryptionFailed.message"));
|
||||
eventDescription.setValue(dfe.ciphertextPath().getFileName().toString());
|
||||
if (revealService != null) {
|
||||
addLocalizedAction("eventView.entry.decryptionFailed.showEncrypted", () -> reveal(revealService, dfe.ciphertextPath()));
|
||||
} else {
|
||||
addLocalizedAction("eventView.entry.decryptionFailed.copyEncrypted", () -> copyToClipboard(dfe.ciphertextPath().toString()));
|
||||
}
|
||||
addLocalizedAction("eventView.entry.decryptionFailed.showEncrypted", () -> reveal(revealService, dfe.ciphertextPath()));
|
||||
}
|
||||
|
||||
private void adjustToBrokenDirFileEvent(BrokenDirFileEvent bde) {
|
||||
eventIcon.setValue(FontAwesome5Icon.TIMES);
|
||||
eventMessage.setValue(resourceBundle.getString("eventView.entry.brokenDirFile.message"));
|
||||
eventDescription.setValue(bde.ciphertextPath().getParent().getFileName().toString());
|
||||
if (revealService != null) {
|
||||
addLocalizedAction("eventView.entry.brokenDirFile.showEncrypted", () -> reveal(revealService, bde.ciphertextPath()));
|
||||
} else {
|
||||
addLocalizedAction("eventView.entry.brokenDirFile.copyEncrypted", () -> copyToClipboard(bde.ciphertextPath().toString()));
|
||||
}
|
||||
addLocalizedAction("eventView.entry.brokenDirFile.showEncrypted", () -> reveal(revealService, bde.ciphertextPath()));
|
||||
}
|
||||
|
||||
private void addLocalizedAction(String localizationKey, Runnable action) {
|
||||
@@ -270,7 +243,7 @@ public class EventListCellController implements FxController {
|
||||
}
|
||||
|
||||
var mountPoint = v.getMountPoint().uri().getPath();
|
||||
if(SystemUtils.IS_OS_WINDOWS) {
|
||||
if (SystemUtils.IS_OS_WINDOWS) {
|
||||
mountPoint = mountPoint.substring(1); //strip away any leading "/", otherwise there are errors
|
||||
}
|
||||
return Path.of(mountPoint, vaultInternalPath.substring(1)); //vaultPaths are always absolute
|
||||
|
||||
@@ -10,16 +10,20 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javafx.application.Application;
|
||||
import javafx.application.Platform;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
@FxApplicationScoped
|
||||
public class FxApplication {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(FxApplication.class);
|
||||
|
||||
static final AtomicReference<Application> INSTANCE = new AtomicReference<>();
|
||||
|
||||
private final long startupTime;
|
||||
private final Environment environment;
|
||||
private final Settings settings;
|
||||
@@ -33,7 +37,8 @@ public class FxApplication {
|
||||
private final FxNotificationManager notificationManager;
|
||||
|
||||
@Inject
|
||||
FxApplication(@Named("startupTime") long startupTime, //
|
||||
FxApplication(Application fxApp,
|
||||
@Named("startupTime") long startupTime, //
|
||||
Environment environment, //
|
||||
Settings settings, //
|
||||
AppLaunchEventHandler launchEventHandler, //
|
||||
@@ -55,6 +60,8 @@ public class FxApplication {
|
||||
this.autoUnlocker = autoUnlocker;
|
||||
this.fxFSEventList = fxFSEventList;
|
||||
this.notificationManager = notificationManager;
|
||||
|
||||
INSTANCE.set(fxApp);
|
||||
}
|
||||
|
||||
public void start() {
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package org.cryptomator.ui.fxapp;
|
||||
|
||||
import org.cryptomator.integrations.common.DisplayName;
|
||||
import org.cryptomator.integrations.common.OperatingSystem;
|
||||
import org.cryptomator.integrations.common.Priority;
|
||||
import org.cryptomator.integrations.revealpath.RevealFailedException;
|
||||
import org.cryptomator.integrations.revealpath.RevealPathService;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
/**
|
||||
* A {@link RevealPathService} service implementation using the JavaFX {@link javafx.application.HostServices#showDocument(String)} to reveal documents.
|
||||
* <p>
|
||||
* Internally the HostServices class uses GTK on Linux.
|
||||
*
|
||||
* @implNote {@link #reveal(Path)} only succeeds when the class {@link FxApplication} is initialized.
|
||||
*/
|
||||
@DisplayName("JavaFX HostServices (GTK)")
|
||||
@OperatingSystem(OperatingSystem.Value.LINUX)
|
||||
@Priority(10)
|
||||
public class JfxRevealPathService implements RevealPathService {
|
||||
|
||||
@Override
|
||||
public void reveal(Path p) throws RevealFailedException {
|
||||
var fxApp = FxApplication.INSTANCE.get();
|
||||
if (fxApp != null) {
|
||||
fxApp.getHostServices().showDocument(p.toUri().toString());
|
||||
} else {
|
||||
throw new RevealFailedException("JavaFX Application not initialized");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -4,9 +4,12 @@ import com.google.common.base.Throwables;
|
||||
import org.cryptomator.common.Environment;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.cryptofs.VaultConfig;
|
||||
import org.cryptomator.integrations.revealpath.RevealFailedException;
|
||||
import org.cryptomator.integrations.revealpath.RevealPathService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.application.Application;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
@@ -25,6 +28,7 @@ import java.util.stream.Collectors;
|
||||
@HealthCheckScoped
|
||||
public class ReportWriter {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ReportWriter.class);
|
||||
private static final String REPORT_HEADER = """
|
||||
*******************************************
|
||||
* Cryptomator Vault Health Report *
|
||||
@@ -43,14 +47,14 @@ public class ReportWriter {
|
||||
|
||||
private final Vault vault;
|
||||
private final VaultConfig vaultConfig;
|
||||
private final Application application;
|
||||
private final RevealPathService revealPathService;
|
||||
private final Path exportDestination;
|
||||
|
||||
@Inject
|
||||
public ReportWriter(@HealthCheckWindow Vault vault, AtomicReference<VaultConfig> vaultConfigRef, Application application, Environment env) {
|
||||
public ReportWriter(@HealthCheckWindow Vault vault, AtomicReference<VaultConfig> vaultConfigRef, RevealPathService revealPathService, Environment env) {
|
||||
this.vault = vault;
|
||||
this.vaultConfig = Objects.requireNonNull(vaultConfigRef.get());
|
||||
this.application = application;
|
||||
this.revealPathService = revealPathService;
|
||||
this.exportDestination = env.getLogDir().orElse(Path.of(System.getProperty("user.home"))).resolve("healthReport_" + vault.getDisplayName() + "_" + TIME_STAMP.format(Instant.now()) + ".log");
|
||||
}
|
||||
|
||||
@@ -92,7 +96,11 @@ public class ReportWriter {
|
||||
}
|
||||
|
||||
private void reveal() {
|
||||
application.getHostServices().showDocument(exportDestination.getParent().toUri().toString());
|
||||
try {
|
||||
revealPathService.reveal(exportDestination.getParent());
|
||||
} catch (RevealFailedException e) {
|
||||
LOG.warn("Failed to reveal export destination location of report", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package org.cryptomator.ui.keyloading.hub;
|
||||
|
||||
import com.nimbusds.jose.JWEObject;
|
||||
import dagger.Lazy;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.common.FxmlFile;
|
||||
@@ -12,8 +11,6 @@ import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javafx.application.Application;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.binding.Bindings;
|
||||
import javafx.beans.binding.StringBinding;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.SimpleObjectProperty;
|
||||
import javafx.concurrent.WorkerStateEvent;
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
package org.cryptomator.ui.keyloading.hub;
|
||||
|
||||
import dagger.Lazy;
|
||||
import org.cryptomator.common.Environment;
|
||||
import org.cryptomator.common.settings.Settings;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.common.FxmlFile;
|
||||
import org.cryptomator.ui.common.FxmlScene;
|
||||
import org.cryptomator.ui.keyloading.KeyLoading;
|
||||
import org.cryptomator.ui.keyloading.KeyLoadingScoped;
|
||||
import org.jetbrains.annotations.VisibleForTesting;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.scene.text.TextFlow;
|
||||
import javafx.stage.Stage;
|
||||
import java.net.URI;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@KeyLoadingScoped
|
||||
public class CheckHostTrustController implements FxController {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(CheckHostTrustController.class);
|
||||
private static final String CHECK_KEY = "hub.checkHostTrust.message.check";
|
||||
private static final String ASK_SINGULAR_KEY = "hub.checkHostTrust.message.ask";
|
||||
private static final String ASK_PLURAL_KEY = "hub.checkHostTrust.message.ask.plural";
|
||||
private static final String TRUSTED_CRYPTOMATOR_CLOUD_DOMAIN = ".cryptomator.cloud";
|
||||
|
||||
private final Stage window;
|
||||
private final HubConfig hubConfig;
|
||||
private final URI canonicalHubUri;
|
||||
private final URI canonicalAuthUri;
|
||||
private final Lazy<Scene> authFlowScene;
|
||||
private final Lazy<Scene> untrustedHostScene;
|
||||
private final CompletableFuture<ReceivedKey> result;
|
||||
private final Settings settings;
|
||||
private final Environment env;
|
||||
private final ResourceBundle resourceBundle;
|
||||
private final SortedSet<String> hostnames;
|
||||
private final StringProperty messageLabel;
|
||||
|
||||
@FXML
|
||||
private TextFlow hostnamesFlow;
|
||||
|
||||
@Inject
|
||||
public CheckHostTrustController(@KeyLoading Stage window, //
|
||||
HubConfig hubConfig, //
|
||||
@FxmlScene(FxmlFile.HUB_AUTH_FLOW) Lazy<Scene> authFlowScene, //
|
||||
@FxmlScene(FxmlFile.HUB_UNTRUSTED_HOST) Lazy<Scene> untrustedHostScene, //
|
||||
CompletableFuture<ReceivedKey> result, //
|
||||
Settings settings, //
|
||||
Environment env, //
|
||||
ResourceBundle resourceBundle) {
|
||||
this.window = window;
|
||||
this.hubConfig = hubConfig;
|
||||
this.canonicalHubUri = hubConfig.getApiBaseUrl();
|
||||
this.canonicalAuthUri = URI.create(hubConfig.authEndpoint);
|
||||
this.authFlowScene = authFlowScene;
|
||||
this.untrustedHostScene = untrustedHostScene;
|
||||
this.result = result;
|
||||
this.settings = settings;
|
||||
this.env = env;
|
||||
this.resourceBundle = resourceBundle;
|
||||
this.hostnames = new TreeSet<>();
|
||||
this.messageLabel = new SimpleStringProperty(resourceBundle.getString(CHECK_KEY));
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void initialize() {
|
||||
if (!isConsistentHubConfig()) {
|
||||
LOG.warn("Inconsistent hub config detected. Denying access to protect the user.");
|
||||
deny();
|
||||
} else if (isAllCryptomatorCloud() && !isAnyHttpHost()) {
|
||||
trust(); // trust *.cryptomator.cloud by default, domain is owned by Cryptomator maintainers
|
||||
} else if (containsAllowedHosts(env.hubAllowedHosts())) {
|
||||
trust(); // trust hosts explicitly allowlisted via system property
|
||||
} else if (isAnyHttpHost() && !isAllLocalhost()) {
|
||||
LOG.warn("Denying attempt to connect to hub instance via unencrypted HTTP.");
|
||||
deny(); // never trust http hosts except for local testing
|
||||
} else if (env.hubTrustOnFirstUse() && containsAllowedHosts(settings.trustedHosts)) {
|
||||
trust(); // trust hosts previously allowlisted by the user
|
||||
} else if (env.hubTrustOnFirstUse()) {
|
||||
hostnames.add(getAuthority(canonicalHubUri));
|
||||
hostnames.add(getAuthority(canonicalAuthUri));
|
||||
renderHostnames(); // ask user whether to trust these hosts
|
||||
} else {
|
||||
LOG.warn("Cryptomator is not allowed to connect to {}. Check your {} config.", getAuthority(canonicalHubUri), Environment.HUB_ALLOWED_HOSTS_PROP_NAME);
|
||||
deny();
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void trust() {
|
||||
settings.trustedHosts.addAll(hostnames);
|
||||
Platform.runLater(() -> {
|
||||
window.setScene(authFlowScene.get());
|
||||
});
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void deny() {
|
||||
result.cancel(true);
|
||||
Platform.runLater(() -> {
|
||||
window.setScene(untrustedHostScene.get());
|
||||
});
|
||||
}
|
||||
|
||||
private void renderHostnames() {
|
||||
hostnamesFlow.getChildren().clear();
|
||||
for (var hostname : hostnames) {
|
||||
hostnamesFlow.getChildren().add(new Text(hostname + System.lineSeparator()));
|
||||
}
|
||||
var messageKey = hostnames.size() > 1 ? ASK_PLURAL_KEY : ASK_SINGULAR_KEY;
|
||||
messageLabel.set(resourceBundle.getString(messageKey));
|
||||
}
|
||||
|
||||
private boolean isConsistentHubConfig() {
|
||||
var canonicalHubAuthority = getAuthority(canonicalHubUri);
|
||||
var canonicalAuthAuthority = getAuthority(canonicalAuthUri);
|
||||
|
||||
// apiBaseURL.host == deviceUrl.host == authSuccessUrl.host == authErrorUrl.host
|
||||
return (hubConfig.apiBaseUrl == null || getAuthority(hubConfig.apiBaseUrl).equals(canonicalHubAuthority)) //
|
||||
&& (hubConfig.devicesResourceUrl == null || getAuthority(hubConfig.devicesResourceUrl).equals(canonicalHubAuthority)) //
|
||||
&& getAuthority(hubConfig.authSuccessUrl).equals(canonicalHubAuthority) //
|
||||
&& getAuthority(hubConfig.authErrorUrl).equals(canonicalHubAuthority) //
|
||||
// authUrl.host == tokenUrl.host:
|
||||
&& getAuthority(hubConfig.tokenEndpoint).equals(canonicalAuthAuthority);
|
||||
}
|
||||
|
||||
private boolean isAllCryptomatorCloud() {
|
||||
return canonicalHubUri.getHost().endsWith(TRUSTED_CRYPTOMATOR_CLOUD_DOMAIN) && canonicalAuthUri.getHost().endsWith(TRUSTED_CRYPTOMATOR_CLOUD_DOMAIN);
|
||||
}
|
||||
|
||||
private boolean isAnyHttpHost() {
|
||||
return "http".equalsIgnoreCase(canonicalHubUri.getScheme()) || "http".equalsIgnoreCase(canonicalAuthUri.getScheme());
|
||||
}
|
||||
|
||||
private boolean isAllLocalhost() {
|
||||
return "localhost".equalsIgnoreCase(canonicalHubUri.getHost()) && "localhost".equalsIgnoreCase(canonicalAuthUri.getHost());
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
boolean containsAllowedHosts(Set<String> allowedHubHosts) {
|
||||
return allowedHubHosts.contains(getAuthority(canonicalHubUri)) && allowedHubHosts.contains(getAuthority(canonicalAuthUri));
|
||||
}
|
||||
|
||||
public static String getAuthority(String string) {
|
||||
return getAuthority(URI.create(string));
|
||||
}
|
||||
|
||||
public static String getAuthority(URI uri) {
|
||||
if (uri.getPort() == -1) {
|
||||
return "%s://%s".formatted(uri.getScheme(), uri.getHost());
|
||||
} else {
|
||||
return "%s://%s:%s".formatted(uri.getScheme(), uri.getHost(), uri.getPort());
|
||||
}
|
||||
}
|
||||
|
||||
//--- JavaFX property getter & setter
|
||||
public StringProperty messageLabelProperty() {
|
||||
return messageLabel;
|
||||
}
|
||||
|
||||
public String getMessageLabel() {
|
||||
return messageLabel.get();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -98,6 +98,13 @@ public abstract class HubKeyLoadingModule {
|
||||
return fxmlLoaders.createScene(FxmlFile.HUB_NO_KEYCHAIN);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxmlScene(FxmlFile.HUB_CHECK_HOST_TRUST)
|
||||
@KeyLoadingScoped
|
||||
static Scene provideHubCheckHostTrustScene(@KeyLoading FxmlLoaderFactory fxmlLoaders) {
|
||||
return fxmlLoaders.createScene(FxmlFile.HUB_CHECK_HOST_TRUST);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxmlScene(FxmlFile.HUB_AUTH_FLOW)
|
||||
@KeyLoadingScoped
|
||||
@@ -168,6 +175,13 @@ public abstract class HubKeyLoadingModule {
|
||||
return fxmlLoaders.createScene(FxmlFile.HUB_UNAUTHORIZED_DEVICE);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxmlScene(FxmlFile.HUB_UNTRUSTED_HOST)
|
||||
@KeyLoadingScoped
|
||||
static Scene provideHubUntrustedHostScene(@KeyLoading FxmlLoaderFactory fxmlLoaders) {
|
||||
return fxmlLoaders.createScene(FxmlFile.HUB_UNTRUSTED_HOST);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxmlScene(FxmlFile.HUB_REQUIRE_ACCOUNT_INIT)
|
||||
@KeyLoadingScoped
|
||||
@@ -180,6 +194,11 @@ public abstract class HubKeyLoadingModule {
|
||||
@FxControllerKey(NoKeychainController.class)
|
||||
abstract FxController bindNoKeychainController(NoKeychainController controller);
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(CheckHostTrustController.class)
|
||||
abstract FxController bindCheckHostAuthenticityController(CheckHostTrustController controller);
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(AuthFlowController.class)
|
||||
@@ -225,6 +244,11 @@ public abstract class HubKeyLoadingModule {
|
||||
@FxControllerKey(UnauthorizedDeviceController.class)
|
||||
abstract FxController bindUnauthorizedDeviceController(UnauthorizedDeviceController controller);
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(UntrustedHostController.class)
|
||||
abstract FxController bindUnauthorizedHostController(UntrustedHostController controller);
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(RequireAccountInitController.class)
|
||||
|
||||
@@ -36,19 +36,19 @@ public class HubKeyLoadingStrategy implements KeyLoadingStrategy, FilesystemOwne
|
||||
private final Stage window;
|
||||
private final KeychainManager keychainManager;
|
||||
private final AtomicReference<String> fsOwnerId;
|
||||
private final Lazy<Scene> authFlowScene;
|
||||
private final Lazy<Scene> checkHostTrustScene;
|
||||
private final Lazy<Scene> noKeychainScene;
|
||||
private final CompletableFuture<ReceivedKey> result;
|
||||
private final DeviceKey deviceKey;
|
||||
|
||||
@Inject
|
||||
public HubKeyLoadingStrategy(@KeyLoading Stage window, @FxmlScene(FxmlFile.HUB_AUTH_FLOW) Lazy<Scene> authFlowScene, @FxmlScene(FxmlFile.HUB_NO_KEYCHAIN) Lazy<Scene> noKeychainScene, CompletableFuture<ReceivedKey> result, DeviceKey deviceKey, KeychainManager keychainManager, @Named("windowTitle") String windowTitle, @Named("filesystemOwnerId") AtomicReference<String> fsOwnerId) {
|
||||
public HubKeyLoadingStrategy(@KeyLoading Stage window, @FxmlScene(FxmlFile.HUB_CHECK_HOST_TRUST) Lazy<Scene> checkHostTrustScene, @FxmlScene(FxmlFile.HUB_NO_KEYCHAIN) Lazy<Scene> noKeychainScene, CompletableFuture<ReceivedKey> result, DeviceKey deviceKey, KeychainManager keychainManager, @Named("windowTitle") String windowTitle, @Named("filesystemOwnerId") AtomicReference<String> fsOwnerId) {
|
||||
this.window = window;
|
||||
this.keychainManager = keychainManager;
|
||||
this.fsOwnerId = fsOwnerId;
|
||||
window.setTitle(windowTitle);
|
||||
window.setOnCloseRequest(_ -> result.cancel(true));
|
||||
this.authFlowScene = authFlowScene;
|
||||
this.checkHostTrustScene = checkHostTrustScene;
|
||||
this.noKeychainScene = noKeychainScene;
|
||||
this.result = result;
|
||||
this.deviceKey = deviceKey;
|
||||
@@ -62,7 +62,7 @@ public class HubKeyLoadingStrategy implements KeyLoadingStrategy, FilesystemOwne
|
||||
throw new NoKeychainAccessProviderException();
|
||||
}
|
||||
var keypair = deviceKey.get();
|
||||
showWindow(authFlowScene);
|
||||
showWindow(checkHostTrustScene);
|
||||
var jwe = result.get();
|
||||
return jwe.decryptMasterkey(keypair.getPrivate());
|
||||
} catch (NoKeychainAccessProviderException e) {
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package org.cryptomator.ui.keyloading.hub;
|
||||
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.keyloading.KeyLoading;
|
||||
import org.cryptomator.ui.keyloading.KeyLoadingScoped;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.stage.Stage;
|
||||
import javafx.stage.WindowEvent;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@KeyLoadingScoped
|
||||
public class UntrustedHostController implements FxController {
|
||||
|
||||
private final Stage window;
|
||||
private final CompletableFuture<ReceivedKey> result;
|
||||
|
||||
@Inject
|
||||
public UntrustedHostController(@KeyLoading Stage window, CompletableFuture<ReceivedKey> result) {
|
||||
this.window = window;
|
||||
this.result = result;
|
||||
this.window.addEventHandler(WindowEvent.WINDOW_HIDING, this::windowClosed);
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void close() {
|
||||
window.close();
|
||||
}
|
||||
|
||||
private void windowClosed(WindowEvent windowEvent) {
|
||||
result.cancel(true);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.cryptomator.ui.keyloading.masterkeyfile;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import org.cryptomator.common.Constants;
|
||||
import org.cryptomator.common.Passphrase;
|
||||
import org.cryptomator.common.keychain.KeychainManager;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
@@ -63,16 +64,21 @@ public class MasterkeyFileLoadingStrategy implements KeyLoadingStrategy {
|
||||
public Masterkey loadKey(URI keyId) throws MasterkeyLoadingFailedException {
|
||||
window.setTitle(resourceBundle.getString("unlock.title").formatted(vault.getDisplayName()));
|
||||
Preconditions.checkArgument(SCHEME.equalsIgnoreCase(keyId.getScheme()), "Only supports keys with scheme " + SCHEME);
|
||||
if (!Constants.MASTERKEY_FILENAME.equals(keyId.getSchemeSpecificPart())) {
|
||||
LOG.warn("unsupported masterkey path found in vault.cryptomator: {}", keyId.getSchemeSpecificPart());
|
||||
}
|
||||
try {
|
||||
Path filePath = vault.getPath().resolve(keyId.getSchemeSpecificPart());
|
||||
// determine masterkey file path:
|
||||
Path filePath = vault.getPath().resolve(Constants.MASTERKEY_FILENAME);
|
||||
if (!Files.exists(filePath)) {
|
||||
filePath = askUserForMasterkeyFilePath();
|
||||
}
|
||||
// unlock:
|
||||
if (passphrase == null) {
|
||||
askForPassphrase();
|
||||
}
|
||||
var masterkey = masterkeyFileAccess.load(filePath, passphrase);
|
||||
//backup
|
||||
// backup on successful unlock:
|
||||
if (filePath.startsWith(vault.getPath())) {
|
||||
try {
|
||||
BackupHelper.attemptBackup(filePath);
|
||||
|
||||
@@ -2,14 +2,17 @@ package org.cryptomator.ui.mainwindow;
|
||||
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.common.vaults.VaultState;
|
||||
import org.cryptomator.integrations.revealpath.RevealFailedException;
|
||||
import org.cryptomator.integrations.revealpath.RevealPathService;
|
||||
import org.cryptomator.ui.common.Animations;
|
||||
import org.cryptomator.ui.common.AutoAnimator;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.controls.FontAwesome5Icon;
|
||||
import org.cryptomator.ui.controls.FontAwesome5IconView;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.application.Application;
|
||||
import javafx.beans.binding.BooleanBinding;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.ReadOnlyObjectProperty;
|
||||
@@ -19,10 +22,12 @@ import javafx.fxml.FXML;
|
||||
@MainWindowScoped
|
||||
public class VaultDetailController implements FxController {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(VaultDetailController.class);
|
||||
|
||||
private final ReadOnlyObjectProperty<Vault> vault;
|
||||
private final Application application;
|
||||
private final ObservableValue<FontAwesome5Icon> glyph;
|
||||
private final BooleanBinding anyVaultSelected;
|
||||
private final RevealPathService revealPathService;
|
||||
|
||||
private AutoAnimator spinAnimation;
|
||||
|
||||
@@ -31,11 +36,11 @@ public class VaultDetailController implements FxController {
|
||||
|
||||
|
||||
@Inject
|
||||
VaultDetailController(ObjectProperty<Vault> vault, Application application) {
|
||||
VaultDetailController(ObjectProperty<Vault> vault, RevealPathService revealPathService) {
|
||||
this.vault = vault;
|
||||
this.application = application;
|
||||
this.glyph = vault.flatMap(Vault::stateProperty).map(this::getGlyphForVaultState);
|
||||
this.anyVaultSelected = vault.isNotNull();
|
||||
this.revealPathService = revealPathService;
|
||||
}
|
||||
|
||||
public void initialize() {
|
||||
@@ -61,7 +66,11 @@ public class VaultDetailController implements FxController {
|
||||
|
||||
@FXML
|
||||
public void revealStorageLocation() {
|
||||
application.getHostServices().showDocument(vault.get().getPath().toUri().toString());
|
||||
try {
|
||||
revealPathService.reveal(vault.get().getPath());
|
||||
} catch (RevealFailedException e) {
|
||||
LOG.warn("Failed to reveal vault storage location", e);
|
||||
}
|
||||
}
|
||||
|
||||
/* Observable Properties */
|
||||
|
||||
@@ -21,7 +21,6 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.ReadOnlyObjectProperty;
|
||||
@@ -31,7 +30,6 @@ import javafx.fxml.FXML;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.input.Clipboard;
|
||||
import javafx.scene.input.ClipboardContent;
|
||||
import javafx.scene.input.DataFormat;
|
||||
import javafx.scene.input.DragEvent;
|
||||
import javafx.scene.input.TransferMode;
|
||||
import javafx.stage.FileChooser;
|
||||
@@ -40,12 +38,8 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
|
||||
@@ -60,7 +54,7 @@ public class VaultDetailUnlockedController implements FxController {
|
||||
private final VaultService vaultService;
|
||||
private final WrongFileAlertComponent.Builder wrongFileAlert;
|
||||
private final Stage mainWindow;
|
||||
private final Optional<RevealPathService> revealPathService;
|
||||
private final RevealPathService revealPathService;
|
||||
private final DecryptNameComponent.Factory decryptNameWindowFactory;
|
||||
private final ResourceBundle resourceBundle;
|
||||
private final LoadingCache<Vault, VaultStatisticsComponent> vaultStats;
|
||||
@@ -84,7 +78,7 @@ public class VaultDetailUnlockedController implements FxController {
|
||||
VaultStatisticsComponent.Builder vaultStatsBuilder, //
|
||||
WrongFileAlertComponent.Builder wrongFileAlert, //
|
||||
@MainWindow Stage mainWindow, //
|
||||
Optional<RevealPathService> revealPathService, //
|
||||
RevealPathService revealPathService, //
|
||||
DecryptNameComponent.Factory decryptNameWindowFactory, //
|
||||
ResourceBundle resourceBundle) {
|
||||
this.vault = vault;
|
||||
@@ -111,7 +105,7 @@ public class VaultDetailUnlockedController implements FxController {
|
||||
|
||||
public void initialize() {
|
||||
revealEncryptedDropZone.setOnDragOver(e -> handleDragOver(e, draggingOverLocateEncrypted));
|
||||
revealEncryptedDropZone.setOnDragDropped(e -> handleDragDropped(e, this::getCiphertextPath, this::revealOrCopyPaths));
|
||||
revealEncryptedDropZone.setOnDragDropped(e -> handleDragDropped(e, this::getCiphertextPath, this::revealPaths));
|
||||
revealEncryptedDropZone.setOnDragExited(_ -> draggingOverLocateEncrypted.setValue(false));
|
||||
|
||||
decryptNameDropZone.setOnDragOver(e -> handleDragOver(e, draggingOverDecryptName));
|
||||
@@ -156,7 +150,7 @@ public class VaultDetailUnlockedController implements FxController {
|
||||
if (cleartextFile != null) {
|
||||
var ciphertextPath = getCiphertextPath(cleartextFile.toPath());
|
||||
if (ciphertextPath != null) {
|
||||
revealOrCopyPaths(List.of(ciphertextPath));
|
||||
revealPaths(List.of(ciphertextPath));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -188,34 +182,18 @@ public class VaultDetailUnlockedController implements FxController {
|
||||
}
|
||||
}
|
||||
|
||||
private void revealOrCopyPaths(List<Path> paths) {
|
||||
revealPathService.ifPresentOrElse(svc -> revealPaths(svc, paths), () -> {
|
||||
LOG.warn("No service provider to reveal files found.");
|
||||
copyPathsToClipboard(paths);
|
||||
});
|
||||
}
|
||||
|
||||
private void revealPaths(RevealPathService service, List<Path> paths) {
|
||||
private void revealPaths(List<Path> paths) {
|
||||
paths.forEach(path -> {
|
||||
try {
|
||||
LOG.debug("Revealing {}", path);
|
||||
service.reveal(path);
|
||||
revealPathService.reveal(path);
|
||||
} catch (RevealFailedException e) {
|
||||
//TODO: show popup in ui
|
||||
LOG.error("Revealing ciphertext file failed.", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void copyPathsToClipboard(List<Path> paths) {
|
||||
StringBuilder clipboardString = new StringBuilder();
|
||||
paths.forEach(p -> clipboardString.append(p.toString()).append("\n"));
|
||||
Clipboard.getSystemClipboard().setContent(Map.of(DataFormat.PLAIN_TEXT, clipboardString.toString()));
|
||||
ciphertextPathsCopied.setValue(true);
|
||||
CompletableFuture.delayedExecutor(2, TimeUnit.SECONDS, Platform::runLater).execute(() -> {
|
||||
ciphertextPathsCopied.set(false);
|
||||
});
|
||||
}
|
||||
|
||||
private VaultStatisticsComponent buildVaultStats(Vault vault) {
|
||||
return vaultStatsBuilder.vault(vault).build();
|
||||
}
|
||||
|
||||
@@ -10,16 +10,18 @@ import org.cryptomator.integrations.common.NamedServiceProvider;
|
||||
import org.cryptomator.integrations.keychain.KeychainAccessException;
|
||||
import org.cryptomator.integrations.keychain.KeychainAccessProvider;
|
||||
import org.cryptomator.integrations.quickaccess.QuickAccessService;
|
||||
import org.cryptomator.integrations.revealpath.RevealFailedException;
|
||||
import org.cryptomator.integrations.revealpath.RevealPathService;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.fxapp.FxApplicationWindows;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.application.Application;
|
||||
import javafx.beans.Observable;
|
||||
import javafx.beans.binding.Bindings;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.CheckBox;
|
||||
import javafx.scene.control.ChoiceBox;
|
||||
import javafx.scene.control.ToggleGroup;
|
||||
@@ -41,7 +43,7 @@ public class GeneralPreferencesController implements FxController {
|
||||
private final Settings settings;
|
||||
private final Optional<AutoStartProvider> autoStartProvider;
|
||||
private final List<QuickAccessService> quickAccessServices;
|
||||
private final Application application;
|
||||
private final RevealPathService revealPathService;
|
||||
private final Environment environment;
|
||||
private final List<KeychainAccessProvider> keychainAccessProviders;
|
||||
private final KeychainManager keychain;
|
||||
@@ -55,14 +57,21 @@ public class GeneralPreferencesController implements FxController {
|
||||
public CheckBox autoCloseVaultsCheckbox;
|
||||
public CheckBox debugModeCheckbox;
|
||||
public CheckBox autoStartCheckbox;
|
||||
public Button resetTrustedHostsButton;
|
||||
public ToggleGroup nodeOrientation;
|
||||
|
||||
private CompletionStage<Void> keychainMigrations = CompletableFuture.completedFuture(null);
|
||||
|
||||
@Inject
|
||||
GeneralPreferencesController(@PreferencesWindow Stage window, Settings settings, Optional<AutoStartProvider> autoStartProvider, //
|
||||
List<KeychainAccessProvider> keychainAccessProviders, KeychainManager keychain, Application application, //
|
||||
Environment environment, FxApplicationWindows appWindows, ExecutorService backgroundExecutor) {
|
||||
GeneralPreferencesController(@PreferencesWindow Stage window, //
|
||||
Settings settings, //
|
||||
Optional<AutoStartProvider> autoStartProvider, //
|
||||
List<KeychainAccessProvider> keychainAccessProviders, //
|
||||
KeychainManager keychain, //
|
||||
RevealPathService revealPathService, //
|
||||
Environment environment, //
|
||||
FxApplicationWindows appWindows, //
|
||||
ExecutorService backgroundExecutor) {
|
||||
this.window = window;
|
||||
this.settings = settings;
|
||||
this.autoStartProvider = autoStartProvider;
|
||||
@@ -70,7 +79,7 @@ public class GeneralPreferencesController implements FxController {
|
||||
this.keychain = keychain;
|
||||
this.backgroundExecutor = backgroundExecutor;
|
||||
this.quickAccessServices = QuickAccessService.get().toList();
|
||||
this.application = application;
|
||||
this.revealPathService = revealPathService;
|
||||
this.environment = environment;
|
||||
this.appWindows = appWindows;
|
||||
}
|
||||
@@ -98,6 +107,9 @@ public class GeneralPreferencesController implements FxController {
|
||||
quickAccessServiceChoiceBox.setConverter(new NamedServiceConverter<>());
|
||||
Bindings.bindBidirectional(settings.quickAccessService, quickAccessServiceChoiceBox.valueProperty(), quickAccessSettingsConverter);
|
||||
quickAccessServiceChoiceBox.disableProperty().bind(useQuickAccessCheckbox.selectedProperty().not());
|
||||
if (resetTrustedHostsButton != null) {
|
||||
resetTrustedHostsButton.disableProperty().bind(Bindings.isEmpty(settings.trustedHosts));
|
||||
}
|
||||
}
|
||||
|
||||
private void migrateKeychainEntries(Observable observable, KeychainAccessProvider oldProvider, KeychainAccessProvider newProvider) {
|
||||
@@ -124,6 +136,10 @@ public class GeneralPreferencesController implements FxController {
|
||||
return autoStartProvider.isPresent();
|
||||
}
|
||||
|
||||
public boolean isHubTrustOnFirstUseEnabled() {
|
||||
return environment.hubTrustOnFirstUse();
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void toggleAutoStart() {
|
||||
autoStartProvider.ifPresent(autoStart -> {
|
||||
@@ -146,9 +162,18 @@ public class GeneralPreferencesController implements FxController {
|
||||
return !quickAccessServices.isEmpty();
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void resetTrustedHosts() {
|
||||
settings.trustedHosts.clear();
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void showLogfileDirectory() {
|
||||
environment.getLogDir().ifPresent(logDirPath -> application.getHostServices().showDocument(logDirPath.toUri().toString()));
|
||||
try {
|
||||
revealPathService.reveal(environment.getLogDir().orElseThrow());
|
||||
} catch (RevealFailedException e) {
|
||||
LOG.warn("Failed to reveal log files directory.", e);
|
||||
}
|
||||
}
|
||||
|
||||
/* Helper classes */
|
||||
@@ -196,4 +221,5 @@ public class GeneralPreferencesController implements FxController {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,18 +3,19 @@ package org.cryptomator.ui.preferences;
|
||||
import org.cryptomator.common.Environment;
|
||||
import org.cryptomator.common.settings.Settings;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
import org.cryptomator.integrations.revealpath.RevealFailedException;
|
||||
import org.cryptomator.integrations.revealpath.RevealPathService;
|
||||
import org.cryptomator.integrations.update.UpdateStep;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.common.VaultService;
|
||||
import org.cryptomator.updater.UpdateChecker;
|
||||
import org.cryptomator.updater.FallbackUpdateInfo;
|
||||
import org.cryptomator.updater.UpdateChecker;
|
||||
import org.cryptomator.updater.UpdateService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.animation.PauseTransition;
|
||||
import javafx.application.Application;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.binding.Bindings;
|
||||
import javafx.beans.binding.BooleanBinding;
|
||||
@@ -49,7 +50,7 @@ public class UpdatesPreferencesController implements FxController {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(UpdatesPreferencesController.class);
|
||||
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.getDefault());
|
||||
|
||||
private final Application application;
|
||||
private final RevealPathService revealPathService;
|
||||
private final Environment environment;
|
||||
private final ResourceBundle resourceBundle;
|
||||
private final Settings settings;
|
||||
@@ -72,8 +73,8 @@ public class UpdatesPreferencesController implements FxController {
|
||||
public CheckBox checkForUpdatesCheckbox;
|
||||
|
||||
@Inject
|
||||
UpdatesPreferencesController(Application application, Environment environment, ResourceBundle resourceBundle, Settings settings, UpdateChecker updateChecker, ObservableList<Vault> vaults, VaultService vaultService) {
|
||||
this.application = application;
|
||||
UpdatesPreferencesController(RevealPathService revealPathService, Environment environment, ResourceBundle resourceBundle, Settings settings, UpdateChecker updateChecker, ObservableList<Vault> vaults, VaultService vaultService) {
|
||||
this.revealPathService = revealPathService;
|
||||
this.environment = environment;
|
||||
this.resourceBundle = resourceBundle;
|
||||
this.settings = settings;
|
||||
@@ -106,9 +107,14 @@ public class UpdatesPreferencesController implements FxController {
|
||||
updateService.setOnFailed(this::updateFailed);
|
||||
}
|
||||
|
||||
|
||||
@FXML
|
||||
public void showLogfileDirectory() {
|
||||
environment.getLogDir().ifPresent(logDirPath -> application.getHostServices().showDocument(logDirPath.toUri().toString()));
|
||||
try {
|
||||
revealPathService.reveal(environment.getLogDir().orElseThrow());
|
||||
} catch (RevealFailedException e) {
|
||||
LOG.warn("Failed to reveal log files directory.", e);
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
|
||||
53
src/main/resources/fxml/hub_check_host_trust.fxml
Normal file
53
src/main/resources/fxml/hub_check_host_trust.fxml
Normal file
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ButtonBar?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.Group?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.Region?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.shape.Circle?>
|
||||
<?import javafx.scene.text.TextFlow?>
|
||||
<HBox xmlns:fx="http://javafx.com/fxml"
|
||||
xmlns="http://javafx.com/javafx"
|
||||
fx:controller="org.cryptomator.ui.keyloading.hub.CheckHostTrustController"
|
||||
minWidth="400"
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
<children>
|
||||
<Group>
|
||||
<StackPane>
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="6"/>
|
||||
</padding>
|
||||
<Circle styleClass="glyph-icon-primary" radius="24"/>
|
||||
<FontAwesome5IconView styleClass="glyph-icon-white" glyph="QUESTION" glyphSize="24"/>
|
||||
</StackPane>
|
||||
</Group>
|
||||
<VBox HBox.hgrow="ALWAYS">
|
||||
<Label styleClass="label-large" text="${controller.messageLabel}" wrapText="true" textAlignment="LEFT">
|
||||
<padding>
|
||||
<Insets bottom="6" top="6"/>
|
||||
</padding>
|
||||
</Label>
|
||||
<TextFlow fx:id="hostnamesFlow" styleClass="text-flow" minHeight="60"/>
|
||||
<Region VBox.vgrow="ALWAYS" minHeight="18"/>
|
||||
<ButtonBar buttonMinWidth="120" buttonOrder="+CX">
|
||||
<buttons>
|
||||
<Button text="%hub.checkHostTrust.denyBtn" ButtonBar.buttonData="CANCEL_CLOSE" cancelButton="true" onAction="#deny"/>
|
||||
<Button text="%hub.checkHostTrust.trustBtn" ButtonBar.buttonData="NEXT_FORWARD" defaultButton="true" onAction="#trust"/>
|
||||
</buttons>
|
||||
</ButtonBar>
|
||||
</VBox>
|
||||
</children>
|
||||
</HBox>
|
||||
52
src/main/resources/fxml/hub_untrusted_host.fxml
Normal file
52
src/main/resources/fxml/hub_untrusted_host.fxml
Normal file
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.Group?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ButtonBar?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.Region?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.shape.Circle?>
|
||||
<HBox xmlns:fx="http://javafx.com/fxml"
|
||||
xmlns="http://javafx.com/javafx"
|
||||
fx:controller="org.cryptomator.ui.keyloading.hub.UntrustedHostController"
|
||||
minWidth="400"
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
<children>
|
||||
<Group>
|
||||
<StackPane>
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="6"/>
|
||||
</padding>
|
||||
<Circle styleClass="glyph-icon-primary" radius="24"/>
|
||||
<FontAwesome5IconView styleClass="glyph-icon-white" glyph="EXCLAMATION" glyphSize="24"/>
|
||||
</StackPane>
|
||||
</Group>
|
||||
<VBox HBox.hgrow="ALWAYS">
|
||||
<Label styleClass="label-large" text="%hub.untrustedHost.message" wrapText="true" textAlignment="LEFT">
|
||||
<padding>
|
||||
<Insets bottom="6" top="6"/>
|
||||
</padding>
|
||||
</Label>
|
||||
<Label text="%hub.untrustedHost.description" wrapText="true"/>
|
||||
<Region VBox.vgrow="ALWAYS" minHeight="18"/>
|
||||
<ButtonBar buttonMinWidth="120" buttonOrder="+C">
|
||||
<buttons>
|
||||
<Button text="%generic.button.close" ButtonBar.buttonData="CANCEL_CLOSE" defaultButton="true" onAction="#close"/>
|
||||
</buttons>
|
||||
</ButtonBar>
|
||||
</VBox>
|
||||
</children>
|
||||
</HBox>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<BorderPane xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
fx:controller="org.cryptomator.ui.notification.NotificationController"
|
||||
prefHeight="200.0" prefWidth="400.0" maxHeight="200.0" maxWidth="400.0"
|
||||
prefHeight="224.0" prefWidth="400.0" maxHeight="224.0" maxWidth="400.0"
|
||||
styleClass="notification-window"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
@@ -65,7 +65,7 @@
|
||||
<Label text="${controller.message}" styleClass="label-large" wrapText="true"/>
|
||||
<Label text="${controller.fileName}" styleClass="label" textOverrun="CENTER_ELLIPSIS" visible="${!controller.fileName.empty}" managed="${!controller.fileName.empty}"/>
|
||||
<Region minHeight="6"/>
|
||||
<ScrollPane minViewportWidth="370" minViewportHeight="50">
|
||||
<ScrollPane minViewportWidth="370" minViewportHeight="70">
|
||||
<Label text="${controller.description}" styleClass="label" wrapText="true" maxWidth="370"/>
|
||||
</ScrollPane>
|
||||
<Region VBox.vgrow="ALWAYS"/>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.CheckBox?>
|
||||
<?import javafx.scene.control.ChoiceBox?>
|
||||
<?import javafx.scene.control.Hyperlink?>
|
||||
@@ -34,6 +35,8 @@
|
||||
<CheckBox fx:id="useQuickAccessCheckbox" text="%preferences.general.quickAccessService"/>
|
||||
<ChoiceBox fx:id="quickAccessServiceChoiceBox" accessibleText="%preferences.general.quickAccessService"/>
|
||||
</HBox>
|
||||
|
||||
<Button fx:id="resetTrustedHostsButton" text="%preferences.general.resetTrustedHosts" visible="${controller.hubTrustOnFirstUseEnabled}" managed="${controller.hubTrustOnFirstUseEnabled}" onAction="#resetTrustedHosts"/>
|
||||
<Region VBox.vgrow="ALWAYS"/>
|
||||
|
||||
<HBox spacing="12" alignment="CENTER_LEFT">
|
||||
|
||||
@@ -17,22 +17,22 @@
|
||||
|
||||
<TextArea wrapText="true" prefRowCount="4" fx:id="textarea" textFormatter="${controller.recoveryKeyTextFormatter}" onKeyPressed="#onKeyPressed"/>
|
||||
<VBox>
|
||||
<Label text="Just some Filler" visible="false" managed="${textarea.text.empty}" graphicTextGap="6">
|
||||
<Label text="%recoveryKey.recover.wrongKey" visible="false" managed="${textarea.text.empty}" graphicTextGap="6" wrapText="true" >
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="ANCHOR"/>
|
||||
</graphic>
|
||||
</Label>
|
||||
<Label text="%recoveryKey.recover.correctKey" graphicTextGap="6" visible="${(!textarea.text.empty) && controller.recoveryKeyCorrect}" managed="${(!textarea.text.empty) && controller.recoveryKeyCorrect}">
|
||||
<Label text="%recoveryKey.recover.correctKey" graphicTextGap="6" wrapText="true" visible="${(!textarea.text.empty) && controller.recoveryKeyCorrect}" managed="${(!textarea.text.empty) && controller.recoveryKeyCorrect}">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="CHECK"/>
|
||||
</graphic>
|
||||
</Label>
|
||||
<Label text="%recoveryKey.recover.wrongKey" graphicTextGap="6" visible="${(!textarea.text.empty) && controller.recoveryKeyWrong}" managed="${(!textarea.text.empty) && controller.recoveryKeyWrong}">
|
||||
<Label text="%recoveryKey.recover.wrongKey" graphicTextGap="6" wrapText="true" visible="${(!textarea.text.empty) && controller.recoveryKeyWrong}" managed="${(!textarea.text.empty) && controller.recoveryKeyWrong}">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="TIMES" styleClass="glyph-icon-red"/>
|
||||
</graphic>
|
||||
</Label>
|
||||
<Label text="%recoveryKey.recover.invalidKey" graphicTextGap="6" visible="${(!textarea.text.empty) && controller.recoveryKeyInvalid}" managed="${(!textarea.text.empty) && controller.recoveryKeyInvalid}">
|
||||
<Label text="%recoveryKey.recover.invalidKey" graphicTextGap="6" wrapText="true" visible="${(!textarea.text.empty) && controller.recoveryKeyInvalid}" managed="${(!textarea.text.empty) && controller.recoveryKeyInvalid}">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="TIMES" styleClass="glyph-icon-red"/>
|
||||
</graphic>
|
||||
|
||||
@@ -162,6 +162,12 @@ unlock.error.title=Unlock "%s" failed
|
||||
hub.noKeychain.message=Unable to access device key
|
||||
hub.noKeychain.description=In order to unlock Hub vaults, a device key is required, which is secured using a keychain. To proceed, enable “%s” and select a keychain in the preferences.
|
||||
hub.noKeychain.openBtn=Open Preferences
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=Checking Configuration…
|
||||
hub.checkHostTrust.message.ask=Trust this host?
|
||||
hub.checkHostTrust.message.ask.plural=Trust these hosts?
|
||||
hub.checkHostTrust.trustBtn=Trust
|
||||
hub.checkHostTrust.denyBtn=Deny
|
||||
### Waiting
|
||||
hub.auth.message=Waiting for authentication…
|
||||
hub.auth.description=You should automatically be redirected to the login page.
|
||||
@@ -193,6 +199,9 @@ hub.archived.description=This vault has been archived and is no longer accessibl
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Access denied
|
||||
hub.unauthorized.description=You are not authorized to open this vault. Contact the vault's owner to request access.
|
||||
### Untrusted Host
|
||||
hub.untrustedHost.message=Host not trusted
|
||||
hub.untrustedHost.description=Connection to Hub was blocked for your security. If you believe the Hub host is safe, contact your Hub administrator or try again.
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Action required
|
||||
hub.requireAccountInit.description.0=To proceed, please complete the steps required in your
|
||||
@@ -306,6 +315,7 @@ preferences.general.debugDirectory=Reveal log files
|
||||
preferences.general.autoStart=Launch Cryptomator on system start
|
||||
preferences.general.keychainBackend=Store passwords with
|
||||
preferences.general.quickAccessService=Add unlocked vaults to the quick access area
|
||||
preferences.general.resetTrustedHosts=Reset trusted hosts
|
||||
## Interface
|
||||
preferences.interface=Interface
|
||||
preferences.interface.theme=Look & Feel
|
||||
@@ -696,33 +706,25 @@ eventView.cell.actionsButton.tooltip=Event actions
|
||||
eventView.entry.vaultLocked.description=Unlock "%s" for details
|
||||
eventView.entry.conflictResolved.message=Resolved conflict
|
||||
eventView.entry.conflictResolved.showDecrypted=Show decrypted file
|
||||
eventView.entry.conflictResolved.copyDecrypted=Copy decrypted path
|
||||
eventView.entry.conflict.message=Conflict resolution failed
|
||||
eventView.entry.conflict.showDecrypted=Show decrypted, original file
|
||||
eventView.entry.conflict.copyDecrypted=Copy decrypted, original path
|
||||
eventView.entry.conflict.showEncrypted=Show conflicting, encrypted file
|
||||
eventView.entry.conflict.copyEncrypted=Copy conflicting, encrypted path
|
||||
eventView.entry.decryptionFailed.message=Decryption failed
|
||||
eventView.entry.decryptionFailed.showEncrypted=Show encrypted file
|
||||
eventView.entry.decryptionFailed.copyEncrypted=Copy encrypted path
|
||||
eventView.entry.brokenDirFile.message=Broken directory link
|
||||
eventView.entry.brokenDirFile.showEncrypted=Show broken, encrypted link
|
||||
eventView.entry.brokenDirFile.copyEncrypted=Copy path of broken link
|
||||
eventView.entry.brokenFileNode.message=Broken filesystem node
|
||||
eventView.entry.brokenFileNode.showEncrypted=Show broken, encrypted node
|
||||
eventView.entry.brokenFileNode.copyEncrypted=Copy path of broken, encrypted node
|
||||
eventView.entry.brokenFileNode.copyDecrypted=Copy decrypted path
|
||||
eventView.entry.inUse.message=Locked File
|
||||
eventView.entry.inUse.message=File in use
|
||||
eventView.entry.inUse.showDecrypted=Show decrypted file
|
||||
eventView.entry.inUse.copyDecrypted=Copy decrypted path
|
||||
eventView.entry.inUse.showEncrypted=Show encrypted file
|
||||
eventView.entry.inUse.copyEncrypted=Copy encrypted path
|
||||
eventView.entry.inUse.copyUserAndDevice=Copy locking user and device name
|
||||
eventView.entry.inUse.ignoreLock=Ignore Lock
|
||||
eventView.entry.inUse.ignoreLock=Ignore use status
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=File is locked by another device
|
||||
notification.inUse.description=The file is opened by %s on device %s. Ask the user to close the file and sync again. Otherwise, you can ignore the lock and open it anyway.
|
||||
notification.inUse.action=Ignore Lock
|
||||
notification.inUse.message=File is in use on another device
|
||||
notification.inUse.description=The file is open by %s on %s. Ask them to close the file and let synchronization finish. You can ignore the status to open it now, but this may cause conflicts or overwrite newer changes.
|
||||
notification.inUse.action=Ignore Use Status
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
# Generics
|
||||
## Button
|
||||
|
||||
## Vault state
|
||||
|
||||
# Error
|
||||
|
||||
# Defaults
|
||||
@@ -36,6 +38,7 @@
|
||||
### Register Device Legacy
|
||||
### Registration Success
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
@@ -81,7 +84,7 @@
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
##Notificaition
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
### Locked
|
||||
@@ -148,3 +151,7 @@
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,14 @@ generic.button.close=إغلاق
|
||||
generic.button.copy=نسخ
|
||||
generic.button.copied=تم النسخ!
|
||||
generic.button.done=تم
|
||||
generic.button.previous=السابق
|
||||
generic.button.next=التالي
|
||||
generic.button.print=طباعة
|
||||
generic.button.remove=حذف
|
||||
|
||||
## Vault state
|
||||
vault.state.error=خطأ
|
||||
|
||||
# Error
|
||||
error.message=حدث خطأ ما
|
||||
error.description=لم يتوقع Cryptomator حدوث ذلك. يمكنك البحث عن الحلول الموجودة لهذا الخطأ. وإذا لم يتم الإبلاغ عنه بعد، لا تتردد في فعل ذلك.
|
||||
@@ -175,6 +179,7 @@ hub.registerSuccess.legacy.description=للدخول إلى الخزينة، يح
|
||||
hub.registerFailed.message=فشل تسجيل الجهاز
|
||||
hub.registerFailed.description.generic=حدث خطأ في عملية تسجيل الاسم. لمزيد من التفاصيل، راجع سجل التطبيق.
|
||||
hub.registerFailed.description.deviceAlreadyExists=هذا الجهاز مسجل لمستخدم مختلف بالفعل. حاول تغيير حساب المستخدم أو استخدام جهاز مختلف.
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=تم رفض الوصول
|
||||
hub.unauthorized.description=غير مسموح لك بفتح هذا المستودع. اتصل بمالك المستودع لطلب الوصول.
|
||||
@@ -386,6 +391,7 @@ stats.access.total=مجموع الوصول: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=المخازن
|
||||
main.vaultlist.emptyList.onboardingInstruction=انقر هنا لإضافة خزنة
|
||||
main.vaultlist.contextMenu.remove=حذف…
|
||||
main.vaultlist.contextMenu.lock=قفل
|
||||
@@ -394,8 +400,8 @@ main.vaultlist.contextMenu.unlockNow=افتح الان
|
||||
main.vaultlist.contextMenu.vaultoptions=إظهار خيارات المخزن
|
||||
main.vaultlist.contextMenu.reveal=اظهار القرص
|
||||
main.vaultlist.contextMenu.share=مشاركة…
|
||||
main.vaultlist.showEventsButton.tooltip=عرض الإشعارات
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=أضِف مخزنًا
|
||||
##Notification
|
||||
main.notification.updateAvailable=هناك تحديث متاح.
|
||||
main.notification.support=دعم Cryptomator.
|
||||
## Vault Detail
|
||||
@@ -624,19 +630,19 @@ eventView.clearListButton.tooltip=تفريغ القائمة
|
||||
eventView.entry.vaultLocked.description=فتح "%s" للحصول على التفاصيل
|
||||
eventView.entry.conflictResolved.message=تم حل التضارب
|
||||
eventView.entry.conflictResolved.showDecrypted=إظهار الملف غير المشفر
|
||||
eventView.entry.conflictResolved.copyDecrypted=نسخ المسار غير المشفر
|
||||
eventView.entry.conflict.message=فشل حل التضارب
|
||||
eventView.entry.conflict.showDecrypted=إظهار الملَف غير المشفر الأصلي
|
||||
eventView.entry.conflict.copyDecrypted=نسخ المسار غير المشفر والأصلي
|
||||
eventView.entry.conflict.showEncrypted=إظهار ملف متضارب ومشفر
|
||||
eventView.entry.conflict.copyEncrypted=نسخ مسار التشفير المتعارض
|
||||
eventView.entry.decryptionFailed.message=فشل فك التشفير
|
||||
eventView.entry.decryptionFailed.showEncrypted=عرض ملَف المشفر
|
||||
eventView.entry.decryptionFailed.copyEncrypted=نسخ مسار المشفر
|
||||
eventView.entry.brokenDirFile.message=رابط الدليل المكسور
|
||||
eventView.entry.brokenDirFile.showEncrypted=إظهار الرابط المكسور، المشفر
|
||||
eventView.entry.brokenDirFile.copyEncrypted=نسخ مسار الرابط المكسور
|
||||
eventView.entry.brokenFileNode.message=عقدة ملفات النظام التافلة
|
||||
eventView.entry.brokenFileNode.showEncrypted=عرض العقدة المشفّرة التافلة
|
||||
eventView.entry.brokenFileNode.copyEncrypted=نسخ مسار العقدة المشفّرة التافلة
|
||||
eventView.entry.brokenFileNode.copyDecrypted=نسخ المسار غير المشفر
|
||||
eventView.entry.inUse.showDecrypted=إظهار الملف غير المشفر
|
||||
eventView.entry.inUse.showEncrypted=عرض ملَف المشفر
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,14 @@ generic.button.close=Яп
|
||||
generic.button.copy=Күсермәһен ал
|
||||
generic.button.copied=Күсермә алынды!
|
||||
generic.button.done=Тамам
|
||||
generic.button.previous=Алдағы
|
||||
generic.button.next=Киләһе
|
||||
generic.button.print=Баҫтыр
|
||||
generic.button.remove=Алып ташлау
|
||||
|
||||
## Vault state
|
||||
vault.state.error=Хата
|
||||
|
||||
# Error
|
||||
error.message=Хата килеп сыҡты
|
||||
error.description=Cryptomator өсөн көтөлмәгән хәл. Был хатаның булған төҙәтеү варианттарын ҡарай алаһығыҙ. Әлегә тиклем белдерелмәгән булһа, был хаҡта хәбәр итә алаһығыҙ.
|
||||
@@ -163,6 +167,7 @@ hub.register.registerBtn=Теркәл
|
||||
### Registration Success
|
||||
hub.registerSuccess.unlockBtn=Биген ас
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Инеү кире ҡағылды
|
||||
### Requires Account Initialization
|
||||
@@ -357,6 +362,7 @@ stats.access.total=Барлыҡ инеү: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Һаҡлағыстар
|
||||
main.vaultlist.emptyList.onboardingInstruction=Һаҡлағыс өҫтәү өсөн бында баҫығыҙ
|
||||
main.vaultlist.contextMenu.remove=Алып ташлау…
|
||||
main.vaultlist.contextMenu.lock=Биклә
|
||||
@@ -364,7 +370,8 @@ main.vaultlist.contextMenu.unlock=Бикте асыу…
|
||||
main.vaultlist.contextMenu.unlockNow=Хәҙер бикте ас
|
||||
main.vaultlist.contextMenu.vaultoptions=Һаҡлағыс варианттарын күрһәт
|
||||
main.vaultlist.contextMenu.reveal=Дискты күрһәт
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Һаҡлағыс өҫтәү
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Файлдарығыҙҙы һаҡлау өсөн Cryptomator-ҙы һайлағанығыҙ өсөн рәхмәт. Әгәр һеҙгә ярҙам кәрәк булһа, башлау буйынса белешмәләребеҙҙе ҡарағыҙ:
|
||||
@@ -545,3 +552,7 @@ dokanySupportEnd.preferencesBtn=Көйләүҙәрҙе ас
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,13 @@ generic.button.close=Зачыніць
|
||||
generic.button.copy=Капіяваць
|
||||
generic.button.copied=Скапіявана!
|
||||
generic.button.done=Файна
|
||||
generic.button.previous=Папярэдні
|
||||
generic.button.next=Далей
|
||||
generic.button.print=Друкаваць
|
||||
generic.button.remove=Выдаліць
|
||||
|
||||
## Vault state
|
||||
|
||||
# Error
|
||||
error.message=Адбылася памылка
|
||||
error.description=Cryptomator не чакаў такога павароту. Ты можаш пашукаць рашэнні гэтай праблемы. Калі пра гэтую хібу яшчэ ніхто не паведаміў, калі ласка, зрабі ты гэта.
|
||||
@@ -156,6 +159,7 @@ hub.register.nameLabel=Назва прылады
|
||||
### Registration Success
|
||||
hub.registerSuccess.unlockBtn=Адамкнуць
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Адмова ў доступе
|
||||
### Requires Account Initialization
|
||||
@@ -351,7 +355,8 @@ main.vaultlist.contextMenu.unlock=Адамкнуць…
|
||||
main.vaultlist.contextMenu.unlockNow=Разамкнуць зараз
|
||||
main.vaultlist.contextMenu.vaultoptions=Паказаць параметры скарбніцы
|
||||
main.vaultlist.contextMenu.reveal=Паказаць дыск
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Дадаць скарбніцу
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Дзякуй, што ты абраў Cryptomator для абароны тваіх файлаў. Калі табе патрэбна дапамога, калі ласка, паглядзі нашы інструкцыі:
|
||||
@@ -524,3 +529,7 @@ dokanySupportEnd.preferencesBtn=Адчыніць налады
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,19 @@ generic.button.close=Затваряне
|
||||
generic.button.copy=Копиране
|
||||
generic.button.copied=Копирано!
|
||||
generic.button.done=Готово
|
||||
generic.button.previous=Назад
|
||||
generic.button.next=Напред
|
||||
generic.button.print=Отпечатване
|
||||
generic.button.remove=Премахване
|
||||
|
||||
## Vault state
|
||||
vault.state.locked=Заключено
|
||||
vault.state.unlocked=Отключено
|
||||
vault.state.missing=Липсващ
|
||||
vault.state.migrationNeeded=Необходима е миграция
|
||||
vault.state.processing=Обработване
|
||||
vault.state.error=Грешка
|
||||
|
||||
# Error
|
||||
error.message=Възникна грешка
|
||||
error.description=Това е неочаквано за Криптоматор. Можете да потърсите съществуващи ревения за тази грешка. Или ако все още не е докладвана се чувствайте свободни да го направите.
|
||||
@@ -95,6 +104,7 @@ addvault.new.readme.accessLocation.4=При желание можете да п
|
||||
## Existing
|
||||
addvaultwizard.existing.title=Добавяне на съществуващо хранилище
|
||||
addvaultwizard.existing.instruction=Изберете файла „vault.cryptomator“ от съществуващото хранилище, но ако има само файл „masterkey.cryptomator“, изберете него.
|
||||
addvaultwizard.existing.restore=Възстановяване…
|
||||
addvaultwizard.existing.chooseBtn=Избиране…
|
||||
addvaultwizard.existing.filePickerTitle=Избор на файл на хранилището
|
||||
addvaultwizard.existing.filePickerMimeDesc=Хранилище на Криптоматор
|
||||
@@ -142,6 +152,7 @@ unlock.error.customPath.description.hideawayNotDir=Временният, скр
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Хранилището не може да бъде монтирано на „%s“. Опитайте отново или изберете друг път.
|
||||
unlock.error.customPath.description.notEmptyDir=Потребителският път на монтиране „%s“ не е празна папка. Изберете празна папка и опитайте отново.
|
||||
unlock.error.customPath.description.generic=Избрали сте потребителски път за монтиране на това хранилище, но при използването му възникна следната грешка: %2$s
|
||||
unlock.error.restartRequired.message=Хранилището не може да бъде отключено
|
||||
unlock.error.title=Неуспешно отключване на „%s“
|
||||
## Hub
|
||||
hub.noKeychain.message=Няма достъп до ключа на устройството
|
||||
@@ -163,6 +174,7 @@ hub.register.registerBtn=Регистриране
|
||||
### Registration Success
|
||||
hub.registerSuccess.unlockBtn=Отключване
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Отказан достъп
|
||||
### Requires Account Initialization
|
||||
@@ -365,7 +377,9 @@ main.vaultlist.contextMenu.unlock=Отключване…
|
||||
main.vaultlist.contextMenu.unlockNow=Отключване сега
|
||||
main.vaultlist.contextMenu.vaultoptions=Настройки на хранилището
|
||||
main.vaultlist.contextMenu.reveal=Разкриване на диска
|
||||
##Notificaition
|
||||
main.vaultlist.contextMenu.share=Споделяне…
|
||||
main.vaultlist.addVaultButton.tooltip=Добавяне на хранилище
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Благодарим ви, че избрахте Криптоматор, за да предпазвате файловете си. Ако имате нужда от съдействие прочетете ръководствата за започване на работа с приложението:
|
||||
@@ -546,3 +560,7 @@ dokanySupportEnd.preferencesBtn=Към настройките
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -11,10 +11,14 @@ generic.button.close=বন্ধ করুন
|
||||
generic.button.copy=কপি
|
||||
generic.button.copied=কপি হয়েছে!
|
||||
generic.button.done=সম্পন্ন হয়েছে
|
||||
generic.button.previous=পিছনে
|
||||
generic.button.next=পরবর্তী
|
||||
generic.button.print=প্রিন্ট
|
||||
generic.button.remove=বাতিল
|
||||
|
||||
## Vault state
|
||||
vault.state.error=ত্রুটি দেখা দিয়েছে
|
||||
|
||||
# Error
|
||||
error.message=ত্রুটি %s
|
||||
error.description=ওহো! ক্রিপ্টোমেটর এটা যে হবে তা আশা করেনি. আপনি এই ত্রুটির সমাধানটি খুঁজে দেখুন. ত্রুটিটি সম্পর্কে যদি বিবরণ না পান, আপনি সেটি রিপোর্ট করতে পারেন.
|
||||
@@ -95,6 +99,7 @@ unlock.unlockBtn=আনলক করুন
|
||||
### Registration Success
|
||||
hub.registerSuccess.unlockBtn=আনলক করুন
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
@@ -142,7 +147,8 @@ lock.forced.retryBtn=পুনরায় চেষ্টা করুন
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist.contextMenu.lock=লক করুন
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=ভোল্ট যুক্ত করুন
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
### Locked
|
||||
@@ -212,3 +218,7 @@ vaultOptions.mount.mountPoint.directoryPickerButton=নির্বাচন ক
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -15,6 +15,8 @@ generic.button.next=Sljedeće
|
||||
generic.button.print=Ispis
|
||||
generic.button.remove=Ukloni
|
||||
|
||||
## Vault state
|
||||
|
||||
# Error
|
||||
error.message=Došlo je do greške
|
||||
|
||||
@@ -109,6 +111,7 @@ unlock.success.revealBtn=Otkrij pogon
|
||||
### Registration Success
|
||||
hub.registerSuccess.unlockBtn=Otključaj
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
@@ -209,6 +212,7 @@ stats.write.accessCount=Ukupno upisano: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Sef
|
||||
main.vaultlist.emptyList.onboardingInstruction=Kliknite ovdje da dodate sef
|
||||
main.vaultlist.contextMenu.remove=Ukloni…
|
||||
main.vaultlist.contextMenu.lock=Zaključaj
|
||||
@@ -216,7 +220,8 @@ main.vaultlist.contextMenu.unlock=Otključaj…
|
||||
main.vaultlist.contextMenu.unlockNow=Otključaj sada
|
||||
main.vaultlist.contextMenu.vaultoptions=Pokaži opcije sefa
|
||||
main.vaultlist.contextMenu.reveal=Otkrij pogon
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Dodaj sef
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Hvala što ste izabrali Cryptomator za zaštitu podataka. Ako vam je potrebna pomoć, pogledajte naše vodiče za početak:
|
||||
@@ -348,3 +353,7 @@ quit.lockAndQuitBtn=Zaključaj i zatvori
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,15 @@ generic.button.close=Tanca
|
||||
generic.button.copy=Copia
|
||||
generic.button.copied=Copiat!
|
||||
generic.button.done=Fet
|
||||
generic.button.previous=Anterior
|
||||
generic.button.next=Següent
|
||||
generic.button.print=Imprimeix
|
||||
generic.button.remove=Elimina
|
||||
|
||||
## Vault state
|
||||
vault.state.locked=Bloquejada
|
||||
vault.state.error=Error
|
||||
|
||||
# Error
|
||||
error.message=S'ha produït un error
|
||||
error.description=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.
|
||||
@@ -175,6 +180,7 @@ hub.registerSuccess.legacy.description=Per a accedir a la caixa forta, el vostre
|
||||
hub.registerFailed.message=El registre del dispositiu ha fallat
|
||||
hub.registerFailed.description.generic=S'ha produït un error en el procés de registre. Per a obtindre'n més detalls vegeu els registres de l'aplicació.
|
||||
hub.registerFailed.description.deviceAlreadyExists=El dispositiu ja ha estat registrat per un altre usuari. Mireu de canviar el compte d'usuari o feu servir un dispositiu diferent.
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Accés denegat
|
||||
hub.unauthorized.description=No estàs autoritzat a obrir aquesta caixa forta. Contacta amb el seu propietari per obtenir accés.
|
||||
@@ -386,6 +392,7 @@ stats.access.total=Total d'accessos: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Caixes fortes
|
||||
main.vaultlist.emptyList.onboardingInstruction=Feu clic aquí per afegir una caixa forta
|
||||
main.vaultlist.contextMenu.remove=Elimina…
|
||||
main.vaultlist.contextMenu.lock=Bloqueja
|
||||
@@ -394,12 +401,14 @@ main.vaultlist.contextMenu.unlockNow=Desbloqueja ara
|
||||
main.vaultlist.contextMenu.vaultoptions=Opcions de la caixa forta
|
||||
main.vaultlist.contextMenu.reveal=Mostra la unitat
|
||||
main.vaultlist.contextMenu.share=Compateix…
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Afegir una caixa forta
|
||||
##Notification
|
||||
main.notification.updateAvailable=Hi ha una actualització disponible.
|
||||
main.notification.support=Doneu suport a Cryptomator.
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Gràcies per escollir Cryptomator per protegir els vostres fitxers. Si vos cal ajuda, llegiu les nostres guies per donar els Primers passos:
|
||||
main.vaultDetail.storageLocation=Ubicació de la caixa forta
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=BLOQUEJADA
|
||||
main.vaultDetail.unlockBtn=Desbloca…
|
||||
@@ -599,3 +608,7 @@ shareVault.hub.openHub=Obre Cryptomator Hub
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,14 @@ generic.button.close=Zavřít
|
||||
generic.button.copy=Kopírovat
|
||||
generic.button.copied=Zkopírováno!
|
||||
generic.button.done=Hotovo
|
||||
generic.button.previous=Předchozí
|
||||
generic.button.next=Další
|
||||
generic.button.print=Tisk
|
||||
generic.button.remove=Odstranit
|
||||
|
||||
## Vault state
|
||||
vault.state.error=Chyba
|
||||
|
||||
# Error
|
||||
error.message=Chyba %s
|
||||
error.description=Jejda! Tohle Cryptomator nečekal. Můžete najít již existující řešení pro tuto chybu. Nebo pokud ještě nebyla nahlášena, neváhejte tak učinit.
|
||||
@@ -171,6 +175,7 @@ hub.registerSuccess.legacy.description=Pro přístup k trezoru musí být vaše
|
||||
hub.registerFailed.message=Registrace zařízení se nezdařila
|
||||
hub.registerFailed.description.generic=Došlo k chybě v registračním procesu. Pro více detailů se podívejte do logu aplikace.
|
||||
hub.registerFailed.description.deviceAlreadyExists=Toto zařízení je již registrováno pro jiného uživatele. Zkuste změnit uživatelský účet nebo použijte jiné zařízení.
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Přístup odepřen
|
||||
### Requires Account Initialization
|
||||
@@ -357,6 +362,7 @@ stats.access.total=Přístup celkem: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Trezory
|
||||
main.vaultlist.emptyList.onboardingInstruction=Klikněte zde pro přidání nového trezoru
|
||||
main.vaultlist.contextMenu.remove=Odstranit…
|
||||
main.vaultlist.contextMenu.lock=Zamknout
|
||||
@@ -365,7 +371,8 @@ main.vaultlist.contextMenu.unlockNow=Odemknout nyní
|
||||
main.vaultlist.contextMenu.vaultoptions=Zobrazit možnosti trezoru
|
||||
main.vaultlist.contextMenu.reveal=Zobrazit jednotku
|
||||
main.vaultlist.contextMenu.share=Sdílet…
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Přidat trezor
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Děkujeme, že jste si vybrali Cryptomator pro ochranu vašich souborů. Pokud potřebujete pomoc, podívejte se na naše návody:
|
||||
@@ -562,3 +569,7 @@ shareVault.hub.openHub=Otevřít Cryptomator Hub
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,19 @@ generic.button.close=Luk
|
||||
generic.button.copy=Kopiér
|
||||
generic.button.copied=Kopieret!
|
||||
generic.button.done=Færdig
|
||||
generic.button.previous=Tidligere
|
||||
generic.button.next=Næste
|
||||
generic.button.print=Print
|
||||
generic.button.remove=Fjern
|
||||
|
||||
## Vault state
|
||||
vault.state.locked=Låst
|
||||
vault.state.unlocked=Låst op
|
||||
vault.state.missing=Mangler
|
||||
vault.state.migrationNeeded=Migration påkrævet
|
||||
vault.state.processing=Bearbejder
|
||||
vault.state.error=Fejl
|
||||
|
||||
# Error
|
||||
error.message=Der opstod en fejl
|
||||
error.description=Cryptomator forventede ikke at dette skete. Du kan gennemse eksisterende løsninger for denne fejl - eller hvis denne fejl ikke er blevet rapporteret før, er du meget velkommen til at rapportere den.
|
||||
@@ -77,7 +86,7 @@ addvaultwizard.new.generateRecoveryKeyChoice=Du kan ikke tilgå dine data uden d
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.yes=Ja tak - for en sikkerheds skyld
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.no=Nej tak. Jeg mister ikke min adgangskode
|
||||
### Information
|
||||
addvault.new.readme.storageLocation.fileName=VIGTIGT.rtf
|
||||
addvault.new.readme.storageLocation.fileName=IMPORTANT.rtf
|
||||
addvault.new.readme.storageLocation.1=⚠️ BOKS-FILER ⚠️
|
||||
addvault.new.readme.storageLocation.2=Det er her er lokationen for din boks' data.
|
||||
addvault.new.readme.storageLocation.3=SØRG FOR ALDRIG AT
|
||||
@@ -88,14 +97,14 @@ addvault.new.readme.storageLocation.7=1. Tilføj denne boks til Cryptomator.
|
||||
addvault.new.readme.storageLocation.8=2. Lås boksen op i Cryptomator.
|
||||
addvault.new.readme.storageLocation.9=3. Åbn placeringen ved at klikke på knappen "Vis boks".
|
||||
addvault.new.readme.storageLocation.10=Hvis du har brug for hjælp, så kig i dokumentationen: %s
|
||||
addvault.new.readme.accessLocation.fileName=VELKOMMEN.rtf
|
||||
addvault.new.readme.accessLocation.fileName=WELCOME.rtf
|
||||
addvault.new.readme.accessLocation.1=🔐️ KRYPTERET DREV 🔐️
|
||||
addvault.new.readme.accessLocation.2=Det er her indholdet af din boks tilgås.
|
||||
addvault.new.readme.accessLocation.3=Filer du tilføjer til dette drev vil blive krypteret af Cryptomator. Du har arbejde med filerne ligesom enhver anden fil/mappe. Dette er blot en dekrypteret visning af indholdet. Dine filer er stadig krypterede på din harddisk hele tiden.
|
||||
addvault.new.readme.accessLocation.4=Fjern denne fil hvis du har lyst.
|
||||
## Existing
|
||||
addvaultwizard.existing.title=Tilføj Eksisterende Boks
|
||||
addvaultwizard.existing.instruction=Vælgt filen "vault.cryptomator" i mappen med dine boks-filer. Hvis der kun findes en fil med navnet "masterkey.cryptomator", skal du vælge den i stedet.
|
||||
addvaultwizard.existing.instruction=Vælg filen "vault.cryptomator" i mappen med dine boks-filer. Hvis der kun findes en fil med navnet "masterkey.cryptomator", skal du vælge den i stedet.
|
||||
addvaultwizard.existing.restore=Gendan…
|
||||
addvaultwizard.existing.chooseBtn=Vælg…
|
||||
addvaultwizard.existing.filePickerTitle=Vælg boks-fil
|
||||
@@ -161,9 +170,9 @@ hub.receive.message=Behandler svar…
|
||||
hub.receive.description=Cryptomator modtager og behandler svaret fra hubben. Vent venligst.
|
||||
### Register Device
|
||||
hub.register.message=Ny Enhed
|
||||
hub.register.description=Det er første gang Hub tilgås fra denne enhed. Registrer den venligst ved at anvende din Account Key.
|
||||
hub.register.description=Det er første gang Hub tilgås fra denne enhed. Registrer den venligst ved at anvende din kontonøgle.
|
||||
hub.register.nameLabel=Enheds-navn
|
||||
hub.register.invalidAccountKeyLabel=Ugyldig Account Key
|
||||
hub.register.invalidAccountKeyLabel=Ugyldig kontonøgle
|
||||
hub.register.registerBtn=Registrer
|
||||
### Register Device Legacy
|
||||
hub.register.legacy.occupiedMsg=Navnet er allerede i brug
|
||||
@@ -177,6 +186,9 @@ hub.registerSuccess.legacy.description=For at få adgang til boksen, skal din en
|
||||
hub.registerFailed.message=Enheds registrering mislykkedes
|
||||
hub.registerFailed.description.generic=Der opstod en fejl i registreringsprocessen. Kig i applikations-loggen for flere detaljer.
|
||||
hub.registerFailed.description.deviceAlreadyExists=Denne enhed er allerede registreret af en anden bruger. Prøv at ændre brugerkontoen eller brug en anden enhed.
|
||||
### Archived
|
||||
hub.archived.message=Boksen er arkiveret
|
||||
hub.archived.description=Denne boks er blevet arkiveret og er ikke længere tilgængelig. Kontakt venligst boksens ejer.
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Adgang nægtet
|
||||
hub.unauthorized.description=Du har ikke tilladelse til at åbne denne boks. Kontant ejeren af boksen for at anmode om adgang.
|
||||
@@ -232,7 +244,7 @@ migration.impossible.moreInfo=Boksen kan stadig åbnes med en ældre version. Fo
|
||||
## Start
|
||||
health.title=Sundhedstjek af "%s"
|
||||
health.intro.header=Sundhedstjek
|
||||
health.intro.text=Sundhedstjek afvikler en række procedurer for at opdage og muligvis løse problemer, i den interne struktur i bin boks. Vær opmærksom på:
|
||||
health.intro.text=Sundhedstjek afvikler en række procedurer for at opdage og muligvis løse problemer, i den interne struktur i din boks. Vær opmærksom på:
|
||||
health.intro.remarkSync=Sørg for, at alle enheder er synkroniseret fuldstændig, dette løser de fleste problemer.
|
||||
health.intro.remarkFix=Ikke alle problemer kan løses.
|
||||
health.intro.remarkBackup=Hvis data er beskadiget, kan kun en sikkerhedskopi hjælpe.
|
||||
@@ -257,6 +269,8 @@ health.check.detail.checkFinishedAndFound=Kontrolproceduren er kørt færdig. Ge
|
||||
health.check.detail.checkFailed=Kontrolproceduren blev afbrudt af en fejl.
|
||||
health.check.detail.checkCancelled=Kontrolproceduren blev annulleret.
|
||||
health.check.detail.listFilters.label=Filter
|
||||
health.check.detail.filterSeverity=Filtrér efter sværhedsgrad
|
||||
health.check.detail.filterFixState=Filtrér efter fix status
|
||||
health.check.detail.fixAllSpecificBtn=Løs alle af type
|
||||
health.check.exportBtn=Eksportér rapport
|
||||
## Result view
|
||||
@@ -311,7 +325,7 @@ preferences.volume.type=Standard Drev Type
|
||||
preferences.volume.type.automatic=Automatisk
|
||||
preferences.volume.docsTooltip=Åbn dokumentationen for at lære mere om de forskellige typer drev.
|
||||
preferences.volume.fuseRestartRequired=For at anvende ændringerne skal Cryptomator genstartes.
|
||||
preferences.volume.tcp.port=Standard TCP- Port
|
||||
preferences.volume.tcp.port=Standard TCP-Port
|
||||
preferences.volume.supportedFeatures=Den valgte type drev understøtter følgende funktioner:
|
||||
preferences.volume.feature.mountAuto=Automatisk valg af monteringspunkt
|
||||
preferences.volume.feature.mountToDir=Brugerdefineret mappe som monteringspunkt
|
||||
@@ -329,8 +343,13 @@ preferences.updates.lastUpdateCheck.never=aldrig
|
||||
preferences.updates.lastUpdateCheck.recently=for nylig
|
||||
preferences.updates.lastUpdateCheck.daysAgo=%s dage siden
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=%s timer siden
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.1=Venligst
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.2=lås dine bokse
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.3=for at installere opdateringen.
|
||||
preferences.updates.checkFailed=Søgning efter opdateringer fejlede. Tjek din internetforbindelse eller forsøg igen senere.
|
||||
preferences.updates.updateFailed=Opdatering mislykkedes. Installér venligst opdateringen manuelt.
|
||||
preferences.updates.upToDate=Cryptomator er opdateret.
|
||||
preferences.updates.visitDownloadPage=Besøg Downloadside
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=Støt os
|
||||
@@ -341,6 +360,7 @@ preferences.contribute.promptText=Indsæt koden for supporter-certifikatet her
|
||||
preferences.contribute.thankYou=Tak fordi du støtter Cryptomators open source-udvikling!
|
||||
preferences.contribute.donate=Donér
|
||||
preferences.contribute.sponsor=Sponsor
|
||||
preferences.contribute.removeCert.tooltip=Fjern certifikat
|
||||
|
||||
### Remove License Key Dialog
|
||||
removeCert.title=Fjern certifikat
|
||||
@@ -350,6 +370,7 @@ removeCert.description=Cryptomators kernefunktioner påvirkes ikke af dette. Hve
|
||||
|
||||
## About
|
||||
preferences.about=Om
|
||||
preferences.about.thirdPartyLicenses=Tredjepartslicenser
|
||||
|
||||
# Vault Statistics
|
||||
stats.title=Statistik for %s
|
||||
@@ -388,6 +409,8 @@ stats.access.total=Samlede adgang: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Bokse
|
||||
main.vaultlist.listEntry=Boks %s (%s)
|
||||
main.vaultlist.emptyList.onboardingInstruction=Klik her for at tilføje en boks
|
||||
main.vaultlist.contextMenu.remove=Fjern…
|
||||
main.vaultlist.contextMenu.lock=Lås
|
||||
@@ -399,13 +422,17 @@ main.vaultlist.contextMenu.share=Del…
|
||||
main.vaultlist.addVaultBtn.menuItemNew=Opret ny boks…
|
||||
main.vaultlist.addVaultBtn.menuItemExisting=Åbn eksisterende boks…
|
||||
main.vaultlist.addVaultBtn.menuItemRecover=Genopret eksisterende boks…
|
||||
main.vaultlist.addVaultButton.tooltip=Tilføj boks
|
||||
main.vaultlist.showEventsButton.tooltip=Åbn begivenhedsvisning
|
||||
##Notificaition
|
||||
main.vaultlist.showPreferencesButton.tooltip=Vis Indstillinger
|
||||
##Notification
|
||||
main.notification.updateAvailable=Opdatering er tilgængelig.
|
||||
main.notification.support=Støt Cryptomator.
|
||||
main.notification.closeButton.tooltip=Luk infobjælke
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Tak fordi du valgte Cryptomator til at beskytte dine filer. Hvis du har brug for hjælp, så tjek vores guider for at komme i gang:
|
||||
main.vaultDetail.storageLocation=Placering af boks
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=LÅST
|
||||
main.vaultDetail.unlockBtn=Lås op…
|
||||
@@ -463,12 +490,13 @@ vaultOptions.general=Generelt
|
||||
vaultOptions.general.vaultName=Boks-navn
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Lås efter inaktivitet i
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=minutter
|
||||
vaultOptions.general.autoLock.accessibleText=Lås timeout i minutter
|
||||
vaultOptions.general.unlockAfterStartup=Lås boksen op når Cryptomator starter
|
||||
vaultOptions.general.actionAfterUnlock=Efter oplåsning af boks
|
||||
vaultOptions.general.actionAfterUnlock.ignore=Gør intet
|
||||
vaultOptions.general.actionAfterUnlock.reveal=Vis drev
|
||||
vaultOptions.general.actionAfterUnlock.ask=Spørg
|
||||
vaultOptions.general.startHealthCheckBtn=Start sunhedstjek
|
||||
vaultOptions.general.startHealthCheckBtn=Start sundhedstjek
|
||||
|
||||
## Mount
|
||||
vaultOptions.mount=Montering
|
||||
@@ -493,6 +521,7 @@ vaultOptions.masterkey.forgetSavedPasswordBtn=Glem gemt adgangskode
|
||||
vaultOptions.masterkey.recoveryKeyExplanation=En gendannelsesnøgle er den eneste måde du kan få adgang til din boks på, hvis du har glemt dit password.
|
||||
vaultOptions.masterkey.showRecoveryKeyBtn=Vis gendannelsesnøgle
|
||||
vaultOptions.masterkey.recoverPasswordBtn=Nulstil adgangskode
|
||||
vaultOptions.masterkey.missingMasterkeyFile=Disse tilvalg er kun tilgængelige hvis masterkeyfilen er til stede i boksmappen.
|
||||
## Hub
|
||||
vaultOptions.hub=Gendannelse
|
||||
vaultOptions.hub.convertInfo=Du kan bruge gendannelsesnøglen til at konvertere denne Hub-boks til en adgangskode-baseret boks i en nødsituation.
|
||||
@@ -518,9 +547,11 @@ recoveryKey.printout.heading=Cryptomator gendannelsesnøgle\n"%s"\n
|
||||
recoveryKey.recover.resetBtn=Nulstil
|
||||
recoveryKey.recover.recoverBtn=Gendan
|
||||
### Recovery Key Password Reset Success
|
||||
recoveryKey.recover.resetSuccess.message=Adgangskod nulstillet
|
||||
recoveryKey.recover.resetSuccess.message=Adgangskode nulstillet
|
||||
recoveryKey.recover.resetSuccess.description=Du kan nu låse din boks op med den nye adgangskode.
|
||||
### Recovery Key Vault Config Reset Success
|
||||
recoveryKey.recover.resetVaultConfigSuccess.message=Bokskonfiguration gendannet
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.message=Masterkey-fil genoprettet
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.description=Du kan låse din boks op med din adgangskode nu.
|
||||
|
||||
# Recover Vault Config File and/or Masterkey
|
||||
@@ -630,7 +661,7 @@ shareVault.hubAd.description=Den sikre måde at arbejde i hold
|
||||
shareVault.hubAd.keyManagement=Zero-knowledge nøgle håndtering
|
||||
shareVault.hubAd.authentication=Stærk autentifikation
|
||||
shareVault.hubAd.encryption=End-to-end-kryptering
|
||||
shareVault.visitHub=Besøg Kryptomator Hub
|
||||
shareVault.visitHub=Besøg Cryptomator Hub
|
||||
|
||||
shareVault.hub.message=Sådan deler du en Hub boks
|
||||
shareVault.hub.description=For at dele indholdet i boksen med et andet holdmedlem skal du udføre to trin:
|
||||
@@ -644,9 +675,11 @@ decryptNames.filePicker.title=Vælg krypteret fil
|
||||
decryptNames.filePicker.extensionDescription=Cryptomator krypteret fil
|
||||
decryptNames.copyTable.tooltip=Kopiér tabel
|
||||
decryptNames.clearTable.tooltip=Ryd tabel
|
||||
decryptNames.column.encrypted=Krypteret
|
||||
decryptNames.column.decrypted=Dekrypteret
|
||||
decryptNames.copyHint=Kopiér celleindhold med %s
|
||||
decryptNames.dropZone.message=Slip filer eller klik for at vælge
|
||||
decryptNames.dropZone.error.vaultInternalFiles=Boks interne filer med intet dekrypterbart navn valgt
|
||||
decryptNames.dropZone.error.vaultInternalFiles=Boks interne filer med intet dekryptérbart navn valgt
|
||||
decryptNames.dropZone.error.foreignFiles=Filer hører ikke til boksen "%s"
|
||||
decryptNames.dropZone.error.noDirIdBackup=Mappe af valgte filer indeholder ikke dirId.c9r fil
|
||||
decryptNames.dropZone.error.generic=Kunne ikke dekryptere filnavne
|
||||
@@ -656,23 +689,31 @@ decryptNames.dropZone.error.generic=Kunne ikke dekryptere filnavne
|
||||
eventView.title=Begivenheder
|
||||
eventView.filter.allVaults=Alle
|
||||
eventView.clearListButton.tooltip=Ryd liste
|
||||
eventView.filterVaults=Filtrér efter boks
|
||||
eventView.cell.actionsButton.tooltip=Begivenhedshandlinger
|
||||
## event list entries
|
||||
eventView.entry.vaultLocked.description=Lås "%s" op for detaljer
|
||||
eventView.entry.conflictResolved.message=Løst konflikt
|
||||
eventView.entry.conflictResolved.showDecrypted=Vis dekrypteret fil
|
||||
eventView.entry.conflictResolved.copyDecrypted=Kopiér dekrypteret sti
|
||||
eventView.entry.conflict.message=Konfliktløsning mislykkedes
|
||||
eventView.entry.conflict.showDecrypted=Vis dekrypteret, original fil
|
||||
eventView.entry.conflict.copyDecrypted=Kopier dekrypteret, original sti
|
||||
eventView.entry.conflict.showEncrypted=Vis modstridende, krypteret fil
|
||||
eventView.entry.conflict.copyEncrypted=Kopier modstridende, krypteret sti
|
||||
eventView.entry.decryptionFailed.message=Dekryptering mislykkedes
|
||||
eventView.entry.decryptionFailed.showEncrypted=Vis krypteret fil
|
||||
eventView.entry.decryptionFailed.copyEncrypted=Kopiér krypteret sti
|
||||
eventView.entry.brokenDirFile.message=Brudt mappelink
|
||||
eventView.entry.brokenDirFile.showEncrypted=Vis brudt, krypteret link
|
||||
eventView.entry.brokenDirFile.copyEncrypted=Kopiér sti til brudt link
|
||||
eventView.entry.brokenFileNode.message=Brudt filsystem-node
|
||||
eventView.entry.brokenFileNode.showEncrypted=Vis brudt, krypteret node
|
||||
eventView.entry.brokenFileNode.copyEncrypted=Kopiér sti af brudt, krypteret node
|
||||
eventView.entry.brokenFileNode.copyDecrypted=Kopiér dekrypteret sti
|
||||
eventView.entry.inUse.message=Fil i brug
|
||||
eventView.entry.inUse.showDecrypted=Vis dekrypteret fil
|
||||
eventView.entry.inUse.showEncrypted=Vis krypteret fil
|
||||
eventView.entry.inUse.copyUserAndDevice=Kopiér låsebruger og enhedsnavn
|
||||
eventView.entry.inUse.ignoreLock=Ignorér anvendelsesstatus
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=Filen er i brug på en anden enhed
|
||||
notification.inUse.description=Filen er åbnet af %s på %s. Bed dem om at lukke filen og lade synkroniseringen afslutte. Du kan ignorere status for at åbne den nu, men det kan forårsage konflikter eller overskrive nyere ændringer.
|
||||
notification.inUse.action=Ignorér anvendelsesstatus
|
||||
@@ -12,10 +12,14 @@ generic.button.close=Schließen
|
||||
generic.button.copy=Kopieren
|
||||
generic.button.copied=Kopiert!
|
||||
generic.button.done=Fertig
|
||||
generic.button.previous=Vorheriges
|
||||
generic.button.next=Weiter
|
||||
generic.button.print=Drucken
|
||||
generic.button.remove=Entfernen
|
||||
|
||||
## Vault state
|
||||
vault.state.error=Fehler
|
||||
|
||||
# Error
|
||||
error.message=Ein Fehler ist aufgetreten
|
||||
error.description=Cryptomator hat diesen Fehler nicht erwartet. Du kannst für ihn nach bestehenden Lösungen suchen oder – falls der Fehler noch nicht gemeldet wurde – einen Fehlerbericht einreichen.
|
||||
@@ -177,6 +181,9 @@ hub.registerSuccess.legacy.description=Für den Zugriff auf den Tresor muss dein
|
||||
hub.registerFailed.message=Gerät konnte nicht registriert werden
|
||||
hub.registerFailed.description.generic=Im Registrierungsprozess ist ein Fehler aufgetreten. Weitere Details findest du im Anwendungsprotokoll.
|
||||
hub.registerFailed.description.deviceAlreadyExists=Dieses Gerät ist bereits für einen anderen Benutzer registriert. Ändere das Benutzerkonto oder verwende ein anderes Gerät.
|
||||
### Archived
|
||||
hub.archived.message=Tresor ist archiviert
|
||||
hub.archived.description=Dieser Tresor wurde archiviert, daher ist ein Zugriff darauf nicht mehr möglich. Kontaktiere den Eigentümer des Tresors.
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Zugriff verweigert
|
||||
hub.unauthorized.description=Du bist nicht berechtigt, diesen Tresor zu öffnen. Wende dich an den Tresoreigentümer, um Zugriff zu erhalten.
|
||||
@@ -329,8 +336,13 @@ preferences.updates.lastUpdateCheck.never=nie
|
||||
preferences.updates.lastUpdateCheck.recently=kürzlich
|
||||
preferences.updates.lastUpdateCheck.daysAgo=vor %s Tagen
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=vor %s Stunden
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.1=Bitte
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.2=sperre deine Tresore
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.3=um das Update zu installieren.
|
||||
preferences.updates.checkFailed=Die Suche nach Updates ist fehlgeschlagen. Bitte überprüfe deine Internetverbindung oder versuche es später erneut.
|
||||
preferences.updates.updateFailed=Update fehlgeschlagen. Bitte installiere das Update manuell.
|
||||
preferences.updates.upToDate=Cryptomator ist aktuell.
|
||||
preferences.updates.visitDownloadPage=Besuche die Download-Seite
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=Unterstütze uns
|
||||
@@ -341,6 +353,7 @@ preferences.contribute.promptText=Füge hier den Code des Supporter-Zertifikats
|
||||
preferences.contribute.thankYou=Danke, dass Du die Open-Source-Entwicklung von Cryptomator unterstützt!
|
||||
preferences.contribute.donate=Spenden
|
||||
preferences.contribute.sponsor=Sponsern
|
||||
preferences.contribute.removeCert.tooltip=Zertifikat entfernen
|
||||
|
||||
### Remove License Key Dialog
|
||||
removeCert.title=Zertifikat entfernen
|
||||
@@ -350,6 +363,7 @@ removeCert.description=Die Kernfunktionen von Cryptomator sind davon nicht betro
|
||||
|
||||
## About
|
||||
preferences.about=Über
|
||||
preferences.about.thirdPartyLicenses=Drittanbieter-Lizenzen
|
||||
|
||||
# Vault Statistics
|
||||
stats.title=Statistiken für %s
|
||||
@@ -388,6 +402,7 @@ stats.access.total=Gesamtzugriffe: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Tresore
|
||||
main.vaultlist.emptyList.onboardingInstruction=Klicke hier, um einen Tresor hinzuzufügen
|
||||
main.vaultlist.contextMenu.remove=Entfernen …
|
||||
main.vaultlist.contextMenu.lock=Sperren
|
||||
@@ -399,8 +414,10 @@ main.vaultlist.contextMenu.share=Teilen …
|
||||
main.vaultlist.addVaultBtn.menuItemNew=Neuen Tresor erstellen…
|
||||
main.vaultlist.addVaultBtn.menuItemExisting=Bestehenden Tresor öffnen…
|
||||
main.vaultlist.addVaultBtn.menuItemRecover=Bestehenden Tresor wiederherstellen…
|
||||
main.vaultlist.showEventsButton.tooltip=Ereignis-Ansicht öffnen
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Tresor hinzufügen
|
||||
main.vaultlist.showEventsButton.tooltip=Ereignisansicht öffnen
|
||||
main.vaultlist.showPreferencesButton.tooltip=Einstellungen anzeigen
|
||||
##Notification
|
||||
main.notification.updateAvailable=Eine neue Version ist verfügbar.
|
||||
main.notification.support=Unterstütze Cryptomator.
|
||||
## Vault Detail
|
||||
@@ -463,6 +480,7 @@ vaultOptions.general=Allgemein
|
||||
vaultOptions.general.vaultName=Tresorname
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Nach
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=Minuten Inaktivität sperren
|
||||
vaultOptions.general.autoLock.accessibleText=Sperr-Timeout in Minuten
|
||||
vaultOptions.general.unlockAfterStartup=Tresor beim Start von Cryptomator entsperren
|
||||
vaultOptions.general.actionAfterUnlock=Nach erfolgreichem Entsperren
|
||||
vaultOptions.general.actionAfterUnlock.ignore=Nichts tun
|
||||
@@ -646,6 +664,8 @@ decryptNames.filePicker.title=Verschlüsselte Datei auswählen
|
||||
decryptNames.filePicker.extensionDescription=Cryptomator-verschlüsselte Datei
|
||||
decryptNames.copyTable.tooltip=Tabelle kopieren
|
||||
decryptNames.clearTable.tooltip=Tabelle leeren
|
||||
decryptNames.column.encrypted=Verschlüsselt
|
||||
decryptNames.column.decrypted=Entschlüsselt
|
||||
decryptNames.copyHint=Inhalt der Zelle mit %s kopieren
|
||||
decryptNames.dropZone.message=Dateien ablegen oder zum Auswählen klicken
|
||||
decryptNames.dropZone.error.vaultInternalFiles=Tresor interne Dateien mit nicht-entschlüsselbaren Namen ausgewählt
|
||||
@@ -658,23 +678,27 @@ decryptNames.dropZone.error.generic=Fehler beim Entschlüsseln der Dateinamen
|
||||
eventView.title=Ereignisse
|
||||
eventView.filter.allVaults=Alle
|
||||
eventView.clearListButton.tooltip=Liste leeren
|
||||
eventView.filterVaults=Nach Tresor filtern
|
||||
eventView.cell.actionsButton.tooltip=Ereignisaktionen
|
||||
## event list entries
|
||||
eventView.entry.vaultLocked.description=Entsperre "%s" für Details
|
||||
eventView.entry.conflictResolved.message=Konflikt gelöst
|
||||
eventView.entry.conflictResolved.showDecrypted=Entschlüsselte Datei anzeigen
|
||||
eventView.entry.conflictResolved.copyDecrypted=Pfad der entschlüsselten Datei kopieren
|
||||
eventView.entry.conflict.message=Konfliktlösung fehlgeschlagen
|
||||
eventView.entry.conflict.showDecrypted=Entschlüsselte, ursprüngliche Datei anzeigen
|
||||
eventView.entry.conflict.copyDecrypted=Entschlüsselten, ursprünglicher Pfad kopieren
|
||||
eventView.entry.conflict.showEncrypted=Zeige verschlüsselte Konfliktdatei
|
||||
eventView.entry.conflict.copyEncrypted=Verschlüsselten Konfliktpfad kopieren
|
||||
eventView.entry.decryptionFailed.message=Entschlüsselung fehlgeschlagen
|
||||
eventView.entry.decryptionFailed.showEncrypted=Verschlüsselte Datei anzeigen
|
||||
eventView.entry.decryptionFailed.copyEncrypted=Pfad der verschlüsselten Datei kopieren
|
||||
eventView.entry.brokenDirFile.message=Ungültiger Verzeichnislink
|
||||
eventView.entry.brokenDirFile.showEncrypted=Defekten, verschlüsselten Link anzeigen
|
||||
eventView.entry.brokenDirFile.copyEncrypted=Pfad des ungültigen Links kopieren
|
||||
eventView.entry.brokenFileNode.message=Beschädigter Dateisystemknoten
|
||||
eventView.entry.brokenFileNode.showEncrypted=Beschädigten, verschlüsselten Knoten anzeigen
|
||||
eventView.entry.brokenFileNode.copyEncrypted=Pfad des beschädigten, verschlüsselten Knotens kopieren
|
||||
eventView.entry.brokenFileNode.copyDecrypted=Pfad der entschlüsselten Datei kopieren
|
||||
eventView.entry.inUse.showDecrypted=Entschlüsselte Datei anzeigen
|
||||
eventView.entry.inUse.showEncrypted=Verschlüsselte Datei anzeigen
|
||||
eventView.entry.inUse.copyUserAndDevice=Benutzer- und Gerätenamen der Sperre kopieren
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.action=Verwendungsstatus ignorieren
|
||||
@@ -12,10 +12,14 @@ generic.button.close=Κλείσιμο
|
||||
generic.button.copy=Αντιγραφή
|
||||
generic.button.copied=Αντιγράφηκε!
|
||||
generic.button.done=Κλείσιμο
|
||||
generic.button.previous=Προηγούμενο
|
||||
generic.button.next=Επόμενο
|
||||
generic.button.print=Εκτύπωση
|
||||
generic.button.remove=Αφαίρεση
|
||||
|
||||
## Vault state
|
||||
vault.state.error=Σφάλμα
|
||||
|
||||
# Error
|
||||
error.message=Παρουσιάστηκε σφάλμα
|
||||
error.description=Ωχ! Το Cryptomator δεν περίμενε να συμβεί αυτό. Μπορείτε να αναζητήσετε υπάρχουσες λύσεις για αυτό το σφάλμα. Ή εάν δεν έχει αναφερθεί ακόμα, μη διστάσετε να το κάνετε.
|
||||
@@ -175,6 +179,7 @@ hub.registerSuccess.legacy.description=Για να αποκτήσετε πρόσ
|
||||
hub.registerFailed.message=Η εγγραφή της συσκευής απέτυχε
|
||||
hub.registerFailed.description.generic=Παρουσιάστηκε σφάλμα στη διαδικασία εγγραφής. Για περισσότερες λεπτομέρειες, ανατρέξτε στο αρχείο καταγραφής της εφαρμογής.
|
||||
hub.registerFailed.description.deviceAlreadyExists=Αυτή η συσκευή είναι ήδη εγγεγραμμένη για διαφορετικό χρήστη. Προσπαθήστε να αλλάξετε τον λογαριασμό χρήστη ή να χρησιμοποιήσετε διαφορετική συσκευή.
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Δεν επιτρέπεται η πρόσβαση
|
||||
hub.unauthorized.description=Δεν είστε εξουσιοδοτημένοι να ανοίξετε αυτή την κρύπτη. Επικοινωνήστε με τον ιδιοκτήτη τς κρύπτης για να ζητήσετε πρόσβαση.
|
||||
@@ -386,6 +391,7 @@ stats.access.total=Συνολική πρόσβαση: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Κρύπτες
|
||||
main.vaultlist.emptyList.onboardingInstruction=Κάντε κλικ εδώ για να προσθέσετε ένα vault
|
||||
main.vaultlist.contextMenu.remove=Αφαίρεση…
|
||||
main.vaultlist.contextMenu.lock=Κλείδωμα
|
||||
@@ -394,8 +400,8 @@ main.vaultlist.contextMenu.unlockNow=Ξεκλείδωμα τώρα
|
||||
main.vaultlist.contextMenu.vaultoptions=Εμφάνιση επιλογών Vault
|
||||
main.vaultlist.contextMenu.reveal=Αποκάλυψη εικονικού δίσκου
|
||||
main.vaultlist.contextMenu.share=Κοινοποίηση…
|
||||
main.vaultlist.showEventsButton.tooltip=Άνοιγμα προβολής συμβάντων
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Προσθήκη Κρύπτης
|
||||
##Notification
|
||||
main.notification.updateAvailable=Η ενημέρωση είναι διαθέσιμη.
|
||||
main.notification.support=Υποστήριξη Cryptomator.
|
||||
## Vault Detail
|
||||
@@ -624,19 +630,19 @@ eventView.clearListButton.tooltip=Εκκαθάριση λίστας
|
||||
eventView.entry.vaultLocked.description=Ξεκλείδωμα "%s" για λεπτομέρειες
|
||||
eventView.entry.conflictResolved.message=Επίλυση σύγκρουσης
|
||||
eventView.entry.conflictResolved.showDecrypted=Εμφάνιση αποκρυπτογραφημένου αρχείου
|
||||
eventView.entry.conflictResolved.copyDecrypted=Αντιγραφή αποκρυπτογραφημένης διαδρομής
|
||||
eventView.entry.conflict.message=Η επίλυση συγκρούσεων απέτυχε
|
||||
eventView.entry.conflict.showDecrypted=Εμφάνιση αποκρυπτογραφημένων, αρχικό αρχείο
|
||||
eventView.entry.conflict.copyDecrypted=Αντιγραφή αποκρυπτογραφημένων, αρχική διαδρομή
|
||||
eventView.entry.conflict.showEncrypted=Εμφάνιση αντικρουόμενου, κρυπτογραφημένο αρχείο
|
||||
eventView.entry.conflict.copyEncrypted=Αντιγραφή σύγκρουσης, κρυπτογραφημένη διαδρομή
|
||||
eventView.entry.decryptionFailed.message=Η αποκρυπτογράφηση απέτυχε
|
||||
eventView.entry.decryptionFailed.showEncrypted=Εμφάνιση κρυπτογραφημένου αρχείου
|
||||
eventView.entry.decryptionFailed.copyEncrypted=Αντιγραφή κρυπτογραφημένης διαδρομής
|
||||
eventView.entry.brokenDirFile.message=Μη λειτουργικός σύνδεσμος καταλόγου
|
||||
eventView.entry.brokenDirFile.showEncrypted=Εμφάνιση μη λειτουργικού, κρυπτογραφημένου συνδέσμου
|
||||
eventView.entry.brokenDirFile.copyEncrypted=Αντιγραφή διαδρομής του μη λειτουργικού συνδέσμου
|
||||
eventView.entry.brokenFileNode.message=Μη λειτουργικός κόμβος συστήματος αρχείων
|
||||
eventView.entry.brokenFileNode.showEncrypted=Εμφάνιση μη λειτουργικού, κρυπτογραφημένου κόμβου
|
||||
eventView.entry.brokenFileNode.copyEncrypted=Αντιγραφή διαδρομής του μη λειτουργικού, κρυπτογραφημένου κόμβου
|
||||
eventView.entry.brokenFileNode.copyDecrypted=Αντιγραφή αποκρυπτογραφημένης διαδρομής
|
||||
eventView.entry.inUse.showDecrypted=Εμφάνιση αποκρυπτογραφημένου αρχείου
|
||||
eventView.entry.inUse.showEncrypted=Εμφάνιση κρυπτογραφημένου αρχείου
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,14 @@ generic.button.close=Cerrar
|
||||
generic.button.copy=Copiar
|
||||
generic.button.copied=¡Copiado!
|
||||
generic.button.done=Hecho
|
||||
generic.button.previous=Anterior
|
||||
generic.button.next=Siguiente
|
||||
generic.button.print=Imprimir
|
||||
generic.button.remove=Eliminar
|
||||
|
||||
## Vault state
|
||||
vault.state.error=Error
|
||||
|
||||
# Error
|
||||
error.message=Ocurrió un error
|
||||
error.description=Cryptomator no esperaba que esto sucediera. Puede buscar soluciones existentes para este error. O si aún no se ha notificado, siéntase libre de hacerlo.
|
||||
@@ -177,6 +181,7 @@ hub.registerSuccess.legacy.description=Para acceder a la bóveda, su dispositivo
|
||||
hub.registerFailed.message=El registro del dispositivo ha fallado
|
||||
hub.registerFailed.description.generic=Ha ocurrido un error al intentar registrarse. Para más detalles, consulte el registro de la aplicación.
|
||||
hub.registerFailed.description.deviceAlreadyExists=Este dispositivo ya se ha registrado para otro usuario. Intente cambiar la cuenta de usuario o utilice un dispositivo diferente.
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Acceso denegado
|
||||
hub.unauthorized.description=No tiene autorización para abrir esta bóveda. Contacta al propietario de la bóveda para solicitar acceso.
|
||||
@@ -257,6 +262,8 @@ health.check.detail.checkFinishedAndFound=La comprobación terminó de ejecutars
|
||||
health.check.detail.checkFailed=La comprobación terminó debido a un error.
|
||||
health.check.detail.checkCancelled=La comprobación se canceló.
|
||||
health.check.detail.listFilters.label=Filtro
|
||||
health.check.detail.filterSeverity=Filtrar por gravedad
|
||||
health.check.detail.filterFixState=Filtrar por estado fijo
|
||||
health.check.detail.fixAllSpecificBtn=Reparar todo del tipo
|
||||
health.check.exportBtn=Exportar informe
|
||||
## Result view
|
||||
@@ -329,8 +336,13 @@ preferences.updates.lastUpdateCheck.never=nunca
|
||||
preferences.updates.lastUpdateCheck.recently=recientemente
|
||||
preferences.updates.lastUpdateCheck.daysAgo=hace %s días
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=hace %s horas
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.1=Por favor,
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.2=bloquee sus bóvedas
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.3=para instalar la actualización.
|
||||
preferences.updates.checkFailed=La comprobación de actualizaciones ha fallado. Compruebe su conexión a Internet o inténtelo más tarde.
|
||||
preferences.updates.updateFailed=Actualización fallida. Por favor, instale la actualización manualmente.
|
||||
preferences.updates.upToDate=Cryptomator está actualizado.
|
||||
preferences.updates.visitDownloadPage=Visita la página de descarga
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=Apóyenos
|
||||
@@ -341,6 +353,7 @@ preferences.contribute.promptText=Pegue aquí el código de certificado de segui
|
||||
preferences.contribute.thankYou=¡Gracias por apoyar el desarrollo de código abierto de Cryptomator!
|
||||
preferences.contribute.donate=Donar
|
||||
preferences.contribute.sponsor=Patrocinador
|
||||
preferences.contribute.removeCert.tooltip=Eliminar certificado
|
||||
|
||||
### Remove License Key Dialog
|
||||
removeCert.title=Eliminar Certificado
|
||||
@@ -350,6 +363,7 @@ removeCert.description=Las características principales de Cryptomator no se ven
|
||||
|
||||
## About
|
||||
preferences.about=Acerca de
|
||||
preferences.about.thirdPartyLicenses=Licencias de terceros
|
||||
|
||||
# Vault Statistics
|
||||
stats.title=Estadísticas para %s
|
||||
@@ -388,6 +402,7 @@ stats.access.total=Accesos totales: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Bóvedas
|
||||
main.vaultlist.emptyList.onboardingInstruction=Haga clic aquí para añadir una bóveda
|
||||
main.vaultlist.contextMenu.remove=Eliminar…
|
||||
main.vaultlist.contextMenu.lock=Bloquear
|
||||
@@ -399,8 +414,10 @@ main.vaultlist.contextMenu.share=Compartir…
|
||||
main.vaultlist.addVaultBtn.menuItemNew=
|
||||
main.vaultlist.addVaultBtn.menuItemExisting=
|
||||
main.vaultlist.addVaultBtn.menuItemRecover=
|
||||
main.vaultlist.addVaultButton.tooltip=Añadir bóveda
|
||||
main.vaultlist.showEventsButton.tooltip=Abrir vista de evento
|
||||
##Notificaition
|
||||
main.vaultlist.showPreferencesButton.tooltip=Mostrar preferencias
|
||||
##Notification
|
||||
main.notification.updateAvailable=Existen actualizaciones disponibles.
|
||||
main.notification.support=Soporte de Cryptomator.
|
||||
## Vault Detail
|
||||
@@ -463,6 +480,7 @@ vaultOptions.general=General
|
||||
vaultOptions.general.vaultName=Nombre de la bóveda
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Bloquear después de
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=minutos
|
||||
vaultOptions.general.autoLock.accessibleText=Tiempo de bloqueo en minutos
|
||||
vaultOptions.general.unlockAfterStartup=Desbloquear bóveda al iniciar Cryptomator
|
||||
vaultOptions.general.actionAfterUnlock=Después de desbloquear con éxito
|
||||
vaultOptions.general.actionAfterUnlock.ignore=No hacer nada
|
||||
@@ -516,29 +534,59 @@ recoveryKey.recover.invalidKey=Esta clave de recuperación no es válida
|
||||
recoveryKey.printout.heading=Clave de recuperación de Cryptomator\n"%s"\n
|
||||
### Reset Password
|
||||
recoveryKey.recover.resetBtn=## Reiniciar contraseña\nrecoveryKey.recover.resetBtn
|
||||
recoveryKey.recover.recoverBtn=Recuperar
|
||||
### Recovery Key Password Reset Success
|
||||
recoveryKey.recover.resetSuccess.message=Contraseña restablecida con éxito
|
||||
recoveryKey.recover.resetSuccess.description=Puede desbloquear su bóveda con la contraseña nueva.
|
||||
### Recovery Key Vault Config Reset Success
|
||||
recoveryKey.recover.resetVaultConfigSuccess.message=Configuración de bóveda recuperada
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.message=Archivo Masterkey recuperado
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.description=Ahora puedes desbloquear tu bóveda con tu contraseña.
|
||||
|
||||
# Recover Vault Config File and/or Masterkey
|
||||
##Add Existing Vault without recovery - Dialog
|
||||
recover.existing.title=Bóveda añadida
|
||||
recover.existing.message=La bóveda se ha añadido correctamente
|
||||
recover.existing.description=Tu bóveda "%s" ha sido añadida a la lista de bóvedas. No ha sido necesario ningún proceso de recuperación.
|
||||
|
||||
##Vault Already Exists - Dialog
|
||||
recover.alreadyExists.title=La bóveda ya existe
|
||||
recover.alreadyExists.message=Esta bóveda ya ha sido añadida
|
||||
recover.alreadyExists.description=Tu bóveda "%s" ya está presente en tu lista de bóvedas y, por lo tanto, no se ha añadido de nuevo.
|
||||
|
||||
##Invalid Selection - Dialog
|
||||
recover.invalidSelection.title=Selección no válida
|
||||
recover.invalidSelection.message=Su selección no es una bóveda
|
||||
recover.invalidSelection.description=La carpeta seleccionada debe ser una bóveda de Cryptomator válida.
|
||||
|
||||
## Contact Hub Vault Owner - Dialog
|
||||
contactHubVaultOwner.title=Bóveda de Hub
|
||||
contactHubVaultOwner.message=Esta bóveda fue creada con Cryptomator Hub
|
||||
contactHubVaultOwner.description=Póngase en contacto con el propietario de la bóveda para restaurar el archivo que falta. Pueden descargar la plantilla de la bóveda desde Cryptomator Hub.
|
||||
|
||||
##Dialog Title
|
||||
recover.recoverVaultConfig.title=Recuperar configuración de bóveda
|
||||
recover.recoverMasterkey.title=Recuperar MasterKey
|
||||
|
||||
## OnBoarding
|
||||
recover.onBoarding.chooseMethod=Elija el método de recuperación:
|
||||
recover.onBoarding.useRecoveryKey=Usar clave de recuperación
|
||||
recover.onBoarding.usePassword=Usar contraseña
|
||||
recover.onBoarding.intro=Asegúrese de comprobar lo siguiente:
|
||||
recover.onBoarding.pleaseConfirm=Antes de proceder, confirme que:
|
||||
recover.onBoarding.otherwisePleaseConfirm=De lo contrario, confirme que:
|
||||
recover.onBoarding.allMissing.intro=Si esta bóveda es administrada por Cryptomator Hub, el propietario de la bóveda debe restaurarla por usted.
|
||||
recover.onBoarding.intro.ensure=Todos los archivos están totalmente sincronizados.
|
||||
recover.onBoarding.affirmation=He leído y comprendido estos requisitos
|
||||
|
||||
###Vault Config Missing
|
||||
recover.onBoarding.intro.recoveryKey=Tiene la clave de recuperación y sabe si se han utilizado los ajustes expertos.
|
||||
recover.onBoarding.intro.password=Tiene la contraseña y sabe si se han utilizado los ajustes expertos.
|
||||
###Masterkey Missing
|
||||
recover.onBoarding.intro.masterkey.recoveryKey=Tiene la clave de recuperación de la bóveda.
|
||||
|
||||
## Expert Settings
|
||||
recover.expertSettings.shorteningThreshold.title=Este valor debe coincidir con el utilizado antes de la recuperación para asegurar la compatibilidad con datos cifrados previamente.
|
||||
|
||||
# Convert Vault
|
||||
convertVault.title=Convertir bóveda
|
||||
@@ -616,6 +664,8 @@ decryptNames.filePicker.title=Seleccione archivo cifrado
|
||||
decryptNames.filePicker.extensionDescription=Archivo cifrado Cryptomator
|
||||
decryptNames.copyTable.tooltip=Copiar tabla
|
||||
decryptNames.clearTable.tooltip=Limpiar tabla
|
||||
decryptNames.column.encrypted=Cifrado
|
||||
decryptNames.column.decrypted=Descifrado
|
||||
decryptNames.copyHint=Copiar contenido de celda con %s
|
||||
decryptNames.dropZone.message=Soltar archivos o hacer clic para seleccionar
|
||||
decryptNames.dropZone.error.vaultInternalFiles=Archivos internos de la bóveda sin nombre descifrable seleccionado
|
||||
@@ -628,23 +678,30 @@ decryptNames.dropZone.error.generic=Error al descifrar nombre de archivos
|
||||
eventView.title=Eventos
|
||||
eventView.filter.allVaults=Todos
|
||||
eventView.clearListButton.tooltip=Borrar lista
|
||||
eventView.filterVaults=Filtrar por bóveda
|
||||
eventView.cell.actionsButton.tooltip=Acciones del evento
|
||||
## event list entries
|
||||
eventView.entry.vaultLocked.description=Desbloquear "%s" para más detalles
|
||||
eventView.entry.conflictResolved.message=Conflicto resuelto
|
||||
eventView.entry.conflictResolved.showDecrypted=Mostrar archivo descifrado
|
||||
eventView.entry.conflictResolved.copyDecrypted=Copiar ruta descifrada
|
||||
eventView.entry.conflict.message=Resolución de conflictos fallida
|
||||
eventView.entry.conflict.showDecrypted=Mostrar archivo descifrado, original
|
||||
eventView.entry.conflict.copyDecrypted=Copiar ruta descifrada, original
|
||||
eventView.entry.conflict.showEncrypted=Mostrar archivo en conflicto, cifrado
|
||||
eventView.entry.conflict.copyEncrypted=Copiar ruta en conflicto, cifrada
|
||||
eventView.entry.decryptionFailed.message=Desencriptación fallida
|
||||
eventView.entry.decryptionFailed.showEncrypted=Mostrar archivo cifrado
|
||||
eventView.entry.decryptionFailed.copyEncrypted=Copiar ruta cifrada
|
||||
eventView.entry.brokenDirFile.message=Enlace de directorio roto
|
||||
eventView.entry.brokenDirFile.showEncrypted=Mostrar enlace roto, cifrado
|
||||
eventView.entry.brokenDirFile.copyEncrypted=Copiar ruta del enlace roto
|
||||
eventView.entry.brokenFileNode.message=Nodo de sistema de archivos roto
|
||||
eventView.entry.brokenFileNode.showEncrypted=Mostrar nodo roto, cifrado
|
||||
eventView.entry.brokenFileNode.copyEncrypted=Copiar ruta del enlace roto, encriptado
|
||||
eventView.entry.brokenFileNode.copyDecrypted=Copiar ruta descifrada
|
||||
eventView.entry.inUse.message=Fichero en uso
|
||||
eventView.entry.inUse.showDecrypted=Mostrar archivo descifrado
|
||||
eventView.entry.inUse.showEncrypted=Mostrar archivo cifrado
|
||||
eventView.entry.inUse.ignoreLock=Ignorar el estado de uso
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=El archivo está en uso en otro dispositivo
|
||||
notification.inUse.description=El archivo está abierto por %s en %s. Solicítale que cierre el archivo y deje que finalice la sincronización. Puede ignorar el estado para abrirlo ahora, pero esto puede causar conflictos o sobrescribir cambios más recientes.
|
||||
notification.inUse.action=Ignorar el Estado de Uso
|
||||
@@ -12,10 +12,13 @@ generic.button.close=ببند
|
||||
generic.button.copy=کپی
|
||||
generic.button.copied=کپی شد!
|
||||
generic.button.done=انجام شده
|
||||
generic.button.previous=قبلی
|
||||
generic.button.next=بعدی
|
||||
generic.button.print=چاپ
|
||||
generic.button.remove=حذف
|
||||
|
||||
## Vault state
|
||||
|
||||
# Error
|
||||
error.message=خطایی رخ داده است
|
||||
error.description=کریپتوماتور انتظار رخ دادن این مورد را نداشت. شما میتوانید به دنبال راهکار های موجود برای این خطا بگردید، یا اگر قبلا گزارش نشده است، گزارش کنید.
|
||||
@@ -119,6 +122,7 @@ hub.register.message=دستگاه جدید
|
||||
### Registration Success
|
||||
hub.registerSuccess.unlockBtn=بازکردن قفل
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
@@ -175,7 +179,8 @@ preferences.updates.upToDate=Cryptomator به روز می باشد.
|
||||
## Vault List
|
||||
main.vaultlist.contextMenu.lock=قفل
|
||||
main.vaultlist.contextMenu.reveal=نمایش درایو
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=اضافه کردن گاوصندوق
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
### Locked
|
||||
@@ -248,3 +253,7 @@ dokanySupportEnd.preferencesBtn=باز کردن تنظیمات
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,14 @@ generic.button.close=Sulje
|
||||
generic.button.copy=Kopioi
|
||||
generic.button.copied=Kopioitu!
|
||||
generic.button.done=Valmis
|
||||
generic.button.previous=Edellinen
|
||||
generic.button.next=Seuraava
|
||||
generic.button.print=Tulosta
|
||||
generic.button.remove=Poista
|
||||
|
||||
## Vault state
|
||||
vault.state.error=Virhe
|
||||
|
||||
# Error
|
||||
error.message=Tapahtui virhe
|
||||
error.description=Cryptomator ei odottanut tämän tapahtuvan. Voit etsiä olemassa olevia ratkaisuja tähän virheeseen. Tai jos sitä ei ole vielä raportoitu, voit tehdä niin.
|
||||
@@ -96,6 +100,7 @@ addvault.new.readme.accessLocation.4=Voit halutessasi poistaa tämän tiedoston.
|
||||
## Existing
|
||||
addvaultwizard.existing.title=Lisää olemassa oleva holvi
|
||||
addvaultwizard.existing.instruction=Valitse olemassa olevan Cryptomator holvin "vault.cryptomator" -tiedosto. Mikäli "vault.cryptomator" -tiedostoa ei ole, valitse "masterkey.cryptomator" -tiedosto.
|
||||
addvaultwizard.existing.restore=Palauta…
|
||||
addvaultwizard.existing.chooseBtn=Valitse…
|
||||
addvaultwizard.existing.filePickerTitle=Valitse Holvi -tiedosto
|
||||
addvaultwizard.existing.filePickerMimeDesc=Cryptomator Holvi
|
||||
@@ -127,6 +132,7 @@ unlock.unlockBtn=Avaa
|
||||
## Select
|
||||
unlock.chooseMasterkey.message=Masterkey-tiedostoa ei löydy
|
||||
unlock.chooseMasterkey.description=Cryptomator ei paikantanut masterkey-tiedostoa holville "%s". Ole hyvä ja valitse tiedosto manuaalisesti.
|
||||
unlock.chooseMasterkey.restoreInstead=Palauta pääavaintiedosto
|
||||
unlock.chooseMasterkey.filePickerTitle=Valitse masterkey-tiedosto
|
||||
unlock.chooseMasterkey.filePickerMimeDesc=Cryptomator masterkey
|
||||
## Success
|
||||
@@ -175,6 +181,7 @@ hub.registerSuccess.legacy.description=Käyttääksesi holvia, holvin omistajan
|
||||
hub.registerFailed.message=Laitteen rekisteröinti epäonnistui
|
||||
hub.registerFailed.description.generic=Rekisteröinnissä tapahtui virhe. Löydät lisätietoja lokitiedostoista.
|
||||
hub.registerFailed.description.deviceAlreadyExists=Tämä laite on jo rekisteröity toiselle käyttäjälle. Yritä vaihtaa käyttäjätiliä tai käytää toista laitetta.
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Pääsy estetty
|
||||
hub.unauthorized.description=Sinulla ei ole oikeutta avata tätä holvia. Ota yhteyttä holvin omistajaan pyytääksesi pääsyä.
|
||||
@@ -255,6 +262,8 @@ health.check.detail.checkFinishedAndFound=Testi suorietttiin loppuun. Ole hyvä
|
||||
health.check.detail.checkFailed=Testi päättyi virheen vuoksi.
|
||||
health.check.detail.checkCancelled=Testi peruutettiin.
|
||||
health.check.detail.listFilters.label=Suodata
|
||||
health.check.detail.filterSeverity=Suodata vakavuuden mukaan
|
||||
health.check.detail.filterFixState=Suodata korjauksen tilan mukaan
|
||||
health.check.detail.fixAllSpecificBtn=Korjaa kaikki tyyppiä
|
||||
health.check.exportBtn=Vie raportti
|
||||
## Result view
|
||||
@@ -327,8 +336,13 @@ preferences.updates.lastUpdateCheck.never=ei koskaan
|
||||
preferences.updates.lastUpdateCheck.recently=viimeaikoina
|
||||
preferences.updates.lastUpdateCheck.daysAgo=%s päivää sitten
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=%s tuntia sitten
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.1=Ole hyvä
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.2=lukitse holvisi
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.3=asentaaksesi päivityksen.
|
||||
preferences.updates.checkFailed=Päivitysten etsiminen epäonnistui. Tarkista internetyhteys tai yritä myöhemmin uudelleen.
|
||||
preferences.updates.updateFailed=Päivitys epäonnistui. Asenna päivitys manuaalisesti.
|
||||
preferences.updates.upToDate=Cryptomator on ajan tasalla.
|
||||
preferences.updates.visitDownloadPage=Mene lataussivulle
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=Tue meitä
|
||||
@@ -339,6 +353,7 @@ preferences.contribute.promptText=Liitä tukijasertifikaatin koodi tähän
|
||||
preferences.contribute.thankYou=Kiitos tuestasi Cryptomatorin avoimeen kehittämiseen!
|
||||
preferences.contribute.donate=Lahjoita
|
||||
preferences.contribute.sponsor=Sponsori
|
||||
preferences.contribute.removeCert.tooltip=Poista lisenssi
|
||||
|
||||
### Remove License Key Dialog
|
||||
removeCert.title=Poista sertifikaatti
|
||||
@@ -348,9 +363,11 @@ removeCert.description=Tämä ei vaikuta Cryptomatorin ydintoimintoihin. Holveih
|
||||
|
||||
## About
|
||||
preferences.about=Tietoja
|
||||
preferences.about.thirdPartyLicenses=Kolmansien osapuolien käyttöoikeudet
|
||||
|
||||
# Vault Statistics
|
||||
stats.title=%s tilastot
|
||||
stats.cacheHitRate=Välimuistin osumatarkkuus
|
||||
## Read
|
||||
stats.read.throughput.idle=Luku: toimeton
|
||||
stats.read.throughput.kibs=Luku: %.2f KiB/s
|
||||
@@ -393,8 +410,13 @@ main.vaultlist.contextMenu.unlockNow=Avaa Nyt
|
||||
main.vaultlist.contextMenu.vaultoptions=Näytä holvin asetukset
|
||||
main.vaultlist.contextMenu.reveal=Paljasta Asema
|
||||
main.vaultlist.contextMenu.share=Jaa…
|
||||
main.vaultlist.addVaultBtn.menuItemNew=Luo uusi holvi…
|
||||
main.vaultlist.addVaultBtn.menuItemExisting=Avaa olemassaoleva holvi…
|
||||
main.vaultlist.addVaultBtn.menuItemRecover=Palauta olemassaoleva holvi…
|
||||
main.vaultlist.addVaultButton.tooltip=Lisää holvi
|
||||
main.vaultlist.showEventsButton.tooltip=Avaa tapahtumanäkymä
|
||||
##Notificaition
|
||||
main.vaultlist.showPreferencesButton.tooltip=Näytä asetukset
|
||||
##Notification
|
||||
main.notification.updateAvailable=Päivitys on saatavilla.
|
||||
main.notification.support=Tue Cryptomatoria.
|
||||
## Vault Detail
|
||||
@@ -431,6 +453,8 @@ main.vaultDetail.missing.recheck=Tarkista uudelleen
|
||||
main.vaultDetail.missing.remove=Poista holvilistalta…
|
||||
main.vaultDetail.missing.changeLocation=Vaihda holvin sijaintia…
|
||||
### Missing Vault Config
|
||||
main.vaultDetail.missingVaultConfig.info=Holvin asetuksia ei löydy.
|
||||
main.vaultDetail.missingVaultConfig.restore=Palauta holvin asetukset
|
||||
### Needs Migration
|
||||
main.vaultDetail.migrateButton=Päivitä Holvi
|
||||
main.vaultDetail.migratePrompt=Holvisi täytyy muuntaa uuteen muotoon ennen kuin voit avata sen
|
||||
@@ -455,6 +479,7 @@ vaultOptions.general=Yleiset
|
||||
vaultOptions.general.vaultName=Holvin nimi
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Lukitse kun ollut käyttämättä
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=minuuttia
|
||||
vaultOptions.general.autoLock.accessibleText=Lukituksen aikakatkaisu minuuteissa
|
||||
vaultOptions.general.unlockAfterStartup=Avaa holvi kun Cryptomator käynnistyy
|
||||
vaultOptions.general.actionAfterUnlock=Avauksen jälkeen
|
||||
vaultOptions.general.actionAfterUnlock.ignore=Älä tee mitään
|
||||
@@ -495,6 +520,7 @@ vaultOptions.hub.convertBtn=Muunna salasanapohjaiseksi holviksi
|
||||
recoveryKey.display.title=Näytä palautusavain
|
||||
recoveryKey.create.message=Salasana vaaditaan
|
||||
recoveryKey.create.description=Syötä salasana holville "%s" näyttääksesi sen palautusavaimen.
|
||||
recoveryKey.recover.description=Syötä salasana "%s":lle palauttaaksesi holvin asetukset.
|
||||
recoveryKey.display.description=Tällä palautusavaimella voidaan palauttaa pääsy holviin "%s":
|
||||
recoveryKey.display.StorageHints=Pidä se hyvin tallessa, esimerkiksi\n • Säilytä se salasananhallintaohjelmassa\n • Tallenna se USB-asemalle\n • Tulosta se paperille
|
||||
## Reset Password
|
||||
@@ -507,28 +533,59 @@ recoveryKey.recover.invalidKey=Tämä palautusavain ei ole kelvollinen
|
||||
recoveryKey.printout.heading=Cryptomator palautusavain\n"%s"\n
|
||||
### Reset Password
|
||||
recoveryKey.recover.resetBtn=Palauta
|
||||
recoveryKey.recover.recoverBtn=Palauta
|
||||
### Recovery Key Password Reset Success
|
||||
recoveryKey.recover.resetSuccess.message=Salasanan palautus onnistui
|
||||
recoveryKey.recover.resetSuccess.description=Voit avata holvin uudella salasanalla.
|
||||
### Recovery Key Vault Config Reset Success
|
||||
recoveryKey.recover.resetVaultConfigSuccess.message=Holvin asetukset palautettu
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.message=Pääavaintiedosto palautettu
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.description=Voit nyt avata holvisi salasanalla.
|
||||
|
||||
# Recover Vault Config File and/or Masterkey
|
||||
##Add Existing Vault without recovery - Dialog
|
||||
recover.existing.title=Holvi lisätty
|
||||
recover.existing.message=Holvi lisättiin onnistuneesti
|
||||
recover.existing.description=Holvisi "%s" on lisätty holviluetteloon. Palauttaminen ei ollut tarpeen.
|
||||
|
||||
##Vault Already Exists - Dialog
|
||||
recover.alreadyExists.title=Holvi on jo olemassa
|
||||
recover.alreadyExists.message=Tämä holvi on jo lisätty
|
||||
recover.alreadyExists.description=Holvisi "%s" on jo holviluettelossasi, eikä sitä siksi lisätty uudelleen.
|
||||
|
||||
##Invalid Selection - Dialog
|
||||
recover.invalidSelection.title=Virheellinen valinta
|
||||
recover.invalidSelection.message=Valintasi ei ole holvi
|
||||
recover.invalidSelection.description=Valitun kansion on oltava kelvollinen Cryptomator holvi.
|
||||
|
||||
## Contact Hub Vault Owner - Dialog
|
||||
contactHubVaultOwner.title=Hub -holvi
|
||||
contactHubVaultOwner.message=Tämä holvi on luotu Cryptomator Hubilla
|
||||
contactHubVaultOwner.description=Ota yhteys holvin omistajaan palauttaaksesi puuttuvan tiedoston. Hän voi ladata holvimallin Cryptomator Hubista.
|
||||
|
||||
##Dialog Title
|
||||
recover.recoverVaultConfig.title=Palauta holvin asetukset
|
||||
recover.recoverMasterkey.title=Palauta pääavain
|
||||
|
||||
## OnBoarding
|
||||
recover.onBoarding.chooseMethod=Valitse palautusmenetelmä:
|
||||
recover.onBoarding.useRecoveryKey=Käytä palautusavainta
|
||||
recover.onBoarding.usePassword=Käytä salasanaa
|
||||
recover.onBoarding.intro=Tarkista seuraavat:
|
||||
recover.onBoarding.pleaseConfirm=Ennen jatkamista, vahvista että:
|
||||
recover.onBoarding.otherwisePleaseConfirm=Muutoin, varmista että:
|
||||
recover.onBoarding.allMissing.intro=Jos tätä holvia hallitaan Cryptomator Hubilla, holvin omistaja palauttaa holvin puolestasi.
|
||||
recover.onBoarding.intro.ensure=Kaikki tiedostot ovat synkronoitu.
|
||||
recover.onBoarding.affirmation=Olen lukenut ja ymmärtänyt nämä vaatimukset
|
||||
|
||||
###Vault Config Missing
|
||||
recover.onBoarding.intro.recoveryKey=Sinulla on palautusavain ja tiedät onko edistyneitä asetuksia käytetty.
|
||||
recover.onBoarding.intro.password=Sinulla on salasana ja tiedät onko edistyneitä asetuksia käytetty.
|
||||
###Masterkey Missing
|
||||
recover.onBoarding.intro.masterkey.recoveryKey=Sinulla on holvin palautusavain.
|
||||
|
||||
## Expert Settings
|
||||
recover.expertSettings.shorteningThreshold.title=Tämän arvon on täsmättävä ennen palautusta olleeseen salatun tiedon yhteensopivuuden varmistamiseksi.
|
||||
|
||||
# Convert Vault
|
||||
convertVault.title=Muunna holvi
|
||||
@@ -569,6 +626,9 @@ updateReminder.yesOnce=Kyllä, vain tämän kerran
|
||||
updateReminder.yesAutomatically=Kyllä, automaattisesti
|
||||
|
||||
#Dokany Support End
|
||||
dokanySupportEnd.title=Huomio
|
||||
dokanySupportEnd.message=Dokany tuen loppuminen
|
||||
dokanySupportEnd.description=Cryptomator ei enää tue Dokany -osiotyyppiä. Asetuksesi muutetaan oletusosiotyyppiä varten. Voit tarkistaa oletusosiotyypin asetuksista.
|
||||
dokanySupportEnd.preferencesBtn=Avaa asetukset
|
||||
|
||||
#Retry If Readonly
|
||||
@@ -600,7 +660,16 @@ shareVault.hub.openHub=Avaa Cryptomator Hub
|
||||
# Decrypt File Names
|
||||
decryptNames.title=Pura tiedostonimien salaus
|
||||
decryptNames.filePicker.title=Valitse salattu tiedosto
|
||||
decryptNames.filePicker.extensionDescription=Cryptomatorilla salattu tiedosto
|
||||
decryptNames.copyTable.tooltip=Kopioi taulukko
|
||||
decryptNames.clearTable.tooltip=Tyhjennä taulukko
|
||||
decryptNames.column.encrypted=Salattu
|
||||
decryptNames.column.decrypted=Purettu
|
||||
decryptNames.copyHint=Kopioi solun sisältö: %s
|
||||
decryptNames.dropZone.message=Pudota tiedostoja tai napsauta valitaksesi
|
||||
decryptNames.dropZone.error.vaultInternalFiles=Valittu holvin sisäiset tiedostot joissa ei ole purkukelpoista nimeä
|
||||
decryptNames.dropZone.error.foreignFiles=Tiedostot eivät kuulu holviin "%s"
|
||||
decryptNames.dropZone.error.noDirIdBackup=Valittujen tiedostojen hakemistossa ei ole dirld.c9r tiedostoa
|
||||
decryptNames.dropZone.error.generic=Tiedostonimien salauksen purku epäonnistui
|
||||
|
||||
|
||||
@@ -608,23 +677,25 @@ decryptNames.dropZone.error.generic=Tiedostonimien salauksen purku epäonnistui
|
||||
eventView.title=Tapahtumat
|
||||
eventView.filter.allVaults=Kaikki
|
||||
eventView.clearListButton.tooltip=Tyhjennä luettelo
|
||||
eventView.filterVaults=Suodata holvin mukaan
|
||||
eventView.cell.actionsButton.tooltip=Toiminnot
|
||||
## event list entries
|
||||
eventView.entry.vaultLocked.description=Avaa "%s" lisätietoja varten
|
||||
eventView.entry.conflictResolved.message=Ratkaistu ristiriita
|
||||
eventView.entry.conflictResolved.showDecrypted=Näytä purettu tiedosto
|
||||
eventView.entry.conflictResolved.copyDecrypted=Kopioi purettu polku
|
||||
eventView.entry.conflict.message=Ristiriidan ratkaisu epäonnistui
|
||||
eventView.entry.conflict.showDecrypted=Näytä purettu, alkuperäinen tiedosto
|
||||
eventView.entry.conflict.copyDecrypted=Näytä purettu, alkuperäinen polku
|
||||
eventView.entry.conflict.showEncrypted=Näytä ristiriitainen, salattu tiedosto
|
||||
eventView.entry.conflict.copyEncrypted=Kopioi ristiriitainen, salattu polku
|
||||
eventView.entry.decryptionFailed.message=Salauksen purku epäonnistui
|
||||
eventView.entry.decryptionFailed.showEncrypted=Näytä salattu tiedosto
|
||||
eventView.entry.decryptionFailed.copyEncrypted=Kopioi salattu polku
|
||||
eventView.entry.brokenDirFile.message=Virheellinen hakemiston linkki
|
||||
eventView.entry.brokenDirFile.showEncrypted=Näytä virheellinen, salattu linkki
|
||||
eventView.entry.brokenDirFile.copyEncrypted=Kopioi virheellisen polun linkki
|
||||
eventView.entry.brokenFileNode.message=Virheellinen tiedostojärjestelmän solmu
|
||||
eventView.entry.brokenFileNode.showEncrypted=Näytä virheellinen, salattu solmu
|
||||
eventView.entry.brokenFileNode.copyEncrypted=Kopioi virheellisen, salatun solmun polku
|
||||
eventView.entry.brokenFileNode.copyDecrypted=Kopioi purettu polku
|
||||
eventView.entry.inUse.showDecrypted=Näytä purettu tiedosto
|
||||
eventView.entry.inUse.showEncrypted=Näytä salattu tiedosto
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,14 @@ generic.button.close=Isara
|
||||
generic.button.copy=Kopyahin
|
||||
generic.button.copied=Nakopya na!
|
||||
generic.button.done=Tapos na
|
||||
generic.button.previous=Nakaraan
|
||||
generic.button.next=Sunod
|
||||
generic.button.print=I-print
|
||||
generic.button.remove=Tanggalin
|
||||
|
||||
## Vault state
|
||||
vault.state.error=Error
|
||||
|
||||
# Error
|
||||
error.message=Error %s
|
||||
error.description=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.
|
||||
@@ -175,6 +179,7 @@ hub.registerSuccess.legacy.description=Para ma-access ang vault, kailangang pahi
|
||||
hub.registerFailed.message=Ang pag rehistrado ng device ay pumalya
|
||||
hub.registerFailed.description.generic=Nagkaroon ng error sa proseso ng pag registrado. Para sa higit pang mga detalye, tingnan ang log ng aplikasyon.
|
||||
hub.registerFailed.description.deviceAlreadyExists=Ang device na ito ay registrado na sa ibang user. Subukang palitan ang user account o gumamit ng ibang device.
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Walang pahintulot
|
||||
### Requires Account Initialization
|
||||
@@ -377,6 +382,7 @@ stats.access.total=Kabuuang mga access: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Mga Vault
|
||||
main.vaultlist.emptyList.onboardingInstruction=Mag-click dito para magdagdag ng vault
|
||||
main.vaultlist.contextMenu.remove=Alisin…
|
||||
main.vaultlist.contextMenu.lock=I-lock
|
||||
@@ -385,7 +391,8 @@ main.vaultlist.contextMenu.unlockNow=I-unlock Ngayon
|
||||
main.vaultlist.contextMenu.vaultoptions=Ipakita ang Mga Opsyon sa Vault
|
||||
main.vaultlist.contextMenu.reveal=Ibunyag ang Drive
|
||||
main.vaultlist.contextMenu.share=Ibahagi…
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Magdagdag ng Vault
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Salamat sa pagpili sa Cryptomator para protektahan ang iyong mga file. Kung kailangan mo ng anumang tulong, tingnan ang aming mga gabay sa pagsisimula:
|
||||
@@ -588,3 +595,7 @@ shareVault.hub.openHub=Buksan ang Cryptomator Hub
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,19 @@ generic.button.close=Fermer
|
||||
generic.button.copy=Copier
|
||||
generic.button.copied=Copié !
|
||||
generic.button.done=OK
|
||||
generic.button.previous=Précédent
|
||||
generic.button.next=Suivant
|
||||
generic.button.print=Imprimer
|
||||
generic.button.remove=Supprimer
|
||||
|
||||
## Vault state
|
||||
vault.state.locked=Verrouillé
|
||||
vault.state.unlocked=Déverrouillé
|
||||
vault.state.missing=Manquant
|
||||
vault.state.migrationNeeded=Migration nécessaire
|
||||
vault.state.processing=Traitement en cours
|
||||
vault.state.error=Erreur
|
||||
|
||||
# Error
|
||||
error.message=Une erreur s'est produite
|
||||
error.description=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.
|
||||
@@ -177,6 +186,9 @@ hub.registerSuccess.legacy.description=Pour accéder au coffre, votre appareil d
|
||||
hub.registerFailed.message=Échec de l'enregistrement de l'appareil
|
||||
hub.registerFailed.description.generic=Le processus de nommage a retourné une erreur. Pour plus de détails, regardez dans le journal de l'application.
|
||||
hub.registerFailed.description.deviceAlreadyExists=Cet appareil est déjà enregistré pour un autre utilisateur. Essayez de changer de compte ou utilisez un autre appareil.
|
||||
### Archived
|
||||
hub.archived.message=Le coffre est archivé
|
||||
hub.archived.description=Ce coffre a été archivé et n'est plus accessible. Veuillez contacter le propriétaire du coffre.
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Accès refusé
|
||||
hub.unauthorized.description=Vous n'êtes pas autorisé à ouvrir ce coffre. Contactez le propriétaire du coffre pour en demander l'accès.
|
||||
@@ -257,6 +269,8 @@ health.check.detail.checkFinishedAndFound=Le test est terminé. Veuillez vérifi
|
||||
health.check.detail.checkFailed=La vérification s'est arrêtée en raison d'une erreur.
|
||||
health.check.detail.checkCancelled=Vérification annulée.
|
||||
health.check.detail.listFilters.label=Filtre
|
||||
health.check.detail.filterSeverity=Filtrer par sévérité
|
||||
health.check.detail.filterFixState=Filtrer par état de réparation
|
||||
health.check.detail.fixAllSpecificBtn=Corriger tout le type
|
||||
health.check.exportBtn=Exporter le rapport
|
||||
## Result view
|
||||
@@ -329,8 +343,13 @@ preferences.updates.lastUpdateCheck.never=jamais
|
||||
preferences.updates.lastUpdateCheck.recently=récemment
|
||||
preferences.updates.lastUpdateCheck.daysAgo=Il y a %s jours
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=il y a %s heures
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.1=Veuillez s'il vous plaît
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.2=verrouiller vos coffres
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.3=pour installer la mise à jour.
|
||||
preferences.updates.checkFailed=La recherche de mises à jour a échoué. Veuillez vérifier votre connexion internet ou réessayez plus tard.
|
||||
preferences.updates.updateFailed=Échec de la mise à jour. Merci d'installer la mise à jour manuellement.
|
||||
preferences.updates.upToDate=Cryptomator est à jour.
|
||||
preferences.updates.visitDownloadPage=Visiter la page de téléchargement
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=Nous soutenir
|
||||
@@ -341,6 +360,7 @@ preferences.contribute.promptText=Collez le code du certificat du supporter ici
|
||||
preferences.contribute.thankYou=Merci de soutenir le développement open-source de Cryptomator !
|
||||
preferences.contribute.donate=Faire un don
|
||||
preferences.contribute.sponsor=Parrain
|
||||
preferences.contribute.removeCert.tooltip=Supprimer le certificat
|
||||
|
||||
### Remove License Key Dialog
|
||||
removeCert.title=Supprimer le certificat
|
||||
@@ -350,6 +370,7 @@ removeCert.description=Les fonctionnalités principales de Cryptomator ne sont p
|
||||
|
||||
## About
|
||||
preferences.about=A propos
|
||||
preferences.about.thirdPartyLicenses=Licences tierces
|
||||
|
||||
# Vault Statistics
|
||||
stats.title=Statistiques sur %s
|
||||
@@ -388,6 +409,8 @@ stats.access.total=Total des accès: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Coffres
|
||||
main.vaultlist.listEntry=Coffre %s (%s)
|
||||
main.vaultlist.emptyList.onboardingInstruction=Cliquez ici pour ajouter un volume chiffré
|
||||
main.vaultlist.contextMenu.remove=Retirer…
|
||||
main.vaultlist.contextMenu.lock=Verrouiller
|
||||
@@ -399,13 +422,17 @@ main.vaultlist.contextMenu.share=Partager…
|
||||
main.vaultlist.addVaultBtn.menuItemNew=Créer un nouveau coffre…
|
||||
main.vaultlist.addVaultBtn.menuItemExisting=Ouvrir le coffre existant…
|
||||
main.vaultlist.addVaultBtn.menuItemRecover=Restaurer le coffre existant…
|
||||
main.vaultlist.addVaultButton.tooltip=Ajouter un coffre
|
||||
main.vaultlist.showEventsButton.tooltip=Ouvrir la vue Événements
|
||||
##Notificaition
|
||||
main.vaultlist.showPreferencesButton.tooltip=Afficher les préférences
|
||||
##Notification
|
||||
main.notification.updateAvailable=Mise à jour disponible.
|
||||
main.notification.support=Soutenir Cryptomator.
|
||||
main.notification.closeButton.tooltip="Fermer la barre d'information"
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Merci d'avoir choisi Cryptomator pour protéger vos fichiers. Si vous avez besoin d'aide, consultez nos guides de démarrage :
|
||||
main.vaultDetail.storageLocation=Emplacement du stockage du coffre
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=VERROUILLÉ
|
||||
main.vaultDetail.unlockBtn=Déverrouiller…
|
||||
@@ -463,6 +490,7 @@ vaultOptions.general=Général
|
||||
vaultOptions.general.vaultName=Nom du volume chiffré
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Verrouiler en cas d'inactivité pendant
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=minutes
|
||||
vaultOptions.general.autoLock.accessibleText=Délai de verrouillage en minutes
|
||||
vaultOptions.general.unlockAfterStartup=Déverrouiller le volume chiffré au démarrage
|
||||
vaultOptions.general.actionAfterUnlock=Après un déverrouillage réussi
|
||||
vaultOptions.general.actionAfterUnlock.ignore=Ne rien faire
|
||||
@@ -493,6 +521,7 @@ vaultOptions.masterkey.forgetSavedPasswordBtn=Oublier le mot de passe enregistr
|
||||
vaultOptions.masterkey.recoveryKeyExplanation=Une clé de récupération est le seul moyen de rétablir l'accès à un volume chiffré si vous en perdez le mot de passe.
|
||||
vaultOptions.masterkey.showRecoveryKeyBtn=Afficher la clé de récupération
|
||||
vaultOptions.masterkey.recoverPasswordBtn=Réinitialiser le mot de passe
|
||||
vaultOptions.masterkey.missingMasterkeyFile=Ces options ne sont disponibles que si le fichier masterkey est présent dans le répertoire du coffre.
|
||||
## Hub
|
||||
vaultOptions.hub=Récupération
|
||||
vaultOptions.hub.convertInfo=Vous pouvez utiliser la clé de récupération pour convertir ce coffre Hub en coffre à mot de passe en cas d'urgence.
|
||||
@@ -521,6 +550,8 @@ recoveryKey.recover.recoverBtn=Restaurer
|
||||
recoveryKey.recover.resetSuccess.message=Réinitialisation du mot de passe réussie
|
||||
recoveryKey.recover.resetSuccess.description=Vous pouvez déverrouiller votre coffre avec le nouveau mot de passe.
|
||||
### Recovery Key Vault Config Reset Success
|
||||
recoveryKey.recover.resetVaultConfigSuccess.message=Configuration du coffre-fort récupérée
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.message=Fichier masterkey récupéré
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.description=Vous pouvez maintenant déverrouiller votre coffre avec votre mot de passe.
|
||||
|
||||
# Recover Vault Config File and/or Masterkey
|
||||
@@ -644,6 +675,8 @@ decryptNames.filePicker.title=Sélectionner le fichier chiffré
|
||||
decryptNames.filePicker.extensionDescription=Fichier chiffré Cryptomator
|
||||
decryptNames.copyTable.tooltip=Copier le tableau
|
||||
decryptNames.clearTable.tooltip=Effacer le tableau
|
||||
decryptNames.column.encrypted=Chiffré
|
||||
decryptNames.column.decrypted=Déchiffré
|
||||
decryptNames.copyHint=Copier le contenu de la cellule avec %s
|
||||
decryptNames.dropZone.message=Déposer des fichiers ou cliquer pour en sélectionner
|
||||
decryptNames.dropZone.error.vaultInternalFiles=Fichiers internes du coffre sans nom déchiffrable sélectionnés
|
||||
@@ -656,23 +689,31 @@ decryptNames.dropZone.error.generic=Impossible de déchiffrer les noms de fichie
|
||||
eventView.title=Événements
|
||||
eventView.filter.allVaults=Tous
|
||||
eventView.clearListButton.tooltip=Effacer la liste
|
||||
eventView.filterVaults=Filtrer par coffre
|
||||
eventView.cell.actionsButton.tooltip=Actions d'évènement
|
||||
## event list entries
|
||||
eventView.entry.vaultLocked.description=Déverrouillez "%s" pour plus de détails
|
||||
eventView.entry.conflictResolved.message=Conflit résolu
|
||||
eventView.entry.conflictResolved.showDecrypted=Afficher le fichier déchiffré
|
||||
eventView.entry.conflictResolved.copyDecrypted=Copier le chemin déchiffré
|
||||
eventView.entry.conflict.message=La résolution des conflits a échoué
|
||||
eventView.entry.conflict.showDecrypted=Afficher le fichier original déchiffré
|
||||
eventView.entry.conflict.copyDecrypted=Copier le chemin original déchiffré
|
||||
eventView.entry.conflict.showEncrypted=Afficher le fichier chiffré en conflit
|
||||
eventView.entry.conflict.copyEncrypted=Copier le chemin chiffré en conflit
|
||||
eventView.entry.decryptionFailed.message=Le déchiffrement a échoué
|
||||
eventView.entry.decryptionFailed.showEncrypted=Afficher le fichier chiffré
|
||||
eventView.entry.decryptionFailed.copyEncrypted=Copier le chemin chiffré
|
||||
eventView.entry.brokenDirFile.message=Lien de répertoire cassé
|
||||
eventView.entry.brokenDirFile.showEncrypted=Afficher le lien chiffré cassé
|
||||
eventView.entry.brokenDirFile.copyEncrypted=Copier le chemin du lien cassé
|
||||
eventView.entry.brokenFileNode.message=Nœud de système de fichiers cassé
|
||||
eventView.entry.brokenFileNode.showEncrypted=Afficher le nœud chiffré cassé
|
||||
eventView.entry.brokenFileNode.copyEncrypted=Copier le chemin du nœud chiffré cassé
|
||||
eventView.entry.brokenFileNode.copyDecrypted=Copier le chemin déchiffré
|
||||
eventView.entry.inUse.message=Fichier en cours d’utilisation
|
||||
eventView.entry.inUse.showDecrypted=Afficher le fichier déchiffré
|
||||
eventView.entry.inUse.showEncrypted=Afficher le fichier chiffré
|
||||
eventView.entry.inUse.copyUserAndDevice=Copier le verrouillage de l'utilisateur et le nom de l'appareil
|
||||
eventView.entry.inUse.ignoreLock=Ignorer le statut d’utilisation
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=Le fichier est utilisé sur un autre appareil
|
||||
notification.inUse.description=Le fichier est ouvert par %s sur %s. Demandez-lui à fermer le fichier et laissez la synchronisation se terminer. Vous pouvez ignorer le statut pour l’ouvrir maintenant, mais cela pourrait entraîner des conflits ou écraser des modifications récentes.
|
||||
notification.inUse.action=Ignorer le statut d’utilisation
|
||||
@@ -11,10 +11,13 @@ generic.button.close=Pechar
|
||||
generic.button.copy=Copiar
|
||||
generic.button.copied=Copiado!
|
||||
generic.button.done=Feito
|
||||
generic.button.previous=Anterior
|
||||
generic.button.next=Seguinte
|
||||
generic.button.print=Imprimir
|
||||
generic.button.remove=Eliminar
|
||||
|
||||
## Vault state
|
||||
|
||||
# Error
|
||||
error.message=Produciuse un erro
|
||||
|
||||
@@ -49,6 +52,7 @@ error.message=Produciuse un erro
|
||||
### Register Device Legacy
|
||||
### Registration Success
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
@@ -95,7 +99,7 @@ lock.forced.retryBtn=Tentar de novo
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
##Notificaition
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
### Locked
|
||||
@@ -162,3 +166,7 @@ lock.forced.retryBtn=Tentar de novo
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,14 @@ generic.button.close=סגור
|
||||
generic.button.copy=העתק
|
||||
generic.button.copied=הועתק!
|
||||
generic.button.done=סיום
|
||||
generic.button.previous=הקודם
|
||||
generic.button.next=הבא
|
||||
generic.button.print=הדפס
|
||||
generic.button.remove=הסר
|
||||
|
||||
## Vault state
|
||||
vault.state.error=שגיאה
|
||||
|
||||
# Error
|
||||
error.message=אירעה שגיאה
|
||||
error.description=Cryptomator לא ציפתה שזה יקרה. ניתן לחפש פתרונות קיימים לשגיאה זו, או במקרה והשגיאה לא דווחה עדיין נשמח לקבל דיווח עליה.
|
||||
@@ -159,6 +163,7 @@ hub.register.nameLabel=שם מכשיר
|
||||
### Registration Success
|
||||
hub.registerSuccess.unlockBtn=בטל נעילה
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=הגישה נדחתה
|
||||
### Requires Account Initialization
|
||||
@@ -347,6 +352,7 @@ stats.access.total=מספר גישות כולל: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=כספות
|
||||
main.vaultlist.emptyList.onboardingInstruction=לחץ כאן להוספת כספת
|
||||
main.vaultlist.contextMenu.remove=הסר…
|
||||
main.vaultlist.contextMenu.lock=נעילה
|
||||
@@ -354,7 +360,8 @@ main.vaultlist.contextMenu.unlock=שחרר נעילה…
|
||||
main.vaultlist.contextMenu.unlockNow=בטל נעילה כעת
|
||||
main.vaultlist.contextMenu.vaultoptions=הצג את אפשרויות הכספת
|
||||
main.vaultlist.contextMenu.reveal=חשוף את הכונן
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=הוספת כספת
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=תודה שבחרת ב- Cryptomator להגן על הקבצים שלך. אם אתה זקוק לסיוע, אנא עיין במדריכים שלנו:
|
||||
@@ -521,3 +528,7 @@ dokanySupportEnd.preferencesBtn=פתח העדפות
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,14 @@ generic.button.close=बंद करें
|
||||
generic.button.copy=कॉपी करें
|
||||
generic.button.copied=कॉपी हुआ!
|
||||
generic.button.done=हो गया
|
||||
generic.button.previous=पिछला
|
||||
generic.button.next=अगला
|
||||
generic.button.print=प्रिंट करें
|
||||
generic.button.remove=हटाएँ
|
||||
|
||||
## Vault state
|
||||
vault.state.error=त्रुटि
|
||||
|
||||
# Error
|
||||
error.message=एक त्रुटि पाई गई
|
||||
error.description=क्रिप्टोमेटर ने ऐसा होने की उम्मीद नहीं की थी| आप इस त्रुटि के लिए मौजूदा समाधान देख सकते हैं| यदि कोई समाधान नहीं है तो बेझिझक इस त्रुटि को रिपोर्ट करिये
|
||||
@@ -151,6 +155,7 @@ hub.register.nameLabel=डिवाइस का नाम
|
||||
### Registration Success
|
||||
hub.registerSuccess.unlockBtn=अनलॉक करें
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=प्रवेश अस्वीकृत
|
||||
### Requires Account Initialization
|
||||
@@ -234,6 +239,7 @@ preferences.contribute=हमें सपोर्ट करें
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=कक्षों का नाम
|
||||
main.vaultlist.emptyList.onboardingInstruction=वॉल्ट को डालने के लिए यहाँ क्लिक करें।
|
||||
main.vaultlist.contextMenu.remove=हटाएँ...
|
||||
main.vaultlist.contextMenu.lock=लॉक करें
|
||||
@@ -241,7 +247,8 @@ main.vaultlist.contextMenu.unlock=अनलॉक करें...
|
||||
main.vaultlist.contextMenu.unlockNow=अब अनलॉक करें
|
||||
main.vaultlist.contextMenu.vaultoptions=वॉल्ट के विकल्प दिखाए
|
||||
main.vaultlist.contextMenu.reveal=फोल्डर खोलें
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=वाउल्ट डालें
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Cryptomator को अपनी फाइल्स सिराक्षित रखने को चुनने के लिए धन्यवाद। अगर आपको सहायता चाइये, तो हमारी गेटिंग स्टार्टेड गाइगाइड्स देखिये:
|
||||
@@ -344,3 +351,7 @@ dokanySupportEnd.preferencesBtn=प्राथमिकताएँ खोल
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -11,10 +11,14 @@ generic.button.close=Zatvori
|
||||
generic.button.copy=Kopiraj
|
||||
generic.button.copied=Kopirano!
|
||||
generic.button.done=Gotovo
|
||||
generic.button.previous=Prethodno
|
||||
generic.button.next=Sljedeći
|
||||
generic.button.print=Ispiši
|
||||
generic.button.remove=Ukloni
|
||||
|
||||
## Vault state
|
||||
vault.state.error=Greška
|
||||
|
||||
# Error
|
||||
error.message=Greška: %s
|
||||
error.description=Opa! Cryptomator nije očekivao da će se ovo dogoditi. Možete pogledati postojeća rješenja za ovu grešku. Ili, ako još nije prijavljena, slobodno to učinite.
|
||||
@@ -119,6 +123,7 @@ unlock.success.revealBtn=Otkrij pogon
|
||||
### Registration Success
|
||||
hub.registerSuccess.unlockBtn=Otključaj
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
@@ -266,6 +271,7 @@ stats.write.accessCount=Ukupno pisanja: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Trezori
|
||||
main.vaultlist.emptyList.onboardingInstruction=Pritisnite ovdje da biste dodali trezor
|
||||
main.vaultlist.contextMenu.remove=Ukloni…
|
||||
main.vaultlist.contextMenu.lock=Zaključaj
|
||||
@@ -273,7 +279,8 @@ main.vaultlist.contextMenu.unlock=Otključaj…
|
||||
main.vaultlist.contextMenu.unlockNow=Otključaj sada
|
||||
main.vaultlist.contextMenu.vaultoptions=Prikaži opcije trezora
|
||||
main.vaultlist.contextMenu.reveal=Otkrij pogon
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Dodaj trezor
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Hvala što ste odabrali Cryptomator za zaštitu Vaših datoteka. Ukoliko trebate pomoć, provjerite naše vodiče za početak rada:
|
||||
@@ -411,3 +418,7 @@ quit.lockAndQuitBtn=Zaključaj i napusti
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,14 @@ generic.button.close=Bezár
|
||||
generic.button.copy=Másolás
|
||||
generic.button.copied=Másolva!
|
||||
generic.button.done=Kész
|
||||
generic.button.previous=Előző
|
||||
generic.button.next=Következő
|
||||
generic.button.print=Nyomtatás
|
||||
generic.button.remove=Eltávolítás
|
||||
|
||||
## Vault state
|
||||
vault.state.error=Hiba
|
||||
|
||||
# Error
|
||||
error.message=Hiba: %s
|
||||
error.description=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.
|
||||
@@ -175,6 +179,7 @@ hub.registerSuccess.legacy.description=A széfhez való hozzáféréshez az eszk
|
||||
hub.registerFailed.message=Az eszköz regisztrációja sikertelen
|
||||
hub.registerFailed.description.generic=Hiba történt a regisztrációs folyamat során. További részletekért nézze meg az alkalmazás naplóját.
|
||||
hub.registerFailed.description.deviceAlreadyExists=Ez az eszköz már egy másik felhasználóhoz van regisztrálva. Próbáljon meg felhasználói fiókot váltani, vagy használjon egy másik eszközt.
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Hozzáférés megtagadva
|
||||
hub.unauthorized.description=Nincs hozzáférésed a széf megnyitásához. Vedd fel a kapcsolatot a széf tulajdonosával és kérj hozzáférést.
|
||||
@@ -386,6 +391,7 @@ stats.access.total=Összes hozzáférés: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Széfek
|
||||
main.vaultlist.emptyList.onboardingInstruction=Kattintson ide egy széf hozzáadásához
|
||||
main.vaultlist.contextMenu.remove=Eltávolítás…
|
||||
main.vaultlist.contextMenu.lock=Zárolás
|
||||
@@ -394,7 +400,8 @@ main.vaultlist.contextMenu.unlockNow=Azonnali feloldás
|
||||
main.vaultlist.contextMenu.vaultoptions=Széf beállítások
|
||||
main.vaultlist.contextMenu.reveal=Széf megjelenítése
|
||||
main.vaultlist.contextMenu.share=Megosztás…
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Széf hozzáadása
|
||||
##Notification
|
||||
main.notification.updateAvailable=Frissítés elérhető.
|
||||
main.notification.support=Cryptomator támogatása.
|
||||
## Vault Detail
|
||||
@@ -603,3 +610,7 @@ shareVault.hub.openHub=Nyissa meg a Cryptomator Hubot
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,14 @@ generic.button.close=Tutup
|
||||
generic.button.copy=Salin
|
||||
generic.button.copied=Tersalin!
|
||||
generic.button.done=Selesai
|
||||
generic.button.previous=Sebelumnya
|
||||
generic.button.next=Lanjut
|
||||
generic.button.print=Cetak
|
||||
generic.button.remove=Hapus
|
||||
|
||||
## Vault state
|
||||
vault.state.error=Kesalahan
|
||||
|
||||
# Error
|
||||
error.message=Terjadi kesalahan
|
||||
error.description=Ups! Cryptomator tidak menyangka hal ini terjadi. Anda dapat mencari solusi yang tersedia untuk error ini. Atau jika error ini belum pernah dilaporkan, tidak perlu sungkan untuk melaporkannya.
|
||||
@@ -175,6 +179,7 @@ hub.registerSuccess.legacy.description=Untuk mengakses vault, perangkat Anda har
|
||||
hub.registerFailed.message=Registrasi perangkat gagal
|
||||
hub.registerFailed.description.generic=Kesalahan terjadi dalam proses pendaftaran. Untuk detail lebih lanjut, lihat log aplikasi.
|
||||
hub.registerFailed.description.deviceAlreadyExists=Perangkat ini sudah terdaftar untuk pengguna lain. Cobalah menggunakan akun pengguna atau perangkat yang berbeda.
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Akses ditolak
|
||||
hub.unauthorized.description=Anda tidak punya otorisasi untuk membuka brankas ini. Hubungi pemilik brankas untuk meminta akses.
|
||||
@@ -386,6 +391,7 @@ stats.access.total=Total yang akses: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Vault
|
||||
main.vaultlist.emptyList.onboardingInstruction=Klik di sini untuk menambahkan vault
|
||||
main.vaultlist.contextMenu.remove=Hapus…
|
||||
main.vaultlist.contextMenu.lock=Kunci
|
||||
@@ -394,7 +400,8 @@ main.vaultlist.contextMenu.unlockNow=Buka Kunci Sekarang
|
||||
main.vaultlist.contextMenu.vaultoptions=Tampilkan Opsi Vault
|
||||
main.vaultlist.contextMenu.reveal=Buka Drive
|
||||
main.vaultlist.contextMenu.share=Bagikan…
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Tambah Brankas
|
||||
##Notification
|
||||
main.notification.updateAvailable=Pembaruan tersedia.
|
||||
main.notification.support=Dukung Cryptomator.
|
||||
## Vault Detail
|
||||
@@ -604,3 +611,7 @@ shareVault.hub.openHub=Buka Cryptomator Hub
|
||||
# Event View
|
||||
eventView.filter.allVaults=Semua
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -12,10 +12,19 @@ generic.button.close=Chiudi
|
||||
generic.button.copy=Copia
|
||||
generic.button.copied=Copiato!
|
||||
generic.button.done=Fatto
|
||||
generic.button.previous=Precedente
|
||||
generic.button.next=Avanti
|
||||
generic.button.print=Stampa
|
||||
generic.button.remove=Rimuovi
|
||||
|
||||
## Vault state
|
||||
vault.state.locked=Bloccata
|
||||
vault.state.unlocked=Sbloccata
|
||||
vault.state.missing=Mancante
|
||||
vault.state.migrationNeeded=Migrazione necessaria
|
||||
vault.state.processing=Elaborazione
|
||||
vault.state.error=Errore
|
||||
|
||||
# Error
|
||||
error.message=Si è verificato un errore
|
||||
error.description=Oops! Cryptomator non si aspettava che ciò accadesse. Puoi cercare soluzioni esistenti per questo errore. Oppure se non è ancora stato segnalato, sentitevi liberi di farlo.
|
||||
@@ -177,6 +186,9 @@ hub.registerSuccess.legacy.description=Per accedere alla cassaforte, il tuo disp
|
||||
hub.registerFailed.message=Registrazione dispositivo fallita
|
||||
hub.registerFailed.description.generic=Si è verificato un errore nel processo di registrazione. Per maggiori dettagli, consulta il registro delle applicazioni.
|
||||
hub.registerFailed.description.deviceAlreadyExists=Questo dispositivo è già registrato per un utente diverso. Prova a cambiare l'account utente o usa un altro dispositivo.
|
||||
### Archived
|
||||
hub.archived.message=La cassaforte è archiviata
|
||||
hub.archived.description=Questa cassaforte è stata archiviata e non è più accessibile. Contatta il proprietario della cassaforte.
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Accesso negato
|
||||
hub.unauthorized.description=Non sei autorizzato ad aprire questa cassaforte. Chiedi l'accesso al proprietario.
|
||||
@@ -257,6 +269,8 @@ health.check.detail.checkFinishedAndFound=Il controllo è terminato. Sei pregato
|
||||
health.check.detail.checkFailed=Il controllo è terminato a causa di un errore.
|
||||
health.check.detail.checkCancelled=Il controllo è stato annullato.
|
||||
health.check.detail.listFilters.label=Filtri
|
||||
health.check.detail.filterSeverity=Filtra per gravità
|
||||
health.check.detail.filterFixState=Filtra per stato di risoluzione
|
||||
health.check.detail.fixAllSpecificBtn=Correggi tutto di tipo
|
||||
health.check.exportBtn=Esporta il Rapporto
|
||||
## Result view
|
||||
@@ -329,8 +343,13 @@ preferences.updates.lastUpdateCheck.never=mai
|
||||
preferences.updates.lastUpdateCheck.recently=recentemente
|
||||
preferences.updates.lastUpdateCheck.daysAgo=%s giorni fa
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=%s ore fa
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.1=Per favore
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.2=blocca le tue casseforti
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.3=per installare l'aggiornamento.
|
||||
preferences.updates.checkFailed=Ricerca aggiornamenti non riuscita. Controlla la tua connessione internet o riprova più tardi.
|
||||
preferences.updates.updateFailed=Aggiornamento non riuscito. Installare manualmente l'aggiornamento.
|
||||
preferences.updates.upToDate=Cryptomator è aggiornato.
|
||||
preferences.updates.visitDownloadPage=Visita la pagina di download
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=Supportaci
|
||||
@@ -341,6 +360,7 @@ preferences.contribute.promptText=Incolla qui il codice del certificato da soste
|
||||
preferences.contribute.thankYou=Grazie per il tuo supporto allo sviluppo open-source di Cryptomator!
|
||||
preferences.contribute.donate=Dona
|
||||
preferences.contribute.sponsor=Sponsor
|
||||
preferences.contribute.removeCert.tooltip=Rimuovi certificato
|
||||
|
||||
### Remove License Key Dialog
|
||||
removeCert.title=Rimuovi Certificato
|
||||
@@ -350,6 +370,7 @@ removeCert.description=Questo non incide sulle funzionalità principali di Crypt
|
||||
|
||||
## About
|
||||
preferences.about=Info
|
||||
preferences.about.thirdPartyLicenses=Licenze di terze parti
|
||||
|
||||
# Vault Statistics
|
||||
stats.title=Statistiche per %s
|
||||
@@ -388,6 +409,8 @@ stats.access.total=Accesso totale: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Cassaforti
|
||||
main.vaultlist.listEntry=Cassaforte %s (%s)
|
||||
main.vaultlist.emptyList.onboardingInstruction=Clicca qui per aggiungere una cassaforte
|
||||
main.vaultlist.contextMenu.remove=Rimuovi…
|
||||
main.vaultlist.contextMenu.lock=Blocca
|
||||
@@ -399,13 +422,17 @@ main.vaultlist.contextMenu.share=Condividi…
|
||||
main.vaultlist.addVaultBtn.menuItemNew=Crea una nuova cassaforte…
|
||||
main.vaultlist.addVaultBtn.menuItemExisting=Apri una cassaforte esistente…
|
||||
main.vaultlist.addVaultBtn.menuItemRecover=Recupera una cassaforte esistente…
|
||||
main.vaultlist.showEventsButton.tooltip=Apri vista eventi
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Aggiungi Cassaforte
|
||||
main.vaultlist.showEventsButton.tooltip=Apri Vista Eventi
|
||||
main.vaultlist.showPreferencesButton.tooltip=Mostra Preferenze
|
||||
##Notification
|
||||
main.notification.updateAvailable=Aggiornamento disponibile.
|
||||
main.notification.support=Supporta Cryptomator.
|
||||
main.notification.closeButton.tooltip=Chiudi la barra delle informazioni
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Grazie per aver scelto Cryptomator per proteggere i tuoi file. Se necessiti d'assistenza, dai un'occhiata alle nostre guide per iniziare:
|
||||
main.vaultDetail.storageLocation=Percorso di archiviazione della cassaforte
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=BLOCCATO
|
||||
main.vaultDetail.unlockBtn=Sblocca…
|
||||
@@ -463,6 +490,7 @@ vaultOptions.general=Generale
|
||||
vaultOptions.general.vaultName=Nome della Cassaforte
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Blocca quando inattivo per
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=minuti
|
||||
vaultOptions.general.autoLock.accessibleText=Tempo di blocco in minuti
|
||||
vaultOptions.general.unlockAfterStartup=Sblocca la cassaforte all'avvio di Cryptomator
|
||||
vaultOptions.general.actionAfterUnlock=Dopo uno sblocco riuscito
|
||||
vaultOptions.general.actionAfterUnlock.ignore=Non fare nulla
|
||||
@@ -493,6 +521,7 @@ vaultOptions.masterkey.forgetSavedPasswordBtn=Dimentica Password Salvata
|
||||
vaultOptions.masterkey.recoveryKeyExplanation=Una chiave di recupero è il tuo unico mezzo per ripristinare l'accesso a una cassaforte se perdi la tua password.
|
||||
vaultOptions.masterkey.showRecoveryKeyBtn=Visualizza la chiave di recupero
|
||||
vaultOptions.masterkey.recoverPasswordBtn=Reimposta Password
|
||||
vaultOptions.masterkey.missingMasterkeyFile=Queste opzioni sono disponibili solo se il file con la chiave principale è presenza nella cartella della cassaforte.
|
||||
## Hub
|
||||
vaultOptions.hub=Recupero
|
||||
vaultOptions.hub.convertInfo=È possibile utilizzare la chiave di recupero per convertire questa cassaforte Hub in una cassaforte basata su password in caso di emergenza.
|
||||
@@ -521,6 +550,8 @@ recoveryKey.recover.recoverBtn=Recupera
|
||||
recoveryKey.recover.resetSuccess.message=Password reimpostata correttamente
|
||||
recoveryKey.recover.resetSuccess.description=Puoi sbloccare la tua cassaforte con la nuova password.
|
||||
### Recovery Key Vault Config Reset Success
|
||||
recoveryKey.recover.resetVaultConfigSuccess.message=Configurazione cassaforte recuperata
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.message=Masterkey file recuperato
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.description=Ora puoi sbloccare la cassaforte con la tua password.
|
||||
|
||||
# Recover Vault Config File and/or Masterkey
|
||||
@@ -644,6 +675,8 @@ decryptNames.filePicker.title=Seleziona file criptato
|
||||
decryptNames.filePicker.extensionDescription=File crittografato Cryptomator
|
||||
decryptNames.copyTable.tooltip=Copia tabella
|
||||
decryptNames.clearTable.tooltip=Cancella la tabella
|
||||
decryptNames.column.encrypted=Crittografato
|
||||
decryptNames.column.decrypted=Decrittografato
|
||||
decryptNames.copyHint=Copia il contenuto della cella con %s
|
||||
decryptNames.dropZone.message=Trascina i file o fai clic per selezionare
|
||||
decryptNames.dropZone.error.vaultInternalFiles=Hai selezionato file di casseforti con il nome non decifrabile
|
||||
@@ -656,23 +689,31 @@ decryptNames.dropZone.error.generic=Decifratura nomi file non riuscita
|
||||
eventView.title=Eventi
|
||||
eventView.filter.allVaults=Tutti
|
||||
eventView.clearListButton.tooltip=Cancella elenco
|
||||
eventView.filterVaults=Filtra per cassaforte
|
||||
eventView.cell.actionsButton.tooltip=Azioni dell'evento
|
||||
## event list entries
|
||||
eventView.entry.vaultLocked.description=Sblocca "%s" per i dettagli
|
||||
eventView.entry.conflictResolved.message=Conflitto risolto
|
||||
eventView.entry.conflictResolved.showDecrypted=Mostra file decifrato
|
||||
eventView.entry.conflictResolved.copyDecrypted=Copia percorso decriptato
|
||||
eventView.entry.conflict.message=Risoluzione dei conflitti fallita
|
||||
eventView.entry.conflict.showDecrypted=Mostra il file originale decifrato
|
||||
eventView.entry.conflict.copyDecrypted=Copia il percorso originale decifrato
|
||||
eventView.entry.conflict.showEncrypted=Mostra file cifrato in conflitto
|
||||
eventView.entry.conflict.copyEncrypted=Copia il percorso cifrato in conflitto
|
||||
eventView.entry.decryptionFailed.message=Decifratura fallita
|
||||
eventView.entry.decryptionFailed.showEncrypted=Mostra file cifrato
|
||||
eventView.entry.decryptionFailed.copyEncrypted=Copia percorso cifrato
|
||||
eventView.entry.brokenDirFile.message=Collegamento directory errato
|
||||
eventView.entry.brokenDirFile.showEncrypted=Visualizza il link cifrato errato
|
||||
eventView.entry.brokenDirFile.copyEncrypted=Copia il percorso errato del file cifrato
|
||||
eventView.entry.brokenFileNode.message=Nodo file errato
|
||||
eventView.entry.brokenFileNode.showEncrypted=Visualizza il nodo file cifrato errato
|
||||
eventView.entry.brokenFileNode.copyEncrypted=Copia il percorso errato del nodo file cifrato
|
||||
eventView.entry.brokenFileNode.copyDecrypted=Copia il percorso decifrato
|
||||
eventView.entry.inUse.message=File in uso
|
||||
eventView.entry.inUse.showDecrypted=Mostra file decifrato
|
||||
eventView.entry.inUse.showEncrypted=Mostra file cifrato
|
||||
eventView.entry.inUse.copyUserAndDevice=Copia il nome del dispositivo e dell'utente che sta bloccando
|
||||
eventView.entry.inUse.ignoreLock=Ignora lo stato di utilizzo
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=Il file è in uso su un altro dispositivo
|
||||
notification.inUse.description=Il file è aperto da %s su %s. Chiedigli di chiudere il file e permettere che la sincronizzazione termini. È possibile ignorare lo stato ed aprirlo ora, ma questo può causare conflitti o la sovrascrittura delle modifiche più recenti.
|
||||
notification.inUse.action=Ignora lo Stato di Utilizzo
|
||||
@@ -12,10 +12,14 @@ generic.button.close=閉じる
|
||||
generic.button.copy=コピー
|
||||
generic.button.copied=コピー完了!
|
||||
generic.button.done=完了
|
||||
generic.button.previous=戻る
|
||||
generic.button.next=次へ
|
||||
generic.button.print=印刷
|
||||
generic.button.remove=削除
|
||||
|
||||
## Vault state
|
||||
vault.state.error=エラー
|
||||
|
||||
# Error
|
||||
error.message=エラー %s
|
||||
error.description=Cryptomator で予期しない問題が発生しました。このエラーの解決方法を検索することができ、まだ報告されていない場合は、報告を行うことができます。
|
||||
@@ -175,6 +179,7 @@ hub.registerSuccess.legacy.description=金庫にアクセスするためには
|
||||
hub.registerFailed.message=デバイスの登録に失敗しました
|
||||
hub.registerFailed.description.generic=登録中にエラーが発生しました。エラーの詳細についてはアプリケーションログを参照してください。
|
||||
hub.registerFailed.description.deviceAlreadyExists=このデバイスは既に別のユーザーに登録されています。ユーザーアカウントを変更するか、別のデバイスを使用してください。
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=アクセスが拒否されました
|
||||
hub.unauthorized.description=この金庫を開く権限がありません。金庫の所有者からアクセス許可を貰って下さい。
|
||||
@@ -383,6 +388,7 @@ stats.access.total=合計アクセス: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=金庫
|
||||
main.vaultlist.emptyList.onboardingInstruction=ここをクリックして金庫を追加します
|
||||
main.vaultlist.contextMenu.remove=削除...
|
||||
main.vaultlist.contextMenu.lock=施錠
|
||||
@@ -391,7 +397,8 @@ main.vaultlist.contextMenu.unlockNow=今すぐ解錠
|
||||
main.vaultlist.contextMenu.vaultoptions=金庫のオプションを表示
|
||||
main.vaultlist.contextMenu.reveal=ドライブを表示
|
||||
main.vaultlist.contextMenu.share=共有…
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=金庫を追加
|
||||
##Notification
|
||||
main.notification.updateAvailable=アップデートがあります。
|
||||
main.notification.support=Cryptomator を支援する。
|
||||
## Vault Detail
|
||||
@@ -619,3 +626,10 @@ decryptNames.dropZone.error.generic=ファイル名の復号化に失敗しま
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
eventView.entry.inUse.showDecrypted=復号化されたファイルを表示
|
||||
eventView.entry.inUse.showEncrypted=暗号化されたファイルを表示
|
||||
eventView.entry.inUse.copyUserAndDevice=ロックしているユーザーとデバイス名をコピー
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -1,7 +1,7 @@
|
||||
# Locale Specific CSS files such as CJK, RTL,...
|
||||
|
||||
# Generics
|
||||
generic.action.dismiss=무시
|
||||
generic.action.dismiss=닫기
|
||||
## Button
|
||||
generic.button.apply=적용
|
||||
generic.button.back=이전
|
||||
@@ -10,21 +10,30 @@ generic.button.change=변경
|
||||
generic.button.choose=선택…
|
||||
generic.button.close=닫기
|
||||
generic.button.copy=복사
|
||||
generic.button.copied=복사됨!
|
||||
generic.button.copied=복사 완료!
|
||||
generic.button.done=완료
|
||||
generic.button.previous=이전
|
||||
generic.button.next=다음
|
||||
generic.button.print=인쇄
|
||||
generic.button.remove=제거
|
||||
|
||||
## Vault state
|
||||
vault.state.locked=잠김
|
||||
vault.state.unlocked=잠금 해제됨
|
||||
vault.state.missing=찾을 수 없음
|
||||
vault.state.migrationNeeded=마이그레이션 필요함
|
||||
vault.state.processing=처리 중
|
||||
vault.state.error=오류
|
||||
|
||||
# Error
|
||||
error.message=오류 발생
|
||||
error.description=예상치 못한 에러가 발생했습니다. 해결법을 검색하십시오. 만약 보고된 적이 없는 에러일 경우, 새로 신고해도 좋습니다.
|
||||
error.hyperlink.lookup=에러 검색하기
|
||||
error.hyperlink.report=에러 보고하기
|
||||
error.description=예상치 못한 오류가 발생했습니다. 해결법을 검색하십시오. 만약 보고된 적이 없는 오류일 경우, 새로 신고해도 좋습니다.
|
||||
error.hyperlink.lookup=이 오류 검색하기
|
||||
error.hyperlink.report=이 오류 보고하기
|
||||
error.technicalDetails=상세 정보:
|
||||
error.existingSolutionDescription=Cryptomator에 알 수 없는 문제가 발생했습니다. 하지만 이 오류에 대한 기존 해결법이 있습니다. 다음 링크를 살펴보십시오.
|
||||
error.hyperlink.solution=해결법 찾기
|
||||
error.lookupPermissionMessage=Cryptomator는 온라인에서 이 문제에 대한 해결책을 찾아볼 수 있습니다. 그러면 귀하의 IP 주소가 문제 데이터베이스로 전송됩니다.
|
||||
error.lookupPermissionMessage=Cryptomator는 온라인에서 이 문제에 대한 해결책을 찾아볼 수 있습니다. 실행 시 귀하의 IP 주소가 문제 데이터베이스로 전송됩니다.
|
||||
error.dismiss=무시
|
||||
error.lookUpSolution=해결법 찾기
|
||||
|
||||
@@ -33,7 +42,7 @@ defaults.vault.vaultName=Vault
|
||||
|
||||
# Tray Menu
|
||||
traymenu.showMainWindow=보기
|
||||
traymenu.showPreferencesWindow=환경설정
|
||||
traymenu.showPreferencesWindow=환경 설정
|
||||
traymenu.lockAllVaults=모두 잠그기
|
||||
traymenu.quitApplication=종료
|
||||
traymenu.vault.unlock=잠금 해제
|
||||
@@ -56,15 +65,15 @@ addvaultwizard.new.directoryPickerLabel=사용자 지정 위치
|
||||
addvaultwizard.new.directoryPickerButton=선택…
|
||||
addvaultwizard.new.directoryPickerTitle=디렉터리 선택
|
||||
addvaultwizard.new.fileAlreadyExists=Vault 내에 이미 존재하는 파일 또는 디렉터리 이름입니다.
|
||||
addvaultwizard.new.locationDoesNotExist=지정된 디렉터리가 존재하지 않거나 접근 할 수 없습니다.
|
||||
addvaultwizard.new.locationDoesNotExist=지정된 디렉터리가 존재하지 않거나 접근할 수 없습니다
|
||||
addvaultwizard.new.locationIsNotWritable=지정된 경로에 쓰기 권한이 없습니다.
|
||||
addvaultwizard.new.locationIsOk=Vault에 적당한 위치
|
||||
addvaultwizard.new.invalidName=올바르지 않은 vault 이름입니다
|
||||
addvaultwizard.new.validName=올바른 vault 이름입니다
|
||||
addvaultwizard.new.invalidName=유효하지 않은 Vault 이름입니다
|
||||
addvaultwizard.new.validName=유효한 Vault 이름입니다
|
||||
addvaultwizard.new.validCharacters.message=Vault 이름에는 다음과 같은 문자들이 포함될 수 있습니다:
|
||||
addvaultwizard.new.validCharacters.chars=문자 (예시: a, ж or 수)
|
||||
addvaultwizard.new.validCharacters.chars=문자 (예시: a, ж, 수)
|
||||
addvaultwizard.new.validCharacters.numbers=숫자
|
||||
addvaultwizard.new.validCharacters.dashes=대시 (%s) 또는 언더바 (%s)
|
||||
addvaultwizard.new.validCharacters.dashes=하이픈 (%s) 또는 언더바 (%s)
|
||||
### Expert Settings
|
||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=전문가 설정 활성화
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=36과 220 사이 숫자를 입력해주세요 (기본값: 220)
|
||||
@@ -73,45 +82,46 @@ addvaultwizard.new.expertSettings.shorteningThreshold.title=암호화된 파일
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=유효
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=Vault 생성
|
||||
addvaultwizard.new.generateRecoveryKeyChoice=비밀번호가 없으면 데이터에 접근할 수 없습니다. 비밀번호를 잊었을 때를 대비한 복구 키를 원하십니까?
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.yes=네, 보안보다 비밀번호를 잊어버리는 것이 더 걱정됩니다.
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.no=아니요, 나는 비밀번호를 잊지 않을겁니다.
|
||||
addvaultwizard.new.generateRecoveryKeyChoice=비밀번호 없이는 데이터에 접근할 수 없습니다. 비밀번호를 분실할 경우를 대비해 복구 키를 생성하시겠습니까?
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.yes=네, 만약을 대비하여 발급받도록 하겠습니다.
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.no=아니요, 비밀번호를 잊지 않을 것이며 강력한 보안을 원합니다.
|
||||
### Information
|
||||
addvault.new.readme.storageLocation.fileName=IMPORTANT.rtf
|
||||
addvault.new.readme.storageLocation.1=⚠️ VAULT 파일 ⚠️
|
||||
addvault.new.readme.storageLocation.2=해당 디렉토리는 당신의 Vault 저장 위치입니다.
|
||||
addvault.new.readme.storageLocation.2=해당 디렉터리는 귀하의 Vault가 저장된 위치입니다.
|
||||
addvault.new.readme.storageLocation.3=금지 사항
|
||||
addvault.new.readme.storageLocation.4=• 이 디렉터리를 포함한 어떤 파일도 다른 파일로 교체하거나
|
||||
addvault.new.readme.storageLocation.5=• 암호화하고자 하는 파일을 이 디렉터리에 붙여넣지 마십시오.
|
||||
addvault.new.readme.storageLocation.6=파일을 암호화하고 Vault 의 내용을 보려면 다음을 수행하십시오.
|
||||
addvault.new.readme.storageLocation.6=파일을 암호화하고 Vault의 내용을 보려면 다음을 수행하십시오:
|
||||
addvault.new.readme.storageLocation.7=1. 이 Vault를 Cryptomator에 추가하십시오.
|
||||
addvault.new.readme.storageLocation.8=2. Cryptomator에서 Vault 잠금을 해제하십시오.
|
||||
addvault.new.readme.storageLocation.9=3. "표시" 버튼을 클릭하여 Vault에 접근하십시오.
|
||||
addvault.new.readme.storageLocation.10=만일 도움이 필요하신 경우, 다음의 문서를 참조하십시오: %s
|
||||
addvault.new.readme.accessLocation.fileName=WELCOME.rtf
|
||||
addvault.new.readme.accessLocation.1=🔐️ 암호화 된 볼륨 🔐️
|
||||
addvault.new.readme.accessLocation.2=이것은 당신의 Vault 접근 위치입니다.
|
||||
addvault.new.readme.accessLocation.3=이 볼륨에 추가된 모든 파일은 Cryptomator로 암호화됩니다. 다른 드라이브/폴더처럼 작업할 수 있습니다. 볼륨의 내용은 복호화 된 것처럼 보이지만, 모든 파일은 항상 암호화되어 하드디스크에 저장됩니다.
|
||||
addvault.new.readme.accessLocation.2=이것은 귀하의 Vault 접근 위치입니다.
|
||||
addvault.new.readme.accessLocation.3=이 볼륨에 추가된 모든 파일은 Cryptomator로 암호화됩니다. 다른 드라이브/폴더처럼 작업할 수 있습니다. 이것은 단지 볼륨의 내용이 복호화되어 보이는 것이며, 모든 파일은 하드디스크에 항상 암호화된 상태로 저장됩니다.
|
||||
addvault.new.readme.accessLocation.4=이 파일은 지우셔도 무방합니다.
|
||||
## Existing
|
||||
addvaultwizard.existing.title=기존 금고 추가
|
||||
addvaultwizard.existing.instruction=이미 존재하는 vault 폴더 내에서 "vault.cryptomator" 파일을 선택하세요. 만약 "masterkey.cryptomator"만 있다면 그걸 대신 선택하세요.
|
||||
addvaultwizard.existing.title=기존 Vault 추가
|
||||
addvaultwizard.existing.instruction=이미 존재하는 Vault 폴더 내에서 "vault.cryptomator" 파일을 선택하세요. 만약 "masterkey.cryptomator"만 있다면 이를 대신 선택하세요.
|
||||
addvaultwizard.existing.restore=복구…
|
||||
addvaultwizard.existing.chooseBtn=선택…
|
||||
addvaultwizard.existing.filePickerTitle=Vault 파일 선택
|
||||
addvaultwizard.existing.filePickerMimeDesc=Cryptomator Vault
|
||||
## Success
|
||||
addvaultwizard.success.nextStepsInstructions="%s" Vault가 추가되었습니다.\n이 Vault를 접근하거나 컨텐츠를 추가하려면 잠금해제가 필요합니다. 그렇지만 언제든지 잠금해제가 가능합니다.
|
||||
addvaultwizard.success.unlockNow=지금 잠금해제
|
||||
addvaultwizard.success.nextStepsInstructions="%s" Vault가 추가되었습니다.\n이 Vault를 접근하거나 컨텐츠를 추가하려면 잠금 해제가 필요합니다. 그렇지만 언제든지 잠금 해제가 가능합니다.
|
||||
addvaultwizard.success.unlockNow=지금 잠금 해제
|
||||
|
||||
# Remove Vault
|
||||
removeVault.title=Vault 제거
|
||||
removeVault.title=Vault "%s" 제거
|
||||
removeVault.message=Vault를 삭제하시겠습니까?
|
||||
removeVault.description=이 행위는 Cryptomator에서만 이 Vault를 지웁니다. 나중에 다시 추가할 수 있습니다. 암호화된 파일은 하드디스크에서 삭제되지 않습니다.
|
||||
|
||||
# Change Password
|
||||
changepassword.title=비밀번호 변경
|
||||
changepassword.enterOldPassword="%s"의 비밀번호를 입력하여 주십시오.
|
||||
changepassword.finalConfirmation=비밀번호를 잊어버리면, 데이터에 접근할 수 없다는 것을 이해했습니다.
|
||||
changepassword.finalConfirmation=비밀번호 분실 시, 데이터에 접근할 수 없다는 것을 이해했습니다.
|
||||
|
||||
# Forget Password
|
||||
forgetPassword.title=비밀번호 삭제
|
||||
@@ -122,40 +132,41 @@ forgetPassword.confirmBtn=비밀번호 삭제
|
||||
# Unlock
|
||||
unlock.title="%s" 잠금 해제
|
||||
unlock.passwordPrompt="%s"의 비밀번호를 입력하십시오.
|
||||
unlock.savePassword=비밀번호 기억
|
||||
unlock.unlockBtn=잠금해제
|
||||
unlock.savePassword=비밀번호 기억하기
|
||||
unlock.unlockBtn=잠금 해제
|
||||
## Select
|
||||
unlock.chooseMasterkey.message=마스터키 파일을 찾을 수 없습니다
|
||||
unlock.chooseMasterkey.description=이 Vault의 Masterkey를 찾지 못했습니다. 마스터 키 위치를 수동으로 선택하여 주십시오.
|
||||
unlock.chooseMasterkey.description=이 "%s" Vault의 마스터키를 찾지 못했습니다. 마스터키 위치를 수동으로 선택하여 주십시오.
|
||||
unlock.chooseMasterkey.restoreInstead=대신 마스터키 파일 복구
|
||||
unlock.chooseMasterkey.filePickerTitle=Masterkey 파일 선택
|
||||
unlock.chooseMasterkey.filePickerMimeDesc=Cryptomator Masterkey
|
||||
## Success
|
||||
unlock.success.message=잠금 해제 성공
|
||||
unlock.success.description="%s"이(가) 성공적으로 잠금 해제되었습니다. 이제 이 Vault를 마운트 지점으로 접근할 수 있습니다.
|
||||
unlock.success.rememberChoice=선택 기억하기, 다시 묻지 않음
|
||||
unlock.success.rememberChoice=선택을 기억하고 다시 묻지 않음
|
||||
unlock.success.revealBtn=드라이브 표시
|
||||
## Failure
|
||||
unlock.error.customPath.message=Vault를 사용자 정의 경로에 마운트할 수 없습니다.
|
||||
unlock.error.customPath.description.notSupported=사용자 지정 경로를 계속 사용하려면 설정으로 이동하여 이를 지원하는 볼륨 유형을 선택하십시오. 또는, Vault 설정으로 이동하여 지원되는 마운트 지점을 선택하십시오.
|
||||
unlock.error.customPath.description.notExists=사용자 정의 마운트 경로가 존재하지 않습니다. 로컬 파일 시스템에서 생성하거나 볼트 옵션에서 변경하세요.
|
||||
unlock.error.customPath.description.notExists=사용자 정의 마운트 경로가 존재하지 않습니다. 로컬 파일 시스템에서 생성하거나 Vault 옵션에서 변경하세요.
|
||||
unlock.error.customPath.description.inUse=드라이브 문자 또는 사용자 정의 마운트 경로 "%s"가 이미 사용 중입니다.
|
||||
unlock.error.customPath.description.hideawayNotDir=잠금 해제에 사용된 임시 숨김 파일 "%3$s"을 제거할 수 없습니다. 파일을 확인한 후 수동으로 삭제해 주세요.
|
||||
unlock.error.customPath.description.hideawayNotDir=잠금 해제에 사용된 임시 숨김 파일 "%3$s"을(를) 제거할 수 없습니다. 파일을 확인한 후 수동으로 삭제해 주세요.
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Vault를 "%s" 경로에 마운트할 수 없습니다. 다시 시도하거나 다른 경로를 선택하세요.
|
||||
unlock.error.customPath.description.notEmptyDir=사용자 정의 마운트 경로 "%s"은 빈 폴더가 아닙니다. 빈 폴더를 선택하고 다시 시도하세요.
|
||||
unlock.error.customPath.description.generic=이 볼트에 대한 사용자 정의 마운트 경로를 선택했지만 다음 메시지와 함께 해당 경로를 사용하지 못했습니다: %2$s
|
||||
unlock.error.restartRequired.message=Vault을 잠금 해제할 수 없습니다.
|
||||
unlock.error.restartRequired.description=볼트 옵션에서 볼륨 유형을 변경하거나 Cryptomator를 다시 시작하십시오.
|
||||
unlock.error.customPath.description.generic=이 Vault에 대한 사용자 정의 마운트 경로를 선택했지만 다음 메시지와 함께 해당 경로를 사용하지 못했습니다: %2$s
|
||||
unlock.error.restartRequired.message=Vault를 잠금 해제할 수 없습니다
|
||||
unlock.error.restartRequired.description=Vault 옵션에서 볼륨 유형을 변경하거나 Cryptomator를 다시 시작하십시오.
|
||||
unlock.error.title="%s" 잠금 해제 실패
|
||||
## Hub
|
||||
hub.noKeychain.message=장치 키에 액세스할 수 없습니다
|
||||
hub.noKeychain.description=허브 저장소를 잠금 해제하려면 키체인을 사용하여 보호되는 장치 키가 필요합니다. 계속하려면 "%s"을 활성화하고 기본 설정에서 키체인을 선택하십시오.
|
||||
hub.noKeychain.message=기기 키에 액세스할 수 없습니다
|
||||
hub.noKeychain.description=Hub Vaults를 잠금 해제하려면 키체인을 사용하여 보호되는 기기 키가 필요합니다. 계속하려면 "%s"을(를) 활성화하고 기본 설정에서 키체인을 선택하십시오.
|
||||
hub.noKeychain.openBtn=설정 열기
|
||||
### Waiting
|
||||
hub.auth.message=인증 대기중…
|
||||
hub.auth.message=인증 대기 중…
|
||||
hub.auth.description=자동으로 로그인 페이지로 리다이렉트 될 것입니다.
|
||||
hub.auth.loginLink=수동으로 열려면 클릭하십시오.
|
||||
### Receive Key
|
||||
hub.receive.message=응답 처리중…
|
||||
hub.receive.message=응답 처리 중…
|
||||
hub.receive.description=Hub로부터 응답을 처리하고 있습니다. 잠시만 기다려 주십시오.
|
||||
### Register Device
|
||||
hub.register.message=새 기기
|
||||
@@ -170,11 +181,14 @@ hub.register.legacy.description=이 기기로부터 첫번째 Hub 접근입니
|
||||
hub.registerSuccess.message=기기 등록됨
|
||||
hub.registerSuccess.description=등록에 성공하였습니다. Vault를 잠금 해제할 수 있습니다.
|
||||
hub.registerSuccess.unlockBtn=잠금 해제
|
||||
hub.registerSuccess.legacy.description=Vault에 접근하기 위해서는 이 기기를 Vault 소유주가 추가적으로 허가해야 합니다.
|
||||
hub.registerSuccess.legacy.description=Vault에 접근하기 위해서는 이 기기를 Vault 소유자가 추가적으로 허가해야 합니다.
|
||||
### Registration Failed
|
||||
hub.registerFailed.message=기기 등록 실패
|
||||
hub.registerFailed.description.generic=등록 중에 에러가 발생했습니다. 앱 로그에서 자세한 정보를 확인할 수 있습니다.
|
||||
hub.registerFailed.description.generic=등록 중에 오류가 발생했습니다. 앱 로그에서 자세한 정보를 확인할 수 있습니다.
|
||||
hub.registerFailed.description.deviceAlreadyExists=이 기기는 이미 다른 사용자에 등록되어 있습니다. 다른 사용자 계정이나 다른 기기를 사용해보세요.
|
||||
### Archived
|
||||
hub.archived.message=Vault가 아카이브됨
|
||||
hub.archived.description=이 Vault는 아카이브되어 더 이상 접근할 수 없습니다. Vault 소유자에게 문의하십시오.
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=액세스 거부됨
|
||||
hub.unauthorized.description=해당 Vault에 접근하도록 허가되지 않았습니다. Vault의 소유자에게 권한을 요청하세요.
|
||||
@@ -185,60 +199,60 @@ hub.requireAccountInit.description.1=Hub 사용자 프로필
|
||||
hub.requireAccountInit.description.2=.
|
||||
### License Exceeded
|
||||
hub.invalidLicense.message=Hub 라이선스가 잘못되었습니다.
|
||||
hub.invalidLicense.description=Cryptomator Hub 인스턴스에 잘못된 라이선스가 있습니다. 라이센스를 업그레이드하거나 갱신하려면 허브 관리자에게 알리십시오.
|
||||
hub.invalidLicense.description=Cryptomator Hub 인스턴스에 잘못된 라이선스가 있습니다. 라이선스를 업그레이드하거나 갱신하려면 허브 관리자에게 알리십시오.
|
||||
|
||||
# Lock
|
||||
## Force
|
||||
lock.forced.message=잠금 실패
|
||||
lock.forced.description=대기 중인 작동이나 파일이 열려있어 "%s"를 잠그는데 실패하였습니다. 이 Vault를 강제로 잠글 수 있으나, 입/출력의 중단은 저장되지 않은 데이터의 유실을 초래할 수 있습니다.
|
||||
lock.forced.description=대기 중인 작동이나 파일이 열려있어 "%s"을(를) 잠그는데 실패하였습니다. 이 Vault를 강제로 잠글 수 있으나, 입/출력의 중단은 저장되지 않은 데이터의 유실을 초래할 수 있습니다.
|
||||
lock.forced.retryBtn=재시도
|
||||
lock.forced.forceBtn=강제 잠금
|
||||
## Failure
|
||||
lock.fail.message=Vault 잠금에 실패하였습니다.
|
||||
lock.fail.description="%s" Vault를 잠글 수 없습니다. 저장되지 않은 작업이 다른 곳에 저장된 것과 중요한 읽기/쓰기 동작이 완료되었는지 확인 하십시요. Vault를 닫기 위해, Cryptomator 프로세스를 강제로 종료 하십시오.
|
||||
lock.fail.description="%s" Vault를 잠글 수 없습니다. 저장되지 않은 작업이 다른 곳에 저장된 것과 중요한 읽기/쓰기 동작이 완료되었는지 확인 하십시요. Vault를 닫기 위해, Cryptomator 프로세스를 강제로 종료하십시오.
|
||||
|
||||
# Migration
|
||||
migration.title=Vault 업그레이드
|
||||
## Start
|
||||
migration.start.header=Vault 업그레이드
|
||||
migration.start.text=Vault "%s"를 현재 버전의 Cryptomator에서 열기 위해서는 해당 vault를 새 버전으로 업그레이드해야 합니다. 업그레이드를 하기 전에 다음 사항들을 알고 있어야 합니다:
|
||||
migration.start.text=Vault "%s"를 현재 버전의 Cryptomator에서 열기 위해서는 해당 Vault를 새 버전으로 업그레이드해야 합니다. 업그레이드를 하기 전에 다음 사항들을 알고 있어야 합니다:
|
||||
migration.start.remarkUndone=이 업그레이드는 되돌릴 수 없습니다.
|
||||
migration.start.remarkVersions=과거 버전의 Cryptomator는 업그레이드된 vault를 열 수 없습니다.
|
||||
migration.start.remarkCanRun=이 vault를 열 때 사용하는 모든 장치가 현재 버전의 Cryptomator를 실행할 수 있는지 확인해야 합니다.
|
||||
migration.start.remarkSynced=업그레이드하기 전에 해당 vault가 모든 기기에 정상적으로 동기화되어야 합니다.
|
||||
migration.start.confirm=나는 위 정보를 읽고 정말 이해했습니다.
|
||||
migration.start.remarkVersions=과거 버전의 Cryptomator는 업그레이드된 Vault를 열 수 없습니다.
|
||||
migration.start.remarkCanRun=이 Vault를 열 때 사용하는 모든 기기가 현재 버전의 Cryptomator를 실행할 수 있는지 확인해야 합니다.
|
||||
migration.start.remarkSynced=업그레이드하기 전에 해당 Vault가 모든 기기에 정상적으로 동기화되어야 합니다.
|
||||
migration.start.confirm=위 내용을 충분히 숙지하였음을 확인합니다.
|
||||
## Run
|
||||
migration.run.enterPassword="%s"의 비밀번호를 입력하십시오.
|
||||
migration.run.startMigrationBtn=Vault 마이그레이션
|
||||
migration.run.progressHint=이 작업은 시간이 조금 소요됩니다.
|
||||
## Success
|
||||
migration.success.nextStepsInstructions="%s" 의 마이그레이션이 성공적으로 완료되었습니다. 이제 Vault를 잠금해제할 수 있습니다.
|
||||
migration.success.unlockNow=지금 잠금해제
|
||||
migration.success.nextStepsInstructions="%s" 의 마이그레이션이 성공적으로 완료되었습니다. 이제 Vault를 잠금 해제할 수 있습니다.
|
||||
migration.success.unlockNow=지금 잠금 해제
|
||||
## Missing file system capabilities
|
||||
migration.error.missingFileSystemCapabilities.title=지원하지 않는 파일 시스템
|
||||
migration.error.missingFileSystemCapabilities.description=Vault가 부적절한 파일시스템에 있기 때문에 마이그레이션이 시작되지 않았습니다.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=너무 긴 파일 이름을 파일시스템에서 지원하지 않습니다.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=너무 긴 경로를 파일시스템에서 지원하지 않습니다.
|
||||
migration.error.missingFileSystemCapabilities.description=Vault가 부적절한 파일 시스템에 있기 때문에 마이그레이션이 시작되지 않았습니다.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=파일 시스템이 긴 파일 이름을 지원하지 않습니다.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=파일 시스템이 긴 경로를 지원하지 않습니다.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=파일 시스템이 읽기를 허용하지 않습니다.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=파일 시스템이 쓰기를 허용하지 않습니다.
|
||||
## Impossible
|
||||
migration.impossible.heading=Vault를 마이그레이션 할 수 없습니다.
|
||||
migration.impossible.reason=저장소 위치 또는 접근 지점이 호환되지 않아 Vault를 자동으로 마이그레이션 할 수 없습니다.
|
||||
migration.impossible.moreInfo=Vault를 이전 버전으로 계속 열수 있습니다. Vault를 직접 마이그레이션 하는 설명을 보시려면, 다음을 방문하십시오.
|
||||
migration.impossible.moreInfo=Vault를 이전 버전으로 계속 열 수 있습니다. Vault를 직접 마이그레이션 하는 설명을 보시려면, 다음을 방문하십시오
|
||||
|
||||
# Health Check
|
||||
## Start
|
||||
health.title="%s"의 상태 검사
|
||||
health.intro.header=상태 검사
|
||||
health.intro.text=상태 검사는 Vault의 내부 구조의 문제점을 점검하고 해결할 수 있는 기능입니다. 다음 사항을 유의하시기 바랍니다:
|
||||
health.intro.remarkSync=모든 장치가 완전히 동기화됐는지 확인하십시오. 대부분의 문제를 해결합니다.
|
||||
health.intro.remarkSync=모든 기기가 완전히 동기화됐는지 확인하십시오. 이는 대부분의 문제를 해결합니다.
|
||||
health.intro.remarkFix=모든 문제를 해결할 수 있는 것은 아닙니다.
|
||||
health.intro.remarkBackup=데이터가 손상된 경우 백업만이 유일한 해결책입니다.
|
||||
health.intro.affirmation=나는 위 정보를 읽었으며, 이해했습니다.
|
||||
## Start Failure
|
||||
health.fail.header=Vault 설정을 불러오는 중 에러 발생
|
||||
health.fail.ioError=설정 파일에 접근하는 중 에러가 발생했습니다.
|
||||
health.fail.parseError=Vault 설정을 파싱하는 중 에러가 발생했습니다.
|
||||
health.fail.header=Vault 설정을 불러오는 중 오류 발생
|
||||
health.fail.ioError=설정 파일에 접근하는 중 오류가 발생했습니다.
|
||||
health.fail.parseError=Vault 설정을 파싱하는 중 오류가 발생했습니다.
|
||||
health.fail.moreInfo=더 많은 정보
|
||||
## Check Selection
|
||||
health.checkList.description=검사할 항목을 왼쪽 목록에서 선택하거나 아래 버튼을 사용하세요.
|
||||
@@ -253,8 +267,10 @@ health.check.detail.checkSkipped=선택된 검사항목이 없습니다.
|
||||
health.check.detail.checkFinished=검사가 성공적으로 완료되었습니다.
|
||||
health.check.detail.checkFinishedAndFound=검사가 완료되었습니다. 검사 결과를 확인해주세요.
|
||||
health.check.detail.checkFailed=오류로 인해 검사가 종료되었습니다.
|
||||
health.check.detail.checkCancelled=검사가 취소되었습니다
|
||||
health.check.detail.checkCancelled=검사가 취소되었습니다.
|
||||
health.check.detail.listFilters.label=필터
|
||||
health.check.detail.filterSeverity=중요도로 정렬
|
||||
health.check.detail.filterFixState=해결 상태로 정렬
|
||||
health.check.detail.fixAllSpecificBtn=모든 문제 형식 고치기
|
||||
health.check.exportBtn=보고서 내보내기
|
||||
## Result view
|
||||
@@ -263,14 +279,14 @@ health.result.severityFilter.good=양호
|
||||
health.result.severityFilter.info=정보
|
||||
health.result.severityFilter.warn=경고
|
||||
health.result.severityFilter.crit=심각
|
||||
health.result.severityTip.good=상태: 양호\n정상적인 vault 구조를 가지고 있습니다.
|
||||
health.result.severityTip.good=상태: 양호\n정상적인 Vault 구조를 가지고 있습니다.
|
||||
health.result.severityTip.info=상태: 정보\nVault 구조 온전함, 문제 해결 권장됨.
|
||||
health.result.severityTip.warn=상태: 경고\nVault 구조 손상됨, 문제 해결 요구됨.
|
||||
health.result.severityTip.crit=상태: 심각\nVault 구조가 손상되었습니다. 데이터 손실이 발생했습니다.
|
||||
health.result.fixStateFilter.all=모든 문제 해결 상태
|
||||
health.result.fixStateFilter.fixable=문제 해결 가능
|
||||
health.result.fixStateFilter.notFixable=문제 해결 불가
|
||||
health.result.fixStateFilter.fixing=문제 해결중…
|
||||
health.result.fixStateFilter.fixing=문제 해결 중…
|
||||
health.result.fixStateFilter.fixed=문제 해결됨
|
||||
health.result.fixStateFilter.fixFailed=문제 해결 실패
|
||||
## Fix Application
|
||||
@@ -279,7 +295,7 @@ health.fix.successTip=문제 해결이 성공적으로 완료되었습니다
|
||||
health.fix.failTip=문제 해결 실패, 상세 정보는 로그를 참조하십시오.
|
||||
|
||||
# Preferences
|
||||
preferences.title=환경설정
|
||||
preferences.title=환경 설정
|
||||
## General
|
||||
preferences.general=일반
|
||||
preferences.general.startHidden=Cryptomator를 시작할 때 창 숨김
|
||||
@@ -293,9 +309,9 @@ preferences.general.quickAccessService=열린 Vault를 빠른 접근 위치에
|
||||
preferences.interface=인터페이스
|
||||
preferences.interface.theme=테마
|
||||
preferences.interface.theme.automatic=자동
|
||||
preferences.interface.theme.dark=어둡게
|
||||
preferences.interface.theme.light=밝게
|
||||
preferences.interface.unlockThemes=다크모드 해제
|
||||
preferences.interface.theme.dark=다크 모드
|
||||
preferences.interface.theme.light=라이트 모드
|
||||
preferences.interface.unlockThemes=다크 모드 사용 권한을 얻어보세요!
|
||||
preferences.interface.language=언어 (재시작 필요)
|
||||
preferences.interface.language.auto=시스템 기본 설정
|
||||
preferences.interface.interfaceOrientation=인터페이스 방향
|
||||
@@ -323,37 +339,44 @@ preferences.updates.autoUpdateCheck=자동으로 업데이트 확인
|
||||
preferences.updates.checkNowBtn=지금 확인
|
||||
preferences.updates.updateAvailable=버전 %s의 업데이트가 가능합니다.
|
||||
preferences.updates.lastUpdateCheck=마지막 확인: %s
|
||||
preferences.updates.lastUpdateCheck.never=확인 안함
|
||||
preferences.updates.lastUpdateCheck.never=확인 안 함
|
||||
preferences.updates.lastUpdateCheck.recently=최근
|
||||
preferences.updates.lastUpdateCheck.daysAgo=%s일 전
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=%s 시간 전
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.1=부탁드립니다:
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.2=Vault 잠금
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.3=하여 업데이트를 설치하세요.
|
||||
preferences.updates.checkFailed=업데이트를 확인할 수 없습니다. 인터넷 상태를 확인하거나 나중에 시도해주세요.
|
||||
preferences.updates.updateFailed=업데이트 실패. 매뉴얼에 따라 업데이트를 설치해주세요.
|
||||
preferences.updates.upToDate=현재 최신 버전의 Cryptomator를 사용하고 있습니다.
|
||||
preferences.updates.visitDownloadPage=다운로드 페이지 방문
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=후원하기
|
||||
preferences.contribute.registeredFor=%s(으)로 후원자 인증 등록됨
|
||||
preferences.contribute.noCertificate=Cryptomator를 후원하시고 후원자 인증을 받으십시오. 라이선스 키와 비슷하지만 무료 소프트웨어를 사용하는 멋진 사람들을 위한 것입니다. ;-)
|
||||
preferences.contribute.getCertificate=아직 후원자 인증이 없으신가요? 어떻게 얻는지 배울 수 있습니다.
|
||||
preferences.contribute.promptText=후원자 인증코드를 여기에 붙여넣기
|
||||
preferences.contribute.promptText=후원자 인증 코드를 여기에 붙여넣기
|
||||
preferences.contribute.thankYou=Cryptomator의 오픈 소스 개발을 지원해 주셔서 감사합니다!
|
||||
preferences.contribute.donate=후원하기
|
||||
preferences.contribute.sponsor=스폰서
|
||||
preferences.contribute.removeCert.tooltip=인증서 제거
|
||||
|
||||
### Remove License Key Dialog
|
||||
removeCert.title=인증서 제거
|
||||
removeCert.message=서포터 인증서를 제거하시겠습니까?
|
||||
removeCert.message=후원자 인증서를 제거하시겠습니까?
|
||||
removeCert.description=Cryptomator의 핵심 기능은 영향을 받지 않습니다. Vault에 대한 접근이 제한되거나 보안이 약화되지 않습니다.
|
||||
#<-- Add entries for donations and code/translation/documentation contribution -->
|
||||
|
||||
## About
|
||||
preferences.about=제품 정보
|
||||
preferences.about.thirdPartyLicenses=제3자 라이선스
|
||||
|
||||
# Vault Statistics
|
||||
stats.title=%s에 대한 통계
|
||||
stats.cacheHitRate=캐시 히트율
|
||||
## Read
|
||||
stats.read.throughput.idle=읽기: 대기중
|
||||
stats.read.throughput.idle=읽기: 대기 중
|
||||
stats.read.throughput.kibs=읽기: %.2f KiB/s
|
||||
stats.read.throughput.mibs=읽기: %.2f MiB/s
|
||||
stats.read.total.data.none=데이터 읽기: -
|
||||
@@ -366,10 +389,10 @@ stats.decr.total.data.mib=데이터 복호화: %.1f MiB
|
||||
stats.decr.total.data.gib=데이터 복호화: %.1f GiB
|
||||
stats.read.accessCount=총 읽기 횟수: %d
|
||||
## Write
|
||||
stats.write.throughput.idle=쓰기: 대기중
|
||||
stats.write.throughput.idle=쓰기: 대기 중
|
||||
stats.write.throughput.kibs=쓰기: %.2f KiB/s
|
||||
stats.write.throughput.mibs=쓰기: %.2f MiB/s
|
||||
stats.write.total.data.none=데이터 기록됨: -
|
||||
stats.write.total.data.none=데이터 쓰기: -
|
||||
stats.write.total.data.kib=데이터 쓰기: %.1f KiB
|
||||
stats.write.total.data.mib=데이터 쓰기: %.1f MiB
|
||||
stats.write.total.data.gib=데이터 쓰기: %.1f GiB
|
||||
@@ -386,6 +409,8 @@ stats.access.total=총 접근: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Vault
|
||||
main.vaultlist.listEntry=Vault %s (%s)
|
||||
main.vaultlist.emptyList.onboardingInstruction=여기를 클릭하여 Vault를 추가하세요
|
||||
main.vaultlist.contextMenu.remove=제거...
|
||||
main.vaultlist.contextMenu.lock=잠금
|
||||
@@ -394,13 +419,20 @@ main.vaultlist.contextMenu.unlockNow=지금 잠금 해제
|
||||
main.vaultlist.contextMenu.vaultoptions=Vault 옵션 보기
|
||||
main.vaultlist.contextMenu.reveal=드라이브 표시
|
||||
main.vaultlist.contextMenu.share=공유하기…
|
||||
main.vaultlist.addVaultBtn.menuItemNew=새 Vault 만들기…
|
||||
main.vaultlist.addVaultBtn.menuItemExisting=기존 Vault 열기…
|
||||
main.vaultlist.addVaultBtn.menuItemRecover=기존 Vault 복구…
|
||||
main.vaultlist.addVaultButton.tooltip=Vault 추가
|
||||
main.vaultlist.showEventsButton.tooltip=이벤트 뷰어 열기
|
||||
##Notificaition
|
||||
main.vaultlist.showPreferencesButton.tooltip=환경 설정 표시
|
||||
##Notification
|
||||
main.notification.updateAvailable=업데이트가 있습니다.
|
||||
main.notification.support=Cryptomator 지원하기.
|
||||
main.notification.support=Cryptomator 지원해 주세요
|
||||
main.notification.closeButton.tooltip=정보 표시줄 닫기
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=파일을 보호하기 위해 Cryptomator를 선택해주셔서 감사합니다. 만약 다른 도움이 필요하시면, 시작 안내서를 참조하시기 바랍니다.
|
||||
main.vaultDetail.welcomeOnboarding=파일 보호를 위해 Cryptomator를 선택해 주셔서 감사합니다. 도움이 필요하시면 시작 가이드를 확인해 주십시오:
|
||||
main.vaultDetail.storageLocation=Vault 저장 위치
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=잠김
|
||||
main.vaultDetail.unlockBtn=잠금 해제...
|
||||
@@ -425,25 +457,27 @@ main.vaultDetail.locateEncryptedFileBtn.tooltip=암호화된 파일을 보기
|
||||
main.vaultDetail.encryptedPathsCopied=클립보드에 복사됨!
|
||||
main.vaultDetail.locateEncrypted.filePickerTitle=Vault 내부에서 파일 선택
|
||||
main.vaultDetail.decryptName.buttonLabel=파일명 복호화
|
||||
main.vaultDetail.decryptName.tooltip=암호화된 볼트 파일을 선택해 파일 이름을 복호화
|
||||
main.vaultDetail.decryptName.tooltip=암호화된 Vault 파일을 선택해 파일 이름을 복호화
|
||||
### Missing
|
||||
main.vaultDetail.missing.info=Cryptomator가 이 경로에 있는 Vault를 찾지 못했습니다.
|
||||
main.vaultDetail.missing.recheck=다시 시도
|
||||
main.vaultDetail.missing.remove=Vault 목록에서 제거...
|
||||
main.vaultDetail.missing.changeLocation=Vault 위치 변경
|
||||
### Missing Vault Config
|
||||
main.vaultDetail.missingVaultConfig.info=Vault 구성(config)이 누락되었습니다.
|
||||
main.vaultDetail.missingVaultConfig.restore=Vault 구성(config) 복구
|
||||
### Needs Migration
|
||||
main.vaultDetail.migrateButton=Vault 업그레이드
|
||||
main.vaultDetail.migratePrompt=Vault에 접근하기 전, 새로운 포맷으로 업그레이드가 필요합니다.
|
||||
### Error
|
||||
main.vaultDetail.error.info=디스크에서 Vault를 로드 중 에러 발생
|
||||
main.vaultDetail.error.info=디스크에서 Vault를 로드 중 오류가 발생했습니다.
|
||||
main.vaultDetail.error.reload=새로고침
|
||||
main.vaultDetail.error.windowTitle=Vault 로드중 에러 발생
|
||||
main.vaultDetail.error.windowTitle=Vault 로드 중 오류 발생
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.title=파일 암호화 방법
|
||||
wrongFileAlert.message=이 파일들을 암호화하려고 하십니까?
|
||||
wrongFileAlert.description=이 목적을 위해, Cryptomator는 파일 관리자에 볼륨을 제공합니다.
|
||||
wrongFileAlert.description=이 목적을 위해 Cryptomator는 파일 관리자에 볼륨을 제공합니다.
|
||||
wrongFileAlert.instruction.0=파일을 암호화 하려면, 다음의 3단계를 따르십시오:
|
||||
wrongFileAlert.instruction.1=1. Vault를 잠금 해제하십시오.
|
||||
wrongFileAlert.instruction.2=2. "표시" 버튼을 클릭해 파일 탐색기에서 볼륨을 여십시오.
|
||||
@@ -456,9 +490,10 @@ vaultOptions.general=일반
|
||||
vaultOptions.general.vaultName=Vault 이름
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=다음 시간 동안 유휴상태 시 잠그기
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=분
|
||||
vaultOptions.general.autoLock.accessibleText=잠금 시간(분)
|
||||
vaultOptions.general.unlockAfterStartup=Cryptomator를 시작할 때 Vault 잠금 해제
|
||||
vaultOptions.general.actionAfterUnlock=성공적으로 잠금해제 후
|
||||
vaultOptions.general.actionAfterUnlock.ignore=아무 것도 하지 않음
|
||||
vaultOptions.general.actionAfterUnlock.ignore=아무 것도 하지 않기
|
||||
vaultOptions.general.actionAfterUnlock.reveal=드라이브 표시
|
||||
vaultOptions.general.actionAfterUnlock.ask=요청
|
||||
vaultOptions.general.startHealthCheckBtn=상태 검사 시작
|
||||
@@ -472,9 +507,9 @@ vaultOptions.mount.winDriveLetterOccupied=사용됨
|
||||
vaultOptions.mount.mountPoint=마운트 지점
|
||||
vaultOptions.mount.mountPoint.auto=자동으로 적합한 위치를 선택
|
||||
vaultOptions.mount.mountPoint.driveLetter=드라이브 문자를 지정하여 사용
|
||||
vaultOptions.mount.mountPoint.custom=선택한 디렉토리 사용
|
||||
vaultOptions.mount.mountPoint.custom=선택한 디렉터리 사용
|
||||
vaultOptions.mount.mountPoint.directoryPickerButton=선택
|
||||
vaultOptions.mount.mountPoint.directoryPickerTitle=디렉토리 선택
|
||||
vaultOptions.mount.mountPoint.directoryPickerTitle=디렉터리 선택
|
||||
vaultOptions.mount.volumeType.default=기본 (%s)
|
||||
vaultOptions.mount.volumeType.restartRequired=이 볼륨 타입을 사용하기 위해, Cryptomator의 재시작이 필요합니다.
|
||||
vaultOptions.mount.volume.tcp.port=TCP 포트
|
||||
@@ -483,12 +518,13 @@ vaultOptions.mount.volume.type=볼륨 타입
|
||||
vaultOptions.masterkey=비밀번호
|
||||
vaultOptions.masterkey.changePasswordBtn=비밀번호 변경
|
||||
vaultOptions.masterkey.forgetSavedPasswordBtn=저장된 비밀번호 삭제
|
||||
vaultOptions.masterkey.recoveryKeyExplanation=복구 키는 비밀번호를 잊어버렸을 때, Vault의 접근을 복원 할 수 있는 유일한 방법입니다.
|
||||
vaultOptions.masterkey.recoveryKeyExplanation=복구 키는 비밀번호를 잊어버렸을 때, Vault의 접근을 복원할 수 있는 유일한 방법입니다.
|
||||
vaultOptions.masterkey.showRecoveryKeyBtn=복구 키 표시
|
||||
vaultOptions.masterkey.recoverPasswordBtn=비밀번호 재설정
|
||||
vaultOptions.masterkey.missingMasterkeyFile=이러한 옵션은 마스터키 파일이 Vault 디렉터리에 있는 경우에만 사용할 수 있습니다.
|
||||
## Hub
|
||||
vaultOptions.hub=복구
|
||||
vaultOptions.hub.convertInfo=비상상황에 이 Hub Vault를 비밀번호 기반 Vault로 변환하기 위해 복구 키를 사용할 수 있습니다.
|
||||
vaultOptions.hub.convertInfo=비상 상황에 이 Hub Vault를 비밀번호 기반 Vault로 변환하기 위해 복구 키를 사용할 수 있습니다.
|
||||
vaultOptions.hub.convertBtn=비밀번호 기반 Vault로 변환하기
|
||||
|
||||
# Recovery Key
|
||||
@@ -496,41 +532,72 @@ vaultOptions.hub.convertBtn=비밀번호 기반 Vault로 변환하기
|
||||
recoveryKey.display.title=복구 키 보기
|
||||
recoveryKey.create.message=비밀번호가 필요합니다
|
||||
recoveryKey.create.description="%s"의 복구 키를 표시하려면 비밀번호를 입력해 주세요.
|
||||
recoveryKey.display.description="%s" 데이터 접근을 복원하는데 사용 할 수 있는 복구 키 입니다:
|
||||
recoveryKey.display.StorageHints=매우 안전한곳에 보관하십시오. 예시:\n • 비밀번호 관리자를 사용하여 저장\n • USB 플래시 드라이브에 저장\n • 종이로 출력
|
||||
recoveryKey.recover.description=Vault 구성(config) 복구를 위해 "%s" 비밀번호를 입력하세요.
|
||||
recoveryKey.display.description="%s"에 대한 접근을 복원하는데 사용할 수 있는 복구 키 입니다:
|
||||
recoveryKey.display.StorageHints=매우 안전한 곳에 보관하십시오. 예를 들어:\n • 비밀번호 관리자를 사용하여 저장\n • USB 플래시 드라이브에 저장\n • 종이로 출력
|
||||
## Reset Password
|
||||
### Enter Recovery Key
|
||||
recoveryKey.recover.title=비밀번호 바꾸기
|
||||
recoveryKey.recover.prompt="%s"의 복구키를 입력하십시오:
|
||||
recoveryKey.recover.correctKey=올바른 복구 키 입니다
|
||||
recoveryKey.recover.wrongKey=이 복구 키는 다른 vault의 키입니다
|
||||
recoveryKey.recover.wrongKey=이 복구 키는 다른 Vault의 키입니다
|
||||
recoveryKey.recover.invalidKey=해당 복구 키는 유효하지 않습니다
|
||||
recoveryKey.printout.heading=Cryptomator 복구 키\n"%s"\n
|
||||
### Reset Password
|
||||
recoveryKey.recover.resetBtn=초기화
|
||||
recoveryKey.recover.recoverBtn=복구
|
||||
### Recovery Key Password Reset Success
|
||||
recoveryKey.recover.resetSuccess.message=비밀번호 재설정 성공
|
||||
recoveryKey.recover.resetSuccess.description=이제 해당 vault를 새 비밀번호로 잠금 해제할 수 있습니다.
|
||||
recoveryKey.recover.resetSuccess.description=이제 해당 Vault를 새 비밀번호로 잠금 해제할 수 있습니다.
|
||||
### Recovery Key Vault Config Reset Success
|
||||
recoveryKey.recover.resetVaultConfigSuccess.message=Vault 구성(config) 복구 완료
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.message=마스터키 파일 복구 완료
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.description=이제 해당 Vault를 귀하의 비밀번호로 잠금 해제할 수 있습니다.
|
||||
|
||||
# Recover Vault Config File and/or Masterkey
|
||||
##Add Existing Vault without recovery - Dialog
|
||||
recover.existing.title=Vault 추가됨
|
||||
recover.existing.message=Vault가 성공적으로 추가되었습니다
|
||||
recover.existing.description=Vault "%s"이(가) Vault 목록에 추가되었습니다. 복구 절차는 필요하지 않았습니다.
|
||||
|
||||
##Vault Already Exists - Dialog
|
||||
recover.alreadyExists.title=Vault 이미 존재함
|
||||
recover.alreadyExists.message=Vault 이미 추가됨
|
||||
recover.alreadyExists.description=Vault "%s"이(가) 이미 목록에 존재하여 다시 추가되지 않았습니다.
|
||||
|
||||
##Invalid Selection - Dialog
|
||||
recover.invalidSelection.title=유효하지 않은 선택
|
||||
recover.invalidSelection.message=Vault를 선택하지 않았습니다
|
||||
recover.invalidSelection.description=선택한 폴더는 유효한 Cryptomator Vault여야 합니다.
|
||||
|
||||
## Contact Hub Vault Owner - Dialog
|
||||
contactHubVaultOwner.title=Hub Vault
|
||||
contactHubVaultOwner.message=이 Vault는 Cryptomator Hub를 이용하여 생성되었습니다
|
||||
contactHubVaultOwner.description=누락된 파일을 복원하려면 Vault 소유자에게 문의하십시오. Vault 소유자는 Cryptomator Hub에서 Vault 템플릿을 다운로드할 수 있습니다.
|
||||
|
||||
##Dialog Title
|
||||
recover.recoverVaultConfig.title=Vault 구성(config) 복구
|
||||
recover.recoverMasterkey.title=마스터키 복구하기
|
||||
|
||||
## OnBoarding
|
||||
recover.onBoarding.chooseMethod=복구 방법을 선택하세요:
|
||||
recover.onBoarding.useRecoveryKey=복구키 사용하기
|
||||
recover.onBoarding.usePassword=비밀번호 사용하기
|
||||
recover.onBoarding.intro=아래 사항을 정확히 읽고 확인하세요:
|
||||
recover.onBoarding.pleaseConfirm=진행하기 전, 다음 사항을 확인해 주십시오:
|
||||
recover.onBoarding.otherwisePleaseConfirm=그렇지 않다면 다음 사항을 확인해 주십시오:
|
||||
recover.onBoarding.allMissing.intro=만약 이 Vault가 Cryptomator Hub에 의해 관리되고 있다면 소유자가 귀하를 대신하여 복구해야 합니다.
|
||||
recover.onBoarding.intro.ensure=모든 파일이 동기화 완료되었습니다.
|
||||
recover.onBoarding.affirmation=저는 이러한 요구 사항을 읽고 이해했습니다
|
||||
|
||||
###Vault Config Missing
|
||||
recover.onBoarding.intro.recoveryKey=복구 키가 있으며 전문가 설정 사용 여부를 알고 있습니다.
|
||||
recover.onBoarding.intro.password=Vault 비밀번호가 있으며 전문가 설정 사용 여부를 알고 있습니다.
|
||||
###Masterkey Missing
|
||||
recover.onBoarding.intro.masterkey.recoveryKey=Vault 복구 키를 가지고 있습니다.
|
||||
|
||||
## Expert Settings
|
||||
recover.expertSettings.shorteningThreshold.title=이 값은 복구 전에 사용된 값과 일치해야만 전에 암호화된 데이터와의 호환성을 보장할 수 있습니다.
|
||||
|
||||
# Convert Vault
|
||||
convertVault.title=Vault 변환
|
||||
@@ -553,7 +620,7 @@ passwordStrength.messageLabel.4=매우 강함
|
||||
|
||||
# Quit
|
||||
quit.title=앱 종료
|
||||
quit.message=잠금 해제된 vault들이 존재합니다
|
||||
quit.message=잠금 해제된 Vault들이 존재합니다
|
||||
quit.description=정말로 나가시겠습니까? Cryptomator는 데이터 손실을 막기 위해 열린 Vault를 잠글 것입니다.
|
||||
quit.lockAndQuitBtn=Vault 잠금 후 종료하기
|
||||
|
||||
@@ -591,7 +658,7 @@ shareVault.instruction.2=2. Vault의 비밀번호를 안전한 방식으로 전
|
||||
shareVault.remarkBestPractices=문서에 있는 권장사항을 통해 더 많은 정보를 확인하십시오.
|
||||
shareVault.docsTooltip=Vault의 공유에 대해서는 문서를 참조하십시오.
|
||||
shareVault.hubAd.description=팀에서 작업하는 안전한 방법
|
||||
shareVault.hubAd.keyManagement=• 사전지식 없는 키 관리
|
||||
shareVault.hubAd.keyManagement=• 사전 지식 없는 키 관리
|
||||
shareVault.hubAd.authentication=• 강력한 인증
|
||||
shareVault.hubAd.encryption=• 종단간 암호화
|
||||
shareVault.visitHub=Cryptomator Hub 방문하기
|
||||
@@ -608,6 +675,8 @@ decryptNames.filePicker.title=암호화된 파일 선택
|
||||
decryptNames.filePicker.extensionDescription=Cryptomator로 암호화된 파일
|
||||
decryptNames.copyTable.tooltip=테이블 복사
|
||||
decryptNames.clearTable.tooltip=테이블 비우기
|
||||
decryptNames.column.encrypted=암호화됨
|
||||
decryptNames.column.decrypted=복호화됨
|
||||
decryptNames.copyHint=%s로 셀 내용 복사하기
|
||||
decryptNames.dropZone.message=파일을 여기에 드롭하거나 클릭하세요
|
||||
decryptNames.dropZone.error.vaultInternalFiles=복호화 가능한 이름이 선택되지 않은 Vailt 내부 파일
|
||||
@@ -620,23 +689,31 @@ decryptNames.dropZone.error.generic=파일 이름 복호화 실패
|
||||
eventView.title=이벤트
|
||||
eventView.filter.allVaults=전체
|
||||
eventView.clearListButton.tooltip=목록 지우기
|
||||
eventView.filterVaults=Vault로 필터링
|
||||
eventView.cell.actionsButton.tooltip=이벤트별 동작
|
||||
## event list entries
|
||||
eventView.entry.vaultLocked.description="%s"를 잠금 해제하여 세부정보 보기
|
||||
eventView.entry.conflictResolved.message=해결된 충돌
|
||||
eventView.entry.conflictResolved.showDecrypted=복호화된 파일 보기
|
||||
eventView.entry.conflictResolved.copyDecrypted=복호화된 경로 복사하기
|
||||
eventView.entry.conflict.message=충돌 해결 실패
|
||||
eventView.entry.conflict.showDecrypted=복호화된 원본 파일 보기
|
||||
eventView.entry.conflict.copyDecrypted=복호화된 원본 경로 복사하기
|
||||
eventView.entry.conflict.showEncrypted=충돌하는 암호화된 파일 보기
|
||||
eventView.entry.conflict.copyEncrypted=충돌하는 암호화된 경로 복사하기
|
||||
eventView.entry.decryptionFailed.message=복호화 실패
|
||||
eventView.entry.decryptionFailed.showEncrypted=암호화된 파일 보기
|
||||
eventView.entry.decryptionFailed.copyEncrypted=암호화된 경로 복사하기
|
||||
eventView.entry.brokenDirFile.message=망가진 디렉터리 링크
|
||||
eventView.entry.brokenDirFile.showEncrypted=망가진 암호화된 링크 보기
|
||||
eventView.entry.brokenDirFile.copyEncrypted=망가진 링크의 경로 복사하리
|
||||
eventView.entry.brokenFileNode.message=망가진 파일시스템 노드
|
||||
eventView.entry.brokenFileNode.message=망가진 파일 시스템 노드
|
||||
eventView.entry.brokenFileNode.showEncrypted=망가진 암호화된 노드 보기
|
||||
eventView.entry.brokenFileNode.copyEncrypted=망가진 암호화된 노드의 경로 복사하기
|
||||
eventView.entry.brokenFileNode.copyDecrypted=복호화된 경로 복사하기
|
||||
eventView.entry.inUse.message=파일 사용 중
|
||||
eventView.entry.inUse.showDecrypted=복호화된 파일 보기
|
||||
eventView.entry.inUse.showEncrypted=암호화된 파일 보기
|
||||
eventView.entry.inUse.copyUserAndDevice=파일 잠금 사용자 및 기기 이름 복사
|
||||
eventView.entry.inUse.ignoreLock=사용 여부 상태 무시
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=다른 기기에서 파일 사용 중
|
||||
notification.inUse.description=해당 파일은 %s이(가) %s의 컴퓨터에서 열어 놓은 상태입니다. 파일을 닫고 동기화가 완료될 때까지 기다리도록 요청하세요. 상태를 무시하고 지금 파일을 열 수도 있지만, 이렇게 하면 충돌이 발생하거나 최신 변경 사항이 덮어쓰여질 수 있습니다.
|
||||
notification.inUse.action=사용 여부 상태 무시
|
||||
@@ -12,10 +12,19 @@ generic.button.close=Aizvērt
|
||||
generic.button.copy=Ievietot starpliktuvē
|
||||
generic.button.copied=Ievietots starpliktuvē
|
||||
generic.button.done=Darīts
|
||||
generic.button.previous=Atpakaļ
|
||||
generic.button.next=Tālāk
|
||||
generic.button.print=Drukāt
|
||||
generic.button.remove=Noņemt
|
||||
|
||||
## Vault state
|
||||
vault.state.locked=Aizslēgta
|
||||
vault.state.unlocked=Atslēgta
|
||||
vault.state.missing=Trūkst
|
||||
vault.state.migrationNeeded=Nepieciešama pārcelšana
|
||||
vault.state.processing=Apstrādā
|
||||
vault.state.error=Kļūda
|
||||
|
||||
# Error
|
||||
error.message=Atgadījās kļūda
|
||||
error.description=Cryptomator negaidīja, ka tas notiks. Var uzmeklēt esošus šīs kļūdas risinājumus. Vai arī, ja par to vēl nav ziņots, var droši darīt to.
|
||||
@@ -177,6 +186,9 @@ hub.registerSuccess.legacy.description=Lai piekļūtu glabātavai, tās īpašni
|
||||
hub.registerFailed.message=Ierīces reģistrācija neizdevās
|
||||
hub.registerFailed.description.generic=Reģistrēšanās laikā atgadījās kļūda. Vairāk informācijas ir atrodama lietotnes žurnālā.
|
||||
hub.registerFailed.description.deviceAlreadyExists=Šī ierīce jau ir reģistrēta citam lietotājam. Jamēģina nomainīt lietotāja kontu vai izmantot citu ierīci.
|
||||
### Archived
|
||||
hub.archived.message=Glabātava arhivēta
|
||||
hub.archived.description=Glabātava tika arhivēta un vairs nav pieejama. Lūgums sazināties ar glabātavas īpašnieku.
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Piekļuve atteikta
|
||||
hub.unauthorized.description=Nav pilnvaras atvērt šo glabātavu. Jāsazinās ar glabātavas īpašnieku, lai pieprasītu piekļuvi.
|
||||
@@ -257,6 +269,8 @@ health.check.detail.checkFinishedAndFound=Pārbaude beidza izpildīteis. Lūgums
|
||||
health.check.detail.checkFailed=Pārbaude beidza darboties kļūdas dēļ.
|
||||
health.check.detail.checkCancelled=Pārbaude tika atcelta.
|
||||
health.check.detail.listFilters.label=Atlasīt
|
||||
health.check.detail.filterSeverity=Atlasīt pēc nozīmīguma
|
||||
health.check.detail.filterFixState=Atlasīt pēc salabošanas stāvokļa
|
||||
health.check.detail.fixAllSpecificBtn=Salabot visu ar veidu
|
||||
health.check.exportBtn=Izgūt pārskatu
|
||||
## Result view
|
||||
@@ -329,8 +343,13 @@ preferences.updates.lastUpdateCheck.never=nekad
|
||||
preferences.updates.lastUpdateCheck.recently=nesen
|
||||
preferences.updates.lastUpdateCheck.daysAgo=Pirms %s dienām
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=Pirms %s stundām
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.1=Lūgums
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.2=aizslēgt savas glabātavas,
|
||||
preferences.updates.prohibitedDueToUnlockedVaults.3=lai uzstādītu atjauninājumu.
|
||||
preferences.updates.checkFailed=Atjauninājumu uzmeklēšana neizdevās. Lūgums pārbaudīt savu interneta savienojumu vai vēlāk mēģināt vēlreiz.
|
||||
preferences.updates.updateFailed=Atjaunināšana neizdevāš. Lūgums pašrocīgi uzstādīt atjauninājumu.
|
||||
preferences.updates.upToDate=Cryptomator ir jaunākā versija.
|
||||
preferences.updates.visitDownloadPage=Apmeklēt lejupielāžu lapu
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=Atbalstīt mūs
|
||||
@@ -341,6 +360,7 @@ preferences.contribute.promptText=Šeit jāielīmē atbalstītāja sertifikāta
|
||||
preferences.contribute.thankYou=Paldies par Cryptomator atvērtā pirmkoda izstrādes atbalstīšanu!
|
||||
preferences.contribute.donate=Ziedot
|
||||
preferences.contribute.sponsor=Pabalstīt
|
||||
preferences.contribute.removeCert.tooltip=Noņemt sertifikātu
|
||||
|
||||
### Remove License Key Dialog
|
||||
removeCert.title=Noņemt sertifikātu
|
||||
@@ -350,6 +370,7 @@ removeCert.description=Šis neietekmē Cryptomator pamata iespējas. Nav ne iero
|
||||
|
||||
## About
|
||||
preferences.about=Par
|
||||
preferences.about.thirdPartyLicenses=Trešo pušu licences
|
||||
|
||||
# Vault Statistics
|
||||
stats.title=%s pārskats
|
||||
@@ -388,6 +409,8 @@ stats.access.total=Piekļuves pavisam: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Glabātavas
|
||||
main.vaultlist.listEntry=Glabātava %s (%s)
|
||||
main.vaultlist.emptyList.onboardingInstruction=Klikšķināt šeit, lai pievienotu glabātavu
|
||||
main.vaultlist.contextMenu.remove=Noņemt…
|
||||
main.vaultlist.contextMenu.lock=Aizslēgt
|
||||
@@ -399,13 +422,17 @@ main.vaultlist.contextMenu.share=Kopīgot…
|
||||
main.vaultlist.addVaultBtn.menuItemNew=Izveidot jaunu glabātavu…
|
||||
main.vaultlist.addVaultBtn.menuItemExisting=Atvērt esošu glabātavu…
|
||||
main.vaultlist.addVaultBtn.menuItemRecover=Atjaunot esošu glabātavu…
|
||||
main.vaultlist.addVaultButton.tooltip=Pievienot glabātavu
|
||||
main.vaultlist.showEventsButton.tooltip=Atvērt notikumu skatu
|
||||
##Notificaition
|
||||
main.vaultlist.showPreferencesButton.tooltip=Rādīt iestatījumus
|
||||
##Notification
|
||||
main.notification.updateAvailable=Ir pieejams atjauninājums.
|
||||
main.notification.support=Atbalstīt Cryptomator.
|
||||
main.notification.closeButton.tooltip=Aizvērt informācijas joslu
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Paldies par izvēlēšanos izmantot Cryptomator, lai aizsargātu savas datnes! Ja ir nepieciešama jebkāda palīdzība, ir vērts ieskatīties mūsu darba uzsākšanas norādēs:
|
||||
main.vaultDetail.storageLocation=Glabātavas krātuves atrašanās vieta
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=AIZSLĒGTA
|
||||
main.vaultDetail.unlockBtn=Atslēgt…
|
||||
@@ -463,6 +490,7 @@ vaultOptions.general=Vispārēji
|
||||
vaultOptions.general.vaultName=Glabātavas nosaukums
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Aizslēgt, kad dīkstāvē
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=minūtes
|
||||
vaultOptions.general.autoLock.accessibleText=Aizslēgšanas noildze minūtēs
|
||||
vaultOptions.general.unlockAfterStartup=Atslēgt glabātavu pēc Cryptomator palaišanas
|
||||
vaultOptions.general.actionAfterUnlock=Pēc sekmīgas atslēgšanas
|
||||
vaultOptions.general.actionAfterUnlock.ignore=Nedarīt neko
|
||||
@@ -521,6 +549,8 @@ recoveryKey.recover.recoverBtn=Atkopt
|
||||
recoveryKey.recover.resetSuccess.message=Paroles atiestatīšana sekmīga
|
||||
recoveryKey.recover.resetSuccess.description=Savu glabātavu var atslēgt ar jauno paroli.
|
||||
### Recovery Key Vault Config Reset Success
|
||||
recoveryKey.recover.resetVaultConfigSuccess.message=Glabātavas konfigurācija atkopta
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.message=Galvenās atslēgas datne atkopta
|
||||
recoveryKey.recover.resetMasterkeyFileSuccess.description=Savu glabātavu tagad var atslēgt ar jauno paroli.
|
||||
|
||||
# Recover Vault Config File and/or Masterkey
|
||||
@@ -644,6 +674,8 @@ decryptNames.filePicker.title=Atlasīt šifrētu datni
|
||||
decryptNames.filePicker.extensionDescription=Cryptomator šifrēta datne
|
||||
decryptNames.copyTable.tooltip=Ievietot tabulu starpliktuvē
|
||||
decryptNames.clearTable.tooltip=Notīrīt tabulu
|
||||
decryptNames.column.encrypted=Šifrēts
|
||||
decryptNames.column.decrypted=Atšifrēts
|
||||
decryptNames.copyHint=Ievietot šūnas saturu starpliktuvē ar %s
|
||||
decryptNames.dropZone.message=Nomest datnes vai klikšķināt, lai atlasītu
|
||||
decryptNames.dropZone.error.vaultInternalFiles=Atlasītas glabātavas iekšējās datnes ar neatšifrējamu nosaukumu
|
||||
@@ -656,23 +688,31 @@ decryptNames.dropZone.error.generic=Neizdevās atšifrēt datņu nosaukumus
|
||||
eventView.title=Notikumi
|
||||
eventView.filter.allVaults=Viss
|
||||
eventView.clearListButton.tooltip=Notīrīt sarakstu
|
||||
eventView.filterVaults=Atlasīt pēc glabātavas
|
||||
eventView.cell.actionsButton.tooltip=Notikumu darbības
|
||||
## event list entries
|
||||
eventView.entry.vaultLocked.description=Atslēgt "%s", lai redzētu informāciju
|
||||
eventView.entry.conflictResolved.message=Atrisināta nesaderība
|
||||
eventView.entry.conflictResolved.showDecrypted=Parādīt atšifrēto datni
|
||||
eventView.entry.conflictResolved.copyDecrypted=Ievietot starpliktuvē atšifrēto ceļu
|
||||
eventView.entry.conflict.message=Nesaderības atrisināšana neizdevās
|
||||
eventView.entry.conflict.showDecrypted=Parādīt atšifrēto, sākotnējo datni
|
||||
eventView.entry.conflict.copyDecrypted=Ievietot starpliktuvē atšifrēto, sākotnējo datni
|
||||
eventView.entry.conflict.showEncrypted=Parādīt nesaderīgo, šifrēto datni
|
||||
eventView.entry.conflict.copyEncrypted=Ievietot starpliktuvē nesaderīgo, šifrēto ceļu
|
||||
eventView.entry.decryptionFailed.message=Atšifrēšana neizdevās
|
||||
eventView.entry.decryptionFailed.showEncrypted=Parādīt šifrēto datni
|
||||
eventView.entry.decryptionFailed.copyEncrypted=Ievietot starpliktuvē šifrēto ceļu
|
||||
eventView.entry.brokenDirFile.message=Bojāta mapes saite
|
||||
eventView.entry.brokenDirFile.showEncrypted=Parādīt bojāto, šifrēto saiti
|
||||
eventView.entry.brokenDirFile.copyEncrypted=Ievietot starpliktuvē bojātās saites ceļu
|
||||
eventView.entry.brokenFileNode.message=Bojāts datņu sistēmas mezgls
|
||||
eventView.entry.brokenFileNode.showEncrypted=Parādīt bojāto, šifrēto mezglu
|
||||
eventView.entry.brokenFileNode.copyEncrypted=Ievietot starpliktuvē botjātā, šifrētā mezgla ceļu
|
||||
eventView.entry.brokenFileNode.copyDecrypted=Ievietot starpliktuvē atšifrēto ceļu
|
||||
eventView.entry.inUse.message=Datne tiek izmantota
|
||||
eventView.entry.inUse.showDecrypted=Parādīt atšifrēto datni
|
||||
eventView.entry.inUse.showEncrypted=Parādīt šifrēto datni
|
||||
eventView.entry.inUse.copyUserAndDevice=Ievietot starpliktuvē lietotāju un ierīces, kurā aizslēgta, nosaukumu
|
||||
eventView.entry.inUse.ignoreLock=Neņemt vēra izmantošanas stāvokli
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=Datne tiek izmantota citā ierīcē
|
||||
notification.inUse.description=Datni atvēra %s ierīcē %s. Jāvaicā aizvērt datni un ļaut pabeigties sinhronizēšanai. Stāvokli tagad var neņemt vērā, lai atvērtu datni, bet tas var radīt nesaderības vai pārrakstīt jaunākas izmaiņas.
|
||||
notification.inUse.action=Neņemt vēra izmantošanas stāvokli
|
||||
@@ -16,6 +16,9 @@ generic.button.next=Продолжи
|
||||
generic.button.print=Печати
|
||||
generic.button.remove=Отстрани
|
||||
|
||||
## Vault state
|
||||
vault.state.error=Грешка
|
||||
|
||||
# Error
|
||||
error.message=Грешка
|
||||
error.description=Не очекуваше да се случи ова. Можете да пронајдете постоечки решенија за оваа грешка. Или, ако не е пријавена сè уште, слободно направете тоа.
|
||||
@@ -81,6 +84,7 @@ unlock.unlockBtn=Отклучи
|
||||
### Registration Success
|
||||
hub.registerSuccess.unlockBtn=Отклучи
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
@@ -128,7 +132,8 @@ preferences.title=Поставки
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist.contextMenu.lock=Заклучи
|
||||
##Notificaition
|
||||
main.vaultlist.addVaultButton.tooltip=Додај сеф
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
### Locked
|
||||
@@ -198,3 +203,7 @@ vaultOptions.mount.mountPoint.directoryPickerButton=Избор…
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
@@ -3,6 +3,8 @@
|
||||
# Generics
|
||||
## Button
|
||||
|
||||
## Vault state
|
||||
|
||||
# Error
|
||||
|
||||
# Defaults
|
||||
@@ -36,6 +38,7 @@
|
||||
### Register Device Legacy
|
||||
### Registration Success
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
@@ -81,7 +84,7 @@
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
##Notificaition
|
||||
##Notification
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
### Locked
|
||||
@@ -148,3 +151,7 @@
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user