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