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
Armin Schrenk d6fd012f71 fix av whitelisting step in win-exe workflow 2024-06-26 13:28:37 +02:00
Armin Schrenk d9d8c84230 adjust formatting of metainfo file 2024-06-26 13:23:38 +02:00
Julian Raufelder 1ad2cc3ee5 Update to JDK 22 2024-06-26 11:57:17 +02:00
Armin Schrenk 2eac09f6be [ci skip] Merge branch 'main' into develop 2024-06-26 10:29:47 +02:00
Armin Schrenk 4114ea6163 Merge branch 'release/1.13.0' 2024-06-26 10:29:15 +02:00
Armin Schrenk 82da9f7a88 finalize release 2024-06-26 10:27:29 +02:00
Armin Schrenk aa08046c4d Merge branch 'develop' into release/1.13.0 2024-06-21 15:18:39 +02:00
Armin Schrenk b6d7f63470 [ci skip] also sign binaries from CraC project (dammn zulu jdk) 2024-06-21 15:10:47 +02:00
Armin Schrenk 624d18238c Merge branch 'develop' into release/1.13.0 2024-06-21 14:38:38 +02:00
Armin Schrenk 3bfe2b7a9e fix Windows build 2024-06-21 14:38:17 +02:00
Armin Schrenk ba79cd0f8c prepare 1.13.0 2024-06-21 11:55:54 +02:00
Armin Schrenk be63ea1104 Closes #3439 2024-06-21 11:51:49 +02:00
CryptobotandGitHub a3ad2a5677 New Crowdin updates (#3355)
New translations strings.properties

Arabic; Bashkir; Belarusian; Bengali; Bosnian; Bulgarian; Catalan; Chinese Simplified; Chinese Traditional; Chinese Traditional, Hong Kong; Croatian; Czech; Danish; Dutch; Filipino; Finnish; French; Galician; German; Greek; Hebrew; Hindi; Hungarian; Indonesian; Italian; Japanese; Korean; Latvian; Macedonian; Marathi; Norwegian Bokmal; Norwegian Nynorsk; Persian; Polish; Portuguese; Portuguese, Brazilian; Punjabi; Romanian; Russian; Serbian (Cyrillic); Serbian (Latin); Sinhala; Slovak; Slovenian; Spanish; Swahili, Tanzania; Swedish; Tamil; Telugu; Thai; Turkish; Ukrainian; Vietnamese; 

[ci skip]
2024-06-21 11:29:09 +02:00
dependabot[bot]andGitHub 26e5ceea01 Bump the maven-build-plugins group with 2 updates (#3459) 2024-06-21 08:20:05 +00:00
dependabot[bot]andGitHub 83f1c4ea41 Bump org.mockito:mockito-core in the java-test-dependencies group (#3427) 2024-06-21 08:19:43 +00:00
Armin SchrenkandGitHub 8d78e1432a Merge pull request #3454 from cryptomator/feature/jfx22
Feature: Update to jfx22
2024-06-20 14:43:15 +02:00
mindmonkandGitHub d2ec5a5646 Merge pull request #3457 from cryptomator/feature/dokany-info-dialog
Feature: Migrate volume type Dokany to Default one and Display Info Dialog
2024-06-17 12:20:39 +02:00
Jan-Peter Klein 6bb0328799 removed dialog in naming 2024-06-14 14:20:18 +02:00
Jan-Peter Klein 8a8617b480 renamed method and code refactored 2024-06-14 11:07:21 +02:00
Jan-Peter Klein 7484744038 minor text change 2024-06-13 12:06:38 +02:00
Jan-Peter Klein 0bbc4ecae5 refactored code and new method handleDokanySupportEndAndShowDialog 2024-06-13 12:06:18 +02:00
Jan-Peter Klein 9fcb166047 close dialog by click on 'Open Preferences' 2024-06-13 12:04:34 +02:00
Jan-Peter Klein 1ac017e3ab changed dialog prefix 2024-06-13 11:51:01 +02:00
Jan-Peter Klein 1ba401b8e6 changed wording of button and description
primary color for icon
2024-06-12 12:02:40 +02:00
Armin Schrenk 07303b58f7 Merge branch 'develop' into feature/jfx22 2024-06-12 11:16:41 +02:00
Armin SchrenkandGitHub 32a463768c Merge pull request #3456 from purejava/fix-#3453
Workaround for malformed javafx POM. Closes #3453.
2024-06-12 11:14:52 +02:00
Armin Schrenk 2307950e3b add javafx.platform property workaround to other build/ci scripts 2024-06-12 10:58:49 +02:00
Ralph Plawetzki 8108128c22 Temporary work around for JavaFX upstream bug
Occurs with Maven 3.9.7, fixed with Gluon JavaFX 23-ea+20, that contains a fixed parent POM
See https://mail.openjdk.org/pipermail/openjfx-dev/2024-May/047279.html
2024-06-11 19:59:18 +02:00
Jan-Peter Klein 58fe6da7a8 Merge branch 'develop' into feature/dokany-info-dialog 2024-06-11 15:25:23 +02:00
Jan-Peter Klein 92bf73297a add dokany info dialog 2024-06-11 14:43:56 +02:00
Armin Schrenk 0bf8fb39dd Update to javafx 22.0.1 2024-06-07 15:39:42 +02:00
Armin Schrenk 0dc9a3a834 align local build scripts 2024-06-07 14:56:54 +02:00
Armin Schrenk 91d6264b9f ignore downloaded artifact 2024-06-06 12:10:03 +02:00
Armin Schrenk d2599ea525 closes #2656 2024-06-06 12:07:18 +02:00
dependabot[bot]andGitHub 7180af9bc7 Bump the java-production-dependencies group across 1 directory with 9 updates (#3446) 2024-06-03 10:30:50 +00:00
Armin SchrenkandGitHub dc993dc57c fixes #3440 (PR in #3447) 2024-06-03 12:29:54 +02:00
dependabot[bot]andGitHub 464c74ab6c Bump the maven-build-plugins group across 1 directory with 2 updates (#3431) 2024-06-03 09:39:36 +00:00
Armin SchrenkandGitHub 8c7dd8c74f Merge pull request #3435 from cryptomator/feature/jdk22
Feature: JDK22
2024-05-21 16:58:57 +02:00
Armin Schrenk 69bcf6fac6 do not forget to update debian files
(dammn you unflexible launchpad!)
2024-05-21 12:51:01 +02:00
Armin Schrenk 7c243dd434 pin cryptolib version due removed jdk.crypto.ec package 2024-05-16 17:51:04 +02:00
Armin Schrenk 357a0b9c31 closes #3376 2024-05-14 17:58:21 +02:00
Armin Schrenk d69d11b82f update dependencies requiring JDK 22 2024-05-14 17:25:56 +02:00
mindmonkandGitHub 863e9bbcb3 Merge pull request #3362 from cryptomator/feature/update-checker-refactoring
Feature: Expansion of Preferences Update Tab with UI Elements and Refactoring of UpdateChecker
2024-05-10 16:31:26 +02:00
Jan-Peter Klein 1c47012033 undo getter changes 2024-05-10 15:57:04 +02:00
Jan-Peter Klein cd99eaa323 updateAvailable ObservableValue to BooleanBinding 2024-05-10 15:51:41 +02:00
Jan-Peter Klein dda2afda92 refactored ObservableValues to BooleanBindings and code cleanup 2024-05-10 15:45:17 +02:00
Jan-Peter Klein 5519eefcfa cr related changes 2024-05-10 14:55:50 +02:00
Jan-Peter Klein a81352800d removed twoWeeksAgo var 2024-05-08 11:38:23 +02:00
Jan-Peter Klein 6fec16e498 removed unused ui function 2024-05-08 10:57:42 +02:00
Jan-Peter Klein 42f31204a3 removed lastUpdateReminder setting 2024-05-08 09:41:58 +02:00
Jan-Peter Klein 7ab64cfe46 removed lastUpdateReminder setting 2024-05-08 09:05:26 +02:00
Jan-Peter Klein 1581a10c04 removed unused label id 2024-05-08 08:30:06 +02:00
Jan-Peter Klein 249becc25d removed unused instance var 2024-05-08 08:28:53 +02:00
Jan-Peter Klein da8e84f39d removed unnecessary HBox 2024-05-07 13:27:52 +02:00
Jan-Peter Klein 9ad2d223c3 changed BooleanBinding updateAvailable to ObservableValue<Boolean> 2024-05-07 13:23:53 +02:00
Jan-Peter Klein 3bf1e659ef changed checkFailed text wording 2024-05-07 12:41:39 +02:00
Jan-Peter Klein e79257e5ea changed checkFailed property to ObservableValue 2024-05-06 13:46:49 +02:00
Armin Schrenk dac517a6fb update project ot jdk 22
Note: dependency bumps regarding jdk22 compatiblilty are missing!
2024-05-02 16:59:45 +02:00
mindmonkandGitHub 1ab808f1b0 Merge pull request #3414 from MSevenR/feature/double-click-unlocked-vault
Double-click on an Unlocked Vault
2024-05-02 09:31:56 +02:00
Jan-Peter Klein 08f81b7df4 registered module in SettingsJsonTest 2024-04-29 11:12:14 +02:00
Jan-Peter Klein b16f32ca83 introduced new dependency
removed latestVersion from Settings
changed SettingsJson from Date to Instant
new UpdateChecker Property checkFailed
optimized naming
changed wordning
refactoring
2024-04-29 10:34:17 +02:00
MSevenR d6ed88b544 Double-click on an Unlocked Vault
Double-click on an Unlocked Vault in the List to Reveal It
2024-04-26 01:44:45 -05:00
Jan-Peter Klein ae697d7b73 refactor isUpdateSuccessfulAndCurrent to instance variable 2024-04-25 10:54:00 +02:00
Jan-Peter Klein ff3306cc17 removed blank line, unused instance variable, import and Logger
refactored DateTimeFormatter into an instance variable
2024-04-24 15:03:49 +02:00
Armin Schrenk 9ae2f4e0f6 add timezone id to timestamp in settings 2024-04-23 16:12:59 +02:00
Armin Schrenk 4230afcbac refactored timeDiff-message-method to updatePref controller 2024-04-23 16:12:36 +02:00
Armin Schrenk 7fc6ab05a4 use Instant also in UpdateChecker 2024-04-23 15:19:45 +02:00
Armin Schrenk 060f6bfc97 change storage of timestamps in model to Instant 2024-04-23 15:18:37 +02:00
Jan-Peter Klein 919dac6caa refactoring 2024-04-22 16:35:20 +02:00
Jan-Peter Klein 98bcf63b2c remove lastUpdateCheck from Settings; add lastUpdateReminder and lastSuccessfulUpdateCheck
implement updateTimeDifferenceMessage
reorder UI elements
refactor code for clarity and maintainability
2024-04-17 11:40:58 +02:00
Tobias HagemannandGitHub 0585262952 Merge pull request #3395 from purejava/flathub-colour-banners
Add coloured banners for app in Flathub store
2024-04-13 16:33:31 +02:00
Ralph PlawetzkiandGitHub a33dc3980e Use colours from Cryptomator CD manual 2024-04-13 15:36:52 +02:00
Ralph PlawetzkiandGitHub caa5e77386 Swap the light and dark colors, it's calmer for the eye 2024-04-13 08:48:20 +02:00
Ralph Plawetzki c037920e79 Add coloured banners for app in Flathub store 2024-04-12 17:45:38 +02:00
Armin SchrenkandGitHub 3cdd352d39 Update check-jdk-updates.yml
Use latest jdk version for jdk check
2024-04-10 12:27:05 +02:00
dependabot[bot]andGitHub 8ae80e2932 Bump the maven-build-plugins group with 2 updates (#3391) 2024-04-09 08:34:03 +00:00
dependabot[bot]andGitHub 2ffa1ee236 Bump the github-actions group with 2 updates (#3387) 2024-04-09 08:16:34 +00:00
Tobias HagemannandGitHub 2bf5b57823 Update README.md
[ci skip]
2024-04-05 12:33:38 +02:00
Jan-Peter Klein 853ea69180 updated log error message as suggested by coderabbit 2024-04-04 13:30:47 +02:00
Jan-Peter Klein 43d0dd99ec adjusted code as per PR suggestions 2024-04-04 12:37:56 +02:00
Armin Schrenk b40e6db701 Merge branch 'main' into develop 2024-03-27 13:02:32 +01:00
dependabot[bot]andGitHub 6c50023074 Bump the maven-build-plugins group with 2 updates (#3380) 2024-03-25 09:09:23 +00:00
Sebastian Stenzel 0009940e1e adjusted after dependency update 2024-03-14 12:09:10 +01:00
Armin Schrenk f2a50b59b5 well, that should be the last reference to dokany 2024-03-12 09:56:30 +01:00
Armin SchrenkandGitHub ed03606981 One should also remove the actual dependency 2024-03-12 09:51:11 +01:00
Armin Schrenk 4a1eaf25c7 Closes #3361, Fixes #3351 2024-03-12 09:46:37 +01:00
dependabot[bot]andGitHub f5e445a610 Bump the java-production-dependencies group with 3 updates (#3365) 2024-03-12 07:57:00 +00:00
Jan-Peter Klein 6a3a256c0b Merge branch 'develop' into feature/update-checker-refactoring 2024-03-08 10:28:16 +01:00
Jan-Peter Klein 1ed77ebcc0 code cleanup 2024-03-08 10:27:35 +01:00
Jan-Peter Klein db224e9e5c added latestVersion and lastUpdateCheck to settings and integrated with update checker 2024-03-08 09:58:59 +01:00
dependabot[bot]andGitHub c719982ef3 Bump the github-actions group with 1 update (#3354) 2024-03-05 17:24:28 +00:00
dependabot[bot]andGitHub f783f5d5ec Bump the java-test-dependencies group with 1 update (#3358) 2024-03-05 17:21:45 +00:00
dependabot[bot]andGitHub dd4f87b54c Bump the java-production-dependencies group with 4 updates (#3359) 2024-03-05 17:21:09 +00:00
Jan-Peter Klein b3789700e1 add upToDateLabel and fix update indicator issue 2024-03-05 12:56:38 +01:00
Jan-Peter Klein b39834f4eb Merge branch 'develop' into feature/update-checker-refactoring 2024-03-05 10:18:32 +01:00
Jan-Peter Klein 8064d75102 removed state label and reorganized ui elements 2024-03-05 10:15:11 +01:00
Jan-Peter Klein 4064b61cd7 refactored updateChecker by incorporating state management and date tracking 2024-02-29 09:29:26 +01:00
Armin Schrenk ef3affece3 [ci skip] fix wrong PR description in flathub workflow 2024-02-28 13:42:37 +01:00
Armin Schrenk 414465371b [ci skip] refactor win-exe workflow
* only publish, if msi and exe succeed
* make stable release jobs dependent of publish
2024-02-28 13:19:54 +01:00
Armin Schrenk feed72a729 [ci skip] fix flathub workflow 2024-02-27 22:52:56 +01:00
Armin Schrenk bca20a7a66 [ci skip] seperate av whitelisting into own workflow to be able to upload assets on failure 2024-02-27 18:55:14 +01:00
Armin Schrenk a38377baaa [ci skip] Merge branch 'main' into develop 2024-02-27 12:53:30 +01:00
116 changed files with 2307 additions and 454 deletions
+8 -8
View File
@@ -11,7 +11,7 @@ on:
env: env:
JAVA_DIST: 'zulu' JAVA_DIST: 'zulu'
JAVA_VERSION: '21.0.2+13' 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/21.0.1/openjfx-21.0.1_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: '7baed11ca56d5fee85995fa6612d4299f1e8b7337287228f7f12fd50407c56f8' 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/21.0.1/openjfx-21.0.1_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: '871e7b9d7af16aef2e55c1b7830d0e0b2503b13dd8641374ba7e55ecb81d2ef9' openjfx-sha: '1982ad168a5e8d7cf4a9458a7d088b4f0552d0ac3f24f23fb88f8bc7e8d69a13'
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup Java - name: Setup Java
@@ -68,7 +68,7 @@ jobs:
- name: Set version - name: Set version
run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }} run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }}
- name: Run maven - name: Run maven
run: mvn -B clean package -Plinux -DskipTests run: mvn -B clean package -Plinux -DskipTests -Djavafx.platform=linux
- name: Patch target dir - name: Patch target dir
run: | run: |
cp LICENSE.txt target cp LICENSE.txt target
@@ -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.crypto.ec,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net --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
@@ -169,7 +169,7 @@ jobs:
if-no-files-found: error if-no-files-found: error
- name: Publish AppImage on GitHub Releases - name: Publish AppImage on GitHub Releases
if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published' if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
fail_on_unmatched_files: true fail_on_unmatched_files: true
token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }} token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
+40
View File
@@ -0,0 +1,40 @@
name: AntiVirus Whitelisting
on:
workflow_call:
inputs:
url:
description: "Url to the file to upload"
required: true
type: string
workflow_dispatch:
inputs:
url:
description: "Url to the file to upload"
required: true
type: string
jobs:
allowlist:
name: Anti Virus Allowlisting
runs-on: ubuntu-latest
steps:
- name: Download file
run: |
curl --remote-name ${{ inputs.url }} -L
- name: Upload to Kaspersky
uses: SamKirkland/FTP-Deploy-Action@v4.3.5
with:
protocol: ftps
server: allowlist.kaspersky-labs.com
port: 990
username: ${{ secrets.ALLOWLIST_KASPERSKY_USERNAME }}
password: ${{ secrets.ALLOWLIST_KASPERSKY_PASSWORD }}
- name: Upload to Avast
uses: SamKirkland/FTP-Deploy-Action@v4.3.5
with:
protocol: ftp
server: whitelisting.avast.com
port: 21
username: ${{ secrets.ALLOWLIST_AVAST_USERNAME }}
password: ${{ secrets.ALLOWLIST_AVAST_PASSWORD }}
+3 -3
View File
@@ -7,7 +7,7 @@ on:
env: env:
JAVA_DIST: 'zulu' JAVA_DIST: 'zulu'
JAVA_VERSION: 21 JAVA_VERSION: 22
defaults: defaults:
run: run:
@@ -33,7 +33,7 @@ jobs:
- name: Build and Test - name: Build and Test
run: > run: >
xvfb-run xvfb-run
mvn -B verify mvn -B verify -Djavafx.platform=linux
jacoco:report jacoco:report
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar org.sonarsource.scanner.maven:sonar-maven-plugin:sonar
-Pcoverage -Pcoverage
@@ -45,7 +45,7 @@ jobs:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- name: Draft a release - name: Draft a release
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
draft: true draft: true
discussion_category_name: releases discussion_category_name: releases
+1 -1
View File
@@ -5,7 +5,7 @@ on:
- cron: '0 0 1 * *' # run once a month at the first day of month - cron: '0 0 1 * *' # run once a month at the first day of month
env: env:
JDK_VERSION: '21.0.1+12' JDK_VERSION: '22.0.1+8'
JDK_VENDOR: zulu JDK_VENDOR: zulu
jobs: jobs:
+8 -8
View File
@@ -17,13 +17,13 @@ on:
env: env:
JAVA_DIST: 'zulu' JAVA_DIST: 'zulu'
JAVA_VERSION: '21.0.2+13' JAVA_VERSION: '22.0.1+8'
COFFEELIBS_JDK: 21 COFFEELIBS_JDK: 22
COFFEELIBS_JDK_VERSION: '21.0.2+13-0ppa1' COFFEELIBS_JDK_VERSION: '22.0.1+8-0ppa1'
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/21.0.1/openjfx-21.0.1_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: '7baed11ca56d5fee85995fa6612d4299f1e8b7337287228f7f12fd50407c56f8' OPENJFX_JMODS_AMD64_HASH: 'fbb22f35951c2e049cc2554dd03c2c56b4f5adc4b2ae9248872f46175ac103d8'
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/21.0.1/openjfx-21.0.1_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: '871e7b9d7af16aef2e55c1b7830d0e0b2503b13dd8641374ba7e55ecb81d2ef9' OPENJFX_JMODS_AARCH64_HASH: '1982ad168a5e8d7cf4a9458a7d088b4f0552d0ac3f24f23fb88f8bc7e8d69a13'
jobs: jobs:
build: build:
@@ -53,7 +53,7 @@ jobs:
check-latest: true check-latest: true
cache: 'maven' cache: 'maven'
- name: Run maven - name: Run maven
run: mvn -B clean package -Plinux -DskipTests run: mvn -B clean package -Plinux -Djavafx.platform=linux -DskipTests
- name: Download OpenJFX jmods - name: Download OpenJFX jmods
id: download-jmods id: download-jmods
run: | run: |
+2 -1
View File
@@ -11,7 +11,8 @@ jobs:
with: with:
runner-os: 'ubuntu-latest' runner-os: 'ubuntu-latest'
java-distribution: 'temurin' java-distribution: 'temurin'
java-version: 21 java-version: 22
check-command: 'mvn -B validate -Pdependency-check -Djavafx.platform=linux'
secrets: secrets:
nvd-api-key: ${{ secrets.NVD_API_KEY }} nvd-api-key: ${{ secrets.NVD_API_KEY }}
slack-webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }} slack-webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }}
+2 -2
View File
@@ -56,7 +56,7 @@ jobs:
- name: Update build file - name: Update build file
run: | run: |
sed -i -e 's/VERSION: [0-9]\+\.[0-9]\+\.[0-9]\+.*/VERSION: ${{ needs.get-version.outputs.semVerStr }}/g' org.cryptomator.Cryptomator.yaml sed -i -e 's/VERSION: [0-9]\+\.[0-9]\+\.[0-9]\+.*/VERSION: ${{ needs.get-version.outputs.semVerStr }}/g' org.cryptomator.Cryptomator.yaml
sed -i -e 's/sha512: [0-9A-Za-z_-\+]\{128\} #CRYPTOMATOR/sha512: ${{ needs.tarball.outputs.sha512 }} #CRYPTOMATOR/g' org.cryptomator.Cryptomator.yaml sed -i -e 's/sha512: [0-9A-Za-z_\+-]\{128\} #CRYPTOMATOR/sha512: ${{ needs.tarball.outputs.sha512 }} #CRYPTOMATOR/g' org.cryptomator.Cryptomator.yaml
sed -i -e 's;url: https://github.com/cryptomator/cryptomator/archive/refs/tags/[^[:blank:]]\+;url: ${{ needs.tarball.outputs.url }};g' org.cryptomator.Cryptomator.yaml sed -i -e 's;url: https://github.com/cryptomator/cryptomator/archive/refs/tags/[^[:blank:]]\+;url: ${{ needs.tarball.outputs.url }};g' org.cryptomator.Cryptomator.yaml
- name: Commit and push - name: Commit and push
run: | run: |
@@ -68,7 +68,7 @@ jobs:
git push git push
- name: Create pull request - name: Create pull request
run: | run: |
echo "> [!IMPORTANT]\n> Todos:\n> - [ ] Update maven dependencies\n> - [ ] Check for JDK update\n> - [ ] Check for JFX update" > pr_body.md printf "> [!IMPORTANT]\n> Todos:\n> - [ ] Update maven dependencies\n> - [ ] Check for JDK update\n> - [ ] Check for JFX update" > pr_body.md
PR_URL=$(gh pr create --title "Release ${{ needs.get-version.outputs.semVerStr }}" --body-file pr_body.md) PR_URL=$(gh pr create --title "Release ${{ needs.get-version.outputs.semVerStr }}" --body-file pr_body.md)
echo "FLATHUB_PR_URL=$PR_URL" >> "$GITHUB_ENV" echo "FLATHUB_PR_URL=$PR_URL" >> "$GITHUB_ENV"
env: env:
+2 -2
View File
@@ -23,7 +23,7 @@ on:
env: env:
JAVA_DIST: 'zulu' JAVA_DIST: 'zulu'
JAVA_VERSION: 21 JAVA_VERSION: 22
jobs: jobs:
determine-version: determine-version:
@@ -71,6 +71,6 @@ jobs:
echo "revNum=${REVCOUNT}" >> $GITHUB_OUTPUT echo "revNum=${REVCOUNT}" >> $GITHUB_OUTPUT
echo "type=${TYPE}" >> $GITHUB_OUTPUT echo "type=${TYPE}" >> $GITHUB_OUTPUT
- name: Validate Version - name: Validate Version
uses: skymatic/semver-validation-action@v2 uses: skymatic/semver-validation-action@v3
with: with:
version: ${{ steps.versions.outputs.semVerStr }} version: ${{ steps.versions.outputs.semVerStr }}
+10 -10
View File
@@ -16,7 +16,7 @@ on:
env: env:
JAVA_DIST: 'zulu' JAVA_DIST: 'zulu'
JAVA_VERSION: '21.0.2+13' JAVA_VERSION: '22.0.1+8'
jobs: jobs:
get-version: get-version:
@@ -37,15 +37,15 @@ jobs:
output-suffix: x64 output-suffix: x64
xcode-path: '/Applications/Xcode_13.2.1.app' xcode-path: '/Applications/Xcode_13.2.1.app'
fuse-lib: macFUSE fuse-lib: macFUSE
openjfx-url: 'https://download2.gluonhq.com/openjfx/21.0.1/openjfx-21.0.1_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: 'bd6abab20da73d5a968dcf2fd915d81b5fb919340e3bb84979ee9a888a829939' 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/21.0.1/openjfx-21.0.1_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: '7afaa1c57a6cc3c384d636e597b9a5364693e2db4aaec0a6e63d2fa964400b58' openjfx-sha: '572fce94b9b09d316b960a49e3c2b5d35231ed0463e3b1c4020b8de89783b51d'
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup Java - name: Setup Java
@@ -79,7 +79,7 @@ jobs:
- name: Set version - name: Set version
run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }} run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }}
- name: Run maven - name: Run maven
run: mvn -B clean package -Pmac -DskipTests run: mvn -B -Djavafx.platform=mac clean package -Pmac -DskipTests
- name: Patch target dir - name: Patch target dir
run: | run: |
cp LICENSE.txt target cp LICENSE.txt target
@@ -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.crypto.ec,jdk.accessibility,jdk.management.jfr --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
@@ -142,7 +142,7 @@ jobs:
REVISION_NO: ${{ needs.get-version.outputs.revNum }} REVISION_NO: ${{ needs.get-version.outputs.revNum }}
- name: Generate license for dmg - name: Generate license for dmg
run: > run: >
mvn -B license:add-third-party mvn -B -Djavafx.platform=mac license:add-third-party
-Dlicense.thirdPartyFilename=license.rtf -Dlicense.thirdPartyFilename=license.rtf
-Dlicense.outputDirectory=dist/mac/dmg/resources -Dlicense.outputDirectory=dist/mac/dmg/resources
-Dlicense.fileTemplate=dist/mac/dmg/resources/licenseTemplate.ftl -Dlicense.fileTemplate=dist/mac/dmg/resources/licenseTemplate.ftl
@@ -175,7 +175,7 @@ jobs:
run: | run: |
echo "Codesigning jdk files..." echo "Codesigning jdk files..."
find Cryptomator.app/Contents/runtime/Contents/Home/lib/ -name '*.dylib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \; find Cryptomator.app/Contents/runtime/Contents/Home/lib/ -name '*.dylib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \;
find Cryptomator.app/Contents/runtime/Contents/Home/lib/ -name 'jspawnhelper' -exec codesign --force -o runtime -s ${CODESIGN_IDENTITY} {} \; find Cryptomator.app/Contents/runtime/Contents/Home/lib/ \( -name 'jspawnhelper' -o -name 'pauseengine' -o -name 'simengine' \) -exec codesign --force -o runtime -s ${CODESIGN_IDENTITY} {} \;
echo "Codesigning jar contents..." echo "Codesigning jar contents..."
find Cryptomator.app/Contents/runtime/Contents/MacOS -name '*.dylib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \; find Cryptomator.app/Contents/runtime/Contents/MacOS -name '*.dylib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \;
for JAR_PATH in `find Cryptomator.app -name "*.jar"`; do for JAR_PATH in `find Cryptomator.app -name "*.jar"`; do
@@ -259,7 +259,7 @@ jobs:
if-no-files-found: error if-no-files-found: error
- name: Publish dmg on GitHub Releases - name: Publish dmg on GitHub Releases
if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published' if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
fail_on_unmatched_files: true fail_on_unmatched_files: true
token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }} token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
+1 -1
View File
@@ -19,7 +19,7 @@ jobs:
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }} GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }} GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
- name: Publish asc on GitHub Releases - name: Publish asc on GitHub Releases
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
fail_on_unmatched_files: true fail_on_unmatched_files: true
token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }} token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
+2 -2
View File
@@ -5,7 +5,7 @@ on:
env: env:
JAVA_DIST: 'zulu' JAVA_DIST: 'zulu'
JAVA_VERSION: 21 JAVA_VERSION: 22
defaults: defaults:
run: run:
@@ -24,4 +24,4 @@ jobs:
java-version: ${{ env.JAVA_VERSION }} java-version: ${{ env.JAVA_VERSION }}
cache: 'maven' cache: 'maven'
- name: Build and Test - name: Build and Test
run: xvfb-run mvn -B clean install jacoco:report -Pcoverage run: xvfb-run mvn -B clean install jacoco:report -Pcoverage -Djavafx.platform=linux
+2 -2
View File
@@ -12,7 +12,7 @@ defaults:
env: env:
JAVA_DIST: 'zulu' JAVA_DIST: 'zulu'
JAVA_VERSION: 21 JAVA_VERSION: 22
jobs: jobs:
check-preconditions: check-preconditions:
@@ -60,6 +60,6 @@ jobs:
- name: Run org.owasp:dependency-check plugin - name: Run org.owasp:dependency-check plugin
id: dependency-check id: dependency-check
continue-on-error: true continue-on-error: true
run: mvn -B verify -Pdependency-check -DskipTests run: mvn -B verify -Pdependency-check -DskipTests -Djavafx.platform=linux
env: env:
NVD_API_KEY: ${{ secrets.NVD_API_KEY }} NVD_API_KEY: ${{ secrets.NVD_API_KEY }}
+41 -59
View File
@@ -16,9 +16,9 @@ on:
env: env:
JAVA_DIST: 'zulu' JAVA_DIST: 'zulu'
JAVA_VERSION: '21.0.2+13' JAVA_VERSION: '22.0.1+8'
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/21.0.1/openjfx-21.0.1_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: 'daf8acae631c016c24cfe23f88469400274d3441dd890615a42dfb501f3eb94a' 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'
@@ -77,7 +77,7 @@ jobs:
- name: Set version - name: Set version
run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }} run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }}
- name: Run maven - name: Run maven
run: mvn -B clean package -Pwin -DskipTests run: mvn -B clean package -Pwin -DskipTests -Djavafx.platform=win
- name: Patch target dir - name: Patch target dir
run: | run: |
cp LICENSE.txt target cp LICENSE.txt target
@@ -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.crypto.ec,jdk.accessibility,jdk.management.jfr --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
@@ -199,7 +199,7 @@ jobs:
} }
- name: Generate license for MSI - name: Generate license for MSI
run: > run: >
mvn -B license:add-third-party mvn -B license:add-third-party "-Djavafx.platform=win"
"-Dlicense.thirdPartyFilename=license.rtf" "-Dlicense.thirdPartyFilename=license.rtf"
"-Dlicense.outputDirectory=dist/win/resources" "-Dlicense.outputDirectory=dist/win/resources"
"-Dlicense.fileTemplate=dist/win/resources/licenseTemplate.ftl" "-Dlicense.fileTemplate=dist/win/resources/licenseTemplate.ftl"
@@ -257,15 +257,6 @@ jobs:
Cryptomator-*.msi Cryptomator-*.msi
Cryptomator-*.asc Cryptomator-*.asc
if-no-files-found: error if-no-files-found: error
- name: Publish .msi on GitHub Releases
if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published'
uses: softprops/action-gh-release@v1
with:
fail_on_unmatched_files: true
token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
files: |
*.msi
*.asc
build-exe: build-exe:
name: Build .exe installer name: Build .exe installer
@@ -288,7 +279,7 @@ jobs:
cache: 'maven' cache: 'maven'
- name: Generate license for exe - name: Generate license for exe
run: > run: >
mvn -B license:add-third-party mvn -B license:add-third-party "-Djavafx.platform=win"
"-Dlicense.thirdPartyFilename=license.rtf" "-Dlicense.thirdPartyFilename=license.rtf"
"-Dlicense.fileTemplate=dist/win/bundle/resources/licenseTemplate.ftl" "-Dlicense.fileTemplate=dist/win/bundle/resources/licenseTemplate.ftl"
"-Dlicense.outputDirectory=dist/win/bundle/resources" "-Dlicense.outputDirectory=dist/win/bundle/resources"
@@ -368,59 +359,50 @@ jobs:
Cryptomator-*.exe Cryptomator-*.exe
Cryptomator-*.asc Cryptomator-*.asc
if-no-files-found: error if-no-files-found: error
- name: Publish .msi on GitHub Releases
if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published'
uses: softprops/action-gh-release@v1
with:
fail_on_unmatched_files: true
token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
files: |
Cryptomator-*.exe
Cryptomator-*.asc
allowlist: publish:
name: Anti Virus Allowlisting name: Publish installers to the github release
if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published' if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published'
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [build-msi, build-exe] needs: [build-msi, build-exe]
outputs:
download-url-msi: ${{ fromJSON(steps.publish.outputs.assets)[0].browser_download_url }}
download-url-exe: ${{ fromJSON(steps.publish.outputs.assets)[1].browser_download_url }}
steps: steps:
- name: Download .msi - name: Download installers
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
name: msi merge-multiple: true
path: msi - name: Publish .msi on GitHub Releases
- name: Download .exe id: publish
uses: actions/download-artifact@v4 uses: softprops/action-gh-release@v2
with: with:
name: exe fail_on_unmatched_files: true
path: exe token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
- name: Collect files # do not change ordering of filelist, required for correct job output
run: | files: |
mkdir files *.msi
cp msi/*.msi files *.exe
cp exe/*.exe files *.asc
- name: Upload to Kaspersky
uses: SamKirkland/FTP-Deploy-Action@v4.3.4 allowlist-msi:
with: uses: ./.github/workflows/av-whitelist.yml
protocol: ftps needs: [publish]
server: allowlist.kaspersky-labs.com with:
port: 990 url: ${{ needs.publish.outputs.download-url-msi }}
username: ${{ secrets.ALLOWLIST_KASPERSKY_USERNAME }} secrets: inherit
password: ${{ secrets.ALLOWLIST_KASPERSKY_PASSWORD }}
local-dir: files/ allowlist-exe:
- name: Upload to Avast uses: ./.github/workflows/av-whitelist.yml
uses: SamKirkland/FTP-Deploy-Action@v4.3.4 needs: [publish]
with: with:
protocol: ftp url: ${{ needs.publish.outputs.download-url-exe }}
server: whitelisting.avast.com secrets: inherit
port: 21
username: ${{ secrets.ALLOWLIST_AVAST_USERNAME }}
password: ${{ secrets.ALLOWLIST_AVAST_PASSWORD }}
local-dir: files/
notify-winget: notify-winget:
name: Notify for winget-release name: Notify for winget-release
if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published' && needs.get-version.outputs.versionType == 'stable' if: needs.get-version.outputs.versionType == 'stable'
needs: [build-msi, get-version] needs: [publish, get-version]
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Slack Notification - name: Slack Notification
+10 -12
View File
@@ -14,31 +14,29 @@
<option name="dagger.fastInit" value="enabled" /> <option name="dagger.fastInit" value="enabled" />
<option name="dagger.formatGeneratedSource" value="enabled" /> <option name="dagger.formatGeneratedSource" value="enabled" />
<processorPath useClasspath="false"> <processorPath useClasspath="false">
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-compiler/2.48.1/dagger-compiler-2.48.1.jar" /> <entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-compiler/2.49/dagger-compiler-2.49.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger/2.48.1/dagger-2.48.1.jar" /> <entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger/2.49/dagger-2.49.jar" />
<entry name="$MAVEN_REPOSITORY$/javax/inject/javax.inject/1/javax.inject-1.jar" /> <entry name="$MAVEN_REPOSITORY$/javax/inject/javax.inject/1/javax.inject-1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-producers/2.48.1/dagger-producers-2.48.1.jar" /> <entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-spi/2.49/dagger-spi-2.49.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/devtools/ksp/symbol-processing-api/1.9.20-1.0.14/symbol-processing-api-1.9.20-1.0.14.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.9.0/kotlin-stdlib-jdk8-1.9.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.9.20/kotlin-stdlib-1.9.20.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.9.0/kotlin-stdlib-jdk7-1.9.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" /> <entry name="$MAVEN_REPOSITORY$/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/guava/guava/31.0.1-jre/guava-31.0.1-jre.jar" /> <entry name="$MAVEN_REPOSITORY$/com/google/guava/guava/31.0.1-jre/guava-31.0.1-jre.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" /> <entry name="$MAVEN_REPOSITORY$/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" />
<entry name="$MAVEN_REPOSITORY$/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.jar" /> <entry name="$MAVEN_REPOSITORY$/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1.jar" /> <entry name="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" /> <entry name="$MAVEN_REPOSITORY$/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" />
<entry name="$MAVEN_REPOSITORY$/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-spi/2.48.1/dagger-spi-2.48.1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/devtools/ksp/symbol-processing-api/1.9.0-1.0.12/symbol-processing-api-1.9.0-1.0.12.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.9.0/kotlin-stdlib-1.9.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.9.0/kotlin-stdlib-common-1.9.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/squareup/javapoet/1.13.0/javapoet-1.13.0.jar" /> <entry name="$MAVEN_REPOSITORY$/com/squareup/javapoet/1.13.0/javapoet-1.13.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar" /> <entry name="$MAVEN_REPOSITORY$/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar" /> <entry name="$MAVEN_REPOSITORY$/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar" />
<entry name="$MAVEN_REPOSITORY$/com/squareup/kotlinpoet/1.11.0/kotlinpoet-1.11.0.jar" /> <entry name="$MAVEN_REPOSITORY$/com/squareup/kotlinpoet/1.11.0/kotlinpoet-1.11.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.6.10/kotlin-stdlib-jdk8-1.6.10.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.6.10/kotlin-stdlib-jdk7-1.6.10.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-reflect/1.6.10/kotlin-reflect-1.6.10.jar" /> <entry name="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-reflect/1.6.10/kotlin-reflect-1.6.10.jar" />
<entry name="$MAVEN_REPOSITORY$/net/ltgt/gradle/incap/incap/0.2/incap-0.2.jar" /> <entry name="$MAVEN_REPOSITORY$/net/ltgt/gradle/incap/incap/0.2/incap-0.2.jar" />
<entry name="$MAVEN_REPOSITORY$/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" />
</processorPath> </processorPath>
<module name="cryptomator" /> <module name="cryptomator" />
</profile> </profile>
+1 -1
View File
@@ -8,7 +8,7 @@
</list> </list>
</option> </option>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21_PREVIEW" project-jdk-name="21" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_22" project-jdk-name="22" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
</project> </project>
+1 -2
View File
@@ -33,7 +33,6 @@ Cryptomator is provided free of charge as an open-source project despite the hig
<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.easeus.com/"><img src="https://cryptomator.org/img/sponsors/easeus.png" alt="EaseUS" height="40"></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> <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>
<td><a href="https://ente.io/"><img src="https://cryptomator.org/img/sponsors/ente.svg" alt="Ente" height="58"></a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@@ -86,7 +85,7 @@ For more information on the security details visit [cryptomator.org](https://doc
### Dependencies ### Dependencies
* JDK 21 (e.g. temurin, zulu) * JDK 22 (e.g. temurin, zulu)
* Maven 3 * Maven 3
### Run Maven ### Run Maven
+3 -1
View File
@@ -1,4 +1,6 @@
# created during build # downloaded/created during build
openjfx-jmods.zip
*.jmod
Cryptomator.AppDir Cryptomator.AppDir
*.AppImage *.AppImage
*.AppImage.zsync *.AppImage.zsync
+20 -20
View File
@@ -12,31 +12,31 @@ command -v unzip >/dev/null 2>&1 || { echo >&2 "unzip not found."; exit 1; }
VERSION=$(mvn -f ../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout) VERSION=$(mvn -f ../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout)
SEMVER_STR=${VERSION} SEMVER_STR=${VERSION}
MACHINE_TYPE=$(uname -m) CPU_ARCH=$(uname -p)
if [[ ! "${MACHINE_TYPE}" =~ x86_64|aarch64 ]]; then echo "Platform ${MACHINE_TYPE} not supported"; exit 1; fi if [[ ! "${CPU_ARCH}" =~ x86_64|aarch64 ]]; then echo "Platform ${CPU_ARCH} not supported"; exit 1; fi
mvn -f ../../../pom.xml versions:set -DnewVersion=${SEMVER_STR} mvn -f ../../../pom.xml versions:set -DnewVersion=${SEMVER_STR}
# compile # compile
mvn -B -f ../../../pom.xml clean package -Plinux -DskipTests mvn -B -f ../../../pom.xml clean package -Plinux -DskipTests -Djavafx.platform=linux
cp ../../../LICENSE.txt ../../../target cp ../../../LICENSE.txt ../../../target
cp ../../../target/cryptomator-*.jar ../../../target/mods cp ../../../target/cryptomator-*.jar ../../../target/mods
JAVAFX_VERSION=22.0.1
# download javaFX jmods JAVAFX_ARCH="x64"
OPENJFX_URL='https://download2.gluonhq.com/openjfx/21.0.1/openjfx-21.0.1_linux-x64_bin-jmods.zip' JAVAFX_JMODS_SHA256='fbb22f35951c2e049cc2554dd03c2c56b4f5adc4b2ae9248872f46175ac103d8'
OPENJFX_SHA='7baed11ca56d5fee85995fa6612d4299f1e8b7337287228f7f12fd50407c56f8' if [ "${CPU_ARCH}" = "aarch64" ]; then
OPENJFX_URL_aarch64='https://download2.gluonhq.com/openjfx/21.0.1/openjfx-21.0.1_linux-aarch64_bin-jmods.zip' JAVAFX_ARCH="aarch64"
OPENJFX_SHA_aarch64='871e7b9d7af16aef2e55c1b7830d0e0b2503b13dd8641374ba7e55ecb81d2ef9' JAVAFX_JMODS_SHA256='1982ad168a5e8d7cf4a9458a7d088b4f0552d0ac3f24f23fb88f8bc7e8d69a13'
if [[ "${MACHINE_TYPE}" = "aarch64" ]]; then
OPENJFX_URL="${OPENJFX_URL_aarch64}";
OPENJFX_SHA="${OPENJFX_SHA_aarch64}";
fi fi
curl -L ${OPENJFX_URL} -o openjfx-jmods.zip # download javaFX jmods
echo "${OPENJFX_SHA} openjfx-jmods.zip" | shasum -a256 --check 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
echo "${JAVAFX_JMODS_SHA256} openjfx-jmods.zip" | shasum -a256 --check
mkdir -p openjfx-jmods mkdir -p openjfx-jmods
unzip -o -j openjfx-jmods.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d openjfx-jmods unzip -o -j 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)
@@ -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.crypto.ec,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net \ --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 \
@@ -114,17 +114,17 @@ ln -s usr/share/applications/org.cryptomator.Cryptomator.desktop Cryptomator.App
ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun
# load AppImageTool # load AppImageTool
curl -L https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-${MACHINE_TYPE}.AppImage -o /tmp/appimagetool.AppImage curl -L https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-${CPU_ARCH}.AppImage -o /tmp/appimagetool.AppImage
chmod +x /tmp/appimagetool.AppImage chmod +x /tmp/appimagetool.AppImage
# create AppImage # create AppImage
/tmp/appimagetool.AppImage \ /tmp/appimagetool.AppImage \
Cryptomator.AppDir \ Cryptomator.AppDir \
cryptomator-${SEMVER_STR}-${MACHINE_TYPE}.AppImage \ cryptomator-${SEMVER_STR}-${CPU_ARCH}.AppImage \
-u 'gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-${MACHINE_TYPE}.AppImage.zsync' -u 'gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-${CPU_ARCH}.AppImage.zsync'
echo "" echo ""
echo "Done. AppImage successfully created: cryptomator-${SEMVER_STR}-${MACHINE_TYPE}.AppImage" echo "Done. AppImage successfully created: cryptomator-${SEMVER_STR}-${CPU_ARCH}.AppImage"
echo "" echo ""
echo >&2 "To clean up, run: rm -rf Cryptomator.AppDir appdir runtime squashfs-root openjfx-jmods; rm /tmp/appimagetool.AppImage openjfx-jmods.zip" echo >&2 "To clean up, run: rm -rf Cryptomator.AppDir appdir runtime squashfs-root openjfx-jmods; rm /tmp/appimagetool.AppImage openjfx-jmods.zip"
echo "" echo ""
+8 -1
View File
@@ -53,6 +53,11 @@
</screenshot> </screenshot>
</screenshots> </screenshots>
<branding>
<color type="primary" scheme_preference="light">#EBF5EB</color>
<color type="primary" scheme_preference="dark">#2F4858</color>
</branding>
<url type="homepage">https://cryptomator.org/</url> <url type="homepage">https://cryptomator.org/</url>
<url type="bugtracker">https://github.com/cryptomator/cryptomator/issues/</url> <url type="bugtracker">https://github.com/cryptomator/cryptomator/issues/</url>
<url type="donation">https://cryptomator.org/donate</url> <url type="donation">https://cryptomator.org/donate</url>
@@ -63,13 +68,15 @@
<developer id="de.skymatic"> <developer id="de.skymatic">
<name>Skymatic GmbH</name> <name>Skymatic GmbH</name>
</developer> </developer>
<content_rating type="oars-1.1"> <content_rating type="oars-1.1">
<content_attribute id="social-info">mild</content_attribute> <!-- update checker connects to https://api.cryptomator.org/updates/latestVersion.json --> <content_attribute id="social-info">mild</content_attribute> <!-- update checker connects to https://api.cryptomator.org/updates/latestVersion.json -->
</content_rating> </content_rating>
<releases> <releases>
<release date="2024-06-26" version="1.13.0">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.13.0</url>
</release>
<release date="2024-03-27" version="1.12.4"> <release date="2024-03-27" version="1.12.4">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.12.4</url> <url type="details">https://github.com/cryptomator/cryptomator/releases/1.12.4</url>
</release> </release>
+1 -1
View File
@@ -2,7 +2,7 @@ Source: cryptomator
Maintainer: Cryptobot <releases@cryptomator.org> Maintainer: Cryptobot <releases@cryptomator.org>
Section: utils Section: utils
Priority: optional Priority: optional
Build-Depends: debhelper (>=10), coffeelibs-jdk-21 (>= 21.0.2+12-0ppa1), libgtk-3-0, libxxf86vm1, libgl1 Build-Depends: debhelper (>=10), coffeelibs-jdk-22 (>= 22.0.1+8-0ppa1), libgtk-3-0, libxxf86vm1, libgl1
Standards-Version: 4.5.0 Standards-Version: 4.5.0
Homepage: https://cryptomator.org Homepage: https://cryptomator.org
Vcs-Git: https://github.com/cryptomator/cryptomator.git Vcs-Git: https://github.com/cryptomator/cryptomator.git
+2 -2
View File
@@ -4,7 +4,7 @@
# Uncomment this to turn on verbose mode. # Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1 #export DH_VERBOSE=1
JAVA_HOME = /usr/lib/jvm/java-21-coffeelibs JAVA_HOME = /usr/lib/jvm/java-22-coffeelibs
DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH) DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
ifeq ($(DEB_BUILD_ARCH),amd64) ifeq ($(DEB_BUILD_ARCH),amd64)
JMODS_PATH = jmods/amd64:${JAVA_HOME}/jmods JMODS_PATH = jmods/amd64:${JAVA_HOME}/jmods
@@ -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.crypto.ec,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net \ --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 \
+4 -2
View File
@@ -1,6 +1,8 @@
# created during build # downloaded/created during build
Cryptomator.app/ Cryptomator.app/
runtime/ runtime/
dmg/ dmg/
*.dmg *.dmg
license.rtf license.rtf
openjfx-jmods.zip
*.jmod
+13 -8
View File
@@ -29,13 +29,17 @@ 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"
ARCH="undefined" JAVAFX_VERISON=22.0.1
JAVAFX_ARCH="undefined"
JAVAFX_JMODS_SHA256="undefined"
if [ "$(machine)" = "arm64e" ]; then if [ "$(machine)" = "arm64e" ]; then
ARCH="aarch64" JAVAFX_ARCH="aarch64"
JAVAFX_JMODS_SHA256="572fce94b9b09d316b960a49e3c2b5d35231ed0463e3b1c4020b8de89783b51d"
else else
ARCH="x64" JAVAFX_ARCH="x64"
JAVAFX_JMODS_SHA256="e07a11c112abbdebe7c058b44c151e1e475de748671d896aef3d73f32453c248"
fi fi
OPENJFX_JMODS="https://download2.gluonhq.com/openjfx/21.0.1/openjfx-21.0.1_osx-${ARCH}_bin-jmods.zip" JAVAFX_JMODS_URL="https://download2.gluonhq.com/openjfx/${JAVAFX_VERSION}/openjfx-${JAVAFX_VERSION}_osx-${JAVAFX_ARCH}_bin-jmods.zip"
# check preconditions # check preconditions
if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi
@@ -47,7 +51,8 @@ if [ -n "${CODESIGN_IDENTITY}" ]; then
fi fi
# download and check jmods # download and check jmods
curl -L ${OPENJFX_JMODS} -o openjfx-jmods.zip curl -L ${JAVAFX_JMODS_URL} -o openjfx-jmods.zip
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)
@@ -63,7 +68,7 @@ if [ "${POM_JFX_VERSION}" -ne "${JMOD_VERSION}" ]; then
fi fi
# compile # compile
mvn -B -f../../../pom.xml clean package -DskipTests -Pmac mvn -B -Djavafx.platform=mac -f../../../pom.xml clean package -DskipTests -Pmac
cp ../../../LICENSE.txt ../../../target cp ../../../LICENSE.txt ../../../target
cp ../../../target/${MAIN_JAR_GLOB} ../../../target/mods cp ../../../target/${MAIN_JAR_GLOB} ../../../target/mods
@@ -71,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.crypto.ec,jdk.security.auth,jdk.accessibility,jdk.management.jfr \ --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 \
@@ -118,7 +123,7 @@ sed -i '' "s|###BUNDLE_SHORT_VERSION_STRING###|${VERSION_NO}|g" ${APP_NAME}.app/
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
# generate license # generate license
mvn -B -f../../../pom.xml license:add-third-party \ mvn -B -Djavafx.platform=mac -f../../../pom.xml license:add-third-party \
-Dlicense.thirdPartyFilename=license.rtf \ -Dlicense.thirdPartyFilename=license.rtf \
-Dlicense.outputDirectory=dist/mac/dmg/resources \ -Dlicense.outputDirectory=dist/mac/dmg/resources \
-Dlicense.fileTemplate=resources/licenseTemplate.ftl \ -Dlicense.fileTemplate=resources/licenseTemplate.ftl \
+1
View File
@@ -6,4 +6,5 @@ installer
*.msi *.msi
*.exe *.exe
*.jmod *.jmod
resources/jfxJmods.zip
license.rtf license.rtf
+16 -15
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 &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,21 +51,22 @@ if ($clean -and (Test-Path -Path $runtimeImagePath)) {
} }
## download jfx jmods ## download jfx jmods
$jmodsVersion='21.0.1' $javaFxVersion='22.0.1'
$jmodsUrl = "https://download2.gluonhq.com/openjfx/${jmodsVersion}/openjfx-${jmodsVersion}_windows-x64_bin-jmods.zip" $javaFxJmodsUrl = "https://download2.gluonhq.com/openjfx/${javaFxVersion}/openjfx-${javaFxVersion}_windows-x64_bin-jmods.zip"
$jfxJmodsChecksum = 'daf8acae631c016c24cfe23f88469400274d3441dd890615a42dfb501f3eb94a' $javaFxJmodsSHA256 = 'de82e53179032a49bec005deb4438e8f261d08c4b58864a5c17e1d87286b09dd'
$jfxJmodsZip = '.\resources\jfxJmods.zip' $javaFxJmods = '.\resources\jfxJmods.zip'
if( !(Test-Path -Path $jfxJmodsZip) ) { if( !(Test-Path -Path $javaFxJmods) ) {
Write-Output "Downloading ${jmodsUrl}..." Write-Output "Downloading ${javaFxJmodsUrl}..."
Invoke-WebRequest $jmodsUrl -OutFile $jfxJmodsZip # redirects are followed by default Invoke-WebRequest $javaFxJmodsUrl -OutFile $javaFxJmods # redirects are followed by default
} }
$jmodsChecksumActual = $(Get-FileHash -Path $jfxJmodsZip -Algorithm SHA256).Hash $jmodsChecksumActual = $(Get-FileHash -Path $javaFxJmods -Algorithm SHA256).Hash
if( $jmodsChecksumActual -ne $jfxJmodsChecksum ) { if( $jmodsChecksumActual -ne $javaFxJmodsSHA256 ) {
Write-Error "Checksum mismatch for jfxJmods.zip. Expected: $jfxJmodsChecksum, actual: $jmodsChecksumActual" Write-Error "Checksum mismatch for jfxJmods.zip. Expected: $javaFxJmodsSHA256
, actual: $jmodsChecksumActual"
exit 1; exit 1;
} }
Expand-Archive -Path $jfxJmodsZip -Force -DestinationPath ".\resources\" Expand-Archive -Path $javaFxJmods -Force -DestinationPath ".\resources\"
Remove-Item -Recurse -Force -Path ".\resources\javafx-jmods" Remove-Item -Recurse -Force -Path ".\resources\javafx-jmods"
Move-Item -Force -Path ".\resources\javafx-jmods-*" -Destination ".\resources\javafx-jmods" -ErrorAction Stop Move-Item -Force -Path ".\resources\javafx-jmods-*" -Destination ".\resources\javafx-jmods" -ErrorAction Stop
@@ -74,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.crypto.ec,jdk.accessibility,jdk.management.jfr,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 `
@@ -121,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 ` &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\" `
@@ -166,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 ` &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\" `
-5
View File
@@ -1,5 +0,0 @@
@echo off
:: see comments in file ./version170-migrate-settings.ps1
cd %~dp0
powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command .\version170-migrate-settings.ps1
-35
View File
@@ -1,35 +0,0 @@
# This script migrates Cryptomator settings for all local users on Windows in case the users uses custom directories as mountpoint
# See also https://github.com/cryptomator/cryptomator/pull/2654.
#
# TODO: This script should be evaluated in a yearly interval if it is still needed and if not, should be removed
#
#Requires -RunAsAdministrator
#Get all active, local user profiles
$profileList = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
Get-ChildItem $profileList | ForEach-Object {
$profilePath = $_.GetValue("ProfileImagePath")
$settingsPath = "$profilePath\AppData\Roaming\Cryptomator\settings.json"
if(!(Test-Path -Path $settingsPath -PathType Leaf)) {
#No settings file, nothing to do.
return;
}
$settings = Get-Content -Path $settingsPath | ConvertFrom-Json
if($settings.preferredVolumeImpl -ne "FUSE") {
#Fuse not used, nothing to do
return;
}
#check if customMountPoints are used
$atLeastOneCustomPath = $false;
foreach ($vault in $settings.directories){
$atLeastOneCustomPath = $atLeastOneCustomPath -or ($vault.useCustomMountPath -eq "True")
}
#if so, use WinFsp Local Drive
if( $atLeastOneCustomPath ) {
Add-Member -Force -InputObject $settings -Name "mountService" -Value "org.cryptomator.frontend.fuse.mount.WinFspMountProvider" -MemberType NoteProperty
$newSettings = $settings | Select-Object * -ExcludeProperty "preferredVolumeImpl"
ConvertTo-Json $newSettings | Set-Content -Path $settingsPath
}
}
-6
View File
@@ -139,11 +139,6 @@
Sequence="execute" Before="PatchWebDAV" /> Sequence="execute" Before="PatchWebDAV" />
<CustomAction Id="PatchWebDAV" BinaryKey="WixCA" DllEntry="WixQuietExec64" Execute="deferred" Return="ignore" Impersonate="no"/> <CustomAction Id="PatchWebDAV" BinaryKey="WixCA" DllEntry="WixQuietExec64" Execute="deferred" Return="ignore" Impersonate="no"/>
<!-- Special Settings migration for 1.7.0,. Should be removed eventually, for more info, see ../contrib/version170-migrate-settings.ps1-->
<SetProperty Id="V170MigrateSettings" Value="&quot;[INSTALLDIR]version170-migrate-settings.bat&quot;"
Sequence="execute" Before="V170MigrateSettings" />
<CustomAction Id="V170MigrateSettings" BinaryKey="WixCA" DllEntry="WixQuietExec64" Execute="deferred" Return="ignore" Impersonate="no"/>
<!-- Running App detection and exit --> <!-- Running App detection and exit -->
<Property Id="FOUNDRUNNINGAPP" Admin="yes"/> <Property Id="FOUNDRUNNINGAPP" Admin="yes"/>
<util:CloseApplication <util:CloseApplication
@@ -195,7 +190,6 @@
<RemoveExistingProducts After="InstallValidate"/> <!-- Moved from CostInitialize, due to WixCloseApplications --> <RemoveExistingProducts After="InstallValidate"/> <!-- Moved from CostInitialize, due to WixCloseApplications -->
<Custom Action="PatchWebDAV" After="InstallFiles">NOT Installed OR REINSTALL</Custom> <Custom Action="PatchWebDAV" After="InstallFiles">NOT Installed OR REINSTALL</Custom>
<Custom Action="V170MigrateSettings" After="InstallFiles">NOT Installed OR REINSTALL</Custom>
</InstallExecuteSequence> </InstallExecuteSequence>
<InstallUISequence> <InstallUISequence>
+31 -25
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.12.4</version> <version>1.13.0</version>
<name>Cryptomator Desktop App</name> <name>Cryptomator Desktop App</name>
<organization> <organization>
@@ -26,7 +26,7 @@
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.jdk.version>21</project.jdk.version> <project.jdk.version>22</project.jdk.version>
<!-- Group IDs of jars that need to stay on the class path for now --> <!-- Group IDs of jars that need to stay on the class path for now -->
<!-- remove them, as soon they got modularized or support is dropped (i.e., WebDAV) --> <!-- remove them, as soon they got modularized or support is dropped (i.e., WebDAV) -->
@@ -36,46 +36,50 @@
<cryptomator.cryptofs.version>2.6.9</cryptomator.cryptofs.version> <cryptomator.cryptofs.version>2.6.9</cryptomator.cryptofs.version>
<cryptomator.integrations.version>1.3.1</cryptomator.integrations.version> <cryptomator.integrations.version>1.3.1</cryptomator.integrations.version>
<cryptomator.integrations.win.version>1.2.5</cryptomator.integrations.win.version> <cryptomator.integrations.win.version>1.2.5</cryptomator.integrations.win.version>
<cryptomator.integrations.mac.version>1.2.3</cryptomator.integrations.mac.version> <cryptomator.integrations.mac.version>1.2.4</cryptomator.integrations.mac.version>
<cryptomator.integrations.linux.version>1.4.4</cryptomator.integrations.linux.version> <cryptomator.integrations.linux.version>1.4.5</cryptomator.integrations.linux.version>
<cryptomator.fuse.version>4.0.0</cryptomator.fuse.version> <cryptomator.fuse.version>5.0.0</cryptomator.fuse.version>
<cryptomator.dokany.version>2.0.0</cryptomator.dokany.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.14.0</commons-lang3.version> <commons-lang3.version>3.14.0</commons-lang3.version>
<dagger.version>2.50</dagger.version> <dagger.version>2.51.1</dagger.version>
<easybind.version>2.2</easybind.version> <easybind.version>2.2</easybind.version>
<guava.version>33.0.0-jre</guava.version> <guava.version>33.2.1-jre</guava.version>
<jackson.version>2.16.1</jackson.version> <jackson.version>2.17.1</jackson.version>
<javafx.version>21.0.1</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.0</logback.version> <logback.version>1.5.6</logback.version>
<slf4j.version>2.0.12</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.8.2</zxcvbn.version> <zxcvbn.version>1.9.0</zxcvbn.version>
<!-- test dependencies --> <!-- test dependencies -->
<junit.jupiter.version>5.10.2</junit.jupiter.version> <junit.jupiter.version>5.10.2</junit.jupiter.version>
<mockito.version>5.10.0</mockito.version> <mockito.version>5.12.0</mockito.version>
<hamcrest.version>2.2</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>9.0.9</dependency-check.version> <dependency-check.version>9.2.0</dependency-check.version>
<jacoco.version>0.8.11</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.2.1</junit-tree-reporter.version> <junit-tree-reporter.version>1.2.1</junit-tree-reporter.version>
<mvn-compiler.version>3.12.1</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.6.1</mvn-dependency.version> <mvn-dependency.version>3.7.0</mvn-dependency.version>
<mvn-surefire.version>3.2.5</mvn-surefire.version> <mvn-surefire.version>3.3.0</mvn-surefire.version>
<mvn-jar.version>3.3.0</mvn-jar.version> <mvn-jar.version>3.4.1</mvn-jar.version>
</properties> </properties>
<dependencies> <dependencies>
<!-- Cryptomator Libs --> <!-- Cryptomator Libs -->
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>cryptolib</artifactId>
<version>2.2.0</version>
</dependency>
<dependency> <dependency>
<groupId>org.cryptomator</groupId> <groupId>org.cryptomator</groupId>
<artifactId>cryptofs</artifactId> <artifactId>cryptofs</artifactId>
@@ -86,11 +90,6 @@
<artifactId>fuse-nio-adapter</artifactId> <artifactId>fuse-nio-adapter</artifactId>
<version>${cryptomator.fuse.version}</version> <version>${cryptomator.fuse.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>dokany-nio-adapter</artifactId>
<version>${cryptomator.dokany.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.cryptomator</groupId> <groupId>org.cryptomator</groupId>
<artifactId>webdav-nio-adapter</artifactId> <artifactId>webdav-nio-adapter</artifactId>
@@ -164,11 +163,18 @@
<artifactId>nimbus-jose-jwt</artifactId> <artifactId>nimbus-jose-jwt</artifactId>
<version>${nimbus-jose.version}</version> <version>${nimbus-jose.version}</version>
</dependency> </dependency>
<!-- Jackson -->
<dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId> <artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version> <version>${jackson.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- EasyBind --> <!-- EasyBind -->
<dependency> <dependency>
+1 -2
View File
@@ -21,7 +21,6 @@ open module org.cryptomator.desktop {
requires org.cryptomator.cryptolib; requires org.cryptomator.cryptolib;
requires org.cryptomator.cryptofs; requires org.cryptomator.cryptofs;
requires org.cryptomator.frontend.dokany;
requires org.cryptomator.frontend.fuse; requires org.cryptomator.frontend.fuse;
requires org.cryptomator.frontend.webdav; requires org.cryptomator.frontend.webdav;
requires org.cryptomator.integrations.api; requires org.cryptomator.integrations.api;
@@ -32,13 +31,13 @@ open module org.cryptomator.desktop {
requires javafx.graphics; requires javafx.graphics;
requires javafx.controls; requires javafx.controls;
requires javafx.fxml; requires javafx.fxml;
requires jdk.crypto.ec;
// 3rd party: // 3rd party:
requires ch.qos.logback.classic; requires ch.qos.logback.classic;
requires ch.qos.logback.core; requires ch.qos.logback.core;
requires com.auth0.jwt; requires com.auth0.jwt;
requires com.google.common; requires com.google.common;
requires com.fasterxml.jackson.databind; requires com.fasterxml.jackson.databind;
requires com.fasterxml.jackson.datatype.jsr310;
requires com.nimbusds.jose.jwt; requires com.nimbusds.jose.jwt;
requires com.nulabinc.zxcvbn; requires com.nulabinc.zxcvbn;
requires com.tobiasdiez.easybind; requires com.tobiasdiez.easybind;
@@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class SubstitutingProperties extends PropertiesDecorator { public class SubstitutingProperties extends PropertiesDecorator {
@@ -58,7 +59,7 @@ public class SubstitutingProperties extends PropertiesDecorator {
LoggerFactory.getLogger(SubstitutingProperties.class).warn("Variable {} used for substitution not found in {}. Replaced with empty string.", key, src); LoggerFactory.getLogger(SubstitutingProperties.class).warn("Variable {} used for substitution not found in {}. Replaced with empty string.", key, src);
return ""; return "";
} else { } else {
return val.replace("\\", "\\\\"); return Matcher.quoteReplacement(val);
} }
} }
@@ -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;
}
@@ -25,6 +25,7 @@ import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.geometry.NodeOrientation; import javafx.geometry.NodeOrientation;
import java.time.Instant;
import java.util.function.Consumer; import java.util.function.Consumer;
public class Settings { public class Settings {
@@ -44,9 +45,9 @@ public class Settings {
static final String DEFAULT_KEYCHAIN_PROVIDER = SystemUtils.IS_OS_WINDOWS ? "org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess" : SystemUtils.IS_OS_MAC ? "org.cryptomator.macos.keychain.MacSystemKeychainAccess" : "org.cryptomator.linux.keychain.SecretServiceKeychainAccess"; static final String DEFAULT_KEYCHAIN_PROVIDER = SystemUtils.IS_OS_WINDOWS ? "org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess" : SystemUtils.IS_OS_MAC ? "org.cryptomator.macos.keychain.MacSystemKeychainAccess" : "org.cryptomator.linux.keychain.SecretServiceKeychainAccess";
static final String DEFAULT_USER_INTERFACE_ORIENTATION = NodeOrientation.LEFT_TO_RIGHT.name(); static final 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;
static final String DEFAULT_LAST_UPDATE_CHECK = "2000-01-01"; 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;
@@ -67,7 +68,7 @@ public class Settings {
public final IntegerProperty windowHeight; public final IntegerProperty windowHeight;
public final StringProperty language; public final StringProperty language;
public final StringProperty mountService; public final StringProperty mountService;
public final StringProperty lastUpdateCheck; public final ObjectProperty<Instant> lastSuccessfulUpdateCheck;
private Consumer<Settings> saveCmd; private Consumer<Settings> saveCmd;
@@ -84,6 +85,7 @@ 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);
@@ -104,13 +106,19 @@ 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.lastUpdateCheck = new SimpleStringProperty(this, "lastUpdateCheck", json.lastUpdateCheck); 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());
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);
@@ -131,7 +139,7 @@ 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);
lastUpdateCheck.addListener(this::somethingChanged); lastSuccessfulUpdateCheck.addListener(this::somethingChanged);
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@@ -165,6 +173,7 @@ 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();
@@ -185,7 +194,7 @@ 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.lastUpdateCheck = lastUpdateCheck.get(); json.lastSuccessfulUpdateCheck = lastSuccessfulUpdateCheck.get();
return json; return json;
} }
@@ -1,9 +1,11 @@
package org.cryptomator.common.settings; package org.cryptomator.common.settings;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import java.time.Instant;
import java.util.List; import java.util.List;
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@@ -13,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;
@@ -80,7 +85,8 @@ class SettingsJson {
@JsonProperty(value = "preferredVolumeImpl", access = JsonProperty.Access.WRITE_ONLY) // WRITE_ONLY means value is "written" into the java object during deserialization. Upvote this: https://github.com/FasterXML/jackson-annotations/issues/233 @JsonProperty(value = "preferredVolumeImpl", access = JsonProperty.Access.WRITE_ONLY) // WRITE_ONLY means value is "written" into the java object during deserialization. Upvote this: https://github.com/FasterXML/jackson-annotations/issues/233
String preferredVolumeImpl; String preferredVolumeImpl;
@JsonProperty("lastUpdateCheck") @JsonProperty("lastSuccessfulUpdateCheck")
String lastUpdateCheck = Settings.DEFAULT_LAST_UPDATE_CHECK; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'", timezone = "UTC")
Instant lastSuccessfulUpdateCheck = Settings.DEFAULT_TIMESTAMP;
} }
@@ -10,6 +10,7 @@ package org.cryptomator.common.settings;
import com.fasterxml.jackson.core.JacksonException; import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.google.common.base.Suppliers; import com.google.common.base.Suppliers;
import org.cryptomator.common.Environment; import org.cryptomator.common.Environment;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -36,7 +37,7 @@ import java.util.stream.Stream;
@Singleton @Singleton
public class SettingsProvider implements Supplier<Settings> { public class SettingsProvider implements Supplier<Settings> {
private static final ObjectMapper JSON = new ObjectMapper().setDefaultLeniency(true); private static final ObjectMapper JSON = new ObjectMapper().setDefaultLeniency(true).registerModule(new JavaTimeModule());
private static final Logger LOG = LoggerFactory.getLogger(SettingsProvider.class); private static final Logger LOG = LoggerFactory.getLogger(SettingsProvider.class);
private static final long SAVE_DELAY_MS = 1000; private static final long SAVE_DELAY_MS = 1000;
@@ -12,6 +12,7 @@ public enum FxmlFile {
CONVERTVAULT_HUBTOPASSWORD_START("/fxml/convertvault_hubtopassword_start.fxml"), // CONVERTVAULT_HUBTOPASSWORD_START("/fxml/convertvault_hubtopassword_start.fxml"), //
CONVERTVAULT_HUBTOPASSWORD_CONVERT("/fxml/convertvault_hubtopassword_convert.fxml"), // CONVERTVAULT_HUBTOPASSWORD_CONVERT("/fxml/convertvault_hubtopassword_convert.fxml"), //
CONVERTVAULT_HUBTOPASSWORD_SUCCESS("/fxml/convertvault_hubtopassword_success.fxml"), // CONVERTVAULT_HUBTOPASSWORD_SUCCESS("/fxml/convertvault_hubtopassword_success.fxml"), //
DOKANY_SUPPORT_END("/fxml/dokany_support_end.fxml"), //
ERROR("/fxml/error.fxml"), // ERROR("/fxml/error.fxml"), //
FORGET_PASSWORD("/fxml/forget_password.fxml"), // FORGET_PASSWORD("/fxml/forget_password.fxml"), //
HEALTH_START("/fxml/health_start.fxml"), // HEALTH_START("/fxml/health_start.fxml"), //
@@ -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"), //
@@ -0,0 +1,34 @@
package org.cryptomator.ui.dokanysupportend;
import dagger.Lazy;
import dagger.Subcomponent;
import org.cryptomator.ui.common.FxmlFile;
import org.cryptomator.ui.common.FxmlScene;
import javafx.scene.Scene;
import javafx.stage.Stage;
@DokanySupportEndScoped
@Subcomponent(modules = {DokanySupportEndModule.class})
public interface DokanySupportEndComponent {
@DokanySupportEndWindow
Stage window();
@FxmlScene(FxmlFile.DOKANY_SUPPORT_END)
Lazy<Scene> dokanySupportEndScene();
default void showDokanySupportEndWindow() {
Stage stage = window();
stage.setScene(dokanySupportEndScene().get());
stage.sizeToScene();
stage.show();
}
@Subcomponent.Factory
interface Factory {
DokanySupportEndComponent create();
}
}
@@ -0,0 +1,34 @@
package org.cryptomator.ui.dokanysupportend;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.fxapp.FxApplicationWindows;
import org.cryptomator.ui.preferences.SelectedPreferencesTab;
import javax.inject.Inject;
import javafx.fxml.FXML;
import javafx.stage.Stage;
@DokanySupportEndScoped
public class DokanySupportEndController implements FxController {
private final Stage window;
private final FxApplicationWindows applicationWindows;
@Inject
DokanySupportEndController(@DokanySupportEndWindow Stage window, FxApplicationWindows applicationWindows) {
this.window = window;
this.applicationWindows = applicationWindows;
}
@FXML
public void close() {
window.close();
}
public void openVolumePreferences() {
applicationWindows.showPreferencesWindow(SelectedPreferencesTab.VOLUME);
window.close();
}
}
@@ -0,0 +1,57 @@
package org.cryptomator.ui.dokanysupportend;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import org.cryptomator.ui.common.DefaultSceneFactory;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.common.FxControllerKey;
import org.cryptomator.ui.common.FxmlFile;
import org.cryptomator.ui.common.FxmlLoaderFactory;
import org.cryptomator.ui.common.FxmlScene;
import org.cryptomator.ui.common.StageFactory;
import javax.inject.Provider;
import javafx.scene.Scene;
import javafx.stage.Modality;
import javafx.stage.Stage;
import java.util.Map;
import java.util.ResourceBundle;
@Module
abstract class DokanySupportEndModule {
@Provides
@DokanySupportEndWindow
@DokanySupportEndScoped
static FxmlLoaderFactory provideFxmlLoaderFactory(Map<Class<? extends FxController>, Provider<FxController>> factories, DefaultSceneFactory sceneFactory, ResourceBundle resourceBundle) {
return new FxmlLoaderFactory(factories, sceneFactory, resourceBundle);
}
@Provides
@DokanySupportEndWindow
@DokanySupportEndScoped
static Stage provideStage(StageFactory factory, ResourceBundle resourceBundle) {
Stage stage = factory.create();
stage.setTitle(resourceBundle.getString("dokanySupportEnd.title"));
stage.setMinWidth(500);
stage.setMinHeight(100);
stage.initModality(Modality.APPLICATION_MODAL);
return stage;
}
@Provides
@FxmlScene(FxmlFile.DOKANY_SUPPORT_END)
@DokanySupportEndScoped
static Scene provideDokanySupportEndScene(@DokanySupportEndWindow FxmlLoaderFactory fxmlLoaders) {
return fxmlLoaders.createScene(FxmlFile.DOKANY_SUPPORT_END);
}
@Binds
@IntoMap
@FxControllerKey(DokanySupportEndController.class)
abstract FxController bindDokanySupportEndController(DokanySupportEndController controller);
}
@@ -0,0 +1,13 @@
package org.cryptomator.ui.dokanysupportend;
import javax.inject.Scope;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Scope
@Documented
@Retention(RetentionPolicy.RUNTIME)
@interface DokanySupportEndScoped {
}
@@ -0,0 +1,14 @@
package org.cryptomator.ui.dokanysupportend;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Documented
@Retention(RUNTIME)
@interface DokanySupportEndWindow {
}
@@ -3,6 +3,7 @@ package org.cryptomator.ui.fxapp;
import dagger.Lazy; import dagger.Lazy;
import org.cryptomator.common.Environment; import org.cryptomator.common.Environment;
import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.ui.traymenu.TrayMenuComponent; import org.cryptomator.ui.traymenu.TrayMenuComponent;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -75,7 +76,27 @@ public class FxApplication {
appWindows.checkAndShowUpdateReminderWindow(); appWindows.checkAndShowUpdateReminderWindow();
} }
migrateAndInformDokanyRemoval();
launchEventHandler.startHandlingLaunchEvents(); launchEventHandler.startHandlingLaunchEvents();
autoUnlocker.tryUnlockForTimespan(2, TimeUnit.MINUTES); autoUnlocker.tryUnlockForTimespan(2, TimeUnit.MINUTES);
} }
private void migrateAndInformDokanyRemoval() {
var dokanyProviderId = "org.cryptomator.frontend.dokany.mount.DokanyMountProvider";
boolean dokanyFound = false;
if (settings.mountService.getValueSafe().equals(dokanyProviderId)) {
dokanyFound = true;
settings.mountService.set(null);
}
for (VaultSettings vaultSettings : settings.directories) {
if (vaultSettings.mountService.getValueSafe().equals(dokanyProviderId)) {
dokanyFound = true;
vaultSettings.mountService.set(null);
}
}
if (dokanyFound) {
appWindows.showDokanySupportEndWindow();
}
}
} }
@@ -7,6 +7,7 @@ package org.cryptomator.ui.fxapp;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import org.cryptomator.ui.dokanysupportend.DokanySupportEndComponent;
import org.cryptomator.ui.error.ErrorComponent; import org.cryptomator.ui.error.ErrorComponent;
import org.cryptomator.ui.health.HealthCheckComponent; import org.cryptomator.ui.health.HealthCheckComponent;
import org.cryptomator.ui.lock.LockComponent; import org.cryptomator.ui.lock.LockComponent;
@@ -33,6 +34,7 @@ import java.io.InputStream;
ErrorComponent.class, // ErrorComponent.class, //
HealthCheckComponent.class, // HealthCheckComponent.class, //
UpdateReminderComponent.class, // UpdateReminderComponent.class, //
DokanySupportEndComponent.class, //
ShareVaultComponent.class}) ShareVaultComponent.class})
abstract class FxApplicationModule { abstract class FxApplicationModule {
@@ -5,6 +5,7 @@ import dagger.Lazy;
import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultState; import org.cryptomator.common.vaults.VaultState;
import org.cryptomator.integrations.tray.TrayIntegrationProvider; import org.cryptomator.integrations.tray.TrayIntegrationProvider;
import org.cryptomator.ui.dokanysupportend.DokanySupportEndComponent;
import org.cryptomator.ui.error.ErrorComponent; import org.cryptomator.ui.error.ErrorComponent;
import org.cryptomator.ui.lock.LockComponent; import org.cryptomator.ui.lock.LockComponent;
import org.cryptomator.ui.mainwindow.MainWindowComponent; import org.cryptomator.ui.mainwindow.MainWindowComponent;
@@ -48,6 +49,7 @@ public class FxApplicationWindows {
private final QuitComponent.Builder quitWindowBuilder; private final QuitComponent.Builder quitWindowBuilder;
private final UnlockComponent.Factory unlockWorkflowFactory; private final UnlockComponent.Factory unlockWorkflowFactory;
private final UpdateReminderComponent.Factory updateReminderWindowBuilder; private final UpdateReminderComponent.Factory updateReminderWindowBuilder;
private final DokanySupportEndComponent.Factory dokanySupportEndWindowBuilder;
private final LockComponent.Factory lockWorkflowFactory; private final LockComponent.Factory lockWorkflowFactory;
private final ErrorComponent.Factory errorWindowFactory; private final ErrorComponent.Factory errorWindowFactory;
private final ExecutorService executor; private final ExecutorService executor;
@@ -56,13 +58,14 @@ public class FxApplicationWindows {
private final FilteredList<Window> visibleWindows; private final FilteredList<Window> visibleWindows;
@Inject @Inject
public FxApplicationWindows(@PrimaryStage Stage primaryStage, public FxApplicationWindows(@PrimaryStage Stage primaryStage, //
Optional<TrayIntegrationProvider> trayIntegration, // Optional<TrayIntegrationProvider> trayIntegration, //
Lazy<MainWindowComponent> mainWindow, // Lazy<MainWindowComponent> mainWindow, //
Lazy<PreferencesComponent> preferencesWindow, // Lazy<PreferencesComponent> preferencesWindow, //
QuitComponent.Builder quitWindowBuilder, // QuitComponent.Builder quitWindowBuilder, //
UnlockComponent.Factory unlockWorkflowFactory, // UnlockComponent.Factory unlockWorkflowFactory, //
UpdateReminderComponent.Factory updateReminderWindowBuilder, // UpdateReminderComponent.Factory updateReminderWindowBuilder, //
DokanySupportEndComponent.Factory dokanySupportEndWindowBuilder, //
LockComponent.Factory lockWorkflowFactory, // LockComponent.Factory lockWorkflowFactory, //
ErrorComponent.Factory errorWindowFactory, // ErrorComponent.Factory errorWindowFactory, //
VaultOptionsComponent.Factory vaultOptionsWindow, // VaultOptionsComponent.Factory vaultOptionsWindow, //
@@ -75,6 +78,7 @@ public class FxApplicationWindows {
this.quitWindowBuilder = quitWindowBuilder; this.quitWindowBuilder = quitWindowBuilder;
this.unlockWorkflowFactory = unlockWorkflowFactory; this.unlockWorkflowFactory = unlockWorkflowFactory;
this.updateReminderWindowBuilder = updateReminderWindowBuilder; this.updateReminderWindowBuilder = updateReminderWindowBuilder;
this.dokanySupportEndWindowBuilder = dokanySupportEndWindowBuilder;
this.lockWorkflowFactory = lockWorkflowFactory; this.lockWorkflowFactory = lockWorkflowFactory;
this.errorWindowFactory = errorWindowFactory; this.errorWindowFactory = errorWindowFactory;
this.executor = executor; this.executor = executor;
@@ -142,6 +146,11 @@ public class FxApplicationWindows {
CompletableFuture.runAsync(() -> updateReminderWindowBuilder.create().checkAndShowUpdateReminderWindow(), Platform::runLater); CompletableFuture.runAsync(() -> updateReminderWindowBuilder.create().checkAndShowUpdateReminderWindow(), Platform::runLater);
} }
public void showDokanySupportEndWindow() {
CompletableFuture.runAsync(() -> dokanySupportEndWindowBuilder.create().showDokanySupportEndWindow(), Platform::runLater);
}
public CompletionStage<Void> startUnlockWorkflow(Vault vault, @Nullable Stage owner) { public CompletionStage<Void> startUnlockWorkflow(Vault vault, @Nullable Stage owner) {
return CompletableFuture.supplyAsync(() -> { return CompletableFuture.supplyAsync(() -> {
Preconditions.checkState(vault.stateProperty().transition(VaultState.Value.LOCKED, VaultState.Value.PROCESSING), "Vault not locked."); Preconditions.checkState(vault.stateProperty().transition(VaultState.Value.LOCKED, VaultState.Value.PROCESSING), "Vault not locked.");
@@ -1,45 +1,57 @@
package org.cryptomator.ui.fxapp; package org.cryptomator.ui.fxapp;
import org.cryptomator.common.Environment; import org.cryptomator.common.Environment;
import org.cryptomator.common.SemVerComparator;
import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.Settings;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding; import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ReadOnlyStringProperty; import javafx.beans.property.ReadOnlyStringProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty; import javafx.beans.property.StringProperty;
import javafx.concurrent.ScheduledService; import javafx.concurrent.ScheduledService;
import javafx.concurrent.Worker; import javafx.concurrent.Worker;
import javafx.concurrent.WorkerStateEvent; import javafx.concurrent.WorkerStateEvent;
import javafx.util.Duration; import javafx.util.Duration;
import java.time.Instant;
import java.util.Comparator; import java.util.Comparator;
@FxApplicationScoped @FxApplicationScoped
public class UpdateChecker { public class UpdateChecker {
private static final Logger LOG = LoggerFactory.getLogger(UpdateChecker.class); private static final Logger LOG = LoggerFactory.getLogger(UpdateChecker.class);
private static final Duration AUTOCHECK_DELAY = Duration.seconds(5); private static final Duration AUTO_CHECK_DELAY = Duration.seconds(5);
private final Environment env; private final Environment env;
private final Settings settings; private final Settings settings;
private final StringProperty latestVersionProperty; private final StringProperty latestVersion = new SimpleStringProperty();
private final Comparator<String> semVerComparator;
private final ScheduledService<String> updateCheckerService; private final ScheduledService<String> updateCheckerService;
private final ObjectProperty<UpdateCheckState> state = new SimpleObjectProperty<>(UpdateCheckState.NOT_CHECKED);
private final ObjectProperty<Instant> lastSuccessfulUpdateCheck;
private final Comparator<String> versionComparator = new SemVerComparator();
private final BooleanBinding updateAvailable;
private final BooleanBinding checkFailed;
@Inject @Inject
UpdateChecker(Settings settings, Environment env, @Named("latestVersion") StringProperty latestVersionProperty, @Named("SemVer") Comparator<String> semVerComparator, ScheduledService<String> updateCheckerService) { UpdateChecker(Settings settings, //
Environment env, //
ScheduledService<String> updateCheckerService) {
this.env = env; this.env = env;
this.settings = settings; this.settings = settings;
this.latestVersionProperty = latestVersionProperty;
this.semVerComparator = semVerComparator;
this.updateCheckerService = updateCheckerService; this.updateCheckerService = updateCheckerService;
this.lastSuccessfulUpdateCheck = settings.lastSuccessfulUpdateCheck;
this.updateAvailable = Bindings.createBooleanBinding(this::isUpdateAvailable, latestVersion);
this.checkFailed = Bindings.equal(UpdateCheckState.CHECK_FAILED, state);
} }
public void automaticallyCheckForUpdatesIfEnabled() { public void automaticallyCheckForUpdatesIfEnabled() {
if (!env.disableUpdateCheck() && settings.checkForUpdates.get()) { if (!env.disableUpdateCheck() && settings.checkForUpdates.get()) {
startCheckingForUpdates(AUTOCHECK_DELAY); startCheckingForUpdates(AUTO_CHECK_DELAY);
} }
} }
@@ -59,36 +71,65 @@ public class UpdateChecker {
private void checkStarted(WorkerStateEvent event) { private void checkStarted(WorkerStateEvent event) {
LOG.debug("Checking for updates..."); LOG.debug("Checking for updates...");
state.set(UpdateCheckState.IS_CHECKING);
} }
private void checkSucceeded(WorkerStateEvent event) { private void checkSucceeded(WorkerStateEvent event) {
String latestVersion = updateCheckerService.getValue(); var latestVersionString = updateCheckerService.getValue();
LOG.info("Current version: {}, lastest version: {}", getCurrentVersion(), latestVersion); LOG.info("Current version: {}, latest version: {}", getCurrentVersion(), latestVersionString);
lastSuccessfulUpdateCheck.set(Instant.now());
if (semVerComparator.compare(getCurrentVersion(), latestVersion) < 0) { latestVersion.set(latestVersionString);
// update is available state.set(UpdateCheckState.CHECK_SUCCESSFUL);
latestVersionProperty.set(latestVersion);
} else {
latestVersionProperty.set(null);
}
} }
private void checkFailed(WorkerStateEvent event) { private void checkFailed(WorkerStateEvent event) {
LOG.warn("Error checking for updates", event.getSource().getException()); state.set(UpdateCheckState.CHECK_FAILED);
}
public enum UpdateCheckState {
NOT_CHECKED,
IS_CHECKING,
CHECK_SUCCESSFUL,
CHECK_FAILED;
} }
/* Observable Properties */ /* Observable Properties */
public BooleanBinding checkingForUpdatesProperty() { public BooleanBinding checkingForUpdatesProperty() {
return updateCheckerService.stateProperty().isEqualTo(Worker.State.RUNNING); return updateCheckerService.stateProperty().isEqualTo(Worker.State.RUNNING);
} }
public ReadOnlyStringProperty latestVersionProperty() { public ReadOnlyStringProperty latestVersionProperty() {
return latestVersionProperty; return latestVersion;
}
public BooleanBinding updateAvailableProperty() {
return updateAvailable;
}
public BooleanBinding checkFailedProperty() {
return checkFailed;
}
public boolean isUpdateAvailable() {
String currentVersion = getCurrentVersion();
String latestVersionString = latestVersion.get();
if (currentVersion == null || latestVersionString == null) {
return false;
} else {
return versionComparator.compare(currentVersion, latestVersionString) < 0;
}
}
public ObjectProperty<Instant> lastSuccessfulUpdateCheckProperty() {
return lastSuccessfulUpdateCheck;
}
public ObjectProperty<UpdateCheckState> updateCheckStateProperty() {
return state;
} }
public String getCurrentVersion() { public String getCurrentVersion() {
return env.getAppVersion(); return env.getAppVersion();
} }
} }
@@ -11,8 +11,6 @@ import org.slf4j.LoggerFactory;
import javax.inject.Named; import javax.inject.Named;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.beans.binding.ObjectBinding; import javafx.beans.binding.ObjectBinding;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.concurrent.ScheduledService; import javafx.concurrent.ScheduledService;
import javafx.concurrent.Task; import javafx.concurrent.Task;
import javafx.util.Duration; import javafx.util.Duration;
@@ -32,13 +30,6 @@ public abstract class UpdateCheckerModule {
private static final Duration UPDATE_CHECK_INTERVAL = Duration.hours(3); private static final Duration UPDATE_CHECK_INTERVAL = Duration.hours(3);
private static final Duration DISABLED_UPDATE_CHECK_INTERVAL = Duration.hours(100000); // Duration.INDEFINITE leads to overflows... private static final Duration DISABLED_UPDATE_CHECK_INTERVAL = Duration.hours(100000); // Duration.INDEFINITE leads to overflows...
@Provides
@Named("latestVersion")
@FxApplicationScoped
static StringProperty provideLatestVersion() {
return new SimpleStringProperty();
}
@Provides @Provides
@FxApplicationScoped @FxApplicationScoped
static Optional<HttpClient> provideHttpClient() { static Optional<HttpClient> provideHttpClient() {
@@ -46,7 +46,7 @@ public class MainWindowTitleController implements FxController {
this.appWindows = appWindows; this.appWindows = appWindows;
this.trayMenuInitialized = trayMenu.isInitialized(); this.trayMenuInitialized = trayMenu.isInitialized();
this.updateChecker = updateChecker; this.updateChecker = updateChecker;
this.updateAvailable = updateChecker.latestVersionProperty().isNotNull(); this.updateAvailable = updateChecker.updateAvailableProperty();
this.licenseHolder = licenseHolder; this.licenseHolder = licenseHolder;
this.settings = settings; this.settings = settings;
this.showMinimizeButton = Bindings.createBooleanBinding(this::isShowMinimizeButton, settings.showMinimizeButton, settings.showTrayIcon); this.showMinimizeButton = Bindings.createBooleanBinding(this::isShowMinimizeButton, settings.showMinimizeButton, settings.showTrayIcon);
@@ -7,6 +7,7 @@ import org.cryptomator.cryptofs.CryptoFileSystemProvider;
import org.cryptomator.cryptofs.DirStructure; import org.cryptomator.cryptofs.DirStructure;
import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent; import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent;
import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.common.VaultService;
import org.cryptomator.ui.fxapp.FxApplicationWindows; import org.cryptomator.ui.fxapp.FxApplicationWindows;
import org.cryptomator.ui.removevault.RemoveVaultComponent; import org.cryptomator.ui.removevault.RemoveVaultComponent;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -58,6 +59,7 @@ public class VaultListController implements FxController {
private final Stage mainWindow; private final Stage mainWindow;
private final ObservableList<Vault> vaults; private final ObservableList<Vault> vaults;
private final VaultService vaultService;
private final ObjectProperty<Vault> selectedVault; private final ObjectProperty<Vault> selectedVault;
private final VaultListCellFactory cellFactory; private final VaultListCellFactory cellFactory;
private final AddVaultWizardComponent.Builder addVaultWizard; private final AddVaultWizardComponent.Builder addVaultWizard;
@@ -79,6 +81,7 @@ public class VaultListController implements FxController {
ObservableList<Vault> vaults, // ObservableList<Vault> vaults, //
ObjectProperty<Vault> selectedVault, // ObjectProperty<Vault> selectedVault, //
VaultListCellFactory cellFactory, // VaultListCellFactory cellFactory, //
VaultService vaultService, //
AddVaultWizardComponent.Builder addVaultWizard, // AddVaultWizardComponent.Builder addVaultWizard, //
RemoveVaultComponent.Builder removeVaultDialogue, // RemoveVaultComponent.Builder removeVaultDialogue, //
VaultListManager vaultListManager, // VaultListManager vaultListManager, //
@@ -88,6 +91,7 @@ public class VaultListController implements FxController {
this.vaults = vaults; this.vaults = vaults;
this.selectedVault = selectedVault; this.selectedVault = selectedVault;
this.cellFactory = cellFactory; this.cellFactory = cellFactory;
this.vaultService = vaultService;
this.addVaultWizard = addVaultWizard; this.addVaultWizard = addVaultWizard;
this.removeVaultDialogue = removeVaultDialogue; this.removeVaultDialogue = removeVaultDialogue;
this.vaultListManager = vaultListManager; this.vaultListManager = vaultListManager;
@@ -119,6 +123,9 @@ public class VaultListController implements FxController {
Optional.ofNullable(selectedVault.get()) Optional.ofNullable(selectedVault.get())
.filter(Vault::isLocked) .filter(Vault::isLocked)
.ifPresent(vault -> appWindows.startUnlockWorkflow(vault, mainWindow)); .ifPresent(vault -> appWindows.startUnlockWorkflow(vault, mainWindow));
Optional.ofNullable(selectedVault.get())
.filter(Vault::isUnlocked)
.ifPresent(vaultService::reveal);
} }
}); });
@@ -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;
}
}
}
@@ -31,6 +31,7 @@ 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) {
@@ -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
} }
@@ -1,18 +1,33 @@
package org.cryptomator.ui.preferences; package org.cryptomator.ui.preferences;
import org.cryptomator.common.Environment;
import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.Settings;
import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.fxapp.UpdateChecker; import org.cryptomator.ui.fxapp.UpdateChecker;
import javax.inject.Inject; import javax.inject.Inject;
import javafx.animation.PauseTransition;
import javafx.application.Application; import javafx.application.Application;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding; import javafx.beans.binding.BooleanBinding;
import javafx.beans.binding.ObjectBinding; import javafx.beans.binding.ObjectBinding;
import javafx.beans.binding.StringBinding;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ReadOnlyStringProperty; import javafx.beans.property.ReadOnlyStringProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.CheckBox; import javafx.scene.control.CheckBox;
import javafx.scene.control.ContentDisplay; import javafx.scene.control.ContentDisplay;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;
import java.util.ResourceBundle;
@PreferencesScoped @PreferencesScoped
public class UpdatesPreferencesController implements FxController { public class UpdatesPreferencesController implements FxController {
@@ -20,29 +35,55 @@ public class UpdatesPreferencesController implements FxController {
private static final String DOWNLOADS_URI = "https://cryptomator.org/downloads"; private static final String DOWNLOADS_URI = "https://cryptomator.org/downloads";
private final Application application; private final Application application;
private final Environment environment;
private final ResourceBundle resourceBundle;
private final Settings settings; private final Settings settings;
private final UpdateChecker updateChecker; private final UpdateChecker updateChecker;
private final ObjectBinding<ContentDisplay> checkForUpdatesButtonState; private final ObjectBinding<ContentDisplay> checkForUpdatesButtonState;
private final ReadOnlyStringProperty latestVersion; private final ReadOnlyStringProperty latestVersion;
private final ObservableValue<Instant> lastSuccessfulUpdateCheck;
private final StringBinding lastUpdateCheckMessage;
private final ObservableValue<String> timeDifferenceMessage;
private final String currentVersion; private final String currentVersion;
private final BooleanBinding updateAvailable; private final BooleanBinding updateAvailable;
private final BooleanBinding checkFailed;
private final BooleanProperty upToDateLabelVisible = new SimpleBooleanProperty(false);
private final DateTimeFormatter formatter;
private final BooleanBinding upToDate;
/* FXML */ /* FXML */
public CheckBox checkForUpdatesCheckbox; public CheckBox checkForUpdatesCheckbox;
@Inject @Inject
UpdatesPreferencesController(Application application, Settings settings, UpdateChecker updateChecker) { UpdatesPreferencesController(Application application, Environment environment, ResourceBundle resourceBundle, Settings settings, UpdateChecker updateChecker) {
this.application = application; this.application = application;
this.environment = environment;
this.resourceBundle = resourceBundle;
this.settings = settings; this.settings = settings;
this.updateChecker = updateChecker; this.updateChecker = updateChecker;
this.checkForUpdatesButtonState = Bindings.when(updateChecker.checkingForUpdatesProperty()).then(ContentDisplay.LEFT).otherwise(ContentDisplay.TEXT_ONLY); this.checkForUpdatesButtonState = Bindings.when(updateChecker.checkingForUpdatesProperty()).then(ContentDisplay.LEFT).otherwise(ContentDisplay.TEXT_ONLY);
this.latestVersion = updateChecker.latestVersionProperty(); this.latestVersion = updateChecker.latestVersionProperty();
this.updateAvailable = latestVersion.isNotNull(); this.lastSuccessfulUpdateCheck = updateChecker.lastSuccessfulUpdateCheckProperty();
this.timeDifferenceMessage = Bindings.createStringBinding(this::getTimeDifferenceMessage, lastSuccessfulUpdateCheck);
this.currentVersion = updateChecker.getCurrentVersion(); this.currentVersion = updateChecker.getCurrentVersion();
this.updateAvailable = updateChecker.updateAvailableProperty();
this.formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.getDefault());
this.upToDate = updateChecker.updateCheckStateProperty().isEqualTo(UpdateChecker.UpdateCheckState.CHECK_SUCCESSFUL).and(latestVersion.isEqualTo(currentVersion));
this.checkFailed = updateChecker.checkFailedProperty();
this.lastUpdateCheckMessage = Bindings.createStringBinding(this::getLastUpdateCheckMessage, lastSuccessfulUpdateCheck);
} }
public void initialize() { public void initialize() {
checkForUpdatesCheckbox.selectedProperty().bindBidirectional(settings.checkForUpdates); checkForUpdatesCheckbox.selectedProperty().bindBidirectional(settings.checkForUpdates);
upToDate.addListener((_, _, newVal) -> {
if (newVal) {
upToDateLabelVisible.set(true);
PauseTransition delay = new PauseTransition(javafx.util.Duration.seconds(5));
delay.setOnFinished(_ -> upToDateLabelVisible.set(false));
delay.play();
}
});
} }
@FXML @FXML
@@ -55,6 +96,11 @@ public class UpdatesPreferencesController implements FxController {
application.getHostServices().showDocument(DOWNLOADS_URI); application.getHostServices().showDocument(DOWNLOADS_URI);
} }
@FXML
public void showLogfileDirectory() {
environment.getLogDir().ifPresent(logDirPath -> application.getHostServices().showDocument(logDirPath.toUri().toString()));
}
/* Observable Properties */ /* Observable Properties */
public ObjectBinding<ContentDisplay> checkForUpdatesButtonStateProperty() { public ObjectBinding<ContentDisplay> checkForUpdatesButtonStateProperty() {
@@ -77,6 +123,46 @@ public class UpdatesPreferencesController implements FxController {
return currentVersion; return currentVersion;
} }
public StringBinding lastUpdateCheckMessageProperty() {
return lastUpdateCheckMessage;
}
public String getLastUpdateCheckMessage() {
Instant lastCheck = lastSuccessfulUpdateCheck.getValue();
if (lastCheck != null && !lastCheck.equals(Settings.DEFAULT_TIMESTAMP)) {
return formatter.format(LocalDateTime.ofInstant(lastCheck, ZoneId.systemDefault()));
} else {
return "-";
}
}
public ObservableValue<String> timeDifferenceMessageProperty() {
return timeDifferenceMessage;
}
public String getTimeDifferenceMessage() {
var lastSuccessCheck = lastSuccessfulUpdateCheck.getValue();
var duration = Duration.between(lastSuccessCheck, Instant.now());
var hours = duration.toHours();
if (lastSuccessCheck.equals(Settings.DEFAULT_TIMESTAMP)) {
return resourceBundle.getString("preferences.updates.lastUpdateCheck.never");
} else if (hours < 1) {
return resourceBundle.getString("preferences.updates.lastUpdateCheck.recently");
} else if (hours < 24) {
return String.format(resourceBundle.getString("preferences.updates.lastUpdateCheck.hoursAgo"), hours);
} else {
return String.format(resourceBundle.getString("preferences.updates.lastUpdateCheck.daysAgo"), duration.toDays());
}
}
public BooleanProperty upToDateLabelVisibleProperty() {
return upToDateLabelVisible;
}
public boolean isUpToDateLabelVisible() {
return upToDateLabelVisible.get();
}
public BooleanBinding updateAvailableProperty() { public BooleanBinding updateAvailableProperty() {
return updateAvailable; return updateAvailable;
} }
@@ -84,4 +170,13 @@ public class UpdatesPreferencesController implements FxController {
public boolean isUpdateAvailable() { public boolean isUpdateAvailable() {
return updateAvailable.get(); return updateAvailable.get();
} }
public BooleanBinding checkFailedProperty() {
return checkFailed;
}
public boolean isCheckFailed() {
return checkFailed.getValue();
}
} }
@@ -8,7 +8,8 @@ import org.cryptomator.ui.common.FxmlScene;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.time.LocalDate; import java.time.Duration;
import java.time.Instant;
@UpdateReminderScoped @UpdateReminderScoped
@Subcomponent(modules = {UpdateReminderModule.class}) @Subcomponent(modules = {UpdateReminderModule.class})
@@ -23,7 +24,8 @@ public interface UpdateReminderComponent {
Settings settings(); Settings settings();
default void checkAndShowUpdateReminderWindow() { default void checkAndShowUpdateReminderWindow() {
if (LocalDate.parse(settings().lastUpdateCheck.get()).isBefore(LocalDate.now().minusDays(14)) && !settings().checkForUpdates.getValue()) { var now = Instant.now();
if (!settings().checkForUpdates.getValue() && settings().lastSuccessfulUpdateCheck.get().isBefore(now.minus(Duration.ofDays(14)))) {
Stage stage = window(); Stage stage = window();
stage.setScene(updateReminderScene().get()); stage.setScene(updateReminderScene().get());
stage.sizeToScene(); stage.sizeToScene();
@@ -33,6 +35,7 @@ public interface UpdateReminderComponent {
@Subcomponent.Factory @Subcomponent.Factory
interface Factory { interface Factory {
UpdateReminderComponent create(); UpdateReminderComponent create();
} }
} }
@@ -7,8 +7,6 @@ import org.cryptomator.ui.fxapp.UpdateChecker;
import javax.inject.Inject; import javax.inject.Inject;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
@UpdateReminderScoped @UpdateReminderScoped
public class UpdateReminderController implements FxController { public class UpdateReminderController implements FxController {
@@ -27,20 +25,17 @@ public class UpdateReminderController implements FxController {
@FXML @FXML
public void cancel() { public void cancel() {
settings.lastUpdateCheck.set(LocalDate.now().format(DateTimeFormatter.ISO_DATE));
window.close(); window.close();
} }
@FXML @FXML
public void once() { public void once() {
settings.lastUpdateCheck.set(LocalDate.now().format(DateTimeFormatter.ISO_DATE));
updateChecker.checkForUpdatesNow(); updateChecker.checkForUpdatesNow();
window.close(); window.close();
} }
@FXML @FXML
public void automatically() { public void automatically() {
settings.lastUpdateCheck.set(LocalDate.now().format(DateTimeFormatter.ISO_DATE));
updateChecker.checkForUpdatesNow(); updateChecker.checkForUpdatesNow();
settings.checkForUpdates.set(true); settings.checkForUpdates.set(true);
window.close(); window.close();
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.Group?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Region?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?>
<HBox xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx"
fx:controller="org.cryptomator.ui.dokanysupportend.DokanySupportEndController"
minWidth="500"
prefWidth="500"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
<children>
<Group>
<StackPane>
<padding>
<Insets topRightBottomLeft="6"/>
</padding>
<Circle styleClass="glyph-icon-primary" radius="24"/>
<FontAwesome5IconView styleClass="glyph-icon-white" glyph="EXCLAMATION" glyphSize="24"/>
</StackPane>
</Group>
<VBox HBox.hgrow="ALWAYS">
<Label styleClass="label-large" text="%dokanySupportEnd.message" wrapText="true">
<padding>
<Insets bottom="6" top="6"/>
</padding>
</Label>
<Label text="%dokanySupportEnd.description" wrapText="true"/>
<Region VBox.vgrow="ALWAYS" minHeight="18"/>
<ButtonBar buttonMinWidth="120" buttonOrder="+UC">
<buttons>
<Button text="%dokanySupportEnd.preferencesBtn" ButtonBar.buttonData="OTHER" cancelButton="true" onAction="#openVolumePreferences"/>
<Button text="%generic.button.close" ButtonBar.buttonData="CANCEL_CLOSE" cancelButton="true" onAction="#close" defaultButton="true"/>
</buttons>
</ButtonBar>
</VBox>
</children>
</HBox>
+8
View File
@@ -46,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"/>
@@ -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>
@@ -1,13 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
<?import org.cryptomator.ui.controls.FontAwesome5Spinner?>
<?import org.cryptomator.ui.controls.FormattedLabel?> <?import org.cryptomator.ui.controls.FormattedLabel?>
<?import org.cryptomator.ui.controls.FormattedString?> <?import org.cryptomator.ui.controls.FormattedString?>
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?> <?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?> <?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Hyperlink?> <?import javafx.scene.control.Hyperlink?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import org.cryptomator.ui.controls.FontAwesome5Spinner?> <?import javafx.scene.control.Tooltip?>
<?import javafx.scene.text.TextFlow?>
<?import javafx.scene.text.Text?>
<VBox xmlns:fx="http://javafx.com/fxml" <VBox xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx" xmlns="http://javafx.com/javafx"
fx:controller="org.cryptomator.ui.preferences.UpdatesPreferencesController" fx:controller="org.cryptomator.ui.preferences.UpdatesPreferencesController"
@@ -18,19 +24,34 @@
<padding> <padding>
<Insets topRightBottomLeft="24"/> <Insets topRightBottomLeft="24"/>
</padding> </padding>
<children> <FormattedLabel format="%preferences.updates.currentVersion" arg1="${controller.currentVersion}" textAlignment="CENTER" wrapText="true"/>
<FormattedLabel format="%preferences.updates.currentVersion" arg1="${controller.currentVersion}" textAlignment="CENTER" wrapText="true"/>
<CheckBox fx:id="checkForUpdatesCheckbox" text="%preferences.updates.autoUpdateCheck"/> <CheckBox fx:id="checkForUpdatesCheckbox" text="%preferences.updates.autoUpdateCheck"/>
<VBox alignment="CENTER" spacing="12"> <VBox alignment="CENTER" spacing="12">
<Button text="%preferences.updates.checkNowBtn" defaultButton="true" onAction="#checkNow" contentDisplay="${controller.checkForUpdatesButtonState}"> <Button text="%preferences.updates.checkNowBtn" defaultButton="true" onAction="#checkNow" contentDisplay="${controller.checkForUpdatesButtonState}">
<graphic> <graphic>
<FontAwesome5Spinner fx:id="spinner" glyphSize="12"/> <FontAwesome5Spinner glyphSize="12"/>
</graphic> </graphic>
</Button> </Button>
<Hyperlink text="${linkLabel.value}" onAction="#visitDownloadsPage" textAlignment="CENTER" wrapText="true" styleClass="hyperlink-underline" visible="${controller.updateAvailable}"/> <TextFlow styleClass="text-flow" textAlignment="CENTER" visible="${controller.checkFailed}" managed="${controller.checkFailed}">
</VBox> <FontAwesome5IconView glyphSize="12" styleClass="glyph-icon-orange" glyph="EXCLAMATION_TRIANGLE"/>
</children> <Text text=" "/>
<Text text="%preferences.updates.checkFailed"/>
<Text text=" "/>
<Hyperlink styleClass="hyperlink-underline" text="%preferences.general.debugDirectory" onAction="#showLogfileDirectory"/>
</TextFlow>
<FormattedLabel format="%preferences.updates.lastUpdateCheck" arg1="${controller.timeDifferenceMessage}" textAlignment="CENTER" wrapText="true">
<tooltip>
<Tooltip text="${controller.lastUpdateCheckMessage}" showDelay="10ms"/>
</tooltip>
</FormattedLabel>
<Label text="%preferences.updates.upToDate" visible="${controller.upToDateLabelVisible}" managed="${controller.upToDateLabelVisible}">
<graphic>
<FontAwesome5IconView glyphSize="12" styleClass="glyph-icon-primary" glyph="CHECK"/>
</graphic>
</Label>
<Hyperlink text="${linkLabel.value}" onAction="#visitDownloadsPage" textAlignment="CENTER" wrapText="true" styleClass="hyperlink-underline" visible="${controller.updateAvailable}" managed="${controller.updateAvailable}"/>
</VBox>
</VBox> </VBox>
@@ -321,6 +321,16 @@ preferences.updates.currentVersion=Current Version: %s
preferences.updates.autoUpdateCheck=Check for updates automatically preferences.updates.autoUpdateCheck=Check for updates automatically
preferences.updates.checkNowBtn=Check Now preferences.updates.checkNowBtn=Check Now
preferences.updates.updateAvailable=Update to version %s available. preferences.updates.updateAvailable=Update to version %s available.
preferences.updates.lastUpdateCheck=Last check: %s
preferences.updates.lastUpdateCheck.never=never
preferences.updates.lastUpdateCheck.recently=recently
preferences.updates.lastUpdateCheck.daysAgo=%s days ago
preferences.updates.lastUpdateCheck.hoursAgo=%s hours ago
preferences.updates.checkFailed=Looking for updates failed. Please check your internet connection or try again later.
preferences.updates.upToDate=Cryptomator is up-to-date.
## Network
preferences.network=Network
## Contribution ## Contribution
preferences.contribute=Support Us preferences.contribute=Support Us
preferences.contribute.registeredFor=Supporter certificate registered for %s preferences.contribute.registeredFor=Supporter certificate registered for %s
@@ -533,6 +543,12 @@ updateReminder.notNow=Not Now
updateReminder.yesOnce=Yes, Once updateReminder.yesOnce=Yes, Once
updateReminder.yesAutomatically=Yes, Automatically updateReminder.yesAutomatically=Yes, Automatically
#Dokany Support End
dokanySupportEnd.title=Deprecation notice
dokanySupportEnd.message=Support end for Dokany
dokanySupportEnd.description=The volume type Dokany is no longer supported by Cryptomator. Your settings are adjusted to use the default volume type now. You can view the default type in the preferences.
dokanySupportEnd.preferencesBtn=Open Preferences
# Share Vault # Share Vault
shareVault.title=Share Vault shareVault.title=Share Vault
shareVault.message=Would you like to share your vault with others? shareVault.message=Would you like to share your vault with others?
@@ -47,6 +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.locationLabel=موقع التخزين addvaultwizard.new.locationLabel=موقع التخزين
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=موقع مخصص addvaultwizard.new.directoryPickerLabel=موقع مخصص
@@ -141,6 +142,9 @@ unlock.error.customPath.description.hideawayNotDir=لا يمكن إزالة ال
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.description=اختر نوع قرص آخر في خيارات المخزن أو اعد تشغيل Cryptomator.
unlock.error.title=فشل فتح "%s"
## Hub ## Hub
hub.noKeychain.message=غير قادر على الوصول إلى مفتاح الجهاز hub.noKeychain.message=غير قادر على الوصول إلى مفتاح الجهاز
hub.noKeychain.description=من أجل فتح مركز مخازن، مطلوب مفتاح جهاز، يتم تأمينه باستخدام سلسلة مفاتيح. للمضي قدما، قم بتمكين "%s" واختر سلسلة مفاتيح في التفضيلات. hub.noKeychain.description=من أجل فتح مركز مخازن، مطلوب مفتاح جهاز، يتم تأمينه باستخدام سلسلة مفاتيح. للمضي قدما، قم بتمكين "%s" واختر سلسلة مفاتيح في التفضيلات.
@@ -153,11 +157,22 @@ hub.auth.loginLink=لم يتم إعادة توجيهك؟ انقر هنا لفت
hub.receive.message=معالجة الاستجابة… hub.receive.message=معالجة الاستجابة…
hub.receive.description=Cryptomator يتلقى ويعالج الاستجابة من المركز. الرجاء الانتظار. hub.receive.description=Cryptomator يتلقى ويعالج الاستجابة من المركز. الرجاء الانتظار.
### Register Device ### Register Device
hub.register.message=جهاز جديد
hub.register.description=هذا هو أول وصول مركزي من هذا الجهاز. الرجاء تسجيله باستخدام مفتاح الحساب الخاص بك.
hub.register.nameLabel=اسم الجهاز hub.register.nameLabel=اسم الجهاز
hub.register.invalidAccountKeyLabel=مفتاح الحساب غير صحيح
hub.register.registerBtn=تسجيل
### Register Device Legacy ### Register Device Legacy
hub.register.legacy.occupiedMsg=الاسم قيد الاستخدام
hub.register.legacy.description=هذا هو أول وصول للمركز من هذا الجهاز. الرجاء تسجيله.
### Registration Success ### Registration Success
hub.registerSuccess.message=تم تسجيل الجهاز
hub.registerSuccess.description=تم تسجيل جهازك بنجاح. يمكنك الآن المتابعة لفتح الخزنة.
hub.registerSuccess.unlockBtn=افتح hub.registerSuccess.unlockBtn=افتح
hub.registerSuccess.legacy.description=للدخول إلى الخزينة، يحتاج جهازك كذالك إلى إذن من مالك الخزينة.
### Registration Failed ### Registration Failed
hub.registerFailed.message=فشل تسجيل الجهاز
hub.registerFailed.description.generic=حدث خطأ في عملية تسجيل الاسم. لمزيد من التفاصيل، راجع سجل التطبيق.
### Unauthorized ### Unauthorized
hub.unauthorized.message=تم رفض الوصول hub.unauthorized.message=تم رفض الوصول
hub.unauthorized.description=لم يتم بعد منح الإذن لجهازك بالوصول إلى هذا المخزن. اطلب من مالك المخزن أن يأذن بذلك. hub.unauthorized.description=لم يتم بعد منح الإذن لجهازك بالوصول إلى هذا المخزن. اطلب من مالك المخزن أن يأذن بذلك.
@@ -283,16 +298,21 @@ preferences.interface.showMinimizeButton=إظهار زر التصغير
preferences.interface.showTrayIcon=إظهار أيقونة اللوحة (يتطلب إعادة تشغيل) preferences.interface.showTrayIcon=إظهار أيقونة اللوحة (يتطلب إعادة تشغيل)
## Volume ## Volume
preferences.volume=القرص الإفتراضي preferences.volume=القرص الإفتراضي
preferences.volume.type=نوع القرص الافتراضي
preferences.volume.type.automatic=تلقائي preferences.volume.type.automatic=تلقائي
preferences.volume.docsTooltip=افتح الوثائق لمعرفة المزيد عن مختلف أنواع وحدة التخزين. preferences.volume.docsTooltip=افتح الوثائق لمعرفة المزيد عن مختلف أنواع وحدة التخزين.
preferences.volume.fuseRestartRequired=لتطبيق التغييرات، يحتاج Cryptomator إلى إعادة التشغيل. preferences.volume.fuseRestartRequired=لتطبيق التغييرات، يحتاج Cryptomator إلى إعادة التشغيل.
preferences.volume.tcp.port=منفذ TCP الافتراضي
preferences.volume.supportedFeatures=يدعم نوع وحدة تخزين المختار الميزات التالية: preferences.volume.supportedFeatures=يدعم نوع وحدة تخزين المختار الميزات التالية:
preferences.volume.feature.mountAuto=اختيار نقطة البَدْء التلقائية
preferences.volume.feature.readOnly=تحميل للقراءة فقط
## Updates ## Updates
preferences.updates=تحديثات preferences.updates=تحديثات
preferences.updates.currentVersion=الإصدار الحالي: %s preferences.updates.currentVersion=الإصدار الحالي: %s
preferences.updates.autoUpdateCheck=تحقق من التحديثات اوتوماتيكيا preferences.updates.autoUpdateCheck=تحقق من التحديثات اوتوماتيكيا
preferences.updates.checkNowBtn=تحقق الان preferences.updates.checkNowBtn=تحقق الان
preferences.updates.updateAvailable=التحديث إلى الإصدار %s متاح. preferences.updates.updateAvailable=التحديث إلى الإصدار %s متاح.
## Contribution ## Contribution
preferences.contribute=ادعمنا preferences.contribute=ادعمنا
preferences.contribute.registeredFor=شهادة الداعم مسجلة لـ %s preferences.contribute.registeredFor=شهادة الداعم مسجلة لـ %s
@@ -309,6 +329,8 @@ stats.title=إحصائيات عن %s
stats.cacheHitRate=معدل استخدام الكاش stats.cacheHitRate=معدل استخدام الكاش
## Read ## Read
stats.read.throughput.idle=قراءة: خامل stats.read.throughput.idle=قراءة: خامل
stats.read.throughput.kibs=القراءة: %.2f KiB/s
stats.read.throughput.mibs=القراءة: %.2f MiB/s
stats.decr.total.data.none=تم فك تشفير البيانات:- stats.decr.total.data.none=تم فك تشفير البيانات:-
## Write ## Write
stats.write.total.data.mib=البيانات المكتوبة: %.1f م.ب stats.write.total.data.mib=البيانات المكتوبة: %.1f م.ب
@@ -443,4 +465,7 @@ quit.lockAndQuitBtn=قفل و خروج
# Update Reminder # Update Reminder
#Dokany Support End
dokanySupportEnd.preferencesBtn=فتح التفضيلات
# Share Vault # Share Vault
@@ -308,6 +308,7 @@ preferences.updates.currentVersion=Ағымдағы версия: %s
preferences.updates.autoUpdateCheck=Яңыртыуҙарҙы автоматик рәүештә тикшереү preferences.updates.autoUpdateCheck=Яңыртыуҙарҙы автоматик рәүештә тикшереү
preferences.updates.checkNowBtn=Хәҙер тикшер preferences.updates.checkNowBtn=Хәҙер тикшер
preferences.updates.updateAvailable=%s версияһына тиклем яңыртыу бар. preferences.updates.updateAvailable=%s версияһына тиклем яңыртыу бар.
## Contribution ## Contribution
preferences.contribute=Ярҙам preferences.contribute=Ярҙам
preferences.contribute.registeredFor=%s өсөн теркәлгән ярҙамсы сертификаты preferences.contribute.registeredFor=%s өсөн теркәлгән ярҙамсы сертификаты
@@ -518,4 +519,7 @@ updateReminder.notNow=Хәҙер түгел
updateReminder.yesOnce=Эйе, бер тапҡыр updateReminder.yesOnce=Эйе, бер тапҡыр
updateReminder.yesAutomatically=Эйе, автоматик рәүештә updateReminder.yesAutomatically=Эйе, автоматик рәүештә
#Dokany Support End
dokanySupportEnd.preferencesBtn=Көйләүҙәрҙе ас
# Share Vault # Share Vault
@@ -295,6 +295,7 @@ preferences.updates.currentVersion=Бягучая версія: %s
preferences.updates.autoUpdateCheck=Правяраць наяўнасць абнаўленняў аўтаматычна preferences.updates.autoUpdateCheck=Правяраць наяўнасць абнаўленняў аўтаматычна
preferences.updates.checkNowBtn=Праверыць зараз preferences.updates.checkNowBtn=Праверыць зараз
preferences.updates.updateAvailable=Даступна абнаўленне да версіі %s preferences.updates.updateAvailable=Даступна абнаўленне да версіі %s
## Contribution ## Contribution
preferences.contribute=Падтрымай нас preferences.contribute=Падтрымай нас
preferences.contribute.registeredFor=Сэртыфікат ахвяравальніка зарэгістраваны на %s preferences.contribute.registeredFor=Сэртыфікат ахвяравальніка зарэгістраваны на %s
@@ -498,4 +499,7 @@ updateReminder.notNow=Не цяпер
updateReminder.yesOnce=Так, аднойчы updateReminder.yesOnce=Так, аднойчы
updateReminder.yesAutomatically=Так, аўтаматычна updateReminder.yesAutomatically=Так, аўтаматычна
#Dokany Support End
dokanySupportEnd.preferencesBtn=Адчыніць налады
# Share Vault # Share Vault
@@ -308,6 +308,7 @@ preferences.updates.currentVersion=Текущо издание: %s
preferences.updates.autoUpdateCheck=Автоматична проверка за издания preferences.updates.autoUpdateCheck=Автоматична проверка за издания
preferences.updates.checkNowBtn=Проверяване preferences.updates.checkNowBtn=Проверяване
preferences.updates.updateAvailable=Налично е ново издание %s. preferences.updates.updateAvailable=Налично е ново издание %s.
## Contribution ## Contribution
preferences.contribute=Подкрепете ни preferences.contribute=Подкрепете ни
preferences.contribute.registeredFor=Сертификатът за дарение е регистриран на %s preferences.contribute.registeredFor=Сертификатът за дарение е регистриран на %s
@@ -518,4 +519,7 @@ updateReminder.notNow=Не сега
updateReminder.yesOnce=Да, веднъж updateReminder.yesOnce=Да, веднъж
updateReminder.yesAutomatically=Да, автоматично updateReminder.yesAutomatically=Да, автоматично
#Dokany Support End
dokanySupportEnd.preferencesBtn=Към настройките
# Share Vault # Share Vault
@@ -122,6 +122,7 @@ lock.forced.retryBtn=পুনরায় চেষ্টা করুন
## Interface ## Interface
## Volume ## Volume
## Updates ## Updates
## Contribution ## Contribution
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -175,4 +176,6 @@ vaultOptions.mount.mountPoint.directoryPickerButton=নির্বাচন ক
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault # Share Vault
@@ -171,6 +171,7 @@ preferences.updates.currentVersion=Trenutna verzija: %s
preferences.updates.autoUpdateCheck=Automatski provjeri ima li ažuriranja preferences.updates.autoUpdateCheck=Automatski provjeri ima li ažuriranja
preferences.updates.checkNowBtn=Provjeri sada preferences.updates.checkNowBtn=Provjeri sada
preferences.updates.updateAvailable=Dostupno ažuriranje na verziju %s. preferences.updates.updateAvailable=Dostupno ažuriranje na verziju %s.
## Contribution ## Contribution
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -317,4 +318,6 @@ quit.lockAndQuitBtn=Zaključaj i zatvori
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault # Share Vault
@@ -47,6 +47,7 @@ addvaultwizard.new.nameInstruction=Introduiu el nom de la caixa forta
addvaultwizard.new.namePrompt=Nom de la caixa forta addvaultwizard.new.namePrompt=Nom de la caixa forta
### Location ### Location
addvaultwizard.new.locationInstruction=On deu emmagatzemar Cryptomator els fitxers xifrats de la vostra caixa forta? addvaultwizard.new.locationInstruction=On deu emmagatzemar Cryptomator els fitxers xifrats de la vostra caixa forta?
addvaultwizard.new.locationLoading=Comprovació del sistema de fitxers locals per a trobar directoris habituals d'emmagatzematge al núvol…
addvaultwizard.new.locationLabel=Ubicació de l'emmagatzematge addvaultwizard.new.locationLabel=Ubicació de l'emmagatzematge
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Ubicació personalitzada addvaultwizard.new.directoryPickerLabel=Ubicació personalitzada
@@ -141,6 +142,9 @@ unlock.error.customPath.description.hideawayNotDir=El fitxer temporal "%3$s" uti
unlock.error.customPath.description.couldNotBeCleaned=La caixa forta no es pot muntar en "%s". Intenteu-ho de nou o escolliu un destí diferent, si us plau. unlock.error.customPath.description.couldNotBeCleaned=La caixa forta no es pot muntar en "%s". Intenteu-ho de nou o escolliu un destí diferent, si us plau.
unlock.error.customPath.description.notEmptyDir=El punt de muntatge "%s" no és una carpeta buida. Trieu una carpeta buida i proveu-ho de nou. unlock.error.customPath.description.notEmptyDir=El punt de muntatge "%s" no és una carpeta buida. Trieu una carpeta buida i proveu-ho de nou.
unlock.error.customPath.description.generic=Al anar a desar la caixa forta en el lloc indicat ha fallat amb el missatge: %2$s unlock.error.customPath.description.generic=Al anar a desar la caixa forta en el lloc indicat ha fallat amb el missatge: %2$s
unlock.error.restartRequired.message=No ha estat possible desblocar la caixa forta
unlock.error.restartRequired.description=Canvieu el tipus de volum en les opcions de la caixa forta o reinicieu Criptovalor.
unlock.error.title=El desblocatge de "%s" ha fallat
## Hub ## Hub
hub.noKeychain.message=No es pot accedir a la clau del dispositiu hub.noKeychain.message=No es pot accedir a la clau del dispositiu
hub.noKeychain.description=Per poder desblocar caixes fortes del Hub es requereix la clau d'un dispositiu, que s'emmagatzema de forma segura en un clauer. Per continuar, habiliti "%s" i seleccioni un clauer en les Preferències. hub.noKeychain.description=Per poder desblocar caixes fortes del Hub es requereix la clau d'un dispositiu, que s'emmagatzema de forma segura en un clauer. Per continuar, habiliti "%s" i seleccioni un clauer en les Preferències.
@@ -154,15 +158,30 @@ hub.receive.message=S'està processant la resposta…
hub.receive.description=Cryptomator està rebent i processant la resposta del Hub. Espereu, si us plau. hub.receive.description=Cryptomator està rebent i processant la resposta del Hub. Espereu, si us plau.
### Register Device ### Register Device
hub.register.message=Nou dispositiu hub.register.message=Nou dispositiu
hub.register.description=Aquest és el primer accés a Hub d'aquest dispositiu. Si us plau, registreu-vos-hi amb la vostra Account Key.
hub.register.nameLabel=Nom del dispositiu hub.register.nameLabel=Nom del dispositiu
hub.register.invalidAccountKeyLabel=Account Key no és vàlida
hub.register.registerBtn=Registre
### Register Device Legacy ### Register Device Legacy
hub.register.legacy.occupiedMsg=El nom ja està en ús
hub.register.legacy.description=Aquest és el primer accés a Hub d'aquest dispositiu. Si us plau, registreu-lo.
### Registration Success ### Registration Success
hub.registerSuccess.message=Dispositiu registrat
hub.registerSuccess.description=El vostre dispositiu ha estat registrat correctament. Ara podeu desblocar la caixa forta.
hub.registerSuccess.unlockBtn=Desbloqueja hub.registerSuccess.unlockBtn=Desbloqueja
hub.registerSuccess.legacy.description=Per a accedir a la caixa forta, el vostre dispositiu ha de ser autoritzat pel propietari de la caixa.
### Registration Failed ### Registration Failed
hub.registerFailed.message=El registre del dispositiu ha fallat
hub.registerFailed.description.generic=S'ha produït un error en el procés de registre. Per a obtindre'n més detalls vegeu els registres de l'aplicació.
hub.registerFailed.description.deviceAlreadyExists=El dispositiu ja ha estat registrat per un altre usuari. Mireu de canviar el compte d'usuari o feu servir un dispositiu diferent.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Accés denegat hub.unauthorized.message=Accés denegat
hub.unauthorized.description=El vostre dispositiu no ha estat encara autoritzat a accedir a aquesta caixa forta. Demaneu autorització al propietari. hub.unauthorized.description=El vostre dispositiu no ha estat encara autoritzat a accedir a aquesta caixa forta. Demaneu autorització al propietari.
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Acció necessària
hub.requireAccountInit.description.0=Per a continuar, si us plau, seguiu els passos necessaris en el vostre
hub.requireAccountInit.description.1=perfil d'usuari de Hub
hub.requireAccountInit.description.2=.
### License Exceeded ### License Exceeded
hub.invalidLicense.message=La llicència del Hub no és vàlida hub.invalidLicense.message=La llicència del Hub no és vàlida
hub.invalidLicense.description=Aquest Cryptomator Hub no té una llicència vàlida. Informa si us plau a l'administrador perquè actualitzi o renovi la llicència. hub.invalidLicense.description=Aquest Cryptomator Hub no té una llicència vàlida. Informa si us plau a l'administrador perquè actualitzi o renovi la llicència.
@@ -284,9 +303,11 @@ preferences.interface.showMinimizeButton=Mostra el botó 'minimitzar'
preferences.interface.showTrayIcon=Mostra la icona en la barra (cal reiniciar) preferences.interface.showTrayIcon=Mostra la icona en la barra (cal reiniciar)
## Volume ## Volume
preferences.volume=Unitat virtual preferences.volume=Unitat virtual
preferences.volume.type=Tipus de volum per defecte
preferences.volume.type.automatic=Automàtic preferences.volume.type.automatic=Automàtic
preferences.volume.docsTooltip=Obre la documentació per aprendre més sobre els diferents tipus de volums. preferences.volume.docsTooltip=Obre la documentació per aprendre més sobre els diferents tipus de volums.
preferences.volume.fuseRestartRequired=Per aplicar els canvis Cryptomator necessita reiniciar-se. preferences.volume.fuseRestartRequired=Per aplicar els canvis Cryptomator necessita reiniciar-se.
preferences.volume.tcp.port=Port TCP per defecte
preferences.volume.supportedFeatures=El tipus de volum escollit suporta les següents característiques: preferences.volume.supportedFeatures=El tipus de volum escollit suporta les següents característiques:
preferences.volume.feature.mountAuto=Selecció automàtica del punt de muntatge preferences.volume.feature.mountAuto=Selecció automàtica del punt de muntatge
preferences.volume.feature.mountToDir=Directori personalitzat com a punt de muntatge preferences.volume.feature.mountToDir=Directori personalitzat com a punt de muntatge
@@ -299,6 +320,7 @@ preferences.updates.currentVersion=Versió actual: %s
preferences.updates.autoUpdateCheck=Comprova automàticament si hi ha actualitzacions preferences.updates.autoUpdateCheck=Comprova automàticament si hi ha actualitzacions
preferences.updates.checkNowBtn=Comprova-ho ara preferences.updates.checkNowBtn=Comprova-ho ara
preferences.updates.updateAvailable=L'actualització a la versió %s es troba disponible. preferences.updates.updateAvailable=L'actualització a la versió %s es troba disponible.
## Contribution ## Contribution
preferences.contribute=Doneu-nos suport preferences.contribute=Doneu-nos suport
preferences.contribute.registeredFor=Certificat de col·laborador registrat per a %s preferences.contribute.registeredFor=Certificat de col·laborador registrat per a %s
@@ -371,6 +393,7 @@ main.vaultDetail.unlockBtn=Desbloca…
main.vaultDetail.unlockNowBtn=Desbloqueja ara main.vaultDetail.unlockNowBtn=Desbloqueja ara
main.vaultDetail.optionsBtn=Opcions de la caixa forta main.vaultDetail.optionsBtn=Opcions de la caixa forta
main.vaultDetail.passwordSavedInKeychain=Contrasenya desada main.vaultDetail.passwordSavedInKeychain=Contrasenya desada
main.vaultDetail.share=Compateix…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=DESBLOQUEJADA main.vaultDetail.unlockedStatus=DESBLOQUEJADA
main.vaultDetail.accessLocation=Els continguts de la vostra caixa forta són accessibles aquí: main.vaultDetail.accessLocation=Els continguts de la vostra caixa forta són accessibles aquí:
@@ -425,6 +448,7 @@ vaultOptions.general.startHealthCheckBtn=Inicia la comprovació
## Mount ## Mount
vaultOptions.mount=Muntatge vaultOptions.mount=Muntatge
vaultOptions.mount.info=Obriu les preferències de la unitat virtual per a canviar les preferències per defecte.
vaultOptions.mount.readonly=Només lectura vaultOptions.mount.readonly=Només lectura
vaultOptions.mount.customMountFlags=Senyaladors de muntatge personalitzats vaultOptions.mount.customMountFlags=Senyaladors de muntatge personalitzats
vaultOptions.mount.winDriveLetterOccupied=ocupat vaultOptions.mount.winDriveLetterOccupied=ocupat
@@ -434,6 +458,10 @@ vaultOptions.mount.mountPoint.driveLetter=Utilitza la lletra de la unitat assign
vaultOptions.mount.mountPoint.custom=Faci servir el directori escollit vaultOptions.mount.mountPoint.custom=Faci servir el directori escollit
vaultOptions.mount.mountPoint.directoryPickerButton=Trieu… vaultOptions.mount.mountPoint.directoryPickerButton=Trieu…
vaultOptions.mount.mountPoint.directoryPickerTitle=Triï un directori vaultOptions.mount.mountPoint.directoryPickerTitle=Triï un directori
vaultOptions.mount.volumeType.default=Per defecte (%s)
vaultOptions.mount.volumeType.restartRequired=Per a fer servir aquest tipus de volum cal reiniciar Cryptomator.
vaultOptions.mount.volume.tcp.port=Port TCP
vaultOptions.mount.volume.type=Tipus de volum
## Master Key ## Master Key
vaultOptions.masterkey=Contrasenya vaultOptions.masterkey=Contrasenya
vaultOptions.masterkey.changePasswordBtn=Canvi de contrasenya vaultOptions.masterkey.changePasswordBtn=Canvi de contrasenya
@@ -505,4 +533,25 @@ updateReminder.notNow=Ara no
updateReminder.yesOnce=Sí, una vegada updateReminder.yesOnce=Sí, una vegada
updateReminder.yesAutomatically=Sí, automàticament updateReminder.yesAutomatically=Sí, automàticament
#Dokany Support End
dokanySupportEnd.preferencesBtn=Obrir les Preferències
# Share Vault # Share Vault
shareVault.title=Comparteix la caixa forta
shareVault.message=Voleu compartir la vostra caixa forta amb altres persones?
shareVault.description=Aneu amb molt de compte quan compartiu la vostra caixa forta amb altres persones. En resum, seguiu aquests passos:
shareVault.instruction.1=1. Compartiu l'accés a la carpeta via emmagatzematge en el núvol.
shareVault.instruction.2=2. Compartiu la contrasenya de la caixa forta per un mitjà segur.
shareVault.remarkBestPractices=Si en voleu més informació, feu una ullada als suggeriments que trobareu a la nostra documentació.
shareVault.docsTooltip=Obre la documentació per aprendre més sobre compartir caixes fortes.
shareVault.hubAd.description=La forma segura de treballar en equip
shareVault.hubAd.keyManagement=* Gestió sense divulgació de mots de pas
shareVault.hubAd.authentication=* Autenticació forta
shareVault.hubAd.encryption=Xifratge d'extrem a extrem
shareVault.visitHub=Visita Cryptomator Hub
shareVault.hub.message=Com compartir una caixa forta al Hub
shareVault.hub.description=Per tal de compartir el contingut de la caixa forta amb un altre membre de l'equip, heu de seguir dos passos:
shareVault.hub.instruction.1=1. Compartiu l'accés a la carpeta via emmagatzematge en el núvol.
shareVault.hub.instruction.2=2. Doneu accés al membre de l'equip a Cryptomator Hub.
shareVault.hub.openHub=Obre Cryptomator Hub
@@ -24,6 +24,7 @@ error.existingSolutionDescription=Cryptomator neočekával, že se tak stane. Na
error.hyperlink.solution=Podívejte se na řešení error.hyperlink.solution=Podívejte se na řešení
error.lookupPermissionMessage=Cryptomator může najít řešení tohoto problému online. To odešle žádost do naší databáze problémů z vaší IP adresy. error.lookupPermissionMessage=Cryptomator může najít řešení tohoto problému online. To odešle žádost do naší databáze problémů z vaší IP adresy.
error.dismiss=Zrušit error.dismiss=Zrušit
error.lookUpSolution=Vyhledat řešení
# Defaults # Defaults
defaults.vault.vaultName=Trezor defaults.vault.vaultName=Trezor
@@ -46,6 +47,7 @@ addvaultwizard.new.nameInstruction=Zvolte jméno trezoru
addvaultwizard.new.namePrompt=Název trezoru addvaultwizard.new.namePrompt=Název trezoru
### Location ### Location
addvaultwizard.new.locationInstruction=Kde by měl Cryptomator ukládat šifrované soubory vašeho trezoru? addvaultwizard.new.locationInstruction=Kde by měl Cryptomator ukládat šifrované soubory vašeho trezoru?
addvaultwizard.new.locationLoading=Kontroluji lokální souborový systém pro výchozí cloudové úložiště…
addvaultwizard.new.locationLabel=Umístění úložiště addvaultwizard.new.locationLabel=Umístění úložiště
addvaultwizard.new.locationPrompt=... addvaultwizard.new.locationPrompt=...
addvaultwizard.new.directoryPickerLabel=Vlastní umístění addvaultwizard.new.directoryPickerLabel=Vlastní umístění
@@ -135,8 +137,12 @@ unlock.success.revealBtn=Zobrazit jednotku
unlock.error.customPath.message=Nelze připojit trezor k vlastní cestě unlock.error.customPath.message=Nelze připojit trezor k vlastní cestě
unlock.error.customPath.description.notSupported=Pokud chcete pokračovat v používání vlastní cesty, přejděte do nastavení a vyberte typ hlasitosti, který ji podporuje. V opačném případě přejděte do možností trezoru a vyberte podporovaný přípojný bod. unlock.error.customPath.description.notSupported=Pokud chcete pokračovat v používání vlastní cesty, přejděte do nastavení a vyberte typ hlasitosti, který ji podporuje. V opačném případě přejděte do možností trezoru a vyberte podporovaný přípojný bod.
unlock.error.customPath.description.notExists=Cesta k připojení neexistuje. Buď ji vytvořte ve vašem lokálním souborovém systému, nebo ji změňte v možnostech trezoru. unlock.error.customPath.description.notExists=Cesta k připojení neexistuje. Buď ji vytvořte ve vašem lokálním souborovém systému, nebo ji změňte v možnostech trezoru.
unlock.error.restartRequired.message=Nelze odemknout trezor
unlock.error.restartRequired.description=Změňte typ svazku v možnostech trezoru nebo restartujte Cryptomator.
unlock.error.title=Odemknutí "%s" selhalo
## Hub ## Hub
hub.noKeychain.message=Nelze získat přístup ke klíči zařízení hub.noKeychain.message=Nelze získat přístup ke klíči zařízení
hub.noKeychain.description=Chcete-li odemknout Hub trezory, je potřeba použít klíč zařízení, který je zabezpečen pomocí klíčenky. Chcete-li pokračovat, povolte „%s“ a vyberte klíčenku v nastavení.
hub.noKeychain.openBtn=Otevřít předvolby hub.noKeychain.openBtn=Otevřít předvolby
### Waiting ### Waiting
hub.auth.message=Čekání na ověření… hub.auth.message=Čekání na ověření…
@@ -144,19 +150,33 @@ hub.auth.description=Měli byste být automaticky přesměrováni na přihlašov
hub.auth.loginLink=Nebyli jste přesměrováni? Klikněte zde pro otevření. hub.auth.loginLink=Nebyli jste přesměrováni? Klikněte zde pro otevření.
### Receive Key ### Receive Key
hub.receive.message=Zpracovávání odezvy… hub.receive.message=Zpracovávání odezvy…
hub.receive.description=Cryptomator přijímá a zpracovává odpověď od Hubu. Počkejte prosím.
### Register Device ### Register Device
hub.register.message=Nové zařízení hub.register.message=Nové zařízení
hub.register.description=Toto je první přístup k Hub z tohoto zařízení. Zaregistrujte ho pomocí vašeho Account Key.
hub.register.nameLabel=Název zařízení hub.register.nameLabel=Název zařízení
hub.register.invalidAccountKeyLabel=Neplatný Account Key
hub.register.registerBtn=Registrovat hub.register.registerBtn=Registrovat
### Register Device Legacy ### Register Device Legacy
hub.register.legacy.occupiedMsg=Jméno je již používáno
hub.register.legacy.description=Toto je první přístup k Hubu z tohoto zařízení. Zaregistrujte ho.
### Registration Success ### Registration Success
hub.registerSuccess.message=Zařízení registrováno
hub.registerSuccess.description=Vaše zařízení je úspěšně zaregistrováno. Nyní můžete pokračovat v odemknutí trezoru.
hub.registerSuccess.unlockBtn=Odemknout hub.registerSuccess.unlockBtn=Odemknout
hub.registerSuccess.legacy.description=Pro přístup k trezoru musí být vaše zařízení autorizováno majitelem trezoru.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Registrace zařízení se nezdařila
hub.registerFailed.description.generic=Došlo k chybě v registračním procesu. Pro více detailů se podívejte do logu aplikace.
hub.registerFailed.description.deviceAlreadyExists=Toto zařízení je již registrováno pro jiného uživatele. Zkuste změnit uživatelský účet nebo použijte jiné zařízení.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Přístup odepřen hub.unauthorized.message=Přístup odepřen
hub.unauthorized.description=Vaše zařízení dosud nebylo oprávněno k přístupu k tomuto trezoru. Požádejte vlastníka trezoru, aby jej autorizoval. hub.unauthorized.description=Vaše zařízení dosud nebylo oprávněno k přístupu k tomuto trezoru. Požádejte vlastníka trezoru, aby jej autorizoval.
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Požadována akce hub.requireAccountInit.message=Požadována akce
hub.requireAccountInit.description.0=Chcete-li pokračovat, vyplňte prosím požadované kroky ve vašem
hub.requireAccountInit.description.1=Uživatelský profil Hubu
hub.requireAccountInit.description.2=.
### License Exceeded ### License Exceeded
hub.invalidLicense.message=Licence Hubu je neplatná hub.invalidLicense.message=Licence Hubu je neplatná
@@ -236,6 +256,7 @@ health.result.severityFilter.good=Dobré
health.result.severityFilter.info=Informace health.result.severityFilter.info=Informace
health.result.severityFilter.warn=Varování health.result.severityFilter.warn=Varování
health.result.severityFilter.crit=Kritické health.result.severityFilter.crit=Kritické
health.result.fixStateFilter.all=Stav opravy - Vše
health.result.fixStateFilter.fixable=Opravitelné health.result.fixStateFilter.fixable=Opravitelné
health.result.fixStateFilter.notFixable=Ne opravitelné health.result.fixStateFilter.notFixable=Ne opravitelné
health.result.fixStateFilter.fixing=Opravování… health.result.fixStateFilter.fixing=Opravování…
@@ -251,6 +272,7 @@ preferences.title=Nastavení
## General ## General
preferences.general=Obecné preferences.general=Obecné
preferences.general.startHidden=Skrýt okno Cryptomatoru při spuštění preferences.general.startHidden=Skrýt okno Cryptomatoru při spuštění
preferences.general.autoCloseVaults=Zamknout trezory automaticky při ukončení aplikace
preferences.general.debugLogging=Ladicí režim preferences.general.debugLogging=Ladicí režim
preferences.general.debugDirectory=Ukázat soubory se záznamy událostí (log) preferences.general.debugDirectory=Ukázat soubory se záznamy událostí (log)
preferences.general.autoStart=Spustit Cryptomator při spuštění systému preferences.general.autoStart=Spustit Cryptomator při spuštění systému
@@ -273,6 +295,10 @@ preferences.interface.showTrayIcon=Zobrazit ikonu v liště (vyžaduje restart)
preferences.volume=Virtuální jednotky preferences.volume=Virtuální jednotky
preferences.volume.type=Výchozí typ jednotky preferences.volume.type=Výchozí typ jednotky
preferences.volume.type.automatic=Automatické preferences.volume.type.automatic=Automatické
preferences.volume.docsTooltip=Otevřete dokumentaci, abyste se dozvěděli více o různých typech svazků.
preferences.volume.fuseRestartRequired=Chcete-li použít změny, Cryptomator musí být restartován.
preferences.volume.tcp.port=Výchozí TCP port
preferences.volume.supportedFeatures=Zvolený typ svazku podporuje následující funkce:
preferences.volume.feature.mountFlags=Vlastní možnosti připojení disku preferences.volume.feature.mountFlags=Vlastní možnosti připojení disku
preferences.volume.feature.readOnly=Připojení disku pouze pro čtení preferences.volume.feature.readOnly=Připojení disku pouze pro čtení
## Updates ## Updates
@@ -281,6 +307,7 @@ preferences.updates.currentVersion=Aktuální verze: %s
preferences.updates.autoUpdateCheck=Automaticky kontrolovat aktualizace preferences.updates.autoUpdateCheck=Automaticky kontrolovat aktualizace
preferences.updates.checkNowBtn=Zkontrolovat nyní preferences.updates.checkNowBtn=Zkontrolovat nyní
preferences.updates.updateAvailable=Dostupná nová verze %s. preferences.updates.updateAvailable=Dostupná nová verze %s.
## Contribution ## Contribution
preferences.contribute=Podpořte nás preferences.contribute=Podpořte nás
preferences.contribute.registeredFor=Certifikát podporovatele byl registrován pro %s preferences.contribute.registeredFor=Certifikát podporovatele byl registrován pro %s
@@ -353,6 +380,7 @@ main.vaultDetail.unlockBtn=Odemknout…
main.vaultDetail.unlockNowBtn=Odemknout nyní main.vaultDetail.unlockNowBtn=Odemknout nyní
main.vaultDetail.optionsBtn=Možnosti trezoru main.vaultDetail.optionsBtn=Možnosti trezoru
main.vaultDetail.passwordSavedInKeychain=Heslo uloženo main.vaultDetail.passwordSavedInKeychain=Heslo uloženo
main.vaultDetail.share=Sdílet…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=ODEMKNUTO main.vaultDetail.unlockedStatus=ODEMKNUTO
main.vaultDetail.accessLocation=Obsah vašeho trezoru je dostupný: main.vaultDetail.accessLocation=Obsah vašeho trezoru je dostupný:
@@ -366,7 +394,9 @@ main.vaultDetail.throughput.kbps=%.1f KiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s main.vaultDetail.throughput.mbps=%.1f MiB/s
main.vaultDetail.stats=Statistiky trezoru main.vaultDetail.stats=Statistiky trezoru
main.vaultDetail.locateEncryptedFileBtn=Najít šifrovaný soubor main.vaultDetail.locateEncryptedFileBtn=Najít šifrovaný soubor
main.vaultDetail.locateEncryptedFileBtn.tooltip=Vyberte soubor z vašeho trezoru, abyste našli jeho šifrovaný protějšek
main.vaultDetail.encryptedPathsCopied=Cesta souboru byla zkopírována do schránky! main.vaultDetail.encryptedPathsCopied=Cesta souboru byla zkopírována do schránky!
main.vaultDetail.filePickerTitle=Vyberte soubor uvnitř trezoru
### Missing ### Missing
main.vaultDetail.missing.info=Cryptomator nemohl najít trezor na této cestě. main.vaultDetail.missing.info=Cryptomator nemohl najít trezor na této cestě.
main.vaultDetail.missing.recheck=Znovu zkontrolovat main.vaultDetail.missing.recheck=Znovu zkontrolovat
@@ -411,8 +441,10 @@ vaultOptions.mount.winDriveLetterOccupied=obsazeno
vaultOptions.mount.mountPoint=Přípojný bod vaultOptions.mount.mountPoint=Přípojný bod
vaultOptions.mount.mountPoint.auto=Automaticky vybrat vhodné místo vaultOptions.mount.mountPoint.auto=Automaticky vybrat vhodné místo
vaultOptions.mount.mountPoint.driveLetter=Použít zvolenou jednotku vaultOptions.mount.mountPoint.driveLetter=Použít zvolenou jednotku
vaultOptions.mount.mountPoint.custom=Použít vybraný adresář
vaultOptions.mount.mountPoint.directoryPickerButton=Vybrat... vaultOptions.mount.mountPoint.directoryPickerButton=Vybrat...
vaultOptions.mount.mountPoint.directoryPickerTitle=Vyberte složku vaultOptions.mount.mountPoint.directoryPickerTitle=Vyberte složku
vaultOptions.mount.volumeType.default=Výchozí (%s)
vaultOptions.mount.volume.tcp.port=TCP port vaultOptions.mount.volume.tcp.port=TCP port
vaultOptions.mount.volume.type=Typ jednotky vaultOptions.mount.volume.type=Typ jednotky
## Master Key ## Master Key
@@ -437,18 +469,23 @@ recoveryKey.display.StorageHints=Uchovejte ho někde velmi bezpečně, např.\n
## Reset Password ## Reset Password
### Enter Recovery Key ### Enter Recovery Key
recoveryKey.recover.title=Resetovat heslo recoveryKey.recover.title=Resetovat heslo
recoveryKey.recover.prompt=Zadejte obnovovací klíč pro "%s":
recoveryKey.recover.correctKey=Toto je platný obnovovací klíč recoveryKey.recover.correctKey=Toto je platný obnovovací klíč
recoveryKey.recover.wrongKey=Tento klíč pro obnovení partří k jinému trezoru
recoveryKey.recover.invalidKey=Tento klíč pro obnovení není platný
recoveryKey.printout.heading=Obnovovací klíč Cryptomator\n"%s"\n recoveryKey.printout.heading=Obnovovací klíč Cryptomator\n"%s"\n
### Reset Password ### Reset Password
recoveryKey.recover.resetBtn=Resetovat recoveryKey.recover.resetBtn=Resetovat
### Recovery Key Password Reset Success ### Recovery Key Password Reset Success
recoveryKey.recover.resetSuccess.message=Resetování hesla bylo úspěšné recoveryKey.recover.resetSuccess.message=Resetování hesla bylo úspěšné
recoveryKey.recover.resetSuccess.description=Můžete odemknout váš trezor pomocí nového hesla.
# Convert Vault # Convert Vault
convertVault.title=Převést trezor convertVault.title=Převést trezor
convertVault.convert.convertBtn.before=Převést convertVault.convert.convertBtn.before=Převést
convertVault.convert.convertBtn.processing=Převádění… convertVault.convert.convertBtn.processing=Převádění…
convertVault.success.message=Konverze byla úspěšná convertVault.success.message=Konverze byla úspěšná
convertVault.hubToPassword.success.description=Nyní můžete odemknout trezor zvoleným heslem bez nutnosti přístupu k Hubu.
# New Password # New Password
newPassword.promptText=Zadejte nové heslo newPassword.promptText=Zadejte nové heslo
@@ -479,4 +516,26 @@ updateReminder.notNow=Nyní ne
updateReminder.yesOnce=Ano, jednou updateReminder.yesOnce=Ano, jednou
updateReminder.yesAutomatically=Ano, automaticky updateReminder.yesAutomatically=Ano, automaticky
#Dokany Support End
dokanySupportEnd.title=Oznámení o zastaralosti
dokanySupportEnd.message=Konec podpory pro Dokany
dokanySupportEnd.preferencesBtn=Otevřít předvolby
# Share Vault # Share Vault
shareVault.title=Sdílet trezor
shareVault.message=Chcete sdílet svůj trezor s ostatními?
shareVault.description=Vždy buďte opatrní při sdílení vašeho trezoru s ostatními lidmi. Stručně řečeno, postupujte podle těchto kroků:
shareVault.instruction.1=1. Sdílejte přístup ke šifrované složce trezoru prostřednictvím cloudového úložiště.
shareVault.instruction.2=2. Sdílejte heslo trezoru bezpečným způsobem.
shareVault.remarkBestPractices=Pro více informací se podívejte na návrhy osvědčených postupů v našich dokumentech.
shareVault.docsTooltip=Otevřete dokumentaci a dozvíte se více o sdílení trezorů.
shareVault.hubAd.description=Bezpečný způsob práce v týmech
shareVault.hubAd.authentication=• Silné ověření
shareVault.hubAd.encryption=• End-to-end šifrování
shareVault.visitHub=Navštivte Cryptomator Hub
shareVault.hub.message=Jak sdílet Hub trezor
shareVault.hub.description=Chcete-li sdílet obsah trezoru s jiným členem týmu, musíte provést dva kroky:
shareVault.hub.instruction.1=1. Sdílejte přístup ke šifrované složce trezoru prostřednictvím cloudového úložiště.
shareVault.hub.instruction.2=2. Udělte přístup členovi týmu v Cryptomator Hubu.
shareVault.hub.openHub=Otevřít Cryptomator Hub
@@ -47,6 +47,7 @@ addvaultwizard.new.nameInstruction=Vælg et navn til boksen
addvaultwizard.new.namePrompt=Boks-navn addvaultwizard.new.namePrompt=Boks-navn
### Location ### Location
addvaultwizard.new.locationInstruction=Hvor skal Cryptomator gemme de krypterede filer af din boks? addvaultwizard.new.locationInstruction=Hvor skal Cryptomator gemme de krypterede filer af din boks?
addvaultwizard.new.locationLoading=Tjekker lokalt filsystem for standard mappe til opbevaring i skyen…
addvaultwizard.new.locationLabel=Dataplacering addvaultwizard.new.locationLabel=Dataplacering
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Vælg placering addvaultwizard.new.directoryPickerLabel=Vælg placering
@@ -141,6 +142,9 @@ unlock.error.customPath.description.hideawayNotDir=Den midlertidige, skjulte fil
unlock.error.customPath.description.couldNotBeCleaned=Din boks kunne ikke monteres på stien "%s". Prøv venligst igen eller vælg en anden sti. unlock.error.customPath.description.couldNotBeCleaned=Din boks kunne ikke monteres på stien "%s". Prøv venligst igen eller vælg en anden sti.
unlock.error.customPath.description.notEmptyDir=Den brugerdefinerede monteringssti "%s" er ikke en tom mappe. Vælg venligst en tom mappe og prøv igen. unlock.error.customPath.description.notEmptyDir=Den brugerdefinerede monteringssti "%s" er ikke en tom mappe. Vælg venligst en tom mappe og prøv igen.
unlock.error.customPath.description.generic=Du har valgt en brugerdefineret monteringssti til denne boks, men det mislykkedes med følgende besked: %2$s unlock.error.customPath.description.generic=Du har valgt en brugerdefineret monteringssti til denne boks, men det mislykkedes med følgende besked: %2$s
unlock.error.restartRequired.message=Kan ikke låse boks op
unlock.error.restartRequired.description=Skift drev typen i boksindstillinger eller genstart Cryptomator.
unlock.error.title=Oplåsning af "%s" mislykkedes
## Hub ## Hub
hub.noKeychain.message=Kan ikke tilgå enhedsnøgle hub.noKeychain.message=Kan ikke tilgå enhedsnøgle
hub.noKeychain.description=En enhedsnøgle er påkrævet for at låse Hub bokse op. Enhedsnøglen er sikret i en nøglering. For at fortsætte, aktivér “%s” og vælg en nøglering i indstillingerne. hub.noKeychain.description=En enhedsnøgle er påkrævet for at låse Hub bokse op. Enhedsnøglen er sikret i en nøglering. For at fortsætte, aktivér “%s” og vælg en nøglering i indstillingerne.
@@ -154,15 +158,30 @@ hub.receive.message=Behandler svar…
hub.receive.description=Cryptomator modtager og behandler svaret fra hubben. Vent venligst. hub.receive.description=Cryptomator modtager og behandler svaret fra hubben. Vent venligst.
### Register Device ### Register Device
hub.register.message=Ny Enhed hub.register.message=Ny Enhed
hub.register.description=Det er første gang Hub tilgås fra denne enhed. Registrer den venligst ved at anvende din Account Key.
hub.register.nameLabel=Enheds-navn hub.register.nameLabel=Enheds-navn
hub.register.invalidAccountKeyLabel=Ugyldig Account Key
hub.register.registerBtn=Registrer
### Register Device Legacy ### Register Device Legacy
hub.register.legacy.occupiedMsg=Navnet er allerede i brug
hub.register.legacy.description=Det er første gang Hub tilgås fra denne enhed. Registrer den venligst.
### Registration Success ### Registration Success
hub.registerSuccess.message=Enhed registreret
hub.registerSuccess.description=Din enhed er registreret. Du kan nu fortsætte med at låse boksen op.
hub.registerSuccess.unlockBtn=Lås op hub.registerSuccess.unlockBtn=Lås op
hub.registerSuccess.legacy.description=For at få adgang til boksen, skal din enhed desuden være godkendt af boksens ejer.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Enheds registrering mislykkedes
hub.registerFailed.description.generic=Der opstod en fejl i registreringsprocessen. Kig i applikations-loggen for flere detaljer.
hub.registerFailed.description.deviceAlreadyExists=Denne enhed er allerede registreret af en anden bruger. Prøv at ændre brugerkontoen eller brug en anden enhed.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Adgang nægtet hub.unauthorized.message=Adgang nægtet
hub.unauthorized.description=Din enhed er endnu ikke blevet godkendt til at få adgang til denne boks. Spørg boks-ejeren om godkendelse. hub.unauthorized.description=Din enhed er endnu ikke blevet godkendt til at få adgang til denne boks. Spørg boks-ejeren om godkendelse.
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Handling påkrævet
hub.requireAccountInit.description.0=For at fortsætte, skal du fuldføre de nødvendige trin i din
hub.requireAccountInit.description.1=Hub brugerprofil
hub.requireAccountInit.description.2=.
### License Exceeded ### License Exceeded
hub.invalidLicense.message=Ugyldig Hub-licens hub.invalidLicense.message=Ugyldig Hub-licens
hub.invalidLicense.description=Din Cryptomator Hub har en ugyldig licens. Få venligst en Hub administrator til at opgradere eller forny licensen. hub.invalidLicense.description=Din Cryptomator Hub har en ugyldig licens. Få venligst en Hub administrator til at opgradere eller forny licensen.
@@ -284,9 +303,11 @@ preferences.interface.showMinimizeButton=Vis knap til minimering
preferences.interface.showTrayIcon=Vis ikon i system-bakken (kræver genstart) preferences.interface.showTrayIcon=Vis ikon i system-bakken (kræver genstart)
## Volume ## Volume
preferences.volume=Virtuelt drev preferences.volume=Virtuelt drev
preferences.volume.type=Standard Drev Type
preferences.volume.type.automatic=Automatisk preferences.volume.type.automatic=Automatisk
preferences.volume.docsTooltip=Åbn dokumentationen for at lære mere om de forskellige typer drev. preferences.volume.docsTooltip=Åbn dokumentationen for at lære mere om de forskellige typer drev.
preferences.volume.fuseRestartRequired=For at anvende ændringerne skal Cryptomator genstartes. preferences.volume.fuseRestartRequired=For at anvende ændringerne skal Cryptomator genstartes.
preferences.volume.tcp.port=Standard TCP- Port
preferences.volume.supportedFeatures=Den valgte type drev understøtter følgende funktioner: preferences.volume.supportedFeatures=Den valgte type drev understøtter følgende funktioner:
preferences.volume.feature.mountAuto=Automatisk valg af monteringspunkt preferences.volume.feature.mountAuto=Automatisk valg af monteringspunkt
preferences.volume.feature.mountToDir=Brugerdefineret mappe som monteringspunkt preferences.volume.feature.mountToDir=Brugerdefineret mappe som monteringspunkt
@@ -299,6 +320,7 @@ preferences.updates.currentVersion=Nuværende version: %s
preferences.updates.autoUpdateCheck=Søg automatisk efter opdateringer preferences.updates.autoUpdateCheck=Søg automatisk efter opdateringer
preferences.updates.checkNowBtn=Kontrollér nu preferences.updates.checkNowBtn=Kontrollér nu
preferences.updates.updateAvailable=Opdatering til version %s er tilgængelig. preferences.updates.updateAvailable=Opdatering til version %s er tilgængelig.
## Contribution ## Contribution
preferences.contribute=Støt os preferences.contribute=Støt os
preferences.contribute.registeredFor=Registreret supporter-certifikat for %s preferences.contribute.registeredFor=Registreret supporter-certifikat for %s
@@ -371,6 +393,7 @@ main.vaultDetail.unlockBtn=Lås op…
main.vaultDetail.unlockNowBtn=Lås op nu main.vaultDetail.unlockNowBtn=Lås op nu
main.vaultDetail.optionsBtn=Boksindstillinger main.vaultDetail.optionsBtn=Boksindstillinger
main.vaultDetail.passwordSavedInKeychain=Adgangskode gemt main.vaultDetail.passwordSavedInKeychain=Adgangskode gemt
main.vaultDetail.share=Del…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=LÅST OP main.vaultDetail.unlockedStatus=LÅST OP
main.vaultDetail.accessLocation=Boksens indhold er tilgængeligt her: main.vaultDetail.accessLocation=Boksens indhold er tilgængeligt her:
@@ -425,6 +448,7 @@ vaultOptions.general.startHealthCheckBtn=Start sunhedstjek
## Mount ## Mount
vaultOptions.mount=Montering vaultOptions.mount=Montering
vaultOptions.mount.info=Åbn indstillinger for virtuelle drev for at ændre standardindstillinger.
vaultOptions.mount.readonly=Skrivebeskyttet vaultOptions.mount.readonly=Skrivebeskyttet
vaultOptions.mount.customMountFlags=Brugerdefinerede monterings-flag vaultOptions.mount.customMountFlags=Brugerdefinerede monterings-flag
vaultOptions.mount.winDriveLetterOccupied=optaget vaultOptions.mount.winDriveLetterOccupied=optaget
@@ -434,6 +458,10 @@ vaultOptions.mount.mountPoint.driveLetter=Brug et ledigt drevbogstav
vaultOptions.mount.mountPoint.custom=Brug en valgt mappe vaultOptions.mount.mountPoint.custom=Brug en valgt mappe
vaultOptions.mount.mountPoint.directoryPickerButton=Vælg… vaultOptions.mount.mountPoint.directoryPickerButton=Vælg…
vaultOptions.mount.mountPoint.directoryPickerTitle=Vælg en mappe vaultOptions.mount.mountPoint.directoryPickerTitle=Vælg en mappe
vaultOptions.mount.volumeType.default=Standard (%s)
vaultOptions.mount.volumeType.restartRequired=For bruge denne drev type skal Cryptomator genstartes.
vaultOptions.mount.volume.tcp.port=TCP Port
vaultOptions.mount.volume.type=Drev Type
## Master Key ## Master Key
vaultOptions.masterkey=Adgangskode vaultOptions.masterkey=Adgangskode
vaultOptions.masterkey.changePasswordBtn=Skift adgangskode vaultOptions.masterkey.changePasswordBtn=Skift adgangskode
@@ -505,4 +533,25 @@ updateReminder.notNow=Ikke nu
updateReminder.yesOnce=Ja, én gang updateReminder.yesOnce=Ja, én gang
updateReminder.yesAutomatically=Ja, automatisk updateReminder.yesAutomatically=Ja, automatisk
#Dokany Support End
dokanySupportEnd.preferencesBtn=Åbn Indstillinger
# Share Vault # Share Vault
shareVault.title=Del Boks
shareVault.message=Vil du dele din boks med andre?
shareVault.description=Vær altid forsigtig, når du deler din boks med andre. Kort sagt, følg disse trin:
shareVault.instruction.1=1. Del adgang til den krypterede boks-mappe via opbevaring i skyen.
shareVault.instruction.2=2. Del boksens adgangskode på en sikker måde.
shareVault.remarkBestPractices=For mere information, tjek best practice forslag i vores dokumenter.
shareVault.docsTooltip=Åbn dokumentationen for at lære mere om deling af bokse.
shareVault.hubAd.description=Den sikre måde at arbejde i hold
shareVault.hubAd.keyManagement=Zero-knowledge nøgle håndtering
shareVault.hubAd.authentication=Stærk autentifikation
shareVault.hubAd.encryption=End-to-end-kryptering
shareVault.visitHub=Besøg Kryptomator Hub
shareVault.hub.message=Sådan deler du en Hub boks
shareVault.hub.description=For at dele indholdet i boksen med et andet holdmedlem skal du udføre to trin:
shareVault.hub.instruction.1=1. Del adgang til den krypterede boks-mappe vha. opbevaring i skyen.
shareVault.hub.instruction.2=2. Giv adgang til holdmedlem i Cryptomator Hub.
shareVault.hub.openHub=Åben Cryptomator Hub
+23 -12
View File
@@ -47,7 +47,7 @@ addvaultwizard.new.nameInstruction=Wähle einen Namen für den Tresor
addvaultwizard.new.namePrompt=Tresorname addvaultwizard.new.namePrompt=Tresorname
### Location ### Location
addvaultwizard.new.locationInstruction=Wo soll Cryptomator die verschlüsselten Dateien deines Tresors ablegen? addvaultwizard.new.locationInstruction=Wo soll Cryptomator die verschlüsselten Dateien deines Tresors ablegen?
addvaultwizard.new.locationLoading=Überprüfen des lokalen Dateisystems auf Standard-Cloud-Verzeichnisse… addvaultwizard.new.locationLoading=Lokales Dateisystem wird auf Standard-Cloud-Verzeichnisse überprüft
addvaultwizard.new.locationLabel=Speicherort addvaultwizard.new.locationLabel=Speicherort
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Eigener Ort addvaultwizard.new.directoryPickerLabel=Eigener Ort
@@ -169,9 +169,9 @@ hub.register.legacy.description=Dies ist der erste Hub-Zugriff von diesem Gerät
hub.registerSuccess.message=Gerät registriert hub.registerSuccess.message=Gerät registriert
hub.registerSuccess.description=Dein Gerät ist erfolgreich registriert. Du kannst den Tresor jetzt entsperren. hub.registerSuccess.description=Dein Gerät ist erfolgreich registriert. Du kannst den Tresor jetzt entsperren.
hub.registerSuccess.unlockBtn=Entsperren hub.registerSuccess.unlockBtn=Entsperren
hub.registerSuccess.legacy.description=Um den Tresor zu öffnen muss dein Gerät zusätzlich vom Tresorbesitzer autorisiert werden. hub.registerSuccess.legacy.description=Für den Zugriff auf den Tresor muss dein Gerät zusätzlich vom Tresoreigentümer autorisiert werden.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Geräteregistrierung fehlgeschlagen hub.registerFailed.message=Gerät konnte nicht registriert werden
hub.registerFailed.description.generic=Im Registrierungsprozess ist ein Fehler aufgetreten. Weitere Details findest du im Anwendungsprotokoll. hub.registerFailed.description.generic=Im Registrierungsprozess ist ein Fehler aufgetreten. Weitere Details findest du im Anwendungsprotokoll.
hub.registerFailed.description.deviceAlreadyExists=Dieses Gerät ist bereits für einen anderen Benutzer registriert. Ändere das Benutzerkonto oder verwende ein anderes Gerät. hub.registerFailed.description.deviceAlreadyExists=Dieses Gerät ist bereits für einen anderen Benutzer registriert. Ändere das Benutzerkonto oder verwende ein anderes Gerät.
### Unauthorized ### Unauthorized
@@ -320,6 +320,14 @@ preferences.updates.currentVersion=Aktuelle Version: %s
preferences.updates.autoUpdateCheck=Automatisch nach Updates suchen preferences.updates.autoUpdateCheck=Automatisch nach Updates suchen
preferences.updates.checkNowBtn=Jetzt prüfen preferences.updates.checkNowBtn=Jetzt prüfen
preferences.updates.updateAvailable=Update auf Version %s verfügbar. preferences.updates.updateAvailable=Update auf Version %s verfügbar.
preferences.updates.lastUpdateCheck=Letzte Überprüfung: %s
preferences.updates.lastUpdateCheck.never=nie
preferences.updates.lastUpdateCheck.recently=kürzlich
preferences.updates.lastUpdateCheck.daysAgo=vor %s Tagen
preferences.updates.lastUpdateCheck.hoursAgo=vor %s Stunden
preferences.updates.checkFailed=Die Suche nach Updates ist fehlgeschlagen. Bitte überprüfe deine Internetverbindung oder versuche es später erneut.
preferences.updates.upToDate=Cryptomator ist aktuell.
## Contribution ## Contribution
preferences.contribute=Unterstütze uns preferences.contribute=Unterstütze uns
preferences.contribute.registeredFor=Supporter-Zertifikat registriert für %s preferences.contribute.registeredFor=Supporter-Zertifikat registriert für %s
@@ -392,7 +400,7 @@ main.vaultDetail.unlockBtn=Entsperren …
main.vaultDetail.unlockNowBtn=Jetzt entsperren main.vaultDetail.unlockNowBtn=Jetzt entsperren
main.vaultDetail.optionsBtn=Tresoroptionen main.vaultDetail.optionsBtn=Tresoroptionen
main.vaultDetail.passwordSavedInKeychain=Passwort gespeichert main.vaultDetail.passwordSavedInKeychain=Passwort gespeichert
main.vaultDetail.share=Teilen… main.vaultDetail.share=Teilen
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=ENTSPERRT main.vaultDetail.unlockedStatus=ENTSPERRT
main.vaultDetail.accessLocation=Deine Tresorinhalte sind hier erreichbar: main.vaultDetail.accessLocation=Deine Tresorinhalte sind hier erreichbar:
@@ -532,22 +540,25 @@ updateReminder.notNow=Nicht jetzt
updateReminder.yesOnce=Ja, einmalig updateReminder.yesOnce=Ja, einmalig
updateReminder.yesAutomatically=Ja, automatisch updateReminder.yesAutomatically=Ja, automatisch
#Dokany Support End
dokanySupportEnd.preferencesBtn=Einstellungen öffnen
# Share Vault # Share Vault
shareVault.title=Tresor teilen shareVault.title=Tresor teilen
shareVault.message=Möchtest du deinen Tresor mit anderen teilen? shareVault.message=Möchtest du deinen Tresor mit anderen teilen?
shareVault.description=Seien immer vorsichtig, wenn du deinen Tresor mit anderen teilst. Um den Tresor zu teilen, muss du folgendes tun: shareVault.description=Sei immer vorsichtig, wenn du deinen Tresor mit anderen Personen teilst. Kurz gesagt, befolge diese Schritte:
shareVault.instruction.1=1. Teile den Zugriff auf den verschlüsselten Tresorordner in deinem Cloud-Speicher. shareVault.instruction.1=1. Teile den Zugriff auf den verschlüsselten Tresorordner über den Cloud-Speicher.
shareVault.instruction.2=2. Teile das Tresorpasswort auf einem sicheren Weg. shareVault.instruction.2=2. Teile das Tresorpasswort auf einem sicheren Weg.
shareVault.remarkBestPractices=Für mehr Informationen lies dir unsere Vorschläge für bewährte Praktiken in unserer Dokumentation durch. shareVault.remarkBestPractices=Weitere Informationen findest du in den Vorschlägen für bewährte Verfahren in unserer Dokumentation.
shareVault.docsTooltip=Öffne die Dokumentation, um mehr über das Teilen von Tresoren zu erfahren. shareVault.docsTooltip=Öffne die Dokumentation, um mehr über das Teilen von Tresoren zu erfahren.
shareVault.hubAd.description=Der sichere Weg in Teams zu arbeiten shareVault.hubAd.description=Die sichere Art der Teamarbeit
shareVault.hubAd.keyManagement=• Zero-knowledge Schlüsselverwaltung shareVault.hubAd.keyManagement=• Zero-knowledge-Schlüsselverwaltung
shareVault.hubAd.authentication=• Starke Authentifizierung shareVault.hubAd.authentication=• Starke Authentifizierung
shareVault.hubAd.encryption=• Ende-zu-Ende-Verschlüsselung shareVault.hubAd.encryption=• Ende-zu-Ende-Verschlüsselung
shareVault.visitHub=Besuche Cryptomator Hub shareVault.visitHub=Besuche Cryptomator Hub
shareVault.hub.message=Wie man einen Hub Tresor teilt shareVault.hub.message=Teilen eines Hub-Tresors
shareVault.hub.description=Um den Tresor mit einem anderen Teammitglied zu teilen, musst du zwei Schritte ausführen: shareVault.hub.description=Zur Freigabe des Tresorinhalts für ein anderes Teammitglied sind zwei Schritte erforderlich:
shareVault.hub.instruction.1=1. Teile den Zugriff auf den verschlüsselten Tresorordner in deinem Cloud-Speicher. shareVault.hub.instruction.1=1. Teile den Zugriff auf den verschlüsselten Tresorordner über den Cloud-Speicher.
shareVault.hub.instruction.2=2. Füge das Teammitglied in Cryptomator Hub als Tresormitglied hinzu. shareVault.hub.instruction.2=2. Füge das Teammitglied in Cryptomator Hub als Tresormitglied hinzu.
shareVault.hub.openHub=Cryptomator Hub öffnen shareVault.hub.openHub=Cryptomator Hub öffnen
@@ -320,6 +320,14 @@ 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=Υποστηρίξτε μας
preferences.contribute.registeredFor=Το πιστοποιητικό υποστήριξης καταχωρήθηκε για %s preferences.contribute.registeredFor=Το πιστοποιητικό υποστήριξης καταχωρήθηκε για %s
@@ -532,6 +540,12 @@ updateReminder.notNow=Όχι Τώρα
updateReminder.yesOnce=Ναι, Μία Φορά updateReminder.yesOnce=Ναι, Μία Φορά
updateReminder.yesAutomatically=Ναι, Αυτόματα updateReminder.yesAutomatically=Ναι, Αυτόματα
#Dokany Support End
dokanySupportEnd.title=Ειδοποίηση κατάργησης
dokanySupportEnd.message=Τέλος υποστήριξης για Dokany
dokanySupportEnd.description=Ο τύπος τόμου Dokany δεν υποστηρίζεται πλέον από το Cryptomator. Οι ρυθμίσεις σας έχουν προσαρμοστεί για να χρησιμοποιούν τον προεπιλεγμένο τύπο τόμου. Μπορείτε να δείτε τον προεπιλεγμένο τύπο στις προτιμήσεις.
dokanySupportEnd.preferencesBtn=Άνοιγμα Προτιμήσεων
# Share Vault # Share Vault
shareVault.title=Κοινή χρήση Κρύπτης shareVault.title=Κοινή χρήση Κρύπτης
shareVault.message=Θα θέλατε να μοιραστείτε την κρύπτη σας με άλλους; shareVault.message=Θα θέλατε να μοιραστείτε την κρύπτη σας με άλλους;
+52 -6
View File
@@ -24,7 +24,7 @@ error.existingSolutionDescription=Cryptomator no esperaba que esto ocurriera, pe
error.hyperlink.solution=Buscar la solución error.hyperlink.solution=Buscar la solución
error.lookupPermissionMessage=Cryptomator puede buscar una solución en línea para este problema. Esto enviará una solicitud a nuestra base de datos de problemas desde su dirección IP. error.lookupPermissionMessage=Cryptomator puede buscar una solución en línea para este problema. Esto enviará una solicitud a nuestra base de datos de problemas desde su dirección IP.
error.dismiss=Descartar error.dismiss=Descartar
error.lookUpSolution=Buscar solución error.lookUpSolution=Buscar una solución
# Defaults # Defaults
defaults.vault.vaultName=Bóveda defaults.vault.vaultName=Bóveda
@@ -47,6 +47,7 @@ addvaultwizard.new.nameInstruction=Elegir un nombre para la bóveda
addvaultwizard.new.namePrompt=Nombre de la bóveda addvaultwizard.new.namePrompt=Nombre de la bóveda
### Location ### Location
addvaultwizard.new.locationInstruction=¿Dónde se deben almacenar los archivos cifrados de la bóveda? addvaultwizard.new.locationInstruction=¿Dónde se deben almacenar los archivos cifrados de la bóveda?
addvaultwizard.new.locationLoading=Comprobando el sistema de archivos local en busca de los directorios de almacenamiento en la nube por defecto…
addvaultwizard.new.locationLabel=Lugar de almacenamiento addvaultwizard.new.locationLabel=Lugar de almacenamiento
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Ubicación personalizada addvaultwizard.new.directoryPickerLabel=Ubicación personalizada
@@ -61,7 +62,7 @@ addvaultwizard.new.validName=Nombre de bóveda válido
addvaultwizard.new.validCharacters.message=El nombre de la bóveda puede contener los siguientes caracteres: addvaultwizard.new.validCharacters.message=El nombre de la bóveda puede contener los siguientes caracteres:
addvaultwizard.new.validCharacters.chars=Caracteres de la palabra (por ejemplo, a, ж o 수) addvaultwizard.new.validCharacters.chars=Caracteres de la palabra (por ejemplo, a, ж o 수)
addvaultwizard.new.validCharacters.numbers=Números addvaultwizard.new.validCharacters.numbers=Números
addvaultwizard.new.validCharacters.dashes=Guion (%s) o subrayado (%s) addvaultwizard.new.validCharacters.dashes=Guion (%s) o guion bajo (%s)
### Expert Settings ### Expert Settings
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Habilitar ajustes expertos addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Habilitar ajustes expertos
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Ingrese un valor entre 36 y 220 (por defecto 220) addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Ingrese un valor entre 36 y 220 (por defecto 220)
@@ -71,7 +72,7 @@ addvaultwizard.new.expertSettings.shorteningThreshold.valid=Válido
### Password ### Password
addvaultwizard.new.createVaultBtn=Crear bóveda addvaultwizard.new.createVaultBtn=Crear bóveda
addvaultwizard.new.generateRecoveryKeyChoice=No podrá acceder a sus datos sin su contraseña. ¿Desea una clave de recuperación en caso de que pierda su contraseña? addvaultwizard.new.generateRecoveryKeyChoice=No podrá acceder a sus datos sin su contraseña. ¿Desea una clave de recuperación en caso de que pierda su contraseña?
addvaultwizard.new.generateRecoveryKeyChoice.yes=Sí, por favor addvaultwizard.new.generateRecoveryKeyChoice.yes=Sí, por favor. Más vale prevenir que curar
addvaultwizard.new.generateRecoveryKeyChoice.no=No, gracias addvaultwizard.new.generateRecoveryKeyChoice.no=No, gracias
### Information ### Information
addvault.new.readme.storageLocation.fileName=IMPORTANTE.rtf addvault.new.readme.storageLocation.fileName=IMPORTANTE.rtf
@@ -129,7 +130,7 @@ unlock.chooseMasterkey.filePickerTitle=Seleccione el archivo de la clave maestra
unlock.chooseMasterkey.filePickerMimeDesc=Clave maestra de Cryptomator unlock.chooseMasterkey.filePickerMimeDesc=Clave maestra de Cryptomator
## Success ## Success
unlock.success.message=Desbloqueo exitoso unlock.success.message=Desbloqueo exitoso
unlock.success.description=El contenido de la bóveda "%s" ahora es accesible a través de su punto de montaje. unlock.success.description=El contenido de la caja fuerte "%s" ahora es accesible a través de su punto de montaje.
unlock.success.rememberChoice=Recordar opción y no mostrar de nuevo unlock.success.rememberChoice=Recordar opción y no mostrar de nuevo
unlock.success.revealBtn=Revelar unidad unlock.success.revealBtn=Revelar unidad
## Failure ## Failure
@@ -141,6 +142,8 @@ unlock.error.customPath.description.hideawayNotDir=El archivo oculto temporal "%
unlock.error.customPath.description.couldNotBeCleaned=Su bóveda no se pudo montar en la ruta "%s". Intente de nuevo o elija una ruta diferente. unlock.error.customPath.description.couldNotBeCleaned=Su bóveda no se pudo montar en la ruta "%s". Intente de nuevo o elija una ruta diferente.
unlock.error.customPath.description.notEmptyDir=La ruta de montaje personalizada "%s" no es una carpeta vacía. Elija una carpeta vacía y vuelva a intentarlo. unlock.error.customPath.description.notEmptyDir=La ruta de montaje personalizada "%s" no es una carpeta vacía. Elija una carpeta vacía y vuelva a intentarlo.
unlock.error.customPath.description.generic=Seleccionó una ruta de montaje personalizada para esta bóveda, pero falló al usarla con el mensaje: %2$s unlock.error.customPath.description.generic=Seleccionó una ruta de montaje personalizada para esta bóveda, pero falló al usarla con el mensaje: %2$s
unlock.error.restartRequired.message=No se puede desbloquear la bóveda
unlock.error.restartRequired.description=Cambie el tipo de volumen en las opciones de la bóveda o reinicie Cryptomator.
unlock.error.title=Error al desbloquear "%s" unlock.error.title=Error al desbloquear "%s"
## Hub ## Hub
hub.noKeychain.message=No se puede acceder a la clave del dispositivo hub.noKeychain.message=No se puede acceder a la clave del dispositivo
@@ -155,13 +158,22 @@ hub.receive.message=Procesando la respuesta…
hub.receive.description=Cryptomator está recibiendo y procesando la respuesta del Hub. Por favor espere. hub.receive.description=Cryptomator está recibiendo y procesando la respuesta del Hub. Por favor espere.
### Register Device ### Register Device
hub.register.message=Nuevo dispositivo hub.register.message=Nuevo dispositivo
hub.register.description=Este es el primer acceso al Hub desde este dispositivo. Por favor, regístrelo usando su Account Key.
hub.register.nameLabel=Nombre del dispositivo hub.register.nameLabel=Nombre del dispositivo
hub.register.invalidAccountKeyLabel=Account Key no válida hub.register.invalidAccountKeyLabel=Account Key no válida
hub.register.registerBtn=Registrarse hub.register.registerBtn=Registrarse
### Register Device Legacy ### Register Device Legacy
hub.register.legacy.occupiedMsg=El nombre ya está en uso
hub.register.legacy.description=Este es el primer acceso al Hub desde este dispositivo. Por favor, regístrelo.
### Registration Success ### Registration Success
hub.registerSuccess.message=Dispositivo registrado
hub.registerSuccess.description=Tu dispositivo se ha registrado correctamente. Ahora puede proceder a desbloquear la bóveda.
hub.registerSuccess.unlockBtn=Desbloquear hub.registerSuccess.unlockBtn=Desbloquear
hub.registerSuccess.legacy.description=Para acceder a la bóveda, su dispositivo debe estar autorizado por el propietario de la bóveda.
### Registration Failed ### Registration Failed
hub.registerFailed.message=El registro del dispositivo ha fallado
hub.registerFailed.description.generic=Ha ocurrido un error al intentar registrarse. Para más detalles, consulte el registro de la aplicación.
hub.registerFailed.description.deviceAlreadyExists=Este dispositivo ya se ha registrado para otro usuario. Intente cambiar la cuenta de usuario o utilice un dispositivo diferente.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Acceso denegado hub.unauthorized.message=Acceso denegado
hub.unauthorized.description=Su dispositivo aún no ha sido autorizado para acceder a esta bóveda. Pídale al propietario de la bóveda que lo autorice. hub.unauthorized.description=Su dispositivo aún no ha sido autorizado para acceder a esta bóveda. Pídale al propietario de la bóveda que lo autorice.
@@ -181,8 +193,8 @@ lock.forced.description=El bloqueo de "%s" fue bloqueado por operaciones pendien
lock.forced.retryBtn=Reintentar lock.forced.retryBtn=Reintentar
lock.forced.forceBtn=Forzar bloqueo lock.forced.forceBtn=Forzar bloqueo
## Failure ## Failure
lock.fail.message=Error al bloquear la bóveda lock.fail.message=Error al bloquear la caja fuerte
lock.fail.description=No se pudo bloquear la bóveda "%s". Asegúrese de que el trabajo no guardado se ha guardado en otro lugar y las operaciones de lectura/escritura importantes han finalizado. Para cerrar la bóveda termine el proceso de Cryptomator. lock.fail.description=No se pudo bloquear la caja fuerte "%s". Asegúrese de que el trabajo no guardado se ha guardado en otro lugar y las operaciones de lectura/escritura importantes han finalizado. Para cerrar la bóveda termine el proceso de Cryptomator.
# Migration # Migration
migration.title=Actualizar bóveda migration.title=Actualizar bóveda
@@ -308,6 +320,14 @@ preferences.updates.currentVersion=Versión actual: %s
preferences.updates.autoUpdateCheck=Buscar actualizaciones automáticamente preferences.updates.autoUpdateCheck=Buscar actualizaciones automáticamente
preferences.updates.checkNowBtn=Buscar ahora preferences.updates.checkNowBtn=Buscar ahora
preferences.updates.updateAvailable=Actualización a la versión %s disponible. preferences.updates.updateAvailable=Actualización a la versión %s disponible.
preferences.updates.lastUpdateCheck=Última comprobación: %s
preferences.updates.lastUpdateCheck.never=nunca
preferences.updates.lastUpdateCheck.recently=recientemente
preferences.updates.lastUpdateCheck.daysAgo=hace %s días
preferences.updates.lastUpdateCheck.hoursAgo=hace %s horas
preferences.updates.checkFailed=La comprobación de actualizaciones ha fallado. Compruebe su conexión a Internet o inténtelo más tarde.
preferences.updates.upToDate=Cryptomator está actualizado.
## Contribution ## Contribution
preferences.contribute=Apóyenos preferences.contribute=Apóyenos
preferences.contribute.registeredFor=Certificado de soporte registrado para %s preferences.contribute.registeredFor=Certificado de soporte registrado para %s
@@ -380,6 +400,7 @@ main.vaultDetail.unlockBtn=Desbloquear…
main.vaultDetail.unlockNowBtn=Desbloquear ahora main.vaultDetail.unlockNowBtn=Desbloquear ahora
main.vaultDetail.optionsBtn=Opciones de la bóveda main.vaultDetail.optionsBtn=Opciones de la bóveda
main.vaultDetail.passwordSavedInKeychain=Contraseña guardada main.vaultDetail.passwordSavedInKeychain=Contraseña guardada
main.vaultDetail.share=Compartir…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=DESBLOQUEADO main.vaultDetail.unlockedStatus=DESBLOQUEADO
main.vaultDetail.accessLocation=El contenido de la bóveda es accesible aquí: main.vaultDetail.accessLocation=El contenido de la bóveda es accesible aquí:
@@ -445,6 +466,7 @@ vaultOptions.mount.mountPoint.custom=Usar directorio seleccionado
vaultOptions.mount.mountPoint.directoryPickerButton=Elegir… vaultOptions.mount.mountPoint.directoryPickerButton=Elegir…
vaultOptions.mount.mountPoint.directoryPickerTitle=Seleccionar un directorio vaultOptions.mount.mountPoint.directoryPickerTitle=Seleccionar un directorio
vaultOptions.mount.volumeType.default=Predeterminado (%s) vaultOptions.mount.volumeType.default=Predeterminado (%s)
vaultOptions.mount.volumeType.restartRequired=Para utilizar este tipo de volumen debe reiniciar Cryptomator.
vaultOptions.mount.volume.tcp.port=Puerto TCP vaultOptions.mount.volume.tcp.port=Puerto TCP
vaultOptions.mount.volume.type=Tipo de volumen vaultOptions.mount.volume.type=Tipo de volumen
## Master Key ## Master Key
@@ -518,4 +540,28 @@ updateReminder.notNow=Ahora no
updateReminder.yesOnce=Sí, una vez updateReminder.yesOnce=Sí, una vez
updateReminder.yesAutomatically=Sí, automáticamente updateReminder.yesAutomatically=Sí, automáticamente
#Dokany Support End
dokanySupportEnd.title=Aviso de obsolescencia
dokanySupportEnd.message=Fin de soporte para Dokany
dokanySupportEnd.description=El tipo de volumen Dokany ya no está soportado por Cryptomator. Su configuración se ajusta para utilizar el tipo de volumen predeterminado ahora. Puede ver el tipo predeterminado en las preferencias.
dokanySupportEnd.preferencesBtn=Abrir preferencias
# Share Vault # Share Vault
shareVault.title=Compartir bóveda
shareVault.message=¿Le gustaría compartir su bóveda con alguien más?
shareVault.description=Siempre tenga cuidado cuando comparta su bóveda con otras personas. En resumen, siga estos pasos:
shareVault.instruction.1=1. Comparta el acceso a la carpeta de la bóveda cifrada a través del almacenamiento en la nube.
shareVault.instruction.2=2. Comparta la contraseña de la bóveda de manera segura.
shareVault.remarkBestPractices=Para más información, consulte las sugerencias de buenas prácticas en nuestros documentos.
shareVault.docsTooltip=Abra la documentación para conocer más sobre cómo compartir sus bóvedas.
shareVault.hubAd.description=Una manera segura de trabajar en equipos
shareVault.hubAd.keyManagement=• Administración de claves de cero conocimiento
shareVault.hubAd.authentication=• Autenticación fuerte
shareVault.hubAd.encryption=• Cifrado de extremo a extremo
shareVault.visitHub=Visite Cryptomator Hub
shareVault.hub.message=Cómo compartir una bóveda de Hub
shareVault.hub.description=Para compartir el contenido de la bóveda con otro miembro del equipo, tiene que realizar dos pasos:
shareVault.hub.instruction.1=1. Comparta el acceso a la carpeta de la bóveda cifrada a través del almacenamiento en la nube.
shareVault.hub.instruction.2=2. Conceda el acceso al miembro del equipo en Cryptomator Hub.
shareVault.hub.openHub=Abrir Cryptomator Hub
@@ -95,6 +95,13 @@ lock.forced.retryBtn=تلاش مجدد
## Interface ## Interface
## Volume ## Volume
## Updates ## Updates
preferences.updates.lastUpdateCheck=آخرین بررسی: %s
preferences.updates.lastUpdateCheck.never=هرگز
preferences.updates.lastUpdateCheck.recently=به تازگی
preferences.updates.lastUpdateCheck.daysAgo=%s روز پیش
preferences.updates.lastUpdateCheck.hoursAgo=%s ساعت قبل
preferences.updates.upToDate=Cryptomator به روز می باشد.
## Contribution ## Contribution
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -149,4 +156,6 @@ vaultOptions.mount.mountPoint.directoryPickerButton=انتخاب کنید…
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault # Share Vault
@@ -206,6 +206,7 @@ preferences.title=Asetukset
## Interface ## Interface
## Volume ## Volume
## Updates ## Updates
## Contribution ## Contribution
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -267,4 +268,7 @@ vaultOptions.masterkey.changePasswordBtn=Vaihda salasana
# Update Reminder # Update Reminder
#Dokany Support End
dokanySupportEnd.preferencesBtn=Avaa asetukset
# Share Vault # Share Vault
@@ -305,6 +305,7 @@ 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.
## Contribution ## Contribution
preferences.contribute=Suportahan Kami preferences.contribute=Suportahan Kami
preferences.contribute.registeredFor=Nakarehistro ang sertipiko ng tagasuporta para sa %s preferences.contribute.registeredFor=Nakarehistro ang sertipiko ng tagasuporta para sa %s
@@ -511,4 +512,7 @@ updateReminder.notNow=Hindi ngayon
updateReminder.yesOnce=Oo, Minsan updateReminder.yesOnce=Oo, Minsan
updateReminder.yesAutomatically=Oo, Awtomatiko updateReminder.yesAutomatically=Oo, Awtomatiko
#Dokany Support End
dokanySupportEnd.preferencesBtn=Buksan ang Mga Kagustuhan
# Share Vault # Share Vault
+15 -1
View File
@@ -320,6 +320,14 @@ preferences.updates.currentVersion=Version actuelle : “%s”
preferences.updates.autoUpdateCheck=Vérifier automatiquement si des mises à jour sont disponibles preferences.updates.autoUpdateCheck=Vérifier automatiquement si des mises à jour sont disponibles
preferences.updates.checkNowBtn=Vérifier maintenant preferences.updates.checkNowBtn=Vérifier maintenant
preferences.updates.updateAvailable=Mise à jour “%s” disponible. preferences.updates.updateAvailable=Mise à jour “%s” disponible.
preferences.updates.lastUpdateCheck=Dernière vérification : %s
preferences.updates.lastUpdateCheck.never=jamais
preferences.updates.lastUpdateCheck.recently=récemment
preferences.updates.lastUpdateCheck.daysAgo=Il y a %s jours
preferences.updates.lastUpdateCheck.hoursAgo=il y a %s heures
preferences.updates.checkFailed=La recherche de mises à jour a échoué. Veuillez vérifier votre connexion internet ou réessayez plus tard.
preferences.updates.upToDate=Cryptomator est à jour.
## Contribution ## Contribution
preferences.contribute=Nous soutenir preferences.contribute=Nous soutenir
preferences.contribute.registeredFor=Certificat de soutien enregistré pour %s preferences.contribute.registeredFor=Certificat de soutien enregistré pour %s
@@ -477,7 +485,7 @@ vaultOptions.hub.convertBtn=Convertir en coffre-fort basé sur mot de passe
## Display Recovery Key ## Display Recovery Key
recoveryKey.display.title=Montrer la clé de récupération recoveryKey.display.title=Montrer la clé de récupération
recoveryKey.create.message=Mot de passe requis recoveryKey.create.message=Mot de passe requis
recoveryKey.create.description=Entrer le mot de passe de "%s" pour afficher sa clé de récupération. recoveryKey.create.description=Entrez le mot de passe de "%s" pour afficher sa clé de récupération.
recoveryKey.display.description=La clé de récupération suivante peut être utilisée pour restaurer l'accès à "%s " : recoveryKey.display.description=La clé de récupération suivante peut être utilisée pour restaurer l'accès à "%s " :
recoveryKey.display.StorageHints=Gardez-la dans un endroit sûr, par ex. :\n • Stockez-la en utilisant un gestionnaire de mots de passe\n • Enregistrez-la sur une clé USB\n • Imprimez-la recoveryKey.display.StorageHints=Gardez-la dans un endroit sûr, par ex. :\n • Stockez-la en utilisant un gestionnaire de mots de passe\n • Enregistrez-la sur une clé USB\n • Imprimez-la
## Reset Password ## Reset Password
@@ -532,6 +540,12 @@ updateReminder.notNow=Plus tard
updateReminder.yesOnce=Cette fois seulement updateReminder.yesOnce=Cette fois seulement
updateReminder.yesAutomatically=Oui, automatiquement updateReminder.yesAutomatically=Oui, automatiquement
#Dokany Support End
dokanySupportEnd.title=Avis d'obsolescence
dokanySupportEnd.message=Fin de la prise en charge de Dokany
dokanySupportEnd.description=Le type de volume Dokany n'est plus pris en charge par Cryptomator. Vos paramètres sont à présent ajustés pour utiliser le type de volume par défaut. Vous pouvez voir le type par défaut dans les préférences.
dokanySupportEnd.preferencesBtn=Ouvrir les préférences
# Share Vault # Share Vault
shareVault.title=Partager le coffre shareVault.title=Partager le coffre
shareVault.message=Vous aimeriez partager votre coffre avec d'autres personnes ? shareVault.message=Vous aimeriez partager votre coffre avec d'autres personnes ?
@@ -77,6 +77,7 @@ lock.forced.retryBtn=Tentar de novo
## Interface ## Interface
## Volume ## Volume
## Updates ## Updates
## Contribution ## Contribution
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -126,4 +127,6 @@ main.closeBtn.tooltip=Pechar
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault # Share Vault
@@ -297,6 +297,7 @@ preferences.updates.currentVersion=הגרסה הנוכחית: %s
preferences.updates.autoUpdateCheck=בצע בדיקת עדכונים אוטומטית preferences.updates.autoUpdateCheck=בצע בדיקת עדכונים אוטומטית
preferences.updates.checkNowBtn=בדוק כעת preferences.updates.checkNowBtn=בדוק כעת
preferences.updates.updateAvailable=שדרוג לגרסה %s זמין. preferences.updates.updateAvailable=שדרוג לגרסה %s זמין.
## Contribution ## Contribution
preferences.contribute=תמוך בנו preferences.contribute=תמוך בנו
preferences.contribute.registeredFor=אישור על תמיכה על שם %s preferences.contribute.registeredFor=אישור על תמיכה על שם %s
@@ -493,4 +494,7 @@ updateReminder.title=בדיקת עדכון
updateReminder.message=חפש עדכונים? updateReminder.message=חפש עדכונים?
updateReminder.notNow=לא עכשיו updateReminder.notNow=לא עכשיו
#Dokany Support End
dokanySupportEnd.preferencesBtn=פתח העדפות
# Share Vault # Share Vault
@@ -216,6 +216,7 @@ preferences.updates=नवीनीकरण
preferences.updates.currentVersion=वर्तमान संस्करण: %s preferences.updates.currentVersion=वर्तमान संस्करण: %s
preferences.updates.checkNowBtn=अभी जाँचें preferences.updates.checkNowBtn=अभी जाँचें
preferences.updates.updateAvailable=संस्करण %s की तरफ नवीनीकरण उपलब्ध है। preferences.updates.updateAvailable=संस्करण %s की तरफ नवीनीकरण उपलब्ध है।
## Contribution ## Contribution
preferences.contribute=हमें सपोर्ट करें preferences.contribute=हमें सपोर्ट करें
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -311,4 +312,7 @@ quit.forced.message=कुछ वॉल्ट्स लॉक नहीं ह
# Update Reminder # Update Reminder
#Dokany Support End
dokanySupportEnd.preferencesBtn=प्राथमिकताएँ खोलें
# Share Vault # Share Vault
@@ -224,6 +224,7 @@ preferences.updates.currentVersion=Trenutna verzija: %s
preferences.updates.autoUpdateCheck=Automatski provjeri nadogradnje preferences.updates.autoUpdateCheck=Automatski provjeri nadogradnje
preferences.updates.checkNowBtn=Provjeri sada preferences.updates.checkNowBtn=Provjeri sada
preferences.updates.updateAvailable=Nadogradnja na verziju %s dostupna. preferences.updates.updateAvailable=Nadogradnja na verziju %s dostupna.
## Contribution ## Contribution
preferences.contribute=Podržite nas preferences.contribute=Podržite nas
preferences.contribute.registeredFor=Certifikat podržavatelja registriran za %s preferences.contribute.registeredFor=Certifikat podržavatelja registriran za %s
@@ -382,4 +383,6 @@ quit.lockAndQuitBtn=Zaključaj i napusti
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault # Share Vault
@@ -303,6 +303,7 @@ preferences.updates.currentVersion=Jelenlegi verzió: %s
preferences.updates.autoUpdateCheck=Frissítések autómatikus keresése preferences.updates.autoUpdateCheck=Frissítések autómatikus keresése
preferences.updates.checkNowBtn=Ellenőrzés most preferences.updates.checkNowBtn=Ellenőrzés most
preferences.updates.updateAvailable=Frissítés a %s verzióra elérhető. preferences.updates.updateAvailable=Frissítés a %s verzióra elérhető.
## Contribution ## Contribution
preferences.contribute=Támogasson bennünket preferences.contribute=Támogasson bennünket
preferences.contribute.registeredFor=Támogatói igazolás regisztrálva neki: %s preferences.contribute.registeredFor=Támogatói igazolás regisztrálva neki: %s
@@ -509,4 +510,10 @@ updateReminder.notNow=Most nem
updateReminder.yesOnce=Igen, egyszer updateReminder.yesOnce=Igen, egyszer
updateReminder.yesAutomatically=Igen, automatikusan updateReminder.yesAutomatically=Igen, automatikusan
#Dokany Support End
dokanySupportEnd.title=Értesítés elavulásról
dokanySupportEnd.message=Vége a Dokany támogatásának
dokanySupportEnd.description=A Cryptomator nem támogatja tovább a Dokany kötettípust. A beállítások az alapértelmezett kötettípus használatára lettek állítva. Az alapértelmezett típust a beállítások közt tekintheted meg.
dokanySupportEnd.preferencesBtn=Beállítások megnyitása
# Share Vault # Share Vault
+176 -3
View File
@@ -20,6 +20,11 @@ error.description=Ups! Cryptomator tidak menyangka hal ini terjadi. Anda dapat m
error.hyperlink.lookup=Cari error berikut error.hyperlink.lookup=Cari error berikut
error.hyperlink.report=Laporkan error berikut error.hyperlink.report=Laporkan error berikut
error.technicalDetails=Rincian: error.technicalDetails=Rincian:
error.existingSolutionDescription=Maaf, Cryptomator tiba-tiba berhenti. Tapi telah ditemukan sebuah jawaban untuk masalah ini. Silahkan lihat tautan berikut.
error.hyperlink.solution=Cari tahu solusinya
error.lookupPermissionMessage=Cryptomator bisa mencari solusinya secara daring. Ini akan meneruskan pesan ke direktori masalah kami dengan alamat IP Anda.
error.dismiss=Tutup
error.lookUpSolution=Cari tahu solusinya
# Defaults # Defaults
defaults.vault.vaultName=Vault defaults.vault.vaultName=Vault
@@ -34,13 +39,15 @@ traymenu.vault.lock=Kunci
traymenu.vault.reveal=Perlihatkan traymenu.vault.reveal=Perlihatkan
# Add Vault Wizard # Add Vault Wizard
addvaultwizard.title=Tambah Vault addvaultwizard.title=Tambah Brankas
## New ## New
addvaultwizard.new.title=Tambah Vault baru
### Name ### Name
addvaultwizard.new.nameInstruction=Beri nama untuk vault berikut addvaultwizard.new.nameInstruction=Buat sebuah nama untuk brankas
addvaultwizard.new.namePrompt=Nama Vault addvaultwizard.new.namePrompt=Nama Brankas
### Location ### Location
addvaultwizard.new.locationInstruction=Dimana Cryptomator seharusnya menyimpan vault berisi file enkripsi Anda? addvaultwizard.new.locationInstruction=Dimana Cryptomator seharusnya menyimpan vault berisi file enkripsi Anda?
addvaultwizard.new.locationLoading=Memeriksa sistem file lokal untuk direktori default penyimpanan cloud…
addvaultwizard.new.locationLabel=Lokasi penyimpanan addvaultwizard.new.locationLabel=Lokasi penyimpanan
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Lokasi khusus addvaultwizard.new.directoryPickerLabel=Lokasi khusus
@@ -50,7 +57,18 @@ addvaultwizard.new.fileAlreadyExists=Sudah ada file atau direktori dengan nama v
addvaultwizard.new.locationDoesNotExist=Direktori pada path yang dipilih tidak tersedia atau tidak dapat diakses addvaultwizard.new.locationDoesNotExist=Direktori pada path yang dipilih tidak tersedia atau tidak dapat diakses
addvaultwizard.new.locationIsNotWritable=Anda tidak memiliki hak akses untuk menulis pada path yang dipilih addvaultwizard.new.locationIsNotWritable=Anda tidak memiliki hak akses untuk menulis pada path yang dipilih
addvaultwizard.new.locationIsOk=Lokasi yang sesuai dengan vault Anda addvaultwizard.new.locationIsOk=Lokasi yang sesuai dengan vault Anda
addvaultwizard.new.invalidName=Nama Vault tidak valid
addvaultwizard.new.validName=Nama vault yang valid
addvaultwizard.new.validCharacters.message=Nama vault mungkin berisi karakter berikut:
addvaultwizard.new.validCharacters.chars=Karakter kata (mis. a, ж or 수)
addvaultwizard.new.validCharacters.numbers=Angka
addvaultwizard.new.validCharacters.dashes=Tanda hubung (%s) atau garis bawah (%s)
### Expert Settings ### Expert Settings
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Aktifkan pengaturan ahli
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Masukkan nilai antara 36 dan 220 (default 220)
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Buka dokumentasi untuk mempelajari lebih lanjut.
addvaultwizard.new.expertSettings.shorteningThreshold.title=Panjang maksimum nama file terenkripsi
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Valid
### Password ### Password
addvaultwizard.new.createVaultBtn=Buat Vault addvaultwizard.new.createVaultBtn=Buat Vault
addvaultwizard.new.generateRecoveryKeyChoice=Anda tidak dapat mengakses data tanpa kata sandi yang Anda miliki. Apa Anda ingin sebuah kunci pemulihan untuk berjaga-jaga jika seandainya Anda kehilangan kata sandi? addvaultwizard.new.generateRecoveryKeyChoice=Anda tidak dapat mengakses data tanpa kata sandi yang Anda miliki. Apa Anda ingin sebuah kunci pemulihan untuk berjaga-jaga jika seandainya Anda kehilangan kata sandi?
@@ -74,6 +92,7 @@ addvault.new.readme.accessLocation.2=Ini adalah lokasi akses dari vault Anda.
addvault.new.readme.accessLocation.3=Seluruh file yang ditambahkan ke volume ini akan dienkripsi oleh Cryptomator. Anda dapat mempergunakan isi vault seperti dalam folder/drive lain pada umumnya. Tampilan yang saat ini Anda lihat adalah tampilan dalam bentuk terdekripsi, yang sebenarnya terjadi adalah file-file Anda selalu dalam kondisi terenkripsi di dalam hard drive Anda. addvault.new.readme.accessLocation.3=Seluruh file yang ditambahkan ke volume ini akan dienkripsi oleh Cryptomator. Anda dapat mempergunakan isi vault seperti dalam folder/drive lain pada umumnya. Tampilan yang saat ini Anda lihat adalah tampilan dalam bentuk terdekripsi, yang sebenarnya terjadi adalah file-file Anda selalu dalam kondisi terenkripsi di dalam hard drive Anda.
addvault.new.readme.accessLocation.4=Anda dapat menghapus file ini. addvault.new.readme.accessLocation.4=Anda dapat menghapus file ini.
## Existing ## Existing
addvaultwizard.existing.title=Tambahkan Vault yang Ada
addvaultwizard.existing.instruction=Pilih file "vault.cryptomator" Anda dari vault yang ada. Jika hanya ada file bernama "masterkey.cryptomator", pilih file tersebut. addvaultwizard.existing.instruction=Pilih file "vault.cryptomator" Anda dari vault yang ada. Jika hanya ada file bernama "masterkey.cryptomator", pilih file tersebut.
addvaultwizard.existing.chooseBtn=Pilih… addvaultwizard.existing.chooseBtn=Pilih…
addvaultwizard.existing.filePickerTitle=Pilih File Vault addvaultwizard.existing.filePickerTitle=Pilih File Vault
@@ -84,6 +103,7 @@ addvaultwizard.success.unlockNow=Buka Kunci Sekarang
# Remove Vault # Remove Vault
removeVault.title=Hapus Vault removeVault.title=Hapus Vault
removeVault.message=Hapus vault?
removeVault.description=Tindakan ini hanya akan membuat Cryptomator melupakan vault ini. Anda dapat menambahkan vault ini lagi nanti. File yang telah dienkripsi tidak akan dihapus dari hard drive Anda. removeVault.description=Tindakan ini hanya akan membuat Cryptomator melupakan vault ini. Anda dapat menambahkan vault ini lagi nanti. File yang telah dienkripsi tidak akan dihapus dari hard drive Anda.
removeVault.confirmBtn=Hapus Vault removeVault.confirmBtn=Hapus Vault
@@ -94,6 +114,7 @@ changepassword.finalConfirmation=Saya mengerti bahwa saya tidak akan dapat menga
# Forget Password # Forget Password
forgetPassword.title=Lupa Kata Sandi forgetPassword.title=Lupa Kata Sandi
forgetPassword.message=Lupakan kata sandi yang disimpan?
forgetPassword.description=Tindakan ini akan menghapus kata sandi vault berikut yang tersimpan dari sistem keychain Anda. forgetPassword.description=Tindakan ini akan menghapus kata sandi vault berikut yang tersimpan dari sistem keychain Anda.
forgetPassword.confirmBtn=Lupa Kata Sandi forgetPassword.confirmBtn=Lupa Kata Sandi
@@ -103,25 +124,67 @@ unlock.passwordPrompt=Masukkan kata sandi "%s":
unlock.savePassword=Ingat Kata Sandi unlock.savePassword=Ingat Kata Sandi
unlock.unlockBtn=Buka Kunci unlock.unlockBtn=Buka Kunci
## Select ## Select
unlock.chooseMasterkey.message=File masterkey tidak ditemukan
unlock.chooseMasterkey.description=Tidak dapat menemukan file masterkey untuk vault ini pada lokasi yang dicari. Mohon pilih file kunci secara manual. unlock.chooseMasterkey.description=Tidak dapat menemukan file masterkey untuk vault ini pada lokasi yang dicari. Mohon pilih file kunci secara manual.
unlock.chooseMasterkey.filePickerTitle=Pilih File Masterkey unlock.chooseMasterkey.filePickerTitle=Pilih File Masterkey
unlock.chooseMasterkey.filePickerMimeDesc=MasterKey Cryptomator unlock.chooseMasterkey.filePickerMimeDesc=MasterKey Cryptomator
## Success ## Success
unlock.success.message=Buka kunci berhasil
unlock.success.description="%s" berhasil dibuka! Vault Anda sekarang dapat diakses melalui drive virtual. unlock.success.description="%s" berhasil dibuka! Vault Anda sekarang dapat diakses melalui drive virtual.
unlock.success.rememberChoice=Ingat pilihan saya, jangan perlihatkan lagi unlock.success.rememberChoice=Ingat pilihan saya, jangan perlihatkan lagi
unlock.success.revealBtn=Tampilkan Drive unlock.success.revealBtn=Tampilkan Drive
## Failure ## Failure
unlock.error.customPath.message=Tidak dapat memasang vault ke path kustom
unlock.error.customPath.description.notSupported=Jika Anda ingin tetap menggunakan path kustom, silakan buka preferensi dan pilih jenis volume yang mendukungnya. Jika tidak, buka opsi vault dan pilih titik mount yang didukung.
unlock.error.customPath.description.notExists=Jalur pemasangan kustom tidak ada. Baik membuatnya di sistem file lokal Anda atau mengubahnya di opsi vault.
unlock.error.customPath.description.inUse=Huruf drive atau jalur pemasangan kustom "%s" sudah digunakan.
unlock.error.customPath.description.hideawayNotDir=File sementara dan tersembunyi "%3$s" yang digunakan untuk membuka kunci tidak dapat dihapus. Silakan periksa file dan kemudian hapus secara manual.
unlock.error.customPath.description.couldNotBeCleaned=Vault Anda tidak dapat dipasang ke path "%s". Silakan coba lagi atau pilih path yang berbeda.
unlock.error.customPath.description.notEmptyDir=Path kustom pemasangan "%s" bukan folder kosong. Silakan pilih folder kosong dan coba lagi.
unlock.error.customPath.description.generic=Anda telah memilih kustom path pemasangan untuk vault ini, tetapi gagal menggunakannya dengan pesan:%2$s
unlock.error.restartRequired.message=Tidak dapat membuka kunci vault
unlock.error.restartRequired.description=Ubah jenis volume di opsi vault atau restart Cryptomator.
unlock.error.title=Gagal membuka kunci "%s"
## Hub ## Hub
hub.noKeychain.message=Tidak dapat mengakses perangkat kunci
hub.noKeychain.description=Untuk membuka kunci Hub vault, diperlukan perangkat kunci, yang diamankan menggunakan keychain. Untuk melanjutkan, aktifkan “%s” dan pilih keychain di preferensi.
hub.noKeychain.openBtn=Buka Preferensi
### Waiting ### Waiting
hub.auth.message=Menunggu otentikasi…
hub.auth.description=Anda secara otomatis akan diarahkan ke halaman login.
hub.auth.loginLink=Tidak diarahkan? Klik di sini untuk membukanya.
### Receive Key ### Receive Key
hub.receive.message=Respons pemrosesan…
hub.receive.description=Cryptomator menerima dan memproses respons dari Hub. Harap tunggu.
### Register Device ### Register Device
hub.register.message=Perangkat Baru
hub.register.description=Ini adalah akses Hub pertama dari perangkat ini. Silakan daftarkan menggunakan Kunci Akun Anda.
hub.register.nameLabel=Nama Perangkat
hub.register.invalidAccountKeyLabel=Kunci Akun Tidak Valid
hub.register.registerBtn=Daftar
### Register Device Legacy ### Register Device Legacy
hub.register.legacy.occupiedMsg=Nama sudah digunakan
hub.register.legacy.description=Ini adalah akses Hub pertama dari perangkat ini. Silakan daftarkan.
### Registration Success ### Registration Success
hub.registerSuccess.message=Perangkat terdaftar
hub.registerSuccess.description=Perangkat Anda berhasil terdaftar. Sekarang Anda dapat membuka kunci vault.
hub.registerSuccess.unlockBtn=Buka Kunci hub.registerSuccess.unlockBtn=Buka Kunci
hub.registerSuccess.legacy.description=Untuk mengakses vault, perangkat Anda harus diberi wewenang tambahan oleh pemilik vault.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Registrasi perangkat gagal
hub.registerFailed.description.generic=Kesalahan terjadi dalam proses pendaftaran. Untuk detail lebih lanjut, lihat log aplikasi.
hub.registerFailed.description.deviceAlreadyExists=Perangkat ini sudah terdaftar untuk pengguna lain. Cobalah menggunakan akun pengguna atau perangkat yang berbeda.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Akses ditolak
hub.unauthorized.description=Perangkat Anda belum diizinkan mengakses vault ini. Mintalah pemilik vault untuk mengizinkannya.
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Tindakan diperlukan
hub.requireAccountInit.description.0=Untuk melanjutkan, silakan lengkapi langkah-langkah yang diperlukan
hub.requireAccountInit.description.1=Hub profil pengguna
hub.requireAccountInit.description.2=.
### License Exceeded ### License Exceeded
hub.invalidLicense.message=Lisensi Hub tidak valid
hub.invalidLicense.description=Instans Cryptomator Hub Anda memiliki lisensi yang tidak valid. Harap informasikan kepada administrator Hub untuk meningkatkan atau memperbarui lisensi.
# Lock # Lock
## Force ## Force
@@ -137,6 +200,11 @@ lock.fail.description=Vault "%s" tidak dapat dikunci. Pastikan bahwa file yang b
migration.title=Tingkatkan Vault migration.title=Tingkatkan Vault
## Start ## Start
migration.start.header=Tingkatkan Vault migration.start.header=Tingkatkan Vault
migration.start.text=Untuk membuka vault Anda "%s" di Cryptomator versi baru ini, vault harus ditingkatkan ke format yang lebih baru. Sebelum melakukan ini, Anda harus tahu hal berikut:
migration.start.remarkUndone=Pembaruan ini tidak dapat dibatalkan.
migration.start.remarkVersions=Cryptomator versi yang lebih lama tidak akan dapat membuka vault yang ditingkatkan.
migration.start.remarkCanRun=Anda harus yakin bahwa setiap perangkat tempat Anda mengakses vault dapat menjalankan versi Cryptomator ini.
migration.start.remarkSynced=Anda harus yakin bahwa vault Anda sepenuhnya disinkronkan pada perangkat ini, dan pada perangkat Anda yang lain, sebelum memutakhirkannya.
migration.start.confirm=Saya telah membaca dan memahami informasi di atas migration.start.confirm=Saya telah membaca dan memahami informasi di atas
## Run ## Run
migration.run.enterPassword=Masukkan kata sandi untuk "%s" migration.run.enterPassword=Masukkan kata sandi untuk "%s"
@@ -185,8 +253,25 @@ health.check.detail.checkFinished=Pemeriksaan berhasil dilakukan.
health.check.detail.checkFinishedAndFound=Pemeriksaan selesai. Silahkan tinjau hasilnya. health.check.detail.checkFinishedAndFound=Pemeriksaan selesai. Silahkan tinjau hasilnya.
health.check.detail.checkFailed=Pemeriksaan terhenti karena terjadi kesalahan. health.check.detail.checkFailed=Pemeriksaan terhenti karena terjadi kesalahan.
health.check.detail.checkCancelled=Pemeriksaan dibatalkan. health.check.detail.checkCancelled=Pemeriksaan dibatalkan.
health.check.detail.listFilters.label=Filter
health.check.detail.fixAllSpecificBtn=Pemulihan semua jenis
health.check.exportBtn=Ekspor Laporan health.check.exportBtn=Ekspor Laporan
## Result view ## Result view
health.result.severityFilter.all=Tingkat Keparahan - Semua
health.result.severityFilter.good=Baik
health.result.severityFilter.info=Info
health.result.severityFilter.warn=Peringatan
health.result.severityFilter.crit=Kritikal
health.result.severityTip.good=Keparahan: Baik\nStruktur vault normal.
health.result.severityTip.info=Keparahan: Info\nStruktur vault utuh, perbaikan disarankan.
health.result.severityTip.warn=Keparahan: Peringatan\nStruktur vault rusak, sangat disarankan untuk perbaikan.
health.result.severityTip.crit=Keparahan: Kritkal\nStruktur vault rusak, kemungkinan kehilangan data.
health.result.fixStateFilter.all=Status pemulihan - Semua
health.result.fixStateFilter.fixable=Dapat dipulihkan
health.result.fixStateFilter.notFixable=Tidak dapat dipulihkan
health.result.fixStateFilter.fixing=Memulihkan…
health.result.fixStateFilter.fixed=Dipulihkan
health.result.fixStateFilter.fixFailed=Pemulihan gagal
## Fix Application ## Fix Application
health.fix.fixBtn=Perbaiki health.fix.fixBtn=Perbaiki
health.fix.successTip=Perbaikan berhasil health.fix.successTip=Perbaikan berhasil
@@ -197,6 +282,7 @@ preferences.title=Preferensi
## General ## General
preferences.general=Umum preferences.general=Umum
preferences.general.startHidden=Sembunyikan jendela saat memulai Cryptomator preferences.general.startHidden=Sembunyikan jendela saat memulai Cryptomator
preferences.general.autoCloseVaults=Kunci vault yang terbuka secara otomatis saat aplikasi dihentikan
preferences.general.debugLogging=Aktifkan pencatatan debug preferences.general.debugLogging=Aktifkan pencatatan debug
preferences.general.debugDirectory=Perlihatkan file log preferences.general.debugDirectory=Perlihatkan file log
preferences.general.autoStart=Jalankan Cryptomator saat sistem dimulai preferences.general.autoStart=Jalankan Cryptomator saat sistem dimulai
@@ -217,13 +303,24 @@ preferences.interface.showMinimizeButton=Tampilkan tombol perkecil
preferences.interface.showTrayIcon=Tampilkan ikon tray (aplikasi perlu dimuat ulang) preferences.interface.showTrayIcon=Tampilkan ikon tray (aplikasi perlu dimuat ulang)
## Volume ## Volume
preferences.volume=Drive Virtual preferences.volume=Drive Virtual
preferences.volume.type=Jenis Default Volume
preferences.volume.type.automatic=Otomatis preferences.volume.type.automatic=Otomatis
preferences.volume.docsTooltip=Buka dokumentasi untuk mempelajari lebih lanjut tentang berbagai jenis volume.
preferences.volume.fuseRestartRequired=Untuk menerapkan perubahan, Cryptomator perlu dimulai kembali.
preferences.volume.tcp.port=TCP Port Default
preferences.volume.supportedFeatures=Jenis volume yang dipilih mendukung fitur-fitur berikut ini:
preferences.volume.feature.mountAuto=Pemilihan titik pemasangan secara otomatis
preferences.volume.feature.mountToDir=Direktori kustom sebagai titik pemasangan
preferences.volume.feature.mountToDriveLetter=Huruf drive sebagai titik pemasangan
preferences.volume.feature.mountFlags=Opsi pemasangan kustom
preferences.volume.feature.readOnly=Pemasangan hanya baca saja
## Updates ## Updates
preferences.updates=Pembaharuan preferences.updates=Pembaharuan
preferences.updates.currentVersion=Versi Saat Ini: %s preferences.updates.currentVersion=Versi Saat Ini: %s
preferences.updates.autoUpdateCheck=Otomatis periksa update preferences.updates.autoUpdateCheck=Otomatis periksa update
preferences.updates.checkNowBtn=Periksa Sekarang preferences.updates.checkNowBtn=Periksa Sekarang
preferences.updates.updateAvailable=Pembaharuan ke versi %s tersedia. preferences.updates.updateAvailable=Pembaharuan ke versi %s tersedia.
## Contribution ## Contribution
preferences.contribute=Dukung Kami preferences.contribute=Dukung Kami
preferences.contribute.registeredFor=Sertifikat supporter terdaftar atas nama %s preferences.contribute.registeredFor=Sertifikat supporter terdaftar atas nama %s
@@ -240,26 +337,34 @@ stats.title=Statistik untuk %s
stats.cacheHitRate=Tingkat Hit Cache stats.cacheHitRate=Tingkat Hit Cache
## Read ## Read
stats.read.throughput.idle=Baca: diam stats.read.throughput.idle=Baca: diam
stats.read.throughput.kibs=Membaca: %.2f KiB/s
stats.read.throughput.mibs=Baca: %.2f MiB/detik stats.read.throughput.mibs=Baca: %.2f MiB/detik
stats.read.total.data.none=Data dibaca: - stats.read.total.data.none=Data dibaca: -
stats.read.total.data.kib=Data yang dibaca: %.1f KiB
stats.read.total.data.mib=Data dibaca: %.1f MiB stats.read.total.data.mib=Data dibaca: %.1f MiB
stats.read.total.data.gib=Data dibaca: %.1f GiB stats.read.total.data.gib=Data dibaca: %.1f GiB
stats.decr.total.data.none=Data terdekripsi: - stats.decr.total.data.none=Data terdekripsi: -
stats.decr.total.data.kib=Data yang didekripsi: %.1f KiB
stats.decr.total.data.mib=Data terdeksripsi: %.1f MiB stats.decr.total.data.mib=Data terdeksripsi: %.1f MiB
stats.decr.total.data.gib=Data terdeksripsi: %.1f GiB stats.decr.total.data.gib=Data terdeksripsi: %.1f GiB
stats.read.accessCount=Total dibaca: %d stats.read.accessCount=Total dibaca: %d
## Write ## Write
stats.write.throughput.idle=Tulis: diam stats.write.throughput.idle=Tulis: diam
stats.write.throughput.kibs=Menulis: %.2f KiB/s
stats.write.throughput.mibs=Tulis: %.2f MiB/detik stats.write.throughput.mibs=Tulis: %.2f MiB/detik
stats.write.total.data.none=Data tertulis: - stats.write.total.data.none=Data tertulis: -
stats.write.total.data.kib=Data yang ditulis: %.1f KiB
stats.write.total.data.mib=Data tertulis: %.1f MiB stats.write.total.data.mib=Data tertulis: %.1f MiB
stats.write.total.data.gib=Data tertulis: %.1f GiB stats.write.total.data.gib=Data tertulis: %.1f GiB
stats.encr.total.data.none=Data terenkripsi: - stats.encr.total.data.none=Data terenkripsi: -
stats.encr.total.data.kib=Data yang dienkripsi: %.1f KiB
stats.encr.total.data.mib=Data terenkripsi: %.1f MiB stats.encr.total.data.mib=Data terenkripsi: %.1f MiB
stats.encr.total.data.gib=Data terenkripsi: %.1f GiB stats.encr.total.data.gib=Data terenkripsi: %.1f GiB
stats.write.accessCount=Total ditulis: %d stats.write.accessCount=Total ditulis: %d
## Accesses ## Accesses
stats.access.current=Akses: %d
stats.access.total=Total yang akses: %d
# Main Window # Main Window
@@ -276,6 +381,9 @@ main.vaultlist.contextMenu.unlock=Buka Kunci…
main.vaultlist.contextMenu.unlockNow=Buka Kunci Sekarang main.vaultlist.contextMenu.unlockNow=Buka Kunci Sekarang
main.vaultlist.contextMenu.vaultoptions=Tampilkan Opsi Vault main.vaultlist.contextMenu.vaultoptions=Tampilkan Opsi Vault
main.vaultlist.contextMenu.reveal=Buka Drive main.vaultlist.contextMenu.reveal=Buka Drive
main.vaultlist.addVaultBtn=Tambah
main.vaultlist.addVaultBtn.menuItemNew=Vault Baru...
main.vaultlist.addVaultBtn.menuItemExisting=Vault yang ada...
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Terima kasih telah memilih Cryptomator untuk melindungi file Anda. Jika Anda memerlukan bantuan, lihat panduan awal kami: main.vaultDetail.welcomeOnboarding=Terima kasih telah memilih Cryptomator untuk melindungi file Anda. Jika Anda memerlukan bantuan, lihat panduan awal kami:
@@ -285,16 +393,23 @@ main.vaultDetail.unlockBtn=Buka Kunci…
main.vaultDetail.unlockNowBtn=Buka Kunci Sekarang main.vaultDetail.unlockNowBtn=Buka Kunci Sekarang
main.vaultDetail.optionsBtn=Opsi Vault main.vaultDetail.optionsBtn=Opsi Vault
main.vaultDetail.passwordSavedInKeychain=Kata Sandi tersimpan main.vaultDetail.passwordSavedInKeychain=Kata Sandi tersimpan
main.vaultDetail.share=Bagikan…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=TERBUKA main.vaultDetail.unlockedStatus=TERBUKA
main.vaultDetail.accessLocation=Konten vault Anda dapat diakses di sini: main.vaultDetail.accessLocation=Konten vault Anda dapat diakses di sini:
main.vaultDetail.revealBtn=Buka Drive main.vaultDetail.revealBtn=Buka Drive
main.vaultDetail.copyUri=Salin URI
main.vaultDetail.lockBtn=Gembok main.vaultDetail.lockBtn=Gembok
main.vaultDetail.bytesPerSecondRead=Read: main.vaultDetail.bytesPerSecondRead=Read:
main.vaultDetail.bytesPerSecondWritten=Write: main.vaultDetail.bytesPerSecondWritten=Write:
main.vaultDetail.throughput.idle=idle main.vaultDetail.throughput.idle=idle
main.vaultDetail.throughput.kbps=%.1f KiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/detik main.vaultDetail.throughput.mbps=%.1f MiB/detik
main.vaultDetail.stats=Statistik Vault main.vaultDetail.stats=Statistik Vault
main.vaultDetail.locateEncryptedFileBtn=Temukan File yang Dienkripsi
main.vaultDetail.locateEncryptedFileBtn.tooltip=Pilih file dari vault Anda untuk menemukan mitra enkripsinya
main.vaultDetail.encryptedPathsCopied=Path Disalin ke Clipboard!
main.vaultDetail.filePickerTitle=Pilih File Didalam Vault
### Missing ### Missing
main.vaultDetail.missing.info=Cryptomator tidak dapat menemukan vault di path ini. main.vaultDetail.missing.info=Cryptomator tidak dapat menemukan vault di path ini.
main.vaultDetail.missing.recheck=Periksa kembali main.vaultDetail.missing.recheck=Periksa kembali
@@ -333,34 +448,59 @@ vaultOptions.general.startHealthCheckBtn=Mulai Pemeriksaan Kesehatan
## Mount ## Mount
vaultOptions.mount=Pemasangan vaultOptions.mount=Pemasangan
vaultOptions.mount.info=Buka preferensi drive virtual untuk mengubah pengaturan default.
vaultOptions.mount.readonly=Read-Only vaultOptions.mount.readonly=Read-Only
vaultOptions.mount.customMountFlags=Custom Mount Flags vaultOptions.mount.customMountFlags=Custom Mount Flags
vaultOptions.mount.winDriveLetterOccupied=terpakai vaultOptions.mount.winDriveLetterOccupied=terpakai
vaultOptions.mount.mountPoint=Titik Pasang vaultOptions.mount.mountPoint=Titik Pasang
vaultOptions.mount.mountPoint.auto=Secara otomatis memilih lokasi yang sesuai vaultOptions.mount.mountPoint.auto=Secara otomatis memilih lokasi yang sesuai
vaultOptions.mount.mountPoint.driveLetter=Gunakan drive letter yang sudah ditetapkan vaultOptions.mount.mountPoint.driveLetter=Gunakan drive letter yang sudah ditetapkan
vaultOptions.mount.mountPoint.custom=Gunakan direktori yang dipilih
vaultOptions.mount.mountPoint.directoryPickerButton=Pilih… vaultOptions.mount.mountPoint.directoryPickerButton=Pilih…
vaultOptions.mount.mountPoint.directoryPickerTitle=Pilih directori
vaultOptions.mount.volumeType.default=Default (%s)
vaultOptions.mount.volumeType.restartRequired=Untuk menggunakan tipe volume ini, Cryptomator perlu dimulai ulang.
vaultOptions.mount.volume.tcp.port=Port TCP
vaultOptions.mount.volume.type=Jenis Volume
## Master Key ## Master Key
vaultOptions.masterkey=Kata Sandi vaultOptions.masterkey=Kata Sandi
vaultOptions.masterkey.changePasswordBtn=Ubah Kata Sandi vaultOptions.masterkey.changePasswordBtn=Ubah Kata Sandi
vaultOptions.masterkey.forgetSavedPasswordBtn=Lupa Kata Sandi vaultOptions.masterkey.forgetSavedPasswordBtn=Lupa Kata Sandi
vaultOptions.masterkey.recoveryKeyExplanation=Kunci pemulihan adalah satu-satunya cara Anda untuk memulihkan akses ke vault jika Anda kehilangan kata sandi. vaultOptions.masterkey.recoveryKeyExplanation=Kunci pemulihan adalah satu-satunya cara Anda untuk memulihkan akses ke vault jika Anda kehilangan kata sandi.
vaultOptions.masterkey.showRecoveryKeyBtn=Tampilkan Kunci Pemulihan vaultOptions.masterkey.showRecoveryKeyBtn=Tampilkan Kunci Pemulihan
vaultOptions.masterkey.recoverPasswordBtn=Atur Ulang Kata Sandi
## Hub ## Hub
vaultOptions.hub=Pemulihan
vaultOptions.hub.convertInfo=Anda dapat menggunakan kunci pemulihan untuk mengonversi Hub vault ini ke vault berbasis kata sandi dalam keadaan darurat.
vaultOptions.hub.convertBtn=Konversi ke Vault Berbasis Kata Sandi
# Recovery Key # Recovery Key
## Display Recovery Key ## Display Recovery Key
recoveryKey.display.title=Tampilkan Kunci Pemulihan
recoveryKey.create.message=Diperlukan kata sandi
recoveryKey.create.description=Masukkan kata sandi untuk menampilkan kunci pemulikan untuk "%s": recoveryKey.create.description=Masukkan kata sandi untuk menampilkan kunci pemulikan untuk "%s":
recoveryKey.display.description=Kunci pemulihan berikut dapat digunakan untuk memulihkan akses ke "%s": recoveryKey.display.description=Kunci pemulihan berikut dapat digunakan untuk memulihkan akses ke "%s":
recoveryKey.display.StorageHints=Simpan di tempat yang sangat aman, misal.:\n • Simpan menggunakan password manager\n • Simpan di USB\n • cetak di kertas recoveryKey.display.StorageHints=Simpan di tempat yang sangat aman, misal.:\n • Simpan menggunakan password manager\n • Simpan di USB\n • cetak di kertas
## Reset Password ## Reset Password
### Enter Recovery Key ### Enter Recovery Key
recoveryKey.recover.title=Atur Ulang Kata Sandi
recoveryKey.recover.prompt=Masukkan kunci pemulihan untuk "%s":
recoveryKey.recover.correctKey=Ini adalah kunci pemulihan yang valid recoveryKey.recover.correctKey=Ini adalah kunci pemulihan yang valid
recoveryKey.recover.wrongKey=Kunci pemulihan ini milik vault yang lain
recoveryKey.recover.invalidKey=Kunci pemulihan ini tidak valid
recoveryKey.printout.heading=Kunci Pemulihan Cryptomator\n"%s"\n recoveryKey.printout.heading=Kunci Pemulihan Cryptomator\n"%s"\n
### Reset Password ### Reset Password
recoveryKey.recover.resetBtn=Atur ulang
### Recovery Key Password Reset Success ### Recovery Key Password Reset Success
recoveryKey.recover.resetSuccess.message=Atur ulang kata sandi berhasil
recoveryKey.recover.resetSuccess.description=Anda dapat membuka kunci vault Anda dengan kata sandi baru.
# Convert Vault # Convert Vault
convertVault.title=Konversi Vault
convertVault.convert.convertBtn.before=Konversi
convertVault.convert.convertBtn.processing=Mengonversi…
convertVault.success.message=Konversi berhasil
convertVault.hubToPassword.success.description=Anda sekarang dapat membuka kunci vault dengan kata sandi yang dipilih tanpa memerlukan akses Hub.
# New Password # New Password
newPassword.promptText=Masukkan kata sandi baru newPassword.promptText=Masukkan kata sandi baru
@@ -375,10 +515,43 @@ passwordStrength.messageLabel.3=Kuat
passwordStrength.messageLabel.4=Sangat kuat passwordStrength.messageLabel.4=Sangat kuat
# Quit # Quit
quit.title=Hentikan Aplikasi
quit.message=Ada vault yang tidak dikunci
quit.description=Beri konfirmasi bila Anda ingin berhenti. Cryptomator akan mengunci semua vault yang terbuka agar mencegah kehilangan data.
quit.lockAndQuitBtn=Kunci dan Keluar quit.lockAndQuitBtn=Kunci dan Keluar
# Forced Quit # Forced Quit
quit.forced.message=Beberapa vault tidak bisa dikunci
quit.forced.description=Penguncian vault diblokir oleh operasi yang tertunda atau file yang terbuka. Anda bisa memaksa mengunci brankas yang tersisa, namun mengganggu I/O dapat mengakibatkan hilangnya data yang belum disimpan.
quit.forced.forceAndQuitBtn=Paksa dan Berhenti
# Update Reminder # Update Reminder
updateReminder.title=Periksa Pembaruan
updateReminder.message=Periksa Pembaruan?
updateReminder.description=Tetap perbarui dengan fitur baru, perbaikan bug, dan peningkatan keamanan. Kami sarankan untuk memeriksa pembaruan secara otomatis.
updateReminder.notNow=Jangan Sekarang
updateReminder.yesOnce=Ya, Sekali
updateReminder.yesAutomatically=Ya, Secara Otomatis
#Dokany Support End
dokanySupportEnd.preferencesBtn=Buka Preferensi
# Share Vault # Share Vault
shareVault.title=Bagikan Vault
shareVault.message=Apakah Anda ingin berbagi vault dengan orang lain?
shareVault.description=Selalu berhati-hati saat berbagi vault dengan orang lain. Singkatnya, ikuti langkah-langkah ini:
shareVault.instruction.1=1. Bagikan akses folder vault terenkripsi melalui penyimpanan cloud.
shareVault.instruction.2=2. Bagikan kata sandi vault dengan cara yang aman.
shareVault.remarkBestPractices=Untuk informasi lebih lanjut, lihat saran praktik terbaik di dokumentasi kami.
shareVault.docsTooltip=Buka dokumentasi untuk mempelajari lebih lanjut tentang berbagi vault.
shareVault.hubAd.description=Cara aman untuk bekerja dalam tim
shareVault.hubAd.keyManagement=• Manajemen kunci tanpa pengetahuan
shareVault.hubAd.authentication=• Otentikasi yang kuat
shareVault.hubAd.encryption=• Enkripsi end-to-end
shareVault.visitHub=Kunjungi Cryptomator Hub
shareVault.hub.message=Cara berbagi Hub vault
shareVault.hub.description=Untuk berbagi isi vault dengan anggota tim lain, Anda harus melakukan dua langkah:
shareVault.hub.instruction.1=1. Bagikan akses folder vault terenkripsi melalui penyimpanan cloud.
shareVault.hub.instruction.2=2. Berikan akses ke anggota tim di Cryptomator Hub.
shareVault.hub.openHub=Buka Cryptomator Hub
+51 -5
View File
@@ -47,6 +47,7 @@ addvaultwizard.new.nameInstruction=Scegli un nome per la cassaforte
addvaultwizard.new.namePrompt=Nome della Cassaforte addvaultwizard.new.namePrompt=Nome della Cassaforte
### Location ### Location
addvaultwizard.new.locationInstruction=Dove dovrebbe memorizzare Cryptomator i file crittografati della tua cassaforte? addvaultwizard.new.locationInstruction=Dove dovrebbe memorizzare Cryptomator i file crittografati della tua cassaforte?
addvaultwizard.new.locationLoading=Controllo del filesystem locale per le cartelle predefinite di archiviazione cloud…
addvaultwizard.new.locationLabel=Posizione archivio addvaultwizard.new.locationLabel=Posizione archivio
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Posizione personalizzata addvaultwizard.new.directoryPickerLabel=Posizione personalizzata
@@ -88,7 +89,7 @@ addvault.new.readme.storageLocation.10=Se hai bisogno di aiuto, leggi la documen
addvault.new.readme.accessLocation.fileName=BENVENUTO.rtf addvault.new.readme.accessLocation.fileName=BENVENUTO.rtf
addvault.new.readme.accessLocation.1=🔐 VOLUME CRITTOGRAFATO 🔐 addvault.new.readme.accessLocation.1=🔐 VOLUME CRITTOGRAFATO 🔐
addvault.new.readme.accessLocation.2=Questa è la posizione d'accesso della tua cassaforte. addvault.new.readme.accessLocation.2=Questa è la posizione d'accesso della tua cassaforte.
addvault.new.readme.accessLocation.3=Ogni file aggiunto a questo volume sarà crittografato da Cryptomator. Puoi lavorarci come su ogni altra unità/cartella. Questa è solo una vista decrittografata del suo contenuto, i tuoi file restano sempre crittografati sul tuo disco rigido. addvault.new.readme.accessLocation.3=Ogni file aggiunto a questo volume sarà crittografato da Cryptomator. Puoi lavorarci come su ogni altro disco/cartella. Questa è solo una vista decrittografata del suo contenuto, i tuoi file restano sempre crittografati sul tuo disco rigido.
addvault.new.readme.accessLocation.4=Sentiti libero di rimuovere questo file. addvault.new.readme.accessLocation.4=Sentiti libero di rimuovere questo file.
## Existing ## Existing
addvaultwizard.existing.title=Aggiungi una Cassaforte Esistente addvaultwizard.existing.title=Aggiungi una Cassaforte Esistente
@@ -131,7 +132,7 @@ unlock.chooseMasterkey.filePickerMimeDesc=Chiave principale di Cryptomator
unlock.success.message=Sbloccato con successo unlock.success.message=Sbloccato con successo
unlock.success.description="%s" sbloccato correttamente! La tua cassaforte è ora accessibile tramite la sua unità virtuale. unlock.success.description="%s" sbloccato correttamente! La tua cassaforte è ora accessibile tramite la sua unità virtuale.
unlock.success.rememberChoice=Ricorda la scelta, non mostrarmelo più unlock.success.rememberChoice=Ricorda la scelta, non mostrarmelo più
unlock.success.revealBtn=Rivela l'Unità unlock.success.revealBtn=Rivela Unità
## Failure ## Failure
unlock.error.customPath.message=Impossibile montare la cassaforte sul percorso personalizzato unlock.error.customPath.message=Impossibile montare la cassaforte sul percorso personalizzato
unlock.error.customPath.description.notSupported=Se desideri continuare a utilizzare il percorso personalizzato, vai alle preferenze e seleziona un tipo di volume che lo supporta. Altrimenti, vai alle opzioni della cassaforte e scegli un punto di montaggio supportato. unlock.error.customPath.description.notSupported=Se desideri continuare a utilizzare il percorso personalizzato, vai alle preferenze e seleziona un tipo di volume che lo supporta. Altrimenti, vai alle opzioni della cassaforte e scegli un punto di montaggio supportato.
@@ -141,6 +142,8 @@ unlock.error.customPath.description.hideawayNotDir=Impossibile rimuovere il file
unlock.error.customPath.description.couldNotBeCleaned=La tua cassaforte non può essere montata sul percorso "%s". Riprova o scegli un percorso diverso. unlock.error.customPath.description.couldNotBeCleaned=La tua cassaforte non può essere montata sul percorso "%s". Riprova o scegli un percorso diverso.
unlock.error.customPath.description.notEmptyDir=Il percorso di montaggio selezionato "%s" non è una cartella vuota. Scegli una cartella vuota e riprova. unlock.error.customPath.description.notEmptyDir=Il percorso di montaggio selezionato "%s" non è una cartella vuota. Scegli una cartella vuota e riprova.
unlock.error.customPath.description.generic=Hai selezionato un percorso di montaggio personalizzato per questa cassaforte, ma il suo utilizzo non è riuscito con il messaggio: %2$s unlock.error.customPath.description.generic=Hai selezionato un percorso di montaggio personalizzato per questa cassaforte, ma il suo utilizzo non è riuscito con il messaggio: %2$s
unlock.error.restartRequired.message=Impossibile sbloccare la cassaforte
unlock.error.restartRequired.description=Cambia il tipo di unità nelle opzioni della cassaforte o riavvia Cryptomator.
unlock.error.title=Sblocco "%s" non riuscito unlock.error.title=Sblocco "%s" non riuscito
## Hub ## Hub
hub.noKeychain.message=Impossibile accedere alla chiave del dispositivo hub.noKeychain.message=Impossibile accedere alla chiave del dispositivo
@@ -155,13 +158,22 @@ hub.receive.message=Elaborazione della risposta…
hub.receive.description=Cryptomator sta ricevendo ed elaborando la risposta da Hub. Attendere prego. hub.receive.description=Cryptomator sta ricevendo ed elaborando la risposta da Hub. Attendere prego.
### Register Device ### Register Device
hub.register.message=Nuovo dispositivo hub.register.message=Nuovo dispositivo
hub.register.description=Questo è il primo accesso all'Hub da questo dispositivo. Per favore autorizzalo utilizzando la tua chiave dell'account.
hub.register.nameLabel=Nome Del Dispositivo hub.register.nameLabel=Nome Del Dispositivo
hub.register.invalidAccountKeyLabel=Chiave dell'account non valida hub.register.invalidAccountKeyLabel=Chiave dell'account non valida
hub.register.registerBtn=Registrati hub.register.registerBtn=Registrati
### Register Device Legacy ### Register Device Legacy
hub.register.legacy.occupiedMsg=Nome già in uso
hub.register.legacy.description=Questo è il primo accesso all'Hub da questo dispositivo. Per favore autorizzalo utilizzando la tua chiave dell'account.
### Registration Success ### Registration Success
hub.registerSuccess.message=Dispositivo autorizzato
hub.registerSuccess.description=Il tuo dispositivo è stato autorizzato correttamente. Ora puoi continuare a sbloccare la cassaforte.
hub.registerSuccess.unlockBtn=Sblocca hub.registerSuccess.unlockBtn=Sblocca
hub.registerSuccess.legacy.description=Per accedere alla cassaforte, il tuo dispositivo deve essere anche autorizzato dal proprietario.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Registrazione dispositivo fallita
hub.registerFailed.description.generic=Si è verificato un errore nel processo di registrazione. Per maggiori dettagli, consulta il registro delle applicazioni.
hub.registerFailed.description.deviceAlreadyExists=Questo dispositivo è già registrato per un utente diverso. Prova a cambiare l'account utente o usa un altro dispositivo.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Accesso negato hub.unauthorized.message=Accesso negato
hub.unauthorized.description=Il tuo dispositivo non è ancora stato autorizzato ad accedere a questa cassaforte. Chiedi al proprietario della cassaforte di autorizzarlo. hub.unauthorized.description=Il tuo dispositivo non è ancora stato autorizzato ad accedere a questa cassaforte. Chiedi al proprietario della cassaforte di autorizzarlo.
@@ -308,6 +320,14 @@ preferences.updates.currentVersion=Versione Corrente: %s
preferences.updates.autoUpdateCheck=Cerca automaticamente gli aggiornamenti preferences.updates.autoUpdateCheck=Cerca automaticamente gli aggiornamenti
preferences.updates.checkNowBtn=Controlla Ora preferences.updates.checkNowBtn=Controlla Ora
preferences.updates.updateAvailable=Aggiornamento alla versione %s disponibile. preferences.updates.updateAvailable=Aggiornamento alla versione %s disponibile.
preferences.updates.lastUpdateCheck=Ultimo controllo: %s
preferences.updates.lastUpdateCheck.never=mai
preferences.updates.lastUpdateCheck.recently=recentemente
preferences.updates.lastUpdateCheck.daysAgo=%s giorni fa
preferences.updates.lastUpdateCheck.hoursAgo=%s ore fa
preferences.updates.checkFailed=Ricerca aggiornamenti non riuscita. Controlla la tua connessione internet o riprova più tardi.
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
@@ -380,6 +400,7 @@ main.vaultDetail.unlockBtn=Sblocca…
main.vaultDetail.unlockNowBtn=Sblocca Ora main.vaultDetail.unlockNowBtn=Sblocca Ora
main.vaultDetail.optionsBtn=Opzioni della Cassaforte main.vaultDetail.optionsBtn=Opzioni della Cassaforte
main.vaultDetail.passwordSavedInKeychain=Password salvata main.vaultDetail.passwordSavedInKeychain=Password salvata
main.vaultDetail.share=Condividi…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=SBLOCCATA main.vaultDetail.unlockedStatus=SBLOCCATA
main.vaultDetail.accessLocation=I contenuti della tua cassaforte sono accessibili qui: main.vaultDetail.accessLocation=I contenuti della tua cassaforte sono accessibili qui:
@@ -399,7 +420,7 @@ main.vaultDetail.filePickerTitle=Seleziona File Nella Cassaforte
### Missing ### Missing
main.vaultDetail.missing.info=Cryptomator non è riuscito a trovare una cassaforte in questo percorso. main.vaultDetail.missing.info=Cryptomator non è riuscito a trovare una cassaforte in questo percorso.
main.vaultDetail.missing.recheck=Ricontrolla main.vaultDetail.missing.recheck=Ricontrolla
main.vaultDetail.missing.remove=Rimuovi dall'Elenco di Cassaforti… main.vaultDetail.missing.remove=Rimuovi dall'elenco delle casseforti…
main.vaultDetail.missing.changeLocation=Cambia la Posizione della Cassaforte… main.vaultDetail.missing.changeLocation=Cambia la Posizione della Cassaforte…
### Needs Migration ### Needs Migration
main.vaultDetail.migrateButton=Aggiorna la Cassaforte main.vaultDetail.migrateButton=Aggiorna la Cassaforte
@@ -445,8 +466,9 @@ vaultOptions.mount.mountPoint.custom=Usa la directory scelta
vaultOptions.mount.mountPoint.directoryPickerButton=Scegli… vaultOptions.mount.mountPoint.directoryPickerButton=Scegli…
vaultOptions.mount.mountPoint.directoryPickerTitle=Scegli una directory vaultOptions.mount.mountPoint.directoryPickerTitle=Scegli una directory
vaultOptions.mount.volumeType.default=Predefinito (%s) vaultOptions.mount.volumeType.default=Predefinito (%s)
vaultOptions.mount.volumeType.restartRequired=Per utilizzare questo tipo di volume, Cryptomator deve essere riavviato.
vaultOptions.mount.volume.tcp.port=Porta TCP vaultOptions.mount.volume.tcp.port=Porta TCP
vaultOptions.mount.volume.type=Tipo di Unità vaultOptions.mount.volume.type=Tipo di Volume
## Master Key ## Master Key
vaultOptions.masterkey=Password vaultOptions.masterkey=Password
vaultOptions.masterkey.changePasswordBtn=Modifica password vaultOptions.masterkey.changePasswordBtn=Modifica password
@@ -465,7 +487,7 @@ recoveryKey.display.title=Mostra Chiave Di Recupero
recoveryKey.create.message=Password richiesta recoveryKey.create.message=Password richiesta
recoveryKey.create.description=Inserisci la password per visualizzare la chiave di recupero per "%s": recoveryKey.create.description=Inserisci la password per visualizzare la chiave di recupero per "%s":
recoveryKey.display.description=La seguente chiave di recupero può essere utilizzata per ripristinare l'accesso a %s": recoveryKey.display.description=La seguente chiave di recupero può essere utilizzata per ripristinare l'accesso a %s":
recoveryKey.display.StorageHints=Mantienilo da qualche parte molto sicuro, ad es.\n • Archivialo usando un gestore di password\n • Salvarlo su un'unità flash USB\n • Stamparlo su carta recoveryKey.display.StorageHints=Conservala da qualche parte in modo sicuro, es.\n • Archiviarla usando un gestore di password\n • Salvarla su un'unità flash USB\n • Stamparla su carta
## Reset Password ## Reset Password
### Enter Recovery Key ### Enter Recovery Key
recoveryKey.recover.title=Reimposta Password recoveryKey.recover.title=Reimposta Password
@@ -518,4 +540,28 @@ updateReminder.notNow=Non adesso
updateReminder.yesOnce=Sì, una volta updateReminder.yesOnce=Sì, una volta
updateReminder.yesAutomatically=Sì, automaticamente updateReminder.yesAutomatically=Sì, automaticamente
#Dokany Support End
dokanySupportEnd.title=Avviso di obsolescenza
dokanySupportEnd.message=Supporto terminato per Dokany
dokanySupportEnd.description=Il tipo di volume Dokany non è più supportato da Cryptomator. Le impostazioni sono state aggiornate per utilizzare il tipo di volume ora predefinito. È possibile visualizzare il tipo predefinito nelle preferenze.
dokanySupportEnd.preferencesBtn=Apri Preferenze
# Share Vault # Share Vault
shareVault.title=Condividi cassaforte
shareVault.message=Vuoi condividere la tua cassaforte con altri?
shareVault.description=Fai sempre attenzione quando condividi la tua cassaforte con altre persone. In breve, segui questi passaggi:
shareVault.instruction.1=1. Condividi l'accesso alla cartella della cassaforte crittografata tramite l'archiviazione cloud.
shareVault.instruction.2=2. Condividi la password della cassaforte in modo sicuro.
shareVault.remarkBestPractices=Per ulteriori informazioni, dai un'occhiata ai documenti con i consigli sulle le migliori pratiche.
shareVault.docsTooltip=Apri la documentazione per saperne di più circa la condivisione delle casseforti.
shareVault.hubAd.description=Il modo sicuro di lavorare in gruppi
shareVault.hubAd.keyManagement=Gestione delle chiavi a Conoscenza-Zero
shareVault.hubAd.authentication=• Autenticazione forte
shareVault.hubAd.encryption=• Crittografia end-to-end
shareVault.visitHub=Visita Hub Cryptomator
shareVault.hub.message=Come condividere una cassaforte Hub
shareVault.hub.description=Per condividere il contenuto della cassaforte con un altro membro del gruppo, è necessario eseguire due passaggi:
shareVault.hub.instruction.1=1. Condividi l'accesso alla cartella della cassaforte crittografata tramite l'archiviazione cloud.
shareVault.hub.instruction.2=2. Concedi l'accesso ai membri del gruppo nell'Hub Cryptomator.
shareVault.hub.openHub=Apri l'Hub Cryptomator
@@ -47,6 +47,7 @@ addvaultwizard.new.nameInstruction=金庫の名前を入力してください
addvaultwizard.new.namePrompt=金庫の名前 addvaultwizard.new.namePrompt=金庫の名前
### Location ### Location
addvaultwizard.new.locationInstruction=金庫の暗号化済みファイルをどの場所に保存しますか? addvaultwizard.new.locationInstruction=金庫の暗号化済みファイルをどの場所に保存しますか?
addvaultwizard.new.locationLoading=デフォルトのクラウド・ストレージ・ディレクトリについてローカル・ファイルシステムをチェックする...
addvaultwizard.new.locationLabel=保存場所 addvaultwizard.new.locationLabel=保存場所
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=ユーザー設定 addvaultwizard.new.directoryPickerLabel=ユーザー設定
@@ -143,6 +144,7 @@ unlock.error.customPath.description.notEmptyDir=カスタムマウントパス
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を再起動してください。
unlock.error.title=ロック解除 "%s" に失敗しました。
## Hub ## Hub
hub.noKeychain.message=デバイス キーにアクセスできません hub.noKeychain.message=デバイス キーにアクセスできません
hub.noKeychain.description=ハブ金庫を解錠するには、キーチェーンが保護するデバイス キーが必要です。続行するには、"%s" を有効にし環境設定からキーチェーンを選択します。 hub.noKeychain.description=ハブ金庫を解錠するには、キーチェーンが保護するデバイス キーが必要です。続行するには、"%s" を有効にし環境設定からキーチェーンを選択します。
@@ -158,6 +160,7 @@ hub.receive.description=Cryptomator が Hub からの応答を受信、処理中
hub.register.message=新しいデバイス hub.register.message=新しいデバイス
hub.register.description=このデバイスからの最初のハブアクセスです。アカウントキーを使用して登録してください。 hub.register.description=このデバイスからの最初のハブアクセスです。アカウントキーを使用して登録してください。
hub.register.nameLabel=デバイス名 hub.register.nameLabel=デバイス名
hub.register.invalidAccountKeyLabel=無効なアカウントキー
hub.register.registerBtn=登録 hub.register.registerBtn=登録
### Register Device Legacy ### Register Device Legacy
hub.register.legacy.occupiedMsg=この名前は既に使われています hub.register.legacy.occupiedMsg=この名前は既に使われています
@@ -300,9 +303,11 @@ preferences.interface.showMinimizeButton=最小化ボタンを表示
preferences.interface.showTrayIcon=トレイアイコンを表示 (再起動が必要) preferences.interface.showTrayIcon=トレイアイコンを表示 (再起動が必要)
## Volume ## Volume
preferences.volume=仮想ドライブ preferences.volume=仮想ドライブ
preferences.volume.type=デフォルトのボリュームタイプ
preferences.volume.type.automatic=自動 preferences.volume.type.automatic=自動
preferences.volume.docsTooltip=異なるボリュームタイプの詳細については、ドキュメントを確認してください。 preferences.volume.docsTooltip=異なるボリュームタイプの詳細については、ドキュメントを確認してください。
preferences.volume.fuseRestartRequired=変更を適用するには、Cryptomator を再起動する必要があります。 preferences.volume.fuseRestartRequired=変更を適用するには、Cryptomator を再起動する必要があります。
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.mountToDir=カスタム ディレクトリをマウント先に指定
@@ -315,6 +320,14 @@ 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=支援する
preferences.contribute.registeredFor=サポート証明書 (%s) が登録されました preferences.contribute.registeredFor=サポート証明書 (%s) が登録されました
@@ -387,6 +400,7 @@ 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=金庫の内容はこちらからアクセスできます:
@@ -441,6 +455,7 @@ 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=使用中
@@ -450,6 +465,10 @@ 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.volumeType.default=既定値 (%s)
vaultOptions.mount.volumeType.restartRequired=このボリュームタイプを使用するには、Cryptomatorを再起動する必要があります。
vaultOptions.mount.volume.tcp.port=TCPポート
vaultOptions.mount.volume.type=ボリュームタイプ
## Master Key ## Master Key
vaultOptions.masterkey=パスワード vaultOptions.masterkey=パスワード
vaultOptions.masterkey.changePasswordBtn=パスワードの変更 vaultOptions.masterkey.changePasswordBtn=パスワードの変更
@@ -521,4 +540,25 @@ updateReminder.notNow=また後で
updateReminder.yesOnce=はい、一度だけ updateReminder.yesOnce=はい、一度だけ
updateReminder.yesAutomatically=自動的に行う updateReminder.yesAutomatically=自動的に行う
#Dokany Support End
dokanySupportEnd.preferencesBtn=環境設定を開く
# Share Vault # Share Vault
shareVault.title=保管庫を共有する
shareVault.message=保管庫を他の人と共有しますか?
shareVault.description=あなたの保管庫を他の人と共有するときは、常に注意してください。要するに、以下の手順に従ってください:
shareVault.instruction.1=1. クラウドストレージ経由で暗号化された保管庫フォルダへのアクセスを共有します。
shareVault.instruction.2=2. 保管庫のパスワードを安全な方法で共有する。
shareVault.remarkBestPractices=詳しくは、ドキュメントにあるベストプラクティスの提案をご覧ください。
shareVault.docsTooltip=保管庫の共有についての詳細は、ドキュメントをご覧ください。
shareVault.hubAd.description=チームワークの安全な方法
shareVault.hubAd.keyManagement=• ゼロ知識キー管理
shareVault.hubAd.authentication=• 強固な認証
shareVault.hubAd.encryption=• エンドツーエンドの暗号化
shareVault.visitHub=Cryptomator Hubを訪問
shareVault.hub.message=ハブ保管庫の共有方法
shareVault.hub.description=データ保管庫のコンテンツを他のチームメンバーと共有するには、2つの手順を実行する必要があります:
shareVault.hub.instruction.1=1. クラウドストレージ経由で暗号化された保管庫フォルダへのアクセスを共有します。
shareVault.hub.instruction.2=2. Cryptomator Hubでチームメンバーにアクセスを許可する。
shareVault.hub.openHub=Cryptomator Hubを開く
@@ -254,6 +254,7 @@ preferences.updates.currentVersion=현재 버전: %s
preferences.updates.autoUpdateCheck=자동으로 업데이트 확인 preferences.updates.autoUpdateCheck=자동으로 업데이트 확인
preferences.updates.checkNowBtn=지금 확인 preferences.updates.checkNowBtn=지금 확인
preferences.updates.updateAvailable=버전 %s의 업데이트가 가능합니다. preferences.updates.updateAvailable=버전 %s의 업데이트가 가능합니다.
## Contribution ## Contribution
preferences.contribute=후원하기 preferences.contribute=후원하기
preferences.contribute.registeredFor=%s (으)로 후원자 인증 등록됨 preferences.contribute.registeredFor=%s (으)로 후원자 인증 등록됨
@@ -444,4 +445,7 @@ quit.forced.forceAndQuitBtn=Vault 강제 잠금 후 종료하기
updateReminder.title=업데이트 확인 updateReminder.title=업데이트 확인
updateReminder.notNow=나중에 updateReminder.notNow=나중에
#Dokany Support End
dokanySupportEnd.preferencesBtn=설정 열기
# Share Vault # Share Vault
@@ -167,6 +167,7 @@ preferences.updates.currentVersion=Pašreizējā versija: %s
preferences.updates.autoUpdateCheck=Automātiski pārbaudīt atjauninājumus preferences.updates.autoUpdateCheck=Automātiski pārbaudīt atjauninājumus
preferences.updates.checkNowBtn=Pārbaudīt tagad preferences.updates.checkNowBtn=Pārbaudīt tagad
preferences.updates.updateAvailable=Pieejams atjauninājums uz versiju %s. preferences.updates.updateAvailable=Pieejams atjauninājums uz versiju %s.
## Contribution ## Contribution
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -279,4 +280,6 @@ quit.lockAndQuitBtn=Aizslēgt un aizvērt
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault # Share Vault
@@ -106,6 +106,7 @@ preferences.title=Поставки
## Interface ## Interface
## Volume ## Volume
## Updates ## Updates
## Contribution ## Contribution
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -160,4 +161,6 @@ vaultOptions.mount.mountPoint.directoryPickerButton=Избор…
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault # Share Vault
@@ -64,6 +64,7 @@
## Interface ## Interface
## Volume ## Volume
## Updates ## Updates
## Contribution ## Contribution
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -112,4 +113,6 @@
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault # Share Vault
@@ -47,6 +47,7 @@ addvaultwizard.new.nameInstruction=Navngi hvelvet
addvaultwizard.new.namePrompt=Navn på hvelvet addvaultwizard.new.namePrompt=Navn på hvelvet
### Location ### Location
addvaultwizard.new.locationInstruction=Hvor skal Cryptomator lagre de krypterte filene dine? addvaultwizard.new.locationInstruction=Hvor skal Cryptomator lagre de krypterte filene dine?
addvaultwizard.new.locationLoading=Sjekker lokalt filsystem for standard skylagringskatalog…
addvaultwizard.new.locationLabel=Lagringssted addvaultwizard.new.locationLabel=Lagringssted
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Tilpasset lagringssted addvaultwizard.new.directoryPickerLabel=Tilpasset lagringssted
@@ -141,6 +142,8 @@ unlock.error.customPath.description.hideawayNotDir=Den midlertidige, skjulte fil
unlock.error.customPath.description.couldNotBeCleaned=Hvelvet ditt kan ikke monteres i banen "%s". Prøv igjen eller velg en annen sti. unlock.error.customPath.description.couldNotBeCleaned=Hvelvet ditt kan ikke monteres i banen "%s". Prøv igjen eller velg en annen sti.
unlock.error.customPath.description.notEmptyDir=Tilpasset monterings sti "%s" er ikke en tom mappe. Velg en tom mappe og prøv igjen. unlock.error.customPath.description.notEmptyDir=Tilpasset monterings sti "%s" er ikke en tom mappe. Velg en tom mappe og prøv igjen.
unlock.error.customPath.description.generic=Du har valgt en egendefinert monterings sti for dette hvelvet, men bruk av den mislyktes med meldingen: %2$s unlock.error.customPath.description.generic=Du har valgt en egendefinert monterings sti for dette hvelvet, men bruk av den mislyktes med meldingen: %2$s
unlock.error.restartRequired.message=Kan ikke låse opp hvelvet
unlock.error.restartRequired.description=Endre volumtype i innstillinger for hvelvet eller start Cryptomator på nytt.
unlock.error.title=Lås opp "%s" mislyktes unlock.error.title=Lås opp "%s" mislyktes
## Hub ## Hub
hub.noKeychain.message=Får ikke tilgang til enhetsnøkkel hub.noKeychain.message=Får ikke tilgang til enhetsnøkkel
@@ -155,13 +158,22 @@ hub.receive.message=Prosesserer svar…
hub.receive.description=Cryptomator mottar og behandler svaret fra Hub. Vennligst vent. hub.receive.description=Cryptomator mottar og behandler svaret fra Hub. Vennligst vent.
### Register Device ### Register Device
hub.register.message=Ny Enhet hub.register.message=Ny Enhet
hub.register.description=Dette er første hub tilgang fra denne enheten. Vennligst registrert dette med din kontonøkkel.
hub.register.nameLabel=Enhetsnavn hub.register.nameLabel=Enhetsnavn
hub.register.invalidAccountKeyLabel=Ugyldig kontonøkkel hub.register.invalidAccountKeyLabel=Ugyldig kontonøkkel
hub.register.registerBtn=Registrer hub.register.registerBtn=Registrer
### Register Device Legacy ### Register Device Legacy
hub.register.legacy.occupiedMsg=Navnet er allerede i bruk
hub.register.legacy.description=Dette er første gang Hub blir benyttet fra denne enheten. Vennligst registrer den.
### Registration Success ### Registration Success
hub.registerSuccess.message=Enhet registrert
hub.registerSuccess.description=Enheten din er registrert. Du kan nå fortsette å låse opp hvelvet.
hub.registerSuccess.unlockBtn=Lås opp hub.registerSuccess.unlockBtn=Lås opp
hub.registerSuccess.legacy.description=For å få tilgangen til hvelvet, må enheten din i tillegg godkjennes av hvelv eier.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Enhetsregistrering mislyktes
hub.registerFailed.description.generic=En feil ble gjort under registreringsprossen. For mer detaljer, se i applikasjonsloggen.
hub.registerFailed.description.deviceAlreadyExists=Denne enheten er allerede registrert for en annen bruker. Prøv å endre brukerkontoen eller bruk en annen enhet.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Ingen tilgang hub.unauthorized.message=Ingen tilgang
hub.unauthorized.description=Enheten din har ikke blitt autorisert til å få tilgang til dette hvelvet ennå. Spør hvelveieren om å tillate det. hub.unauthorized.description=Enheten din har ikke blitt autorisert til å få tilgang til dette hvelvet ennå. Spør hvelveieren om å tillate det.
@@ -308,6 +320,14 @@ preferences.updates.currentVersion=Gjeldende versjon: %s
preferences.updates.autoUpdateCheck=Se automatisk etter oppdateringer preferences.updates.autoUpdateCheck=Se automatisk etter oppdateringer
preferences.updates.checkNowBtn=Sjekk nå preferences.updates.checkNowBtn=Sjekk nå
preferences.updates.updateAvailable=Oppdatering til versjon %s er tilgjengelig. preferences.updates.updateAvailable=Oppdatering til versjon %s er tilgjengelig.
preferences.updates.lastUpdateCheck=Siste sjekk: %s
preferences.updates.lastUpdateCheck.never=aldri
preferences.updates.lastUpdateCheck.recently=nylig
preferences.updates.lastUpdateCheck.daysAgo=%s dager siden
preferences.updates.lastUpdateCheck.hoursAgo=%s timer siden
preferences.updates.checkFailed=Kunne ikke lete etter oppdateringer. Sjekk internett tilkoblingen din og prøv igjen senere.
preferences.updates.upToDate=Cryptomator er oppdatert.
## Contribution ## Contribution
preferences.contribute=Støtt oss preferences.contribute=Støtt oss
preferences.contribute.registeredFor=Supporter sertifikat registrert for %s preferences.contribute.registeredFor=Supporter sertifikat registrert for %s
@@ -380,6 +400,7 @@ main.vaultDetail.unlockBtn=Lås opp…
main.vaultDetail.unlockNowBtn=Lås opp nå main.vaultDetail.unlockNowBtn=Lås opp nå
main.vaultDetail.optionsBtn=Alternativer for hvelvet main.vaultDetail.optionsBtn=Alternativer for hvelvet
main.vaultDetail.passwordSavedInKeychain=Passordet er lagret main.vaultDetail.passwordSavedInKeychain=Passordet er lagret
main.vaultDetail.share=Del…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=ULÅST main.vaultDetail.unlockedStatus=ULÅST
main.vaultDetail.accessLocation=Innholdet i hvelvet ditt er tilgjengelig her: main.vaultDetail.accessLocation=Innholdet i hvelvet ditt er tilgjengelig her:
@@ -445,6 +466,7 @@ vaultOptions.mount.mountPoint.custom=Bruk valgt mappe
vaultOptions.mount.mountPoint.directoryPickerButton=Velg… vaultOptions.mount.mountPoint.directoryPickerButton=Velg…
vaultOptions.mount.mountPoint.directoryPickerTitle=Velg en mappe vaultOptions.mount.mountPoint.directoryPickerTitle=Velg en mappe
vaultOptions.mount.volumeType.default=Standard (%s) vaultOptions.mount.volumeType.default=Standard (%s)
vaultOptions.mount.volumeType.restartRequired=For å bruke denne volumtypen, må Cryptomator startes på nytt.
vaultOptions.mount.volume.tcp.port=TCP Port vaultOptions.mount.volume.tcp.port=TCP Port
vaultOptions.mount.volume.type=Volumtype vaultOptions.mount.volume.type=Volumtype
## Master Key ## Master Key
@@ -518,4 +540,22 @@ updateReminder.notNow=Ikke nå
updateReminder.yesOnce=Ja, en gang updateReminder.yesOnce=Ja, en gang
updateReminder.yesAutomatically=Ja, automatisk updateReminder.yesAutomatically=Ja, automatisk
#Dokany Support End
dokanySupportEnd.title=Avskrivingsvarsel
dokanySupportEnd.message=Støtte for Dokany er avsluttet
dokanySupportEnd.description=Volumtypen Dokany støttes ikke lenger av Cryptomator. Innstillingene dine er justert for å bruke standard volumtype nå. Du kan se standardtypen i innstillingene.
dokanySupportEnd.preferencesBtn=Åpne innstillinger
# Share Vault # Share Vault
shareVault.title=Del hvelv
shareVault.message=Vil du dele hvelvet ditt med andre?
shareVault.hubAd.description=Den sikre måten å jobbe i et lag på
shareVault.hubAd.authentication=• Sterk autentisering
shareVault.hubAd.encryption=• Ende-til-ende kryptering
shareVault.visitHub=Besøk Cryptomator hub
shareVault.hub.message=Hvordan dele et Hub-hvelv
shareVault.hub.description=For å dele hvelvets innhold med et annet lagmedlem må du utføre to trinn:
shareVault.hub.instruction.1=1. Del tilgang til den krypterte hvelvmappen via skylagring.
shareVault.hub.instruction.2=2. Gi tilgang til lagmedlem i Cryptomator Hub.
shareVault.hub.openHub=Åpne Cryptomator hub
@@ -320,6 +320,14 @@ preferences.updates.currentVersion=Huidige Versie: "%s"
preferences.updates.autoUpdateCheck=Automatisch controleren op updates preferences.updates.autoUpdateCheck=Automatisch controleren op updates
preferences.updates.checkNowBtn=Controleer nu preferences.updates.checkNowBtn=Controleer nu
preferences.updates.updateAvailable=Update naar versie "%s" beschikbaar. preferences.updates.updateAvailable=Update naar versie "%s" beschikbaar.
preferences.updates.lastUpdateCheck=Laatst gecontroleerd: %s
preferences.updates.lastUpdateCheck.never=nooit
preferences.updates.lastUpdateCheck.recently=recent
preferences.updates.lastUpdateCheck.daysAgo=%s dagen geleden
preferences.updates.lastUpdateCheck.hoursAgo=%s uur geleden
preferences.updates.checkFailed=Zoeken naar updates is mislukt. Controleer je internetverbinding of probeer het later opnieuw.
preferences.updates.upToDate=Cryptomator is up-to-date.
## Contribution ## Contribution
preferences.contribute=Steun ons preferences.contribute=Steun ons
preferences.contribute.registeredFor=Supporter certificaat geregistreerd voor %s preferences.contribute.registeredFor=Supporter certificaat geregistreerd voor %s
@@ -532,6 +540,12 @@ updateReminder.notNow=Niet nu
updateReminder.yesOnce=Ja, Eenmaal updateReminder.yesOnce=Ja, Eenmaal
updateReminder.yesAutomatically=Ja, automatisch updateReminder.yesAutomatically=Ja, automatisch
#Dokany Support End
dokanySupportEnd.title=Kennisgeving van beëindiging
dokanySupportEnd.message=Ondersteuning beëindigd voor Dokany
dokanySupportEnd.description=Het volumetype Dokany wordt niet langer ondersteund door Cryptomator. Uw instellingen zijn aangepast om nu het standaard volumetype te gebruiken. U kunt het standaardtype bekijken in de voorkeuren.
dokanySupportEnd.preferencesBtn=Open Voorkeuren
# Share Vault # Share Vault
shareVault.title=Kluis delen shareVault.title=Kluis delen
shareVault.message=Wilt u uw kluis met anderen delen? shareVault.message=Wilt u uw kluis met anderen delen?
@@ -159,6 +159,7 @@ preferences.updates.currentVersion=Gjeldande versjon: %s
preferences.updates.autoUpdateCheck=Sjå etter oppdateringar automatisk preferences.updates.autoUpdateCheck=Sjå etter oppdateringar automatisk
preferences.updates.checkNowBtn=Sjekk no preferences.updates.checkNowBtn=Sjekk no
preferences.updates.updateAvailable=Oppdatering til versjon %s er tilgjengeleg. preferences.updates.updateAvailable=Oppdatering til versjon %s er tilgjengeleg.
## Contribution ## Contribution
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -277,4 +278,6 @@ quit.lockAndQuitBtn=Lås og avslutt
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault # Share Vault
@@ -168,6 +168,7 @@ preferences.updates.currentVersion=ਮੌਜੂਦਾ ਵਰਜ਼ਨ: %s
preferences.updates.autoUpdateCheck=ਅੱਪਡੇਟ ਲਈ ਆਪਣੇ-ਆਪ ਜਾਂਚ ਕਰੋ preferences.updates.autoUpdateCheck=ਅੱਪਡੇਟ ਲਈ ਆਪਣੇ-ਆਪ ਜਾਂਚ ਕਰੋ
preferences.updates.checkNowBtn=ਹੁਣੇ ਜਾਂਚ ਕਰੋ preferences.updates.checkNowBtn=ਹੁਣੇ ਜਾਂਚ ਕਰੋ
preferences.updates.updateAvailable=ਉਪਲੱਬਧ %s ਵਰਜ਼ਨ ਲਈ ਅੱਪਡੇਟ ਕਰੋ। preferences.updates.updateAvailable=ਉਪਲੱਬਧ %s ਵਰਜ਼ਨ ਲਈ ਅੱਪਡੇਟ ਕਰੋ।
## Contribution ## Contribution
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -316,4 +317,6 @@ quit.lockAndQuitBtn=ਲਾਕ ਕਰੋ ਤੇ ਬਾਹਰ ਜਾਓ
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault # Share Vault
@@ -320,6 +320,12 @@ preferences.updates.currentVersion=Obecna wersja: %s
preferences.updates.autoUpdateCheck=Automatycznie sprawdzaj aktualizacje preferences.updates.autoUpdateCheck=Automatycznie sprawdzaj aktualizacje
preferences.updates.checkNowBtn=Sprawdź teraz preferences.updates.checkNowBtn=Sprawdź teraz
preferences.updates.updateAvailable=Dostępna jest aktualizacja do wersji %s. preferences.updates.updateAvailable=Dostępna jest aktualizacja do wersji %s.
preferences.updates.lastUpdateCheck=Ostatnio sprawdzano: %s
preferences.updates.lastUpdateCheck.never=nigdy
preferences.updates.lastUpdateCheck.recently=niedawno
preferences.updates.lastUpdateCheck.daysAgo=%s dni temu
preferences.updates.lastUpdateCheck.hoursAgo=%s godzin temu
## Contribution ## Contribution
preferences.contribute=Wesprzyj nas preferences.contribute=Wesprzyj nas
preferences.contribute.registeredFor=Certyfikat darczyńcy zarejestrowany dla %s preferences.contribute.registeredFor=Certyfikat darczyńcy zarejestrowany dla %s
@@ -532,6 +538,9 @@ updateReminder.notNow=Nie teraz
updateReminder.yesOnce=Tak, raz updateReminder.yesOnce=Tak, raz
updateReminder.yesAutomatically=Tak, automatycznie updateReminder.yesAutomatically=Tak, automatycznie
#Dokany Support End
dokanySupportEnd.preferencesBtn=Otwórz ustawienia
# Share Vault # Share Vault
shareVault.title=Udostępnij sejf shareVault.title=Udostępnij sejf
shareVault.message=Czy chcesz udostępnić swój sejf innym? shareVault.message=Czy chcesz udostępnić swój sejf innym?
+15 -1
View File
@@ -47,7 +47,7 @@ addvaultwizard.new.nameInstruction=Escolha um nome para o cofre
addvaultwizard.new.namePrompt=Nome do Cofre addvaultwizard.new.namePrompt=Nome do Cofre
### Location ### Location
addvaultwizard.new.locationInstruction=Onde deve o Cryptomator armazenar os arquivos criptografados do cofre? addvaultwizard.new.locationInstruction=Onde deve o Cryptomator armazenar os arquivos criptografados do cofre?
addvaultwizard.new.locationLoading=Verificando o sistema de arquivos por diretórios padrão de armazenamento na nuvem… addvaultwizard.new.locationLoading=Verificando o sistema de ficheiros local para directórios de armazenamento predefinidos na nuvem…
addvaultwizard.new.locationLabel=Local de armazenamento addvaultwizard.new.locationLabel=Local de armazenamento
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Outro Local addvaultwizard.new.directoryPickerLabel=Outro Local
@@ -320,6 +320,14 @@ preferences.updates.currentVersion=Versão atual: %s
preferences.updates.autoUpdateCheck=Verificar automaticamente por atualizações preferences.updates.autoUpdateCheck=Verificar automaticamente por atualizações
preferences.updates.checkNowBtn=Verificar Agora preferences.updates.checkNowBtn=Verificar Agora
preferences.updates.updateAvailable=Atualização para a versão %s disponível. preferences.updates.updateAvailable=Atualização para a versão %s disponível.
preferences.updates.lastUpdateCheck=Última verificação: %s
preferences.updates.lastUpdateCheck.never=nunca
preferences.updates.lastUpdateCheck.recently=recentemente
preferences.updates.lastUpdateCheck.daysAgo=%s dias atrás
preferences.updates.lastUpdateCheck.hoursAgo=%s horas atrás
preferences.updates.checkFailed=A procura de actualizações falhou. Verifique a sua ligação à Internet ou tente novamente mais tarde.
preferences.updates.upToDate=Cryptomator está atualizado.
## Contribution ## Contribution
preferences.contribute=Apoie-nos preferences.contribute=Apoie-nos
preferences.contribute.registeredFor=Certificado de apoiador registado para %s preferences.contribute.registeredFor=Certificado de apoiador registado para %s
@@ -532,6 +540,12 @@ updateReminder.notNow=Agora não
updateReminder.yesOnce=Sim, Uma Vez updateReminder.yesOnce=Sim, Uma Vez
updateReminder.yesAutomatically=Sim, Automaticamente updateReminder.yesAutomatically=Sim, Automaticamente
#Dokany Support End
dokanySupportEnd.title=Aviso de descontinuação
dokanySupportEnd.message=Suporte termina para o Dokany
dokanySupportEnd.description=O tipo de volume Dokany não é mais suportado pelo Cryptomator. As configurações serão ajustadas para usar o tipo de volume padrão por agora. Pode ver o tipo padrão nas preferências.
dokanySupportEnd.preferencesBtn=Abrir preferências
# Share Vault # Share Vault
shareVault.title=Partilhar cofre shareVault.title=Partilhar cofre
shareVault.message=Quer partilhar o seu cofre com outros? shareVault.message=Quer partilhar o seu cofre com outros?
@@ -320,6 +320,14 @@ preferences.updates.currentVersion=Versão atual: %s
preferences.updates.autoUpdateCheck=Buscar atualizações automaticamente preferences.updates.autoUpdateCheck=Buscar atualizações automaticamente
preferences.updates.checkNowBtn=Buscar Agora preferences.updates.checkNowBtn=Buscar Agora
preferences.updates.updateAvailable=Atualizar para versão %s disponível. preferences.updates.updateAvailable=Atualizar para versão %s disponível.
preferences.updates.lastUpdateCheck=Última verificação: %s
preferences.updates.lastUpdateCheck.never=nunca
preferences.updates.lastUpdateCheck.recently=recentemente
preferences.updates.lastUpdateCheck.daysAgo=%s dia atrás
preferences.updates.lastUpdateCheck.hoursAgo=%s horas atrás
preferences.updates.checkFailed=Procurando por atualizações falhou. Por favor, verifique sua conexão com a internet ou tente novamente mais tarde.
preferences.updates.upToDate=O Cryptomator está atualizado.
## Contribution ## Contribution
preferences.contribute=Nos Apoie preferences.contribute=Nos Apoie
preferences.contribute.registeredFor=Certificado de apoiador registrado para %s preferences.contribute.registeredFor=Certificado de apoiador registrado para %s
@@ -371,7 +379,7 @@ main.closeBtn.tooltip=Fechar
main.minimizeBtn.tooltip=Minimizar main.minimizeBtn.tooltip=Minimizar
main.preferencesBtn.tooltip=Preferências main.preferencesBtn.tooltip=Preferências
main.debugModeEnabled.tooltip=Modo de depuração ativado main.debugModeEnabled.tooltip=Modo de depuração ativado
main.supporterCertificateMissing.tooltip=Por favor doe main.supporterCertificateMissing.tooltip=Apoie-nos
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Clique aqui para adicionar um cofre main.vaultlist.emptyList.onboardingInstruction=Clique aqui para adicionar um cofre
main.vaultlist.contextMenu.remove=Remover… main.vaultlist.contextMenu.remove=Remover…
@@ -532,6 +540,12 @@ updateReminder.notNow=Agora Não
updateReminder.yesOnce=Sim, Uma Vez updateReminder.yesOnce=Sim, Uma Vez
updateReminder.yesAutomatically=Sim, Automaticamente updateReminder.yesAutomatically=Sim, Automaticamente
#Dokany Support End
dokanySupportEnd.title=Aviso de descontinuação
dokanySupportEnd.message=Fim do suporte para o Dokany
dokanySupportEnd.description=O volume do tipo Dokany não é mais suportado pelo Cryptomator. Suas configurações serão ajustadas para usar o tipo de volume padrão agora. Você pode ver o tipo padrão nas preferências.
dokanySupportEnd.preferencesBtn=Abrir Preferências
# Share Vault # Share Vault
shareVault.title=Compartilhar Cofre shareVault.title=Compartilhar Cofre
shareVault.message=Gostaria de compartilhar o seu cofre com outras pessoas? shareVault.message=Gostaria de compartilhar o seu cofre com outras pessoas?
@@ -303,6 +303,7 @@ 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ă.
## Contribution ## Contribution
preferences.contribute=Susțineți-ne preferences.contribute=Susțineți-ne
preferences.contribute.registeredFor=Certificat de suporter înregistrat pentru %s preferences.contribute.registeredFor=Certificat de suporter înregistrat pentru %s
@@ -509,4 +510,7 @@ updateReminder.notNow=Nu acum
updateReminder.yesOnce=Da, o dată updateReminder.yesOnce=Da, o dată
updateReminder.yesAutomatically=Da, automat updateReminder.yesAutomatically=Da, automat
#Dokany Support End
dokanySupportEnd.preferencesBtn=Deschideţi preferinţele
# Share Vault # Share Vault
@@ -320,6 +320,14 @@ 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=Поддержите нас
preferences.contribute.registeredFor=Сертификат мецената зарегистрирован на имя %s preferences.contribute.registeredFor=Сертификат мецената зарегистрирован на имя %s
@@ -532,6 +540,12 @@ updateReminder.notNow=Не сейчас
updateReminder.yesOnce=Да, один раз updateReminder.yesOnce=Да, один раз
updateReminder.yesAutomatically=Да, автоматически updateReminder.yesAutomatically=Да, автоматически
#Dokany Support End
dokanySupportEnd.title=Уведомление об устаревании
dokanySupportEnd.message=Заканчивается поддержка для Dokany
dokanySupportEnd.description=Cryptomator больше не поддерживает тома Dokany. Параметры будут изменены на использование типа томов по умолчанию. Тип по умолчанию см. в настройках.
dokanySupportEnd.preferencesBtn=Открыть настройки
# Share Vault # Share Vault
shareVault.title=Поделиться хранилищем shareVault.title=Поделиться хранилищем
shareVault.message=Хотите поделиться хранилищем с другими? shareVault.message=Хотите поделиться хранилищем с другими?
@@ -81,6 +81,7 @@ hub.registerSuccess.unlockBtn=අගුළුහරින්න
## Interface ## Interface
## Volume ## Volume
## Updates ## Updates
## Contribution ## Contribution
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
@@ -130,4 +131,6 @@ main.closeBtn.tooltip=වසන්න
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault # Share Vault

Some files were not shown because too many files have changed in this diff Show More