Compare commits

..
Author SHA1 Message Date
Jan-Peter Klein 1bc256c6d5 implemented input validation 2025-03-04 15:23:01 +01:00
Jan-Peter Klein f3581c5acf implemented NetworkSettingsJson 2024-07-02 16:39:33 +02:00
Jan-Peter Klein 506827ffef preferences network mockup 2024-06-28 12:59:12 +02:00
63 changed files with 451 additions and 685 deletions
-3
View File
@@ -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:
+6 -6
View File
@@ -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
+6 -6
View File
@@ -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:
+7 -12
View File
@@ -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:
@@ -32,20 +32,20 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
- os: macos-12 - os: macos-11
architecture: x64 architecture: x64
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
+5 -5
View File
@@ -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
View File
@@ -2,7 +2,7 @@
<configuration default="false" name="Cryptomator Windows" type="Application" factoryName="Application"> <configuration default="false" name="Cryptomator Windows" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" /> <option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
<module name="cryptomator" /> <module name="cryptomator" />
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath=&quot;@{appdata}/Cryptomator/settings.json;@{userhome}/AppData/Roaming/Cryptomator/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;@{localappdata}/Cryptomator/ipc.socket&quot; -Dcryptomator.logDir=&quot;@{localappdata}/Cryptomator&quot; -Dcryptomator.pluginDir=&quot;@{appdata}/Cryptomator/Plugins&quot; -Dcryptomator.integrationsWin.keychainPaths=&quot;@{appdata}/Cryptomator/keychain.json;@{userhome}/AppData/Roaming/Cryptomator/keychain.json&quot; -Dcryptomator.p12Path=&quot;@{appdata}/Cryptomator/key.p12;@{userhome}/AppData/Roaming/Cryptomator/key.p12&quot; -Dcryptomator.mountPointsDir=&quot;@{userhome}/Cryptomator&quot; -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=&quot;@{appdata}/Cryptomator/settings.json;@{userhome}/AppData/Roaming/Cryptomator/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;@{localappdata}/Cryptomator/ipc.socket&quot; -Dcryptomator.logDir=&quot;@{localappdata}/Cryptomator&quot; -Dcryptomator.pluginDir=&quot;@{appdata}/Cryptomator/Plugins&quot; -Dcryptomator.integrationsWin.keychainPaths=&quot;@{appdata}/Cryptomator/keychain.json;@{userhome}/AppData/Roaming/Cryptomator/keychain.json&quot; -Dcryptomator.p12Path=&quot;@{appdata}/Cryptomator/key.p12;@{userhome}/AppData/Roaming/Cryptomator/key.p12&quot; -Dcryptomator.mountPointsDir=&quot;@{userhome}/Cryptomator&quot; -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
View File
@@ -2,7 +2,7 @@
<configuration default="false" name="Cryptomator Windows Dev" type="Application" factoryName="Application"> <configuration default="false" name="Cryptomator Windows Dev" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" /> <option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
<module name="cryptomator" /> <module name="cryptomator" />
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath=&quot;@{appdata}/Cryptomator-Dev/settings.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;@{localappdata}/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;@{localappdata}/Cryptomator-Dev&quot; -Dcryptomator.pluginDir=&quot;@{appdata}/Cryptomator-Dev/Plugins&quot; -Dcryptomator.integrationsWin.keychainPaths=&quot;@{appdata}/Cryptomator-Dev/keychain.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/keychain.json&quot; -Dcryptomator.p12Path=&quot;@{appdata}/Cryptomator-Dev/key.p12;@{userhome}/AppData/Roaming/Cryptomator-Dev/key.p12&quot; -Dcryptomator.mountPointsDir=&quot;@{userhome}/Cryptomator-Dev&quot; -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=&quot;@{appdata}/Cryptomator-Dev/settings.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;@{localappdata}/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;@{localappdata}/Cryptomator-Dev&quot; -Dcryptomator.pluginDir=&quot;@{appdata}/Cryptomator-Dev/Plugins&quot; -Dcryptomator.integrationsWin.keychainPaths=&quot;@{appdata}/Cryptomator-Dev/keychain.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/keychain.json&quot; -Dcryptomator.p12Path=&quot;@{appdata}/Cryptomator-Dev/key.p12;@{userhome}/AppData/Roaming/Cryptomator-Dev/key.p12&quot; -Dcryptomator.mountPointsDir=&quot;@{userhome}/Cryptomator-Dev&quot; -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>
+2 -1
View File
@@ -31,7 +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.route4me.com/"><img src="https://cryptomator.org/img/sponsors/route4me.svg" alt="Route4Me" height="56"></a></td> <td><a href="https://www.easeus.com/"><img src="https://cryptomator.org/img/sponsors/easeus.png" alt="EaseUS" height="40"></a></td>
<td><a href="https://www.hassmann-it-forensik.de/"><img src="https://cryptomator.org/img/sponsors/hassmannitforensik.png" alt="Hassmann IT-Forensik" height="40"></a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
+5 -5
View File
@@ -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 \
@@ -74,9 +74,6 @@
</content_rating> </content_rating>
<releases> <releases>
<release date="2024-09-17" version="1.14.0">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.14.0</url>
</release>
<release date="2024-06-26" version="1.13.0"> <release date="2024-06-26" version="1.13.0">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.13.0</url> <url type="details">https://github.com/cryptomator/cryptomator/releases/1.13.0</url>
</release> </release>
+1 -2
View File
@@ -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
View File
@@ -1 +0,0 @@
embedded.provisionprofile
-8
View File
@@ -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>
+1 -2
View File
@@ -5,5 +5,4 @@ dmg/
*.dmg *.dmg
license.rtf license.rtf
openjfx-jmods.zip openjfx-jmods.zip
*.jmod *.jmod
Cryptomator.entitlements
+9 -20
View File
@@ -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
+7 -7
View File
@@ -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\" `
+19 -19
View File
@@ -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</cryptomator.cryptofs.version> <cryptomator.cryptofs.version>2.6.9</cryptomator.cryptofs.version>
<cryptomator.integrations.version>1.4.0</cryptomator.integrations.version> <cryptomator.integrations.version>1.3.1</cryptomator.integrations.version>
<cryptomator.integrations.win.version>1.3.0</cryptomator.integrations.win.version> <cryptomator.integrations.win.version>1.2.5</cryptomator.integrations.win.version>
<cryptomator.integrations.mac.version>1.2.4</cryptomator.integrations.mac.version> <cryptomator.integrations.mac.version>1.2.4</cryptomator.integrations.mac.version>
<cryptomator.integrations.linux.version>1.5.0</cryptomator.integrations.linux.version> <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>
-1
View File
@@ -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;
@@ -44,7 +44,7 @@ public class KeychainManager implements KeychainAccessProvider {
} }
@Override @Override
public void storePassphrase(String key, String displayName, CharSequence passphrase, boolean ignored) throws KeychainAccessException { public void storePassphrase(String key, String displayName, CharSequence passphrase) throws KeychainAccessException {
getKeychainOrFail().storePassphrase(key, displayName, passphrase); getKeychainOrFail().storePassphrase(key, displayName, passphrase);
setPassphraseStored(key, true); setPassphraseStored(key, true);
} }
@@ -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
} }
+10
View File
@@ -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>
+2 -1
View File
@@ -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
@@ -136,7 +136,7 @@ unlock.success.revealBtn=Laufwerk anzeigen
## Failure ## Failure
unlock.error.customPath.message=Tresor kann nicht in benutzerdefinierten Pfad eingehängt werden unlock.error.customPath.message=Tresor kann nicht in benutzerdefinierten Pfad eingehängt werden
unlock.error.customPath.description.notSupported=Wenn du weiterhin den benutzerdefinierten Pfad verwenden möchtest, öffne die allgemeinen Einstellungen und wähle einen unterstützten Laufwerkstyp. Andernfalls gehe zu den Tresor-Optionen und wähle einen unterstützten Einhängepunkt. unlock.error.customPath.description.notSupported=Wenn du weiterhin den benutzerdefinierten Pfad verwenden möchtest, öffne die allgemeinen Einstellungen und wähle einen unterstützten Laufwerkstyp. Andernfalls gehe zu den Tresor-Optionen und wähle einen unterstützten Einhängepunkt.
unlock.error.customPath.description.notExists=Der benutzerdefinierte Einhängepfad existiert nicht. Erstelle ihn entweder in deinem lokalen Dateisystem oder ändere ihn in den Tresor-Optionen. unlock.error.customPath.description.notExists=Der benutzerdefinierte Einhängepunkt existiert nicht. Erstelle ihn in deinem lokalen Dateisystem oder ändere ihn in den Tresor-Optionen.
unlock.error.customPath.description.inUse=Der Laufwerksbuchstabe oder benutzerdefinierte Einhängepunkt „%s“ wird bereits verwendet. unlock.error.customPath.description.inUse=Der Laufwerksbuchstabe oder benutzerdefinierte Einhängepunkt „%s“ wird bereits verwendet.
unlock.error.customPath.description.hideawayNotDir=Die temporäre, versteckte Datei „%3$s“, die für das Entsperren verwendet wurde, konnte nicht entfernt werden. Bitte überprüfe die Datei und lösche sie manuell. unlock.error.customPath.description.hideawayNotDir=Die temporäre, versteckte Datei „%3$s“, die für das Entsperren verwendet wurde, konnte nicht entfernt werden. Bitte überprüfe die Datei und lösche sie manuell.
unlock.error.customPath.description.couldNotBeCleaned=Dein Tresor konnte nicht in den Pfad „%s“ eingehängt werden. Bitte versuche es erneut oder wähle einen anderen Pfad aus. unlock.error.customPath.description.couldNotBeCleaned=Dein Tresor konnte nicht in den Pfad „%s“ eingehängt werden. Bitte versuche es erneut oder wähle einen anderen Pfad aus.
@@ -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,9 +541,6 @@ updateReminder.yesOnce=Ja, einmalig
updateReminder.yesAutomatically=Ja, automatisch updateReminder.yesAutomatically=Ja, automatisch
#Dokany Support End #Dokany Support End
dokanySupportEnd.title=Hinweis: nicht mehr verwendet
dokanySupportEnd.message=Ende der Unterstützung für Dokany
dokanySupportEnd.description=Der Laufwerkstyp Dokany wird von Cryptomator nicht weiter unterstützt. Deine Einstellungen wurden angepasst, dass der Standard-Laufwerkstyp verwendet wird. Du kannst den Standardtyp in den Einstellungen anzeigen lassen.
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
@@ -47,7 +47,6 @@ addvaultwizard.new.nameInstruction=Pangalanan ang vault
addvaultwizard.new.namePrompt=Pangalan ng Vault addvaultwizard.new.namePrompt=Pangalan ng Vault
### Location ### Location
addvaultwizard.new.locationInstruction=Saan maaaring ilagay ng Cryptomator ang mga encrypted files ng iyong vault? addvaultwizard.new.locationInstruction=Saan maaaring ilagay ng Cryptomator ang mga encrypted files ng iyong vault?
addvaultwizard.new.locationLoading=Sinusuri ang lokal na filesystem para sa mga default na direktoryo ng cloud storage…
addvaultwizard.new.locationLabel=Storage location addvaultwizard.new.locationLabel=Storage location
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Custom Location addvaultwizard.new.directoryPickerLabel=Custom Location
@@ -142,8 +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.restartRequired.description=Baguhin ang uri ng volume sa mga opsyon sa vault o i-restart ang Cryptomator.
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,22 +155,12 @@ hub.receive.message=Pinoproseso ang tugon…
hub.receive.description=Ang Cryptomator ay tumatanggap at nagpoproseso ng tugon mula sa Hub. Mangyaring maghintay. hub.receive.description=Ang Cryptomator ay tumatanggap at nagpoproseso ng tugon mula sa Hub. Mangyaring maghintay.
### Register Device ### Register Device
hub.register.message=Bagong Device hub.register.message=Bagong Device
hub.register.description=Ito ang unang Hub access mula sa device na ito. Mangyaring irehistro ito gamit ang iyong Account Key.
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
hub.register.legacy.description=Ito ang unang Hub access mula sa device na ito. Mangyaring irehistro ito.
### 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.
@@ -287,7 +274,6 @@ preferences.general.debugLogging=Paganahin ang pag-log ng debug
preferences.general.debugDirectory=Magbunyag ng mga log file preferences.general.debugDirectory=Magbunyag ng mga log file
preferences.general.autoStart=Ilunsad ang Cryptomator sa pagsisimula ng system preferences.general.autoStart=Ilunsad ang Cryptomator sa pagsisimula ng system
preferences.general.keychainBackend=Mag-imbak ng mga password gamit ang preferences.general.keychainBackend=Mag-imbak ng mga password gamit ang
preferences.general.quickAccessService=Magdagdag ng mga naka-unlock na vault sa lugar ng mabilisang pag-access
## Interface ## Interface
preferences.interface=Interface preferences.interface=Interface
preferences.interface.theme=Tingnan at Pakiramdam preferences.interface.theme=Tingnan at Pakiramdam
@@ -304,11 +290,9 @@ preferences.interface.showMinimizeButton=Ipakita ang pindutan ng minimize
preferences.interface.showTrayIcon=Ipakita ang icon ng tray (kailangan i-restart) preferences.interface.showTrayIcon=Ipakita ang icon ng tray (kailangan i-restart)
## Volume ## Volume
preferences.volume=Virtual Drive preferences.volume=Virtual Drive
preferences.volume.type=Default na Uri ng Dami
preferences.volume.type.automatic=Awtomatiko preferences.volume.type.automatic=Awtomatiko
preferences.volume.docsTooltip=Buksan ang dokumentasyon para matuto pa tungkol sa iba't ibang uri ng volume. preferences.volume.docsTooltip=Buksan ang dokumentasyon para matuto pa tungkol sa iba't ibang uri ng volume.
preferences.volume.fuseRestartRequired=Upang mailapat ang mga pagbabago, kailangang i-restart ang Cryptomator. preferences.volume.fuseRestartRequired=Upang mailapat ang mga pagbabago, kailangang i-restart ang Cryptomator.
preferences.volume.tcp.port=Default na TCP Port
preferences.volume.supportedFeatures=Sinusuportahan ng napiling uri ng volume ang mga sumusunod na tampok: preferences.volume.supportedFeatures=Sinusuportahan ng napiling uri ng volume ang mga sumusunod na tampok:
preferences.volume.feature.mountAuto=Awtomatikong pagpili ng mount point preferences.volume.feature.mountAuto=Awtomatikong pagpili ng mount point
preferences.volume.feature.mountToDir=Custom na direktoryo bilang mount point preferences.volume.feature.mountToDir=Custom na direktoryo bilang mount point
@@ -321,13 +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
preferences.updates.checkFailed=Nabigo ang paghahanap ng mga update. Pakisuri ang iyong koneksyon sa internet o subukang muli sa ibang pagkakataon.
preferences.updates.upToDate=Ang Cryptomator ay napapanahon.
## Contribution ## Contribution
preferences.contribute=Suportahan Kami preferences.contribute=Suportahan Kami
@@ -401,7 +378,6 @@ main.vaultDetail.unlockBtn=I-unlock…
main.vaultDetail.unlockNowBtn=I-unlock Ngayon main.vaultDetail.unlockNowBtn=I-unlock Ngayon
main.vaultDetail.optionsBtn=Mga Pagpipilian sa Vault main.vaultDetail.optionsBtn=Mga Pagpipilian sa Vault
main.vaultDetail.passwordSavedInKeychain=Na-save ang password main.vaultDetail.passwordSavedInKeychain=Na-save ang password
main.vaultDetail.share=Ibahagi…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=NAKA-unlock main.vaultDetail.unlockedStatus=NAKA-unlock
main.vaultDetail.accessLocation=Ang mga nilalaman ng iyong vault ay maa-access dito: main.vaultDetail.accessLocation=Ang mga nilalaman ng iyong vault ay maa-access dito:
@@ -456,7 +432,6 @@ vaultOptions.general.startHealthCheckBtn=Simulan ang Health Check
## Mount ## Mount
vaultOptions.mount=Pag-mount vaultOptions.mount=Pag-mount
vaultOptions.mount.info=Buksan ang mga kagustuhan sa virtual drive upang baguhin ang mga default na setting.
vaultOptions.mount.readonly=Basahin lamang vaultOptions.mount.readonly=Basahin lamang
vaultOptions.mount.customMountFlags=Mga custom na naka-mount na flag vaultOptions.mount.customMountFlags=Mga custom na naka-mount na flag
vaultOptions.mount.winDriveLetterOccupied=inookupahan vaultOptions.mount.winDriveLetterOccupied=inookupahan
@@ -466,10 +441,6 @@ vaultOptions.mount.mountPoint.driveLetter=Gumamit ng nakatalagang drive letter
vaultOptions.mount.mountPoint.custom=Gamitin ang napiling direktoryo vaultOptions.mount.mountPoint.custom=Gamitin ang napiling direktoryo
vaultOptions.mount.mountPoint.directoryPickerButton=Mamili… vaultOptions.mount.mountPoint.directoryPickerButton=Mamili…
vaultOptions.mount.mountPoint.directoryPickerTitle=Pumili ng isang direktoryo vaultOptions.mount.mountPoint.directoryPickerTitle=Pumili ng isang direktoryo
vaultOptions.mount.volumeType.default=Default (%s)
vaultOptions.mount.volumeType.restartRequired=Upang magamit ang uri ng volume na ito, kailangang i-restart ang Cryptomator.
vaultOptions.mount.volume.tcp.port=TCP Port
vaultOptions.mount.volume.type=Uri ng Dami
## Master Key ## Master Key
vaultOptions.masterkey=Password vaultOptions.masterkey=Password
vaultOptions.masterkey.changePasswordBtn=Palitan ANG password vaultOptions.masterkey.changePasswordBtn=Palitan ANG password
@@ -542,27 +513,6 @@ updateReminder.yesOnce=Oo, Minsan
updateReminder.yesAutomatically=Oo, Awtomatiko updateReminder.yesAutomatically=Oo, Awtomatiko
#Dokany Support End #Dokany Support End
dokanySupportEnd.title=Paunawa sa paghinto sa paggamit
dokanySupportEnd.message=Pagtatapos ng suporta para sa Dokany
dokanySupportEnd.description=Ang uri ng volume na Dokany ay hindi na sinusuportahan ng Cryptomator. Isinasaayos ang iyong mga setting upang magamit ang default na uri ng volume ngayon. Maaari mong tingnan ang default na uri sa mga kagustuhan.
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.instruction.1=1. Ibahagi ang access ng naka-encrypt na folder ng vault sa pamamagitan ng cloud storage.
shareVault.instruction.2=2. Ibahagi ang password ng vault sa isang secure na paraan.
shareVault.remarkBestPractices=Para sa higit pang impormasyon, tingnan ang mga mungkahi sa pinakamahuhusay na kagawian sa aming mga doc.
shareVault.docsTooltip=Buksan ang dokumentasyon para matuto pa tungkol sa pagbabahagi ng mga vault.
shareVault.hubAd.description=Ang ligtas na paraan upang magtrabaho sa mga koponan
shareVault.hubAd.keyManagement=• Zero-knowledge key management
shareVault.hubAd.authentication=• Malakas na pagpapatunay
shareVault.hubAd.encryption=• End-to-end na pag-encrypt
shareVault.visitHub=Pagbisita ang Cryptomator Hub
shareVault.hub.message=Paano ibahagi ang Hub vault
shareVault.hub.description=Upang maibahagi ang nilalaman ng vault sa isa pang miyembro ng koponan, kailangan mong magsagawa ng dalawang hakbang:
shareVault.hub.instruction.1=1. Ibahagi ang access ng naka-encrypt na folder ng vault sa pamamagitan ng cloud storage.
shareVault.hub.instruction.2=2. Magbigay ng access sa miyembro ng team sa Cryptomator Hub.
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
@@ -15,7 +15,6 @@ generic.button.next=ਅੱਗੇ
generic.button.print=ਪਰਿੰਟ ਕਰੋ generic.button.print=ਪਰਿੰਟ ਕਰੋ
# Error # Error
error.message=ਇੱਕ ਤਰੁੱਟੀ ਆਈ ਹੈ
# Defaults # Defaults
defaults.vault.vaultName=ਵਾਲਟ defaults.vault.vaultName=ਵਾਲਟ
@@ -319,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
+1 -43
View File
@@ -16,7 +16,7 @@ generic.button.print=Tipărește
# Error # Error
error.message=A apărut o eroare error.message=A apărut o eroare
error.description=Cryptomator nu se aștepta să se întâmple asta. Puteți căuta soluții existente pentru această eroare. În cazul in care nu s-a raportat încă, nu ezitați să faceți acest lucru. error.description=Cryptomatorul nu se aștepta să se întâmple asta. Puteți căuta soluții existente pentru această eroare. În cazul in care nu s-a raportat încă, nu ezitați să faceți acest lucru.
error.hyperlink.lookup=Caută soluții pentru această eroare error.hyperlink.lookup=Caută soluții pentru această eroare
error.hyperlink.report=Raportează această eroare error.hyperlink.report=Raportează această eroare
error.technicalDetails=Detalii: error.technicalDetails=Detalii:
@@ -141,9 +141,6 @@ unlock.error.customPath.description.hideawayNotDir=Fișierul ascuns, temporar "%
unlock.error.customPath.description.couldNotBeCleaned=Seiful dvs. nu a putut fi montat în locația ''%s''. Vă rugăm încercați din nou sau alegeți o altă locație. unlock.error.customPath.description.couldNotBeCleaned=Seiful dvs. nu a putut fi montat în locația ''%s''. Vă rugăm încercați din nou sau alegeți o altă locație.
unlock.error.customPath.description.notEmptyDir=Locația personalizată ''%s'' nu este un dosar gol. Vă rugăm alegeți un dosar gol și încercați din nou. unlock.error.customPath.description.notEmptyDir=Locația personalizată ''%s'' nu este un dosar gol. Vă rugăm alegeți un dosar gol și încercați din nou.
unlock.error.customPath.description.generic=Ați selectat o locație de montare personalizată pentru acest seif, dar utilizarea acesteia a eșuat cu mesajul: %2$s unlock.error.customPath.description.generic=Ați selectat o locație de montare personalizată pentru acest seif, dar utilizarea acesteia a eșuat cu mesajul: %2$s
unlock.error.restartRequired.message=Seiful nu a fost putut deschis
unlock.error.restartRequired.description=Schimbați tipul de volum din opțiunile de seif sau reporniți Cryptomator.
unlock.error.title=Deblocarea "%s" a eșuat
## Hub ## Hub
hub.noKeychain.message=Cheia dispozitivului nu a putut fi accesată hub.noKeychain.message=Cheia dispozitivului nu a putut fi accesată
hub.noKeychain.description=Pentru a debloca seifele de tip Hub, este necesară o cheie a dispozitivului, care este securizată prin intermediul unui keychain. Pentru a continua, activați „%s” și selectați un keychain în preferințe. hub.noKeychain.description=Pentru a debloca seifele de tip Hub, este necesară o cheie a dispozitivului, care este securizată prin intermediul unui keychain. Pentru a continua, activați „%s” și selectați un keychain în preferințe.
@@ -157,21 +154,11 @@ hub.receive.message=Se procesează răspunsul…
hub.receive.description=In acest moment Criptomatorul primește și procesează răspunsul de la Hub. Vă rugăm să așteptați. hub.receive.description=In acest moment Criptomatorul primește și procesează răspunsul de la Hub. Vă rugăm să așteptați.
### Register Device ### Register Device
hub.register.message=Dispozitiv nou hub.register.message=Dispozitiv nou
hub.register.description=Acesta este primul acces la Hub de pe acest dispozitiv. Vă rugăm să îl înregistrați folosind cheia de cont.
hub.register.nameLabel=Numele dispozitivului hub.register.nameLabel=Numele dispozitivului
hub.register.invalidAccountKeyLabel=Cheie cont nevalidă
hub.register.registerBtn=Înregistrare
### Register Device Legacy ### Register Device Legacy
hub.register.legacy.occupiedMsg=Numele este deja în uz
hub.register.legacy.description=Acesta este primul acces la Hub de pe acest dispozitiv. Vă rugăm să îl înregistrați folosind cheia de cont.
### Registration Success ### Registration Success
hub.registerSuccess.message=Dispozitiv înregistrat
hub.registerSuccess.description=Dispozitivul dvs. a fost înregistrat cu succes. Acum puteți continua să deblocați seiful dvs.
hub.registerSuccess.unlockBtn=Deblocați hub.registerSuccess.unlockBtn=Deblocați
hub.registerSuccess.legacy.description=Pentru a accesa seiful dispozitivului trebuie să fie autorizat în plus de către proprietarul seifului.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Înregistrarea dispozitivului a eșuat
hub.registerFailed.description.generic=.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Acces respins hub.unauthorized.message=Acces respins
hub.unauthorized.description=Dispozitivul dvs. nu a fost autorizat să acceseze acest seif. Solicitați proprietarului seifului să va autorizeze accesul. hub.unauthorized.description=Dispozitivul dvs. nu a fost autorizat să acceseze acest seif. Solicitați proprietarului seifului să va autorizeze accesul.
@@ -285,7 +272,6 @@ preferences.general.debugLogging=Activează jurnalul de depanare
preferences.general.debugDirectory=Dezvăluie fişierele jurnal preferences.general.debugDirectory=Dezvăluie fişierele jurnal
preferences.general.autoStart=Lansați Cryptomator la pornirea sistemului preferences.general.autoStart=Lansați Cryptomator la pornirea sistemului
preferences.general.keychainBackend=Salvează parolele cu preferences.general.keychainBackend=Salvează parolele cu
preferences.general.quickAccessService=Adăugați seifuri deblocate în zona de acces rapid
## Interface ## Interface
preferences.interface=Interfață preferences.interface=Interfață
preferences.interface.theme=Aspect preferences.interface.theme=Aspect
@@ -302,11 +288,9 @@ preferences.interface.showMinimizeButton=Arată butonul de minimizare
preferences.interface.showTrayIcon=Arată tray icon (necesită repornire) preferences.interface.showTrayIcon=Arată tray icon (necesită repornire)
## Volume ## Volume
preferences.volume=Unitate virtuală preferences.volume=Unitate virtuală
preferences.volume.type=Tip volum implicit
preferences.volume.type.automatic=Automat preferences.volume.type.automatic=Automat
preferences.volume.docsTooltip=Deschideți documentația pentru a afla mai multe despre tipurile diferite de unități de stocare. preferences.volume.docsTooltip=Deschideți documentația pentru a afla mai multe despre tipurile diferite de unități de stocare.
preferences.volume.fuseRestartRequired=Cryptomator trebuie repornit pentru ca modificările să fie aplicate. preferences.volume.fuseRestartRequired=Cryptomator trebuie repornit pentru ca modificările să fie aplicate.
preferences.volume.tcp.port=Port TCP implicit
preferences.volume.supportedFeatures=Tipul de volum selectat suportă următoarele caracteristici: preferences.volume.supportedFeatures=Tipul de volum selectat suportă următoarele caracteristici:
preferences.volume.feature.mountAuto=Selectare punct de montare automat preferences.volume.feature.mountAuto=Selectare punct de montare automat
preferences.volume.feature.mountToDir=Director personalizat ca punct de montaj preferences.volume.feature.mountToDir=Director personalizat ca punct de montaj
@@ -319,12 +303,6 @@ preferences.updates.currentVersion=Versiunea actuală: %s
preferences.updates.autoUpdateCheck=Verificare automată actualizări preferences.updates.autoUpdateCheck=Verificare automată actualizări
preferences.updates.checkNowBtn=Verifică acum preferences.updates.checkNowBtn=Verifică acum
preferences.updates.updateAvailable=Actualizare la versiunea %s disponibilă. preferences.updates.updateAvailable=Actualizare la versiunea %s disponibilă.
preferences.updates.lastUpdateCheck=Ultima verificare: %s
preferences.updates.lastUpdateCheck.never=niciodată
preferences.updates.lastUpdateCheck.recently=recent
preferences.updates.lastUpdateCheck.daysAgo=acum %s zile
preferences.updates.checkFailed=Căutarea actualizărilor a eșuat. Verificați conexiunea la internet sau încercați din nou mai târziu.
preferences.updates.upToDate=Cryptomator este actualizat.
## Contribution ## Contribution
preferences.contribute=Susțineți-ne preferences.contribute=Susțineți-ne
@@ -452,7 +430,6 @@ vaultOptions.general.startHealthCheckBtn=Începe verificarea de sănătate
## Mount ## Mount
vaultOptions.mount=Montare vaultOptions.mount=Montare
vaultOptions.mount.info=Deschideți preferințele drive-ului virtual pentru a modifica setările implicite.
vaultOptions.mount.readonly=Doar citire vaultOptions.mount.readonly=Doar citire
vaultOptions.mount.customMountFlags=Atribute de montare personalizate vaultOptions.mount.customMountFlags=Atribute de montare personalizate
vaultOptions.mount.winDriveLetterOccupied=ocupat vaultOptions.mount.winDriveLetterOccupied=ocupat
@@ -462,9 +439,6 @@ vaultOptions.mount.mountPoint.driveLetter=Utilizați litera de unitate atribuit
vaultOptions.mount.mountPoint.custom=Folosește directorul ales vaultOptions.mount.mountPoint.custom=Folosește directorul ales
vaultOptions.mount.mountPoint.directoryPickerButton=Alege… vaultOptions.mount.mountPoint.directoryPickerButton=Alege…
vaultOptions.mount.mountPoint.directoryPickerTitle=Alege un director vaultOptions.mount.mountPoint.directoryPickerTitle=Alege un director
vaultOptions.mount.volumeType.default=Implicit (%s)
vaultOptions.mount.volumeType.restartRequired=Cryptomator trebuie repornit pentru ca modificările să fie aplicate.
vaultOptions.mount.volume.tcp.port=Portul TCP
## Master Key ## Master Key
vaultOptions.masterkey=Parolă vaultOptions.masterkey=Parolă
vaultOptions.masterkey.changePasswordBtn=Schimbați parola vaultOptions.masterkey.changePasswordBtn=Schimbați parola
@@ -537,22 +511,6 @@ updateReminder.yesOnce=Da, o dată
updateReminder.yesAutomatically=Da, automat updateReminder.yesAutomatically=Da, automat
#Dokany Support End #Dokany Support End
dokanySupportEnd.description=Tipul de volum Dokany nu mai este suportat de Criptomator. Setările dvs. sunt ajustate pentru a utiliza acum tipul de volum implicit. Puteți vizualiza tipul implicit din preferințe.
dokanySupportEnd.preferencesBtn=Deschideţi preferinţele dokanySupportEnd.preferencesBtn=Deschideţi preferinţele
# Share Vault # Share Vault
shareVault.title=Partajare seif
shareVault.message=Doriți să vă împărtășiți seiful cu ceilalți?
shareVault.description=Fiți întotdeauna precauți când împărtășiți seiful cu alte persoane. Pe scurt, urmați acești pași:
shareVault.instruction.1=1. Partajarea accesului la folderul criptat din seif prin stocarea în cloud.
shareVault.instruction.2=2. Partajează parola seifului într-un mod sigur.
shareVault.remarkBestPractices=Pentru mai multe informații, consultați cele mai bune practici sugerate în documentele noastre.
shareVault.hubAd.description=Modul securizat de a lucra în echipe
shareVault.hubAd.keyManagement=• Managementul cheie al cunoașterii spațiale
shareVault.hubAd.authentication=• Autentificare puternică
shareVault.hubAd.encryption=• Criptare în ambele părți
shareVault.visitHub=Vizitează Hub pentru Criptomator
shareVault.hub.description=Pentru a partaja conținutul de seif cu un alt membru al echipei, trebuie să efectuați doi pași:
shareVault.hub.instruction.1=1. Partajarea accesului la folderul criptat din seif prin stocarea în cloud.
shareVault.hub.instruction.2=2. Acordă acces membrului echipei din hub-ul Cryptomator.
+24 -25
View File
@@ -15,8 +15,8 @@ generic.button.next=Далее
generic.button.print=Печать generic.button.print=Печать
# Error # Error
error.message=Произошла ошибка error.message=Ошибка: %s
error.description=Произошла непредвиденная ситуация. Попробуйте найти уже имеющиеся решения этой ошибки. Если об этой ошибке ещё не сообщали, то сделайте это сами. error.description=Произошла непредвиденная ситуация. Попробуйте найти уже имеющиеся решения этой ошибки. Если об этой ошибке ещё не сообщали, то сообщите вы.
error.hyperlink.lookup=Найти ошибку error.hyperlink.lookup=Найти ошибку
error.hyperlink.report=Сообщить об ошибке error.hyperlink.report=Сообщить об ошибке
error.technicalDetails=Подробности: error.technicalDetails=Подробности:
@@ -47,7 +47,7 @@ addvaultwizard.new.nameInstruction=Выберите имя для хранили
addvaultwizard.new.namePrompt=Имя хранилища addvaultwizard.new.namePrompt=Имя хранилища
### Location ### Location
addvaultwizard.new.locationInstruction=Где Cryptomator должен хранить зашифрованные файлы хранилища? addvaultwizard.new.locationInstruction=Где Cryptomator должен хранить зашифрованные файлы хранилища?
addvaultwizard.new.locationLoading=Поиск в локальной файловой системе облачных каталогов по умолчанию… addvaultwizard.new.locationLoading=Проверка локальной файловой системы на наличие облачных каталогов по умолчанию…
addvaultwizard.new.locationLabel=Место хранения addvaultwizard.new.locationLabel=Место хранения
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Другое место addvaultwizard.new.directoryPickerLabel=Другое место
@@ -92,7 +92,7 @@ addvault.new.readme.accessLocation.2=Это место доступа к ваш
addvault.new.readme.accessLocation.3=Любые файлы, добавленные в этот том, будут зашифрованы Cryptomator. Вы можете работать с ним как с любым другим диском или папкой. Здесь отображается только расшифрованное содержимое тома, ваши файлы остаются зашифрованными на жёстком диске постоянно. addvault.new.readme.accessLocation.3=Любые файлы, добавленные в этот том, будут зашифрованы Cryptomator. Вы можете работать с ним как с любым другим диском или папкой. Здесь отображается только расшифрованное содержимое тома, ваши файлы остаются зашифрованными на жёстком диске постоянно.
addvault.new.readme.accessLocation.4=Этот файл можно удалить. addvault.new.readme.accessLocation.4=Этот файл можно удалить.
## Existing ## Existing
addvaultwizard.existing.title=Добавить имеющееся хранилище addvaultwizard.existing.title=Добавить существующее хранилище
addvaultwizard.existing.instruction=Выберите файл "vault.cryptomator" существующего хранилища. Если имеется только файл "masterkey.cryptomator", выберите его. addvaultwizard.existing.instruction=Выберите файл "vault.cryptomator" существующего хранилища. Если имеется только файл "masterkey.cryptomator", выберите его.
addvaultwizard.existing.chooseBtn=Выбрать… addvaultwizard.existing.chooseBtn=Выбрать…
addvaultwizard.existing.filePickerTitle=Выберите файл хранилища addvaultwizard.existing.filePickerTitle=Выберите файл хранилища
@@ -104,7 +104,7 @@ addvaultwizard.success.unlockNow=Разблокировать
# Remove Vault # Remove Vault
removeVault.title=Удалить "%s" removeVault.title=Удалить "%s"
removeVault.message=Удалить хранилище? removeVault.message=Удалить хранилище?
removeVault.description=Cryptomator просто забудет это хранилище. Позже вы можете добавить его снова. Зашифрованные файлы не будут удалены с диска. removeVault.description=Cryptomator просто забудет это хранилище. Позже вы можете добавить его снова. Зашифрованные файлы не будут удалены с жёсткого диска.
removeVault.confirmBtn=Удалить хранилище removeVault.confirmBtn=Удалить хранилище
# Change Password # Change Password
@@ -129,18 +129,18 @@ unlock.chooseMasterkey.description=Не удалось найти файл ма
unlock.chooseMasterkey.filePickerTitle=Выберите файл MasterKey unlock.chooseMasterkey.filePickerTitle=Выберите файл MasterKey
unlock.chooseMasterkey.filePickerMimeDesc=Мастер-ключ Cryptomator unlock.chooseMasterkey.filePickerMimeDesc=Мастер-ключ Cryptomator
## Success ## Success
unlock.success.message=Успешно разблокировано unlock.success.message=Разблокировка прошла успешно
unlock.success.description=Содержимое хранилища "%s" теперь доступно через его точку монтирования. unlock.success.description=Разблокировка "%s" успешно выполнена! Доступ в хранилище открыт через его виртуальный диск.
unlock.success.rememberChoice=Запомнить выбор и больше не спрашивать unlock.success.rememberChoice=Запомнить выбор и больше не спрашивать
unlock.success.revealBtn=Показать диск unlock.success.revealBtn=Показать диск
## Failure ## Failure
unlock.error.customPath.message=Невозможно смонтировать хранилище к указанному пути unlock.error.customPath.message=Невозможно смонтировать хранилище по указанному пути
unlock.error.customPath.description.notSupported=Если вы хотите продолжить использование указанного пути, перейдите в настройки и выберите тип тома, который его поддерживает. В противном случае перейдите в настройки хранилища и выберите поддерживаемую точку монтирования. unlock.error.customPath.description.notSupported=Если вы хотите продолжить использование пользовательского пути, перейдите в настройки и выберите тип тома, который его поддерживает. В противном случае, перейдите в настройки хранилища и выберите поддерживаемую точку монтирования.
unlock.error.customPath.description.notExists=Указанный путь монтирования не существует. Либо создайте его в локальной файловой системе, либо измените в параметрах хранилища. unlock.error.customPath.description.notExists=Пользовательский путь монтирования не существует. Либо создайте его в локальной файловой системе, либо измените в параметрах хранилища.
unlock.error.customPath.description.inUse=Буква диска или путь монтирования "%s" уже используется. unlock.error.customPath.description.inUse=Буква диска или путь монтирования "%s" уже используется.
unlock.error.customPath.description.hideawayNotDir=Временный скрытый файл "%3$s" используется для разблокировки и не может быть удалён. Проверьте файл и затем удалите его вручную. unlock.error.customPath.description.hideawayNotDir=Временный скрытый файл "%3$s" используется для разблокировки и не может быть удалён. Проверьте файл и затем удалите его вручную.
unlock.error.customPath.description.couldNotBeCleaned=Хранилище не может быть смонтировано к пути "%s". Попробуйте ещё раз или выберите другой путь. unlock.error.customPath.description.couldNotBeCleaned=Хранилище не может быть смонтировано к пути "%s". Попробуйте ещё раз или выберите другой путь.
unlock.error.customPath.description.notEmptyDir=Путь монтирования "%s" - не пустая папка. Выберите пустую папку и повторите попытку. unlock.error.customPath.description.notEmptyDir=Путь монтирования "%s" не пустая папка. Выберите пустую папку и повторите попытку.
unlock.error.customPath.description.generic=Выбранный вами путь монтирования для хранилища не удалось использовать: %2$s unlock.error.customPath.description.generic=Выбранный вами путь монтирования для хранилища не удалось использовать: %2$s
unlock.error.restartRequired.message=Невозможно разблокировать хранилище unlock.error.restartRequired.message=Невозможно разблокировать хранилище
unlock.error.restartRequired.description=Измените тип тома в настройках хранилища или перезапустите Cryptomator. unlock.error.restartRequired.description=Измените тип тома в настройках хранилища или перезапустите Cryptomator.
@@ -205,7 +205,7 @@ migration.start.remarkUndone=Это обновление не может быт
migration.start.remarkVersions=Старые версии Cryptomator не смогут открыть обновлённое хранилище. migration.start.remarkVersions=Старые версии Cryptomator не смогут открыть обновлённое хранилище.
migration.start.remarkCanRun=Вы должны быть уверены, что все устройства, с которых у вас есть доступ к хранилищу, могут запускать эту версию Cryptomator. migration.start.remarkCanRun=Вы должны быть уверены, что все устройства, с которых у вас есть доступ к хранилищу, могут запускать эту версию Cryptomator.
migration.start.remarkSynced=Вы должны быть уверены, что хранилище перед обновлением полностью синхронизировано на этом и на других ваших устройствах. migration.start.remarkSynced=Вы должны быть уверены, что хранилище перед обновлением полностью синхронизировано на этом и на других ваших устройствах.
migration.start.confirm=Информация выше прочитана и понятна migration.start.confirm=Мной прочитана и понята информация выше
## Run ## Run
migration.run.enterPassword=Введите пароль для "%s" migration.run.enterPassword=Введите пароль для "%s"
migration.run.startMigrationBtn=Перенести хранилище migration.run.startMigrationBtn=Перенести хранилище
@@ -233,7 +233,7 @@ health.intro.text=Проверка состояния это набор тест
health.intro.remarkSync=Убедитесь, что все устройства полностью синхронизированы, это решает большинство проблем. health.intro.remarkSync=Убедитесь, что все устройства полностью синхронизированы, это решает большинство проблем.
health.intro.remarkFix=Не все проблемы могут быть исправлены. health.intro.remarkFix=Не все проблемы могут быть исправлены.
health.intro.remarkBackup=Если данные повреждены, помочь может только резервная копия. health.intro.remarkBackup=Если данные повреждены, помочь может только резервная копия.
health.intro.affirmation=Информация выше прочитана и понятна health.intro.affirmation=Информация выше мною прочитана и понятна
## Start Failure ## Start Failure
health.fail.header=Ошибка при загрузке конфигурации хранилища health.fail.header=Ошибка при загрузке конфигурации хранилища
health.fail.ioError=Ошибка при доступе и чтении конфигурационного файла. health.fail.ioError=Ошибка при доступе и чтении конфигурационного файла.
@@ -254,7 +254,7 @@ health.check.detail.checkFinishedAndFound=Проверка завершена.
health.check.detail.checkFailed=Проверка прервана из-за ошибки. health.check.detail.checkFailed=Проверка прервана из-за ошибки.
health.check.detail.checkCancelled=Проверка была отменена. health.check.detail.checkCancelled=Проверка была отменена.
health.check.detail.listFilters.label=Фильтр health.check.detail.listFilters.label=Фильтр
health.check.detail.fixAllSpecificBtn=Исправить все health.check.detail.fixAllSpecificBtn=Исправить все типы
health.check.exportBtn=Экспорт отчёта health.check.exportBtn=Экспорт отчёта
## Result view ## Result view
health.result.severityFilter.all=Уровень - все health.result.severityFilter.all=Уровень - все
@@ -266,9 +266,9 @@ health.result.severityTip.good=Уровень: Хорошо\nКорректна
health.result.severityTip.info=Уровень: Информация\nСтруктура хранилища не повреждена, предложено исправление. health.result.severityTip.info=Уровень: Информация\nСтруктура хранилища не повреждена, предложено исправление.
health.result.severityTip.warn=Уровень: Предупреждение\nСтруктура хранилища повреждена, срочно требуется исправление. health.result.severityTip.warn=Уровень: Предупреждение\nСтруктура хранилища повреждена, срочно требуется исправление.
health.result.severityTip.crit=Уровень: Критический\nСтруктура хранилища повреждена, обнаружена потеря данных. health.result.severityTip.crit=Уровень: Критический\nСтруктура хранилища повреждена, обнаружена потеря данных.
health.result.fixStateFilter.all=Исправление - Все health.result.fixStateFilter.all=Исправить состояние - Все
health.result.fixStateFilter.fixable=Возможно исправление health.result.fixStateFilter.fixable=Возможно исправление
health.result.fixStateFilter.notFixable=Неисправимо health.result.fixStateFilter.notFixable=Исправление невозможно
health.result.fixStateFilter.fixing=Исправление… health.result.fixStateFilter.fixing=Исправление…
health.result.fixStateFilter.fixed=Исправлено health.result.fixStateFilter.fixed=Исправлено
health.result.fixStateFilter.fixFailed=Исправить не удалось health.result.fixStateFilter.fixFailed=Исправить не удалось
@@ -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=Отображение
@@ -325,7 +324,7 @@ preferences.updates.lastUpdateCheck=Последняя проверка: %s
preferences.updates.lastUpdateCheck.never=никогда preferences.updates.lastUpdateCheck.never=никогда
preferences.updates.lastUpdateCheck.recently=недавно preferences.updates.lastUpdateCheck.recently=недавно
preferences.updates.lastUpdateCheck.daysAgo=%s дн. назад preferences.updates.lastUpdateCheck.daysAgo=%s дн. назад
preferences.updates.lastUpdateCheck.hoursAgo=%s ч назад preferences.updates.lastUpdateCheck.hoursAgo=%s часов назад
preferences.updates.checkFailed=Ошибка поиска обновлений. Проверьте подключение к Интернету и повторите попытку. preferences.updates.checkFailed=Ошибка поиска обновлений. Проверьте подключение к Интернету и повторите попытку.
preferences.updates.upToDate=У вас новейшая версия Cryptomator. preferences.updates.upToDate=У вас новейшая версия Cryptomator.
@@ -391,7 +390,7 @@ 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.menuItemNew=Новое хранилище...
main.vaultlist.addVaultBtn.menuItemExisting=Имеющееся хранилище... main.vaultlist.addVaultBtn.menuItemExisting=Существующее хранилище...
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Благодарим за выбор Cryptomator для защиты ваших файлов. Если требуется помощь, ознакомьтесь с документацией по началу работы: main.vaultDetail.welcomeOnboarding=Благодарим за выбор Cryptomator для защиты ваших файлов. Если требуется помощь, ознакомьтесь с документацией по началу работы:
@@ -416,7 +415,7 @@ main.vaultDetail.throughput.mbps=%.1f МиБ/с
main.vaultDetail.stats=Статистика хранилища main.vaultDetail.stats=Статистика хранилища
main.vaultDetail.locateEncryptedFileBtn=Найти зашифрованный файл main.vaultDetail.locateEncryptedFileBtn=Найти зашифрованный файл
main.vaultDetail.locateEncryptedFileBtn.tooltip=Выберите файл из своего хранилища, чтобы найти его зашифрованный дубликат main.vaultDetail.locateEncryptedFileBtn.tooltip=Выберите файл из своего хранилища, чтобы найти его зашифрованный дубликат
main.vaultDetail.encryptedPathsCopied=Пути скопированы в буфер обмена. main.vaultDetail.encryptedPathsCopied=Пути скопированы в буфер обмена!
main.vaultDetail.filePickerTitle=Выберите файл внутри хранилища main.vaultDetail.filePickerTitle=Выберите файл внутри хранилища
### Missing ### Missing
main.vaultDetail.missing.info=Cryptomator не смог найти хранилище по этому пути. main.vaultDetail.missing.info=Cryptomator не смог найти хранилище по этому пути.
@@ -427,7 +426,7 @@ 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.info=Произошла ошибка при загрузке хранилища с диска.
main.vaultDetail.error.reload=Перезагрузить main.vaultDetail.error.reload=Перезагрузить
main.vaultDetail.error.windowTitle=Ошибка загрузки хранилища main.vaultDetail.error.windowTitle=Ошибка загрузки хранилища
@@ -456,7 +455,7 @@ vaultOptions.general.startHealthCheckBtn=Начать проверку сост
## Mount ## Mount
vaultOptions.mount=Монтирование vaultOptions.mount=Монтирование
vaultOptions.mount.info=Откройте настройки виртуального диска, чтобы изменить параметры по умолчанию. vaultOptions.mount.info=Откройте настройки виртуального диска, чтобы изменить настройки по умолчанию.
vaultOptions.mount.readonly=Только чтение vaultOptions.mount.readonly=Только чтение
vaultOptions.mount.customMountFlags=Другие флаги монтирования vaultOptions.mount.customMountFlags=Другие флаги монтирования
vaultOptions.mount.winDriveLetterOccupied=занято vaultOptions.mount.winDriveLetterOccupied=занято
@@ -474,7 +473,7 @@ vaultOptions.mount.volume.type=Тип тома
vaultOptions.masterkey=Пароль vaultOptions.masterkey=Пароль
vaultOptions.masterkey.changePasswordBtn=Изменить пароль vaultOptions.masterkey.changePasswordBtn=Изменить пароль
vaultOptions.masterkey.forgetSavedPasswordBtn=Забыть сохранённый пароль vaultOptions.masterkey.forgetSavedPasswordBtn=Забыть сохранённый пароль
vaultOptions.masterkey.recoveryKeyExplanation=При утере пароля вернуть доступ к хранилищу можно только с помощью ключа восстановления. vaultOptions.masterkey.recoveryKeyExplanation=При утере пароля восстановить доступ к хранилищу можно только с помощью ключа восстановления.
vaultOptions.masterkey.showRecoveryKeyBtn=Показать ключ восстановления vaultOptions.masterkey.showRecoveryKeyBtn=Показать ключ восстановления
vaultOptions.masterkey.recoverPasswordBtn=Сброс пароля vaultOptions.masterkey.recoverPasswordBtn=Сброс пароля
## Hub ## Hub
@@ -486,7 +485,7 @@ vaultOptions.hub.convertBtn=Преобразовать в хранилище с
## Display Recovery Key ## Display Recovery Key
recoveryKey.display.title=Показать ключ восстановления 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":
recoveryKey.display.StorageHints=Храните его в надёжном месте, например:\n • в диспетчере паролей\n • на флеш-накопителе USB\n • распечатанным на бумаге recoveryKey.display.StorageHints=Храните его в надёжном месте, например:\n • в диспетчере паролей\n • на флеш-накопителе USB\n • распечатанным на бумаге
## Reset Password ## Reset Password
@@ -562,7 +561,7 @@ shareVault.hubAd.encryption=• Сквозное шифрование
shareVault.visitHub=Посетить хаб Cryptomator shareVault.visitHub=Посетить хаб Cryptomator
shareVault.hub.message=Как поделиться хранилищем в хабе shareVault.hub.message=Как поделиться хранилищем в хабе
shareVault.hub.description=Чтобы поделиться содержимым хранилища с другим членом команды, выполните два шага: shareVault.hub.description=Чтобы поделиться содержимым хранилища с другим членом команды:
shareVault.hub.instruction.1=1. Делитесь доступом к зашифрованной папке хранилища через облако. shareVault.hub.instruction.1=1. Делитесь доступом к зашифрованной папке хранилища через облако.
shareVault.hub.instruction.2=2. Предоставьте доступ члену команды в хабе Cryptomator. shareVault.hub.instruction.2=2. Предоставьте доступ члену команды в хабе Cryptomator.
shareVault.hub.openHub=Открыть хаб Cryptomator shareVault.hub.openHub=Открыть хаб Cryptomator
@@ -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
@@ -71,7 +71,6 @@ unlock.unlockBtn=Odkleni
### Waiting ### Waiting
### Receive Key ### Receive Key
### Register Device ### Register Device
hub.register.registerBtn=Registracija
### Register Device Legacy ### Register Device Legacy
### Registration Success ### Registration Success
hub.registerSuccess.unlockBtn=Odkleni hub.registerSuccess.unlockBtn=Odkleni
@@ -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
@@ -287,7 +287,6 @@ preferences.general.debugLogging=Hata ayıklama günlüğünü etkinleştir
preferences.general.debugDirectory=Kayıt dosyalarını göster preferences.general.debugDirectory=Kayıt dosyalarını göster
preferences.general.autoStart=Cryptomator'u sistem başlangıcında çalıştır preferences.general.autoStart=Cryptomator'u sistem başlangıcında çalıştır
preferences.general.keychainBackend=Şifreleri şununla depola: preferences.general.keychainBackend=Şifreleri şununla depola:
preferences.general.quickAccessService=Hızlı erişim alanına kilidi açılmış kasaları ekle
## Interface ## Interface
preferences.interface=Arayüz preferences.interface=Arayüz
preferences.interface.theme=Görünüş ve Davranış preferences.interface.theme=Görünüş ve Davranış
@@ -446,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ı vaultOptions.general.unlockAfterStartup=Cryptomator başlatıldığında kasayı
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
@@ -542,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
@@ -22,7 +22,7 @@ error.hyperlink.lookup=Дізнатися більше про цю помилк
error.hyperlink.report=Повідомити про цю помилку error.hyperlink.report=Повідомити про цю помилку
error.technicalDetails=Докладно: error.technicalDetails=Докладно:
error.existingSolutionDescription=Cryptomator не очікував, що це станеться. Але ми знайшли спосіб розв'язання цієї проблеми. Ознайомтесь з ним, будь ласка, далі. error.existingSolutionDescription=Cryptomator не очікував, що це станеться. Але ми знайшли спосіб розв'язання цієї проблеми. Ознайомтесь з ним, будь ласка, далі.
error.hyperlink.solution=Ознайомтесь із рішенням error.hyperlink.solution=Знайдіть рішення
error.lookupPermissionMessage=Cryptomator може спробувати знайти спосіб розв'язання цієї проблеми онлайн. Це передбачає відправку запиту до нашої бази даних проблем з вашої ІР. error.lookupPermissionMessage=Cryptomator може спробувати знайти спосіб розв'язання цієї проблеми онлайн. Це передбачає відправку запиту до нашої бази даних проблем з вашої ІР.
error.dismiss=Відхилити error.dismiss=Відхилити
error.lookUpSolution=Пошук рішення error.lookUpSolution=Пошук рішення
@@ -288,7 +288,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=Колір і стиль
@@ -543,9 +542,6 @@ updateReminder.yesOnce=Так, лише раз
updateReminder.yesAutomatically=Так, автоматично 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
@@ -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
@@ -3,7 +3,7 @@
# Generics # Generics
## Button ## Button
generic.button.apply=应用 generic.button.apply=应用
generic.button.back=后退 generic.button.back=返回
generic.button.cancel=取消 generic.button.cancel=取消
generic.button.change=更改 generic.button.change=更改
generic.button.choose=选择... generic.button.choose=选择...
@@ -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=界面外观
@@ -6,7 +6,7 @@ generic.button.apply=套用
generic.button.back=上一頁 generic.button.back=上一頁
generic.button.cancel=取消 generic.button.cancel=取消
generic.button.change=修改 generic.button.change=修改
generic.button.choose=選擇… generic.button.choose=选择...
generic.button.close=關閉 generic.button.close=關閉
generic.button.copy=複製 generic.button.copy=複製
generic.button.copied=已複製! generic.button.copied=已複製!
@@ -208,7 +208,7 @@ migration.start.remarkSynced=您必須確保您的檔案庫在升級之前已經
migration.start.confirm=我已閱讀並理解上述資訊 migration.start.confirm=我已閱讀並理解上述資訊
## Run ## Run
migration.run.enterPassword=輸入 "%s" 的密碼 migration.run.enterPassword=輸入 "%s" 的密碼
migration.run.startMigrationBtn=移加密檔案庫 migration.run.startMigrationBtn=移加密檔案庫
migration.run.progressHint=這可能需要一點時間… migration.run.progressHint=這可能需要一點時間…
## Success ## Success
migration.success.nextStepsInstructions=已成功升級 "%s"。\n您現在可以解鎖您的加密檔案庫了。 migration.success.nextStepsInstructions=已成功升級 "%s"。\n您現在可以解鎖您的加密檔案庫了。
@@ -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
@@ -5,7 +5,6 @@
*******************************************************************************/ *******************************************************************************/
package org.cryptomator.common.keychain; package org.cryptomator.common.keychain;
import org.cryptomator.integrations.keychain.KeychainAccessException;
import org.cryptomator.integrations.keychain.KeychainAccessProvider; import org.cryptomator.integrations.keychain.KeychainAccessProvider;
import java.util.HashMap; import java.util.HashMap;
@@ -21,7 +20,7 @@ class MapKeychainAccess implements KeychainAccessProvider {
} }
@Override @Override
public void storePassphrase(String key, String displayName,CharSequence passphrase, boolean ignored) { public void storePassphrase(String key, String displayName,CharSequence passphrase) {
char[] pw = new char[passphrase.length()]; char[] pw = new char[passphrase.length()];
for (int i = 0; i < passphrase.length(); i++) { for (int i = 0; i < passphrase.length(); i++) {
pw[i] = passphrase.charAt(i); pw[i] = passphrase.charAt(i);
@@ -40,7 +39,7 @@ class MapKeychainAccess implements KeychainAccessProvider {
} }
@Override @Override
public void changePassphrase(String key, String displayName, CharSequence passphrase) throws KeychainAccessException { public void changePassphrase(String key, String displayName, CharSequence passphrase) {
map.get(key); map.get(key);
storePassphrase(key, displayName, passphrase); storePassphrase(key, displayName, passphrase);
} }