mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-09-23 16:34:34 +00:00
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1bc256c6d5 | ||
|
|
f3581c5acf | ||
|
|
506827ffef |
@@ -7,9 +7,6 @@ updates:
|
||||
day: "monday"
|
||||
time: "06:00"
|
||||
timezone: "Etc/UTC"
|
||||
ignore:
|
||||
- dependency-name: "org.cryptomator:integrations-api"
|
||||
versions: ["2.0.0-alpha1"]
|
||||
groups:
|
||||
java-test-dependencies:
|
||||
patterns:
|
||||
|
||||
@@ -11,7 +11,7 @@ on:
|
||||
|
||||
env:
|
||||
JAVA_DIST: 'zulu'
|
||||
JAVA_VERSION: '22.0.2+9'
|
||||
JAVA_VERSION: '22.0.1+8'
|
||||
|
||||
jobs:
|
||||
get-version:
|
||||
@@ -29,12 +29,12 @@ jobs:
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
appimage-suffix: x86_64
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/22.0.2/openjfx-22.0.2_linux-x64_bin-jmods.zip'
|
||||
openjfx-sha: 'd44bff3b94d5668fdee18a938d7b1269026d663d44765f02d29a9bdfd3fa1eb0'
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/22.0.1/openjfx-22.0.1_linux-x64_bin-jmods.zip'
|
||||
openjfx-sha: 'fbb22f35951c2e049cc2554dd03c2c56b4f5adc4b2ae9248872f46175ac103d8'
|
||||
- os: [self-hosted, Linux, ARM64]
|
||||
appimage-suffix: aarch64
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/22.0.2/openjfx-22.0.2_linux-aarch64_bin-jmods.zip'
|
||||
openjfx-sha: '3d5457136690c4f5bb9522d38b45218e045bdac13c24aa4c808c7c8d17d039c7'
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/22.0.1/openjfx-22.0.1_linux-aarch64_bin-jmods.zip'
|
||||
openjfx-sha: '1982ad168a5e8d7cf4a9458a7d088b4f0552d0ac3f24f23fb88f8bc7e8d69a13'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Java
|
||||
@@ -80,7 +80,7 @@ jobs:
|
||||
--verbose
|
||||
--output runtime
|
||||
--module-path "${JAVA_HOME}/jmods:openjfx-jmods"
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net,java.compiler
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net
|
||||
--strip-native-commands
|
||||
--no-header-files
|
||||
--no-man-pages
|
||||
|
||||
@@ -17,13 +17,13 @@ on:
|
||||
|
||||
env:
|
||||
JAVA_DIST: 'zulu'
|
||||
JAVA_VERSION: '22.0.2+9'
|
||||
JAVA_VERSION: '22.0.1+8'
|
||||
COFFEELIBS_JDK: 22
|
||||
COFFEELIBS_JDK_VERSION: '22.0.2+9-0ppa1'
|
||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/22.0.2/openjfx-22.0.2_linux-x64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AMD64_HASH: 'd44bff3b94d5668fdee18a938d7b1269026d663d44765f02d29a9bdfd3fa1eb0'
|
||||
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/22.0.2/openjfx-22.0.2_linux-aarch64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AARCH64_HASH: '3d5457136690c4f5bb9522d38b45218e045bdac13c24aa4c808c7c8d17d039c7'
|
||||
COFFEELIBS_JDK_VERSION: '22.0.1+8-0ppa1'
|
||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/22.0.1/openjfx-22.0.1_linux-x64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AMD64_HASH: 'fbb22f35951c2e049cc2554dd03c2c56b4f5adc4b2ae9248872f46175ac103d8'
|
||||
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/22.0.1/openjfx-22.0.1_linux-aarch64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AARCH64_HASH: '1982ad168a5e8d7cf4a9458a7d088b4f0552d0ac3f24f23fb88f8bc7e8d69a13'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
@@ -16,7 +16,7 @@ on:
|
||||
|
||||
env:
|
||||
JAVA_DIST: 'zulu'
|
||||
JAVA_VERSION: '22.0.2+9'
|
||||
JAVA_VERSION: '22.0.1+8'
|
||||
|
||||
jobs:
|
||||
get-version:
|
||||
@@ -37,15 +37,15 @@ jobs:
|
||||
output-suffix: x64
|
||||
xcode-path: '/Applications/Xcode_13.2.1.app'
|
||||
fuse-lib: macFUSE
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/22.0.2/openjfx-22.0.2_osx-x64_bin-jmods.zip'
|
||||
openjfx-sha: '115cb08bb59d880cfff6e51e0bf0dcc45785ed9d456b8b8425597b04da6ab3d4'
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/22.0.1/openjfx-22.0.1_osx-x64_bin-jmods.zip'
|
||||
openjfx-sha: 'e07a11c112abbdebe7c058b44c151e1e475de748671d896aef3d73f32453c248'
|
||||
- os: [self-hosted, macOS, ARM64]
|
||||
architecture: aarch64
|
||||
output-suffix: arm64
|
||||
xcode-path: '/Applications/Xcode_13.2.1.app'
|
||||
fuse-lib: FUSE-T
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/22.0.2/openjfx-22.0.2_osx-aarch64_bin-jmods.zip'
|
||||
openjfx-sha: '813c6748f7c99cb7a579d48b48a087b4682b1fad1fc1a4fe5f9b21cf872b15a7'
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/22.0.1/openjfx-22.0.1_osx-aarch64_bin-jmods.zip'
|
||||
openjfx-sha: '572fce94b9b09d316b960a49e3c2b5d35231ed0463e3b1c4020b8de89783b51d'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Java
|
||||
@@ -91,7 +91,7 @@ jobs:
|
||||
--verbose
|
||||
--output runtime
|
||||
--module-path "${JAVA_HOME}/jmods:openjfx-jmods"
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.accessibility,jdk.management.jfr,java.compiler
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.accessibility,jdk.management.jfr
|
||||
--strip-native-commands
|
||||
--no-header-files
|
||||
--no-man-pages
|
||||
@@ -137,11 +137,9 @@ jobs:
|
||||
mv dist/mac/resources/Cryptomator-Vault.icns Cryptomator.app/Contents/Resources/
|
||||
sed -i '' "s|###BUNDLE_SHORT_VERSION_STRING###|${VERSION_NO}|g" Cryptomator.app/Contents/Info.plist
|
||||
sed -i '' "s|###BUNDLE_VERSION###|${REVISION_NO}|g" Cryptomator.app/Contents/Info.plist
|
||||
echo -n "$PROVISIONING_PROFILE_BASE64" | base64 --decode --output Cryptomator.app/Contents/embedded.provisionprofile
|
||||
env:
|
||||
VERSION_NO: ${{ needs.get-version.outputs.semVerNum }}
|
||||
REVISION_NO: ${{ needs.get-version.outputs.revNum }}
|
||||
PROVISIONING_PROFILE_BASE64: ${{ secrets.MACOS_PROVISIONING_PROFILE_BASE64 }}
|
||||
- name: Generate license for dmg
|
||||
run: >
|
||||
mvn -B -Djavafx.platform=mac license:add-third-party
|
||||
@@ -196,12 +194,9 @@ jobs:
|
||||
fi
|
||||
done
|
||||
echo "Codesigning Cryptomator.app..."
|
||||
sed -i '' "s|###APP_IDENTIFIER_PREFIX###|${TEAM_IDENTIFIER}.|g" dist/mac/Cryptomator.entitlements
|
||||
sed -i '' "s|###TEAM_IDENTIFIER###|${TEAM_IDENTIFIER}|g" dist/mac/Cryptomator.entitlements
|
||||
codesign --force --deep --entitlements dist/mac/Cryptomator.entitlements -o runtime -s ${CODESIGN_IDENTITY} Cryptomator.app
|
||||
env:
|
||||
CODESIGN_IDENTITY: ${{ secrets.MACOS_CODESIGN_IDENTITY }}
|
||||
TEAM_IDENTIFIER: ${{ secrets.MACOS_TEAM_IDENTIFIER }}
|
||||
- name: Prepare .dmg contents
|
||||
run: |
|
||||
mkdir dmg
|
||||
|
||||
@@ -16,9 +16,9 @@ on:
|
||||
|
||||
env:
|
||||
JAVA_DIST: 'zulu'
|
||||
JAVA_VERSION: '22.0.2+9'
|
||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/22.0.2/openjfx-22.0.2_windows-x64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AMD64_HASH: 'f9376d200f5c5b85327d575c1ec1482e6455f19916577f7e2fc9be2f48bb29b6'
|
||||
JAVA_VERSION: '22.0.1+8'
|
||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/22.0.1/openjfx-22.0.1_windows-x64_bin-jmods.zip'
|
||||
OPENJFX_JMODS_AMD64_HASH: 'de82e53179032a49bec005deb4438e8f261d08c4b58864a5c17e1d87286b09dd'
|
||||
WINFSP_MSI: 'https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-2.0.23075.msi'
|
||||
WINFSP_UNINSTALLER: 'https://github.com/cryptomator/winfsp-uninstaller/releases/latest/download/winfsp-uninstaller.exe'
|
||||
|
||||
@@ -89,7 +89,7 @@ jobs:
|
||||
--verbose
|
||||
--output runtime
|
||||
--module-path "jfxjmods;${JAVA_HOME}/jmods"
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.accessibility,jdk.management.jfr,java.compiler
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.accessibility,jdk.management.jfr
|
||||
--strip-native-commands
|
||||
--no-header-files
|
||||
--no-man-pages
|
||||
@@ -113,7 +113,7 @@ jobs:
|
||||
--copyright "(C) 2016 - 2024 Skymatic GmbH"
|
||||
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
|
||||
--java-options "--enable-preview"
|
||||
--java-options "--enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win"
|
||||
--java-options "--enable-native-access=org.cryptomator.jfuse.win"
|
||||
--java-options "-Xss5m"
|
||||
--java-options "-Xmx256m"
|
||||
--java-options "-Dcryptomator.appVersion=\"${{ needs.get-version.outputs.semVerStr }}\""
|
||||
|
||||
+1
-1
@@ -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.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" />
|
||||
<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.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" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
+1
-1
@@ -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.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" />
|
||||
<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.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" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
@@ -31,8 +31,8 @@ Cryptomator is provided free of charge as an open-source project despite the hig
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a href="https://mowcapital.com/"><img src="https://cryptomator.org/img/sponsors/mowcapital.svg" alt="Mow Capital" height="28"></a></td>
|
||||
<td><a href="https://www.hassmann-it-forensik.de/"><img src="https://cryptomator.org/img/sponsors/hassmannitforensik.png" alt="Hassmann IT-Forensik" height="56"></a></td>
|
||||
<td><a href="https://www.route4me.com/"><img src="https://cryptomator.org/img/sponsors/route4me.svg" alt="Route4Me" height="56"></a></td>
|
||||
<td><a href="https://www.easeus.com/"><img src="https://cryptomator.org/img/sponsors/easeus.png" alt="EaseUS" height="40"></a></td>
|
||||
<td><a href="https://www.hassmann-it-forensik.de/"><img src="https://cryptomator.org/img/sponsors/hassmannitforensik.png" alt="Hassmann IT-Forensik" height="40"></a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
Vendored
+5
-5
@@ -23,16 +23,16 @@ mvn -B -f ../../../pom.xml clean package -Plinux -DskipTests -Djavafx.platform=l
|
||||
cp ../../../LICENSE.txt ../../../target
|
||||
cp ../../../target/cryptomator-*.jar ../../../target/mods
|
||||
|
||||
JAVAFX_VERSION=22.0.2
|
||||
JAVAFX_VERSION=22.0.1
|
||||
JAVAFX_ARCH="x64"
|
||||
JAVAFX_JMODS_SHA256='d44bff3b94d5668fdee18a938d7b1269026d663d44765f02d29a9bdfd3fa1eb0'
|
||||
JAVAFX_JMODS_SHA256='fbb22f35951c2e049cc2554dd03c2c56b4f5adc4b2ae9248872f46175ac103d8'
|
||||
if [ "${CPU_ARCH}" = "aarch64" ]; then
|
||||
JAVAFX_ARCH="aarch64"
|
||||
JAVAFX_JMODS_SHA256='3d5457136690c4f5bb9522d38b45218e045bdac13c24aa4c808c7c8d17d039c7'
|
||||
JAVAFX_JMODS_SHA256='1982ad168a5e8d7cf4a9458a7d088b4f0552d0ac3f24f23fb88f8bc7e8d69a13'
|
||||
fi
|
||||
|
||||
# download javaFX jmods
|
||||
JAVAFX_JMODS_URL="https://download2.gluonhq.com/openjfx/${JAVAFX_VERSION}/openjfx-${JAVAFX_VERSION}_linux-${JAVAFX_ARCH}_bin-jmods.zip"
|
||||
JAVAFX_JMODS_URL="https://download2.gluonhq.com/openjfx/${JAVAFX_VERSION}/openjfx-21.0.1_linux-${JAVAFX_ARCH}_bin-jmods.zip"
|
||||
|
||||
|
||||
curl -L ${JAVAFX_JMODS_URL} -o openjfx-jmods.zip
|
||||
@@ -56,7 +56,7 @@ ${JAVA_HOME}/bin/jlink \
|
||||
--verbose \
|
||||
--output runtime \
|
||||
--module-path "${JAVA_HOME}/jmods:openjfx-jmods" \
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net,java.compiler \
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net \
|
||||
--strip-native-commands \
|
||||
--no-header-files \
|
||||
--no-man-pages \
|
||||
|
||||
Vendored
+1
-2
@@ -28,7 +28,7 @@ override_dh_auto_build:
|
||||
$(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.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net,java.compiler \
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net \
|
||||
--strip-native-commands \
|
||||
--no-header-files \
|
||||
--no-man-pages \
|
||||
@@ -61,7 +61,6 @@ override_dh_auto_build:
|
||||
--java-options "-Dcryptomator.buildNumber=\"deb-${REVISION_NUM}\"" \
|
||||
--java-options "-Dcryptomator.appVersion=\"${SEMVER_STR}\"" \
|
||||
--java-options "-Dcryptomator.disableUpdateCheck=\"${DISABLE_UPDATE_CHECK}\"" \
|
||||
--java-options "-Dcryptomator.integrationsLinux.autoStartCmd=\"cryptomator\"" \
|
||||
--app-version "${VERSION_NUM}.${REVISION_NUM}" \
|
||||
--resource-dir resources \
|
||||
--verbose
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
embedded.provisionprofile
|
||||
Vendored
-8
@@ -2,10 +2,6 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.application-identifier</key>
|
||||
<string>###APP_IDENTIFIER_PREFIX###org.cryptomator</string>
|
||||
<key>com.apple.developer.team-identifier</key>
|
||||
<string>###TEAM_IDENTIFIER###</string>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||
@@ -14,9 +10,5 @@
|
||||
<true/>
|
||||
<key>com.apple.security.cs.disable-library-validation</key>
|
||||
<true/>
|
||||
<key>keychain-access-groups</key>
|
||||
<array>
|
||||
<string>###APP_IDENTIFIER_PREFIX###org.cryptomator</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -5,5 +5,4 @@ dmg/
|
||||
*.dmg
|
||||
license.rtf
|
||||
openjfx-jmods.zip
|
||||
*.jmod
|
||||
Cryptomator.entitlements
|
||||
*.jmod
|
||||
Vendored
+9
-20
@@ -1,15 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
# parse options
|
||||
usage() { echo "Usage: $0 [-s <codesign-identity>] [-t <team-identifier>]" 1>&2; exit 1; }
|
||||
while getopts ":s:t:" o; do
|
||||
usage() { echo "Usage: $0 [-s <codesign-identity>]" 1>&2; exit 1; }
|
||||
while getopts ":s:" o; do
|
||||
case "${o}" in
|
||||
s)
|
||||
CODESIGN_IDENTITY=${OPTARG}
|
||||
;;
|
||||
t)
|
||||
TEAM_IDENTIFIER=${OPTARG}
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
@@ -32,15 +29,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=22.0.2
|
||||
JAVAFX_VERISON=22.0.1
|
||||
JAVAFX_ARCH="undefined"
|
||||
JAVAFX_JMODS_SHA256="undefined"
|
||||
if [ "$(machine)" = "arm64e" ]; then
|
||||
JAVAFX_ARCH="aarch64"
|
||||
JAVAFX_JMODS_SHA256="813c6748f7c99cb7a579d48b48a087b4682b1fad1fc1a4fe5f9b21cf872b15a7"
|
||||
JAVAFX_JMODS_SHA256="572fce94b9b09d316b960a49e3c2b5d35231ed0463e3b1c4020b8de89783b51d"
|
||||
else
|
||||
JAVAFX_ARCH="x64"
|
||||
JAVAFX_JMODS_SHA256="115cb08bb59d880cfff6e51e0bf0dcc45785ed9d456b8b8425597b04da6ab3d4"
|
||||
JAVAFX_JMODS_SHA256="e07a11c112abbdebe7c058b44c151e1e475de748671d896aef3d73f32453c248"
|
||||
fi
|
||||
JAVAFX_JMODS_URL="https://download2.gluonhq.com/openjfx/${JAVAFX_VERSION}/openjfx-${JAVAFX_VERSION}_osx-${JAVAFX_ARCH}_bin-jmods.zip"
|
||||
|
||||
@@ -55,7 +52,7 @@ fi
|
||||
|
||||
# download and check jmods
|
||||
curl -L ${JAVAFX_JMODS_URL} -o openjfx-jmods.zip
|
||||
echo "${JAVAFX_JMODS_SHA256} openjfx-jmods.zip" | shasum -a256 --check
|
||||
echo "${JAVAFX_JMODS_SHA256} 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
|
||||
JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1)
|
||||
@@ -79,7 +76,7 @@ cp ../../../target/${MAIN_JAR_GLOB} ../../../target/mods
|
||||
${JAVA_HOME}/bin/jlink \
|
||||
--output runtime \
|
||||
--module-path "${JAVA_HOME}/jmods:openjfx-jmods" \
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,java.compiler \
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr \
|
||||
--strip-native-commands \
|
||||
--no-header-files \
|
||||
--no-man-pages \
|
||||
@@ -124,7 +121,6 @@ ${JAVA_HOME}/bin/jpackage \
|
||||
cp ../resources/${APP_NAME}-Vault.icns ${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/
|
||||
|
||||
# generate license
|
||||
mvn -B -Djavafx.platform=mac -f../../../pom.xml license:add-third-party \
|
||||
@@ -137,11 +133,7 @@ mvn -B -Djavafx.platform=mac -f../../../pom.xml license:add-third-party \
|
||||
-Dlicense.licenseMergesUrl=file://$(pwd)/../../../license/merges
|
||||
|
||||
# codesign
|
||||
if [ -n "${CODESIGN_IDENTITY}" ] && [ -n "${TEAM_IDENTIFIER}" ]; then
|
||||
echo "Codesigning jdk files..."
|
||||
find ${APP_NAME}.app/Contents/runtime/Contents/Home/lib/ -name '*.dylib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \;
|
||||
find ${APP_NAME}.app/Contents/runtime/Contents/Home/lib/ -name 'jspawnhelper' -exec codesign --force -o runtime -s ${CODESIGN_IDENTITY} {} \;
|
||||
echo "Codesigning jar contents..."
|
||||
if [ -n "${CODESIGN_IDENTITY}" ]; then
|
||||
find ${APP_NAME}.app/Contents/runtime/Contents/MacOS -name '*.dylib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \;
|
||||
for JAR_PATH in `find ${APP_NAME}.app -name "*.jar"`; do
|
||||
if [[ `unzip -l ${JAR_PATH} | grep '.dylib\|.jnilib'` ]]; then
|
||||
@@ -159,10 +151,7 @@ if [ -n "${CODESIGN_IDENTITY}" ] && [ -n "${TEAM_IDENTIFIER}" ]; then
|
||||
fi
|
||||
done
|
||||
echo "Codesigning ${APP_NAME}.app..."
|
||||
cp ../${APP_NAME}.entitlements .
|
||||
sed -i '' "s|###APP_IDENTIFIER_PREFIX###|${TEAM_IDENTIFIER}.|g" ${APP_NAME}.entitlements
|
||||
sed -i '' "s|###TEAM_IDENTIFIER###|${TEAM_IDENTIFIER}|g" ${APP_NAME}.entitlements
|
||||
codesign --force --deep --entitlements ${APP_NAME}.entitlements -o runtime -s ${CODESIGN_IDENTITY} ${APP_NAME}.app
|
||||
codesign --force --deep --entitlements ../${APP_NAME}.entitlements -o runtime -s ${CODESIGN_IDENTITY} ${APP_NAME}.app
|
||||
fi
|
||||
|
||||
# prepare dmg contents
|
||||
|
||||
Vendored
+7
-7
@@ -41,7 +41,7 @@ Write-Output "`$Env:JAVA_HOME=$Env:JAVA_HOME"
|
||||
$copyright = "(C) $CopyrightStartYear - $((Get-Date).Year) $Vendor"
|
||||
|
||||
# compile
|
||||
&mvn -B -f $buildDir/../../pom.xml clean package -DskipTests -Pwin "-Djavafx.platform=win"
|
||||
&mvn -B -f $buildDir/../../pom.xml clean package -DskipTests -Pwin -Djavafx.platform=win
|
||||
Copy-Item "$buildDir\..\..\target\$MainJarGlob.jar" -Destination "$buildDir\..\..\target\mods"
|
||||
|
||||
# add runtime
|
||||
@@ -51,9 +51,9 @@ if ($clean -and (Test-Path -Path $runtimeImagePath)) {
|
||||
}
|
||||
|
||||
## download jfx jmods
|
||||
$javaFxVersion='22.0.2'
|
||||
$javaFxVersion='22.0.1'
|
||||
$javaFxJmodsUrl = "https://download2.gluonhq.com/openjfx/${javaFxVersion}/openjfx-${javaFxVersion}_windows-x64_bin-jmods.zip"
|
||||
$javaFxJmodsSHA256 = 'f9376d200f5c5b85327d575c1ec1482e6455f19916577f7e2fc9be2f48bb29b6'
|
||||
$javaFxJmodsSHA256 = 'de82e53179032a49bec005deb4438e8f261d08c4b58864a5c17e1d87286b09dd'
|
||||
$javaFxJmods = '.\resources\jfxJmods.zip'
|
||||
if( !(Test-Path -Path $javaFxJmods) ) {
|
||||
Write-Output "Downloading ${javaFxJmodsUrl}..."
|
||||
@@ -75,7 +75,7 @@ Move-Item -Force -Path ".\resources\javafx-jmods-*" -Destination ".\resources\ja
|
||||
--verbose `
|
||||
--output runtime `
|
||||
--module-path "$Env:JAVA_HOME/jmods;$buildDir/resources/javafx-jmods" `
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,jdk.unsupported,jdk.accessibility,jdk.management.jfr,java.compiler,javafx.base,javafx.graphics,javafx.controls,javafx.fxml `
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,jdk.unsupported,jdk.accessibility,jdk.management.jfr,javafx.base,javafx.graphics,javafx.controls,javafx.fxml `
|
||||
--strip-native-commands `
|
||||
--no-header-files `
|
||||
--no-man-pages `
|
||||
@@ -100,7 +100,7 @@ if ($clean -and (Test-Path -Path $appPath)) {
|
||||
--vendor $Vendor `
|
||||
--copyright $copyright `
|
||||
--java-options "--enable-preview" `
|
||||
--java-options "--enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win" `
|
||||
--java-options "--enable-native-access=org.cryptomator.jfuse.win" `
|
||||
--java-options "-Xss5m" `
|
||||
--java-options "-Xmx256m" `
|
||||
--java-options "-Dcryptomator.appVersion=`"$semVerNo`"" `
|
||||
@@ -122,7 +122,7 @@ if ($clean -and (Test-Path -Path $appPath)) {
|
||||
--icon resources/$AppName.ico
|
||||
|
||||
#Create RTF license for msi
|
||||
&mvn -B -f $buildDir/../../pom.xml license:add-third-party "-Djavafx.platform=win" `
|
||||
&mvn -B -f $buildDir/../../pom.xml license:add-third-party -Djavafx.platform=win `
|
||||
"-Dlicense.thirdPartyFilename=license.rtf" `
|
||||
"-Dlicense.fileTemplate=$buildDir\resources\licenseTemplate.ftl" `
|
||||
"-Dlicense.outputDirectory=$buildDir\resources\" `
|
||||
@@ -167,7 +167,7 @@ $Env:JP_WIXHELPER_DIR = "."
|
||||
--file-associations resources/FAvaultFile.properties
|
||||
|
||||
#Create RTF license for bundle
|
||||
&mvn -B -f $buildDir/../../pom.xml license:add-third-party "-Djavafx.platform=win" `
|
||||
&mvn -B -f $buildDir/../../pom.xml license:add-third-party -Djavafx.platform=win `
|
||||
"-Dlicense.thirdPartyFilename=license.rtf" `
|
||||
"-Dlicense.fileTemplate=$buildDir\bundle\resources\licenseTemplate.ftl" `
|
||||
"-Dlicense.outputDirectory=$buildDir\bundle\resources\" `
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>cryptomator</artifactId>
|
||||
<version>1.14.0</version>
|
||||
<version>1.13.0</version>
|
||||
<name>Cryptomator Desktop App</name>
|
||||
|
||||
<organization>
|
||||
@@ -33,44 +33,44 @@
|
||||
<nonModularGroupIds>org.ow2.asm,org.apache.jackrabbit,org.apache.httpcomponents</nonModularGroupIds>
|
||||
|
||||
<!-- cryptomator dependencies -->
|
||||
<cryptomator.cryptofs.version>2.7.0-beta1</cryptomator.cryptofs.version>
|
||||
<cryptomator.integrations.version>1.4.0-beta2</cryptomator.integrations.version>
|
||||
<cryptomator.integrations.win.version>1.3.0-beta1</cryptomator.integrations.win.version> <!-- TODO update to 1.3.0 once released -->
|
||||
<cryptomator.cryptofs.version>2.6.9</cryptomator.cryptofs.version>
|
||||
<cryptomator.integrations.version>1.3.1</cryptomator.integrations.version>
|
||||
<cryptomator.integrations.win.version>1.2.5</cryptomator.integrations.win.version>
|
||||
<cryptomator.integrations.mac.version>1.2.4</cryptomator.integrations.mac.version>
|
||||
<cryptomator.integrations.linux.version>1.5.0-beta4</cryptomator.integrations.linux.version> <!-- TODO update to 1.5.0 once released -->
|
||||
<cryptomator.integrations.linux.version>1.4.5</cryptomator.integrations.linux.version>
|
||||
<cryptomator.fuse.version>5.0.0</cryptomator.fuse.version>
|
||||
<cryptomator.webdav.version>2.0.6</cryptomator.webdav.version>
|
||||
|
||||
<!-- 3rd party dependencies -->
|
||||
<commons-lang3.version>3.16.0</commons-lang3.version>
|
||||
<commons-lang3.version>3.14.0</commons-lang3.version>
|
||||
<dagger.version>2.51.1</dagger.version>
|
||||
<easybind.version>2.2</easybind.version>
|
||||
<guava.version>33.3.0-jre</guava.version>
|
||||
<jackson.version>2.17.2</jackson.version>
|
||||
<javafx.version>22.0.2</javafx.version>
|
||||
<guava.version>33.2.1-jre</guava.version>
|
||||
<jackson.version>2.17.1</jackson.version>
|
||||
<javafx.version>22.0.1</javafx.version>
|
||||
<jwt.version>4.4.0</jwt.version>
|
||||
<nimbus-jose.version>9.37.3</nimbus-jose.version>
|
||||
<logback.version>1.5.7</logback.version>
|
||||
<slf4j.version>2.0.16</slf4j.version>
|
||||
<logback.version>1.5.6</logback.version>
|
||||
<slf4j.version>2.0.13</slf4j.version>
|
||||
<tinyoauth2.version>0.8.0</tinyoauth2.version>
|
||||
<zxcvbn.version>1.9.0</zxcvbn.version>
|
||||
|
||||
<!-- test dependencies -->
|
||||
<junit.jupiter.version>5.11.0</junit.jupiter.version>
|
||||
<junit.jupiter.version>5.10.2</junit.jupiter.version>
|
||||
<mockito.version>5.12.0</mockito.version>
|
||||
<hamcrest.version>3.0</hamcrest.version>
|
||||
<hamcrest.version>2.2</hamcrest.version>
|
||||
|
||||
<!-- build-time dependencies -->
|
||||
<jetbrains.annotations.version>24.1.0</jetbrains.annotations.version>
|
||||
<dependency-check.version>10.0.3</dependency-check.version>
|
||||
<dependency-check.version>9.2.0</dependency-check.version>
|
||||
<jacoco.version>0.8.12</jacoco.version>
|
||||
<license-generator.version>2.4.0</license-generator.version>
|
||||
<junit-tree-reporter.version>1.3.0</junit-tree-reporter.version>
|
||||
<junit-tree-reporter.version>1.2.1</junit-tree-reporter.version>
|
||||
<mvn-compiler.version>3.13.0</mvn-compiler.version>
|
||||
<mvn-resources.version>3.3.1</mvn-resources.version>
|
||||
<mvn-dependency.version>3.7.1</mvn-dependency.version>
|
||||
<mvn-surefire.version>3.4.0</mvn-surefire.version>
|
||||
<mvn-jar.version>3.4.2</mvn-jar.version>
|
||||
<mvn-dependency.version>3.7.0</mvn-dependency.version>
|
||||
<mvn-surefire.version>3.3.0</mvn-surefire.version>
|
||||
<mvn-jar.version>3.4.1</mvn-jar.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
@@ -471,7 +471,7 @@
|
||||
<skipTestScope>true</skipTestScope>
|
||||
<detail>true</detail>
|
||||
<suppressionFile>suppression.xml</suppressionFile>
|
||||
<nvdApiKeyEnvironmentVariable>NVD_API_KEY</nvdApiKeyEnvironmentVariable>
|
||||
<nvdApiKey>${env.NVD_API_KEY}</nvdApiKey>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
|
||||
@@ -42,7 +42,6 @@ open module org.cryptomator.desktop {
|
||||
requires com.nulabinc.zxcvbn;
|
||||
requires com.tobiasdiez.easybind;
|
||||
requires dagger;
|
||||
requires java.compiler;
|
||||
requires io.github.coffeelibs.tinyoauth2client;
|
||||
requires org.slf4j;
|
||||
requires org.apache.commons.lang3;
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
package org.cryptomator.common.settings;
|
||||
|
||||
import javafx.beans.Observable;
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.IntegerProperty;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.SimpleBooleanProperty;
|
||||
import javafx.beans.property.SimpleIntegerProperty;
|
||||
import javafx.beans.property.SimpleObjectProperty;
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
|
||||
public class NetworkSettings {
|
||||
|
||||
public final ObjectProperty<ProxyMode> mode;
|
||||
public final StringProperty httpProxy;
|
||||
public final IntegerProperty httpPort;
|
||||
public final BooleanProperty samePortProxyForHttpHttps;
|
||||
public final StringProperty httpsProxy;
|
||||
public final IntegerProperty httpsPort;
|
||||
|
||||
NetworkSettings(NetworkSettingsJson json){
|
||||
this.mode = new SimpleObjectProperty<>(this, "mode", json.mode);
|
||||
this.httpProxy = new SimpleStringProperty(this, "httpProxy", json.httpProxy);
|
||||
this.httpPort = new SimpleIntegerProperty(this, "httpPort", json.httpPort);
|
||||
this.samePortProxyForHttpHttps = new SimpleBooleanProperty(this, "samePortProxyForHttpHttps", json.samePortProxyForHttpHttps);
|
||||
this.httpsProxy = new SimpleStringProperty(this, "httpsProxy", json.httpsProxy);
|
||||
this.httpsPort = new SimpleIntegerProperty(this, "httpsPort", json.httpsPort);
|
||||
}
|
||||
|
||||
NetworkSettingsJson serialized(){
|
||||
var json = new NetworkSettingsJson();
|
||||
json.mode = mode.get();
|
||||
json.httpProxy = httpProxy.get();
|
||||
json.httpPort = httpPort.get();
|
||||
json.samePortProxyForHttpHttps = samePortProxyForHttpHttps.get();
|
||||
json.httpsProxy = httpsProxy.get();
|
||||
json.httpsPort = httpsPort.get();
|
||||
return json;
|
||||
}
|
||||
|
||||
Observable[] observables() {
|
||||
return new Observable[]{mode, httpProxy, httpPort,httpsProxy,httpsPort};
|
||||
}
|
||||
|
||||
public enum ProxyMode {
|
||||
NO,
|
||||
SYSTEM,
|
||||
MANUAL
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package org.cryptomator.common.settings;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
class NetworkSettingsJson {
|
||||
|
||||
@JsonProperty("mode")
|
||||
NetworkSettings.ProxyMode mode = NetworkSettings.ProxyMode.NO;
|
||||
|
||||
@JsonProperty("httpProxy")
|
||||
String httpProxy;
|
||||
|
||||
@JsonProperty("httpPort")
|
||||
int httpPort;
|
||||
|
||||
@JsonProperty("samePortProxyForHttpHttps")
|
||||
boolean samePortProxyForHttpHttps;
|
||||
|
||||
@JsonProperty(value = "httpsProxy")
|
||||
String httpsProxy;
|
||||
|
||||
@JsonProperty("httpsPort")
|
||||
int httpsPort;
|
||||
|
||||
}
|
||||
@@ -37,22 +37,17 @@ public class Settings {
|
||||
static final boolean DEFAULT_START_HIDDEN = false;
|
||||
static final boolean DEFAULT_AUTO_CLOSE_VAULTS = false;
|
||||
static final boolean DEFAULT_USE_KEYCHAIN = true;
|
||||
static final boolean DEFAULT_USE_QUICKACCESS = true;
|
||||
static final int DEFAULT_PORT = 42427;
|
||||
static final int DEFAULT_NUM_TRAY_NOTIFICATIONS = 3;
|
||||
static final boolean DEFAULT_DEBUG_MODE = false;
|
||||
static final UiTheme DEFAULT_THEME = UiTheme.LIGHT;
|
||||
@Deprecated // to be changed to "whatever is available" eventually
|
||||
static final String DEFAULT_KEYCHAIN_PROVIDER = SystemUtils.IS_OS_WINDOWS ? "org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess" : //
|
||||
SystemUtils.IS_OS_MAC ? "org.cryptomator.macos.keychain.MacSystemKeychainAccess" : //
|
||||
"org.cryptomator.linux.keychain.SecretServiceKeychainAccess";
|
||||
static final String DEFAULT_QUICKACCESS_SERVICE = SystemUtils.IS_OS_WINDOWS ? "org.cryptomator.windows.quickaccess.ExplorerQuickAccessService" : //
|
||||
SystemUtils.IS_OS_LINUX ? "org.cryptomator.linux.quickaccess.NautilusBookmarks" : null;
|
||||
|
||||
static final String DEFAULT_KEYCHAIN_PROVIDER = SystemUtils.IS_OS_WINDOWS ? "org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess" : SystemUtils.IS_OS_MAC ? "org.cryptomator.macos.keychain.MacSystemKeychainAccess" : "org.cryptomator.linux.keychain.SecretServiceKeychainAccess";
|
||||
static final String DEFAULT_USER_INTERFACE_ORIENTATION = NodeOrientation.LEFT_TO_RIGHT.name();
|
||||
static final boolean DEFAULT_SHOW_MINIMIZE_BUTTON = false;
|
||||
public static final Instant DEFAULT_TIMESTAMP = Instant.parse("2000-01-01T00:00:00Z");
|
||||
public final ObservableList<VaultSettings> directories;
|
||||
public final ObjectProperty<NetworkSettings> networkSettings;
|
||||
public final BooleanProperty askedForUpdateCheck;
|
||||
public final BooleanProperty checkForUpdates;
|
||||
public final BooleanProperty startHidden;
|
||||
@@ -63,8 +58,6 @@ public class Settings {
|
||||
public final BooleanProperty debugMode;
|
||||
public final ObjectProperty<UiTheme> theme;
|
||||
public final StringProperty keychainProvider;
|
||||
public final BooleanProperty useQuickAccess;
|
||||
public final StringProperty quickAccessService;
|
||||
public final ObjectProperty<NodeOrientation> userInterfaceOrientation;
|
||||
public final StringProperty licenseKey;
|
||||
public final BooleanProperty showMinimizeButton;
|
||||
@@ -92,12 +85,12 @@ public class Settings {
|
||||
*/
|
||||
Settings(SettingsJson json) {
|
||||
this.directories = FXCollections.observableArrayList(VaultSettings::observables);
|
||||
this.networkSettings = new SimpleObjectProperty<>(this, "networkSettings", new NetworkSettings(json.networkSettings));
|
||||
this.askedForUpdateCheck = new SimpleBooleanProperty(this, "askedForUpdateCheck", json.askedForUpdateCheck);
|
||||
this.checkForUpdates = new SimpleBooleanProperty(this, "checkForUpdates", json.checkForUpdatesEnabled);
|
||||
this.startHidden = new SimpleBooleanProperty(this, "startHidden", json.startHidden);
|
||||
this.autoCloseVaults = new SimpleBooleanProperty(this, "autoCloseVaults", json.autoCloseVaults);
|
||||
this.useKeychain = new SimpleBooleanProperty(this, "useKeychain", json.useKeychain);
|
||||
this.useQuickAccess = new SimpleBooleanProperty(this, "addToQuickAccess", json.useQuickAccess);
|
||||
this.port = new SimpleIntegerProperty(this, "webDavPort", json.port);
|
||||
this.numTrayNotifications = new SimpleIntegerProperty(this, "numTrayNotifications", json.numTrayNotifications);
|
||||
this.debugMode = new SimpleBooleanProperty(this, "debugMode", json.debugMode);
|
||||
@@ -113,7 +106,6 @@ public class Settings {
|
||||
this.windowHeight = new SimpleIntegerProperty(this, "windowHeight", json.windowHeight);
|
||||
this.language = new SimpleStringProperty(this, "language", json.language);
|
||||
this.mountService = new SimpleStringProperty(this, "mountService", json.mountService);
|
||||
this.quickAccessService = new SimpleStringProperty(this, "quickAccessService", json.quickAccessService);
|
||||
this.lastSuccessfulUpdateCheck = new SimpleObjectProperty<>(this, "lastSuccessfulUpdateCheck", json.lastSuccessfulUpdateCheck);
|
||||
|
||||
this.directories.addAll(json.directories.stream().map(VaultSettings::new).toList());
|
||||
@@ -121,12 +113,17 @@ public class Settings {
|
||||
migrateLegacySettings(json);
|
||||
|
||||
directories.addListener(this::somethingChanged);
|
||||
networkSettings.get().mode.addListener(this::somethingChanged);
|
||||
networkSettings.get().httpProxy.addListener(this::somethingChanged);
|
||||
networkSettings.get().httpPort.addListener(this::somethingChanged);
|
||||
networkSettings.get().samePortProxyForHttpHttps.addListener(this::somethingChanged);
|
||||
networkSettings.get().httpsProxy.addListener(this::somethingChanged);
|
||||
networkSettings.get().httpsPort.addListener(this::somethingChanged);
|
||||
askedForUpdateCheck.addListener(this::somethingChanged);
|
||||
checkForUpdates.addListener(this::somethingChanged);
|
||||
startHidden.addListener(this::somethingChanged);
|
||||
autoCloseVaults.addListener(this::somethingChanged);
|
||||
useKeychain.addListener(this::somethingChanged);
|
||||
useQuickAccess.addListener(this::somethingChanged);
|
||||
port.addListener(this::somethingChanged);
|
||||
numTrayNotifications.addListener(this::somethingChanged);
|
||||
debugMode.addListener(this::somethingChanged);
|
||||
@@ -142,7 +139,6 @@ public class Settings {
|
||||
windowHeight.addListener(this::somethingChanged);
|
||||
language.addListener(this::somethingChanged);
|
||||
mountService.addListener(this::somethingChanged);
|
||||
quickAccessService.addListener(this::somethingChanged);
|
||||
lastSuccessfulUpdateCheck.addListener(this::somethingChanged);
|
||||
}
|
||||
|
||||
@@ -177,12 +173,12 @@ public class Settings {
|
||||
SettingsJson serialized() {
|
||||
var json = new SettingsJson();
|
||||
json.directories = directories.stream().map(VaultSettings::serialized).toList();
|
||||
json.networkSettings = networkSettings.get().serialized();
|
||||
json.askedForUpdateCheck = askedForUpdateCheck.get();
|
||||
json.checkForUpdatesEnabled = checkForUpdates.get();
|
||||
json.startHidden = startHidden.get();
|
||||
json.autoCloseVaults = autoCloseVaults.get();
|
||||
json.useKeychain = useKeychain.get();
|
||||
json.useQuickAccess = useQuickAccess.get();
|
||||
json.port = port.get();
|
||||
json.numTrayNotifications = numTrayNotifications.get();
|
||||
json.debugMode = debugMode.get();
|
||||
@@ -198,7 +194,6 @@ public class Settings {
|
||||
json.windowHeight = windowHeight.get();
|
||||
json.language = language.get();
|
||||
json.mountService = mountService.get();
|
||||
json.quickAccessService = quickAccessService.get();
|
||||
json.lastSuccessfulUpdateCheck = lastSuccessfulUpdateCheck.get();
|
||||
return json;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,9 @@ class SettingsJson {
|
||||
@JsonProperty("directories")
|
||||
List<VaultSettingsJson> directories = List.of();
|
||||
|
||||
@JsonProperty("networkSettings")
|
||||
NetworkSettingsJson networkSettings = new NetworkSettingsJson();
|
||||
|
||||
@JsonProperty("writtenByVersion")
|
||||
String writtenByVersion;
|
||||
|
||||
@@ -86,9 +89,4 @@ class SettingsJson {
|
||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'", timezone = "UTC")
|
||||
Instant lastSuccessfulUpdateCheck = Settings.DEFAULT_TIMESTAMP;
|
||||
|
||||
@JsonProperty("useQuickAccess")
|
||||
boolean useQuickAccess = Settings.DEFAULT_USE_QUICKACCESS;
|
||||
|
||||
@JsonProperty("quickAccessService")
|
||||
String quickAccessService = Settings.DEFAULT_QUICKACCESS_SERVICE;
|
||||
}
|
||||
|
||||
@@ -58,10 +58,7 @@ public class SettingsProvider implements Supplier<Settings> {
|
||||
}
|
||||
|
||||
private Settings load() {
|
||||
Settings settings = env.getSettingsPath() //
|
||||
.flatMap(this::tryLoad) //
|
||||
.findFirst() //
|
||||
.orElseGet(() -> Settings.create(env));
|
||||
Settings settings = env.getSettingsPath().flatMap(this::tryLoad).findFirst().orElseGet(() -> Settings.create(env));
|
||||
settings.setSaveCmd(this::scheduleSave);
|
||||
return settings;
|
||||
}
|
||||
|
||||
@@ -11,7 +11,6 @@ package org.cryptomator.common.vaults;
|
||||
import org.apache.commons.lang3.SystemUtils;
|
||||
import org.cryptomator.common.Constants;
|
||||
import org.cryptomator.common.mount.Mounter;
|
||||
import org.cryptomator.common.settings.Settings;
|
||||
import org.cryptomator.common.settings.VaultSettings;
|
||||
import org.cryptomator.cryptofs.CryptoFileSystem;
|
||||
import org.cryptomator.cryptofs.CryptoFileSystemProperties;
|
||||
@@ -24,9 +23,6 @@ import org.cryptomator.cryptolib.api.MasterkeyLoadingFailedException;
|
||||
import org.cryptomator.integrations.mount.MountFailedException;
|
||||
import org.cryptomator.integrations.mount.Mountpoint;
|
||||
import org.cryptomator.integrations.mount.UnmountFailedException;
|
||||
import org.cryptomator.integrations.quickaccess.QuickAccessService;
|
||||
import org.cryptomator.integrations.quickaccess.QuickAccessServiceException;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@@ -58,7 +54,6 @@ public class Vault {
|
||||
|
||||
private final VaultSettings vaultSettings;
|
||||
private final AtomicReference<CryptoFileSystem> cryptoFileSystem;
|
||||
private final AtomicReference<QuickAccessService.QuickAccessEntry> quickAccessEntry;
|
||||
private final VaultState state;
|
||||
private final ObjectProperty<Exception> lastKnownException;
|
||||
private final VaultConfigCache configCache;
|
||||
@@ -72,7 +67,6 @@ public class Vault {
|
||||
private final BooleanBinding unknownError;
|
||||
private final ObjectBinding<Mountpoint> mountPoint;
|
||||
private final Mounter mounter;
|
||||
private final Settings settings;
|
||||
private final BooleanProperty showingStats;
|
||||
|
||||
private final AtomicReference<Mounter.MountHandle> mountHandle = new AtomicReference<>(null);
|
||||
@@ -84,7 +78,7 @@ public class Vault {
|
||||
VaultState state, //
|
||||
@Named("lastKnownException") ObjectProperty<Exception> lastKnownException, //
|
||||
VaultStats stats, //
|
||||
Mounter mounter, Settings settings) {
|
||||
Mounter mounter) {
|
||||
this.vaultSettings = vaultSettings;
|
||||
this.configCache = configCache;
|
||||
this.cryptoFileSystem = cryptoFileSystem;
|
||||
@@ -100,9 +94,7 @@ public class Vault {
|
||||
this.unknownError = Bindings.createBooleanBinding(this::isUnknownError, state);
|
||||
this.mountPoint = Bindings.createObjectBinding(this::getMountPoint, state);
|
||||
this.mounter = mounter;
|
||||
this.settings = settings;
|
||||
this.showingStats = new SimpleBooleanProperty(false);
|
||||
this.quickAccessEntry = new AtomicReference<>(null);
|
||||
}
|
||||
|
||||
// ******************************************************************************
|
||||
@@ -162,9 +154,6 @@ public class Vault {
|
||||
var rootPath = fs.getRootDirectories().iterator().next();
|
||||
var mountHandle = mounter.mount(vaultSettings, rootPath);
|
||||
success = this.mountHandle.compareAndSet(null, mountHandle);
|
||||
if (settings.useQuickAccess.getValue()) {
|
||||
addToQuickAccess();
|
||||
}
|
||||
} finally {
|
||||
if (!success) {
|
||||
destroyCryptoFileSystem();
|
||||
@@ -189,7 +178,6 @@ public class Vault {
|
||||
mountHandle.mountObj().close();
|
||||
mountHandle.specialCleanup().run();
|
||||
} finally {
|
||||
removeFromQuickAccess();
|
||||
destroyCryptoFileSystem();
|
||||
}
|
||||
|
||||
@@ -197,52 +185,6 @@ public class Vault {
|
||||
LOG.info("Locked vault '{}'", getDisplayName());
|
||||
}
|
||||
|
||||
private synchronized void addToQuickAccess() {
|
||||
if (quickAccessEntry.get() != null) {
|
||||
//we don't throw an exception since we don't wanna block unlocking
|
||||
LOG.warn("Vault already added to quick access area. Will be removed on next lock operation.");
|
||||
return;
|
||||
}
|
||||
|
||||
QuickAccessService.get() //
|
||||
.filter(s -> s.getClass().getName().equals(settings.quickAccessService.getValue())) //
|
||||
.findFirst() //
|
||||
.ifPresentOrElse( //
|
||||
this::addToQuickAccessInternal, //
|
||||
() -> LOG.warn("Unable to add Vault to quick access area: Desired implementation not available.") //
|
||||
);
|
||||
}
|
||||
|
||||
private void addToQuickAccessInternal(@NotNull QuickAccessService s) {
|
||||
if (getMountPoint() instanceof Mountpoint.WithPath mp) {
|
||||
try {
|
||||
var entry = s.add(mp.path(), getDisplayName());
|
||||
quickAccessEntry.set(entry);
|
||||
} catch (QuickAccessServiceException e) {
|
||||
LOG.error("Adding vault to quick access area failed", e);
|
||||
}
|
||||
} else {
|
||||
LOG.warn("Unable to add vault to quick access area: Vault is not mounted to local system path.");
|
||||
}
|
||||
}
|
||||
|
||||
private synchronized void removeFromQuickAccess() {
|
||||
if (quickAccessEntry.get() == null) {
|
||||
LOG.debug("Removing vault from quick access area: Entry not found, nothing to do.");
|
||||
return;
|
||||
}
|
||||
removeFromQuickAccessInternal();
|
||||
}
|
||||
|
||||
private void removeFromQuickAccessInternal() {
|
||||
try {
|
||||
quickAccessEntry.get().remove();
|
||||
quickAccessEntry.set(null);
|
||||
} catch (QuickAccessServiceException e) {
|
||||
LOG.error("Removing vault from quick access area failed", e);
|
||||
}
|
||||
}
|
||||
|
||||
// ******************************************************************************
|
||||
// Observable Properties
|
||||
// *******************************************************************************
|
||||
|
||||
@@ -8,13 +8,11 @@
|
||||
*******************************************************************************/
|
||||
package org.cryptomator.common.vaults;
|
||||
|
||||
import org.apache.commons.lang3.SystemUtils;
|
||||
import org.cryptomator.common.settings.Settings;
|
||||
import org.cryptomator.common.settings.VaultSettings;
|
||||
import org.cryptomator.cryptofs.CryptoFileSystemProvider;
|
||||
import org.cryptomator.cryptofs.DirStructure;
|
||||
import org.cryptomator.cryptofs.migration.Migrators;
|
||||
import org.cryptomator.integrations.mount.MountService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@@ -26,7 +24,6 @@ import java.nio.file.Files;
|
||||
import java.nio.file.NoSuchFileException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
@@ -41,21 +38,14 @@ public class VaultListManager {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(VaultListManager.class);
|
||||
|
||||
private final AutoLocker autoLocker;
|
||||
private final List<MountService> mountServices;
|
||||
private final VaultComponent.Factory vaultComponentFactory;
|
||||
private final ObservableList<Vault> vaultList;
|
||||
private final String defaultVaultName;
|
||||
|
||||
@Inject
|
||||
public VaultListManager(ObservableList<Vault> vaultList, //
|
||||
AutoLocker autoLocker, //
|
||||
List<MountService> mountServices,
|
||||
VaultComponent.Factory vaultComponentFactory,
|
||||
ResourceBundle resourceBundle,
|
||||
Settings settings) {
|
||||
public VaultListManager(ObservableList<Vault> vaultList, AutoLocker autoLocker, VaultComponent.Factory vaultComponentFactory, ResourceBundle resourceBundle, Settings settings) {
|
||||
this.vaultList = vaultList;
|
||||
this.autoLocker = autoLocker;
|
||||
this.mountServices = mountServices;
|
||||
this.vaultComponentFactory = vaultComponentFactory;
|
||||
this.defaultVaultName = resourceBundle.getString("defaults.vault.vaultName");
|
||||
|
||||
@@ -86,15 +76,6 @@ public class VaultListManager {
|
||||
} else {
|
||||
vaultSettings.displayName.set(defaultVaultName);
|
||||
}
|
||||
|
||||
//due to https://github.com/cryptomator/cryptomator/issues/2880#issuecomment-1680313498
|
||||
var nameOfWinfspLocalMounter = "org.cryptomator.frontend.fuse.mount.WinFspMountProvider";
|
||||
if (SystemUtils.IS_OS_WINDOWS //
|
||||
&& vaultSettings.path.get().toString().contains("Dropbox") //
|
||||
&& mountServices.stream().anyMatch(s -> s.getClass().getName().equals(nameOfWinfspLocalMounter))) {
|
||||
vaultSettings.mountService.setValue(nameOfWinfspLocalMounter);
|
||||
}
|
||||
|
||||
return vaultSettings;
|
||||
}
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ public enum FontAwesome5Icon {
|
||||
LOCK("\uF023"), //
|
||||
LOCK_OPEN("\uF3C1"), //
|
||||
MAGIC("\uF0D0"), //
|
||||
NETWORK("\uF6FF"), //
|
||||
PENCIL("\uF303"), //
|
||||
PLUS("\uF067"), //
|
||||
PRINT("\uF02F"), //
|
||||
|
||||
@@ -4,9 +4,7 @@ import org.cryptomator.common.Environment;
|
||||
import org.cryptomator.common.settings.Settings;
|
||||
import org.cryptomator.integrations.autostart.AutoStartProvider;
|
||||
import org.cryptomator.integrations.autostart.ToggleAutoStartFailedException;
|
||||
import org.cryptomator.integrations.common.NamedServiceProvider;
|
||||
import org.cryptomator.integrations.keychain.KeychainAccessProvider;
|
||||
import org.cryptomator.integrations.quickaccess.QuickAccessService;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.fxapp.FxApplicationWindows;
|
||||
import org.slf4j.Logger;
|
||||
@@ -32,15 +30,12 @@ public class GeneralPreferencesController implements FxController {
|
||||
private final Stage window;
|
||||
private final Settings settings;
|
||||
private final Optional<AutoStartProvider> autoStartProvider;
|
||||
private final List<QuickAccessService> quickAccessServices;
|
||||
private final Application application;
|
||||
private final Environment environment;
|
||||
private final List<KeychainAccessProvider> keychainAccessProviders;
|
||||
private final FxApplicationWindows appWindows;
|
||||
public CheckBox useKeychainCheckbox;
|
||||
public ChoiceBox<KeychainAccessProvider> keychainBackendChoiceBox;
|
||||
public CheckBox useQuickAccessCheckbox;
|
||||
public ChoiceBox<QuickAccessService> quickAccessServiceChoiceBox;
|
||||
public CheckBox startHiddenCheckbox;
|
||||
public CheckBox autoCloseVaultsCheckbox;
|
||||
public CheckBox debugModeCheckbox;
|
||||
@@ -53,7 +48,6 @@ public class GeneralPreferencesController implements FxController {
|
||||
this.settings = settings;
|
||||
this.autoStartProvider = autoStartProvider;
|
||||
this.keychainAccessProviders = keychainAccessProviders;
|
||||
this.quickAccessServices = QuickAccessService.get().toList();
|
||||
this.application = application;
|
||||
this.environment = environment;
|
||||
this.appWindows = appWindows;
|
||||
@@ -66,21 +60,13 @@ public class GeneralPreferencesController implements FxController {
|
||||
debugModeCheckbox.selectedProperty().bindBidirectional(settings.debugMode);
|
||||
autoStartProvider.ifPresent(autoStart -> autoStartCheckbox.setSelected(autoStart.isEnabled()));
|
||||
|
||||
var keychainSettingsConverter = new ServiceToSettingsConverter<>(keychainAccessProviders);
|
||||
var keychainSettingsConverter = new KeychainProviderClassNameConverter(keychainAccessProviders);
|
||||
keychainBackendChoiceBox.getItems().addAll(keychainAccessProviders);
|
||||
keychainBackendChoiceBox.setValue(keychainSettingsConverter.fromString(settings.keychainProvider.get()));
|
||||
keychainBackendChoiceBox.setConverter(new KeychainProviderDisplayNameConverter());
|
||||
Bindings.bindBidirectional(settings.keychainProvider, keychainBackendChoiceBox.valueProperty(), keychainSettingsConverter);
|
||||
useKeychainCheckbox.selectedProperty().bindBidirectional(settings.useKeychain);
|
||||
keychainBackendChoiceBox.disableProperty().bind(useKeychainCheckbox.selectedProperty().not());
|
||||
|
||||
useQuickAccessCheckbox.selectedProperty().bindBidirectional(settings.useQuickAccess);
|
||||
var quickAccessSettingsConverter = new ServiceToSettingsConverter<>(quickAccessServices);
|
||||
quickAccessServiceChoiceBox.getItems().addAll(quickAccessServices);
|
||||
quickAccessServiceChoiceBox.setValue(quickAccessSettingsConverter.fromString(settings.quickAccessService.get()));
|
||||
quickAccessServiceChoiceBox.setConverter(new NamedServiceConverter<>());
|
||||
Bindings.bindBidirectional(settings.quickAccessService, quickAccessServiceChoiceBox.valueProperty(), quickAccessSettingsConverter);
|
||||
quickAccessServiceChoiceBox.disableProperty().bind(useQuickAccessCheckbox.selectedProperty().not());
|
||||
}
|
||||
|
||||
public boolean isAutoStartSupported() {
|
||||
@@ -105,10 +91,6 @@ public class GeneralPreferencesController implements FxController {
|
||||
});
|
||||
}
|
||||
|
||||
public boolean isSomeQuickAccessServiceAvailable() {
|
||||
return !quickAccessServices.isEmpty();
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void showLogfileDirectory() {
|
||||
environment.getLogDir().ifPresent(logDirPath -> application.getHostServices().showDocument(logDirPath.toUri().toString()));
|
||||
@@ -134,47 +116,29 @@ public class GeneralPreferencesController implements FxController {
|
||||
|
||||
}
|
||||
|
||||
private static class NamedServiceConverter<T extends NamedServiceProvider> extends StringConverter<T> {
|
||||
private static class KeychainProviderClassNameConverter extends StringConverter<KeychainAccessProvider> {
|
||||
|
||||
private final List<KeychainAccessProvider> keychainAccessProviders;
|
||||
|
||||
public KeychainProviderClassNameConverter(List<KeychainAccessProvider> keychainAccessProviders) {
|
||||
this.keychainAccessProviders = keychainAccessProviders;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(T namedService) {
|
||||
if (namedService == null) {
|
||||
public String toString(KeychainAccessProvider provider) {
|
||||
if (provider == null) {
|
||||
return null;
|
||||
} else {
|
||||
return namedService.getName();
|
||||
return provider.getClass().getName();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public T fromString(String string) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class ServiceToSettingsConverter<T> extends StringConverter<T> {
|
||||
|
||||
private final List<T> services;
|
||||
|
||||
public ServiceToSettingsConverter(List<T> services) {
|
||||
this.services = services;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(T service) {
|
||||
if (service == null) {
|
||||
return null;
|
||||
} else {
|
||||
return service.getClass().getName();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public T fromString(String string) {
|
||||
public KeychainAccessProvider fromString(String string) {
|
||||
if (string == null) {
|
||||
return null;
|
||||
} else {
|
||||
return services.stream().filter(provider -> provider.getClass().getName().equals(string)).findAny().orElse(null);
|
||||
return keychainAccessProviders.stream().filter(provider -> provider.getClass().getName().equals(string)).findAny().orElse(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,159 @@
|
||||
package org.cryptomator.ui.preferences;
|
||||
|
||||
import org.cryptomator.common.settings.NetworkSettings;
|
||||
import org.cryptomator.common.settings.Settings;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.controls.NumericTextField;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.beans.property.IntegerProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.CheckBox;
|
||||
import javafx.scene.control.RadioButton;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.control.ToggleGroup;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.layout.VBox;
|
||||
|
||||
@PreferencesScoped
|
||||
public class NetworkPreferencesController implements FxController {
|
||||
|
||||
private final Settings settings;
|
||||
|
||||
public ToggleGroup proxyToggleGroup;
|
||||
public RadioButton noProxyBtn;
|
||||
public RadioButton systemSettingsBtn;
|
||||
public RadioButton manualProxyBtn;
|
||||
public VBox manualProxyBox;
|
||||
public HBox httpsProxyBox;
|
||||
|
||||
@FXML
|
||||
public TextField httpProxy;
|
||||
public NumericTextField httpPort;
|
||||
public CheckBox samePortProxyForHttpHttps;
|
||||
public TextField httpsProxy;
|
||||
public NumericTextField httpsPort;
|
||||
|
||||
@Inject
|
||||
NetworkPreferencesController(Settings settings) {
|
||||
this.settings = settings;
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void initialize() {
|
||||
|
||||
initializeTextFieldWithValidation(httpProxy, settings.networkSettings.get().httpProxy);
|
||||
initializeTextFieldWithValidation(httpPort, settings.networkSettings.get().httpPort);
|
||||
initializeTextFieldWithValidation(httpsProxy, settings.networkSettings.get().httpsProxy);
|
||||
initializeTextFieldWithValidation(httpsPort, settings.networkSettings.get().httpsPort);
|
||||
|
||||
samePortProxyForHttpHttps.selectedProperty().bindBidirectional(settings.networkSettings.get().samePortProxyForHttpHttps);
|
||||
httpsProxyBox.setDisable(settings.networkSettings.get().samePortProxyForHttpHttps.get());
|
||||
samePortProxyForHttpHttps.selectedProperty().addListener((_, _, newValue) -> {
|
||||
httpsProxyBox.setDisable(newValue);
|
||||
});
|
||||
|
||||
switch (settings.networkSettings.get().mode.get()) {
|
||||
case NO -> {
|
||||
proxyToggleGroup.selectToggle(noProxyBtn);
|
||||
manualProxyBox.setDisable(true);
|
||||
}
|
||||
case SYSTEM -> {
|
||||
proxyToggleGroup.selectToggle(systemSettingsBtn);
|
||||
manualProxyBox.setDisable(true);
|
||||
}
|
||||
case MANUAL -> {
|
||||
proxyToggleGroup.selectToggle(manualProxyBtn);
|
||||
manualProxyBox.setDisable(false);
|
||||
}
|
||||
}
|
||||
|
||||
proxyToggleGroup.selectedToggleProperty().addListener((_, _, newValue) -> {
|
||||
if (newValue != null) {
|
||||
manualProxyBox.setDisable(!newValue.equals(manualProxyBtn));
|
||||
|
||||
if (newValue.equals(noProxyBtn)) {
|
||||
settings.networkSettings.get().mode.set(NetworkSettings.ProxyMode.NO);
|
||||
} else if (newValue.equals(systemSettingsBtn)) {
|
||||
settings.networkSettings.get().mode.set(NetworkSettings.ProxyMode.SYSTEM);
|
||||
} else if (newValue.equals(manualProxyBtn)) {
|
||||
settings.networkSettings.get().mode.set(NetworkSettings.ProxyMode.MANUAL);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private void initializeTextFieldWithValidation(TextField textField, StringProperty property) {
|
||||
textField.setText(property.get());
|
||||
|
||||
textField.textProperty().addListener((_, _, newValue) -> {
|
||||
if (isValidHttpProxy(newValue)) {
|
||||
textField.setStyle("-fx-border-color: green; -fx-border-width: 2px; -fx-border-radius: 3px; -fx-padding: 3px;");
|
||||
} else {
|
||||
textField.setStyle("-fx-border-color: red; -fx-border-width: 2px; -fx-border-radius: 3px; -fx-padding: 3px;");
|
||||
}
|
||||
});
|
||||
|
||||
textField.focusedProperty().addListener((_, oldValue, newValue) -> {
|
||||
if (!newValue) {
|
||||
String text = textField.getText();
|
||||
if (isValidHttpProxy(text)) {
|
||||
property.set(text);
|
||||
textField.setStyle("");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private boolean isValidHttpProxy(String text) {
|
||||
if (text == null || text.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
String regex = "^([\\w.-]+)$";
|
||||
return text.matches(regex);
|
||||
}
|
||||
|
||||
private void initializeTextFieldWithValidation(TextField textField, IntegerProperty property) {
|
||||
textField.setText(String.valueOf(property.get()));
|
||||
|
||||
textField.textProperty().addListener((observable, oldValue, newValue) -> {
|
||||
if (isValidPort(newValue)) {
|
||||
textField.setStyle("-fx-border-color: green; -fx-border-width: 2px; -fx-border-radius: 3px; -fx-padding: 3px;");
|
||||
} else {
|
||||
textField.setStyle("-fx-border-color: red; -fx-border-width: 2px; -fx-border-radius: 3px; -fx-padding: 3px;");
|
||||
}
|
||||
});
|
||||
|
||||
textField.focusedProperty().addListener((_, _, newValue) -> {
|
||||
if (!newValue) {
|
||||
String text = textField.getText();
|
||||
if (isValidPort(text)) {
|
||||
property.set(Integer.parseInt(text));
|
||||
textField.setText(removeLeadingZeros(textField.getText()));
|
||||
textField.setStyle("");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static String removeLeadingZeros(String str) {
|
||||
if (str == null || str.isEmpty()) {
|
||||
return str;
|
||||
}
|
||||
return str.replaceFirst("^0+(?!$)", "");
|
||||
}
|
||||
|
||||
private boolean isValidPort(String text) {
|
||||
if (text == null || text.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
int value = Integer.parseInt(text);
|
||||
return value >= 1024 && value <= 8888;
|
||||
} catch (NumberFormatException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -30,8 +30,6 @@ public interface PreferencesComponent {
|
||||
selectedTabProperty().set(selectedTab);
|
||||
Stage stage = window();
|
||||
stage.setScene(scene().get());
|
||||
stage.setMinWidth(420);
|
||||
stage.setMinHeight(300);
|
||||
stage.show();
|
||||
stage.requestFocus();
|
||||
return stage;
|
||||
|
||||
@@ -31,13 +31,14 @@ public class PreferencesController implements FxController {
|
||||
public Tab updatesTab;
|
||||
public Tab contributeTab;
|
||||
public Tab aboutTab;
|
||||
public Tab networkTab;
|
||||
|
||||
@Inject
|
||||
public PreferencesController(Environment env, @PreferencesWindow Stage window, ObjectProperty<SelectedPreferencesTab> selectedTabProperty, UpdateChecker updateChecker) {
|
||||
this.env = env;
|
||||
this.window = window;
|
||||
this.selectedTabProperty = selectedTabProperty;
|
||||
this.updateAvailable = updateChecker.updateAvailableProperty();
|
||||
this.updateAvailable = updateChecker.latestVersionProperty().isNotNull();
|
||||
}
|
||||
|
||||
@FXML
|
||||
@@ -63,6 +64,7 @@ public class PreferencesController implements FxController {
|
||||
case UPDATES -> updatesTab;
|
||||
case CONTRIBUTE -> contributeTab;
|
||||
case ABOUT -> aboutTab;
|
||||
case NETWORK -> networkTab;
|
||||
case ANY -> updateAvailable.get() ? updatesTab : generalTab;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -89,4 +89,9 @@ abstract class PreferencesModule {
|
||||
@FxControllerKey(AboutController.class)
|
||||
abstract FxController bindAboutController(AboutController controller);
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(NetworkPreferencesController.class)
|
||||
abstract FxController bindNetworkPreferencesController(NetworkPreferencesController controller);
|
||||
|
||||
}
|
||||
|
||||
@@ -35,4 +35,8 @@ public enum SelectedPreferencesTab {
|
||||
* Show about tab
|
||||
*/
|
||||
ABOUT,
|
||||
/**
|
||||
* Show network tab
|
||||
*/
|
||||
NETWORK
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
xmlns="http://javafx.com/javafx"
|
||||
fx:id="tabPane"
|
||||
fx:controller="org.cryptomator.ui.preferences.PreferencesController"
|
||||
minWidth="-Infinity"
|
||||
maxWidth="-Infinity"
|
||||
prefWidth="650"
|
||||
tabMinWidth="60"
|
||||
tabClosingPolicy="UNAVAILABLE"
|
||||
@@ -44,6 +46,14 @@
|
||||
<fx:include source="preferences_updates.fxml"/>
|
||||
</content>
|
||||
</Tab>
|
||||
<Tab fx:id="network" id="NETWORK" text="%preferences.network">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="NETWORK"/>
|
||||
</graphic>
|
||||
<content>
|
||||
<fx:include source="preferences_network.fxml"/>
|
||||
</content>
|
||||
</Tab>
|
||||
<Tab fx:id="contributeTab" id="CONTRIBUTE" text="%preferences.contribute">
|
||||
<graphic>
|
||||
<FontAwesome5IconView glyph="HEART"/>
|
||||
|
||||
@@ -30,10 +30,6 @@
|
||||
<ChoiceBox fx:id="keychainBackendChoiceBox"/>
|
||||
</HBox>
|
||||
|
||||
<HBox spacing="12" alignment="CENTER_LEFT" visible="${controller.someQuickAccessServiceAvailable}" managed="${controller.someQuickAccessServiceAvailable}">
|
||||
<CheckBox fx:id="useQuickAccessCheckbox" text="%preferences.general.quickAccessService"/>
|
||||
<ChoiceBox fx:id="quickAccessServiceChoiceBox"/>
|
||||
</HBox>
|
||||
<Region VBox.vgrow="ALWAYS"/>
|
||||
|
||||
<HBox spacing="12" alignment="CENTER_LEFT">
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.RadioButton?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.control.TextField?>
|
||||
|
||||
<?import javafx.scene.control.CheckBox?>
|
||||
<?import javafx.scene.control.ToggleGroup?>
|
||||
<?import org.cryptomator.ui.controls.NumericTextField?>
|
||||
<VBox xmlns:fx="http://javafx.com/fxml"
|
||||
xmlns="http://javafx.com/javafx"
|
||||
fx:controller="org.cryptomator.ui.preferences.NetworkPreferencesController"
|
||||
spacing="24">
|
||||
<fx:define>
|
||||
<ToggleGroup fx:id="proxyToggleGroup"/>
|
||||
</fx:define>
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="24"/>
|
||||
</padding>
|
||||
<VBox>
|
||||
<Label text="Configure Proxy Access to the Internet"/>
|
||||
<RadioButton fx:id="noProxyBtn" text="No Proxy" toggleGroup="${proxyToggleGroup}" />
|
||||
<RadioButton fx:id="systemSettingsBtn" text="Use system proxy settings" toggleGroup="${proxyToggleGroup}" />
|
||||
<RadioButton fx:id="manualProxyBtn" text="Manual proxy configuration" toggleGroup="${proxyToggleGroup}" />
|
||||
<VBox fx:id="manualProxyBox">
|
||||
<padding>
|
||||
<Insets left="24"/>
|
||||
</padding>
|
||||
<HBox spacing="12" alignment="CENTER_LEFT">
|
||||
<Label text="HTTP Proxy" minWidth="90" />
|
||||
<TextField fx:id="httpProxy" HBox.hgrow="ALWAYS" />
|
||||
<Label text="Port"/>
|
||||
<NumericTextField fx:id="httpPort" prefWidth="60" promptText="0" />
|
||||
</HBox>
|
||||
<CheckBox fx:id="samePortProxyForHttpHttps" text="Also use this proxy for HTTPS"/>
|
||||
<HBox fx:id="httpsProxyBox" spacing="12" alignment="CENTER_LEFT">
|
||||
<Label text="HTTPS Proxy" minWidth="90"/>
|
||||
<TextField fx:id="httpsProxy" HBox.hgrow="ALWAYS" />
|
||||
<Label text="Port"/>
|
||||
<NumericTextField fx:id="httpsPort" prefWidth="60" promptText="0"/>
|
||||
</HBox>
|
||||
</VBox>
|
||||
|
||||
</VBox>
|
||||
|
||||
|
||||
</VBox>
|
||||
@@ -288,7 +288,6 @@ preferences.general.debugLogging=Enable debug logging
|
||||
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
|
||||
## Interface
|
||||
preferences.interface=Interface
|
||||
preferences.interface.theme=Look & Feel
|
||||
@@ -329,6 +328,8 @@ preferences.updates.lastUpdateCheck.daysAgo=%s days ago
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=%s hours ago
|
||||
preferences.updates.checkFailed=Looking for updates failed. Please check your internet connection or try again later.
|
||||
preferences.updates.upToDate=Cryptomator is up-to-date.
|
||||
## Network
|
||||
preferences.network=Network
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=Support Us
|
||||
|
||||
@@ -173,15 +173,10 @@ hub.registerSuccess.legacy.description=للدخول إلى الخزينة، يح
|
||||
### Registration Failed
|
||||
hub.registerFailed.message=فشل تسجيل الجهاز
|
||||
hub.registerFailed.description.generic=حدث خطأ في عملية تسجيل الاسم. لمزيد من التفاصيل، راجع سجل التطبيق.
|
||||
hub.registerFailed.description.deviceAlreadyExists=هذا الجهاز مسجل لمستخدم مختلف بالفعل. حاول تغيير حساب المستخدم أو استخدام جهاز مختلف.
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=تم رفض الوصول
|
||||
hub.unauthorized.description=لم يتم بعد منح الإذن لجهازك بالوصول إلى هذا المخزن. اطلب من مالك المخزن أن يأذن بذلك.
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=مطلوب اتخاذ إجراء
|
||||
hub.requireAccountInit.description.0=للمتابعة، يرجى إكمال الخطوات المطلوبة في
|
||||
hub.requireAccountInit.description.1=ملف تعريف المستخدم
|
||||
hub.requireAccountInit.description.2=.
|
||||
### License Exceeded
|
||||
hub.invalidLicense.message=ترخيص المركز غير صالح
|
||||
hub.invalidLicense.description=نموذج المركز Cryptomator الخاص بك لديه ترخيص غير صالح. الرجاء إبلاغ مسؤول مركز لترقية أو تجديد الترخيص.
|
||||
@@ -310,9 +305,6 @@ preferences.volume.fuseRestartRequired=لتطبيق التغييرات، يحت
|
||||
preferences.volume.tcp.port=منفذ TCP الافتراضي
|
||||
preferences.volume.supportedFeatures=يدعم نوع وحدة تخزين المختار الميزات التالية:
|
||||
preferences.volume.feature.mountAuto=اختيار نقطة البَدْء التلقائية
|
||||
preferences.volume.feature.mountToDir=مجلد مخصص كنقطة تحميل
|
||||
preferences.volume.feature.mountToDriveLetter=استخدام حرف وحدة التخزين كنقطة تحميل
|
||||
preferences.volume.feature.mountFlags=خيارات التثبيت المخصصة
|
||||
preferences.volume.feature.readOnly=تحميل للقراءة فقط
|
||||
## Updates
|
||||
preferences.updates=تحديثات
|
||||
@@ -320,13 +312,6 @@ preferences.updates.currentVersion=الإصدار الحالي: %s
|
||||
preferences.updates.autoUpdateCheck=تحقق من التحديثات اوتوماتيكيا
|
||||
preferences.updates.checkNowBtn=تحقق الان
|
||||
preferences.updates.updateAvailable=التحديث إلى الإصدار %s متاح.
|
||||
preferences.updates.lastUpdateCheck=آخر فحص: %s
|
||||
preferences.updates.lastUpdateCheck.never=مطلقاً
|
||||
preferences.updates.lastUpdateCheck.recently=مؤخراً
|
||||
preferences.updates.lastUpdateCheck.daysAgo=منذ %s يوم
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=منذ %s ساعة
|
||||
preferences.updates.checkFailed=فشل في البحث عن تحديثات البرنامج تحقق من اتصالك بالإنترنت أو حاول مرة أخرى لاحقاً.
|
||||
preferences.updates.upToDate=Cryptomator محدث لاخر نسخة.
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=ادعمنا
|
||||
@@ -346,32 +331,13 @@ stats.cacheHitRate=معدل استخدام الكاش
|
||||
stats.read.throughput.idle=قراءة: خامل
|
||||
stats.read.throughput.kibs=القراءة: %.2f KiB/s
|
||||
stats.read.throughput.mibs=القراءة: %.2f MiB/s
|
||||
stats.read.total.data.none=بيانات القراءة: -
|
||||
stats.read.total.data.kib=بيانات القراءة: %.1f كيلوبايت
|
||||
stats.read.total.data.mib=بيانات القراءة: %.1f ميجابايت
|
||||
stats.read.total.data.gib=بيانات القراءة: %.1f جيجابايت
|
||||
stats.decr.total.data.none=تم فك تشفير البيانات:-
|
||||
stats.decr.total.data.kib=البيانات المفكوكة: %.1f كيلوبايت
|
||||
stats.decr.total.data.mib=البيانات المفكوكة: %.1f ميجابايت
|
||||
stats.decr.total.data.gib=البيانات المفكوكة: %.1f جيجابايت
|
||||
stats.read.accessCount=مجموع القراءات: %d
|
||||
## Write
|
||||
stats.write.throughput.idle=الكتابة: خامل
|
||||
stats.write.throughput.kibs=الكتابة: %.2f كيلوبايت/ثانية
|
||||
stats.write.throughput.mibs=الكتابة: %.2f ميجابايت/ثانية
|
||||
stats.write.total.data.none=البيانات المكتوبة: -
|
||||
stats.write.total.data.kib=البيانات المكتوبة: %.1f كيلوبايت
|
||||
stats.write.total.data.mib=البيانات المكتوبة: %.1f م.ب
|
||||
stats.write.total.data.gib=البيانات المكتوبة: %.1f ج.ب
|
||||
stats.encr.total.data.none=البيانات المشفرة: -
|
||||
stats.encr.total.data.kib=البيانات المشفرة: %.1f كيلوبايت
|
||||
stats.encr.total.data.mib=البيانات المشفرة: %.1f ميجابايت
|
||||
stats.encr.total.data.gib=البيانات المشفرة: %.1f جيجابايت
|
||||
stats.write.accessCount=مجموع الكتابات: %d
|
||||
|
||||
## Accesses
|
||||
stats.access.current=الوصول: %d
|
||||
stats.access.total=مجموع الوصول: %d
|
||||
|
||||
|
||||
# Main Window
|
||||
@@ -389,8 +355,6 @@ main.vaultlist.contextMenu.unlockNow=افتح الان
|
||||
main.vaultlist.contextMenu.vaultoptions=إظهار خيارات المخزن
|
||||
main.vaultlist.contextMenu.reveal=اظهار القرص
|
||||
main.vaultlist.addVaultBtn=إضافة
|
||||
main.vaultlist.addVaultBtn.menuItemNew=خزانة جديدة...
|
||||
main.vaultlist.addVaultBtn.menuItemExisting=أضِف خزانة موجودة...
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=شكرا لاختيار Cryptomator لحماية ملفاتك. إذا كنت بحاجة إلى أية مساعدة، تحقق من دليل وتعليمات الإستخدام:
|
||||
@@ -400,17 +364,14 @@ main.vaultDetail.unlockBtn=فتح…
|
||||
main.vaultDetail.unlockNowBtn=فتح القفل الان
|
||||
main.vaultDetail.optionsBtn=خيارات المخزن
|
||||
main.vaultDetail.passwordSavedInKeychain=تم حفظ كلمة المرور
|
||||
main.vaultDetail.share=مشاركة…
|
||||
### Unlocked
|
||||
main.vaultDetail.unlockedStatus=مفتوح
|
||||
main.vaultDetail.accessLocation=يمكن الوصول إلى محتويات مخزنك هنا:
|
||||
main.vaultDetail.revealBtn=اظهار القرص
|
||||
main.vaultDetail.copyUri=نسخ الرابط
|
||||
main.vaultDetail.lockBtn=قفل
|
||||
main.vaultDetail.bytesPerSecondRead=قراءة:
|
||||
main.vaultDetail.bytesPerSecondWritten=كتابة:
|
||||
main.vaultDetail.throughput.idle=خمول
|
||||
main.vaultDetail.throughput.kbps=%.1f كيلوبايت/ث
|
||||
main.vaultDetail.throughput.mbps=%.1f ميجابايت/ث
|
||||
main.vaultDetail.stats=إحصائيات الخزنة
|
||||
main.vaultDetail.locateEncryptedFileBtn=تحديد موقع الملف المشفر
|
||||
@@ -426,9 +387,6 @@ main.vaultDetail.missing.changeLocation=تغيير موقع الخزنة…
|
||||
main.vaultDetail.migrateButton=ترقية الحافظة
|
||||
main.vaultDetail.migratePrompt=يجب ترقية المخزن الخاص بك إلى تنسيق جديد، قبل أن تتمكن من الوصول إليه
|
||||
### Error
|
||||
main.vaultDetail.error.info=حدث خطأ أثناء تحميل الخزانة من القرص الصلب.
|
||||
main.vaultDetail.error.reload=إعادة تحميل
|
||||
main.vaultDetail.error.windowTitle=خطأ في تحميل الخزنة
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.title=كيفية تشفير الملفات
|
||||
@@ -444,31 +402,24 @@ wrongFileAlert.link=لمزيد من المساعدة، قم بزيارة
|
||||
## General
|
||||
vaultOptions.general=عام
|
||||
vaultOptions.general.vaultName=اسم المخزن
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=قفل عند الخمول لمدة
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=دقائق
|
||||
vaultOptions.general.unlockAfterStartup=فتح قفل المخزن عند بدء تشغيل Cryptomator
|
||||
vaultOptions.general.actionAfterUnlock=بعد فتح القفل بنجاح
|
||||
vaultOptions.general.actionAfterUnlock.ignore=لا تفعل شيئاً
|
||||
vaultOptions.general.actionAfterUnlock.reveal=إظهار القرص
|
||||
vaultOptions.general.actionAfterUnlock.ask=اسأل
|
||||
vaultOptions.general.startHealthCheckBtn=بدء فحص الصحة
|
||||
|
||||
## Mount
|
||||
vaultOptions.mount=القرص الوهمي
|
||||
vaultOptions.mount.info=افتح تفضيلات القرص الظاهري لتغيير الإعدادات الافتراضية.
|
||||
vaultOptions.mount.readonly=للقراءة فقط
|
||||
vaultOptions.mount.customMountFlags=الأعلام المخصصة
|
||||
vaultOptions.mount.winDriveLetterOccupied=مشغول
|
||||
vaultOptions.mount.mountPoint=موقع التحميل الوهمي
|
||||
vaultOptions.mount.mountPoint.auto=اختيار موقع مناسب تلقائياً
|
||||
vaultOptions.mount.mountPoint.driveLetter=استخدام دالة قرص معين
|
||||
vaultOptions.mount.mountPoint.custom=استخدام المجلد المختار
|
||||
vaultOptions.mount.mountPoint.directoryPickerButton=اختر…
|
||||
vaultOptions.mount.mountPoint.directoryPickerTitle=إختر مجلد
|
||||
vaultOptions.mount.volumeType.default=الافتراضي (%s)
|
||||
vaultOptions.mount.volumeType.restartRequired=لاستخدام هذا النوع من وحدة التخزين يحتاج Cryptomator إلى إعادة تشغيله.
|
||||
vaultOptions.mount.volume.tcp.port=منفذ TCP
|
||||
vaultOptions.mount.volume.type=نوع وحدة التخزين
|
||||
## Master Key
|
||||
vaultOptions.masterkey=كلمة المرور
|
||||
vaultOptions.masterkey.changePasswordBtn=تغيير كلمة المرور
|
||||
@@ -478,12 +429,9 @@ vaultOptions.masterkey.showRecoveryKeyBtn=عرض مفتاح الاسترداد
|
||||
vaultOptions.masterkey.recoverPasswordBtn=إعادة تعيين كلمة المرور
|
||||
## Hub
|
||||
vaultOptions.hub=الإسترداد
|
||||
vaultOptions.hub.convertInfo=يمكنك استخدام مفتاح الاسترداد لتحويل هذه خزانة Hub إلى خزانة تعتمد على كلمة مرور في حالة الطوارئ.
|
||||
vaultOptions.hub.convertBtn=التحويل إلى خزانة قائمة على كلمة المرور
|
||||
|
||||
# Recovery Key
|
||||
## Display Recovery Key
|
||||
recoveryKey.display.title=إظهار مفتاح الاسترداد
|
||||
recoveryKey.create.message=مطلوب كلمة المرور
|
||||
recoveryKey.create.description=أدخل كلمة المرور الخاصة بك لإظهار مفتاح الاسترداد ل "%s":
|
||||
recoveryKey.display.description=يمكن استخدام مفتاح الاسترداد التالي لاستعادة الوصول إلى "%s":
|
||||
@@ -491,23 +439,12 @@ recoveryKey.display.StorageHints=حافظ عليه في مكان ما آمن ج
|
||||
## Reset Password
|
||||
### Enter Recovery Key
|
||||
recoveryKey.recover.title=إعادة تعيين كلمة المرور
|
||||
recoveryKey.recover.prompt=أدخل مفتاح الاسترداد لـ "%s":
|
||||
recoveryKey.recover.correctKey=هذا مفتاح استرداد صالح
|
||||
recoveryKey.recover.wrongKey=مفتاح الاسترداد هذا ينتمي إلى خزانة مختلفة
|
||||
recoveryKey.recover.invalidKey=مفتاح الاسترداد غير صالح
|
||||
recoveryKey.printout.heading=مفتاح استرداد Cryptomator\n"%s"\n
|
||||
### Reset Password
|
||||
recoveryKey.recover.resetBtn=إعادة الضبط
|
||||
### Recovery Key Password Reset Success
|
||||
recoveryKey.recover.resetSuccess.message=تم إعادة تعيين كلمة المرور بنجاح
|
||||
recoveryKey.recover.resetSuccess.description=يمكنك فتح الخزانة الخاصة بك بكلمة المرور الجديدة.
|
||||
|
||||
# Convert Vault
|
||||
convertVault.title=تحويل الخزانة
|
||||
convertVault.convert.convertBtn.before=حوّل
|
||||
convertVault.convert.convertBtn.processing=جاري التحويل…
|
||||
convertVault.success.message=تم التحويل بنجاح
|
||||
convertVault.hubToPassword.success.description=يمكنك الآن فتح الخزانة باستخدام كلمة المرور المختارة دون الحاجة إلى الوصول إلى Hub.
|
||||
|
||||
# New Password
|
||||
newPassword.promptText=أدخل كلمة مرور جديدة
|
||||
@@ -522,46 +459,13 @@ passwordStrength.messageLabel.3=قوية
|
||||
passwordStrength.messageLabel.4=قوية جداً
|
||||
|
||||
# Quit
|
||||
quit.title=إغلاق التطبيق
|
||||
quit.message=هناك خزانات مفتوحة
|
||||
quit.description=يرجى تأكيد رغبتك في الخروج. سيقوم Cryptomator بقفل جميع الخزائن غير المقفلة بشكل آمن لمنع فقدان البيانات.
|
||||
quit.lockAndQuitBtn=قفل و خروج
|
||||
|
||||
# Forced Quit
|
||||
quit.forced.message=بعض الخزائن لم أتمكن من قفلها
|
||||
quit.forced.description=تم حظر قفل الخزنات بسبب العمليات المعلقة أو الملفات المفتوحة. يمكنك فرض قفل الخزنات المتبقية، ولكن قد يؤدي مقاطعة عمليات الإدخال/الإخراج إلى فقدان البيانات غير المحفوظة.
|
||||
quit.forced.forceAndQuitBtn=فرض وإغلاق
|
||||
|
||||
# Update Reminder
|
||||
updateReminder.title=التحقق من التحديث
|
||||
updateReminder.message=التحقق من التحديثات؟
|
||||
updateReminder.description=ابقَ على اطلاع بأحدث الميزات، وإصلاحات الأخطاء، وتحسينات الأمان. نوصي بالتحقق التلقائي من التحديثات.
|
||||
updateReminder.notNow=ليس الآن
|
||||
updateReminder.yesOnce=نعم، مرة واحدة
|
||||
updateReminder.yesAutomatically=نعم، تلقائياً
|
||||
|
||||
#Dokany Support End
|
||||
dokanySupportEnd.title=إشعار بإيقاف الدعم
|
||||
dokanySupportEnd.message=انتهاء الدعم لـDokany
|
||||
dokanySupportEnd.description=نوع وحدة التخزين Dokany لم يعد مدعوماً من قبل Cryptomator. تم تعديل إعداداتك لاستخدام نوع وحدة التخزين الافتراضي الآن. يمكنك عرض النوع الافتراضي في التفضيلات.
|
||||
dokanySupportEnd.preferencesBtn=فتح التفضيلات
|
||||
|
||||
# Share Vault
|
||||
shareVault.title=مشاركة الخزانة
|
||||
shareVault.message=هل ترغب في مشاركة خزانتك مع الآخرين؟
|
||||
shareVault.description=كن حذرًا دائمًا عند مشاركة خزانتك مع الآخرين. باختصار، اتبع هذه الخطوات:
|
||||
shareVault.instruction.1=1. شارك الوصول إلى مجلد الخزانة المشفر عبر التخزين السحابي.
|
||||
shareVault.instruction.2=2. شارك كلمة مرور الخزانة بطريقة آمنة.
|
||||
shareVault.remarkBestPractices=لمزيد من المعلومات، تحقق من اقتراحات أفضل الممارسات في مستنداتنا.
|
||||
shareVault.docsTooltip=افتح وثائق البرنامج Documentation لتعلم المزيد عن مشاركة الخزائن.
|
||||
shareVault.hubAd.description=الطريقة الآمنة للعمل ضمن الفرق
|
||||
shareVault.hubAd.keyManagement=• إدارة المفاتيح بدون معرفة
|
||||
shareVault.hubAd.authentication=• مصادقة قوية
|
||||
shareVault.hubAd.encryption=• التشفير من الطرف إلى الطرف
|
||||
shareVault.visitHub=زيارة Cryptomator Hub
|
||||
|
||||
shareVault.hub.message=كيفية مشاركة خزانة Hub
|
||||
shareVault.hub.description=لمشاركة محتوى الخزانة مع عضو آخر في الفريق، عليك القيام بخطوتين:
|
||||
shareVault.hub.instruction.1=1. شارك الوصول إلى مجلد الخزانة المشفر عبر التخزين السحابي.
|
||||
shareVault.hub.instruction.2=2. امنح الوصول لعضو الفريق في Cryptomator Hub.
|
||||
shareVault.hub.openHub=زيارة Cryptomator Hub
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=Diagnoseprotokoll aktivieren
|
||||
preferences.general.debugDirectory=Protokolldateien anzeigen
|
||||
preferences.general.autoStart=Cryptomator beim Systemstart starten
|
||||
preferences.general.keychainBackend=Passwörter speichern mit
|
||||
preferences.general.quickAccessService=Die entsperrten Tresore zum Schnellzugriff hinzufügen
|
||||
## Interface
|
||||
preferences.interface=Benutzeroberfläche
|
||||
preferences.interface.theme=Erscheinungsbild
|
||||
@@ -542,7 +541,6 @@ updateReminder.yesOnce=Ja, einmalig
|
||||
updateReminder.yesAutomatically=Ja, automatisch
|
||||
|
||||
#Dokany Support End
|
||||
dokanySupportEnd.message=Ende der Unterstützung für Dokany
|
||||
dokanySupportEnd.preferencesBtn=Einstellungen öffnen
|
||||
|
||||
# Share Vault
|
||||
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=Ενεργοποίηση καταγραφής
|
||||
preferences.general.debugDirectory=Αποκάλυψη αρχείων καταγραφής
|
||||
preferences.general.autoStart=Εκκίνηση Cryptomator στην εκκίνηση του συστήματος
|
||||
preferences.general.keychainBackend=Αποθήκευση κωδικού πρόσβασης με
|
||||
preferences.general.quickAccessService=Προσθήκη ξεκλειδωμένων Κρυπτών στην περιοχή γρήγορης πρόσβασης
|
||||
## Interface
|
||||
preferences.interface=Διεπαφή
|
||||
preferences.interface.theme=Εμφάνιση & Αίσθηση
|
||||
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=Habilitar registro de depuración
|
||||
preferences.general.debugDirectory=Revelar archivos de registro
|
||||
preferences.general.autoStart=Cargar Cryptomator al iniciar el sistema
|
||||
preferences.general.keychainBackend=Guardar contraseñas con
|
||||
preferences.general.quickAccessService=Añadir bóvedas desbloqueadas al área de acceso rápido
|
||||
## Interface
|
||||
preferences.interface=Interfaz
|
||||
preferences.interface.theme=Apariencia
|
||||
|
||||
@@ -92,7 +92,6 @@ lock.forced.retryBtn=تلاش مجدد
|
||||
|
||||
# Preferences
|
||||
## General
|
||||
preferences.general.quickAccessService=خزانه های قفل نشده را به دسترسی سریع اضافه کنید
|
||||
## Interface
|
||||
## Volume
|
||||
## Updates
|
||||
@@ -120,7 +119,6 @@ main.closeBtn.tooltip=ببند
|
||||
main.supporterCertificateMissing.tooltip=لطفا کمک مالی در نظر بگیرند
|
||||
## Vault List
|
||||
main.vaultlist.contextMenu.lock=قفل
|
||||
main.vaultlist.addVaultBtn=اضافه کردن
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
### Locked
|
||||
|
||||
@@ -141,7 +141,6 @@ unlock.error.customPath.description.hideawayNotDir=Ang pansamantalang nakatagong
|
||||
unlock.error.customPath.description.couldNotBeCleaned=Hindi ma-mount ang iyong vault sa path na "%s". Pakisubukang muli o pumili ng ibang landas.
|
||||
unlock.error.customPath.description.notEmptyDir=Ang custom na mount path na "%s" ay hindi isang walang laman na folder. Mangyaring pumili ng isang walang laman na folder at subukang muli.
|
||||
unlock.error.customPath.description.generic=Pumili ka ng custom na mount path para sa vault na ito, ngunit nabigo ang paggamit nito sa mensaheng: %2$s
|
||||
unlock.error.restartRequired.message=Hindi mabuksan ang vault
|
||||
unlock.error.title=Hindi mabuksan ang "%s"
|
||||
## Hub
|
||||
hub.noKeychain.message=Hindi ma-access ang key ng device
|
||||
@@ -158,18 +157,10 @@ hub.receive.description=Ang Cryptomator ay tumatanggap at nagpoproseso ng tugon
|
||||
hub.register.message=Bagong Device
|
||||
hub.register.nameLabel=Pangalan ng device
|
||||
hub.register.invalidAccountKeyLabel=Di-wastong Account Key
|
||||
hub.register.registerBtn=Magparehistro
|
||||
### Register Device Legacy
|
||||
hub.register.legacy.occupiedMsg=Ang pangalan ay nagamit na
|
||||
### Registration Success
|
||||
hub.registerSuccess.message=Rehistrado na ang device
|
||||
hub.registerSuccess.description=Ang iyong device ay matagumpay sa pag rehistrado. Maaari mo nang buksan ang vault.
|
||||
hub.registerSuccess.unlockBtn=I-unlock
|
||||
hub.registerSuccess.legacy.description=Para ma-access ang vault, kailangang pahintulutan ng may-ari ng vault ang iyong device.
|
||||
### Registration Failed
|
||||
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.
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Walang pahintulot
|
||||
hub.unauthorized.description=Hindi pa pinahihintulutan ang iyong device na i-access ang vault na ito. Hilingin sa may-ari ng vault na pahintulutan ito.
|
||||
@@ -314,11 +305,6 @@ preferences.updates.currentVersion=Kasalukuyang Bersyon: %s
|
||||
preferences.updates.autoUpdateCheck=Awtomatikong suriin ang mga update
|
||||
preferences.updates.checkNowBtn=Tingnan ngayon
|
||||
preferences.updates.updateAvailable=Available ang update sa bersyong %s.
|
||||
preferences.updates.lastUpdateCheck=Huling pagsusuri: %s
|
||||
preferences.updates.lastUpdateCheck.never=hindi kailanman
|
||||
preferences.updates.lastUpdateCheck.recently=kamakailan
|
||||
preferences.updates.lastUpdateCheck.daysAgo=%s araw ang lumipas
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=%s oras ang lumipas
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=Suportahan Kami
|
||||
@@ -530,10 +516,3 @@ updateReminder.yesAutomatically=Oo, Awtomatiko
|
||||
dokanySupportEnd.preferencesBtn=Buksan ang Mga Kagustuhan
|
||||
|
||||
# Share Vault
|
||||
shareVault.title=Ibahagi ang Vault
|
||||
shareVault.message=Gusto mo bang ibahagi ang iyong vault sa iba?
|
||||
shareVault.description=Maingat palagi pag binabahagi ang iyong vault sa ibang tao. Sa maikling salita, sundin ang mga hakbangin:
|
||||
shareVault.visitHub=Pagbisita ang Cryptomator Hub
|
||||
|
||||
shareVault.hub.message=Paano ibahagi ang Hub vault
|
||||
shareVault.hub.openHub=Buksan ang Cryptomator Hub
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=Activer les logs debug
|
||||
preferences.general.debugDirectory=Afficher le journal
|
||||
preferences.general.autoStart=Lancer Cryptomator au démarrage du système
|
||||
preferences.general.keychainBackend=Stocker les mots de passe avec
|
||||
preferences.general.quickAccessService=Ajouter les coffres déverrouillés à la zone d'accès rapide
|
||||
## Interface
|
||||
preferences.interface=Interface
|
||||
preferences.interface.theme=Apparence
|
||||
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=Abilita la registrazione di debug
|
||||
preferences.general.debugDirectory=Rivela i file di registro
|
||||
preferences.general.autoStart=Avvia Cryptomator all'avvio del sistema
|
||||
preferences.general.keychainBackend=Memorizza le password con
|
||||
preferences.general.quickAccessService=Aggiungi cassaforte sbloccata all'area di accesso rapido
|
||||
## Interface
|
||||
preferences.interface=Interfaccia
|
||||
preferences.interface.theme=Aspetto
|
||||
@@ -332,7 +331,7 @@ preferences.updates.upToDate=Cryptomator è aggiornato.
|
||||
## Contribution
|
||||
preferences.contribute=Supportaci
|
||||
preferences.contribute.registeredFor=Certificato del sostenitore registrato per %s
|
||||
preferences.contribute.noCertificate=Supporta Cryptomator e ricevi un certificato di supporter. È come una chiave di licenza, ma per persone fantastiche che utilizzano software libero. ;-)
|
||||
preferences.contribute.noCertificate=Supporta Cryptomator e ricevi il certificato da sostenitore. È come una chiave di licenza me per persone fantastiche che usano un software gratuito. ;-)
|
||||
preferences.contribute.getCertificate=Non ne hai ancora uno? Scopri come puoi ottenerlo.
|
||||
preferences.contribute.promptText=Incolla qui il codice del certificato da sostenitore
|
||||
#<-- Add entries for donations and code/translation/documentation contribution -->
|
||||
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=ログを有効にする
|
||||
preferences.general.debugDirectory=ログ ファイルを表示
|
||||
preferences.general.autoStart=システム開始時に Cryptomator を起動する
|
||||
preferences.general.keychainBackend=次を利用してパスワードを保存する
|
||||
preferences.general.quickAccessService=解錠された金庫をクイックアクセス領域に追加
|
||||
## Interface
|
||||
preferences.interface=インターフェース
|
||||
preferences.interface.theme=外観
|
||||
@@ -542,8 +541,6 @@ updateReminder.yesOnce=はい、一度だけ
|
||||
updateReminder.yesAutomatically=自動的に行う
|
||||
|
||||
#Dokany Support End
|
||||
dokanySupportEnd.title=サポート廃止の通知
|
||||
dokanySupportEnd.message=Dokany のサポート終了
|
||||
dokanySupportEnd.preferencesBtn=環境設定を開く
|
||||
|
||||
# Share Vault
|
||||
|
||||
@@ -60,10 +60,6 @@ addvaultwizard.new.validCharacters.numbers=숫자
|
||||
addvaultwizard.new.validCharacters.dashes=대시 (%s) 또는 언더바 (%s)
|
||||
### Expert Settings
|
||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=전문가용 설정 활성화
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=36과 220 사이 숫자를 입력해주세요 (기본값: 220)
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=더 자세한 정보는 관련 문서에서 볼 수 있습니다.
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.title=암호화된 파일명의 최대 길이
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=유효
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=Vault 생성
|
||||
addvaultwizard.new.generateRecoveryKeyChoice=비밀번호가 없으면 데이터에 접근할 수 없습니다. 비밀번호를 잊었을 때를 대비한 복구 키를 원하십니까?
|
||||
@@ -132,21 +128,13 @@ unlock.success.revealBtn=드라이브 표시
|
||||
## Hub
|
||||
hub.noKeychain.openBtn=설정 열기
|
||||
### Waiting
|
||||
hub.auth.message=인증 대기중…
|
||||
### Receive Key
|
||||
### Register Device
|
||||
hub.register.message=새 기기
|
||||
hub.register.nameLabel=기기 이름
|
||||
hub.register.invalidAccountKeyLabel=유효하지 않은 계정 키
|
||||
hub.register.registerBtn=등록
|
||||
### Register Device Legacy
|
||||
hub.register.legacy.occupiedMsg=이미 사용 중인 이름
|
||||
### Registration Success
|
||||
hub.registerSuccess.message=기기 등록됨
|
||||
hub.registerSuccess.unlockBtn=잠금해제
|
||||
### Registration Failed
|
||||
hub.registerFailed.message=기기 등록 실패
|
||||
hub.registerFailed.description.generic=등록 중에 에러가 발생했습니다. 앱 로그에서 자세한 정보를 확인할 수 있습니다.
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=액세스 거부
|
||||
hub.unauthorized.description=귀하의 기기는 아직 이 저장소에 액세스할 수 있는 권한이 없습니다. Vault 소유자에게 승인을 요청하세요.
|
||||
@@ -174,7 +162,6 @@ migration.start.text=Vault "%s"를 현재 버전의 Cryptomator에서 열기 위
|
||||
migration.start.remarkUndone=이 업그레이드는 되돌릴 수 없습니다.
|
||||
migration.start.remarkVersions=과거 버전의 Cryptomator는 업그레이드된 vault를 열 수 없습니다.
|
||||
migration.start.remarkCanRun=이 vault를 열 때 사용하는 모든 장치가 현재 버전의 Cryptomator를 실행할 수 있는지 확인해야 합니다.
|
||||
migration.start.remarkSynced=업그레이드하기 전에 해당 vault가 모든 기기에 정상적으로 동기화되어야 합니다.
|
||||
migration.start.confirm=나는 위 정보를 읽고 정말 이해했습니다.
|
||||
## Run
|
||||
migration.run.enterPassword="%s"의 비밀번호를 입력하십시요.
|
||||
@@ -220,23 +207,11 @@ health.check.detail.checkRunning=검사가 현재 실행중입니다...
|
||||
health.check.detail.checkSkipped=선택된 검사항목이 없습니다.
|
||||
health.check.detail.checkFinished=검사가 성공적으로 완료되었습니다.
|
||||
health.check.detail.checkFinishedAndFound=검사가 완료되었습니다. 검사 결과를 확인해주세요.
|
||||
health.check.detail.checkFailed=오류로 인해 검사가 종료되었습니다.
|
||||
health.check.detail.checkCancelled=검사가 취소되었습니다
|
||||
health.check.detail.listFilters.label=필터
|
||||
health.check.exportBtn=보고서 내보내기
|
||||
## Result view
|
||||
health.result.severityFilter.all=모든 상태 표시
|
||||
health.result.severityFilter.good=양호
|
||||
health.result.severityFilter.warn=경고
|
||||
health.result.severityFilter.crit=심각
|
||||
health.result.severityTip.good=상태: 양호\n정상적인 vault 구조를 가지고 있습니다.
|
||||
health.result.severityTip.crit=상태: 심각\nVault 구조가 손상되었습니다. 데이터 손실이 발생했습니다.
|
||||
health.result.fixStateFilter.all=모든 문제 해결 상태
|
||||
health.result.fixStateFilter.fixable=문제 해결 가능
|
||||
health.result.fixStateFilter.notFixable=문제 해결 불가
|
||||
health.result.fixStateFilter.fixing=문제 해결중…
|
||||
health.result.fixStateFilter.fixed=문제 해결됨
|
||||
health.result.fixStateFilter.fixFailed=문제 해결 실패
|
||||
## Fix Application
|
||||
health.fix.fixBtn=문제해결
|
||||
health.fix.successTip=문제 해결이 성공적으로 완료되었습니다
|
||||
@@ -268,7 +243,6 @@ preferences.interface.showTrayIcon=트레이 아이콘 보기 (재시작 필요)
|
||||
## Volume
|
||||
preferences.volume=가상 드라이브
|
||||
preferences.volume.type.automatic=자동
|
||||
preferences.volume.tcp.port=기본 TCP 포트
|
||||
preferences.volume.supportedFeatures=현재 선택한 볼륨 타입은 다음과 같은 기능들을 지원합니다:
|
||||
preferences.volume.feature.mountToDir=마운트할 폴더 지정
|
||||
preferences.volume.feature.mountToDriveLetter=마운트할 드라이브 문자
|
||||
@@ -280,13 +254,6 @@ preferences.updates.currentVersion=현재 버전: %s
|
||||
preferences.updates.autoUpdateCheck=자동으로 업데이트 확인
|
||||
preferences.updates.checkNowBtn=지금 확인
|
||||
preferences.updates.updateAvailable=버전 %s의 업데이트가 가능합니다.
|
||||
preferences.updates.lastUpdateCheck=마지막 확인: %s
|
||||
preferences.updates.lastUpdateCheck.never=확인 안함
|
||||
preferences.updates.lastUpdateCheck.recently=최근
|
||||
preferences.updates.lastUpdateCheck.daysAgo=%s일 전
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=%s 시간 전
|
||||
preferences.updates.checkFailed=업데이트를 확인할 수 없습니다. 인터넷 상태를 확인하거나 나중에 시도해주세요.
|
||||
preferences.updates.upToDate=현재 최신 버전의 Cryptomator를 사용하고 있습니다.
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=후원하기
|
||||
@@ -359,7 +326,6 @@ main.vaultDetail.unlockBtn=잠금해제...
|
||||
main.vaultDetail.unlockNowBtn=지금 잠금해제
|
||||
main.vaultDetail.optionsBtn=Vault 옵션
|
||||
main.vaultDetail.passwordSavedInKeychain=비밀번호 저장됨
|
||||
main.vaultDetail.share=공유하기
|
||||
### Unlocked
|
||||
main.vaultDetail.unlockedStatus=잠금해제됨
|
||||
main.vaultDetail.accessLocation=이 Vault의 내용은 다음의 경로에서 접근할 수 있습니다:
|
||||
@@ -419,7 +385,6 @@ vaultOptions.mount.mountPoint.driveLetter=드라이브 문자를 지정하여
|
||||
vaultOptions.mount.mountPoint.custom=선택한 디렉토리 사용
|
||||
vaultOptions.mount.mountPoint.directoryPickerButton=선택
|
||||
vaultOptions.mount.mountPoint.directoryPickerTitle=디렉토리 선택
|
||||
vaultOptions.mount.volume.tcp.port=TCP 포트
|
||||
## Master Key
|
||||
vaultOptions.masterkey=비밀번호
|
||||
vaultOptions.masterkey.changePasswordBtn=비밀번호 변경
|
||||
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=Debug logging aanzetten
|
||||
preferences.general.debugDirectory=Logboekbestanden bekijken
|
||||
preferences.general.autoStart=Start Cryptomator als het systeem opstart
|
||||
preferences.general.keychainBackend=Bewaar wachtwoorden met
|
||||
preferences.general.quickAccessService=Voeg ontgrendelde kluizen toe aan snelle toegang
|
||||
## Interface
|
||||
preferences.interface=Uiterlijk
|
||||
preferences.interface.theme=Uiterlijk
|
||||
|
||||
@@ -318,7 +318,5 @@ quit.lockAndQuitBtn=ਲਾਕ ਕਰੋ ਤੇ ਬਾਹਰ ਜਾਓ
|
||||
# Update Reminder
|
||||
|
||||
#Dokany Support End
|
||||
dokanySupportEnd.title=ਬਰਤਰਫ਼ੀ ਨੋਟਿਸ
|
||||
dokanySupportEnd.preferencesBtn=ਪਸੰਦੀਦਾ ਖੋਲ੍ਹੋ
|
||||
|
||||
# Share Vault
|
||||
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=Włącz logowanie w trybie debug
|
||||
preferences.general.debugDirectory=Pokaż pliki logowania
|
||||
preferences.general.autoStart=Uruchom Cryptomator po uruchomieniu systemu
|
||||
preferences.general.keychainBackend=Przechowuj hasła za pomocą
|
||||
preferences.general.quickAccessService=Dodaj odblokowane sejfy do paska szybkiego dostępu
|
||||
## Interface
|
||||
preferences.interface=Interfejs
|
||||
preferences.interface.theme=Wygląd
|
||||
@@ -326,8 +325,6 @@ preferences.updates.lastUpdateCheck.never=nigdy
|
||||
preferences.updates.lastUpdateCheck.recently=niedawno
|
||||
preferences.updates.lastUpdateCheck.daysAgo=%s dni temu
|
||||
preferences.updates.lastUpdateCheck.hoursAgo=%s godzin temu
|
||||
preferences.updates.checkFailed=Nieudana próba sprawdzenia aktualizacji. Sprawdź połączenie z internetem i spróbuj ponownie.
|
||||
preferences.updates.upToDate=Cryptomator jest aktualny.
|
||||
|
||||
## Contribution
|
||||
preferences.contribute=Wesprzyj nas
|
||||
@@ -542,9 +539,6 @@ updateReminder.yesOnce=Tak, raz
|
||||
updateReminder.yesAutomatically=Tak, automatycznie
|
||||
|
||||
#Dokany Support End
|
||||
dokanySupportEnd.title=Informacja o wycofaniu
|
||||
dokanySupportEnd.message=Koniec wsparcia dla Dokany
|
||||
dokanySupportEnd.description=Typ udziału Dokany nie jest już wspierany przez Cryptomator. Twoje ustawienia zostały dostosowane do domyślnego typu udziału. Możesz sprawdzić jaki jest domyślny typ w ustawieniach.
|
||||
dokanySupportEnd.preferencesBtn=Otwórz ustawienia
|
||||
|
||||
# Share Vault
|
||||
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=Ativar o registo de erros
|
||||
preferences.general.debugDirectory=Mostrar ficheiros de registo
|
||||
preferences.general.autoStart=Iniciar o Cryptomator no início do sistema
|
||||
preferences.general.keychainBackend=Guardar palavras-passe com
|
||||
preferences.general.quickAccessService=Adicionar cofres desbloqueados à área de acesso rápido
|
||||
## Interface
|
||||
preferences.interface=Interface
|
||||
preferences.interface.theme=Aspecto e Ambiente
|
||||
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=Ativar log de debug
|
||||
preferences.general.debugDirectory=Mostrar arquivos de log
|
||||
preferences.general.autoStart=Iniciar o Cryptomator ao inicializar o sistema
|
||||
preferences.general.keychainBackend=Armazenar senhas com
|
||||
preferences.general.quickAccessService=Adicione cofres desbloqueados à área de acesso rápido
|
||||
## Interface
|
||||
preferences.interface=Interface
|
||||
preferences.interface.theme=Aparência
|
||||
|
||||
@@ -15,12 +15,12 @@ generic.button.next=Далее
|
||||
generic.button.print=Печать
|
||||
|
||||
# Error
|
||||
error.message=Произошла ошибка
|
||||
error.description=Cryptomator не ожидал, что это произойдёт. Вы можете найти существующие решения по этой ошибке. Или, если об этом ещё не сообщалось, то не стесняйтесь это сделать.
|
||||
error.message=Ошибка: %s
|
||||
error.description=Произошла непредвиденная ситуация. Попробуйте найти уже имеющиеся решения этой ошибки. Если об этой ошибке ещё не сообщали, то сообщите вы.
|
||||
error.hyperlink.lookup=Найти ошибку
|
||||
error.hyperlink.report=Сообщить об этой ошибке
|
||||
error.hyperlink.report=Сообщить об ошибке
|
||||
error.technicalDetails=Подробности:
|
||||
error.existingSolutionDescription=Cryptomator не ожидал, что это произойдёт. Однако, мы нашли существующее решение по этой проблеме. Пожалуйста, ознакомьтесь с ним по ссылке.
|
||||
error.existingSolutionDescription=Произошло неожиданное событие. Однако мы нашли решение этой проблемы. Ознакомьтесь с ним по ссылке.
|
||||
error.hyperlink.solution=Найти решение
|
||||
error.lookupPermissionMessage=Cryptomator может поискать решение этой проблемы в Интернете. Для этого будет отправлен запрос о проблеме в нашу базу данных с вашего IP-адреса.
|
||||
error.dismiss=Отклонить
|
||||
|
||||
@@ -279,7 +279,6 @@ preferences.general.debugLogging=Povoliť logovanie chýb
|
||||
preferences.general.debugDirectory=Ukázať súbory logov
|
||||
preferences.general.autoStart=Spustiť Cryptomator pri štarte systému
|
||||
preferences.general.keychainBackend=Uložiť heslá v
|
||||
preferences.general.quickAccessService=Pridať odomknuté trezory na plochu rýchleho prístupu
|
||||
## Interface
|
||||
preferences.interface=Rozhranie
|
||||
preferences.interface.theme=Vzhľad a pocit
|
||||
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=Aktivera loggning för felsökning
|
||||
preferences.general.debugDirectory=Visa loggfiler
|
||||
preferences.general.autoStart=Starta Cryptomator vid systemstart
|
||||
preferences.general.keychainBackend=Spara lösenord med
|
||||
preferences.general.quickAccessService=Lägg till olåsta valv till snabbåtkomstområdet
|
||||
## Interface
|
||||
preferences.interface=Gränssnitt
|
||||
preferences.interface.theme=Utseende & känsla
|
||||
|
||||
@@ -20,7 +20,7 @@ error.description=Cryptomator bunun olmasını beklemiyordu. Bu hata için mevcu
|
||||
error.hyperlink.lookup=Bu hatayı araştır
|
||||
error.hyperlink.report=Bu hatayı bildir
|
||||
error.technicalDetails=Detaylar:
|
||||
error.existingSolutionDescription=Cryptomator bunun olmasını beklemiyordu. Ancak bu hata için mevcut bir çözüm bulduk. Lütfen aşağıdaki bağlantıya bir göz atın.
|
||||
error.existingSolutionDescription=Cryptomator bunun olmasını beklemiyordu. Ancak bu hata için hali hazırda bir çözüm olduğunu bulduk. Lütfen aşağıdaki bağlantıya göz atın.
|
||||
error.hyperlink.solution=Çözüme bak
|
||||
error.lookupPermissionMessage=Cryptomator bu soruna çevrimiçi bir çözüm arayabilir. Bu, sorun veritabanımıza IP adresinizden bir istek gönderecektir.
|
||||
error.dismiss=Yoksay
|
||||
@@ -50,7 +50,7 @@ addvaultwizard.new.locationInstruction=Cryptomator kasanızın şifreli dosyalar
|
||||
addvaultwizard.new.locationLoading=Varsayılan bulut depolama dizinleri için yerel dosya sistemi denetleniyor…
|
||||
addvaultwizard.new.locationLabel=Depolama konumu
|
||||
addvaultwizard.new.locationPrompt=…
|
||||
addvaultwizard.new.directoryPickerLabel=Özel konum
|
||||
addvaultwizard.new.directoryPickerLabel=Diğer konum
|
||||
addvaultwizard.new.directoryPickerButton=Seç…
|
||||
addvaultwizard.new.directoryPickerTitle=Dizin Seç
|
||||
addvaultwizard.new.fileAlreadyExists=Kasa adına sahip bir dosya veya dizin zaten mevcut
|
||||
@@ -110,7 +110,7 @@ removeVault.confirmBtn=Kasayı Sil
|
||||
# Change Password
|
||||
changepassword.title=Şifreyi Değiştir
|
||||
changepassword.enterOldPassword="%s" için mevcut şifreyi girin
|
||||
changepassword.finalConfirmation=Şifremi unuttuğum takdirde verilerime erişemeyeceğimi anlıyorum
|
||||
changepassword.finalConfirmation=Şifremi unutursam verilerime ulaşamayacağımın farkındayım
|
||||
|
||||
# Forget Password
|
||||
forgetPassword.title=Şifreyi Unut
|
||||
@@ -445,7 +445,7 @@ wrongFileAlert.link=Daha fazla yardım için, ziyaret edin:
|
||||
vaultOptions.general=Genel
|
||||
vaultOptions.general.vaultName=Kasa Adı
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Boşta olduğunda kilitle
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=dakika
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=dk
|
||||
vaultOptions.general.unlockAfterStartup=Cryptomator başlatıldığında kasayı aç
|
||||
vaultOptions.general.actionAfterUnlock=Başarılı kilit açmanın ardından
|
||||
vaultOptions.general.actionAfterUnlock.ignore=Hiçbir şey yapma
|
||||
@@ -541,9 +541,6 @@ updateReminder.yesOnce=Evet, tek seferlik
|
||||
updateReminder.yesAutomatically=Evet, otomatik olarak
|
||||
|
||||
#Dokany Support End
|
||||
dokanySupportEnd.title=Destek sonlandırma bildirimi
|
||||
dokanySupportEnd.message=Dokany için destek sonu
|
||||
dokanySupportEnd.description=Dokany birim türü artık Cryptomator tarafından desteklenmiyor. Ayarlarınız artık varsayılan birim türünü kullanacak şekilde ayarlanmıştır. Varsayılan birim türünü tercihlerde görüntüleyebilirsiniz.
|
||||
dokanySupportEnd.preferencesBtn=Özellikleri Aç
|
||||
|
||||
# Share Vault
|
||||
|
||||
@@ -1,118 +0,0 @@
|
||||
# Locale Specific CSS files such as CJK, RTL,...
|
||||
|
||||
# Generics
|
||||
## Button
|
||||
|
||||
# Error
|
||||
|
||||
# Defaults
|
||||
|
||||
# Tray Menu
|
||||
|
||||
# Add Vault Wizard
|
||||
## New
|
||||
### Name
|
||||
### Location
|
||||
### Expert Settings
|
||||
### Password
|
||||
### Information
|
||||
## Existing
|
||||
## Success
|
||||
|
||||
# Remove Vault
|
||||
|
||||
# Change Password
|
||||
|
||||
# Forget Password
|
||||
|
||||
# Unlock
|
||||
## Select
|
||||
## Success
|
||||
## Failure
|
||||
## Hub
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
### Register Device Legacy
|
||||
### Registration Success
|
||||
### Registration Failed
|
||||
### Unauthorized
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
# Lock
|
||||
## Force
|
||||
## Failure
|
||||
|
||||
# Migration
|
||||
## Start
|
||||
## Run
|
||||
## Success
|
||||
## Missing file system capabilities
|
||||
## Impossible
|
||||
|
||||
# Health Check
|
||||
## Start
|
||||
## Start Failure
|
||||
## Check Selection
|
||||
## Detail view
|
||||
## Result view
|
||||
## Fix Application
|
||||
|
||||
# Preferences
|
||||
## General
|
||||
## Interface
|
||||
## Volume
|
||||
## Updates
|
||||
|
||||
## Contribution
|
||||
#<-- Add entries for donations and code/translation/documentation contribution -->
|
||||
|
||||
## About
|
||||
|
||||
# Vault Statistics
|
||||
## Read
|
||||
## Write
|
||||
|
||||
## Accesses
|
||||
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
### Locked
|
||||
### Unlocked
|
||||
### Missing
|
||||
### Needs Migration
|
||||
### Error
|
||||
|
||||
# Wrong File Alert
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
|
||||
## Mount
|
||||
## Master Key
|
||||
## Hub
|
||||
|
||||
# Recovery Key
|
||||
## Display Recovery Key
|
||||
## Reset Password
|
||||
### Enter Recovery Key
|
||||
### Reset Password
|
||||
### Recovery Key Password Reset Success
|
||||
|
||||
# Convert Vault
|
||||
|
||||
# New Password
|
||||
|
||||
# Quit
|
||||
|
||||
# Forced Quit
|
||||
|
||||
# Update Reminder
|
||||
|
||||
#Dokany Support End
|
||||
|
||||
# Share Vault
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=启用调试日志
|
||||
preferences.general.debugDirectory=显示日志文件
|
||||
preferences.general.autoStart=开机自动启动
|
||||
preferences.general.keychainBackend=存储密码方式
|
||||
preferences.general.quickAccessService=将已解锁的保险库添加到快速访问区域
|
||||
## Interface
|
||||
preferences.interface=用户界面
|
||||
preferences.interface.theme=界面外观
|
||||
|
||||
@@ -287,7 +287,6 @@ preferences.general.debugLogging=啟用除錯日誌
|
||||
preferences.general.debugDirectory=顯示日誌檔
|
||||
preferences.general.autoStart=系統啟動時同時啟動 Cryptomator
|
||||
preferences.general.keychainBackend=儲存密碼使用
|
||||
preferences.general.quickAccessService=將已解鎖的檔案庫加入快捷工具區
|
||||
## Interface
|
||||
preferences.interface=介面
|
||||
preferences.interface.theme=外觀
|
||||
@@ -542,9 +541,6 @@ updateReminder.yesOnce=是,僅一次
|
||||
updateReminder.yesAutomatically=是,自動
|
||||
|
||||
#Dokany Support End
|
||||
dokanySupportEnd.title=棄用通知
|
||||
dokanySupportEnd.message=對Dokany檔案系統結束支援
|
||||
dokanySupportEnd.description=Cryptomator 不再支援 Dokany 檔案系統。已將您的設定調整為使用預設的檔案系統類型。您可以在偏好設定中查看預設的檔案系統類型。
|
||||
dokanySupportEnd.preferencesBtn=開啟偏好設定
|
||||
|
||||
# Share Vault
|
||||
|
||||
Reference in New Issue
Block a user