Compare commits

...
230 Commits
Author SHA1 Message Date
Armin Schrenk e4e757606d update dependencies for patch release
Fixes #3574 and #3499. Closes #3569
2024-11-05 11:11:32 +01:00
CryptobotandArmin Schrenk 6fcb796177 New Crowdin updates (#3559)
New translations strings.properties

Afrikaans; Arabic; Bashkir; Belarusian; Bengali; Bosnian; Bulgarian; Catalan; Chinese Simplified; Chinese Traditional; Chinese Traditional, Hong Kong; Croatian; Czech; Danish; Dutch; English; Filipino; Finnish; French; Galician; German; Greek; Hebrew; Hindi; Hungarian; Indonesian; Italian; Japanese; Korean; Latvian; Macedonian; Marathi; Norwegian; 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; Urdu (Pakistan); Uyghur; Vietnamese;

[ci skip]

(cherry picked from commit 0fb0bc8e1d)
2024-11-04 17:59:02 +01:00
CryptobotandArmin Schrenk 4d6b035c29 New Crowdin updates (#3553)
New translations strings.properties

Afrikaans; English; Norwegian; Thai; Uyghur;

[ci skip]

(cherry picked from commit 2939702842)
2024-11-04 17:57:43 +01:00
Armin Schrenk d6a020994e Merge branch 'hotfix/1.14.1' 2024-09-18 13:17:25 +02:00
Armin Schrenk 518f75be32 fixes #3538 2024-09-18 13:16:45 +02:00
Armin Schrenk 28c7dbad69 prepare 1.14.1 2024-09-18 13:16:16 +02:00
Armin Schrenk 68bf441fdd Merge branch 'release/1.14.0' 2024-09-17 10:03:02 +02:00
Armin Schrenk a606bcb81e finalize 1.14.0 2024-09-17 09:59:22 +02:00
Armin Schrenk fe93e51ffa Merge branch 'develop' into release/1.14.0 2024-09-17 09:51:23 +02:00
CryptobotandGitHub f2949aae63 New Crowdin updates (#3520)
New translations strings.properties

Chinese Simplified; Chinese Traditional; Filipino; German; Punjabi; Romanian; Russian; Slovenian; Turkish; Ukrainian; 

[ci skip]
2024-09-17 09:49:55 +02:00
Armin Schrenk 80e101456b adjust keychainManager to new API 2024-09-16 17:40:49 +02:00
Armin Schrenk 2f311c1dfe use final releases 2024-09-16 17:29:24 +02:00
Tobias HagemannandGitHub 8aaee3710a Update README.md 2024-09-10 11:57:03 +02:00
Armin SchrenkandGitHub 414d81dc06 Update mac-dmg.yml
Switch to macOS-12 due to errors
2024-08-20 18:17:08 +02:00
Armin SchrenkandGitHub b450ab028d Update mac-dmg.yml
macos-11 is no more
2024-08-20 17:42:32 +02:00
Armin Schrenk 5a51e53603 Merge branch 'develop' into release/1.14.0 2024-08-20 11:18:22 +02:00
Armin Schrenk d65beb632d Fixes #3519 2024-08-20 11:10:26 +02:00
Armin Schrenk 2b03477d31 prepare 1.14.0 2024-08-19 16:36:31 +02:00
CryptobotandGitHub f25e23da82 New Crowdin updates (#3463)
New translations strings.properties

Arabic; Chinese Simplified; Chinese Traditional; Dutch; Filipino; French; German; Greek; Italian; Japanese; Korean; Persian; Polish; Portuguese; Portuguese, Brazilian; Punjabi; Russian; Slovak; Spanish; Swedish; Turkish; Urdu (Pakistan); 

[ci skip]
2024-08-19 16:33:41 +02:00
dependabot[bot]andGitHub 82368e2632 Bump the java-production-dependencies group across 1 directory with 9 updates (#3516) 2024-08-19 14:29:15 +00:00
dependabot[bot]andGitHub 9057090b56 Bump the maven-build-plugins group across 1 directory with 3 updates (#3513) 2024-08-19 14:18:32 +00:00
dependabot[bot]andGitHub 357937e0bf Bump the java-test-dependencies group across 1 directory with 2 updates (#3514) 2024-08-19 14:17:07 +00:00
Armin Schrenk f84a2396eb ignore integrations-api 2.0.0-alpha1 2024-08-19 10:42:58 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Armin Schrenk
193dcad6e8 Bump the javafx group with 5 updates (#3498)
* Bump javafx from 22.0.1 to 22.0.2
* update build scripts to updated jfx version

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Armin Schrenk <armin.schrenk@skymatic.de>
2024-08-19 10:34:14 +02:00
Armin Schrenk 257f4427b8 catch all methods of adding a vault for #2880 2024-08-19 10:27:13 +02:00
Armin Schrenk 4778ba0770 add autostart for deb artifact 2024-08-16 15:56:58 +02:00
Armin SchrenkandGitHub 77b908199e Mitigates #2880 (#3512) 2024-08-16 12:59:38 +02:00
Armin SchrenkandGitHub d448c42f87 Feature: JDK 22.0.2+9 for release artifacts (#3510)
* update jdks for release artifacts to jdk 22.02+9
2024-08-14 16:40:44 +02:00
Armin Schrenk b9403222ba add java.compiler module to build scripts
references 93d0fd41a6 and https://github.com/google/dagger/issues/4321
2024-08-13 16:28:09 +02:00
Armin Schrenk 93d0fd41a6 Update cryptofs to 2.7.0-beta1
Closes #2058
2024-08-13 11:59:23 +02:00
Armin Schrenk 067bd4752c prevent leaking of NVD API key into logs 2024-08-09 11:30:16 +02:00
Armin Schrenk fb4f9fc68f Update integrations-win and -linux for quickAccess service providers 2024-08-09 11:05:02 +02:00
Armin SchrenkandGitHub a20667a156 Merge pull request #3494 from cryptomator/feature/quick-access
Feature: Add unlocked vaults to an quick access area
2024-08-07 16:42:53 +02:00
Armin Schrenk 4d47544244 cleanup 2024-08-07 16:32:30 +02:00
Armin Schrenk d59f149f7c Load quick access service lazy 2024-08-06 15:17:18 +02:00
Armin Schrenk 028f6e7a02 clean up 2024-08-06 15:08:29 +02:00
Armin Schrenk 71e4f98665 hard code default quickaccess service 2024-08-06 12:26:26 +02:00
Tobias Hagemann d60ced52fe added codesigning jdk files in build.sh for local macos builds to match mac-dmg.yml ci build 2024-07-30 21:14:32 +02:00
Tobias Hagemann 45c7d2b071 added provisioning profile to mac build process with updated entitlements 2024-07-30 18:48:54 +02:00
Ralph PlawetzkiandGitHub 7a789d2eed Fixes #3501 (PR #3502) 2024-07-30 12:27:16 +02:00
Armin Schrenk cc1e542146 clean up 2024-07-23 16:50:27 +02:00
Armin Schrenk e4e84d46b6 hide option, if no quick access service is present 2024-07-23 16:50:15 +02:00
Armin Schrenk 61fc53bf9c rename internal method 2024-07-23 16:39:34 +02:00
Tobias HagemannandGitHub f8386a5a99 Update README.md 2024-07-18 15:09:05 +02:00
Armin Schrenk da7e89fc72 fix windows build script 2024-07-17 16:35:33 +02:00
Armin Schrenk 6b57a0ad9c add translation 2024-07-17 11:34:29 +02:00
Armin Schrenk f1eb997804 make quickAccessService togglable & selectable in UI 2024-07-16 17:25:47 +02:00
Armin Schrenk 2fe5180721 cleanup 2024-07-16 17:19:52 +02:00
Armin Schrenk 2fa88490bd update to integrations-api 1.4.0-beta2
* differ between using quick access and actual impl
* rename properties
2024-07-16 13:36:37 +02:00
Jan-Peter Klein 5f5b5a5426 set preferences window min width and height 2024-07-09 13:48:45 +02:00
Jan-Peter Klein cb054bb4f5 fix update available check in preference tab selection 2024-07-09 13:46:41 +02:00
dependabot[bot]andGitHub b4f9bc62ca Bump the maven-build-plugins group across 1 directory with 3 updates (#3484) 2024-07-08 07:52:56 +00:00
Tobias HagemannandGitHub 34bface2d7 Merge pull request #3481 from purejava/fix-#3480 2024-07-07 16:40:40 +02:00
Ralph Plawetzki 70e52b1a31 Fix typo
Closes #3480
2024-07-07 15:41:28 +02:00
Tobias HagemannandGitHub 59a2398c4c Update README.md 2024-07-04 11:49:37 +02:00
Armin Schrenk e5003c1783 use quick access service in unlock/lock 2024-06-27 17:47:05 +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
Armin Schrenk 387eb420eb Merge branch 'hotfix/1.12.4' 2024-03-27 12:58:36 +01:00
Armin Schrenk 7785bb8820 finalize 1.12.4 2024-03-27 12:57:55 +01:00
Armin Schrenk de4fa8c7b0 use latest WiX version
fixes CVE-2024-29187 and CVE-2024-29188
2024-03-27 12:55:13 +01:00
Armin Schrenk 17f519e01c prepare 1.12.4 2024-03-27 12:53:49 +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
Armin Schrenk 61a45fc738 Merge branch 'release/1.12.3' 2024-02-27 12:52:00 +01:00
Armin Schrenk 3a65b5551f adjust release check to changed metainfo file
references fcb940e29c
2024-02-27 12:48:36 +01:00
Armin Schrenk 94ed5c18b8 damnn merge from develop to release 2024-02-27 12:41:06 +01:00
Armin Schrenk a559483d86 finalize 1.12.3 2024-02-27 12:38:52 +01:00
Armin Schrenk 3acdef1dd0 Merge branch 'develop' into release/1.12.3 2024-02-27 12:37:13 +01:00
Armin Schrenk def6f8ab95 [ci skip] clean up 2024-02-27 12:35:55 +01:00
Armin Schrenk 11ba1f3ddc revert 1ab73be1f4 and 2d968eac8c 2024-02-27 12:32:37 +01:00
CryptobotandGitHub 3228f2cf5f New Crowdin updates (#3343)
New translations strings.properties

Chinese Simplified; Dutch; French; Japanese; Portuguese; Russian; Slovak; Swedish; 

[ci skip]
2024-02-27 10:23:56 +01:00
Armin Schrenk 9c4f7ad79d [ci skip] remove unknown env/style combination from appstream metadata 2024-02-26 17:41:18 +01:00
Armin Schrenk 3bd57d162b [ci skip] update appstream metadata 2024-02-26 17:37:04 +01:00
dependabot[bot]andGitHub 5ea73a5a8d Bump the java-production-dependencies group with 1 update (#3347) 2024-02-26 09:50:42 +00:00
Armin Schrenk 38670838c7 [ci skip] Drop yq usage 2024-02-26 10:15:25 +01:00
Armin Schrenk 3e0b84dbce [ci skip] fix pr body description & reduce log noise 2024-02-23 17:39:38 +01:00
Armin Schrenk 2302db6206 [ci skip] fix create pr command in flathub job 2024-02-23 17:27:48 +01:00
Armin Schrenk a94bf99660 [ci skip] automatically set up tracking branch on push 2024-02-23 17:13:11 +01:00
Armin Schrenk 0c5ce353b1 [ci skip] use github.actor 2024-02-23 17:05:26 +01:00
Armin Schrenk b3ce777a42 [ci skip] configure git in flathub job 2024-02-23 16:29:18 +01:00
Armin Schrenk 3085df3397 [ci skip] further fixes:
* remove yq after update
* set token for git
2024-02-23 16:14:21 +01:00
Armin Schrenk fb740b605f add missing quote char [ci skip] 2024-02-23 15:57:06 +01:00
Armin Schrenk 6a74d9f3b2 use same varaible in get-version job 2024-02-23 15:53:22 +01:00
Armin Schrenk 1c7dffb63f Add ci job to create flathub PR on release [ci skip] 2024-02-23 15:44:48 +01:00
Jan-Peter Klein a213f073b1 enhance screen selection by adding primary fallback 2024-02-23 10:51:23 +01:00
Armin Schrenk 1ab73be1f4 fixes #3344 2024-02-22 16:11:54 +01:00
Armin Schrenk 8412871090 apply proper formatting and state to error dialog 2024-02-22 12:23:43 +01:00
Armin Schrenk fa63f3ca67 Reset develop to SNAPSHOT version 2024-02-22 12:21:00 +01:00
Armin Schrenk dbc0f52481 fix not-uploading artifacts on release 2024-02-21 22:04:35 +01:00
Armin Schrenk b8cd1caeac also upload asc file as artifact for mac build 2024-02-21 13:09:14 +01:00
Armin Schrenk 43c25b6d97 fix ci
references 84732337ca
2024-02-21 12:53:01 +01:00
Armin Schrenk e44bc09074 Merge branch 'develop' into release/1.12.3 2024-02-21 12:20:36 +01:00
CryptobotandGitHub 7b02f78ef5 New Crowdin updates (#3342)
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-02-21 12:13:24 +01:00
Armin Schrenk f7e8a4d1e6 prepare 1.12.3 2024-02-20 18:13:01 +01:00
Armin Schrenk 664375d692 fix wrong method name 2024-02-20 18:06:55 +01:00
Armin SchrenkandGitHub 2d968eac8c Merge pull request #3336 from cryptomator/feature/3272-vaultid-as-mountpoint
Feature: For FUSE-Ts default mountpoint use vault id as mountpoint
2024-02-20 17:34:09 +01:00
Armin Schrenk 542d2fcfe1 only create winget PR for stable versions [ci skip] 2024-02-19 16:42:42 +01:00
mindmonkandGitHub 144e929896 Merge pull request #3335 from cryptomator/feature/center-unlock-dialog-on-mainstage
Center Unlock Success Dialog on Main Application Window
2024-02-19 15:05:28 +01:00
Armin Schrenk 803748f78d update code-sign-action [ci skip] 2024-02-19 14:46:58 +01:00
Armin Schrenk 3410e7243a Update minimal required macOS version for dmg
due to javafx update in 7d281e2878
2024-02-19 13:02:05 +01:00
Armin Schrenk 84732337ca removed GTK-2 support
due to javafx update in 7d281e2878
2024-02-19 12:17:11 +01:00
dependabot[bot]andGitHub c527808710 Bump the java-production-dependencies group with 4 updates (#3340) 2024-02-19 09:35:25 +00:00
Armin Schrenk 99c89dbf39 fix possible null comparsion 2024-02-19 10:22:22 +01:00
Jan-Peter Klein 829b64cd3d dialog centers on main app screen if mainWindow is hidden 2024-02-19 08:55:16 +01:00
Jan-Peter Klein f4007267fb simplified the code and removed the function 2024-02-16 17:31:20 +01:00
Armin Schrenk c82a0bfaf3 cleanup 2024-02-16 17:09:05 +01:00
Armin SchrenkandGitHub 251ad65344 Merge pull request #3327 from cryptomator/feature/3233-load-presets-background
Feature: Load LocationPresets in background and show indicator in UI
2024-02-16 16:21:01 +01:00
Jan-Peter Klein 155ba4607b introduced functionality to center the unlock screen within the main application window 2024-02-16 15:24:52 +01:00
Armin Schrenk 62f6865d3e cleanup created directories after mount
fails silently
2024-02-14 10:30:51 +01:00
Armin Schrenk ffb3290248 Merge branch 'develop' into feature/3272-vaultid-as-mountpoint 2024-02-14 10:29:30 +01:00
Armin Schrenk a013ae3d91 [ci skip] change mountPointDir for macOS-Dev-run profile
aligns production build
2024-02-14 10:29:14 +01:00
Armin Schrenk 19a954e677 use correct mountProvider 2024-02-14 10:05:56 +01:00
Armin Schrenk f262980acc closes #3272 2024-02-13 16:37:46 +01:00
Armin Schrenk 3b3aa18c92 fixes #3233
this time with gc prevention of a binding
2024-02-13 00:55:07 +01:00
Armin Schrenk c7b8bc89c2 also don't bother upload to av scan, if not published 2024-02-12 13:18:17 +01:00
Armin Schrenk 5fc981abd3 prevent automatic overwrite of already released files 2024-02-12 13:16:45 +01:00
Armin Schrenk 36ec1a5ebc update windows update url [ci skip] 2024-02-09 18:37:19 +01:00
Armin Schrenk be4aad4168 set default value for Windows debug flag 2024-02-09 17:03:22 +01:00
Armin Schrenk fcb940e29c update release section of appstream metainfo file [ci skip] 2024-02-09 14:52:10 +01:00
Armin Schrenk 4f3ca2a6c4 fix appimage build script [ci skip] 2024-02-09 12:56:33 +01:00
Armin Schrenk 27cd34bee0 Merge branch 'main' into develop [ci skip] 2024-02-09 12:53:16 +01:00
Armin Schrenk c07e51be51 Merge branch 'release/1.12.2' 2024-02-09 12:51:57 +01:00
Armin Schrenk 0421879b39 finalize 1.12.2 2024-02-09 12:51:19 +01:00
Armin Schrenk 2d627717a0 prepare 1.12.2 2024-02-09 10:59:33 +01:00
Armin Schrenk dc0e88a694 fixes #3319 2024-02-09 10:55:27 +01:00
Armin Schrenk a5e3630375 also specify version for winget release [ci skip] 2024-02-08 17:47:50 +01:00
Armin Schrenk 17335e8f70 shorten workflow name [ci skip] 2024-02-08 17:39:38 +01:00
Armin Schrenk 42dd2fba48 github cli needs special token in CI env [ci skip] 2024-02-08 17:37:50 +01:00
Armin Schrenk e1cca6427c Add ci job for releasing to winget 2024-02-08 17:34:02 +01:00
Armin Schrenk 42d3dbaa23 always use latest version of winfsp-uninstaller 2024-02-08 17:10:40 +01:00
Armin Schrenk 185d67c492 Merge branch 'main' into develop [ci skip] 2024-02-07 11:43:59 +01:00
137 changed files with 5807 additions and 1478 deletions
+3
View File
@@ -7,6 +7,9 @@ updates:
day: "monday" day: "monday"
time: "06:00" time: "06:00"
timezone: "Etc/UTC" timezone: "Etc/UTC"
ignore:
- dependency-name: "org.cryptomator:integrations-api"
versions: ["2.0.0-alpha1"]
groups: groups:
java-test-dependencies: java-test-dependencies:
patterns: patterns:
+9 -14
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.2+9'
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.2/openjfx-22.0.2_linux-x64_bin-jmods.zip'
openjfx-sha: '7baed11ca56d5fee85995fa6612d4299f1e8b7337287228f7f12fd50407c56f8' openjfx-sha: 'd44bff3b94d5668fdee18a938d7b1269026d663d44765f02d29a9bdfd3fa1eb0'
- 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.2/openjfx-22.0.2_linux-aarch64_bin-jmods.zip'
openjfx-sha: '871e7b9d7af16aef2e55c1b7830d0e0b2503b13dd8641374ba7e55ecb81d2ef9' openjfx-sha: '3d5457136690c4f5bb9522d38b45218e045bdac13c24aa4c808c7c8d17d039c7'
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,17 +80,12 @@ 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,java.compiler
--strip-native-commands --strip-native-commands
--no-header-files --no-header-files
--no-man-pages --no-man-pages
--strip-debug --strip-debug
--compress zip-0 --compress zip-0
- name: Prepare additional launcher
run: envsubst '${SEMVER_STR} ${REVISION_NUM}' < dist/linux/launcher-gtk2.properties > launcher-gtk2.properties
env:
SEMVER_STR: ${{ needs.get-version.outputs.semVerStr }}
REVISION_NUM: ${{ needs.get-version.outputs.revNum }}
- name: Run jpackage - name: Run jpackage
run: > run: >
${JAVA_HOME}/bin/jpackage ${JAVA_HOME}/bin/jpackage
@@ -173,8 +168,8 @@ jobs:
cryptomator-*.asc cryptomator-*.asc
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/') 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:
+10 -11
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.2+9'
COFFEELIBS_JDK: 21 COFFEELIBS_JDK: 22
COFFEELIBS_JDK_VERSION: '21.0.2+13-0ppa1' COFFEELIBS_JDK_VERSION: '22.0.2+9-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.2/openjfx-22.0.2_linux-x64_bin-jmods.zip'
OPENJFX_JMODS_AMD64_HASH: '7baed11ca56d5fee85995fa6612d4299f1e8b7337287228f7f12fd50407c56f8' OPENJFX_JMODS_AMD64_HASH: 'd44bff3b94d5668fdee18a938d7b1269026d663d44765f02d29a9bdfd3fa1eb0'
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.2/openjfx-22.0.2_linux-aarch64_bin-jmods.zip'
OPENJFX_JMODS_AARCH64_HASH: '871e7b9d7af16aef2e55c1b7830d0e0b2503b13dd8641374ba7e55ecb81d2ef9' OPENJFX_JMODS_AARCH64_HASH: '3d5457136690c4f5bb9522d38b45218e045bdac13c24aa4c808c7c8d17d039c7'
jobs: jobs:
build: build:
@@ -44,7 +44,7 @@ jobs:
run: | run: |
sudo add-apt-repository ppa:coffeelibs/openjdk sudo add-apt-repository ppa:coffeelibs/openjdk
sudo apt-get update sudo apt-get update
sudo apt-get install debhelper devscripts dput coffeelibs-jdk-${{ env.COFFEELIBS_JDK }}=${{ env.COFFEELIBS_JDK_VERSION }} libgtk2.0-0 sudo apt-get install debhelper devscripts dput coffeelibs-jdk-${{ env.COFFEELIBS_JDK }}=${{ env.COFFEELIBS_JDK_VERSION }}
- name: Setup Java - name: Setup Java
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:
@@ -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: |
@@ -142,10 +142,9 @@ jobs:
- name: Publish on PPA - name: Publish on PPA
if: inputs.dput if: inputs.dput
run: dput ppa:sebastian-stenzel/cryptomator-beta cryptomator_*_source.changes run: dput ppa:sebastian-stenzel/cryptomator-beta cryptomator_*_source.changes
# If ref is a tag, also upload to GitHub Releases: # If ref is a tag, also upload to GitHub Releases:
- name: Publish Debian package on GitHub Releases - name: Publish Debian package on GitHub Releases
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/') && inputs.dput
env: env:
GITHUB_TOKEN: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }} GITHUB_TOKEN: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
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 }}
+88
View File
@@ -0,0 +1,88 @@
name: Create PR for flathub
on:
release:
types: [published]
workflow_dispatch:
inputs:
tag:
description: 'Release tag'
required: true
jobs:
get-version:
uses: ./.github/workflows/get-version.yml
with:
version: ${{ inputs.tag }}
tarball:
name: Determines tarball url and compute checksum
runs-on: ubuntu-latest
needs: [get-version]
if: github.event_name == 'workflow_dispatch' || needs.get-version.outputs.versionType == 'stable'
outputs:
url: ${{ steps.url.outputs.url}}
sha512: ${{ steps.sha512.outputs.sha512}}
steps:
- name: Determine tarball url
id: url
run: |
URL="";
if [[ -n "${{ inputs.tag }}" ]]; then
URL="https://github.com/cryptomator/cryptomator/archive/refs/tags/${{ inputs.tag }}.tar.gz"
else
URL="https://github.com/cryptomator/cryptomator/archive/refs/tags/${{ github.event.release.tag_name }}.tar.gz"
fi
echo "url=${URL}" >> "$GITHUB_OUTPUT"
- name: Download source tarball and compute checksum
id: sha512
run: |
curl --silent --fail-with-body -L -H "Accept: application/vnd.github+json" ${{ steps.url.outputs.url }} --output cryptomator.tar.gz
TARBALL_SHA512=$(sha512sum cryptomator.tar.gz | cut -d ' ' -f1)
echo "sha512=${TARBALL_SHA512}" >> "$GITHUB_OUTPUT"
flathub:
name: Create PR for flathub
runs-on: ubuntu-latest
needs: [tarball, get-version]
env:
FLATHUB_PR_URL: tbd
steps:
- uses: actions/checkout@v4
with:
repository: 'flathub/org.cryptomator.Cryptomator'
token: ${{ secrets.CRYPTOBOT_WINGET_TOKEN }}
- name: Checkout release branch
run: |
git checkout -b release/${{ needs.get-version.outputs.semVerStr }}
- name: Update build file
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/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
- name: Commit and push
run: |
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com"
git config push.autoSetupRemote true
git stage .
git commit -m "Prepare release ${{needs.get-version.outputs.semVerStr}}"
git push
- name: Create pull request
run: |
printf "> [!IMPORTANT]\n> Todos:\n> - [ ] Update 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)
echo "FLATHUB_PR_URL=$PR_URL" >> "$GITHUB_ENV"
env:
GH_TOKEN: ${{ secrets.CRYPTOBOT_WINGET_TOKEN }}
- name: Slack Notification
uses: rtCamp/action-slack-notify@v2
if: github.event_name == 'release'
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_USERNAME: 'Cryptobot'
SLACK_ICON: false
SLACK_ICON_EMOJI: ':bot:'
SLACK_CHANNEL: 'cryptomator-desktop'
SLACK_TITLE: "Flathub release PR created for ${{ github.event.repository.name }} ${{ github.event.release.tag_name }} created."
SLACK_MESSAGE: "See <${{ env.FLATHUB_PR_URL }}|PR> on how to proceed.>."
SLACK_FOOTER: false
MSG_MINIMAL: true
+4 -4
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:
@@ -50,7 +50,7 @@ jobs:
if [[ $GITHUB_REF =~ refs/tags/[0-9]+\.[0-9]+\.[0-9]+.* ]]; then if [[ $GITHUB_REF =~ refs/tags/[0-9]+\.[0-9]+\.[0-9]+.* ]]; then
SEM_VER_STR=${GITHUB_REF##*/} SEM_VER_STR=${GITHUB_REF##*/}
elif [[ "${{ inputs.version }}" =~ [0-9]+\.[0-9]+\.[0-9]+.* ]]; then elif [[ "${{ inputs.version }}" =~ [0-9]+\.[0-9]+\.[0-9]+.* ]]; then
SEM_VER_STR="${{ github.event.inputs.version }}" SEM_VER_STR="${{ inputs.version }}"
else else
SEM_VER_STR=`mvn help:evaluate -Dexpression=project.version -q -DforceStdout` SEM_VER_STR=`mvn help:evaluate -Dexpression=project.version -q -DforceStdout`
fi fi
@@ -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 }}
+20 -13
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.2+9'
jobs: jobs:
get-version: get-version:
@@ -32,20 +32,20 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
- os: macos-11 - os: macos-12
architecture: x64 architecture: x64
output-suffix: x64 output-suffix: x64
xcode-path: '/Applications/Xcode_13.2.1.app' xcode-path: '/Applications/Xcode_13.2.1.app'
fuse-lib: macFUSE fuse-lib: macFUSE
openjfx-url: 'https://download2.gluonhq.com/openjfx/21.0.1/openjfx-21.0.1_osx-x64_bin-jmods.zip' openjfx-url: 'https://download2.gluonhq.com/openjfx/22.0.2/openjfx-22.0.2_osx-x64_bin-jmods.zip'
openjfx-sha: 'bd6abab20da73d5a968dcf2fd915d81b5fb919340e3bb84979ee9a888a829939' openjfx-sha: '115cb08bb59d880cfff6e51e0bf0dcc45785ed9d456b8b8425597b04da6ab3d4'
- 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.2/openjfx-22.0.2_osx-aarch64_bin-jmods.zip'
openjfx-sha: '7afaa1c57a6cc3c384d636e597b9a5364693e2db4aaec0a6e63d2fa964400b58' openjfx-sha: '813c6748f7c99cb7a579d48b48a087b4682b1fad1fc1a4fe5f9b21cf872b15a7'
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,java.compiler
--strip-native-commands --strip-native-commands
--no-header-files --no-header-files
--no-man-pages --no-man-pages
@@ -137,12 +137,14 @@ jobs:
mv dist/mac/resources/Cryptomator-Vault.icns Cryptomator.app/Contents/Resources/ mv dist/mac/resources/Cryptomator-Vault.icns Cryptomator.app/Contents/Resources/
sed -i '' "s|###BUNDLE_SHORT_VERSION_STRING###|${VERSION_NO}|g" Cryptomator.app/Contents/Info.plist sed -i '' "s|###BUNDLE_SHORT_VERSION_STRING###|${VERSION_NO}|g" Cryptomator.app/Contents/Info.plist
sed -i '' "s|###BUNDLE_VERSION###|${REVISION_NO}|g" Cryptomator.app/Contents/Info.plist sed -i '' "s|###BUNDLE_VERSION###|${REVISION_NO}|g" Cryptomator.app/Contents/Info.plist
echo -n "$PROVISIONING_PROFILE_BASE64" | base64 --decode --output Cryptomator.app/Contents/embedded.provisionprofile
env: env:
VERSION_NO: ${{ needs.get-version.outputs.semVerNum }} VERSION_NO: ${{ needs.get-version.outputs.semVerNum }}
REVISION_NO: ${{ needs.get-version.outputs.revNum }} REVISION_NO: ${{ needs.get-version.outputs.revNum }}
PROVISIONING_PROFILE_BASE64: ${{ secrets.MACOS_PROVISIONING_PROFILE_BASE64 }}
- name: Generate license for dmg - name: Generate license for dmg
run: > run: >
mvn -B 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 +177,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
@@ -194,9 +196,12 @@ jobs:
fi fi
done done
echo "Codesigning Cryptomator.app..." echo "Codesigning Cryptomator.app..."
sed -i '' "s|###APP_IDENTIFIER_PREFIX###|${TEAM_IDENTIFIER}.|g" dist/mac/Cryptomator.entitlements
sed -i '' "s|###TEAM_IDENTIFIER###|${TEAM_IDENTIFIER}|g" dist/mac/Cryptomator.entitlements
codesign --force --deep --entitlements dist/mac/Cryptomator.entitlements -o runtime -s ${CODESIGN_IDENTITY} Cryptomator.app codesign --force --deep --entitlements dist/mac/Cryptomator.entitlements -o runtime -s ${CODESIGN_IDENTITY} Cryptomator.app
env: env:
CODESIGN_IDENTITY: ${{ secrets.MACOS_CODESIGN_IDENTITY }} CODESIGN_IDENTITY: ${{ secrets.MACOS_CODESIGN_IDENTITY }}
TEAM_IDENTIFIER: ${{ secrets.MACOS_TEAM_IDENTIFIER }}
- name: Prepare .dmg contents - name: Prepare .dmg contents
run: | run: |
mkdir dmg mkdir dmg
@@ -253,11 +258,13 @@ jobs:
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: dmg-${{ matrix.output-suffix }} name: dmg-${{ matrix.output-suffix }}
path: Cryptomator-*.dmg path: |
Cryptomator-*.dmg
Cryptomator-*.asc
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/') 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
+3 -3
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:
@@ -44,7 +44,7 @@ jobs:
fi fi
- name: Validate release in org.cryptomator.Cryptomator.metainfo.xml file - name: Validate release in org.cryptomator.Cryptomator.metainfo.xml file
run: | run: |
if ! grep -q "<release date=\".*\" version=\"${{ steps.validate-pom-version.outputs.semVerStr }}\"/>" dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml; then if ! grep -q "<release date=\".*\" version=\"${{ steps.validate-pom-version.outputs.semVerStr }}\">" dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml; then
echo "Release not set in dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml" echo "Release not set in dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml"
exit 1 exit 1
fi fi
@@ -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 }}
+68 -64
View File
@@ -11,15 +11,16 @@ on:
isDebug: isDebug:
description: 'Build debug version with console output' description: 'Build debug version with console output'
type: boolean type: boolean
default: false
env: env:
JAVA_DIST: 'zulu' JAVA_DIST: 'zulu'
JAVA_VERSION: '21.0.2+13' JAVA_VERSION: '22.0.2+9'
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.2/openjfx-22.0.2_windows-x64_bin-jmods.zip'
OPENJFX_JMODS_AMD64_HASH: 'daf8acae631c016c24cfe23f88469400274d3441dd890615a42dfb501f3eb94a' OPENJFX_JMODS_AMD64_HASH: 'f9376d200f5c5b85327d575c1ec1482e6455f19916577f7e2fc9be2f48bb29b6'
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/download/1.0.0/winfsp-uninstaller.exe' WINFSP_UNINSTALLER: 'https://github.com/cryptomator/winfsp-uninstaller/releases/latest/download/winfsp-uninstaller.exe'
defaults: defaults:
run: run:
@@ -39,6 +40,9 @@ jobs:
LOOPBACK_ALIAS: 'cryptomator-vault' LOOPBACK_ALIAS: 'cryptomator-vault'
WIN_CONSOLE_FLAG: '' WIN_CONSOLE_FLAG: ''
steps: steps:
- name: Upgrade WIX to latest version
run: choco install wixtoolset --version 3.14.1
shell: pwsh
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup Java - name: Setup Java
uses: actions/setup-java@v4 uses: actions/setup-java@v4
@@ -73,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
@@ -85,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,java.compiler
--strip-native-commands --strip-native-commands
--no-header-files --no-header-files
--no-man-pages --no-man-pages
@@ -109,7 +113,7 @@ jobs:
--copyright "(C) 2016 - 2024 Skymatic GmbH" --copyright "(C) 2016 - 2024 Skymatic GmbH"
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}" --app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
--java-options "--enable-preview" --java-options "--enable-preview"
--java-options "--enable-native-access=org.cryptomator.jfuse.win" --java-options "--enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win"
--java-options "-Xss5m" --java-options "-Xss5m"
--java-options "-Xmx256m" --java-options "-Xmx256m"
--java-options "-Dcryptomator.appVersion=\"${{ needs.get-version.outputs.semVerStr }}\"" --java-options "-Dcryptomator.appVersion=\"${{ needs.get-version.outputs.semVerStr }}\""
@@ -170,7 +174,7 @@ jobs:
& $env:JAVA_HOME\bin\jmod.exe extract --dir jpackage-jmod "${env:JAVA_HOME}\jmods\jdk.jpackage.jmod" & $env:JAVA_HOME\bin\jmod.exe extract --dir jpackage-jmod "${env:JAVA_HOME}\jmods\jdk.jpackage.jmod"
Get-ChildItem -Recurse -Path "jpackage-jmod" -File wixhelper.dll | Select-Object -Last 1 | Copy-Item -Destination "appdir" Get-ChildItem -Recurse -Path "jpackage-jmod" -File wixhelper.dll | Select-Object -Last 1 | Copy-Item -Destination "appdir"
- name: Codesign - name: Codesign
uses: skymatic/code-sign-action@v2 uses: skymatic/code-sign-action@v3
with: with:
certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }} certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }}
password: ${{ secrets.WIN_CODESIGN_P12_PW }} password: ${{ secrets.WIN_CODESIGN_P12_PW }}
@@ -195,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"
@@ -219,7 +223,7 @@ jobs:
--win-menu --win-menu
--win-dir-chooser --win-dir-chooser
--win-shortcut-prompt --win-shortcut-prompt
--win-update-url "https:\\cryptomator.org" --win-update-url "https:\\cryptomator.org\downloads"
--win-menu-group Cryptomator --win-menu-group Cryptomator
--resource-dir dist/win/resources --resource-dir dist/win/resources
--license-file dist/win/resources/license.rtf --license-file dist/win/resources/license.rtf
@@ -228,7 +232,7 @@ jobs:
JP_WIXWIZARD_RESOURCES: ${{ github.workspace }}/dist/win/resources # requires abs path, used in resources/main.wxs JP_WIXWIZARD_RESOURCES: ${{ github.workspace }}/dist/win/resources # requires abs path, used in resources/main.wxs
JP_WIXHELPER_DIR: ${{ github.workspace }}\appdir JP_WIXHELPER_DIR: ${{ github.workspace }}\appdir
- name: Codesign MSI - name: Codesign MSI
uses: skymatic/code-sign-action@v2 uses: skymatic/code-sign-action@v3
with: with:
certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }} certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }}
password: ${{ secrets.WIN_CODESIGN_P12_PW }} password: ${{ secrets.WIN_CODESIGN_P12_PW }}
@@ -253,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/')
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
@@ -284,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"
@@ -325,7 +320,7 @@ jobs:
-ib installer/unsigned/Cryptomator-Installer.exe -ib installer/unsigned/Cryptomator-Installer.exe
-o tmp/engine.exe -o tmp/engine.exe
- name: Codesign burn engine - name: Codesign burn engine
uses: skymatic/code-sign-action@v2 uses: skymatic/code-sign-action@v3
with: with:
certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }} certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }}
password: ${{ secrets.WIN_CODESIGN_P12_PW }} password: ${{ secrets.WIN_CODESIGN_P12_PW }}
@@ -339,7 +334,7 @@ jobs:
-ab tmp/engine.exe installer/unsigned/Cryptomator-Installer.exe -ab tmp/engine.exe installer/unsigned/Cryptomator-Installer.exe
-o installer/Cryptomator-Installer.exe -o installer/Cryptomator-Installer.exe
- name: Codesign EXE - name: Codesign EXE
uses: skymatic/code-sign-action@v2 uses: skymatic/code-sign-action@v3
with: with:
certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }} certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }}
password: ${{ secrets.WIN_CODESIGN_P12_PW }} password: ${{ secrets.WIN_CODESIGN_P12_PW }}
@@ -364,52 +359,61 @@ jobs:
Cryptomator-*.exe Cryptomator-*.exe
Cryptomator-*.asc Cryptomator-*.asc
if-no-files-found: error if-no-files-found: error
publish:
name: Publish installers to the github release
if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published'
runs-on: ubuntu-latest
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:
- name: Download installers
uses: actions/download-artifact@v4
with:
merge-multiple: true
- name: Publish .msi on GitHub Releases - name: Publish .msi on GitHub Releases
if: startsWith(github.ref, 'refs/tags/') id: publish
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 }}
# do not change ordering of filelist, required for correct job output
files: | files: |
Cryptomator-*.exe *.msi
Cryptomator-*.asc *.exe
*.asc
allowlist: allowlist-msi:
name: Anti Virus Allowlisting uses: ./.github/workflows/av-whitelist.yml
if: startsWith(github.ref, 'refs/tags/') needs: [publish]
with:
url: ${{ needs.publish.outputs.download-url-msi }}
secrets: inherit
allowlist-exe:
uses: ./.github/workflows/av-whitelist.yml
needs: [publish]
with:
url: ${{ needs.publish.outputs.download-url-exe }}
secrets: inherit
notify-winget:
name: Notify for winget-release
if: needs.get-version.outputs.versionType == 'stable'
needs: [publish, get-version]
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [build-msi, build-exe]
steps: steps:
- name: Download .msi - name: Slack Notification
uses: actions/download-artifact@v4 uses: rtCamp/action-slack-notify@v2
with: env:
name: msi SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
path: msi SLACK_USERNAME: 'Cryptobot'
- name: Download .exe SLACK_ICON: false
uses: actions/download-artifact@v4 SLACK_ICON_EMOJI: ':bot:'
with: SLACK_CHANNEL: 'cryptomator-desktop'
name: exe SLACK_TITLE: "MSI of ${{ github.event.repository.name }} ${{ github.event.release.tag_name }} published."
path: exe SLACK_MESSAGE: "Ready to <https://github.com/${{ github.repository }}/actions/workflows/winget.yml| release to winget>."
- name: Collect files SLACK_FOOTER: false
run: | MSG_MINIMAL: true
mkdir files
cp msi/*.msi files
cp exe/*.exe files
- name: Upload to Kaspersky
uses: SamKirkland/FTP-Deploy-Action@v4.3.4
with:
protocol: ftps
server: allowlist.kaspersky-labs.com
port: 990
username: ${{ secrets.ALLOWLIST_KASPERSKY_USERNAME }}
password: ${{ secrets.ALLOWLIST_KASPERSKY_PASSWORD }}
local-dir: files/
- name: Upload to Avast
uses: SamKirkland/FTP-Deploy-Action@v4.3.4
with:
protocol: ftp
server: whitelisting.avast.com
port: 21
username: ${{ secrets.ALLOWLIST_AVAST_USERNAME }}
password: ${{ secrets.ALLOWLIST_AVAST_PASSWORD }}
local-dir: files/
+27
View File
@@ -0,0 +1,27 @@
name: Publish MSI to winget-pkgs
on:
workflow_dispatch:
inputs:
tag:
description: 'Release tag'
required: true
jobs:
winget:
name: Publish winget package
runs-on: windows-latest
steps:
- name: Sync winget-pkgs fork
run: |
gh repo sync cryptomator/winget-pkgs -b master --force
env:
GH_TOKEN: ${{ secrets.CRYPTOBOT_WINGET_TOKEN }}
- name: Submit package
uses: vedantmgoyal2009/winget-releaser@v2
with:
identifier: Cryptomator.Cryptomator
version: ${{ inputs.tag }}
release-tag: ${{ inputs.tag }}
installers-regex: '\.msi$'
token: ${{ secrets.CRYPTOBOT_WINGET_TOKEN }}
+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 -1
View File
@@ -2,7 +2,7 @@
<configuration default="false" name="Cryptomator Windows" type="Application" factoryName="Application"> <configuration default="false" name="Cryptomator Windows" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" /> <option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
<module name="cryptomator" /> <module name="cryptomator" />
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath=&quot;@{appdata}/Cryptomator/settings.json;@{userhome}/AppData/Roaming/Cryptomator/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;@{localappdata}/Cryptomator/ipc.socket&quot; -Dcryptomator.logDir=&quot;@{localappdata}/Cryptomator&quot; -Dcryptomator.pluginDir=&quot;@{appdata}/Cryptomator/Plugins&quot; -Dcryptomator.integrationsWin.keychainPaths=&quot;@{appdata}/Cryptomator/keychain.json;@{userhome}/AppData/Roaming/Cryptomator/keychain.json&quot; -Dcryptomator.p12Path=&quot;@{appdata}/Cryptomator/key.p12;@{userhome}/AppData/Roaming/Cryptomator/key.p12&quot; -Dcryptomator.mountPointsDir=&quot;@{userhome}/Cryptomator&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win" /> <option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath=&quot;@{appdata}/Cryptomator/settings.json;@{userhome}/AppData/Roaming/Cryptomator/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;@{localappdata}/Cryptomator/ipc.socket&quot; -Dcryptomator.logDir=&quot;@{localappdata}/Cryptomator&quot; -Dcryptomator.pluginDir=&quot;@{appdata}/Cryptomator/Plugins&quot; -Dcryptomator.integrationsWin.keychainPaths=&quot;@{appdata}/Cryptomator/keychain.json;@{userhome}/AppData/Roaming/Cryptomator/keychain.json&quot; -Dcryptomator.p12Path=&quot;@{appdata}/Cryptomator/key.p12;@{userhome}/AppData/Roaming/Cryptomator/key.p12&quot; -Dcryptomator.mountPointsDir=&quot;@{userhome}/Cryptomator&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
+1 -1
View File
@@ -2,7 +2,7 @@
<configuration default="false" name="Cryptomator Windows Dev" type="Application" factoryName="Application"> <configuration default="false" name="Cryptomator Windows Dev" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" /> <option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
<module name="cryptomator" /> <module name="cryptomator" />
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath=&quot;@{appdata}/Cryptomator-Dev/settings.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;@{localappdata}/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;@{localappdata}/Cryptomator-Dev&quot; -Dcryptomator.pluginDir=&quot;@{appdata}/Cryptomator-Dev/Plugins&quot; -Dcryptomator.integrationsWin.keychainPaths=&quot;@{appdata}/Cryptomator-Dev/keychain.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/keychain.json&quot; -Dcryptomator.p12Path=&quot;@{appdata}/Cryptomator-Dev/key.p12;@{userhome}/AppData/Roaming/Cryptomator-Dev/key.p12&quot; -Dcryptomator.mountPointsDir=&quot;@{userhome}/Cryptomator-Dev&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win" /> <option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath=&quot;@{appdata}/Cryptomator-Dev/settings.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;@{localappdata}/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;@{localappdata}/Cryptomator-Dev&quot; -Dcryptomator.pluginDir=&quot;@{appdata}/Cryptomator-Dev/Plugins&quot; -Dcryptomator.integrationsWin.keychainPaths=&quot;@{appdata}/Cryptomator-Dev/keychain.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/keychain.json&quot; -Dcryptomator.p12Path=&quot;@{appdata}/Cryptomator-Dev/key.p12;@{userhome}/AppData/Roaming/Cryptomator-Dev/key.p12&quot; -Dcryptomator.mountPointsDir=&quot;@{userhome}/Cryptomator-Dev&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
+1 -1
View File
@@ -5,7 +5,7 @@
</envs> </envs>
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" /> <option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
<module name="cryptomator" /> <module name="cryptomator" />
<option name="VM_PARAMETERS" value="-Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath=&quot;@{userhome}/Library/Application Support/Cryptomator-Dev/settings.json&quot; -Dcryptomator.p12Path=&quot;@{userhome}/Library/Application Support/Cryptomator-Dev/key.p12&quot; -Dcryptomator.ipcSocketPath=&quot;@{userhome}/Library/Application Support/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;@{userhome}/Library/Logs/Cryptomator-Dev&quot; -Dcryptomator.pluginDir=&quot;@{userhome}/Library/Application Support/Cryptomator-Dev/Plugins&quot; -Dcryptomator.mountPointsDir=&quot;@{userhome}/Cryptomator&quot; -Dcryptomator.showTrayIcon=true -Dcryptomator.integrationsMac.keychainServiceName=Cryptomator -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac" /> <option name="VM_PARAMETERS" value="-Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath=&quot;@{userhome}/Library/Application Support/Cryptomator-Dev/settings.json&quot; -Dcryptomator.p12Path=&quot;@{userhome}/Library/Application Support/Cryptomator-Dev/key.p12&quot; -Dcryptomator.ipcSocketPath=&quot;@{userhome}/Library/Application Support/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;@{userhome}/Library/Logs/Cryptomator-Dev&quot; -Dcryptomator.pluginDir=&quot;@{userhome}/Library/Application Support/Cryptomator-Dev/Plugins&quot; -Dcryptomator.mountPointsDir=&quot;@{userhome}/Library/Application Support/Cryptomator-Dev/mnt&quot; -Dcryptomator.showTrayIcon=true -Dcryptomator.integrationsMac.keychainServiceName=Cryptomator -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
+2 -4
View File
@@ -31,9 +31,7 @@ Cryptomator is provided free of charge as an open-source project despite the hig
<tbody> <tbody>
<tr> <tr>
<td><a href="https://mowcapital.com/"><img src="https://cryptomator.org/img/sponsors/mowcapital.svg" alt="Mow Capital" height="28"></a></td> <td><a href="https://mowcapital.com/"><img src="https://cryptomator.org/img/sponsors/mowcapital.svg" alt="Mow Capital" height="28"></a></td>
<td><a href="https://www.easeus.com/"><img src="https://cryptomator.org/img/sponsors/easeus.png" alt="EaseUS" height="40"></a></td> <td><a href="https://www.route4me.com/"><img src="https://cryptomator.org/img/sponsors/route4me.svg" alt="Route4Me" height="56"></a></td>
<td><a href="https://www.hassmann-it-forensik.de/"><img src="https://cryptomator.org/img/sponsors/hassmannitforensik.png" alt="Hassmann IT-Forensik" height="40"></a></td>
<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 +84,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
+25 -27
View File
@@ -12,40 +12,40 @@ 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.2
# 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='d44bff3b94d5668fdee18a938d7b1269026d663d44765f02d29a9bdfd3fa1eb0'
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='3d5457136690c4f5bb9522d38b45218e045bdac13c24aa4c808c7c8d17d039c7'
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-${JAVAFX_VERSION}_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 -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)
JMOD_VERSION=${JMOD_VERSION#*@} JMOD_VERSION=${JMOD_VERSION#*@}
JMOD_VERSION=${JMOD_VERSION%%.*} JMOD_VERSION=${JMOD_VERSION%%.*}
POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout) POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout -B -f ../../../pom.xml)
POM_JFX_VERSION=${POM_JFX_VERSION#*@} POM_JFX_VERSION=${POM_JFX_VERSION#*@}
POM_JFX_VERSION=${POM_JFX_VERSION%%.*} POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
if [ $POM_JFX_VERSION -ne $JMOD_VERSION_AMD64 ]; then if [ $POM_JFX_VERSION -ne $JMOD_VERSION ]; then
>&2 echo "Major JavaFX version in pom.xml (${POM_JFX_VERSION}) != amd64 jmod version (${JMOD_VERSION})" >&2 echo "Major JavaFX version in pom.xml (${POM_JFX_VERSION}) != amd64 jmod version (${JMOD_VERSION})"
exit 1 exit 1
fi fi
@@ -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,java.compiler \
--strip-native-commands \ --strip-native-commands \
--no-header-files \ --no-header-files \
--no-man-pages \ --no-man-pages \
@@ -64,7 +64,6 @@ ${JAVA_HOME}/bin/jlink \
--compress zip-0 --compress zip-0
# create app dir # create app dir
envsubst '${SEMVER_STR} ${REVISION_NUM}' < ../launcher-gtk2.properties > launcher-gtk2.properties
${JAVA_HOME}/bin/jpackage \ ${JAVA_HOME}/bin/jpackage \
--verbose \ --verbose \
--type app-image \ --type app-image \
@@ -92,7 +91,6 @@ ${JAVA_HOME}/bin/jpackage \
--java-options "-Dcryptomator.showTrayIcon=true" \ --java-options "-Dcryptomator.showTrayIcon=true" \
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"@{appdir}/usr/share/icons/hicolor/symbolic/apps\"" \ --java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"@{appdir}/usr/share/icons/hicolor/symbolic/apps\"" \
--java-options "-Dcryptomator.buildNumber=\"appimage-${REVISION_NO}\"" \ --java-options "-Dcryptomator.buildNumber=\"appimage-${REVISION_NO}\"" \
--add-launcher cryptomator-gtk2=launcher-gtk2.properties \
--resource-dir ../resources --resource-dir ../resources
# transform AppDir # transform AppDir
@@ -116,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 launcher-gtk2.properties /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 ""
+123 -44
View File
@@ -5,26 +5,27 @@
<metadata_license>FSFAP</metadata_license> <metadata_license>FSFAP</metadata_license>
<project_license>GPL-3.0-or-later</project_license> <project_license>GPL-3.0-or-later</project_license>
<name>Cryptomator</name> <name>Cryptomator</name>
<summary>Multi-platform client-side encryption tool optimized for cloud storages</summary> <summary>Encryption made easy and optimized for the cloud</summary>
<description> <description>
<p> <p>
Cryptomator provides transparent, client-side encryption for your cloud. Protect your documents from unauthorized Cryptomator provides easy-to-use, transparent, client-side encryption for your cloud.
access. Cryptomator is free and open source software, so you can rest assured there are no backdoors. It protects your documents from unauthorized access and prying eyes, while you will still be able to view and edit your documents locally.
By not requiring any registration or account and performing all encryption locally, it gives you back control over your data and ensures your privacy.
Cryptomator is offered for all major platforms (including Android and iOS).
</p> </p>
<p> <p>
Cryptomator encrypts file contents and names using AES. Your passphrase is protected against bruteforcing attempts Cryptomator encrypts file contents and names using the widespread industry standard AES.
using scrypt. Directory structures get obfuscated. The only thing which cannot be encrypted without breaking your Your passphrase is protected against brute forcing attempts using scrypt.
cloud synchronization is the modification date of your files. Additionally, directory structures get obfuscated.
For more info about the Cryptomator encryption scheme, check out the online documentation.
</p> </p>
<p> <p>
Cryptomator is a free and open source software licensed under the GPLv3. This allows anyone to check our code. It Cryptomator is a free and open-source software licensed under the GPLv3.
is impossible to introduce backdoors for third parties. Also we cannot hide vulnerabilities. And the best thing This allows anyone to check our code.
is: There is no need to trust us, as you can control us! Thus, it is impossible to introduce backdoors for third parties or to hide vulnerabilities, so you do not need to trust Cryptomator.
</p> Also, vendor lock-ins are impossible.
<p> Even if we decided to stop development: The source code is already cloned by hundreds of other developers and development can be picked up by others.
Vendor lock-ins are impossible. Even if we decided to stop development: The source code is already cloned by
hundreds of other developers. As you don't need an account, you will never stand in front of locked doors.
</p> </p>
</description> </description>
@@ -42,7 +43,7 @@
</provides> </provides>
<screenshots> <screenshots>
<screenshot> <screenshot type="default">
<caption>Light theme</caption> <caption>Light theme</caption>
<image>https://user-images.githubusercontent.com/11858409/156986109-6e58f59c-8b8c-4501-b33b-bb1e33007cea.png</image> <image>https://user-images.githubusercontent.com/11858409/156986109-6e58f59c-8b8c-4501-b33b-bb1e33007cea.png</image>
</screenshot> </screenshot>
@@ -52,47 +53,125 @@
</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>
<url type="faq">https://community.cryptomator.org/c/kb/faq</url> <url type="faq">https://community.cryptomator.org/c/kb/faq</url>
<url type="help">https://community.cryptomator.org/</url> <url type="help">https://docs.cryptomator.org/</url>
<url type="translate">https://translate.cryptomator.org</url> <url type="translate">https://translate.cryptomator.org</url>
<developer_name>Skymatic GmbH</developer_name> <developer id="de.skymatic">
<name>Skymatic GmbH</name>
</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-02-07" version="1.12.1"/> <release date="2024-09-17" version="1.14.0">
<release date="2024-02-06" version="1.12.0"/> <url type="details">https://github.com/cryptomator/cryptomator/releases/1.14.0</url>
<release date="2023-12-05" version="1.11.1"/> </release>
<release date="2023-11-08" version="1.11.0"/> <release date="2024-06-26" version="1.13.0">
<release date="2023-09-20" version="1.10.1"/> <url type="details">https://github.com/cryptomator/cryptomator/releases/1.13.0</url>
<release date="2023-09-11" version="1.10.0"/> </release>
<release date="2023-08-11" version="1.9.4"/> <release date="2024-03-27" version="1.12.4">
<release date="2023-08-07" version="1.9.3"/> <url type="details">https://github.com/cryptomator/cryptomator/releases/1.12.4</url>
<release date="2023-07-24" version="1.9.2"/> </release>
<release date="2023-06-07" version="1.9.1"/> <release date="2024-02-27" version="1.12.3">
<release date="2023-05-30" version="1.9.0"/> <url type="details">https://github.com/cryptomator/cryptomator/releases/1.12.3</url>
<release date="2023-04-25" version="1.8.0"/> </release>
<release date="2023-04-07" version="1.7.5"/> <release date="2024-02-09" version="1.12.2">
<release date="2023-04-05" version="1.7.4"/> <url type="details">https://github.com/cryptomator/cryptomator/releases/1.12.2</url>
<release date="2023-03-15" version="1.7.3"/> </release>
<release date="2023-03-07" version="1.7.2"/> <release date="2024-02-07" version="1.12.1">
<release date="2023-03-03" version="1.7.1"/> <url type="details">https://github.com/cryptomator/cryptomator/releases/1.12.1</url>
<release date="2023-03-01" version="1.7.0"/> </release>
<release date="2022-12-14" version="1.6.17"/> <release date="2024-02-06" version="1.12.0">
<release date="2022-12-06" version="1.6.16"/> <url type="details">https://github.com/cryptomator/cryptomator/releases/1.12.0</url>
<release date="2022-10-06" version="1.6.15"/> </release>
<release date="2022-08-31" version="1.6.14"/> <release date="2023-12-05" version="1.11.1">
<release date="2022-07-27" version="1.6.12"/> <url type="details">https://github.com/cryptomator/cryptomator/releases/1.11.1</url>
<release date="2022-07-26" version="1.6.11"/> </release>
<release date="2022-05-03" version="1.6.10"/> <release date="2023-11-08" version="1.11.0">
<release date="2022-04-27" version="1.6.9"/> <url type="details">https://github.com/cryptomator/cryptomator/releases/1.11.0</url>
<release date="2022-03-30" version="1.6.8"/> </release>
<release date="2021-12-16" version="1.6.5"/> <release date="2023-09-20" version="1.10.1">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.10.1</url>
</release>
<release date="2023-09-11" version="1.10.0">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.10.0</url>
</release>
<release date="2023-08-11" version="1.9.4">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.9.4</url>
</release>
<release date="2023-08-07" version="1.9.3">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.9.3</url>
</release>
<release date="2023-07-24" version="1.9.2">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.9.2</url>
</release>
<release date="2023-06-07" version="1.9.1">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.9.1</url>
</release>
<release date="2023-05-30" version="1.9.0">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.9.0</url>
</release>
<release date="2023-04-25" version="1.8.0">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.8.0</url>
</release>
<release date="2023-04-07" version="1.7.5">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.7.5</url>
</release>
<release date="2023-04-05" version="1.7.4">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.7.4</url>
</release>
<release date="2023-03-15" version="1.7.3">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.7.3</url>
</release>
<release date="2023-03-07" version="1.7.2">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.7.2</url>
</release>
<release date="2023-03-03" version="1.7.1">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.7.1</url>
</release>
<release date="2023-03-01" version="1.7.0">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.7.0</url>
</release>
<release date="2022-12-14" version="1.6.17">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.6.17</url>
</release>
<release date="2022-12-06" version="1.6.16">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.6.16</url>
</release>
<release date="2022-10-06" version="1.6.15">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.6.15</url>
</release>
<release date="2022-08-31" version="1.6.14">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.6.14</url>
</release>
<release date="2022-07-27" version="1.6.12">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.6.12</url>
</release>
<release date="2022-07-26" version="1.6.11">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.6.11</url>
</release>
<release date="2022-05-03" version="1.6.10">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.6.10</url>
</release>
<release date="2022-04-27" version="1.6.9">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.6.9</url>
</release>
<release date="2022-03-30" version="1.6.8">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.6.8</url>
</release>
<release date="2021-12-16" version="1.6.5">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.6.5</url>
</release>
</releases> </releases>
</component> </component>
+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), libgtk2.0-0, 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
+3 -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,java.compiler \
--strip-native-commands \ --strip-native-commands \
--no-header-files \ --no-header-files \
--no-man-pages \ --no-man-pages \
@@ -61,6 +61,7 @@ override_dh_auto_build:
--java-options "-Dcryptomator.buildNumber=\"deb-${REVISION_NUM}\"" \ --java-options "-Dcryptomator.buildNumber=\"deb-${REVISION_NUM}\"" \
--java-options "-Dcryptomator.appVersion=\"${SEMVER_STR}\"" \ --java-options "-Dcryptomator.appVersion=\"${SEMVER_STR}\"" \
--java-options "-Dcryptomator.disableUpdateCheck=\"${DISABLE_UPDATE_CHECK}\"" \ --java-options "-Dcryptomator.disableUpdateCheck=\"${DISABLE_UPDATE_CHECK}\"" \
--java-options "-Dcryptomator.integrationsLinux.autoStartCmd=\"cryptomator\"" \
--app-version "${VERSION_NUM}.${REVISION_NUM}" \ --app-version "${VERSION_NUM}.${REVISION_NUM}" \
--resource-dir resources \ --resource-dir resources \
--verbose --verbose
-14
View File
@@ -1,14 +0,0 @@
java-options=-Xss5m \
-Xmx256m \
--enable-preview \
--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64 \
-Dfile.encoding=\"utf-8\" \
-Dcryptomator.appVersion=\"${SEMVER_STR}\" \
-Dcryptomator.logDir=\"~/.local/share/Cryptomator/logs\" \
-Dcryptomator.pluginDir=\"~/.local/share/Cryptomator/plugins\" \
-Dcryptomator.settingsPath=\"~/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json\" \
-Dcryptomator.ipcSocketPath=\"~/.config/Cryptomator/ipc.socket\" \
-Dcryptomator.mountPointsDir=\"~/.local/share/Cryptomator/mnt\" \
-Dcryptomator.showTrayIcon=false \
-Dcryptomator.buildNumber=\"appimage-${REVISION_NUM}\" \
-Djdk.gtk.version=2
+1
View File
@@ -0,0 +1 @@
embedded.provisionprofile
+8
View File
@@ -2,6 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>com.apple.application-identifier</key>
<string>###APP_IDENTIFIER_PREFIX###org.cryptomator</string>
<key>com.apple.developer.team-identifier</key>
<string>###TEAM_IDENTIFIER###</string>
<key>com.apple.security.cs.allow-jit</key> <key>com.apple.security.cs.allow-jit</key>
<true/> <true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key> <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
@@ -10,5 +14,9 @@
<true/> <true/>
<key>com.apple.security.cs.disable-library-validation</key> <key>com.apple.security.cs.disable-library-validation</key>
<true/> <true/>
<key>keychain-access-groups</key>
<array>
<string>###APP_IDENTIFIER_PREFIX###org.cryptomator</string>
</array>
</dict> </dict>
</plist> </plist>
+5 -2
View File
@@ -1,6 +1,9 @@
# 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
Cryptomator.entitlements
+28 -12
View File
@@ -1,12 +1,15 @@
#!/bin/bash #!/bin/bash
# parse options # parse options
usage() { echo "Usage: $0 [-s <codesign-identity>]" 1>&2; exit 1; } usage() { echo "Usage: $0 [-s <codesign-identity>] [-t <team-identifier>]" 1>&2; exit 1; }
while getopts ":s:" o; do while getopts ":s:t:" o; do
case "${o}" in case "${o}" in
s) s)
CODESIGN_IDENTITY=${OPTARG} CODESIGN_IDENTITY=${OPTARG}
;; ;;
t)
TEAM_IDENTIFIER=${OPTARG}
;;
*) *)
usage usage
;; ;;
@@ -29,13 +32,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_VERSION=22.0.2
JAVAFX_ARCH="undefined"
JAVAFX_JMODS_SHA256="undefined"
if [ "$(machine)" = "arm64e" ]; then if [ "$(machine)" = "arm64e" ]; then
ARCH="aarch64" JAVAFX_ARCH="aarch64"
JAVAFX_JMODS_SHA256="813c6748f7c99cb7a579d48b48a087b4682b1fad1fc1a4fe5f9b21cf872b15a7"
else else
ARCH="x64" JAVAFX_ARCH="x64"
JAVAFX_JMODS_SHA256="115cb08bb59d880cfff6e51e0bf0dcc45785ed9d456b8b8425597b04da6ab3d4"
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 +54,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 +71,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 +79,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,java.compiler \
--strip-native-commands \ --strip-native-commands \
--no-header-files \ --no-header-files \
--no-man-pages \ --no-man-pages \
@@ -116,9 +124,10 @@ ${JAVA_HOME}/bin/jpackage \
cp ../resources/${APP_NAME}-Vault.icns ${APP_NAME}.app/Contents/Resources/ cp ../resources/${APP_NAME}-Vault.icns ${APP_NAME}.app/Contents/Resources/
sed -i '' "s|###BUNDLE_SHORT_VERSION_STRING###|${VERSION_NO}|g" ${APP_NAME}.app/Contents/Info.plist sed -i '' "s|###BUNDLE_SHORT_VERSION_STRING###|${VERSION_NO}|g" ${APP_NAME}.app/Contents/Info.plist
sed -i '' "s|###BUNDLE_VERSION###|${REVISION_NO}|g" ${APP_NAME}.app/Contents/Info.plist sed -i '' "s|###BUNDLE_VERSION###|${REVISION_NO}|g" ${APP_NAME}.app/Contents/Info.plist
cp ../embedded.provisionprofile ${APP_NAME}.app/Contents/
# generate license # generate license
mvn -B -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 \
@@ -128,7 +137,11 @@ mvn -B -f../../../pom.xml license:add-third-party \
-Dlicense.licenseMergesUrl=file://$(pwd)/../../../license/merges -Dlicense.licenseMergesUrl=file://$(pwd)/../../../license/merges
# codesign # codesign
if [ -n "${CODESIGN_IDENTITY}" ]; then if [ -n "${CODESIGN_IDENTITY}" ] && [ -n "${TEAM_IDENTIFIER}" ]; then
echo "Codesigning jdk files..."
find ${APP_NAME}.app/Contents/runtime/Contents/Home/lib/ -name '*.dylib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \;
find ${APP_NAME}.app/Contents/runtime/Contents/Home/lib/ -name 'jspawnhelper' -exec codesign --force -o runtime -s ${CODESIGN_IDENTITY} {} \;
echo "Codesigning jar contents..."
find ${APP_NAME}.app/Contents/runtime/Contents/MacOS -name '*.dylib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \; find ${APP_NAME}.app/Contents/runtime/Contents/MacOS -name '*.dylib' -exec codesign --force -s ${CODESIGN_IDENTITY} {} \;
for JAR_PATH in `find ${APP_NAME}.app -name "*.jar"`; do for JAR_PATH in `find ${APP_NAME}.app -name "*.jar"`; do
if [[ `unzip -l ${JAR_PATH} | grep '.dylib\|.jnilib'` ]]; then if [[ `unzip -l ${JAR_PATH} | grep '.dylib\|.jnilib'` ]]; then
@@ -146,7 +159,10 @@ if [ -n "${CODESIGN_IDENTITY}" ]; then
fi fi
done done
echo "Codesigning ${APP_NAME}.app..." echo "Codesigning ${APP_NAME}.app..."
codesign --force --deep --entitlements ../${APP_NAME}.entitlements -o runtime -s ${CODESIGN_IDENTITY} ${APP_NAME}.app cp ../${APP_NAME}.entitlements .
sed -i '' "s|###APP_IDENTIFIER_PREFIX###|${TEAM_IDENTIFIER}.|g" ${APP_NAME}.entitlements
sed -i '' "s|###TEAM_IDENTIFIER###|${TEAM_IDENTIFIER}|g" ${APP_NAME}.entitlements
codesign --force --deep --entitlements ${APP_NAME}.entitlements -o runtime -s ${CODESIGN_IDENTITY} ${APP_NAME}.app
fi fi
# prepare dmg contents # prepare dmg contents
+1 -1
View File
@@ -3,7 +3,7 @@
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>10.13.0</string> <string>11</string>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>English</string> <string>English</string>
<key>CFBundleAllowMixedLocalizations</key> <key>CFBundleAllowMixedLocalizations</key>
+1
View File
@@ -6,4 +6,5 @@ installer
*.msi *.msi
*.exe *.exe
*.jmod *.jmod
resources/jfxJmods.zip
license.rtf license.rtf
+18 -17
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.2'
$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 = 'f9376d200f5c5b85327d575c1ec1482e6455f19916577f7e2fc9be2f48bb29b6'
$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,java.compiler,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 `
@@ -99,7 +100,7 @@ if ($clean -and (Test-Path -Path $appPath)) {
--vendor $Vendor ` --vendor $Vendor `
--copyright $copyright ` --copyright $copyright `
--java-options "--enable-preview" ` --java-options "--enable-preview" `
--java-options "--enable-native-access=org.cryptomator.jfuse.win" ` --java-options "--enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win" `
--java-options "-Xss5m" ` --java-options "-Xss5m" `
--java-options "-Xmx256m" ` --java-options "-Xmx256m" `
--java-options "-Dcryptomator.appVersion=`"$semVerNo`"" ` --java-options "-Dcryptomator.appVersion=`"$semVerNo`"" `
@@ -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\" `
@@ -181,7 +182,7 @@ Write-Output "Downloading ${winfspMsiUrl}..."
Invoke-WebRequest $winfspMsiUrl -OutFile ".\bundle\resources\winfsp.msi" # redirects are followed by default Invoke-WebRequest $winfspMsiUrl -OutFile ".\bundle\resources\winfsp.msi" # redirects are followed by default
# download legacy-winfsp uninstaller # download legacy-winfsp uninstaller
$winfspUninstaller= 'https://github.com/cryptomator/winfsp-uninstaller/releases/download/1.0.0/winfsp-uninstaller.exe' $winfspUninstaller= 'https://github.com/cryptomator/winfsp-uninstaller/releases/latest/download/winfsp-uninstaller.exe'
Write-Output "Downloading ${winfspUninstaller}..." Write-Output "Downloading ${winfspUninstaller}..."
Invoke-WebRequest $winfspUninstaller -OutFile ".\bundle\resources\winfsp-uninstaller.exe" # redirects are followed by default Invoke-WebRequest $winfspUninstaller -OutFile ".\bundle\resources\winfsp-uninstaller.exe" # redirects are followed by default
-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>
+40 -34
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.1</version> <version>1.14.1</version>
<name>Cryptomator Desktop App</name> <name>Cryptomator Desktop App</name>
<organization> <organization>
@@ -26,56 +26,60 @@
<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) -->
<nonModularGroupIds>org.ow2.asm,org.apache.jackrabbit,org.apache.httpcomponents</nonModularGroupIds> <nonModularGroupIds>org.ow2.asm,org.apache.jackrabbit,org.apache.httpcomponents</nonModularGroupIds>
<!-- cryptomator dependencies --> <!-- cryptomator dependencies -->
<cryptomator.cryptofs.version>2.6.8</cryptomator.cryptofs.version> <cryptomator.cryptofs.version>2.7.1-beta1</cryptomator.cryptofs.version>
<cryptomator.integrations.version>1.3.0</cryptomator.integrations.version> <cryptomator.integrations.version>1.4.0</cryptomator.integrations.version>
<cryptomator.integrations.win.version>1.2.5</cryptomator.integrations.win.version> <cryptomator.integrations.win.version>1.3.0</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.3</cryptomator.integrations.linux.version> <cryptomator.integrations.linux.version>1.5.1</cryptomator.integrations.linux.version>
<cryptomator.fuse.version>4.0.0</cryptomator.fuse.version> <cryptomator.fuse.version>5.0.2</cryptomator.fuse.version>
<cryptomator.dokany.version>2.0.0</cryptomator.dokany.version> <cryptomator.webdav.version>2.0.7</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.16.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.3.0-jre</guava.version>
<jackson.version>2.16.1</jackson.version> <jackson.version>2.17.2</jackson.version>
<javafx.version>21.0.1</javafx.version> <javafx.version>22.0.2</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.4.14</logback.version> <logback.version>1.5.7</logback.version>
<slf4j.version>2.0.11</slf4j.version> <slf4j.version>2.0.16</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.11.0</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>3.0</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>10.0.3</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.3.0</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.1</mvn-dependency.version>
<mvn-surefire.version>3.2.5</mvn-surefire.version> <mvn-surefire.version>3.4.0</mvn-surefire.version>
<mvn-jar.version>3.3.0</mvn-jar.version> <mvn-jar.version>3.4.2</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>
@@ -465,7 +471,7 @@
<skipTestScope>true</skipTestScope> <skipTestScope>true</skipTestScope>
<detail>true</detail> <detail>true</detail>
<suppressionFile>suppression.xml</suppressionFile> <suppressionFile>suppression.xml</suppressionFile>
<nvdApiKey>${env.NVD_API_KEY}</nvdApiKey> <nvdApiKeyEnvironmentVariable>NVD_API_KEY</nvdApiKeyEnvironmentVariable>
</configuration> </configuration>
<executions> <executions>
<execution> <execution>
+2 -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,17 +31,18 @@ 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;
requires dagger; requires dagger;
requires java.compiler;
requires io.github.coffeelibs.tinyoauth2client; requires io.github.coffeelibs.tinyoauth2client;
requires org.slf4j; requires org.slf4j;
requires org.apache.commons.lang3; requires org.apache.commons.lang3;
@@ -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);
} }
} }
@@ -44,7 +44,7 @@ public class KeychainManager implements KeychainAccessProvider {
} }
@Override @Override
public void storePassphrase(String key, String displayName, CharSequence passphrase) throws KeychainAccessException { public void storePassphrase(String key, String displayName, CharSequence passphrase, boolean ignored) throws KeychainAccessException {
getKeychainOrFail().storePassphrase(key, displayName, passphrase); getKeychainOrFail().storePassphrase(key, displayName, passphrase);
setPassphraseStored(key, true); setPassphraseStored(key, true);
} }
@@ -7,6 +7,8 @@ import org.cryptomator.integrations.mount.Mount;
import org.cryptomator.integrations.mount.MountBuilder; import org.cryptomator.integrations.mount.MountBuilder;
import org.cryptomator.integrations.mount.MountFailedException; import org.cryptomator.integrations.mount.MountFailedException;
import org.cryptomator.integrations.mount.MountService; import org.cryptomator.integrations.mount.MountService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
@@ -28,6 +30,8 @@ import static org.cryptomator.integrations.mount.MountCapability.UNMOUNT_FORCED;
@Singleton @Singleton
public class Mounter { public class Mounter {
private static final Logger LOG = LoggerFactory.getLogger(Mounter.class);
// mount providers (key) can not be used if any of the conflicting mount providers (values) are already in use // mount providers (key) can not be used if any of the conflicting mount providers (values) are already in use
private static final Map<String, Set<String>> CONFLICTING_MOUNT_SERVICES = Map.of( private static final Map<String, Set<String>> CONFLICTING_MOUNT_SERVICES = Map.of(
"org.cryptomator.frontend.fuse.mount.MacFuseMountProvider", Set.of("org.cryptomator.frontend.fuse.mount.FuseTMountProvider"), "org.cryptomator.frontend.fuse.mount.MacFuseMountProvider", Set.of("org.cryptomator.frontend.fuse.mount.FuseTMountProvider"),
@@ -127,9 +131,7 @@ public class Mounter {
} }
} else if (canMountToParent && !canMountToDir) { } else if (canMountToParent && !canMountToDir) {
MountWithinParentUtil.prepareParentNoMountPoint(userChosenMountPoint); MountWithinParentUtil.prepareParentNoMountPoint(userChosenMountPoint);
cleanup = () -> { cleanup = () -> MountWithinParentUtil.cleanup(userChosenMountPoint);
MountWithinParentUtil.cleanup(userChosenMountPoint);
};
} }
try { try {
builder.setMountpoint(userChosenMountPoint); builder.setMountpoint(userChosenMountPoint);
@@ -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 {
@@ -36,16 +37,21 @@ public class Settings {
static final boolean DEFAULT_START_HIDDEN = false; static final boolean DEFAULT_START_HIDDEN = false;
static final boolean DEFAULT_AUTO_CLOSE_VAULTS = false; static final boolean DEFAULT_AUTO_CLOSE_VAULTS = false;
static final boolean DEFAULT_USE_KEYCHAIN = true; static final boolean DEFAULT_USE_KEYCHAIN = true;
static final boolean DEFAULT_USE_QUICKACCESS = true;
static final int DEFAULT_PORT = 42427; static final int DEFAULT_PORT = 42427;
static final int DEFAULT_NUM_TRAY_NOTIFICATIONS = 3; static final int DEFAULT_NUM_TRAY_NOTIFICATIONS = 3;
static final boolean DEFAULT_DEBUG_MODE = false; static final boolean DEFAULT_DEBUG_MODE = false;
static final UiTheme DEFAULT_THEME = UiTheme.LIGHT; static final UiTheme DEFAULT_THEME = UiTheme.LIGHT;
@Deprecated // to be changed to "whatever is available" eventually @Deprecated // to be changed to "whatever is available" eventually
static final String DEFAULT_KEYCHAIN_PROVIDER = SystemUtils.IS_OS_WINDOWS ? "org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess" : 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_QUICKACCESS_SERVICE = SystemUtils.IS_OS_WINDOWS ? "org.cryptomator.windows.quickaccess.ExplorerQuickAccessService" : //
SystemUtils.IS_OS_LINUX ? "org.cryptomator.linux.quickaccess.NautilusBookmarks" : null;
static final String DEFAULT_USER_INTERFACE_ORIENTATION = NodeOrientation.LEFT_TO_RIGHT.name(); static final String DEFAULT_USER_INTERFACE_ORIENTATION = NodeOrientation.LEFT_TO_RIGHT.name();
static final boolean DEFAULT_SHOW_MINIMIZE_BUTTON = false; static final boolean DEFAULT_SHOW_MINIMIZE_BUTTON = false;
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 BooleanProperty askedForUpdateCheck; public final BooleanProperty askedForUpdateCheck;
public final BooleanProperty checkForUpdates; public final BooleanProperty checkForUpdates;
@@ -57,6 +63,8 @@ public class Settings {
public final BooleanProperty debugMode; public final BooleanProperty debugMode;
public final ObjectProperty<UiTheme> theme; public final ObjectProperty<UiTheme> theme;
public final StringProperty keychainProvider; public final StringProperty keychainProvider;
public final BooleanProperty useQuickAccess;
public final StringProperty quickAccessService;
public final ObjectProperty<NodeOrientation> userInterfaceOrientation; public final ObjectProperty<NodeOrientation> userInterfaceOrientation;
public final StringProperty licenseKey; public final StringProperty licenseKey;
public final BooleanProperty showMinimizeButton; public final BooleanProperty showMinimizeButton;
@@ -67,7 +75,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;
@@ -89,6 +97,7 @@ public class Settings {
this.startHidden = new SimpleBooleanProperty(this, "startHidden", json.startHidden); this.startHidden = new SimpleBooleanProperty(this, "startHidden", json.startHidden);
this.autoCloseVaults = new SimpleBooleanProperty(this, "autoCloseVaults", json.autoCloseVaults); this.autoCloseVaults = new SimpleBooleanProperty(this, "autoCloseVaults", json.autoCloseVaults);
this.useKeychain = new SimpleBooleanProperty(this, "useKeychain", json.useKeychain); this.useKeychain = new SimpleBooleanProperty(this, "useKeychain", json.useKeychain);
this.useQuickAccess = new SimpleBooleanProperty(this, "addToQuickAccess", json.useQuickAccess);
this.port = new SimpleIntegerProperty(this, "webDavPort", json.port); this.port = new SimpleIntegerProperty(this, "webDavPort", json.port);
this.numTrayNotifications = new SimpleIntegerProperty(this, "numTrayNotifications", json.numTrayNotifications); this.numTrayNotifications = new SimpleIntegerProperty(this, "numTrayNotifications", json.numTrayNotifications);
this.debugMode = new SimpleBooleanProperty(this, "debugMode", json.debugMode); this.debugMode = new SimpleBooleanProperty(this, "debugMode", json.debugMode);
@@ -104,7 +113,8 @@ 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.quickAccessService = new SimpleStringProperty(this, "quickAccessService", json.quickAccessService);
this.lastSuccessfulUpdateCheck = new SimpleObjectProperty<>(this, "lastSuccessfulUpdateCheck", json.lastSuccessfulUpdateCheck);
this.directories.addAll(json.directories.stream().map(VaultSettings::new).toList()); this.directories.addAll(json.directories.stream().map(VaultSettings::new).toList());
@@ -116,6 +126,7 @@ public class Settings {
startHidden.addListener(this::somethingChanged); startHidden.addListener(this::somethingChanged);
autoCloseVaults.addListener(this::somethingChanged); autoCloseVaults.addListener(this::somethingChanged);
useKeychain.addListener(this::somethingChanged); useKeychain.addListener(this::somethingChanged);
useQuickAccess.addListener(this::somethingChanged);
port.addListener(this::somethingChanged); port.addListener(this::somethingChanged);
numTrayNotifications.addListener(this::somethingChanged); numTrayNotifications.addListener(this::somethingChanged);
debugMode.addListener(this::somethingChanged); debugMode.addListener(this::somethingChanged);
@@ -131,7 +142,8 @@ 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); quickAccessService.addListener(this::somethingChanged);
lastSuccessfulUpdateCheck.addListener(this::somethingChanged);
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@@ -170,6 +182,7 @@ public class Settings {
json.startHidden = startHidden.get(); json.startHidden = startHidden.get();
json.autoCloseVaults = autoCloseVaults.get(); json.autoCloseVaults = autoCloseVaults.get();
json.useKeychain = useKeychain.get(); json.useKeychain = useKeychain.get();
json.useQuickAccess = useQuickAccess.get();
json.port = port.get(); json.port = port.get();
json.numTrayNotifications = numTrayNotifications.get(); json.numTrayNotifications = numTrayNotifications.get();
json.debugMode = debugMode.get(); json.debugMode = debugMode.get();
@@ -185,7 +198,8 @@ 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.quickAccessService = quickAccessService.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)
@@ -80,7 +82,13 @@ 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;
@JsonProperty("useQuickAccess")
boolean useQuickAccess = Settings.DEFAULT_USE_QUICKACCESS;
@JsonProperty("quickAccessService")
String quickAccessService = Settings.DEFAULT_QUICKACCESS_SERVICE;
} }
@@ -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;
@@ -57,7 +58,10 @@ public class SettingsProvider implements Supplier<Settings> {
} }
private Settings load() { private Settings load() {
Settings settings = env.getSettingsPath().flatMap(this::tryLoad).findFirst().orElseGet(() -> Settings.create(env)); Settings settings = env.getSettingsPath() //
.flatMap(this::tryLoad) //
.findFirst() //
.orElseGet(() -> Settings.create(env));
settings.setSaveCmd(this::scheduleSave); settings.setSaveCmd(this::scheduleSave);
return settings; return settings;
} }
@@ -11,6 +11,7 @@ package org.cryptomator.common.vaults;
import org.apache.commons.lang3.SystemUtils; import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.Constants; import org.cryptomator.common.Constants;
import org.cryptomator.common.mount.Mounter; import org.cryptomator.common.mount.Mounter;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.cryptofs.CryptoFileSystem; import org.cryptomator.cryptofs.CryptoFileSystem;
import org.cryptomator.cryptofs.CryptoFileSystemProperties; import org.cryptomator.cryptofs.CryptoFileSystemProperties;
@@ -23,6 +24,9 @@ import org.cryptomator.cryptolib.api.MasterkeyLoadingFailedException;
import org.cryptomator.integrations.mount.MountFailedException; import org.cryptomator.integrations.mount.MountFailedException;
import org.cryptomator.integrations.mount.Mountpoint; import org.cryptomator.integrations.mount.Mountpoint;
import org.cryptomator.integrations.mount.UnmountFailedException; import org.cryptomator.integrations.mount.UnmountFailedException;
import org.cryptomator.integrations.quickaccess.QuickAccessService;
import org.cryptomator.integrations.quickaccess.QuickAccessServiceException;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -54,6 +58,7 @@ public class Vault {
private final VaultSettings vaultSettings; private final VaultSettings vaultSettings;
private final AtomicReference<CryptoFileSystem> cryptoFileSystem; private final AtomicReference<CryptoFileSystem> cryptoFileSystem;
private final AtomicReference<QuickAccessService.QuickAccessEntry> quickAccessEntry;
private final VaultState state; private final VaultState state;
private final ObjectProperty<Exception> lastKnownException; private final ObjectProperty<Exception> lastKnownException;
private final VaultConfigCache configCache; private final VaultConfigCache configCache;
@@ -67,6 +72,7 @@ public class Vault {
private final BooleanBinding unknownError; private final BooleanBinding unknownError;
private final ObjectBinding<Mountpoint> mountPoint; private final ObjectBinding<Mountpoint> mountPoint;
private final Mounter mounter; private final Mounter mounter;
private final Settings settings;
private final BooleanProperty showingStats; private final BooleanProperty showingStats;
private final AtomicReference<Mounter.MountHandle> mountHandle = new AtomicReference<>(null); private final AtomicReference<Mounter.MountHandle> mountHandle = new AtomicReference<>(null);
@@ -78,7 +84,7 @@ public class Vault {
VaultState state, // VaultState state, //
@Named("lastKnownException") ObjectProperty<Exception> lastKnownException, // @Named("lastKnownException") ObjectProperty<Exception> lastKnownException, //
VaultStats stats, // VaultStats stats, //
Mounter mounter) { Mounter mounter, Settings settings) {
this.vaultSettings = vaultSettings; this.vaultSettings = vaultSettings;
this.configCache = configCache; this.configCache = configCache;
this.cryptoFileSystem = cryptoFileSystem; this.cryptoFileSystem = cryptoFileSystem;
@@ -94,7 +100,9 @@ public class Vault {
this.unknownError = Bindings.createBooleanBinding(this::isUnknownError, state); this.unknownError = Bindings.createBooleanBinding(this::isUnknownError, state);
this.mountPoint = Bindings.createObjectBinding(this::getMountPoint, state); this.mountPoint = Bindings.createObjectBinding(this::getMountPoint, state);
this.mounter = mounter; this.mounter = mounter;
this.settings = settings;
this.showingStats = new SimpleBooleanProperty(false); this.showingStats = new SimpleBooleanProperty(false);
this.quickAccessEntry = new AtomicReference<>(null);
} }
// ****************************************************************************** // ******************************************************************************
@@ -154,6 +162,9 @@ public class Vault {
var rootPath = fs.getRootDirectories().iterator().next(); var rootPath = fs.getRootDirectories().iterator().next();
var mountHandle = mounter.mount(vaultSettings, rootPath); var mountHandle = mounter.mount(vaultSettings, rootPath);
success = this.mountHandle.compareAndSet(null, mountHandle); success = this.mountHandle.compareAndSet(null, mountHandle);
if (settings.useQuickAccess.getValue()) {
addToQuickAccess();
}
} finally { } finally {
if (!success) { if (!success) {
destroyCryptoFileSystem(); destroyCryptoFileSystem();
@@ -178,6 +189,7 @@ public class Vault {
mountHandle.mountObj().close(); mountHandle.mountObj().close();
mountHandle.specialCleanup().run(); mountHandle.specialCleanup().run();
} finally { } finally {
removeFromQuickAccess();
destroyCryptoFileSystem(); destroyCryptoFileSystem();
} }
@@ -185,6 +197,52 @@ public class Vault {
LOG.info("Locked vault '{}'", getDisplayName()); LOG.info("Locked vault '{}'", getDisplayName());
} }
private synchronized void addToQuickAccess() {
if (quickAccessEntry.get() != null) {
//we don't throw an exception since we don't wanna block unlocking
LOG.warn("Vault already added to quick access area. Will be removed on next lock operation.");
return;
}
QuickAccessService.get() //
.filter(s -> s.getClass().getName().equals(settings.quickAccessService.getValue())) //
.findFirst() //
.ifPresentOrElse( //
this::addToQuickAccessInternal, //
() -> LOG.warn("Unable to add Vault to quick access area: Desired implementation not available.") //
);
}
private void addToQuickAccessInternal(@NotNull QuickAccessService s) {
if (getMountPoint() instanceof Mountpoint.WithPath mp) {
try {
var entry = s.add(mp.path(), getDisplayName());
quickAccessEntry.set(entry);
} catch (QuickAccessServiceException e) {
LOG.error("Adding vault to quick access area failed", e);
}
} else {
LOG.warn("Unable to add vault to quick access area: Vault is not mounted to local system path.");
}
}
private synchronized void removeFromQuickAccess() {
if (quickAccessEntry.get() == null) {
LOG.debug("Removing vault from quick access area: Entry not found, nothing to do.");
return;
}
removeFromQuickAccessInternal();
}
private void removeFromQuickAccessInternal() {
try {
quickAccessEntry.get().remove();
quickAccessEntry.set(null);
} catch (QuickAccessServiceException e) {
LOG.error("Removing vault from quick access area failed", e);
}
}
// ****************************************************************************** // ******************************************************************************
// Observable Properties // Observable Properties
// ******************************************************************************* // *******************************************************************************
@@ -8,11 +8,13 @@
*******************************************************************************/ *******************************************************************************/
package org.cryptomator.common.vaults; package org.cryptomator.common.vaults;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.cryptofs.CryptoFileSystemProvider; import org.cryptomator.cryptofs.CryptoFileSystemProvider;
import org.cryptomator.cryptofs.DirStructure; import org.cryptomator.cryptofs.DirStructure;
import org.cryptomator.cryptofs.migration.Migrators; import org.cryptomator.cryptofs.migration.Migrators;
import org.cryptomator.integrations.mount.MountService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -24,6 +26,7 @@ import java.nio.file.Files;
import java.nio.file.NoSuchFileException; import java.nio.file.NoSuchFileException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.ResourceBundle; import java.util.ResourceBundle;
@@ -38,14 +41,21 @@ public class VaultListManager {
private static final Logger LOG = LoggerFactory.getLogger(VaultListManager.class); private static final Logger LOG = LoggerFactory.getLogger(VaultListManager.class);
private final AutoLocker autoLocker; private final AutoLocker autoLocker;
private final List<MountService> mountServices;
private final VaultComponent.Factory vaultComponentFactory; private final VaultComponent.Factory vaultComponentFactory;
private final ObservableList<Vault> vaultList; private final ObservableList<Vault> vaultList;
private final String defaultVaultName; private final String defaultVaultName;
@Inject @Inject
public VaultListManager(ObservableList<Vault> vaultList, AutoLocker autoLocker, VaultComponent.Factory vaultComponentFactory, ResourceBundle resourceBundle, Settings settings) { public VaultListManager(ObservableList<Vault> vaultList, //
AutoLocker autoLocker, //
List<MountService> mountServices,
VaultComponent.Factory vaultComponentFactory,
ResourceBundle resourceBundle,
Settings settings) {
this.vaultList = vaultList; this.vaultList = vaultList;
this.autoLocker = autoLocker; this.autoLocker = autoLocker;
this.mountServices = mountServices;
this.vaultComponentFactory = vaultComponentFactory; this.vaultComponentFactory = vaultComponentFactory;
this.defaultVaultName = resourceBundle.getString("defaults.vault.vaultName"); this.defaultVaultName = resourceBundle.getString("defaults.vault.vaultName");
@@ -76,6 +86,15 @@ public class VaultListManager {
} else { } else {
vaultSettings.displayName.set(defaultVaultName); vaultSettings.displayName.set(defaultVaultName);
} }
//due to https://github.com/cryptomator/cryptomator/issues/2880#issuecomment-1680313498
var nameOfWinfspLocalMounter = "org.cryptomator.frontend.fuse.mount.WinFspMountProvider";
if (SystemUtils.IS_OS_WINDOWS //
&& vaultSettings.path.get().toString().contains("Dropbox") //
&& mountServices.stream().anyMatch(s -> s.getClass().getName().equals(nameOfWinfspLocalMounter))) {
vaultSettings.mountService.setValue(nameOfWinfspLocalMounter);
}
return vaultSettings; return vaultSettings;
} }
@@ -13,31 +13,37 @@ import org.slf4j.LoggerFactory;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import javafx.application.Platform;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding; import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty; import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.StringProperty; import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.RadioButton; import javafx.scene.control.RadioButton;
import javafx.scene.control.Toggle; import javafx.scene.control.Toggle;
import javafx.scene.control.ToggleGroup; import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.stage.DirectoryChooser; import javafx.stage.DirectoryChooser;
import javafx.stage.Stage; import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.nio.file.StandardOpenOption; import java.nio.file.StandardOpenOption;
import java.util.Comparator;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.concurrent.ExecutorService;
@AddVaultWizardScoped @AddVaultWizardScoped
public class CreateNewVaultLocationController implements FxController { public class CreateNewVaultLocationController implements FxController {
@@ -49,19 +55,23 @@ public class CreateNewVaultLocationController implements FxController {
private final Stage window; private final Stage window;
private final Lazy<Scene> chooseNameScene; private final Lazy<Scene> chooseNameScene;
private final Lazy<Scene> chooseExpertSettingsScene; private final Lazy<Scene> chooseExpertSettingsScene;
private final List<RadioButton> locationPresetBtns;
private final ObjectProperty<Path> vaultPath; private final ObjectProperty<Path> vaultPath;
private final StringProperty vaultName; private final StringProperty vaultName;
private final ExecutorService backgroundExecutor;
private final ResourceBundle resourceBundle; private final ResourceBundle resourceBundle;
private final ObservableValue<VaultPathStatus> vaultPathStatus; private final ObservableValue<VaultPathStatus> vaultPathStatus;
private final ObservableValue<Boolean> validVaultPath; private final ObservableValue<Boolean> validVaultPath;
private final BooleanProperty usePresetPath; private final BooleanProperty usePresetPath;
private final BooleanProperty loadingPresetLocations = new SimpleBooleanProperty(false);
private final ObservableList<Node> radioButtons;
private final ObservableList<Node> sortedRadioButtons;
private Path customVaultPath = DEFAULT_CUSTOM_VAULT_PATH; private Path customVaultPath = DEFAULT_CUSTOM_VAULT_PATH;
//FXML //FXML
public ToggleGroup locationPresetsToggler; public ToggleGroup locationPresetsToggler;
public VBox radioButtonVBox; public VBox radioButtonVBox;
public HBox customLocationRadioBtn;
public RadioButton customRadioButton; public RadioButton customRadioButton;
public Label locationStatusLabel; public Label locationStatusLabel;
public FontAwesome5IconView goodLocation; public FontAwesome5IconView goodLocation;
@@ -73,25 +83,20 @@ public class CreateNewVaultLocationController implements FxController {
@FxmlScene(FxmlFile.ADDVAULT_NEW_EXPERT_SETTINGS) Lazy<Scene> chooseExpertSettingsScene, // @FxmlScene(FxmlFile.ADDVAULT_NEW_EXPERT_SETTINGS) Lazy<Scene> chooseExpertSettingsScene, //
ObjectProperty<Path> vaultPath, // ObjectProperty<Path> vaultPath, //
@Named("vaultName") StringProperty vaultName, // @Named("vaultName") StringProperty vaultName, //
ResourceBundle resourceBundle) { ExecutorService backgroundExecutor, ResourceBundle resourceBundle) {
this.window = window; this.window = window;
this.chooseNameScene = chooseNameScene; this.chooseNameScene = chooseNameScene;
this.chooseExpertSettingsScene = chooseExpertSettingsScene; this.chooseExpertSettingsScene = chooseExpertSettingsScene;
this.vaultPath = vaultPath; this.vaultPath = vaultPath;
this.vaultName = vaultName; this.vaultName = vaultName;
this.backgroundExecutor = backgroundExecutor;
this.resourceBundle = resourceBundle; this.resourceBundle = resourceBundle;
this.vaultPathStatus = ObservableUtil.mapWithDefault(vaultPath, this::validatePath, new VaultPathStatus(false, "error.message")); this.vaultPathStatus = ObservableUtil.mapWithDefault(vaultPath, this::validatePath, new VaultPathStatus(false, "error.message"));
this.validVaultPath = ObservableUtil.mapWithDefault(vaultPathStatus, VaultPathStatus::valid, false); this.validVaultPath = ObservableUtil.mapWithDefault(vaultPathStatus, VaultPathStatus::valid, false);
this.vaultPathStatus.addListener(this::updateStatusLabel); this.vaultPathStatus.addListener(this::updateStatusLabel);
this.usePresetPath = new SimpleBooleanProperty(); this.usePresetPath = new SimpleBooleanProperty();
this.locationPresetBtns = LocationPresetsProvider.loadAll(LocationPresetsProvider.class) // this.radioButtons = FXCollections.observableArrayList();
.flatMap(LocationPresetsProvider::getLocations) // this.sortedRadioButtons = radioButtons.sorted(this::compareLocationPresets);
.sorted(Comparator.comparing(LocationPreset::name)) //
.map(preset -> { //
var btn = new RadioButton(preset.name());
btn.setUserData(preset.path());
return btn;
}).toList();
} }
private VaultPathStatus validatePath(Path p) throws NullPointerException { private VaultPathStatus validatePath(Path p) throws NullPointerException {
@@ -137,12 +142,45 @@ public class CreateNewVaultLocationController implements FxController {
@FXML @FXML
public void initialize() { public void initialize() {
radioButtonVBox.getChildren().addAll(1, locationPresetBtns); //first item is the list header var task = backgroundExecutor.submit(this::loadLocationPresets);
locationPresetsToggler.getToggles().addAll(locationPresetBtns); window.addEventHandler(WindowEvent.WINDOW_HIDING, _ -> task.cancel(true));
locationPresetsToggler.selectedToggleProperty().addListener(this::togglePredefinedLocation); locationPresetsToggler.selectedToggleProperty().addListener(this::togglePredefinedLocation);
usePresetPath.bind(locationPresetsToggler.selectedToggleProperty().isNotEqualTo(customRadioButton)); usePresetPath.bind(locationPresetsToggler.selectedToggleProperty().isNotEqualTo(customRadioButton));
radioButtons.add(customLocationRadioBtn);
Bindings.bindContent(radioButtonVBox.getChildren(), sortedRadioButtons); //to prevent garbage collection of the binding, we bind explicitly to the sorted list
} }
private void loadLocationPresets() {
Platform.runLater(() -> loadingPresetLocations.set(true));
try {
LocationPresetsProvider.loadAll(LocationPresetsProvider.class) //
.flatMap(LocationPresetsProvider::getLocations) //we do not use sorted(), because it evaluates the stream elements, blocking until all elements are gathered
.forEach(this::createRadioButtonFor);
} finally {
Platform.runLater(() -> loadingPresetLocations.set(false));
}
}
private void createRadioButtonFor(LocationPreset preset) {
Platform.runLater(() -> {
var btn = new RadioButton(preset.name());
btn.setUserData(preset.path());
radioButtons.add(btn);
locationPresetsToggler.getToggles().add(btn);
});
}
private int compareLocationPresets(Node left, Node right) {
if (customLocationRadioBtn.getId().equals(left.getId())) {
return 1;
} else if (customLocationRadioBtn.getId().equals(right.getId())) {
return -1;
} else {
return ((RadioButton) left).getText().compareToIgnoreCase(((RadioButton) right).getText());
}
}
private void togglePredefinedLocation(@SuppressWarnings("unused") ObservableValue<? extends Toggle> observable, @SuppressWarnings("unused") Toggle oldValue, Toggle newValue) { private void togglePredefinedLocation(@SuppressWarnings("unused") ObservableValue<? extends Toggle> observable, @SuppressWarnings("unused") Toggle oldValue, Toggle newValue) {
var storagePath = Optional.ofNullable((Path) newValue.getUserData()).orElse(customVaultPath); var storagePath = Optional.ofNullable((Path) newValue.getUserData()).orElse(customVaultPath);
vaultPath.set(storagePath.resolve(vaultName.get())); vaultPath.set(storagePath.resolve(vaultName.get()));
@@ -197,7 +235,15 @@ public class CreateNewVaultLocationController implements FxController {
} }
public boolean isValidVaultPath() { public boolean isValidVaultPath() {
return validVaultPath.getValue(); return Boolean.TRUE.equals(validVaultPath.getValue());
}
public boolean isLoadingPresetLocations() {
return loadingPresetLocations.getValue();
}
public BooleanProperty loadingPresetLocationsProperty() {
return loadingPresetLocations;
} }
public BooleanProperty usePresetPathProperty() { public BooleanProperty usePresetPathProperty() {
@@ -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"), //
@@ -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 {
}
@@ -75,6 +75,7 @@ public class ErrorController implements FxController {
private final BooleanExpression errorSolutionFound = matchingErrorDiscussion.isNotNull(); private final BooleanExpression errorSolutionFound = matchingErrorDiscussion.isNotNull();
private final BooleanProperty isLoadingHttpResponse = new SimpleBooleanProperty(); private final BooleanProperty isLoadingHttpResponse = new SimpleBooleanProperty();
private final BooleanProperty askedForLookupDatabasePermission = new SimpleBooleanProperty(); private final BooleanProperty askedForLookupDatabasePermission = new SimpleBooleanProperty();
private final boolean formerSceneWasResizable;
@Inject @Inject
ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment, ExecutorService executorService) { ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment, ExecutorService executorService) {
@@ -85,12 +86,14 @@ public class ErrorController implements FxController {
this.window = window; this.window = window;
this.environment = environment; this.environment = environment;
this.executorService = executorService; this.executorService = executorService;
this.formerSceneWasResizable = window.isResizable();
} }
@FXML @FXML
public void back() { public void back() {
if (previousScene != null) { if (previousScene != null) {
window.setScene(previousScene); window.setScene(previousScene);
window.setResizable(formerSceneWasResizable);
} }
} }
@@ -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);
} }
}); });
@@ -4,7 +4,9 @@ import org.cryptomator.common.Environment;
import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.Settings;
import org.cryptomator.integrations.autostart.AutoStartProvider; import org.cryptomator.integrations.autostart.AutoStartProvider;
import org.cryptomator.integrations.autostart.ToggleAutoStartFailedException; import org.cryptomator.integrations.autostart.ToggleAutoStartFailedException;
import org.cryptomator.integrations.common.NamedServiceProvider;
import org.cryptomator.integrations.keychain.KeychainAccessProvider; import org.cryptomator.integrations.keychain.KeychainAccessProvider;
import org.cryptomator.integrations.quickaccess.QuickAccessService;
import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.fxapp.FxApplicationWindows; import org.cryptomator.ui.fxapp.FxApplicationWindows;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -30,12 +32,15 @@ public class GeneralPreferencesController implements FxController {
private final Stage window; private final Stage window;
private final Settings settings; private final Settings settings;
private final Optional<AutoStartProvider> autoStartProvider; private final Optional<AutoStartProvider> autoStartProvider;
private final List<QuickAccessService> quickAccessServices;
private final Application application; private final Application application;
private final Environment environment; private final Environment environment;
private final List<KeychainAccessProvider> keychainAccessProviders; private final List<KeychainAccessProvider> keychainAccessProviders;
private final FxApplicationWindows appWindows; private final FxApplicationWindows appWindows;
public CheckBox useKeychainCheckbox; public CheckBox useKeychainCheckbox;
public ChoiceBox<KeychainAccessProvider> keychainBackendChoiceBox; public ChoiceBox<KeychainAccessProvider> keychainBackendChoiceBox;
public CheckBox useQuickAccessCheckbox;
public ChoiceBox<QuickAccessService> quickAccessServiceChoiceBox;
public CheckBox startHiddenCheckbox; public CheckBox startHiddenCheckbox;
public CheckBox autoCloseVaultsCheckbox; public CheckBox autoCloseVaultsCheckbox;
public CheckBox debugModeCheckbox; public CheckBox debugModeCheckbox;
@@ -48,6 +53,7 @@ public class GeneralPreferencesController implements FxController {
this.settings = settings; this.settings = settings;
this.autoStartProvider = autoStartProvider; this.autoStartProvider = autoStartProvider;
this.keychainAccessProviders = keychainAccessProviders; this.keychainAccessProviders = keychainAccessProviders;
this.quickAccessServices = QuickAccessService.get().toList();
this.application = application; this.application = application;
this.environment = environment; this.environment = environment;
this.appWindows = appWindows; this.appWindows = appWindows;
@@ -60,13 +66,21 @@ public class GeneralPreferencesController implements FxController {
debugModeCheckbox.selectedProperty().bindBidirectional(settings.debugMode); debugModeCheckbox.selectedProperty().bindBidirectional(settings.debugMode);
autoStartProvider.ifPresent(autoStart -> autoStartCheckbox.setSelected(autoStart.isEnabled())); autoStartProvider.ifPresent(autoStart -> autoStartCheckbox.setSelected(autoStart.isEnabled()));
var keychainSettingsConverter = new KeychainProviderClassNameConverter(keychainAccessProviders); var keychainSettingsConverter = new ServiceToSettingsConverter<>(keychainAccessProviders);
keychainBackendChoiceBox.getItems().addAll(keychainAccessProviders); keychainBackendChoiceBox.getItems().addAll(keychainAccessProviders);
keychainBackendChoiceBox.setValue(keychainSettingsConverter.fromString(settings.keychainProvider.get())); keychainBackendChoiceBox.setValue(keychainSettingsConverter.fromString(settings.keychainProvider.get()));
keychainBackendChoiceBox.setConverter(new KeychainProviderDisplayNameConverter()); keychainBackendChoiceBox.setConverter(new KeychainProviderDisplayNameConverter());
Bindings.bindBidirectional(settings.keychainProvider, keychainBackendChoiceBox.valueProperty(), keychainSettingsConverter); Bindings.bindBidirectional(settings.keychainProvider, keychainBackendChoiceBox.valueProperty(), keychainSettingsConverter);
useKeychainCheckbox.selectedProperty().bindBidirectional(settings.useKeychain); useKeychainCheckbox.selectedProperty().bindBidirectional(settings.useKeychain);
keychainBackendChoiceBox.disableProperty().bind(useKeychainCheckbox.selectedProperty().not()); keychainBackendChoiceBox.disableProperty().bind(useKeychainCheckbox.selectedProperty().not());
useQuickAccessCheckbox.selectedProperty().bindBidirectional(settings.useQuickAccess);
var quickAccessSettingsConverter = new ServiceToSettingsConverter<>(quickAccessServices);
quickAccessServiceChoiceBox.getItems().addAll(quickAccessServices);
quickAccessServiceChoiceBox.setValue(quickAccessSettingsConverter.fromString(settings.quickAccessService.get()));
quickAccessServiceChoiceBox.setConverter(new NamedServiceConverter<>());
Bindings.bindBidirectional(settings.quickAccessService, quickAccessServiceChoiceBox.valueProperty(), quickAccessSettingsConverter);
quickAccessServiceChoiceBox.disableProperty().bind(useQuickAccessCheckbox.selectedProperty().not());
} }
public boolean isAutoStartSupported() { public boolean isAutoStartSupported() {
@@ -91,6 +105,10 @@ public class GeneralPreferencesController implements FxController {
}); });
} }
public boolean isSomeQuickAccessServiceAvailable() {
return !quickAccessServices.isEmpty();
}
@FXML @FXML
public void showLogfileDirectory() { public void showLogfileDirectory() {
environment.getLogDir().ifPresent(logDirPath -> application.getHostServices().showDocument(logDirPath.toUri().toString())); environment.getLogDir().ifPresent(logDirPath -> application.getHostServices().showDocument(logDirPath.toUri().toString()));
@@ -116,29 +134,47 @@ public class GeneralPreferencesController implements FxController {
} }
private static class KeychainProviderClassNameConverter extends StringConverter<KeychainAccessProvider> { private static class NamedServiceConverter<T extends NamedServiceProvider> extends StringConverter<T> {
private final List<KeychainAccessProvider> keychainAccessProviders;
public KeychainProviderClassNameConverter(List<KeychainAccessProvider> keychainAccessProviders) {
this.keychainAccessProviders = keychainAccessProviders;
}
@Override @Override
public String toString(KeychainAccessProvider provider) { public String toString(T namedService) {
if (provider == null) { if (namedService == null) {
return null; return null;
} else { } else {
return provider.getClass().getName(); return namedService.getName();
} }
} }
@Override @Override
public KeychainAccessProvider fromString(String string) { public T fromString(String string) {
throw new UnsupportedOperationException();
}
}
private static class ServiceToSettingsConverter<T> extends StringConverter<T> {
private final List<T> services;
public ServiceToSettingsConverter(List<T> services) {
this.services = services;
}
@Override
public String toString(T service) {
if (service == null) {
return null;
} else {
return service.getClass().getName();
}
}
@Override
public T fromString(String string) {
if (string == null) { if (string == null) {
return null; return null;
} else { } else {
return keychainAccessProviders.stream().filter(provider -> provider.getClass().getName().equals(string)).findAny().orElse(null); return services.stream().filter(provider -> provider.getClass().getName().equals(string)).findAny().orElse(null);
} }
} }
} }
@@ -30,6 +30,8 @@ public interface PreferencesComponent {
selectedTabProperty().set(selectedTab); selectedTabProperty().set(selectedTab);
Stage stage = window(); Stage stage = window();
stage.setScene(scene().get()); stage.setScene(scene().get());
stage.setMinWidth(420);
stage.setMinHeight(300);
stage.show(); stage.show();
stage.requestFocus(); stage.requestFocus();
return stage; return stage;
@@ -37,7 +37,7 @@ public class PreferencesController implements FxController {
this.env = env; this.env = env;
this.window = window; this.window = window;
this.selectedTabProperty = selectedTabProperty; this.selectedTabProperty = selectedTabProperty;
this.updateAvailable = updateChecker.latestVersionProperty().isNotNull(); this.updateAvailable = updateChecker.updateAvailableProperty();
} }
@FXML @FXML
@@ -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();
}
} }
@@ -11,7 +11,7 @@ public class TrayMenuModule {
@Provides @Provides
@TrayMenuScoped @TrayMenuScoped
static Optional<TrayMenuController> provideSupportedKeychainAccessProviders() { static Optional<TrayMenuController> provideFirstSupportedTrayMenuController() {
return TrayMenuController.get(); return TrayMenuController.get();
} }
@@ -11,6 +11,7 @@ import org.cryptomator.ui.common.FxmlFile;
import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.common.FxmlScene;
import org.cryptomator.ui.common.VaultService; import org.cryptomator.ui.common.VaultService;
import org.cryptomator.ui.fxapp.FxApplicationWindows; import org.cryptomator.ui.fxapp.FxApplicationWindows;
import org.cryptomator.ui.fxapp.PrimaryStage;
import org.cryptomator.ui.keyloading.KeyLoadingStrategy; import org.cryptomator.ui.keyloading.KeyLoadingStrategy;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -19,7 +20,9 @@ import javax.inject.Inject;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.property.ObjectProperty; import javafx.beans.property.ObjectProperty;
import javafx.concurrent.Task; import javafx.concurrent.Task;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.stage.Screen;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.io.IOException; import java.io.IOException;
@@ -33,6 +36,7 @@ public class UnlockWorkflow extends Task<Void> {
private static final Logger LOG = LoggerFactory.getLogger(UnlockWorkflow.class); private static final Logger LOG = LoggerFactory.getLogger(UnlockWorkflow.class);
private final Stage mainWindow;
private final Stage window; private final Stage window;
private final Vault vault; private final Vault vault;
private final VaultService vaultService; private final VaultService vaultService;
@@ -44,7 +48,8 @@ public class UnlockWorkflow extends Task<Void> {
private final ObjectProperty<IllegalMountPointException> illegalMountPointException; private final ObjectProperty<IllegalMountPointException> illegalMountPointException;
@Inject @Inject
UnlockWorkflow(@UnlockWindow Stage window, // UnlockWorkflow(@PrimaryStage Stage mainWindow, //
@UnlockWindow Stage window, //
@UnlockWindow Vault vault, // @UnlockWindow Vault vault, //
VaultService vaultService, // VaultService vaultService, //
@FxmlScene(FxmlFile.UNLOCK_SUCCESS) Lazy<Scene> successScene, // @FxmlScene(FxmlFile.UNLOCK_SUCCESS) Lazy<Scene> successScene, //
@@ -53,6 +58,7 @@ public class UnlockWorkflow extends Task<Void> {
FxApplicationWindows appWindows, // FxApplicationWindows appWindows, //
@UnlockWindow KeyLoadingStrategy keyLoadingStrategy, // @UnlockWindow KeyLoadingStrategy keyLoadingStrategy, //
@UnlockWindow ObjectProperty<IllegalMountPointException> illegalMountPointException) { @UnlockWindow ObjectProperty<IllegalMountPointException> illegalMountPointException) {
this.mainWindow = mainWindow;
this.window = window; this.window = window;
this.vault = vault; this.vault = vault;
this.vaultService = vaultService; this.vaultService = vaultService;
@@ -107,6 +113,19 @@ public class UnlockWorkflow extends Task<Void> {
case ASK -> Platform.runLater(() -> { case ASK -> Platform.runLater(() -> {
window.setScene(successScene.get()); window.setScene(successScene.get());
window.show(); window.show();
double x = mainWindow.getX() + (mainWindow.getWidth() - window.getWidth()) / 2;
double y = mainWindow.getY() + (mainWindow.getHeight() - window.getHeight()) / 2;
if(!mainWindow.isShowing()) {
Screen screen = Screen.getScreensForRectangle(mainWindow.getX(), mainWindow.getY(), mainWindow.getWidth(), mainWindow.getHeight())
.stream()
.findFirst()
.orElse(Screen.getPrimary());
Rectangle2D bounds = screen.getVisualBounds();
x = bounds.getMinX() + (bounds.getWidth() - window.getWidth()) / 2;
y = bounds.getMinY() + (bounds.getHeight() - window.getHeight()) / 2;
}
window.setX(x);
window.setY(y);
}); });
case REVEAL -> { case REVEAL -> {
Platform.runLater(window::close); Platform.runLater(window::close);
@@ -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();
@@ -1,11 +1,13 @@
<?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.FontAwesome5IconView?>
<?import org.cryptomator.ui.controls.FontAwesome5Spinner?>
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?> <?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?> <?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.control.RadioButton?> <?import javafx.scene.control.RadioButton?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.TextField?> <?import javafx.scene.control.TextField?>
<?import javafx.scene.control.ToggleGroup?> <?import javafx.scene.control.ToggleGroup?>
<?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.HBox?>
@@ -29,18 +31,26 @@
<children> <children>
<Region VBox.vgrow="ALWAYS"/> <Region VBox.vgrow="ALWAYS"/>
<VBox fx:id="radioButtonVBox" spacing="6"> <Label wrapText="true" text="%addvaultwizard.new.locationInstruction"/>
<Label wrapText="true" text="%addvaultwizard.new.locationInstruction"/> <ScrollPane hbarPolicy="NEVER">
<!-- PLACEHOLDER, more radio buttons are added programmatically via controller --> <VBox fx:id="radioButtonVBox" spacing="6">
<HBox spacing="12" alignment="CENTER_LEFT"> <!-- PLACEHOLDER, more radio buttons are added programmatically via controller -->
<RadioButton fx:id="customRadioButton" toggleGroup="${locationPresetsToggler}" text="%addvaultwizard.new.directoryPickerLabel"/> <HBox fx:id="customLocationRadioBtn" spacing="12" alignment="CENTER_LEFT">
<Button contentDisplay="LEFT" text="%addvaultwizard.new.directoryPickerButton" onAction="#chooseCustomVaultPath" disable="${controller.usePresetPath}"> <RadioButton fx:id="customRadioButton" toggleGroup="${locationPresetsToggler}" text="%addvaultwizard.new.directoryPickerLabel"/>
<graphic> <Button contentDisplay="LEFT" text="%addvaultwizard.new.directoryPickerButton" onAction="#chooseCustomVaultPath" disable="${controller.usePresetPath}">
<FontAwesome5IconView glyph="FOLDER_OPEN"/> <graphic>
</graphic> <FontAwesome5IconView glyph="FOLDER_OPEN"/>
</Button> </graphic>
</HBox> </Button>
</VBox> </HBox>
</VBox>
</ScrollPane>
<Region prefHeight="2"/>
<Label wrapText="true" text="%addvaultwizard.new.locationLoading" visible="${controller.loadingPresetLocations}" managed="${controller.loadingPresetLocations}" graphicTextGap="8">
<graphic>
<FontAwesome5Spinner/>
</graphic>
</Label>
<Region prefHeight="12" VBox.vgrow="NEVER"/> <Region prefHeight="12" VBox.vgrow="NEVER"/>
@@ -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>
+75 -64
View File
@@ -9,86 +9,97 @@
<?import javafx.scene.control.Hyperlink?> <?import javafx.scene.control.Hyperlink?>
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextArea?> <?import javafx.scene.control.TextArea?>
<?import javafx.scene.Group?>
<?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Region?> <?import javafx.scene.layout.Region?>
<?import javafx.scene.layout.StackPane?> <?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?> <?import javafx.scene.shape.Circle?>
<VBox xmlns:fx="http://javafx.com/fxml" <HBox xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx" xmlns="http://javafx.com/javafx"
fx:controller="org.cryptomator.ui.error.ErrorController" fx:controller="org.cryptomator.ui.error.ErrorController"
minWidth="450"
minHeight="450"
prefWidth="450" prefWidth="450"
prefHeight="450" prefHeight="450"
spacing="18" spacing="12">
alignment="TOP_CENTER">
<padding> <padding>
<Insets topRightBottomLeft="24"/> <Insets topRightBottomLeft="24"/>
</padding> </padding>
<children> <Group>
<HBox spacing="12" VBox.vgrow="NEVER"> <StackPane>
<StackPane alignment="CENTER" HBox.hgrow="NEVER"> <padding>
<Circle styleClass="glyph-icon-primary" radius="24"/> <Insets topRightBottomLeft="6"/>
<FontAwesome5IconView styleClass="glyph-icon-white" glyph="EXCLAMATION" glyphSize="24"/> </padding>
</StackPane> <Circle styleClass="glyph-icon-primary" radius="24"/>
<VBox spacing="6" HBox.hgrow="ALWAYS"> <FontAwesome5IconView styleClass="glyph-icon-white" glyph="EXCLAMATION" glyphSize="24"/>
<FormattedLabel styleClass="label-extra-large" format="%error.message" arg1="${controller.errorCode}"/> </StackPane>
<VBox visible="${!controller.askedForLookupDatabasePermission}" managed="${!controller.askedForLookupDatabasePermission}"> </Group>
<Label text="%error.lookupPermissionMessage" wrapText="true"/> <VBox HBox.hgrow="ALWAYS">
<Region VBox.vgrow="ALWAYS" minHeight="18"/> <FormattedLabel styleClass="label-extra-large" format="%error.message" arg1="${controller.errorCode}">
<ButtonBar buttonMinWidth="120" buttonOrder="+NY"> <padding>
<buttons> <Insets bottom="6" top="6"/>
<Button text="%error.dismiss" ButtonBar.buttonData="NO" onAction="#dismiss"/> </padding>
<Button text="%error.lookUpSolution" ButtonBar.buttonData="YES" defaultButton="true" onAction="#lookUpSolution"/> </FormattedLabel>
</buttons>
</ButtonBar>
</VBox>
<VBox visible="${controller.askedForLookupDatabasePermission}" managed="${controller.askedForLookupDatabasePermission}">
<FontAwesome5Spinner glyphSize="24" visible="${controller.isLoadingHttpResponse}" managed="${controller.isLoadingHttpResponse}"/>
<VBox visible="${!controller.isLoadingHttpResponse}" managed="${!controller.isLoadingHttpResponse}">
<Label text="%error.existingSolutionDescription" wrapText="true" visible="${controller.errorSolutionFound}" managed="${controller.errorSolutionFound}"/>
<Hyperlink styleClass="hyperlink-underline" text="%error.hyperlink.solution" onAction="#showSolution" contentDisplay="LEFT" visible="${controller.errorSolutionFound}" managed="${controller.errorSolutionFound}">
<graphic>
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
</graphic>
</Hyperlink>
<Label text="%error.description" wrapText="true" visible="${!controller.errorSolutionFound}" managed="${!controller.errorSolutionFound}"/>
<Hyperlink styleClass="hyperlink-underline" text="%error.hyperlink.lookup" onAction="#searchError" contentDisplay="LEFT" visible="${!controller.errorSolutionFound}" managed="${!controller.errorSolutionFound}">
<graphic>
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
</graphic>
</Hyperlink>
<Hyperlink styleClass="hyperlink-underline" text="%error.hyperlink.report" onAction="#reportError" contentDisplay="LEFT" visible="${!controller.errorSolutionFound}" managed="${!controller.errorSolutionFound}">
<graphic>
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
</graphic>
</Hyperlink>
</VBox>
</VBox>
</VBox>
</HBox>
<VBox spacing="6" VBox.vgrow="ALWAYS">
<HBox>
<Label text="%error.technicalDetails"/>
<Region HBox.hgrow="ALWAYS"/>
<Hyperlink styleClass="hyperlink-underline" text="%generic.button.copy" onAction="#copyDetails" contentDisplay="LEFT" visible="${!controller.copiedDetails}" managed="${!controller.copiedDetails}">
<graphic>
<FontAwesome5IconView glyph="CLIPBOARD" glyphSize="12"/>
</graphic>
</Hyperlink>
<Hyperlink styleClass="hyperlink-underline" text="%generic.button.copied" onAction="#copyDetails" contentDisplay="LEFT" visible="${controller.copiedDetails}" managed="${controller.copiedDetails}">
<graphic>
<FontAwesome5IconView glyph="CHECK" glyphSize="12"/>
</graphic>
</Hyperlink>
</HBox>
<TextArea VBox.vgrow="ALWAYS" text="${controller.detailText}" prefRowCount="5" editable="false"/>
</VBox>
<VBox visible="${!controller.askedForLookupDatabasePermission}" managed="${!controller.askedForLookupDatabasePermission}">
<Label text="%error.lookupPermissionMessage" wrapText="true"/>
<Region minHeight="12"/>
<ButtonBar buttonMinWidth="120" buttonOrder="+NY">
<buttons>
<Button text="%error.dismiss" ButtonBar.buttonData="NO" onAction="#dismiss"/>
<Button text="%error.lookUpSolution" ButtonBar.buttonData="YES" defaultButton="true" onAction="#lookUpSolution"/>
</buttons>
</ButtonBar>
</VBox>
<VBox visible="${controller.askedForLookupDatabasePermission}" managed="${controller.askedForLookupDatabasePermission}">
<FontAwesome5Spinner glyphSize="24" visible="${controller.isLoadingHttpResponse}" managed="${controller.isLoadingHttpResponse}"/>
<VBox visible="${!controller.isLoadingHttpResponse}" managed="${!controller.isLoadingHttpResponse}">
<Label text="%error.existingSolutionDescription" wrapText="true" visible="${controller.errorSolutionFound}" managed="${controller.errorSolutionFound}"/>
<Hyperlink styleClass="hyperlink-underline" text="%error.hyperlink.solution" onAction="#showSolution" contentDisplay="LEFT" visible="${controller.errorSolutionFound}" managed="${controller.errorSolutionFound}">
<graphic>
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
</graphic>
</Hyperlink>
<Label text="%error.description" wrapText="true" visible="${!controller.errorSolutionFound}" managed="${!controller.errorSolutionFound}"/>
<Hyperlink styleClass="hyperlink-underline" text="%error.hyperlink.lookup" onAction="#searchError" contentDisplay="LEFT" visible="${!controller.errorSolutionFound}" managed="${!controller.errorSolutionFound}">
<graphic>
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
</graphic>
</Hyperlink>
<Hyperlink styleClass="hyperlink-underline" text="%error.hyperlink.report" onAction="#reportError" contentDisplay="LEFT" visible="${!controller.errorSolutionFound}" managed="${!controller.errorSolutionFound}">
<graphic>
<FontAwesome5IconView glyph="LINK" glyphSize="12"/>
</graphic>
</Hyperlink>
</VBox>
</VBox>
<Region minHeight="12"/>
<HBox>
<padding>
<Insets top="6" bottom="6"/>
</padding>
<Label text="%error.technicalDetails"/>
<Region HBox.hgrow="ALWAYS"/>
<Hyperlink styleClass="hyperlink-underline" text="%generic.button.copy" onAction="#copyDetails" contentDisplay="LEFT" visible="${!controller.copiedDetails}" managed="${!controller.copiedDetails}">
<graphic>
<FontAwesome5IconView glyph="CLIPBOARD" glyphSize="12"/>
</graphic>
</Hyperlink>
<Hyperlink styleClass="hyperlink-underline" text="%generic.button.copied" onAction="#copyDetails" contentDisplay="LEFT" visible="${controller.copiedDetails}" managed="${controller.copiedDetails}">
<graphic>
<FontAwesome5IconView glyph="CHECK" glyphSize="12"/>
</graphic>
</Hyperlink>
</HBox>
<TextArea VBox.vgrow="ALWAYS" text="${controller.detailText}" prefRowCount="5" editable="false"/>
<Region minHeight="18"/>
<ButtonBar buttonMinWidth="120" buttonOrder="B+C"> <ButtonBar buttonMinWidth="120" buttonOrder="B+C">
<buttons> <buttons>
<Button text="%generic.button.back" ButtonBar.buttonData="BACK_PREVIOUS" onAction="#back" visible="${controller.previousScenePresent}"/> <Button text="%generic.button.back" ButtonBar.buttonData="BACK_PREVIOUS" onAction="#back" visible="${controller.previousScenePresent}"/>
<Button text="%generic.button.cancel" ButtonBar.buttonData="CANCEL_CLOSE" onAction="#close"/> <Button text="%generic.button.cancel" ButtonBar.buttonData="CANCEL_CLOSE" onAction="#close"/>
</buttons> </buttons>
</ButtonBar> </ButtonBar>
</children> </VBox>
</VBox> </HBox>
-2
View File
@@ -7,8 +7,6 @@
xmlns="http://javafx.com/javafx" xmlns="http://javafx.com/javafx"
fx:id="tabPane" fx:id="tabPane"
fx:controller="org.cryptomator.ui.preferences.PreferencesController" fx:controller="org.cryptomator.ui.preferences.PreferencesController"
minWidth="-Infinity"
maxWidth="-Infinity"
prefWidth="650" prefWidth="650"
tabMinWidth="60" tabMinWidth="60"
tabClosingPolicy="UNAVAILABLE" tabClosingPolicy="UNAVAILABLE"
@@ -30,6 +30,10 @@
<ChoiceBox fx:id="keychainBackendChoiceBox"/> <ChoiceBox fx:id="keychainBackendChoiceBox"/>
</HBox> </HBox>
<HBox spacing="12" alignment="CENTER_LEFT" visible="${controller.someQuickAccessServiceAvailable}" managed="${controller.someQuickAccessServiceAvailable}">
<CheckBox fx:id="useQuickAccessCheckbox" text="%preferences.general.quickAccessService"/>
<ChoiceBox fx:id="quickAccessServiceChoiceBox"/>
</HBox>
<Region VBox.vgrow="ALWAYS"/> <Region VBox.vgrow="ALWAYS"/>
<HBox spacing="12" alignment="CENTER_LEFT"> <HBox spacing="12" alignment="CENTER_LEFT">
@@ -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>
@@ -288,6 +288,7 @@ preferences.general.debugLogging=Enable debug logging
preferences.general.debugDirectory=Reveal log files preferences.general.debugDirectory=Reveal log files
preferences.general.autoStart=Launch Cryptomator on system start preferences.general.autoStart=Launch Cryptomator on system start
preferences.general.keychainBackend=Store passwords with preferences.general.keychainBackend=Store passwords with
preferences.general.quickAccessService=Add unlocked vaults to the quick access area
## Interface ## Interface
preferences.interface=Interface preferences.interface=Interface
preferences.interface.theme=Look & Feel preferences.interface.theme=Look & Feel
@@ -321,6 +322,14 @@ 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.
## 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 +542,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?
@@ -0,0 +1,121 @@
# Locale Specific CSS files such as CJK, RTL,...
# Generics
## Button
# Error
# Defaults
# Tray Menu
# Add Vault Wizard
## New
### Name
### Location
### Expert Settings
### Password
### Information
## Existing
## Success
# Remove Vault
# Change Password
# Forget Password
# Unlock
## Select
## Success
## Failure
## Hub
### Waiting
### Receive Key
### Register Device
### Register Device Legacy
### Registration Success
### Registration Failed
### Unauthorized
### Requires Account Initialization
### License Exceeded
# Lock
## Force
## Failure
# Migration
## Start
## Run
## Success
## Missing file system capabilities
## Impossible
# Health Check
## Start
## Start Failure
## Check Selection
## Detail view
## Result view
## Fix Application
# Preferences
## General
## Interface
## Volume
## Updates
## Contribution
### Remove License Key Dialog
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
# Vault Statistics
## Read
## Write
## Accesses
# Main Window
## Vault List
##Notificaition
## Vault Detail
### Welcome
### Locked
### Unlocked
### Missing
### Needs Migration
### Error
# Wrong File Alert
# Vault Options
## General
## Mount
## Master Key
## Hub
# Recovery Key
## Display Recovery Key
## Reset Password
### Enter Recovery Key
### Reset Password
### Recovery Key Password Reset Success
# Convert Vault
# New Password
# Quit
# Forced Quit
# Update Reminder
#Dokany Support End
# Share Vault
+138 -15
View File
@@ -16,7 +16,7 @@ generic.button.print=طباعة
# Error # Error
error.message=حدث خطأ ما error.message=حدث خطأ ما
error.description=لم يتوقع "كريبتوماتور" حدوث ذلك. يمكنك البحث عن الحلول الموجودة لهذا الخطأ. وإذا لم يتم الإبلاغ عنه بعد، لا تتردد في فعل ذلك. error.description=لم يتوقع Cryptomator حدوث ذلك. يمكنك البحث عن الحلول الموجودة لهذا الخطأ. وإذا لم يتم الإبلاغ عنه بعد، لا تتردد في فعل ذلك.
error.hyperlink.lookup=ابحث عن هذا الخطأ error.hyperlink.lookup=ابحث عن هذا الخطأ
error.hyperlink.report=أبلغ عن هذا الخطأ error.hyperlink.report=أبلغ عن هذا الخطأ
error.technicalDetails=التفاصيل: error.technicalDetails=التفاصيل:
@@ -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,19 +157,31 @@ 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.occupiedMsg=الاسم مستخدم مسبقاً hub.register.invalidAccountKeyLabel=مفتاح الحساب غير صحيح
hub.register.registerBtn=تأكيد hub.register.registerBtn=تسجيل
### Register Device Legacy
hub.register.legacy.occupiedMsg=الاسم قيد الاستخدام
hub.register.legacy.description=هذا هو أول وصول للمركز من هذا الجهاز. الرجاء تسجيله.
### Registration Success ### Registration Success
hub.registerSuccess.message=تم تسمية الجهاز hub.registerSuccess.message=تم تسجيل الجهاز
hub.registerSuccess.description=للدخول إلى الخزينة، يحتاج جهازك إلى إذن من مالك الخزينة. hub.registerSuccess.description=تم تسجيل جهازك بنجاح. يمكنك الآن المتابعة لفتح الخزنة.
hub.registerSuccess.unlockBtn=افتح
hub.registerSuccess.legacy.description=للدخول إلى الخزينة، يحتاج جهازك كذالك إلى إذن من مالك الخزينة.
### Registration Failed ### Registration Failed
hub.registerFailed.message=أخفق في تسمية الجهاز hub.registerFailed.message=فشل تسجيل الجهاز
hub.registerFailed.description=خطأ في عملية التسمية. لمزيد من التفاصيل، انظر إلى سجل التطبيق. hub.registerFailed.description.generic=حدث خطأ في عملية تسجيل الاسم. لمزيد من التفاصيل، راجع سجل التطبيق.
hub.registerFailed.description.deviceAlreadyExists=هذا الجهاز مسجل لمستخدم مختلف بالفعل. حاول تغيير حساب المستخدم أو استخدام جهاز مختلف.
### Unauthorized ### Unauthorized
hub.unauthorized.message=تم رفض الوصول hub.unauthorized.message=تم رفض الوصول
hub.unauthorized.description=لم يتم بعد منح الإذن لجهازك بالوصول إلى هذا المخزن. اطلب من مالك المخزن أن يأذن بذلك. hub.unauthorized.description=لم يتم بعد منح الإذن لجهازك بالوصول إلى هذا المخزن. اطلب من مالك المخزن أن يأذن بذلك.
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=مطلوب اتخاذ إجراء
hub.requireAccountInit.description.0=للمتابعة، يرجى إكمال الخطوات المطلوبة في
hub.requireAccountInit.description.1=ملف تعريف المستخدم
hub.requireAccountInit.description.2=.
### License Exceeded ### License Exceeded
hub.invalidLicense.message=ترخيص المركز غير صالح hub.invalidLicense.message=ترخيص المركز غير صالح
hub.invalidLicense.description=نموذج المركز Cryptomator الخاص بك لديه ترخيص غير صالح. الرجاء إبلاغ مسؤول مركز لترقية أو تجديد الترخيص. hub.invalidLicense.description=نموذج المركز Cryptomator الخاص بك لديه ترخيص غير صالح. الرجاء إبلاغ مسؤول مركز لترقية أو تجديد الترخيص.
@@ -283,26 +299,46 @@ preferences.interface.language.auto=النظام الافتراضي
preferences.interface.interfaceOrientation=اتجاه الواجهة preferences.interface.interfaceOrientation=اتجاه الواجهة
preferences.interface.interfaceOrientation.ltr=من اليسار إلى اليمين preferences.interface.interfaceOrientation.ltr=من اليسار إلى اليمين
preferences.interface.interfaceOrientation.rtl=من اليمين إلى اليسار preferences.interface.interfaceOrientation.rtl=من اليمين إلى اليسار
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.mountToDir=مجلد مخصص كنقطة تحميل
preferences.volume.feature.mountToDriveLetter=استخدام حرف وحدة التخزين كنقطة تحميل
preferences.volume.feature.mountFlags=خيارات التثبيت المخصصة
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 متاح.
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
preferences.contribute.noCertificate=ادعم Cryptomator واحصل على شهادة الداعم. إنها مثل مفتاح الترخيص لكن للأشخاص الرائعين الذين يستخدمون البرامج المجانية ؛-) preferences.contribute.noCertificate=ادعم Cryptomator واحصل على شهادة الداعم. إنها مثل مفتاح الترخيص لكن للأشخاص الرائعين الذين يستخدمون البرامج المجانية ؛-)
preferences.contribute.getCertificate=ليس لديك واحدة بعد؟ تعلم كيف يمكنك الحصول عليها. preferences.contribute.getCertificate=ليس لديك واحدة بعد؟ تعلم كيف يمكنك الحصول عليها.
preferences.contribute.promptText=قم بلصق رمز شهادة الداعم هنا preferences.contribute.promptText=قم بلصق رمز شهادة الداعم هنا
preferences.contribute.donate=تبرع
### Remove License Key Dialog
removeCert.title=إزالة الشهادة
removeCert.message=إزالة شهادة الداعم؟
removeCert.confirmBtn=حذف
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -313,21 +349,37 @@ 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.read.total.data.none=بيانات القراءة: -
stats.read.total.data.kib=بيانات القراءة: %.1f كيلوبايت
stats.read.total.data.mib=بيانات القراءة: %.1f ميجابايت
stats.read.total.data.gib=بيانات القراءة: %.1f جيجابايت
stats.decr.total.data.none=تم فك تشفير البيانات:- stats.decr.total.data.none=تم فك تشفير البيانات:-
stats.decr.total.data.kib=البيانات المفكوكة: %.1f كيلوبايت
stats.decr.total.data.mib=البيانات المفكوكة: %.1f ميجابايت
stats.decr.total.data.gib=البيانات المفكوكة: %.1f جيجابايت
stats.read.accessCount=مجموع القراءات: %d
## Write ## Write
stats.write.throughput.idle=الكتابة: خامل
stats.write.throughput.kibs=الكتابة: %.2f كيلوبايت/ثانية
stats.write.throughput.mibs=الكتابة: %.2f ميجابايت/ثانية
stats.write.total.data.none=البيانات المكتوبة: -
stats.write.total.data.kib=البيانات المكتوبة: %.1f كيلوبايت
stats.write.total.data.mib=البيانات المكتوبة: %.1f م.ب stats.write.total.data.mib=البيانات المكتوبة: %.1f م.ب
stats.write.total.data.gib=البيانات المكتوبة: %.1f ج.ب stats.write.total.data.gib=البيانات المكتوبة: %.1f ج.ب
stats.encr.total.data.none=البيانات المشفرة: - stats.encr.total.data.none=البيانات المشفرة: -
stats.encr.total.data.kib=البيانات المشفرة: %.1f كيلوبايت
stats.encr.total.data.mib=البيانات المشفرة: %.1f ميجابايت
stats.encr.total.data.gib=البيانات المشفرة: %.1f جيجابايت
stats.write.accessCount=مجموع الكتابات: %d
## Accesses ## Accesses
stats.access.current=الوصول: %d
stats.access.total=مجموع الوصول: %d
# Main Window # Main Window
main.closeBtn.tooltip=إغلاق
main.minimizeBtn.tooltip=تصغير
main.preferencesBtn.tooltip=تفضيلات
main.debugModeEnabled.tooltip=تم تمكين وضع التصحيح
main.supporterCertificateMissing.tooltip=يرجى النظر في تقديم تبرعات
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=انقر هنا لإضافة خزنة main.vaultlist.emptyList.onboardingInstruction=انقر هنا لإضافة خزنة
main.vaultlist.contextMenu.remove=حذف… main.vaultlist.contextMenu.remove=حذف…
@@ -336,7 +388,7 @@ main.vaultlist.contextMenu.unlock=فتح…
main.vaultlist.contextMenu.unlockNow=افتح الان main.vaultlist.contextMenu.unlockNow=افتح الان
main.vaultlist.contextMenu.vaultoptions=إظهار خيارات المخزن main.vaultlist.contextMenu.vaultoptions=إظهار خيارات المخزن
main.vaultlist.contextMenu.reveal=اظهار القرص main.vaultlist.contextMenu.reveal=اظهار القرص
main.vaultlist.addVaultBtn=إضافة ##Notificaition
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=شكرا لاختيار Cryptomator لحماية ملفاتك. إذا كنت بحاجة إلى أية مساعدة، تحقق من دليل وتعليمات الإستخدام: main.vaultDetail.welcomeOnboarding=شكرا لاختيار Cryptomator لحماية ملفاتك. إذا كنت بحاجة إلى أية مساعدة، تحقق من دليل وتعليمات الإستخدام:
@@ -346,14 +398,17 @@ main.vaultDetail.unlockBtn=فتح…
main.vaultDetail.unlockNowBtn=فتح القفل الان main.vaultDetail.unlockNowBtn=فتح القفل الان
main.vaultDetail.optionsBtn=خيارات المخزن main.vaultDetail.optionsBtn=خيارات المخزن
main.vaultDetail.passwordSavedInKeychain=تم حفظ كلمة المرور main.vaultDetail.passwordSavedInKeychain=تم حفظ كلمة المرور
main.vaultDetail.share=مشاركة…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=مفتوح main.vaultDetail.unlockedStatus=مفتوح
main.vaultDetail.accessLocation=يمكن الوصول إلى محتويات مخزنك هنا: main.vaultDetail.accessLocation=يمكن الوصول إلى محتويات مخزنك هنا:
main.vaultDetail.revealBtn=اظهار القرص main.vaultDetail.revealBtn=اظهار القرص
main.vaultDetail.copyUri=نسخ الرابط
main.vaultDetail.lockBtn=قفل main.vaultDetail.lockBtn=قفل
main.vaultDetail.bytesPerSecondRead=قراءة: main.vaultDetail.bytesPerSecondRead=قراءة:
main.vaultDetail.bytesPerSecondWritten=كتابة: main.vaultDetail.bytesPerSecondWritten=كتابة:
main.vaultDetail.throughput.idle=خمول main.vaultDetail.throughput.idle=خمول
main.vaultDetail.throughput.kbps=%.1f كيلوبايت/ث
main.vaultDetail.throughput.mbps=%.1f ميجابايت/ث main.vaultDetail.throughput.mbps=%.1f ميجابايت/ث
main.vaultDetail.stats=إحصائيات الخزنة main.vaultDetail.stats=إحصائيات الخزنة
main.vaultDetail.locateEncryptedFileBtn=تحديد موقع الملف المشفر main.vaultDetail.locateEncryptedFileBtn=تحديد موقع الملف المشفر
@@ -369,6 +424,9 @@ main.vaultDetail.missing.changeLocation=تغيير موقع الخزنة…
main.vaultDetail.migrateButton=ترقية الحافظة main.vaultDetail.migrateButton=ترقية الحافظة
main.vaultDetail.migratePrompt=يجب ترقية المخزن الخاص بك إلى تنسيق جديد، قبل أن تتمكن من الوصول إليه main.vaultDetail.migratePrompt=يجب ترقية المخزن الخاص بك إلى تنسيق جديد، قبل أن تتمكن من الوصول إليه
### Error ### Error
main.vaultDetail.error.info=حدث خطأ أثناء تحميل الخزانة من القرص الصلب.
main.vaultDetail.error.reload=إعادة تحميل
main.vaultDetail.error.windowTitle=خطأ في تحميل الخزنة
# Wrong File Alert # Wrong File Alert
wrongFileAlert.title=كيفية تشفير الملفات wrongFileAlert.title=كيفية تشفير الملفات
@@ -384,43 +442,70 @@ wrongFileAlert.link=لمزيد من المساعدة، قم بزيارة
## General ## General
vaultOptions.general=عام vaultOptions.general=عام
vaultOptions.general.vaultName=اسم المخزن vaultOptions.general.vaultName=اسم المخزن
vaultOptions.general.autoLock.lockAfterTimePart1=قفل عند الخمول لمدة
vaultOptions.general.autoLock.lockAfterTimePart2=دقائق vaultOptions.general.autoLock.lockAfterTimePart2=دقائق
vaultOptions.general.unlockAfterStartup=فتح قفل المخزن عند بدء تشغيل Cryptomator vaultOptions.general.unlockAfterStartup=فتح قفل المخزن عند بدء تشغيل Cryptomator
vaultOptions.general.actionAfterUnlock=بعد فتح القفل بنجاح vaultOptions.general.actionAfterUnlock=بعد فتح القفل بنجاح
vaultOptions.general.actionAfterUnlock.ignore=‮لا تفعل شيئاً vaultOptions.general.actionAfterUnlock.ignore=‮لا تفعل شيئاً
vaultOptions.general.actionAfterUnlock.reveal=إظهار القرص vaultOptions.general.actionAfterUnlock.reveal=إظهار القرص
vaultOptions.general.actionAfterUnlock.ask=اسأل vaultOptions.general.actionAfterUnlock.ask=اسأل
vaultOptions.general.startHealthCheckBtn=بدء فحص الصحة
## Mount ## Mount
vaultOptions.mount=القرص الوهمي vaultOptions.mount=القرص الوهمي
vaultOptions.mount.info=افتح تفضيلات القرص الظاهري لتغيير الإعدادات الافتراضية.
vaultOptions.mount.readonly=للقراءة فقط vaultOptions.mount.readonly=للقراءة فقط
vaultOptions.mount.customMountFlags=الأعلام المخصصة vaultOptions.mount.customMountFlags=الأعلام المخصصة
vaultOptions.mount.winDriveLetterOccupied=مشغول vaultOptions.mount.winDriveLetterOccupied=مشغول
vaultOptions.mount.mountPoint=موقع التحميل الوهمي vaultOptions.mount.mountPoint=موقع التحميل الوهمي
vaultOptions.mount.mountPoint.auto=اختيار موقع مناسب تلقائياً vaultOptions.mount.mountPoint.auto=اختيار موقع مناسب تلقائياً
vaultOptions.mount.mountPoint.driveLetter=استخدام دالة قرص معين vaultOptions.mount.mountPoint.driveLetter=استخدام دالة قرص معين
vaultOptions.mount.mountPoint.custom=استخدام المجلد المختار
vaultOptions.mount.mountPoint.directoryPickerButton=اختر… vaultOptions.mount.mountPoint.directoryPickerButton=اختر…
vaultOptions.mount.mountPoint.directoryPickerTitle=إختر مجلد
vaultOptions.mount.volumeType.default=الافتراضي (%s)
vaultOptions.mount.volumeType.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=تغيير كلمة المرور
vaultOptions.masterkey.forgetSavedPasswordBtn=نسيان كلمة المرور المحفوظة vaultOptions.masterkey.forgetSavedPasswordBtn=نسيان كلمة المرور المحفوظة
vaultOptions.masterkey.recoveryKeyExplanation=مفتاح الاسترداد هو وسيلتك الوحيدة لاستعادة الوصول إلى مخزنك إذا فقدت كلمة المرور. vaultOptions.masterkey.recoveryKeyExplanation=مفتاح الاسترداد هو وسيلتك الوحيدة لاستعادة الوصول إلى مخزنك إذا فقدت كلمة المرور.
vaultOptions.masterkey.showRecoveryKeyBtn=عرض مفتاح الاسترداد vaultOptions.masterkey.showRecoveryKeyBtn=عرض مفتاح الاسترداد
vaultOptions.masterkey.recoverPasswordBtn=إعادة تعيين كلمة المرور
## Hub ## Hub
vaultOptions.hub=الإسترداد
vaultOptions.hub.convertInfo=يمكنك استخدام مفتاح الاسترداد لتحويل هذه خزانة Hub إلى خزانة تعتمد على كلمة مرور في حالة الطوارئ.
vaultOptions.hub.convertBtn=التحويل إلى خزانة قائمة على كلمة المرور
# Recovery Key # Recovery Key
## Display Recovery Key ## Display Recovery Key
recoveryKey.display.title=إظهار مفتاح الاسترداد
recoveryKey.create.message=مطلوب كلمة المرور
recoveryKey.create.description=أدخل كلمة المرور الخاصة بك لإظهار مفتاح الاسترداد ل "%s": recoveryKey.create.description=أدخل كلمة المرور الخاصة بك لإظهار مفتاح الاسترداد ل "%s":
recoveryKey.display.description=يمكن استخدام مفتاح الاسترداد التالي لاستعادة الوصول إلى "%s": recoveryKey.display.description=يمكن استخدام مفتاح الاسترداد التالي لاستعادة الوصول إلى "%s":
recoveryKey.display.StorageHints=حافظ عليه في مكان ما آمن جداً، على سبيل المثال\n • تخزينه باستخدام مدير كلمات المرور\n • حفظه على محرك أقراص خارجي USB\n • كتابته أو طباعته على الورق recoveryKey.display.StorageHints=حافظ عليه في مكان ما آمن جداً، على سبيل المثال\n • تخزينه باستخدام مدير كلمات المرور\n • حفظه على محرك أقراص خارجي USB\n • كتابته أو طباعته على الورق
## Reset Password ## Reset Password
### Enter Recovery Key ### Enter Recovery Key
recoveryKey.recover.title=إعادة تعيين كلمة المرور
recoveryKey.recover.prompt=أدخل مفتاح الاسترداد لـ "%s":
recoveryKey.recover.correctKey=هذا مفتاح استرداد صالح recoveryKey.recover.correctKey=هذا مفتاح استرداد صالح
recoveryKey.recover.wrongKey=مفتاح الاسترداد هذا ينتمي إلى خزانة مختلفة
recoveryKey.recover.invalidKey=مفتاح الاسترداد غير صالح
recoveryKey.printout.heading=مفتاح استرداد Cryptomator\n"%s"\n recoveryKey.printout.heading=مفتاح استرداد Cryptomator\n"%s"\n
### Reset Password ### Reset Password
recoveryKey.recover.resetBtn=إعادة الضبط
### Recovery Key Password Reset Success ### Recovery Key Password Reset Success
recoveryKey.recover.resetSuccess.message=تم إعادة تعيين كلمة المرور بنجاح
recoveryKey.recover.resetSuccess.description=يمكنك فتح الخزانة الخاصة بك بكلمة المرور الجديدة.
# Convert Vault # Convert Vault
convertVault.title=تحويل الخزانة
convertVault.convert.convertBtn.before=حوّل
convertVault.convert.convertBtn.processing=جاري التحويل…
convertVault.success.message=تم التحويل بنجاح
convertVault.hubToPassword.success.description=يمكنك الآن فتح الخزانة باستخدام كلمة المرور المختارة دون الحاجة إلى الوصول إلى Hub.
# New Password # New Password
newPassword.promptText=أدخل كلمة مرور جديدة newPassword.promptText=أدخل كلمة مرور جديدة
@@ -435,8 +520,46 @@ passwordStrength.messageLabel.3=قوية
passwordStrength.messageLabel.4=قوية جداً passwordStrength.messageLabel.4=قوية جداً
# Quit # Quit
quit.title=إغلاق التطبيق
quit.message=هناك خزانات مفتوحة
quit.description=يرجى تأكيد رغبتك في الخروج. سيقوم Cryptomator بقفل جميع الخزائن غير المقفلة بشكل آمن لمنع فقدان البيانات.
quit.lockAndQuitBtn=قفل و خروج quit.lockAndQuitBtn=قفل و خروج
# Forced Quit # Forced Quit
quit.forced.message=بعض الخزائن لم أتمكن من قفلها
quit.forced.description=تم حظر قفل الخزنات بسبب العمليات المعلقة أو الملفات المفتوحة. يمكنك فرض قفل الخزنات المتبقية، ولكن قد يؤدي مقاطعة عمليات الإدخال/الإخراج إلى فقدان البيانات غير المحفوظة.
quit.forced.forceAndQuitBtn=فرض وإغلاق
# Update Reminder # Update Reminder
updateReminder.title=التحقق من التحديث
updateReminder.message=التحقق من التحديثات؟
updateReminder.description=ابقَ على اطلاع بأحدث الميزات، وإصلاحات الأخطاء، وتحسينات الأمان. نوصي بالتحقق التلقائي من التحديثات.
updateReminder.notNow=ليس الآن
updateReminder.yesOnce=نعم، مرة واحدة
updateReminder.yesAutomatically=نعم، تلقائياً
#Dokany Support End
dokanySupportEnd.title=إشعار بإيقاف الدعم
dokanySupportEnd.message=انتهاء الدعم لـDokany
dokanySupportEnd.description=نوع وحدة التخزين Dokany لم يعد مدعوماً من قبل Cryptomator. تم تعديل إعداداتك لاستخدام نوع وحدة التخزين الافتراضي الآن. يمكنك عرض النوع الافتراضي في التفضيلات.
dokanySupportEnd.preferencesBtn=فتح التفضيلات
# Share Vault
shareVault.title=مشاركة الخزانة
shareVault.message=هل ترغب في مشاركة خزانتك مع الآخرين؟
shareVault.description=كن حذرًا دائمًا عند مشاركة خزانتك مع الآخرين. باختصار، اتبع هذه الخطوات:
shareVault.instruction.1=1. شارك الوصول إلى مجلد الخزانة المشفر عبر التخزين السحابي.
shareVault.instruction.2=2. شارك كلمة مرور الخزانة بطريقة آمنة.
shareVault.remarkBestPractices=لمزيد من المعلومات، تحقق من اقتراحات أفضل الممارسات في مستنداتنا.
shareVault.docsTooltip=افتح وثائق البرنامج Documentation لتعلم المزيد عن مشاركة الخزائن.
shareVault.hubAd.description=الطريقة الآمنة للعمل ضمن الفرق
shareVault.hubAd.keyManagement=• إدارة المفاتيح بدون معرفة
shareVault.hubAd.authentication=• مصادقة قوية
shareVault.hubAd.encryption=• التشفير من الطرف إلى الطرف
shareVault.visitHub=زيارة Cryptomator Hub
shareVault.hub.message=كيفية مشاركة خزانة Hub
shareVault.hub.description=لمشاركة محتوى الخزانة مع عضو آخر في الفريق، عليك القيام بخطوتين:
shareVault.hub.instruction.1=1. شارك الوصول إلى مجلد الخزانة المشفر عبر التخزين السحابي.
shareVault.hub.instruction.2=2. امنح الوصول لعضو الفريق في Cryptomator Hub.
shareVault.hub.openHub=زيارة Cryptomator Hub
+26 -20
View File
@@ -141,8 +141,6 @@ 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.fuseRestartRequired.message=Һаҡлағыс биген сисеп булманы
unlock.error.fuseRestartRequired.description=Һаҡлағыс параметрҙарында күләм төрөн үҙгәртеү йәки Cryptomator-ҙы яңынан башлатыу.
unlock.error.title="%s" биге асылманы unlock.error.title="%s" биге асылманы
## Hub ## Hub
hub.noKeychain.message=Йыһаз асҡысына инеү рөхсәте юҡ hub.noKeychain.message=Йыһаз асҡысына инеү рөхсәте юҡ
@@ -157,17 +155,13 @@ hub.receive.message=Яуапты эшкәртеү…
hub.receive.description=Cryptomator хабтан килгән яуапты ҡабул итә һәм эшкәртә. Зинһар, көтөгөҙ. hub.receive.description=Cryptomator хабтан килгән яуапты ҡабул итә һәм эшкәртә. Зинһар, көтөгөҙ.
### Register Device ### Register Device
hub.register.message=Яңы йыһаз hub.register.message=Яңы йыһаз
hub.register.description=Был йыһаздан хабҡа тәү тапҡыр инеү. Зинһар, иҫәп яҙмаһы асҡысы менән рөхсәт бирегеҙ.
hub.register.nameLabel=Йыһаз исеме hub.register.nameLabel=Йыһаз исеме
hub.register.invalidAccountKeyLabel=Хаталы иҫәп яҙмаһы асҡысы hub.register.invalidAccountKeyLabel=Хаталы иҫәп яҙмаһы асҡысы
hub.register.occupiedMsg=Исем ҡулланыла инде hub.register.registerBtn=Теркәл
hub.register.registerBtn=Раҫла ### Register Device Legacy
### Registration Success ### Registration Success
hub.registerSuccess.message=Йыһаз исемләнде hub.registerSuccess.unlockBtn=Биген ас
hub.registerSuccess.description=Һаҡлағысҡа инеү өсөн һаҡлағыс хужаһы йыһазығыҙға инеү рөхсәте бирергә тейеш.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Йыһазға исем биреп булманы
hub.registerFailed.description=Исемләү процесында хата килеп сыҡты. Тулыраҡ мәғлүмәт өсөн ҡушымта журналын ҡарағыҙ.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Инеү кире ҡағылды hub.unauthorized.message=Инеү кире ҡағылды
hub.unauthorized.description=Һеҙҙең йыһаз әлегә был һаҡлағысҡа инеү хоҡуғына эйә түгел. Һаҡлағыс хужаһынан рөхсәт һорағыҙ. hub.unauthorized.description=Һеҙҙең йыһаз әлегә был һаҡлағысҡа инеү хоҡуғына эйә түгел. Һаҡлағыс хужаһынан рөхсәт һорағыҙ.
@@ -293,7 +287,6 @@ preferences.interface.language.auto=Ғәҙәттәге система көйлә
preferences.interface.interfaceOrientation=Интерфейс йүнәлеше preferences.interface.interfaceOrientation=Интерфейс йүнәлеше
preferences.interface.interfaceOrientation.ltr=Һулдан уңға preferences.interface.interfaceOrientation.ltr=Һулдан уңға
preferences.interface.interfaceOrientation.rtl=Уңдан һулға preferences.interface.interfaceOrientation.rtl=Уңдан һулға
preferences.interface.showMinimizeButton=Бәләкәйләтеү төймәһен күрһәтергә
preferences.interface.showTrayIcon=Панелдә билдәне күрһәтергә (яңынан башлатыу кәрәк) preferences.interface.showTrayIcon=Панелдә билдәне күрһәтергә (яңынан башлатыу кәрәк)
## Volume ## Volume
preferences.volume=Виртуаль диск preferences.volume=Виртуаль диск
@@ -314,12 +307,16 @@ 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 өсөн теркәлгән ярҙамсы сертификаты
preferences.contribute.noCertificate=Cryptomator-ҡа ярҙам итегеҙ һәм ярҙамсы сертификаты алығыҙ. Был рөхсәтнамә асҡысы кеүек, әммә ирекле программа ҡулланған бик шәп кешеләр өсөн. ;-) preferences.contribute.noCertificate=Cryptomator-ҡа ярҙам итегеҙ һәм ярҙамсы сертификаты алығыҙ. Был рөхсәтнамә асҡысы кеүек, әммә ирекле программа ҡулланған бик шәп кешеләр өсөн. ;-)
preferences.contribute.getCertificate=Юҡ мы әллә? Уны нисек алырға кәрәклеген ҡарағыҙ. preferences.contribute.getCertificate=Юҡ мы әллә? Уны нисек алырға кәрәклеген ҡарағыҙ.
preferences.contribute.promptText=Ярҙамсы сертификатын бында йәбештерегеҙ preferences.contribute.promptText=Ярҙамсы сертификатын бында йәбештерегеҙ
### Remove License Key Dialog
removeCert.confirmBtn=Алып ташлау
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -361,11 +358,6 @@ stats.access.total=Барлыҡ инеү: %d
# Main Window # Main Window
main.closeBtn.tooltip=Яп
main.minimizeBtn.tooltip=Бәләкәйләт
main.preferencesBtn.tooltip=Көйләүҙәр
main.debugModeEnabled.tooltip=Төҙөкләндереү режимы асыҡ
main.supporterCertificateMissing.tooltip=Зинһар, иғәнә биреү тураһында уйлағыҙ
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Һаҡлағыс өҫтәү өсөн бында баҫығыҙ main.vaultlist.emptyList.onboardingInstruction=Һаҡлағыс өҫтәү өсөн бында баҫығыҙ
main.vaultlist.contextMenu.remove=Алып ташлау… main.vaultlist.contextMenu.remove=Алып ташлау…
@@ -374,9 +366,7 @@ main.vaultlist.contextMenu.unlock=Бикте асыу…
main.vaultlist.contextMenu.unlockNow=Хәҙер бикте ас main.vaultlist.contextMenu.unlockNow=Хәҙер бикте ас
main.vaultlist.contextMenu.vaultoptions=Һаҡлағыс варианттарын күрһәт main.vaultlist.contextMenu.vaultoptions=Һаҡлағыс варианттарын күрһәт
main.vaultlist.contextMenu.reveal=Дискты күрһәт main.vaultlist.contextMenu.reveal=Дискты күрһәт
main.vaultlist.addVaultBtn=Өҫтәү ##Notificaition
main.vaultlist.addVaultBtn.menuItemNew=Яңы Һаҡлағыс...
main.vaultlist.addVaultBtn.menuItemExisting=Булған һаҡлағыс...
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Файлдарығыҙҙы һаҡлау өсөн Cryptomator-ҙы һайлағанығыҙ өсөн рәхмәт. Әгәр һеҙгә ярҙам кәрәк булһа, башлау буйынса белешмәләребеҙҙе ҡарағыҙ: main.vaultDetail.welcomeOnboarding=Файлдарығыҙҙы һаҡлау өсөн Cryptomator-ҙы һайлағанығыҙ өсөн рәхмәт. Әгәр һеҙгә ярҙам кәрәк булһа, башлау буйынса белешмәләребеҙҙе ҡарағыҙ:
@@ -451,7 +441,6 @@ 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.default=Ғәҙәттәгеләр (%s)
vaultOptions.mount.volumeType.fuseRestartRequired=Был том төрөн ҡулланыу өсөн Cryptomator-ҙы яңынан асыу кәрәк.
vaultOptions.mount.volume.tcp.port=TCP порты vaultOptions.mount.volume.tcp.port=TCP порты
vaultOptions.mount.volume.type=Том төрө vaultOptions.mount.volume.type=Том төрө
## Master Key ## Master Key
@@ -498,17 +487,34 @@ convertVault.hubToPassword.success.description=Хәҙер һеҙ һайланғ
newPassword.promptText=Яңы серһүҙ яҙығыҙ newPassword.promptText=Яңы серһүҙ яҙығыҙ
newPassword.reenterPassword=Яңы серһүҙҙе раҫлағыҙ newPassword.reenterPassword=Яңы серһүҙҙе раҫлағыҙ
newPassword.passwordsMatch=Серһүҙҙәр тап килә! newPassword.passwordsMatch=Серһүҙҙәр тап килә!
newPassword.passwordsDoNotMatch=Серһүҙҙәр тап килмәй
passwordStrength.messageLabel.tooShort=Кәмендә %d билдә ҡулланығыҙ
passwordStrength.messageLabel.0=Бик көсһөҙ
passwordStrength.messageLabel.1=Көсһөҙ
passwordStrength.messageLabel.2=Уртаса
passwordStrength.messageLabel.3=Көслө
passwordStrength.messageLabel.4=Бик көслө
# Quit # Quit
quit.title=Ҡушымтанан сығыу quit.title=Ҡушымтанан сығыу
quit.message=Асыҡ һаҡлағыстар бар
quit.description=Сығырға теләүегеҙҙе раҫлағыҙ. Cryptomator мәғлүмәтте юғалтыуҙан һаҡлар өсөн бөтә һаҡлағыстарҙы бикләп ҡуя. quit.description=Сығырға теләүегеҙҙе раҫлағыҙ. Cryptomator мәғлүмәтте юғалтыуҙан һаҡлар өсөн бөтә һаҡлағыстарҙы бикләп ҡуя.
quit.lockAndQuitBtn=Биклә һәм сыҡ quit.lockAndQuitBtn=Биклә һәм сыҡ
# Forced Quit # Forced Quit
quit.forced.message=Ҡайһы бер һаҡлағыстарҙы бикләп булмай
quit.forced.description=Көтөп торған ғәмәлдәр йәки асыҡ файлдар һаҡлағыстарҙы бикләүҙе тотҡарланы. Был һаҡлағыстарҙы көсләп бикләп була, ләкин инеү-сығыуҙы өҙөү һаҡланмаған мәғлүмәттәрҙе юғалтыуға килтереүе ихтимал. quit.forced.description=Көтөп торған ғәмәлдәр йәки асыҡ файлдар һаҡлағыстарҙы бикләүҙе тотҡарланы. Был һаҡлағыстарҙы көсләп бикләп була, ләкин инеү-сығыуҙы өҙөү һаҡланмаған мәғлүмәттәрҙе юғалтыуға килтереүе ихтимал.
quit.forced.forceAndQuitBtn=Көсләп биклә һәм сыҡ
# Update Reminder # Update Reminder
updateReminder.title=Яңыртыуҙарҙы тикшереү
updateReminder.message=Яңыртыуҙарҙы тикшерергәме?
updateReminder.description=Яңы үҙенсәлектәр, хаталарҙы төҙәтеү, хәүефһеҙлекте яҡшыртыу менән яңыртылып торорға. Яңыртыуҙарҙы автоматик рәүештә тикшереүҙе кәңәш итәбеҙ. updateReminder.description=Яңы үҙенсәлектәр, хаталарҙы төҙәтеү, хәүефһеҙлекте яҡшыртыу менән яңыртылып торорға. Яңыртыуҙарҙы автоматик рәүештә тикшереүҙе кәңәш итәбеҙ.
updateReminder.notNow=Хәҙер түгел updateReminder.notNow=Хәҙер түгел
updateReminder.yesOnce=Эйе, бер тапҡыр updateReminder.yesOnce=Эйе, бер тапҡыр
updateReminder.yesAutomatically=Эйе, автоматик рәүештә updateReminder.yesAutomatically=Эйе, автоматик рәүештә
#Dokany Support End
dokanySupportEnd.preferencesBtn=Көйләүҙәрҙе ас
# Share Vault
+13 -16
View File
@@ -151,14 +151,10 @@ hub.receive.description=Cryptomator атрымлівае ды апрацоўва
### Register Device ### Register Device
hub.register.message=Новая прылада hub.register.message=Новая прылада
hub.register.nameLabel=Назва прылады hub.register.nameLabel=Назва прылады
hub.register.occupiedMsg=Назва ўжо ўжытая ### Register Device Legacy
hub.register.registerBtn=Пацвердзіць
### Registration Success ### Registration Success
hub.registerSuccess.message=Прылада атрымала назву hub.registerSuccess.unlockBtn=Адамкнуць
hub.registerSuccess.description=Каб атрымаць доступ да скарбніцы, твая прылада мусіць быць спраўджанай уладальнікам скарбніцы.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Памылка пры называнні прылады
hub.registerFailed.description=Падчас прысваення імя адбылася памылка. Па дэтальную інфармацыю звярніся да пратаколу праграмы.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Адмова ў доступе hub.unauthorized.message=Адмова ў доступе
hub.unauthorized.description=Тваёй прыладзе ў дадзены момант не дазволена мець доступ да гэтай скрабніцы. Запытайся ўладальніка скрабніцы за дазволам. hub.unauthorized.description=Тваёй прыладзе ў дадзены момант не дазволена мець доступ да гэтай скрабніцы. Запытайся ўладальніка скрабніцы за дазволам.
@@ -280,7 +276,6 @@ preferences.interface.language.auto=Сістэма па змаўчанні
preferences.interface.interfaceOrientation=Арыентацыя інтэрфэйсу preferences.interface.interfaceOrientation=Арыентацыя інтэрфэйсу
preferences.interface.interfaceOrientation.ltr=Злева ўправа preferences.interface.interfaceOrientation.ltr=Злева ўправа
preferences.interface.interfaceOrientation.rtl=Справа ўлева preferences.interface.interfaceOrientation.rtl=Справа ўлева
preferences.interface.showMinimizeButton=Паказаць кнопку згортвання
preferences.interface.showTrayIcon=Паказваць іконку на інфармацыйнай панэлі (спатрэбіцца перазапуск) preferences.interface.showTrayIcon=Паказваць іконку на інфармацыйнай панэлі (спатрэбіцца перазапуск)
## Volume ## Volume
preferences.volume=Віртуальны дыск preferences.volume=Віртуальны дыск
@@ -299,12 +294,16 @@ 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
preferences.contribute.noCertificate=Ахвяруй на Cryptomator ды атрымай сэртыфікат ахвяравальніка. Гэта штось падобнае на ліцэнзійны ключ, але для цудоўных людзей, якія карыстаюцца бясплатнай праграмай. ;-) preferences.contribute.noCertificate=Ахвяруй на Cryptomator ды атрымай сэртыфікат ахвяравальніка. Гэта штось падобнае на ліцэнзійны ключ, але для цудоўных людзей, якія карыстаюцца бясплатнай праграмай. ;-)
preferences.contribute.getCertificate=Яшчэ ня маеш такога? Даведайся, як атрымаць. preferences.contribute.getCertificate=Яшчэ ня маеш такога? Даведайся, як атрымаць.
preferences.contribute.promptText=Устаў код сэртыфікату ахвяравальніка сюды preferences.contribute.promptText=Устаў код сэртыфікату ахвяравальніка сюды
### Remove License Key Dialog
removeCert.confirmBtn=Выдаліць
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -346,11 +345,6 @@ stats.access.total=Доступы агулам: %d
# Main Window # Main Window
main.closeBtn.tooltip=Зачыніць
main.minimizeBtn.tooltip=Згарнуць
main.preferencesBtn.tooltip=Налады
main.debugModeEnabled.tooltip=Функццыя дыягназавання выключана
main.supporterCertificateMissing.tooltip=Калі ласка, падумай пра ахвяраванне
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Пстрыкні тут, каб дадаць скарбніцу main.vaultlist.emptyList.onboardingInstruction=Пстрыкні тут, каб дадаць скарбніцу
main.vaultlist.contextMenu.remove=Выдаліць… main.vaultlist.contextMenu.remove=Выдаліць…
@@ -359,9 +353,7 @@ main.vaultlist.contextMenu.unlock=Адамкнуць…
main.vaultlist.contextMenu.unlockNow=Разамкнуць зараз main.vaultlist.contextMenu.unlockNow=Разамкнуць зараз
main.vaultlist.contextMenu.vaultoptions=Паказаць параметры скарбніцы main.vaultlist.contextMenu.vaultoptions=Паказаць параметры скарбніцы
main.vaultlist.contextMenu.reveal=Паказаць дыск main.vaultlist.contextMenu.reveal=Паказаць дыск
main.vaultlist.addVaultBtn=Дадаць ##Notificaition
main.vaultlist.addVaultBtn.menuItemNew=Новая скарбніца...
main.vaultlist.addVaultBtn.menuItemExisting=Існуючая скрабніца...
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Дзякуй, што ты абраў Cryptomator для абароны тваіх файлаў. Калі табе патрэбна дапамога, калі ласка, паглядзі нашы інструкцыі: main.vaultDetail.welcomeOnboarding=Дзякуй, што ты абраў Cryptomator для абароны тваіх файлаў. Калі табе патрэбна дапамога, калі ласка, паглядзі нашы інструкцыі:
@@ -500,4 +492,9 @@ updateReminder.title=Праверка абнаўленняў
updateReminder.message=Ці праверыць абнаўленні? updateReminder.message=Ці праверыць абнаўленні?
updateReminder.notNow=Не цяпер updateReminder.notNow=Не цяпер
updateReminder.yesOnce=Так, аднойчы updateReminder.yesOnce=Так, аднойчы
updateReminder.yesAutomatically=Так, аўтаматычна updateReminder.yesAutomatically=Так, аўтаматычна
#Dokany Support End
dokanySupportEnd.preferencesBtn=Адчыніць налады
# Share Vault
+14 -20
View File
@@ -141,8 +141,6 @@ 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.fuseRestartRequired.message=Хранилището не може да бъде отключено
unlock.error.fuseRestartRequired.description=Променете вида на тома в настройките на хранилището или рестартирайте Криптоматор.
unlock.error.title=Неуспешно отключване на „%s“ unlock.error.title=Неуспешно отключване на „%s“
## Hub ## Hub
hub.noKeychain.message=Няма достъп до ключа на устройството hub.noKeychain.message=Няма достъп до ключа на устройството
@@ -157,17 +155,13 @@ hub.receive.message=Обработване на отговора…
hub.receive.description=Криптоматор получава и обработва отговора от Hub. Изчакайте. hub.receive.description=Криптоматор получава и обработва отговора от Hub. Изчакайте.
### Register Device ### Register Device
hub.register.message=Ново устройство hub.register.message=Ново устройство
hub.register.description=За пръв път посещавате Hub от това устройство. Удостоверете го, като използвате ключа на профила.
hub.register.nameLabel=Име на устройството hub.register.nameLabel=Име на устройството
hub.register.invalidAccountKeyLabel=Неприемлив ключ на профила hub.register.invalidAccountKeyLabel=Неприемлив ключ на профила
hub.register.occupiedMsg=Това име вече е заето hub.register.registerBtn=Регистриране
hub.register.registerBtn=Потвърждаване ### Register Device Legacy
### Registration Success ### Registration Success
hub.registerSuccess.message=Устройството е именувано hub.registerSuccess.unlockBtn=Отключване
hub.registerSuccess.description=За да получи достъп до хранилището, устройството трябва да бъде упълномощено от собственика на хранилището.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Грешка при именуване на устройството
hub.registerFailed.description=В процеса на именуване е допусната грешка. За повече подробности разгледайте дневника на приложението.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Отказан достъп hub.unauthorized.message=Отказан достъп
hub.unauthorized.description=Устройството не е упълномощено за достъп до това хранилище. Поискайте достъп от собственика. hub.unauthorized.description=Устройството не е упълномощено за достъп до това хранилище. Поискайте достъп от собственика.
@@ -293,7 +287,6 @@ preferences.interface.language.auto=Подразбиран
preferences.interface.interfaceOrientation=Посока на текста preferences.interface.interfaceOrientation=Посока на текста
preferences.interface.interfaceOrientation.ltr=От ляво на дясно preferences.interface.interfaceOrientation.ltr=От ляво на дясно
preferences.interface.interfaceOrientation.rtl=От дясно на ляво preferences.interface.interfaceOrientation.rtl=От дясно на ляво
preferences.interface.showMinimizeButton=Бутон за скриване
preferences.interface.showTrayIcon=Икона в областта за известия (изисква рестарт) preferences.interface.showTrayIcon=Икона в областта за известия (изисква рестарт)
## Volume ## Volume
preferences.volume=Виртуален диск preferences.volume=Виртуален диск
@@ -314,12 +307,16 @@ 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
preferences.contribute.noCertificate=Ако подкрепите Криптоматор ще получите сертификат за дарение. Това е като лицензен ключ, но за готини хора, които използват безплатен софтуер. ;-) preferences.contribute.noCertificate=Ако подкрепите Криптоматор ще получите сертификат за дарение. Това е като лицензен ключ, но за готини хора, които използват безплатен софтуер. ;-)
preferences.contribute.getCertificate=Все още нямате? Научете как да се сдобиете. preferences.contribute.getCertificate=Все още нямате? Научете как да се сдобиете.
preferences.contribute.promptText=Поставете тук кода на сертификата за дарение preferences.contribute.promptText=Поставете тук кода на сертификата за дарение
### Remove License Key Dialog
removeCert.confirmBtn=Премахване
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -361,11 +358,6 @@ stats.access.total=Общо достъпвания: %d
# Main Window # Main Window
main.closeBtn.tooltip=Затваряне
main.minimizeBtn.tooltip=Скриване
main.preferencesBtn.tooltip=Настройки
main.debugModeEnabled.tooltip=Режимът за премахване на дефекти е включен
main.supporterCertificateMissing.tooltip=Обмислете дарение
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Щракнете, за да добавите хранилище main.vaultlist.emptyList.onboardingInstruction=Щракнете, за да добавите хранилище
main.vaultlist.contextMenu.remove=Премахване… main.vaultlist.contextMenu.remove=Премахване…
@@ -374,9 +366,7 @@ main.vaultlist.contextMenu.unlock=Отключване…
main.vaultlist.contextMenu.unlockNow=Отключване сега main.vaultlist.contextMenu.unlockNow=Отключване сега
main.vaultlist.contextMenu.vaultoptions=Настройки на хранилището main.vaultlist.contextMenu.vaultoptions=Настройки на хранилището
main.vaultlist.contextMenu.reveal=Разкриване на диска main.vaultlist.contextMenu.reveal=Разкриване на диска
main.vaultlist.addVaultBtn=Добавяне ##Notificaition
main.vaultlist.addVaultBtn.menuItemNew=Ново хранилище…
main.vaultlist.addVaultBtn.menuItemExisting=Съществуващо хранилище…
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Благодарим ви, че избрахте Криптоматор, за да предпазвате файловете си. Ако имате нужда от съдействие прочетете ръководствата за започване на работа с приложението: main.vaultDetail.welcomeOnboarding=Благодарим ви, че избрахте Криптоматор, за да предпазвате файловете си. Ако имате нужда от съдействие прочетете ръководствата за започване на работа с приложението:
@@ -451,7 +441,6 @@ 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.default=По подразбиране (%s)
vaultOptions.mount.volumeType.fuseRestartRequired=За да използвате този вид томове, трябва да рестартирате Криптоматор.
vaultOptions.mount.volume.tcp.port=Порт на TCP vaultOptions.mount.volume.tcp.port=Порт на TCP
vaultOptions.mount.volume.type=Вид на тома vaultOptions.mount.volume.type=Вид на тома
## Master Key ## Master Key
@@ -523,4 +512,9 @@ updateReminder.message=Проверяване за обновяване?
updateReminder.description=Получавайте нови възможности на приложението, поправки на дефекти и подобрения на сигурността. Препоръчваме ви автоматичното обновяване. updateReminder.description=Получавайте нови възможности на приложението, поправки на дефекти и подобрения на сигурността. Препоръчваме ви автоматичното обновяване.
updateReminder.notNow=Не сега updateReminder.notNow=Не сега
updateReminder.yesOnce=Да, веднъж updateReminder.yesOnce=Да, веднъж
updateReminder.yesAutomatically=Да, автоматично updateReminder.yesAutomatically=Да, автоматично
#Dokany Support End
dokanySupportEnd.preferencesBtn=Към настройките
# Share Vault
+13 -3
View File
@@ -20,6 +20,7 @@ error.description=ওহো! ক্রিপ্টোমেটর এটা য
error.hyperlink.lookup=ত্রুটিটি খুঁজে দেখুন error.hyperlink.lookup=ত্রুটিটি খুঁজে দেখুন
error.hyperlink.report=ত্রুটিটি রিপোর্ট করুন error.hyperlink.report=ত্রুটিটি রিপোর্ট করুন
error.technicalDetails=বিস্তারিত: error.technicalDetails=বিস্তারিত:
error.existingSolutionDescription=এটা হওয়ার কথা ছিল না. যদিও এ সমস্যার জন্য বিদ্যমান একটি সমাধান রয়েছে. অনুগ্রহ করে লিংকটিতে যান.
# Defaults # Defaults
defaults.vault.vaultName=ভোল্ট defaults.vault.vaultName=ভোল্ট
@@ -89,8 +90,9 @@ unlock.unlockBtn=আনলক করুন
### Waiting ### Waiting
### Receive Key ### Receive Key
### Register Device ### Register Device
hub.register.registerBtn=নিশ্চিত করুন ### Register Device Legacy
### Registration Success ### Registration Success
hub.registerSuccess.unlockBtn=আনলক করুন
### Registration Failed ### Registration Failed
### Unauthorized ### Unauthorized
### Requires Account Initialization ### Requires Account Initialization
@@ -121,7 +123,11 @@ lock.forced.retryBtn=পুনরায় চেষ্টা করুন
## Interface ## Interface
## Volume ## Volume
## Updates ## Updates
## Contribution ## Contribution
### Remove License Key Dialog
removeCert.confirmBtn=বাতিল
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -134,9 +140,9 @@ lock.forced.retryBtn=পুনরায় চেষ্টা করুন
# Main Window # Main Window
main.closeBtn.tooltip=বন্ধ করুন
## Vault List ## Vault List
main.vaultlist.contextMenu.lock=লক করুন main.vaultlist.contextMenu.lock=লক করুন
##Notificaition
## Vault Detail ## Vault Detail
### Welcome ### Welcome
### Locked ### Locked
@@ -172,4 +178,8 @@ vaultOptions.mount.mountPoint.directoryPickerButton=নির্বাচন ক
# Forced Quit # Forced Quit
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault
+12 -7
View File
@@ -105,8 +105,9 @@ unlock.success.revealBtn=Otkrij pogon
### Waiting ### Waiting
### Receive Key ### Receive Key
### Register Device ### Register Device
hub.register.registerBtn=Potvrdi ### Register Device Legacy
### Registration Success ### Registration Success
hub.registerSuccess.unlockBtn=Otključaj
### Registration Failed ### Registration Failed
### Unauthorized ### Unauthorized
### Requires Account Initialization ### Requires Account Initialization
@@ -170,7 +171,11 @@ 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
### Remove License Key Dialog
removeCert.confirmBtn=Ukloni
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -204,11 +209,6 @@ stats.write.accessCount=Ukupno upisano: %d
# Main Window # Main Window
main.closeBtn.tooltip=Zatvori
main.minimizeBtn.tooltip=Minimiziraj
main.preferencesBtn.tooltip=Postavke
main.debugModeEnabled.tooltip=Omogućen je mod otklanjanja pogrešaka
main.supporterCertificateMissing.tooltip=Molimo razmislite o doniranju
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Kliknite ovdje da dodate sef main.vaultlist.emptyList.onboardingInstruction=Kliknite ovdje da dodate sef
main.vaultlist.contextMenu.remove=Ukloni… main.vaultlist.contextMenu.remove=Ukloni…
@@ -217,6 +217,7 @@ main.vaultlist.contextMenu.unlock=Otključaj…
main.vaultlist.contextMenu.unlockNow=Otključaj sada main.vaultlist.contextMenu.unlockNow=Otključaj sada
main.vaultlist.contextMenu.vaultoptions=Pokaži opcije sefa main.vaultlist.contextMenu.vaultoptions=Pokaži opcije sefa
main.vaultlist.contextMenu.reveal=Otkrij pogon main.vaultlist.contextMenu.reveal=Otkrij pogon
##Notificaition
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Hvala što ste izabrali Cryptomator za zaštitu podataka. Ako vam je potrebna pomoć, pogledajte naše vodiče za početak: main.vaultDetail.welcomeOnboarding=Hvala što ste izabrali Cryptomator za zaštitu podataka. Ako vam je potrebna pomoć, pogledajte naše vodiče za početak:
@@ -314,4 +315,8 @@ quit.lockAndQuitBtn=Zaključaj i zatvori
# Forced Quit # Forced Quit
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault
+58 -16
View File
@@ -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,19 +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.occupiedMsg=El nom ja està en ús hub.register.invalidAccountKeyLabel=Account Key no és vàlida
hub.register.registerBtn=Confirma hub.register.registerBtn=Registre
### 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=Unitat anomenada hub.registerSuccess.message=Dispositiu registrat
hub.registerSuccess.description=Per a accedir a la caixa forta, el vostre dispositiu ha de ser autoritzat pel propietari de la caixa. hub.registerSuccess.description=El vostre dispositiu ha estat registrat correctament. Ara podeu desblocar la caixa forta.
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=Error al nombrar el dispositiu hub.registerFailed.message=El registre del dispositiu ha fallat
hub.registerFailed.description=S'ha produït un error en el procés de nomenament. Per més detalls vegeu el registre de l'aplicació. 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,13 +299,14 @@ preferences.interface.language.auto=Valor predeterminat del sistema
preferences.interface.interfaceOrientation=Orientació de la interfície preferences.interface.interfaceOrientation=Orientació de la interfície
preferences.interface.interfaceOrientation.ltr=Esquerra a dreta preferences.interface.interfaceOrientation.ltr=Esquerra a dreta
preferences.interface.interfaceOrientation.rtl=Dreta a esquerra preferences.interface.interfaceOrientation.rtl=Dreta a esquerra
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
@@ -303,12 +319,16 @@ 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
preferences.contribute.noCertificate=Doneu suport a Cryptomator i rebeu un certificat de col·laborador. És com una clau de llicència però per a gent meravellosa que fa servir programari lliure. ;-) preferences.contribute.noCertificate=Doneu suport a Cryptomator i rebeu un certificat de col·laborador. És com una clau de llicència però per a gent meravellosa que fa servir programari lliure. ;-)
preferences.contribute.getCertificate=Encara no en teniu cap? Sapigueu com aconseguir-ne un. preferences.contribute.getCertificate=Encara no en teniu cap? Sapigueu com aconseguir-ne un.
preferences.contribute.promptText=Enganxeu aquí el certificat de col·laborador preferences.contribute.promptText=Enganxeu aquí el certificat de col·laborador
### Remove License Key Dialog
removeCert.confirmBtn=Elimina
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -350,11 +370,6 @@ stats.access.total=Total d'accessos: %d
# Main Window # Main Window
main.closeBtn.tooltip=Tanca
main.minimizeBtn.tooltip=Minimitza
main.preferencesBtn.tooltip=Preferències
main.debugModeEnabled.tooltip=Mode depuració activat
main.supporterCertificateMissing.tooltip=Si us plau, considereu fer una donació
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Feu clic aquí per afegir una caixa forta main.vaultlist.emptyList.onboardingInstruction=Feu clic aquí per afegir una caixa forta
main.vaultlist.contextMenu.remove=Elimina… main.vaultlist.contextMenu.remove=Elimina…
@@ -363,9 +378,7 @@ main.vaultlist.contextMenu.unlock=Desbloca…
main.vaultlist.contextMenu.unlockNow=Desbloqueja ara main.vaultlist.contextMenu.unlockNow=Desbloqueja ara
main.vaultlist.contextMenu.vaultoptions=Opcions de la caixa forta main.vaultlist.contextMenu.vaultoptions=Opcions de la caixa forta
main.vaultlist.contextMenu.reveal=Mostra la unitat main.vaultlist.contextMenu.reveal=Mostra la unitat
main.vaultlist.addVaultBtn=Afegir ##Notificaition
main.vaultlist.addVaultBtn.menuItemNew=Nova caixa forta...
main.vaultlist.addVaultBtn.menuItemExisting=Caixa forta existent...
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Gràcies per escollir Cryptomator per protegir els vostres fitxers. Si vos cal ajuda, llegiu les nostres guies per donar els Primers passos: main.vaultDetail.welcomeOnboarding=Gràcies per escollir Cryptomator per protegir els vostres fitxers. Si vos cal ajuda, llegiu les nostres guies per donar els Primers passos:
@@ -375,6 +388,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í:
@@ -429,6 +443,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
@@ -438,6 +453,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
@@ -507,4 +526,27 @@ updateReminder.message=Comprova si hi ha actualitzacions?
updateReminder.description=Per estar actualitzat amb funcions noves, correccions d'errors i millores de seguretat recomanem comprovar les actualitzacions automàticament. updateReminder.description=Per estar actualitzat amb funcions noves, correccions d'errors i millores de seguretat recomanem comprovar les actualitzacions automàticament.
updateReminder.notNow=Ara no 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
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
+81 -13
View File
@@ -23,6 +23,8 @@ error.technicalDetails=Podrobnosti:
error.existingSolutionDescription=Cryptomator neočekával, že se tak stane. Našli jsme však existující řešení pro tuto chybu. Podívejte se prosím na následující odkaz. error.existingSolutionDescription=Cryptomator neočekával, že se tak stane. Našli jsme však existující řešení pro tuto chybu. Podívejte se prosím na následující odkaz.
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.lookUpSolution=Vyhledat řešení
# Defaults # Defaults
defaults.vault.vaultName=Trezor defaults.vault.vaultName=Trezor
@@ -39,11 +41,13 @@ traymenu.vault.reveal=Zobrazit
# Add Vault Wizard # Add Vault Wizard
addvaultwizard.title=Přidat trezor addvaultwizard.title=Přidat trezor
## New ## New
addvaultwizard.new.title=Přidat nový trezor
### Name ### Name
addvaultwizard.new.nameInstruction=Zvolte jméno trezoru 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í
@@ -88,6 +92,7 @@ addvault.new.readme.accessLocation.2=Toto je místo přístupu vašeho trezoru.
addvault.new.readme.accessLocation.3=Všechny soubory přidané do tohoto svazku budou šifrovány Cryptomatorem. Můžete na něm pracovat na jiném disku/složce. Toto je pouze dešifrovaný pohled na jeho obsah, vaše soubory zůstávají na pevném disku stále zašifrovány. addvault.new.readme.accessLocation.3=Všechny soubory přidané do tohoto svazku budou šifrovány Cryptomatorem. Můžete na něm pracovat na jiném disku/složce. Toto je pouze dešifrovaný pohled na jeho obsah, vaše soubory zůstávají na pevném disku stále zašifrovány.
addvault.new.readme.accessLocation.4=Tento soubor můžete odstranit. addvault.new.readme.accessLocation.4=Tento soubor můžete odstranit.
## Existing ## Existing
addvaultwizard.existing.title=Přidat existující trezor
addvaultwizard.existing.instruction=Vyberte soubor "vault.cryptomator" z existujícího trezoru. Pokud existuje pouze soubor s názvem "masterkey.cryptomator", vyberte jej. addvaultwizard.existing.instruction=Vyberte soubor "vault.cryptomator" z existujícího trezoru. Pokud existuje pouze soubor s názvem "masterkey.cryptomator", vyberte jej.
addvaultwizard.existing.chooseBtn=Vybrat... addvaultwizard.existing.chooseBtn=Vybrat...
addvaultwizard.existing.filePickerTitle=Vyberte soubor trezoru addvaultwizard.existing.filePickerTitle=Vyberte soubor trezoru
@@ -132,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í…
@@ -141,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.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.occupiedMsg=Jméno je již používáno hub.register.invalidAccountKeyLabel=Neplatný Account Key
hub.register.registerBtn=Potvrdit hub.register.registerBtn=Registrovat
### 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=Jméno zařízení hub.registerSuccess.message=Zařízení registrováno
hub.registerSuccess.description=Pro přístup k trezoru musí být vaše zařízení autorizováno majitelem trezoru. 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.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=Pojmenování zařízení se nezdařilo 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.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á
@@ -233,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í…
@@ -248,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
@@ -264,11 +289,15 @@ preferences.interface.language.auto=Podle systému
preferences.interface.interfaceOrientation=Orientace preferences.interface.interfaceOrientation=Orientace
preferences.interface.interfaceOrientation.ltr=Zleva doprava preferences.interface.interfaceOrientation.ltr=Zleva doprava
preferences.interface.interfaceOrientation.rtl=Zprava doleva preferences.interface.interfaceOrientation.rtl=Zprava doleva
preferences.interface.showMinimizeButton=Zobrazit tlačítko minimalizovat
preferences.interface.showTrayIcon=Zobrazit ikonu v liště (vyžaduje restart) preferences.interface.showTrayIcon=Zobrazit ikonu v liště (vyžaduje restart)
## Volume ## Volume
preferences.volume=Virtuální jednotky preferences.volume=Virtuální 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
@@ -277,12 +306,16 @@ 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
preferences.contribute.noCertificate=Podpořte Cryptomator a získejte certifikát podporovatele. Je to jako licenční klíč, ale pro skvělé lidi, kteří používají svobodný software. ;-) preferences.contribute.noCertificate=Podpořte Cryptomator a získejte certifikát podporovatele. Je to jako licenční klíč, ale pro skvělé lidi, kteří používají svobodný software. ;-)
preferences.contribute.getCertificate=Ještě žádný nemáte? Naučte se, jak ho můžete získat. preferences.contribute.getCertificate=Ještě žádný nemáte? Naučte se, jak ho můžete získat.
preferences.contribute.promptText=Sem vložte kód certifikátu podporovatele preferences.contribute.promptText=Sem vložte kód certifikátu podporovatele
### Remove License Key Dialog
removeCert.confirmBtn=Odstranit
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -324,11 +357,6 @@ stats.access.total=Přístup celkem: %d
# Main Window # Main Window
main.closeBtn.tooltip=Zavřít
main.minimizeBtn.tooltip=Minimalizovat
main.preferencesBtn.tooltip=Nastavení
main.debugModeEnabled.tooltip=Režim ladění je povolen
main.supporterCertificateMissing.tooltip=Prosím, zvažte darování
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klikněte zde pro přidání nového trezoru main.vaultlist.emptyList.onboardingInstruction=Klikněte zde pro přidání nového trezoru
main.vaultlist.contextMenu.remove=Odstranit… main.vaultlist.contextMenu.remove=Odstranit…
@@ -337,7 +365,7 @@ main.vaultlist.contextMenu.unlock=Odemknout…
main.vaultlist.contextMenu.unlockNow=Odemknout nyní main.vaultlist.contextMenu.unlockNow=Odemknout nyní
main.vaultlist.contextMenu.vaultoptions=Zobrazit možnosti trezoru main.vaultlist.contextMenu.vaultoptions=Zobrazit možnosti trezoru
main.vaultlist.contextMenu.reveal=Zobrazit jednotku main.vaultlist.contextMenu.reveal=Zobrazit jednotku
main.vaultlist.addVaultBtn=Přidat ##Notificaition
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Děkujeme, že jste si vybrali Cryptomator pro ochranu vašich souborů. Pokud potřebujete pomoc, podívejte se na naše návody: main.vaultDetail.welcomeOnboarding=Děkujeme, že jste si vybrali Cryptomator pro ochranu vašich souborů. Pokud potřebujete pomoc, podívejte se na naše návody:
@@ -347,6 +375,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ý:
@@ -360,7 +389,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
@@ -405,8 +436,12 @@ 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.type=Typ jednotky
## Master Key ## Master Key
vaultOptions.masterkey=Heslo vaultOptions.masterkey=Heslo
vaultOptions.masterkey.changePasswordBtn=Změnit heslo vaultOptions.masterkey.changePasswordBtn=Změnit heslo
@@ -429,14 +464,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.convert.convertBtn.before=Převést
convertVault.convert.convertBtn.processing=Převádě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
@@ -465,4 +509,28 @@ updateReminder.message=Zkontrolovat aktualizace?
updateReminder.description=Získejte aktuální informace o nových funkcích, opravách chyb a vylepšeních zabezpečení. Doporučujeme automaticky kontrolovat aktualizace. updateReminder.description=Získejte aktuální informace o nových funkcích, opravách chyb a vylepšeních zabezpečení. Doporučujeme automaticky kontrolovat aktualizace.
updateReminder.notNow=Nyní ne 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
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
+58 -16
View File
@@ -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,19 +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.occupiedMsg=Navnet er allerede i brug hub.register.invalidAccountKeyLabel=Ugyldig Account Key
hub.register.registerBtn=Bekræft hub.register.registerBtn=Registrer
### 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 navngivet hub.registerSuccess.message=Enhed registreret
hub.registerSuccess.description=For at tilgå boksen, skal din enhed godkendes af boks-ejeren. 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.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=Navngivning af enhed mislykkedes hub.registerFailed.message=Enheds registrering mislykkedes
hub.registerFailed.description=Der opstod en fejl i navngivnings-processen. Kig i applikations-loggen for flere detaljer. 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,13 +299,14 @@ preferences.interface.language.auto=System standard
preferences.interface.interfaceOrientation=Brugerflade retning preferences.interface.interfaceOrientation=Brugerflade retning
preferences.interface.interfaceOrientation.ltr=Venstre til højre preferences.interface.interfaceOrientation.ltr=Venstre til højre
preferences.interface.interfaceOrientation.rtl=Højre til venstre preferences.interface.interfaceOrientation.rtl=Højre til venstre
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
@@ -303,12 +319,16 @@ 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
preferences.contribute.noCertificate=Hjælp Cryptomator, og modtag et supporter-certifikat. Det er ligesom en license-nøgle, men til fantastiske mennesker som bruger fri software. ;-) preferences.contribute.noCertificate=Hjælp Cryptomator, og modtag et supporter-certifikat. Det er ligesom en license-nøgle, men til fantastiske mennesker som bruger fri software. ;-)
preferences.contribute.getCertificate=Har du ikke et allerede? Se her hvordan du kan få et. preferences.contribute.getCertificate=Har du ikke et allerede? Se her hvordan du kan få et.
preferences.contribute.promptText=Indsæt koden for supporter-certifikatet her preferences.contribute.promptText=Indsæt koden for supporter-certifikatet her
### Remove License Key Dialog
removeCert.confirmBtn=Fjern
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -350,11 +370,6 @@ stats.access.total=Samlede adgang: %d
# Main Window # Main Window
main.closeBtn.tooltip=Luk
main.minimizeBtn.tooltip=Minimér
main.preferencesBtn.tooltip=Præferencer
main.debugModeEnabled.tooltip=Fejlfindingstilstand er aktiveret
main.supporterCertificateMissing.tooltip=Overvej venligst at donere
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klik her for at tilføje en boks main.vaultlist.emptyList.onboardingInstruction=Klik her for at tilføje en boks
main.vaultlist.contextMenu.remove=Fjern… main.vaultlist.contextMenu.remove=Fjern…
@@ -363,9 +378,7 @@ main.vaultlist.contextMenu.unlock=Lås op…
main.vaultlist.contextMenu.unlockNow=Lås op nu main.vaultlist.contextMenu.unlockNow=Lås op nu
main.vaultlist.contextMenu.vaultoptions=Vis boksindstillinger main.vaultlist.contextMenu.vaultoptions=Vis boksindstillinger
main.vaultlist.contextMenu.reveal=Vis drev main.vaultlist.contextMenu.reveal=Vis drev
main.vaultlist.addVaultBtn=Tilføj ##Notificaition
main.vaultlist.addVaultBtn.menuItemNew=Ny Boks...
main.vaultlist.addVaultBtn.menuItemExisting=Eksisterende Boks...
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Tak fordi du valgte Cryptomator til at beskytte dine filer. Hvis du har brug for hjælp, så tjek vores guider for at komme i gang: main.vaultDetail.welcomeOnboarding=Tak fordi du valgte Cryptomator til at beskytte dine filer. Hvis du har brug for hjælp, så tjek vores guider for at komme i gang:
@@ -375,6 +388,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:
@@ -429,6 +443,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
@@ -438,6 +453,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
@@ -507,4 +526,27 @@ updateReminder.message=Tjek for opdateringer?
updateReminder.description=Hold dig opdateret med nye funktioner, fejlrettelser og sikkerhedsforbedringer. Vi anbefaler automatisk at søge efter opdateringer. updateReminder.description=Hold dig opdateret med nye funktioner, fejlrettelser og sikkerhedsforbedringer. Vi anbefaler automatisk at søge efter opdateringer.
updateReminder.notNow=Ikke nu 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
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
+69 -21
View File
@@ -47,6 +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=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
@@ -135,14 +136,14 @@ unlock.success.revealBtn=Laufwerk anzeigen
## Failure ## Failure
unlock.error.customPath.message=Tresor kann nicht in benutzerdefinierten Pfad eingehängt werden unlock.error.customPath.message=Tresor kann nicht in benutzerdefinierten Pfad eingehängt werden
unlock.error.customPath.description.notSupported=Wenn du weiterhin den benutzerdefinierten Pfad verwenden möchtest, öffne die allgemeinen Einstellungen und wähle einen unterstützten Laufwerkstyp. Andernfalls gehe zu den Tresor-Optionen und wähle einen unterstützten Einhängepunkt. unlock.error.customPath.description.notSupported=Wenn du weiterhin den benutzerdefinierten Pfad verwenden möchtest, öffne die allgemeinen Einstellungen und wähle einen unterstützten Laufwerkstyp. Andernfalls gehe zu den Tresor-Optionen und wähle einen unterstützten Einhängepunkt.
unlock.error.customPath.description.notExists=Der benutzerdefinierte Einhängepunkt existiert nicht. Erstelle ihn in deinem lokalen Dateisystem oder ändere ihn in den Tresor-Optionen. unlock.error.customPath.description.notExists=Der benutzerdefinierte Einhängepfad existiert nicht. Erstelle ihn entweder in deinem lokalen Dateisystem oder ändere ihn in den Tresor-Optionen.
unlock.error.customPath.description.inUse=Der Laufwerksbuchstabe oder benutzerdefinierte Einhängepunkt „%s“ wird bereits verwendet. unlock.error.customPath.description.inUse=Der Laufwerksbuchstabe oder benutzerdefinierte Einhängepunkt „%s“ wird bereits verwendet.
unlock.error.customPath.description.hideawayNotDir=Die temporäre, versteckte Datei „%3$s“, die für das Entsperren verwendet wurde, konnte nicht entfernt werden. Bitte überprüfe die Datei und lösche sie manuell. unlock.error.customPath.description.hideawayNotDir=Die temporäre, versteckte Datei „%3$s“, die für das Entsperren verwendet wurde, konnte nicht entfernt werden. Bitte überprüfe die Datei und lösche sie manuell.
unlock.error.customPath.description.couldNotBeCleaned=Dein Tresor konnte nicht in den Pfad „%s“ eingehängt werden. Bitte versuche es erneut oder wähle einen anderen Pfad aus. unlock.error.customPath.description.couldNotBeCleaned=Dein Tresor konnte nicht in den Pfad „%s“ eingehängt werden. Bitte versuche es erneut oder wähle einen anderen Pfad aus.
unlock.error.customPath.description.notEmptyDir=Der benutzerdefinierte Einhängepunkt „%s“ ist kein leerer Ordner. Bitte wähle einen leeren Ordner und versuche es erneut. unlock.error.customPath.description.notEmptyDir=Der benutzerdefinierte Einhängepunkt „%s“ ist kein leerer Ordner. Bitte wähle einen leeren Ordner und versuche es erneut.
unlock.error.customPath.description.generic=Du hast für diesen Tresor einen benutzerdefinierten Einhängepunkt ausgewählt, aber dessen Verwendung ist mit folgender Meldung fehlgeschlagen: %2$s unlock.error.customPath.description.generic=Du hast für diesen Tresor einen benutzerdefinierten Einhängepunkt ausgewählt, aber dessen Verwendung ist mit folgender Meldung fehlgeschlagen: %2$s
unlock.error.fuseRestartRequired.message=Tresor konnte nicht entsperrt werden unlock.error.restartRequired.message=Tresor konnte nicht entsperrt werden
unlock.error.fuseRestartRequired.description=Ändere den Laufwerkstyp in den Tresoroptionen oder starte Cryptomator neu. unlock.error.restartRequired.description=Ändere den Laufwerkstyp in den Tresoroptionen oder starte Cryptomator neu.
unlock.error.title=„%s“ konnte nicht entsperrt werden unlock.error.title=„%s“ konnte nicht entsperrt werden
## Hub ## Hub
hub.noKeychain.message=Zugriff auf Geräteschlüssel nicht möglich hub.noKeychain.message=Zugriff auf Geräteschlüssel nicht möglich
@@ -157,17 +158,22 @@ hub.receive.message=Antwort wird verarbeitet …
hub.receive.description=Cryptomator empfängt und verarbeitet gerade die Antwort vom Hub. Bitte warten. hub.receive.description=Cryptomator empfängt und verarbeitet gerade die Antwort vom Hub. Bitte warten.
### Register Device ### Register Device
hub.register.message=Neues Gerät hub.register.message=Neues Gerät
hub.register.description=Dies ist der erste Hub-Zugriff von diesem Gerät. Bitte autorisiere dich mit deinem Account Key. hub.register.description=Dies ist der erste Hub-Zugriff von diesem Gerät. Bitte registriere es mit deinem Account Key.
hub.register.nameLabel=Gerätename hub.register.nameLabel=Gerätename
hub.register.invalidAccountKeyLabel=Ungültiger Account Key hub.register.invalidAccountKeyLabel=Ungültiger Account Key
hub.register.occupiedMsg=Name bereits in Verwendung hub.register.registerBtn=Registrieren
hub.register.registerBtn=Bestätigen ### Register Device Legacy
hub.register.legacy.occupiedMsg=Name wird bereits verwendet
hub.register.legacy.description=Dies ist der erste Hub-Zugriff von diesem Gerät. Bitte registriere es.
### Registration Success ### Registration Success
hub.registerSuccess.message=Gerät wurde benannt hub.registerSuccess.message=Gerät registriert
hub.registerSuccess.description=Für Zugriff auf den Tresor muss dein Gerät vom Tresorbesitzer autorisiert werden. hub.registerSuccess.description=Dein Gerät ist erfolgreich registriert. Du kannst den Tresor jetzt entsperren.
hub.registerSuccess.unlockBtn=Entsperren
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ät konnte kein Name gegeben werden hub.registerFailed.message=Gerät konnte nicht registriert werden
hub.registerFailed.description=Während der Namensvergabe wurde ein Fehler ausgelöst. 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.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Zugriff verweigert hub.unauthorized.message=Zugriff verweigert
hub.unauthorized.description=Dein Gerät wurde noch nicht für den Zugriff auf diesen Tresor autorisiert. Bitte den Tresorbesitzer, dein Gerät zu autorisieren. hub.unauthorized.description=Dein Gerät wurde noch nicht für den Zugriff auf diesen Tresor autorisiert. Bitte den Tresorbesitzer, dein Gerät zu autorisieren.
@@ -281,6 +287,7 @@ preferences.general.debugLogging=Diagnoseprotokoll aktivieren
preferences.general.debugDirectory=Protokolldateien anzeigen preferences.general.debugDirectory=Protokolldateien anzeigen
preferences.general.autoStart=Cryptomator beim Systemstart starten preferences.general.autoStart=Cryptomator beim Systemstart starten
preferences.general.keychainBackend=Passwörter speichern mit preferences.general.keychainBackend=Passwörter speichern mit
preferences.general.quickAccessService=Die entsperrten Tresore zum Schnellzugriff hinzufügen
## Interface ## Interface
preferences.interface=Benutzeroberfläche preferences.interface=Benutzeroberfläche
preferences.interface.theme=Erscheinungsbild preferences.interface.theme=Erscheinungsbild
@@ -293,8 +300,8 @@ preferences.interface.language.auto=Systemvorgabe
preferences.interface.interfaceOrientation=Oberflächenausrichtung preferences.interface.interfaceOrientation=Oberflächenausrichtung
preferences.interface.interfaceOrientation.ltr=Von links nach rechts preferences.interface.interfaceOrientation.ltr=Von links nach rechts
preferences.interface.interfaceOrientation.rtl=Von rechts nach links preferences.interface.interfaceOrientation.rtl=Von rechts nach links
preferences.interface.showMinimizeButton=Schaltfläche zum Minimieren anzeigen
preferences.interface.showTrayIcon=Symbol im Infobereich anzeigen (Neustart erforderlich) preferences.interface.showTrayIcon=Symbol im Infobereich anzeigen (Neustart erforderlich)
preferences.interface.compactMode=Kompakte Tresoransicht einschalten
## Volume ## Volume
preferences.volume=Virtuelles Laufwerk preferences.volume=Virtuelles Laufwerk
preferences.volume.type=Standard-Laufwerkstyp preferences.volume.type=Standard-Laufwerkstyp
@@ -314,12 +321,29 @@ 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
preferences.contribute.noCertificate=Unterstütze Cryptomator und erhalte ein Supporter-Zertifikat. Es ist eine Art Lizenzschlüssel, aber für großartige Menschen, die freie Software verwenden. ;-) preferences.contribute.noCertificate=Unterstütze Cryptomator und erhalte ein Supporter-Zertifikat. Es ist eine Art Lizenzschlüssel, aber für großartige Menschen, die freie Software verwenden. ;-)
preferences.contribute.getCertificate=Du hast noch keines? Erfahre, wie du es erhalten kannst. preferences.contribute.getCertificate=Du hast noch keines? Erfahre, wie du es erhalten kannst.
preferences.contribute.promptText=Füge hier den Code des Supporter-Zertifikats ein preferences.contribute.promptText=Füge hier den Code des Supporter-Zertifikats ein
preferences.contribute.thankYou=Danke, dass Du die Open-Source-Entwicklung von Cryptomator unterstützt!
preferences.contribute.donate=Spenden
preferences.contribute.sponsor=Sponsern
### Remove License Key Dialog
removeCert.title=Zertifikat entfernen
removeCert.message=Supporter-Zertifikat entfernen?
removeCert.description=Die Kernfunktionen von Cryptomator sind davon nicht betroffen. Weder der Zugriff auf deine Tresore ist eingeschränkt, noch wird das Sicherheitsniveau verringert.
removeCert.confirmBtn=Entfernen
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -361,11 +385,6 @@ stats.access.total=Gesamtzugriffe: %d
# Main Window # Main Window
main.closeBtn.tooltip=Schließen
main.minimizeBtn.tooltip=Minimieren
main.preferencesBtn.tooltip=Einstellungen
main.debugModeEnabled.tooltip=Diagnosemodus ist aktiviert
main.supporterCertificateMissing.tooltip=Zieh bitte eine Spende in Betracht
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klicke hier, um einen Tresor hinzuzufügen main.vaultlist.emptyList.onboardingInstruction=Klicke hier, um einen Tresor hinzuzufügen
main.vaultlist.contextMenu.remove=Entfernen … main.vaultlist.contextMenu.remove=Entfernen …
@@ -374,9 +393,11 @@ main.vaultlist.contextMenu.unlock=Entsperren …
main.vaultlist.contextMenu.unlockNow=Jetzt entsperren main.vaultlist.contextMenu.unlockNow=Jetzt entsperren
main.vaultlist.contextMenu.vaultoptions=Tresoroptionen anzeigen main.vaultlist.contextMenu.vaultoptions=Tresoroptionen anzeigen
main.vaultlist.contextMenu.reveal=Laufwerk anzeigen main.vaultlist.contextMenu.reveal=Laufwerk anzeigen
main.vaultlist.addVaultBtn=Hinzufügen main.vaultlist.addVaultBtn.menuItemNew=Neuen Tresor erstellen...
main.vaultlist.addVaultBtn.menuItemNew=Neuer Tresor … main.vaultlist.addVaultBtn.menuItemExisting=Bestehenden Tresor öffnen...
main.vaultlist.addVaultBtn.menuItemExisting=Bestehender Tresor … ##Notificaition
main.notification.updateAvailable=Eine neue Version ist verfügbar.
main.notification.support=Unterstütze Cryptomator.
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Danke, dass du zum Schutz deiner Dateien Cryptomator gewählt hast. Falls du Hilfe brauchst, schau dir unsere Anleitungen an: main.vaultDetail.welcomeOnboarding=Danke, dass du zum Schutz deiner Dateien Cryptomator gewählt hast. Falls du Hilfe brauchst, schau dir unsere Anleitungen an:
@@ -386,6 +407,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 …
### 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:
@@ -451,7 +473,7 @@ vaultOptions.mount.mountPoint.custom=Gewähltes Verzeichnis verwenden
vaultOptions.mount.mountPoint.directoryPickerButton=Durchsuchen … vaultOptions.mount.mountPoint.directoryPickerButton=Durchsuchen …
vaultOptions.mount.mountPoint.directoryPickerTitle=Wähle ein Verzeichnis vaultOptions.mount.mountPoint.directoryPickerTitle=Wähle ein Verzeichnis
vaultOptions.mount.volumeType.default=Standard (%s) vaultOptions.mount.volumeType.default=Standard (%s)
vaultOptions.mount.volumeType.fuseRestartRequired=Um diesen Laufwerkstyp verwenden zu können, muss Cryptomator neu gestartet werden. vaultOptions.mount.volumeType.restartRequired=Um diesen Laufwerkstyp verwenden zu können, muss Cryptomator neu gestartet werden.
vaultOptions.mount.volume.tcp.port=TCP-Port vaultOptions.mount.volume.tcp.port=TCP-Port
vaultOptions.mount.volume.type=Laufwerkstyp vaultOptions.mount.volume.type=Laufwerkstyp
## Master Key ## Master Key
@@ -523,4 +545,30 @@ updateReminder.message=Nach Updates suchen?
updateReminder.description=Bleib auf dem Laufenden mit neuen Funktionen, Fehlerbehebungen und Sicherheitsverbesserungen. Wir empfehlen, automatisch nach Updates zu suchen. updateReminder.description=Bleib auf dem Laufenden mit neuen Funktionen, Fehlerbehebungen und Sicherheitsverbesserungen. Wir empfehlen, automatisch nach Updates zu suchen.
updateReminder.notNow=Nicht jetzt updateReminder.notNow=Nicht jetzt
updateReminder.yesOnce=Ja, einmalig updateReminder.yesOnce=Ja, einmalig
updateReminder.yesAutomatically=Ja, automatisch updateReminder.yesAutomatically=Ja, automatisch
#Dokany Support End
dokanySupportEnd.title=Hinweis: nicht mehr verwendet
dokanySupportEnd.message=Ende der Unterstützung für Dokany
dokanySupportEnd.description=Der Laufwerkstyp Dokany wird von Cryptomator nicht weiter unterstützt. Deine Einstellungen wurden angepasst, dass der Standard-Laufwerkstyp verwendet wird. Du kannst den Standardtyp in den Einstellungen anzeigen lassen.
dokanySupportEnd.preferencesBtn=Einstellungen öffnen
# Share Vault
shareVault.title=Tresor teilen
shareVault.message=Möchtest du deinen Tresor mit anderen teilen?
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 über den Cloud-Speicher.
shareVault.instruction.2=2. Teile das Tresorpasswort auf einem sicheren Weg.
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.hubAd.description=Die sichere Art der Teamarbeit
shareVault.hubAd.keyManagement=• Zero-knowledge-Schlüsselverwaltung
shareVault.hubAd.authentication=• Starke Authentifizierung
shareVault.hubAd.encryption=• Ende-zu-Ende-Verschlüsselung
shareVault.visitHub=Besuche Cryptomator Hub
shareVault.hub.message=Teilen eines Hub-Tresors
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 über den Cloud-Speicher.
shareVault.hub.instruction.2=2. Füge das Teammitglied in Cryptomator Hub als Tresormitglied hinzu.
shareVault.hub.openHub=Cryptomator Hub öffnen
+68 -20
View File
@@ -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=Έλεγχος τοπικού συστήματος αρχείων για προεπιλεγμένους καταλόγους αποθήκευσης cloud…
addvaultwizard.new.locationLabel=Θέση αποθήκευσης addvaultwizard.new.locationLabel=Θέση αποθήκευσης
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Προσαρμοσμένη τοποθεσία addvaultwizard.new.directoryPickerLabel=Προσαρμοσμένη τοποθεσία
@@ -141,8 +142,8 @@ 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.fuseRestartRequired.message=Αδυναμία ξεκλειδώματος κρύπτης unlock.error.restartRequired.message=Αδυναμία ξεκλειδώματος κρύπτης
unlock.error.fuseRestartRequired.description=Αλλάξτε τον τύπο τόμου στις επιλογές κρύπτης ή επανεκκινήστε το Cryptomator. unlock.error.restartRequired.description=Αλλάξτε τον τύπο τόμου στις επιλογές κρύπτης ή επανεκκινήστε το Cryptomator.
unlock.error.title=Ξεκλείδωμα "%s" απέτυχε unlock.error.title=Ξεκλείδωμα "%s" απέτυχε
## Hub ## Hub
hub.noKeychain.message=Δεν είναι δυνατή η πρόσβαση στο κλειδί της συσκευής hub.noKeychain.message=Δεν είναι δυνατή η πρόσβαση στο κλειδί της συσκευής
@@ -157,17 +158,22 @@ hub.receive.message=Επεξεργασία απάντησης…
hub.receive.description=Το Cryptomator λαμβάνει και επεξεργάζεται την απάντηση από το Hub. Παρακαλώ περιμένετε. hub.receive.description=Το Cryptomator λαμβάνει και επεξεργάζεται την απάντηση από το Hub. Παρακαλώ περιμένετε.
### Register Device ### Register Device
hub.register.message=Νέα Συσκευή hub.register.message=Νέα Συσκευή
hub.register.description=Αυτή είναι η πρώτη πρόσβαση Hub από αυτήν τη συσκευή. Παρακαλούμε εξουσιοδοτήστε την χρησιμοποιώντας το κλειδί του λογαριασμού σας. hub.register.description=Αυτή είναι η πρώτη πρόσβαση Hub από αυτήν τη συσκευή. Εγγραφείτε χρησιμοποιώντας το Κλειδί του Λογαριασμού σας.
hub.register.nameLabel=Όνομα Συσκευής hub.register.nameLabel=Όνομα Συσκευής
hub.register.invalidAccountKeyLabel=Μη Έγκυρο Κλειδί Λογαριασμού hub.register.invalidAccountKeyLabel=Μη Έγκυρο Κλειδί Λογαριασμού
hub.register.occupiedMsg=Το όνομα χρησιμοποιείται ήδη hub.register.registerBtn=Εγγραφή
hub.register.registerBtn=Επιβεβαίωση ### Register Device Legacy
hub.register.legacy.occupiedMsg=Το όνομα χρησιμοποιείται ήδη
hub.register.legacy.description=Αυτή είναι η πρώτη πρόσβαση Hub από αυτήν τη συσκευή. Παρακαλούμε καταχωρήστε τη.
### Registration Success ### Registration Success
hub.registerSuccess.message=Η συσκευή ονομάστηκε hub.registerSuccess.message=Η συσκευή καταχωρήθηκε
hub.registerSuccess.description=Για να αποκτήσετε πρόσβαση στην κρύπτη, η συσκευή σας πρέπει να είναι εξουσιοδοτημένη από τον κάτοχο της κρύπτης. hub.registerSuccess.description=Η συσκευή σας καταχωρήθηκε με επιτυχία. Τώρα μπορείτε να συνεχίσετε να ξεκλειδώσετε την κρύπτη.
hub.registerSuccess.unlockBtn=Ξεκλείδωμα
hub.registerSuccess.legacy.description=Για να αποκτήσετε πρόσβαση στην κρύπτη, η συσκευή σας πρέπει να έχει επιπλέον εξουσιοδότηση από τον κάτοχο της κρύπτης.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Η ονομασία της συσκευής απέτυχε hub.registerFailed.message=Η εγγραφή της συσκευής απέτυχε
hub.registerFailed.description=Παρουσιάστηκε σφάλμα στη διαδικασία ονομασίας. Για περισσότερες λεπτομέρειες, ανατρέξτε στο αρχείο καταγραφής της εφαρμογής. hub.registerFailed.description.generic=Παρουσιάστηκε σφάλμα στη διαδικασία εγγραφής. Για περισσότερες λεπτομέρειες, ανατρέξτε στο αρχείο καταγραφής της εφαρμογής.
hub.registerFailed.description.deviceAlreadyExists=Αυτή η συσκευή είναι ήδη εγγεγραμμένη για διαφορετικό χρήστη. Προσπαθήστε να αλλάξετε τον λογαριασμό χρήστη ή να χρησιμοποιήσετε διαφορετική συσκευή.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Δεν επιτρέπεται η πρόσβαση hub.unauthorized.message=Δεν επιτρέπεται η πρόσβαση
hub.unauthorized.description=Η συσκευή σας δεν έχει ακόμη εξουσιοδοτηθεί να έχει πρόσβαση σε αυτή την κρύπτη. Ζητήστε από τον κάτοχο της κρύπτης να την εξουσιοδοτήσει. hub.unauthorized.description=Η συσκευή σας δεν έχει ακόμη εξουσιοδοτηθεί να έχει πρόσβαση σε αυτή την κρύπτη. Ζητήστε από τον κάτοχο της κρύπτης να την εξουσιοδοτήσει.
@@ -281,6 +287,7 @@ preferences.general.debugLogging=Ενεργοποίηση καταγραφής
preferences.general.debugDirectory=Αποκάλυψη αρχείων καταγραφής preferences.general.debugDirectory=Αποκάλυψη αρχείων καταγραφής
preferences.general.autoStart=Εκκίνηση Cryptomator στην εκκίνηση του συστήματος preferences.general.autoStart=Εκκίνηση Cryptomator στην εκκίνηση του συστήματος
preferences.general.keychainBackend=Αποθήκευση κωδικού πρόσβασης με preferences.general.keychainBackend=Αποθήκευση κωδικού πρόσβασης με
preferences.general.quickAccessService=Προσθήκη ξεκλειδωμένων Κρυπτών στην περιοχή γρήγορης πρόσβασης
## Interface ## Interface
preferences.interface=Διεπαφή preferences.interface=Διεπαφή
preferences.interface.theme=Εμφάνιση & Αίσθηση preferences.interface.theme=Εμφάνιση & Αίσθηση
@@ -293,8 +300,8 @@ preferences.interface.language.auto=Προεπιλογή Συστήματος
preferences.interface.interfaceOrientation=Προσανατολισμός Διεπαφής preferences.interface.interfaceOrientation=Προσανατολισμός Διεπαφής
preferences.interface.interfaceOrientation.ltr=Αριστερά προς Δεξιά preferences.interface.interfaceOrientation.ltr=Αριστερά προς Δεξιά
preferences.interface.interfaceOrientation.rtl=Δεξιά προς Αριστερά preferences.interface.interfaceOrientation.rtl=Δεξιά προς Αριστερά
preferences.interface.showMinimizeButton=Εμφάνιση κουμπιού ελαχιστοποίησης
preferences.interface.showTrayIcon=Εμφάνιση εικονιδίου tray (απαιτεί επανεκκίνηση) preferences.interface.showTrayIcon=Εμφάνιση εικονιδίου tray (απαιτεί επανεκκίνηση)
preferences.interface.compactMode=Ενεργοποίηση συμπαγούς λίστας κρυπτών
## Volume ## Volume
preferences.volume=Εικονικός δίσκος preferences.volume=Εικονικός δίσκος
preferences.volume.type=Προεπιλεγμένος Τύπος Τόμου preferences.volume.type=Προεπιλεγμένος Τύπος Τόμου
@@ -314,12 +321,29 @@ 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
preferences.contribute.noCertificate=Υποστηρίξτε το Cryptomator και λάβετε ένα πιστοποιητικό υποστηρικτή. Είναι σαν κλειδί άδειας χρήσης, αλλά για φοβερά άτομα που χρησιμοποιούν ελεύθερο λογισμικό. ;-) preferences.contribute.noCertificate=Υποστηρίξτε το Cryptomator και λάβετε ένα πιστοποιητικό υποστηρικτή. Είναι σαν κλειδί άδειας χρήσης, αλλά για φοβερά άτομα που χρησιμοποιούν ελεύθερο λογισμικό. ;-)
preferences.contribute.getCertificate=Δεν έχετε ένα ήδη; Μάθετε πώς μπορείτε να το αποκτήσετε. preferences.contribute.getCertificate=Δεν έχετε ένα ήδη; Μάθετε πώς μπορείτε να το αποκτήσετε.
preferences.contribute.promptText=Επικολλήστε τον κωδικό πιστοποιητικού υποστηρικτή εδώ preferences.contribute.promptText=Επικολλήστε τον κωδικό πιστοποιητικού υποστηρικτή εδώ
preferences.contribute.thankYou=Σας ευχαριστούμε που υποστηρίζετε την ανάπτυξη ανοιχτού κώδικα του Cryptomator!
preferences.contribute.donate=Δωρεά
preferences.contribute.sponsor=Χορηγός
### Remove License Key Dialog
removeCert.title=Αφαίρεση Πιστοποιητικού
removeCert.message=Αφαίρεση πιστοποιητικού υποστηρικτή;
removeCert.description=Οι βασικές λειτουργίες του Cryptomator δεν επηρεάζονται από αυτό. Ούτε η πρόσβαση στις κρύπτες σας είναι περιορισμένη ούτε το επίπεδο ασφάλειας μειώνεται.
removeCert.confirmBtn=Αφαίρεση
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -361,11 +385,6 @@ stats.access.total=Συνολική πρόσβαση: %d
# Main Window # Main Window
main.closeBtn.tooltip=Κλείσιμο
main.minimizeBtn.tooltip=Ελαχιστοποίηση
main.preferencesBtn.tooltip=Προτιμήσεις
main.debugModeEnabled.tooltip=Έχει ενεργοποιηθεί η λειτουργία αποσφαλμάτωσης
main.supporterCertificateMissing.tooltip=Παρακαλούμε σκεφτείτε να κάνετε δωρεά
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Κάντε κλικ εδώ για να προσθέσετε ένα vault main.vaultlist.emptyList.onboardingInstruction=Κάντε κλικ εδώ για να προσθέσετε ένα vault
main.vaultlist.contextMenu.remove=Αφαίρεση… main.vaultlist.contextMenu.remove=Αφαίρεση…
@@ -374,9 +393,11 @@ main.vaultlist.contextMenu.unlock=Ξεκλείδωμα…
main.vaultlist.contextMenu.unlockNow=Ξεκλείδωμα τώρα main.vaultlist.contextMenu.unlockNow=Ξεκλείδωμα τώρα
main.vaultlist.contextMenu.vaultoptions=Εμφάνιση επιλογών Vault main.vaultlist.contextMenu.vaultoptions=Εμφάνιση επιλογών Vault
main.vaultlist.contextMenu.reveal=Αποκάλυψη εικονικού δίσκου main.vaultlist.contextMenu.reveal=Αποκάλυψη εικονικού δίσκου
main.vaultlist.addVaultBtn=Προσθήκη main.vaultlist.addVaultBtn.menuItemNew=Δημιουργία Νέας Κρύπτης...
main.vaultlist.addVaultBtn.menuItemNew=Νέα Κρύπτη... main.vaultlist.addVaultBtn.menuItemExisting=Άνοιγμα Υπάρχοντος Κρύπτης...
main.vaultlist.addVaultBtn.menuItemExisting=Υπάρχουσα Κρύπτη... ##Notificaition
main.notification.updateAvailable=Η ενημέρωση είναι διαθέσιμη.
main.notification.support=Υποστήριξη Cryptomator.
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Ευχαριστούμε που επιλέξατε το Cryptomator για να προστατεύσετε τα αρχεία σας. Αν χρειάζεστε οποιαδήποτε βοήθεια, ελέγξτε τους οδηγούς για αρχάριους: main.vaultDetail.welcomeOnboarding=Ευχαριστούμε που επιλέξατε το Cryptomator για να προστατεύσετε τα αρχεία σας. Αν χρειάζεστε οποιαδήποτε βοήθεια, ελέγξτε τους οδηγούς για αρχάριους:
@@ -386,6 +407,7 @@ main.vaultDetail.unlockBtn=Ξεκλείδωμα…
main.vaultDetail.unlockNowBtn=Ξεκλείδωμα τώρα main.vaultDetail.unlockNowBtn=Ξεκλείδωμα τώρα
main.vaultDetail.optionsBtn=Επιλογές vault main.vaultDetail.optionsBtn=Επιλογές vault
main.vaultDetail.passwordSavedInKeychain=Ο κωδικός αποθηκεύτηκε main.vaultDetail.passwordSavedInKeychain=Ο κωδικός αποθηκεύτηκε
main.vaultDetail.share=Κοινοποίηση…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=ΞΕΚΛΕΙΔΩΜΕΝΟ main.vaultDetail.unlockedStatus=ΞΕΚΛΕΙΔΩΜΕΝΟ
main.vaultDetail.accessLocation=Τα δεδομένα του vault σας είναι διαθέσιμα εδώ: main.vaultDetail.accessLocation=Τα δεδομένα του vault σας είναι διαθέσιμα εδώ:
@@ -451,7 +473,7 @@ 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.default=Προεπιλογή (%s)
vaultOptions.mount.volumeType.fuseRestartRequired=Για να χρησιμοποιήσετε αυτόν τον τύπο τόμου, πρέπει να γίνει επανεκκίνηση του Cryptomator. vaultOptions.mount.volumeType.restartRequired=Για να χρησιμοποιήσετε αυτόν τον τύπο τόμου, το Cryptomator πρέπει να επανεκκινηθεί.
vaultOptions.mount.volume.tcp.port=Θύρα TCP vaultOptions.mount.volume.tcp.port=Θύρα TCP
vaultOptions.mount.volume.type=Τύπος Τόμου vaultOptions.mount.volume.type=Τύπος Τόμου
## Master Key ## Master Key
@@ -523,4 +545,30 @@ updateReminder.message=Έλεγχος για ενημερώσεις;
updateReminder.description=Μείνετε ενημερωμένοι με νέες δυνατότητες, διορθώσεις σφαλμάτων και βελτιώσεις ασφάλειας. Συνιστούμε τον αυτόματο έλεγχο για ενημερώσεις. updateReminder.description=Μείνετε ενημερωμένοι με νέες δυνατότητες, διορθώσεις σφαλμάτων και βελτιώσεις ασφάλειας. Συνιστούμε τον αυτόματο έλεγχο για ενημερώσεις.
updateReminder.notNow=Όχι Τώρα 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
shareVault.title=Κοινή χρήση Κρύπτης
shareVault.message=Θα θέλατε να μοιραστείτε την κρύπτη σας με άλλους;
shareVault.description=Να είστε πάντα προσεκτικοί όταν μοιράζεστε την κρύπτη σας με άλλα άτομα. Εν ολίγοις, ακολουθήστε τα παρακάτω βήματα:
shareVault.instruction.1=1. Μοιραστείτε την πρόσβαση στον κρυπτογραφημένο φάκελο κρύπτης μέσω του χώρου αποθήκευσης στο cloud.
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=Πώς να μοιραστείτε μια κρύπτη Hub
shareVault.hub.description=Για να μοιραστείτε το περιεχόμενο της κρύπτης με άλλο μέλος της ομάδας, πρέπει να εκτελέσετε δύο βήματα:
shareVault.hub.instruction.1=1. Μοιραστείτε την πρόσβαση στον κρυπτογραφημένο φάκελο κρύπτης μέσω του χώρου αποθήκευσης στο cloud.
shareVault.hub.instruction.2=2. Παραχωρήστε πρόσβαση σε μέλος της ομάδας στο Cryptomator Hub.
shareVault.hub.openHub=Ανοίξτε το Cryptomator Hub
@@ -0,0 +1,198 @@
# Locale Specific CSS files such as CJK, RTL,...
# Generics
## Button
generic.button.apply=Apply
generic.button.back=Back
generic.button.cancel=Cancel
generic.button.change=Change
generic.button.choose=Choose…
generic.button.close=Close
generic.button.done=Done
generic.button.next=Next
# Error
# Defaults
# Tray Menu
traymenu.showMainWindow=Show
traymenu.showPreferencesWindow=Preferences
traymenu.quitApplication=Quit
traymenu.vault.unlock=Unlock
traymenu.vault.lock=Lock
traymenu.vault.reveal=Reveal
# Add Vault Wizard
addvaultwizard.title=Add Vault
## New
### Name
addvaultwizard.new.nameInstruction=Choose a name for the vault
addvaultwizard.new.namePrompt=Vault Name
### Location
addvaultwizard.new.locationInstruction=Where should Cryptomator store the encrypted files of your vault?
addvaultwizard.new.locationLabel=Storage location
addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerButton=Choose…
addvaultwizard.new.directoryPickerTitle=Select Directory
### Expert Settings
### Password
addvaultwizard.new.createVaultBtn=Create Vault
### Information
## Existing
addvaultwizard.existing.chooseBtn=Choose…
## Success
addvaultwizard.success.nextStepsInstructions=Added vault "%s".\nYou need to unlock this vault to access or add contents. Alternatively you can unlock it at any later point in time.
addvaultwizard.success.unlockNow=Unlock Now
# Remove Vault
removeVault.confirmBtn=Remove Vault
# Change Password
changepassword.title=Change Password
changepassword.enterOldPassword=Enter the current password for "%s"
# Forget Password
forgetPassword.title=Forget Password
forgetPassword.confirmBtn=Forget Password
# Unlock
unlock.passwordPrompt=Enter password for "%s":
unlock.unlockBtn=Unlock
## Select
unlock.chooseMasterkey.filePickerTitle=Select Masterkey File
## Success
unlock.success.revealBtn=Reveal Drive
## Failure
## Hub
### Waiting
### Receive Key
### Register Device
### Register Device Legacy
### Registration Success
hub.registerSuccess.unlockBtn=Unlock
### Registration Failed
### Unauthorized
### Requires Account Initialization
### License Exceeded
# Lock
## Force
## Failure
# Migration
migration.title=Upgrade Vault
## Start
migration.start.header=Upgrade Vault
## Run
migration.run.enterPassword=Enter the password for "%s"
migration.run.startMigrationBtn=Migrate Vault
## Success
migration.success.nextStepsInstructions=Migrated "%s" successfully.\nYou can now unlock your vault.
migration.success.unlockNow=Unlock Now
## Missing file system capabilities
## Impossible
# Health Check
## Start
## Start Failure
## Check Selection
## Detail view
## Result view
## Fix Application
# Preferences
preferences.title=Preferences
## General
preferences.general=General
preferences.general.startHidden=Hide window when starting Cryptomator
preferences.general.debugLogging=Enable debug logging
## Interface
## Volume
preferences.volume=Virtual Drive
## Updates
preferences.updates=Updates
preferences.updates.currentVersion=Current Version: %s
preferences.updates.autoUpdateCheck=Check for updates automatically
preferences.updates.checkNowBtn=Check Now
preferences.updates.updateAvailable=Update to version %s available.
## Contribution
### Remove License Key Dialog
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
# Vault Statistics
## Read
## Write
## Accesses
# Main Window
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Click here to add a vault
main.vaultlist.contextMenu.lock=Lock
main.vaultlist.contextMenu.unlockNow=Unlock Now
main.vaultlist.contextMenu.reveal=Reveal Drive
##Notificaition
## Vault Detail
### Welcome
### Locked
main.vaultDetail.lockedStatus=LOCKED
main.vaultDetail.unlockNowBtn=Unlock Now
main.vaultDetail.optionsBtn=Vault Options
### Unlocked
main.vaultDetail.unlockedStatus=UNLOCKED
main.vaultDetail.accessLocation=Your vault's contents are accessible here:
main.vaultDetail.revealBtn=Reveal Drive
main.vaultDetail.lockBtn=Lock
main.vaultDetail.throughput.idle=idle
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
### Needs Migration
main.vaultDetail.migrateButton=Upgrade Vault
### Error
# Wrong File Alert
# Vault Options
## General
vaultOptions.general=General
vaultOptions.general.vaultName=Vault Name
vaultOptions.general.actionAfterUnlock.reveal=Reveal Drive
## Mount
vaultOptions.mount=Mounting
vaultOptions.mount.mountPoint.directoryPickerButton=Choose…
## Master Key
vaultOptions.masterkey.changePasswordBtn=Change Password
## Hub
# Recovery Key
## Display Recovery Key
## Reset Password
### Enter Recovery Key
### Reset Password
### Recovery Key Password Reset Success
# Convert Vault
# New Password
passwordStrength.messageLabel.0=Very weak
passwordStrength.messageLabel.1=Weak
passwordStrength.messageLabel.2=Fair
passwordStrength.messageLabel.3=Strong
passwordStrength.messageLabel.4=Very strong
# Quit
# Forced Quit
# Update Reminder
#Dokany Support End
# Share Vault
+74 -26
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,8 +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.fuseRestartRequired.message=No se puede desbloquear la bóveda unlock.error.restartRequired.message=No se puede desbloquear la bóveda
unlock.error.fuseRestartRequired.description=Cambie el tipo de volumen en las opciones de la bóveda o reinicie Cryptomator. 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
@@ -157,17 +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, autorícelo usando su Account Key. 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.occupiedMsg=Nombre ya en uso hub.register.registerBtn=Registrarse
hub.register.registerBtn=Confirmar ### 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 nombrado hub.registerSuccess.message=Dispositivo registrado
hub.registerSuccess.description=Para acceder a la bóveda, su dispositivo debe ser autorizado por el propietario de la bóveda. hub.registerSuccess.description=Tu dispositivo se ha registrado correctamente. Ahora puede proceder a desbloquear la bóveda.
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=Error al nombrar el dispositivo hub.registerFailed.message=El registro del dispositivo ha fallado
hub.registerFailed.description=Ocurrió un error en el nombramiento. Para más detalles consulte el registro de la aplicación. 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.
@@ -187,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
@@ -281,6 +287,7 @@ preferences.general.debugLogging=Habilitar registro de depuración
preferences.general.debugDirectory=Revelar archivos de registro preferences.general.debugDirectory=Revelar archivos de registro
preferences.general.autoStart=Cargar Cryptomator al iniciar el sistema preferences.general.autoStart=Cargar Cryptomator al iniciar el sistema
preferences.general.keychainBackend=Guardar contraseñas con preferences.general.keychainBackend=Guardar contraseñas con
preferences.general.quickAccessService=Añadir bóvedas desbloqueadas al área de acceso rápido
## Interface ## Interface
preferences.interface=Interfaz preferences.interface=Interfaz
preferences.interface.theme=Apariencia preferences.interface.theme=Apariencia
@@ -293,8 +300,8 @@ preferences.interface.language.auto=Valores por defecto del sistema
preferences.interface.interfaceOrientation=Orientación de la interfaz preferences.interface.interfaceOrientation=Orientación de la interfaz
preferences.interface.interfaceOrientation.ltr=Izquierda a derecha preferences.interface.interfaceOrientation.ltr=Izquierda a derecha
preferences.interface.interfaceOrientation.rtl=Derecha a izquierda preferences.interface.interfaceOrientation.rtl=Derecha a izquierda
preferences.interface.showMinimizeButton=Mostrar botón minimizar
preferences.interface.showTrayIcon=Mostrar ícono de bandeja (requiere reiniciar) preferences.interface.showTrayIcon=Mostrar ícono de bandeja (requiere reiniciar)
preferences.interface.compactMode=Habilitar la lista de bóvedas compactas
## Volume ## Volume
preferences.volume=Unidad virtual preferences.volume=Unidad virtual
preferences.volume.type=Tipo de volumen predeterminado preferences.volume.type=Tipo de volumen predeterminado
@@ -314,12 +321,29 @@ 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
preferences.contribute.noCertificate=Apoye a Cryptomator y reciba un certificado de seguidor. Es como una clave de licencia, pero para gente asombrosa usando software libre. ;-) preferences.contribute.noCertificate=Apoye a Cryptomator y reciba un certificado de seguidor. Es como una clave de licencia, pero para gente asombrosa usando software libre. ;-)
preferences.contribute.getCertificate=¿Aún no tiene uno? Aprenda cómo puede obtenerlo. preferences.contribute.getCertificate=¿Aún no tiene uno? Aprenda cómo puede obtenerlo.
preferences.contribute.promptText=Pegue aquí el código de certificado de seguidor preferences.contribute.promptText=Pegue aquí el código de certificado de seguidor
preferences.contribute.thankYou=¡Gracias por apoyar el desarrollo de código abierto de Cryptomator!
preferences.contribute.donate=Donar
preferences.contribute.sponsor=Patrocinador
### Remove License Key Dialog
removeCert.title=Eliminar Certificado
removeCert.message=¿Eliminar certificado de soporte?
removeCert.description=Las características principales de Cryptomator no se ven afectadas por esto. No se restringe el acceso a sus bóvedas ni se reduce el nivel de seguridad.
removeCert.confirmBtn=Eliminar
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -361,11 +385,6 @@ stats.access.total=Accesos totales: %d
# Main Window # Main Window
main.closeBtn.tooltip=Cerrar
main.minimizeBtn.tooltip=Minimizar
main.preferencesBtn.tooltip=Preferencias
main.debugModeEnabled.tooltip=Modo de depuración activado
main.supporterCertificateMissing.tooltip=Por favor, considere donar
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Haga clic aquí para añadir una bóveda main.vaultlist.emptyList.onboardingInstruction=Haga clic aquí para añadir una bóveda
main.vaultlist.contextMenu.remove=Eliminar… main.vaultlist.contextMenu.remove=Eliminar…
@@ -374,9 +393,11 @@ main.vaultlist.contextMenu.unlock=Desbloquear…
main.vaultlist.contextMenu.unlockNow=Desbloquear ahora main.vaultlist.contextMenu.unlockNow=Desbloquear ahora
main.vaultlist.contextMenu.vaultoptions=Mostrar opciones de la bóveda main.vaultlist.contextMenu.vaultoptions=Mostrar opciones de la bóveda
main.vaultlist.contextMenu.reveal=Revelar unidad main.vaultlist.contextMenu.reveal=Revelar unidad
main.vaultlist.addVaultBtn=Añadir main.vaultlist.addVaultBtn.menuItemNew=Crear Bóveda Nueva...
main.vaultlist.addVaultBtn.menuItemNew=Nueva bóveda... main.vaultlist.addVaultBtn.menuItemExisting=Abrir Bóveda Existente...
main.vaultlist.addVaultBtn.menuItemExisting=Bóveda existente... ##Notificaition
main.notification.updateAvailable=Existen actualizaciones disponibles.
main.notification.support=Soporte de Cryptomator.
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Gracias por elegir Cryptomator para proteger sus archivos. En caso de necesitar ayuda, revise nuestras guías: main.vaultDetail.welcomeOnboarding=Gracias por elegir Cryptomator para proteger sus archivos. En caso de necesitar ayuda, revise nuestras guías:
@@ -386,6 +407,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í:
@@ -451,7 +473,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.fuseRestartRequired=Para utilizar este tipo de volumen, debe reiniciarse Criptomator. 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
@@ -523,4 +545,30 @@ updateReminder.message=¿Buscar actualizaciones?
updateReminder.description=Manténgase actualizado con funciones nuevas, correcciones de errores y mejoras de seguridad. Recomendamos comprobar actualizaciones automáticamente. updateReminder.description=Manténgase actualizado con funciones nuevas, correcciones de errores y mejoras de seguridad. Recomendamos comprobar actualizaciones automáticamente.
updateReminder.notNow=Ahora no 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
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
+68 -3
View File
@@ -16,13 +16,23 @@ generic.button.print=چاپ
# Error # Error
error.message=خطایی رخ داده است error.message=خطایی رخ داده است
error.description=کریپتوماتور انتظار رخ دادن این مورد را نداشت. شما میتوانید به دنبال راهکار های موجود برای این خطا بگردید، یا اگر قبلا گزارش نشده است، گزارش کنید.
error.hyperlink.lookup=جستجوی خطا
error.hyperlink.report=گزارش خطا
error.technicalDetails=جزئیات: error.technicalDetails=جزئیات:
error.existingSolutionDescription=کریپتوماتور انتظار رخ دادن این مورد را نداشت، اما ما راه حلی برای این خطا پیدا کردیم. لطفا نگاهی به لینک زیر بیندازید.
error.hyperlink.solution=جستجوی راه حل
error.lookupPermissionMessage=کریپتوماتور میتواند دنبال راه حلی برای این مشکل بصورت آنلاین بگردد. این عمل درخواستی را به دیتابیس خطا های ما از آیپی آدرس شما خواهد فرستاد.
error.dismiss=لغو
error.lookUpSolution=جستجوی راه حل
# Defaults # Defaults
defaults.vault.vaultName=گاوصندوق defaults.vault.vaultName=گاوصندوق
# Tray Menu # Tray Menu
traymenu.showMainWindow=نشان traymenu.showMainWindow=نشان
traymenu.showPreferencesWindow=تنظیمات
traymenu.lockAllVaults=قفل کردن همگی
traymenu.quitApplication=ترک traymenu.quitApplication=ترک
traymenu.vault.unlock=بازکردن قفل traymenu.vault.unlock=بازکردن قفل
traymenu.vault.lock=قفل traymenu.vault.lock=قفل
@@ -31,19 +41,57 @@ traymenu.vault.reveal=ظاهر
# Add Vault Wizard # Add Vault Wizard
addvaultwizard.title=اضافه کردن گاوصندوق addvaultwizard.title=اضافه کردن گاوصندوق
## New ## New
addvaultwizard.new.title=افزودن گاوصندوق جدید
### Name ### Name
addvaultwizard.new.nameInstruction=یک نام برای گاوصندوق انتخاب کنید addvaultwizard.new.nameInstruction=یک نام برای گاوصندوق انتخاب کنید
addvaultwizard.new.namePrompt=نام گاوصندوق addvaultwizard.new.namePrompt=نام گاوصندوق
### Location ### Location
addvaultwizard.new.locationInstruction=کجا باید کریپتوماتور فایل های رمزگذاری شده گاوصندوق شما را نگهداری کند؟
addvaultwizard.new.locationLoading=در حال بررسی سیستم فایل های لوکال برای پوشه های پیش فرض حافظه ابری…
addvaultwizard.new.locationLabel=مکان ذخیره‌سازی addvaultwizard.new.locationLabel=مکان ذخیره‌سازی
addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=مکان سفارشی addvaultwizard.new.directoryPickerLabel=مکان سفارشی
addvaultwizard.new.directoryPickerButton=انتخاب کنید… addvaultwizard.new.directoryPickerButton=انتخاب کنید…
addvaultwizard.new.directoryPickerTitle=انتخاب پوشه
addvaultwizard.new.fileAlreadyExists=در حال حاضر یک فایل یا پوشه با همین نام وجود دارد addvaultwizard.new.fileAlreadyExists=در حال حاضر یک فایل یا پوشه با همین نام وجود دارد
addvaultwizard.new.locationDoesNotExist=پوشه ای در مسیر انتخاب شده وجود ندارد یا قابل دسترسی نیست
addvaultwizard.new.locationIsNotWritable=دسترسی نوشتن در مسیر مشخص شده موجود نیست
addvaultwizard.new.locationIsOk=مکانی مناسب برای گاوصندوق شما
addvaultwizard.new.invalidName=نام گاوصندوق نامعتبر
addvaultwizard.new.validName=نام گاوصندوق معتبر
addvaultwizard.new.validCharacters.message=نام گاوصندوق میتواند شامل کاراکتر های زیر باشد:
addvaultwizard.new.validCharacters.chars=کاراکتری های حرف(برای مثال a،ж یا 수)
addvaultwizard.new.validCharacters.numbers=اعداد addvaultwizard.new.validCharacters.numbers=اعداد
addvaultwizard.new.validCharacters.dashes=خط تیره (%s) و یا زیرخط (%s)
### Expert Settings ### Expert Settings
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=فعالسازی تنظیمات پیشرفته
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=لطفا مقداری بین 36 و 220 را وارد کنید(پیش فرض 220)
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=برای آموختن بیشتر، مستندات را مطالعه کنید.
addvaultwizard.new.expertSettings.shorteningThreshold.title=حداکثر طول اسم های رمزگذاری شده فایل ها
addvaultwizard.new.expertSettings.shorteningThreshold.valid=معتبر
### Password ### Password
addvaultwizard.new.createVaultBtn=ایجاد گاوصندوق
addvaultwizard.new.generateRecoveryKeyChoice=شما بدون رمزعبورتان، امکان دسترسی به اطلاعاتتان را نخواهید داشت. آیا میخواهید یک کلید بازیابی برای حالتی که رمزتان را فراموش کردید ایجاد کنید؟
addvaultwizard.new.generateRecoveryKeyChoice.yes=بله لطفا، بهتره خیالم راحت باشه
addvaultwizard.new.generateRecoveryKeyChoice.no=نه ممنون، رمز عبورم را گم نخواهم کرد
### Information ### Information
addvault.new.readme.storageLocation.fileName=مهم.rtf
addvault.new.readme.storageLocation.1=⚠️ فایل های گاوصندوق ⚠️
addvault.new.readme.storageLocation.2=این، مکان ذخیره سازی گاوصندوق شماست.
addvault.new.readme.storageLocation.3=به هیچ عنوان
addvault.new.readme.storageLocation.4=فایل های داخل این پوشه را تغییر ندهید و یا
addvault.new.readme.storageLocation.5=فایلی را برای رمزگذاری داخل این پوشه paste نکنید.
addvault.new.readme.storageLocation.6=اگر میخواهید فایل ها را رمزگذاری کنید و یا محتویات گاوصندوق را ببینید، این کار ها را بکنید:
addvault.new.readme.storageLocation.8=2. قفل گاوصندوق را در کریپتوماتور باز کنید.
addvault.new.readme.storageLocation.9=3. با کلیک روی دکمه "آشکار سازی"، به مکان دسترسی وارد شوید.
addvault.new.readme.storageLocation.10=اگر نیاز به کمک دارید، به مستندات ما مراجعه کنید: %s
addvault.new.readme.accessLocation.fileName=خوش آمدید.rtf
addvault.new.readme.accessLocation.1=🔐️ درایو رمزگذاری شده 🔐️
addvault.new.readme.accessLocation.2=این، مکان دسترسی گاوصندوق شماست.
addvault.new.readme.accessLocation.3=هر فایلی که به این درایو اضافه شود بطور خودکار توسط کریپتوماتور رمزگذاری خواهد شد. شما میتوانید روی آن مثل هر پوشه یا درایور دیگری کار کنید. این فقط یک نمایش رمزگشایی شده از محتویات است. فایل های شما روی درایوتان همیشه رمزگذاری شده خواهند ماند.
addvault.new.readme.accessLocation.4=میتوانید این فایل را حذف کنید.
## Existing ## Existing
addvaultwizard.existing.title=اضافه کردن مخزن موجود
addvaultwizard.existing.chooseBtn=انتخاب کنید… addvaultwizard.existing.chooseBtn=انتخاب کنید…
## Success ## Success
@@ -62,7 +110,9 @@ unlock.unlockBtn=بازکردن قفل
### Waiting ### Waiting
### Receive Key ### Receive Key
### Register Device ### Register Device
### Register Device Legacy
### Registration Success ### Registration Success
hub.registerSuccess.unlockBtn=بازکردن قفل
### Registration Failed ### Registration Failed
### Unauthorized ### Unauthorized
### Requires Account Initialization ### Requires Account Initialization
@@ -89,11 +139,23 @@ lock.forced.retryBtn=تلاش مجدد
## Fix Application ## Fix Application
# Preferences # Preferences
preferences.title=تنظیمات
## General ## General
preferences.general.quickAccessService=خزانه های قفل نشده را به دسترسی سریع اضافه کنید
## 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
### Remove License Key Dialog
removeCert.confirmBtn=حذف
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -106,10 +168,9 @@ lock.forced.retryBtn=تلاش مجدد
# Main Window # Main Window
main.closeBtn.tooltip=ببند
main.supporterCertificateMissing.tooltip=لطفا کمک مالی در نظر بگیرند
## Vault List ## Vault List
main.vaultlist.contextMenu.lock=قفل main.vaultlist.contextMenu.lock=قفل
##Notificaition
## Vault Detail ## Vault Detail
### Welcome ### Welcome
### Locked ### Locked
@@ -145,4 +206,8 @@ vaultOptions.mount.mountPoint.directoryPickerButton=انتخاب کنید…
# Forced Quit # Forced Quit
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault
+12 -9
View File
@@ -139,14 +139,10 @@ hub.receive.message=Odotetaan vastausta…
hub.receive.description=Cryptomator yhdistää Hub:iin. Ole hyvä ja odota. hub.receive.description=Cryptomator yhdistää Hub:iin. Ole hyvä ja odota.
### Register Device ### Register Device
hub.register.nameLabel=Laitteen Nimi hub.register.nameLabel=Laitteen Nimi
hub.register.occupiedMsg=Tämä nimi on jo käytössä ### Register Device Legacy
hub.register.registerBtn=Vahvista
### Registration Success ### Registration Success
hub.registerSuccess.message=Laite nimetty onnistuneesti hub.registerSuccess.unlockBtn=Avaa
hub.registerSuccess.description=Käyttääksesi holvia, holvin omistajan on valtuutettava laitteesi.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Laitteen nimeäminen epäonnistui
hub.registerFailed.description=Nimeämisprosessissa tapahtui virhe. Löydät lisää tietoja lokitiedostoista.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Pääsy estetty hub.unauthorized.message=Pääsy estetty
hub.unauthorized.description=Laitteellasi ei ole pääsyvaltuutusta tähän holviin. Pyydä holvin omistajaa lisäämän valtuutus laitteellesi. hub.unauthorized.description=Laitteellasi ei ole pääsyvaltuutusta tähän holviin. Pyydä holvin omistajaa lisäämän valtuutus laitteellesi.
@@ -210,7 +206,10 @@ preferences.title=Asetukset
## Interface ## Interface
## Volume ## Volume
## Updates ## Updates
## Contribution ## Contribution
### Remove License Key Dialog
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -223,12 +222,11 @@ preferences.title=Asetukset
# Main Window # Main Window
main.closeBtn.tooltip=Sulje
main.preferencesBtn.tooltip=Asetukset
## Vault List ## Vault List
main.vaultlist.contextMenu.lock=Lukitse main.vaultlist.contextMenu.lock=Lukitse
main.vaultlist.contextMenu.unlockNow=Avaa Nyt main.vaultlist.contextMenu.unlockNow=Avaa Nyt
main.vaultlist.contextMenu.reveal=Paljasta Asema main.vaultlist.contextMenu.reveal=Paljasta Asema
##Notificaition
## Vault Detail ## Vault Detail
### Welcome ### Welcome
### Locked ### Locked
@@ -269,4 +267,9 @@ vaultOptions.masterkey.changePasswordBtn=Vaihda salasana
# Forced Quit # Forced Quit
# Update Reminder # Update Reminder
#Dokany Support End
dokanySupportEnd.preferencesBtn=Avaa asetukset
# Share Vault
+64 -17
View File
@@ -47,6 +47,7 @@ addvaultwizard.new.nameInstruction=Pangalanan ang vault
addvaultwizard.new.namePrompt=Pangalan ng Vault addvaultwizard.new.namePrompt=Pangalan ng Vault
### Location ### Location
addvaultwizard.new.locationInstruction=Saan maaaring ilagay ng Cryptomator ang mga encrypted files ng iyong vault? addvaultwizard.new.locationInstruction=Saan maaaring ilagay ng Cryptomator ang mga encrypted files ng iyong vault?
addvaultwizard.new.locationLoading=Sinusuri ang lokal na filesystem para sa mga default na direktoryo ng cloud storage…
addvaultwizard.new.locationLabel=Storage location addvaultwizard.new.locationLabel=Storage location
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Custom Location addvaultwizard.new.directoryPickerLabel=Custom Location
@@ -141,6 +142,9 @@ unlock.error.customPath.description.hideawayNotDir=Ang pansamantalang nakatagong
unlock.error.customPath.description.couldNotBeCleaned=Hindi ma-mount ang iyong vault sa path na "%s". Pakisubukang muli o pumili ng ibang landas. unlock.error.customPath.description.couldNotBeCleaned=Hindi ma-mount ang iyong vault sa path na "%s". Pakisubukang muli o pumili ng ibang landas.
unlock.error.customPath.description.notEmptyDir=Ang custom na mount path na "%s" ay hindi isang walang laman na folder. Mangyaring pumili ng isang walang laman na folder at subukang muli. unlock.error.customPath.description.notEmptyDir=Ang custom na mount path na "%s" ay hindi isang walang laman na folder. Mangyaring pumili ng isang walang laman na folder at subukang muli.
unlock.error.customPath.description.generic=Pumili ka ng custom na mount path para sa vault na ito, ngunit nabigo ang paggamit nito sa mensaheng: %2$s unlock.error.customPath.description.generic=Pumili ka ng custom na mount path para sa vault na ito, ngunit nabigo ang paggamit nito sa mensaheng: %2$s
unlock.error.restartRequired.message=Hindi mabuksan ang vault
unlock.error.restartRequired.description=Baguhin ang uri ng volume sa mga opsyon sa vault o i-restart ang Cryptomator.
unlock.error.title=Hindi mabuksan ang "%s"
## Hub ## Hub
hub.noKeychain.message=Hindi ma-access ang key ng device hub.noKeychain.message=Hindi ma-access ang key ng device
hub.noKeychain.description=Para ma-unlock ang mga Hub vault, kailangan ng device key, na sini-secure gamit ang keychain. Upang magpatuloy, paganahin ang “%s” at pumili ng keychain sa mga kagustuhan. hub.noKeychain.description=Para ma-unlock ang mga Hub vault, kailangan ng device key, na sini-secure gamit ang keychain. Upang magpatuloy, paganahin ang “%s” at pumili ng keychain sa mga kagustuhan.
@@ -154,17 +158,22 @@ hub.receive.message=Pinoproseso ang tugon…
hub.receive.description=Ang Cryptomator ay tumatanggap at nagpoproseso ng tugon mula sa Hub. Mangyaring maghintay. hub.receive.description=Ang Cryptomator ay tumatanggap at nagpoproseso ng tugon mula sa Hub. Mangyaring maghintay.
### Register Device ### Register Device
hub.register.message=Bagong Device hub.register.message=Bagong Device
hub.register.description=Ito ang unang Hub access mula sa device na ito. Mangyaring pahintulutan ito gamit ang iyong Account Key. hub.register.description=Ito ang unang Hub access mula sa device na ito. Mangyaring irehistro ito gamit ang iyong Account Key.
hub.register.nameLabel=Pangalan ng device hub.register.nameLabel=Pangalan ng device
hub.register.invalidAccountKeyLabel=Di-wastong Account Key hub.register.invalidAccountKeyLabel=Di-wastong Account Key
hub.register.occupiedMsg=Ang pangalan ay nagamit na hub.register.registerBtn=Magparehistro
hub.register.registerBtn=Kumpirmahin ### Register Device Legacy
hub.register.legacy.occupiedMsg=Ang pangalan ay nagamit na
hub.register.legacy.description=Ito ang unang Hub access mula sa device na ito. Mangyaring irehistro ito.
### Registration Success ### Registration Success
hub.registerSuccess.message=Pinangalanan ang device hub.registerSuccess.message=Rehistrado na ang device
hub.registerSuccess.description=Para ma-access ang vault, kailangang pahintulutan ng may-ari ng vault ang iyong device. hub.registerSuccess.description=Ang iyong device ay matagumpay sa pag rehistrado. Maaari mo nang buksan ang vault.
hub.registerSuccess.unlockBtn=I-unlock
hub.registerSuccess.legacy.description=Para ma-access ang vault, kailangang pahintulutan ng may-ari ng vault ang iyong device.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Nabigo ang pagpapangalan ng device hub.registerFailed.message=Ang pag rehistrado ng device ay pumalya
hub.registerFailed.description=Nagkaroon ng error sa proseso ng pagbibigay ng pangalan. Para sa higit pang mga detalye, tingnan ang log ng aplikasyon. hub.registerFailed.description.generic=Nagkaroon ng error sa proseso ng pag registrado. Para sa higit pang mga detalye, tingnan ang log ng aplikasyon.
hub.registerFailed.description.deviceAlreadyExists=Ang device na ito ay registrado na sa ibang user. Subukang palitan ang user account o gumamit ng ibang device.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Walang pahintulot hub.unauthorized.message=Walang pahintulot
hub.unauthorized.description=Hindi pa pinahihintulutan ang iyong device na i-access ang vault na ito. Hilingin sa may-ari ng vault na pahintulutan ito. hub.unauthorized.description=Hindi pa pinahihintulutan ang iyong device na i-access ang vault na ito. Hilingin sa may-ari ng vault na pahintulutan ito.
@@ -278,6 +287,7 @@ preferences.general.debugLogging=Paganahin ang pag-log ng debug
preferences.general.debugDirectory=Magbunyag ng mga log file preferences.general.debugDirectory=Magbunyag ng mga log file
preferences.general.autoStart=Ilunsad ang Cryptomator sa pagsisimula ng system preferences.general.autoStart=Ilunsad ang Cryptomator sa pagsisimula ng system
preferences.general.keychainBackend=Mag-imbak ng mga password gamit ang preferences.general.keychainBackend=Mag-imbak ng mga password gamit ang
preferences.general.quickAccessService=Magdagdag ng mga naka-unlock na vault sa lugar ng mabilisang pag-access
## Interface ## Interface
preferences.interface=Interface preferences.interface=Interface
preferences.interface.theme=Tingnan at Pakiramdam preferences.interface.theme=Tingnan at Pakiramdam
@@ -290,13 +300,14 @@ preferences.interface.language.auto=System Default
preferences.interface.interfaceOrientation=Oryentasyon ng Interface preferences.interface.interfaceOrientation=Oryentasyon ng Interface
preferences.interface.interfaceOrientation.ltr=Kaliwa hanggang Kanan preferences.interface.interfaceOrientation.ltr=Kaliwa hanggang Kanan
preferences.interface.interfaceOrientation.rtl=Kanan papuntang Kaliwa preferences.interface.interfaceOrientation.rtl=Kanan papuntang Kaliwa
preferences.interface.showMinimizeButton=Ipakita ang pindutan ng minimize
preferences.interface.showTrayIcon=Ipakita ang icon ng tray (kailangan i-restart) preferences.interface.showTrayIcon=Ipakita ang icon ng tray (kailangan i-restart)
## Volume ## Volume
preferences.volume=Virtual Drive preferences.volume=Virtual Drive
preferences.volume.type=Default na Uri ng Dami
preferences.volume.type.automatic=Awtomatiko preferences.volume.type.automatic=Awtomatiko
preferences.volume.docsTooltip=Buksan ang dokumentasyon para matuto pa tungkol sa iba't ibang uri ng volume. preferences.volume.docsTooltip=Buksan ang dokumentasyon para matuto pa tungkol sa iba't ibang uri ng volume.
preferences.volume.fuseRestartRequired=Upang mailapat ang mga pagbabago, kailangang i-restart ang Cryptomator. preferences.volume.fuseRestartRequired=Upang mailapat ang mga pagbabago, kailangang i-restart ang Cryptomator.
preferences.volume.tcp.port=Default na TCP Port
preferences.volume.supportedFeatures=Sinusuportahan ng napiling uri ng volume ang mga sumusunod na tampok: preferences.volume.supportedFeatures=Sinusuportahan ng napiling uri ng volume ang mga sumusunod na tampok:
preferences.volume.feature.mountAuto=Awtomatikong pagpili ng mount point preferences.volume.feature.mountAuto=Awtomatikong pagpili ng mount point
preferences.volume.feature.mountToDir=Custom na direktoryo bilang mount point preferences.volume.feature.mountToDir=Custom na direktoryo bilang mount point
@@ -309,12 +320,23 @@ preferences.updates.currentVersion=Kasalukuyang Bersyon: %s
preferences.updates.autoUpdateCheck=Awtomatikong suriin ang mga update preferences.updates.autoUpdateCheck=Awtomatikong suriin ang mga update
preferences.updates.checkNowBtn=Tingnan ngayon preferences.updates.checkNowBtn=Tingnan ngayon
preferences.updates.updateAvailable=Available ang update sa bersyong %s. preferences.updates.updateAvailable=Available ang update sa bersyong %s.
preferences.updates.lastUpdateCheck=Huling pagsusuri: %s
preferences.updates.lastUpdateCheck.never=hindi kailanman
preferences.updates.lastUpdateCheck.recently=kamakailan
preferences.updates.lastUpdateCheck.daysAgo=%s araw ang lumipas
preferences.updates.lastUpdateCheck.hoursAgo=%s oras ang lumipas
preferences.updates.checkFailed=Nabigo ang paghahanap ng mga update. Pakisuri ang iyong koneksyon sa internet o subukang muli sa ibang pagkakataon.
preferences.updates.upToDate=Ang Cryptomator ay napapanahon.
## Contribution ## Contribution
preferences.contribute=Suportahan Kami preferences.contribute=Suportahan Kami
preferences.contribute.registeredFor=Nakarehistro ang sertipiko ng tagasuporta para sa %s preferences.contribute.registeredFor=Nakarehistro ang sertipiko ng tagasuporta para sa %s
preferences.contribute.noCertificate=Suportahan ang Cryptomator at tumanggap ng sertipiko ng tagasuporta. Ito ay tulad ng isang susi ng lisensya ngunit para sa mga kahanga-hangang tao na gumagamit ng libreng software. ;-) preferences.contribute.noCertificate=Suportahan ang Cryptomator at tumanggap ng sertipiko ng tagasuporta. Ito ay tulad ng isang susi ng lisensya ngunit para sa mga kahanga-hangang tao na gumagamit ng libreng software. ;-)
preferences.contribute.getCertificate=Wala ka na ba? Alamin kung paano mo ito makukuha. preferences.contribute.getCertificate=Wala ka na ba? Alamin kung paano mo ito makukuha.
preferences.contribute.promptText=I-paste ang code ng certificate ng tagasuporta dito preferences.contribute.promptText=I-paste ang code ng certificate ng tagasuporta dito
### Remove License Key Dialog
removeCert.confirmBtn=Tanggalin
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -356,11 +378,6 @@ stats.access.total=Kabuuang mga access: %d
# Main Window # Main Window
main.closeBtn.tooltip=Isara
main.minimizeBtn.tooltip=I-minimize
main.preferencesBtn.tooltip=Mga Kagustuhan
main.debugModeEnabled.tooltip=Naka-enable ang debug mode
main.supporterCertificateMissing.tooltip=Mangyaring isaalang-alang ang pagbibigay ng donasyon
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Mag-click dito para magdagdag ng vault main.vaultlist.emptyList.onboardingInstruction=Mag-click dito para magdagdag ng vault
main.vaultlist.contextMenu.remove=Alisin… main.vaultlist.contextMenu.remove=Alisin…
@@ -369,9 +386,7 @@ main.vaultlist.contextMenu.unlock=I-unlock…
main.vaultlist.contextMenu.unlockNow=I-unlock Ngayon main.vaultlist.contextMenu.unlockNow=I-unlock Ngayon
main.vaultlist.contextMenu.vaultoptions=Ipakita ang Mga Opsyon sa Vault main.vaultlist.contextMenu.vaultoptions=Ipakita ang Mga Opsyon sa Vault
main.vaultlist.contextMenu.reveal=Ibunyag ang Drive main.vaultlist.contextMenu.reveal=Ibunyag ang Drive
main.vaultlist.addVaultBtn=Idagdag ##Notificaition
main.vaultlist.addVaultBtn.menuItemNew=Bagong Vault...
main.vaultlist.addVaultBtn.menuItemExisting=Kasalukuyang Vault...
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Salamat sa pagpili sa Cryptomator para protektahan ang iyong mga file. Kung kailangan mo ng anumang tulong, tingnan ang aming mga gabay sa pagsisimula: main.vaultDetail.welcomeOnboarding=Salamat sa pagpili sa Cryptomator para protektahan ang iyong mga file. Kung kailangan mo ng anumang tulong, tingnan ang aming mga gabay sa pagsisimula:
@@ -381,6 +396,7 @@ main.vaultDetail.unlockBtn=I-unlock…
main.vaultDetail.unlockNowBtn=I-unlock Ngayon main.vaultDetail.unlockNowBtn=I-unlock Ngayon
main.vaultDetail.optionsBtn=Mga Pagpipilian sa Vault main.vaultDetail.optionsBtn=Mga Pagpipilian sa Vault
main.vaultDetail.passwordSavedInKeychain=Na-save ang password main.vaultDetail.passwordSavedInKeychain=Na-save ang password
main.vaultDetail.share=Ibahagi…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=NAKA-unlock main.vaultDetail.unlockedStatus=NAKA-unlock
main.vaultDetail.accessLocation=Ang mga nilalaman ng iyong vault ay maa-access dito: main.vaultDetail.accessLocation=Ang mga nilalaman ng iyong vault ay maa-access dito:
@@ -435,6 +451,7 @@ vaultOptions.general.startHealthCheckBtn=Simulan ang Health Check
## Mount ## Mount
vaultOptions.mount=Pag-mount vaultOptions.mount=Pag-mount
vaultOptions.mount.info=Buksan ang mga kagustuhan sa virtual drive upang baguhin ang mga default na setting.
vaultOptions.mount.readonly=Basahin lamang vaultOptions.mount.readonly=Basahin lamang
vaultOptions.mount.customMountFlags=Mga custom na naka-mount na flag vaultOptions.mount.customMountFlags=Mga custom na naka-mount na flag
vaultOptions.mount.winDriveLetterOccupied=inookupahan vaultOptions.mount.winDriveLetterOccupied=inookupahan
@@ -444,6 +461,10 @@ vaultOptions.mount.mountPoint.driveLetter=Gumamit ng nakatalagang drive letter
vaultOptions.mount.mountPoint.custom=Gamitin ang napiling direktoryo vaultOptions.mount.mountPoint.custom=Gamitin ang napiling direktoryo
vaultOptions.mount.mountPoint.directoryPickerButton=Mamili… vaultOptions.mount.mountPoint.directoryPickerButton=Mamili…
vaultOptions.mount.mountPoint.directoryPickerTitle=Pumili ng isang direktoryo vaultOptions.mount.mountPoint.directoryPickerTitle=Pumili ng isang direktoryo
vaultOptions.mount.volumeType.default=Default (%s)
vaultOptions.mount.volumeType.restartRequired=Upang magamit ang uri ng volume na ito, kailangang i-restart ang Cryptomator.
vaultOptions.mount.volume.tcp.port=TCP Port
vaultOptions.mount.volume.type=Uri ng Dami
## Master Key ## Master Key
vaultOptions.masterkey=Password vaultOptions.masterkey=Password
vaultOptions.masterkey.changePasswordBtn=Palitan ANG password vaultOptions.masterkey.changePasswordBtn=Palitan ANG password
@@ -513,4 +534,30 @@ updateReminder.message=I-tsek kung may bagong update?
updateReminder.description=Manatiling updated sa mga bagong feature, pag-aayos ng bug, at pagpapahusay sa seguridad. Inirerekomenda naming awtomatikong suriin ang mga update. updateReminder.description=Manatiling updated sa mga bagong feature, pag-aayos ng bug, at pagpapahusay sa seguridad. Inirerekomenda naming awtomatikong suriin ang mga update.
updateReminder.notNow=Hindi ngayon updateReminder.notNow=Hindi ngayon
updateReminder.yesOnce=Oo, Minsan updateReminder.yesOnce=Oo, Minsan
updateReminder.yesAutomatically=Oo, Awtomatiko updateReminder.yesAutomatically=Oo, Awtomatiko
#Dokany Support End
dokanySupportEnd.title=Paunawa sa paghinto sa paggamit
dokanySupportEnd.message=Pagtatapos ng suporta para sa Dokany
dokanySupportEnd.description=Ang uri ng volume na Dokany ay hindi na sinusuportahan ng Cryptomator. Isinasaayos ang iyong mga setting upang magamit ang default na uri ng volume ngayon. Maaari mong tingnan ang default na uri sa mga kagustuhan.
dokanySupportEnd.preferencesBtn=Buksan ang Mga Kagustuhan
# Share Vault
shareVault.title=Ibahagi ang Vault
shareVault.message=Gusto mo bang ibahagi ang iyong vault sa iba?
shareVault.description=Maingat palagi pag binabahagi ang iyong vault sa ibang tao. Sa maikling salita, sundin ang mga hakbangin:
shareVault.instruction.1=1. Ibahagi ang access ng naka-encrypt na folder ng vault sa pamamagitan ng cloud storage.
shareVault.instruction.2=2. Ibahagi ang password ng vault sa isang secure na paraan.
shareVault.remarkBestPractices=Para sa higit pang impormasyon, tingnan ang mga mungkahi sa pinakamahuhusay na kagawian sa aming mga doc.
shareVault.docsTooltip=Buksan ang dokumentasyon para matuto pa tungkol sa pagbabahagi ng mga vault.
shareVault.hubAd.description=Ang ligtas na paraan upang magtrabaho sa mga koponan
shareVault.hubAd.keyManagement=• Zero-knowledge key management
shareVault.hubAd.authentication=• Malakas na pagpapatunay
shareVault.hubAd.encryption=• End-to-end na pag-encrypt
shareVault.visitHub=Pagbisita ang Cryptomator Hub
shareVault.hub.message=Paano ibahagi ang Hub vault
shareVault.hub.description=Upang maibahagi ang nilalaman ng vault sa isa pang miyembro ng koponan, kailangan mong magsagawa ng dalawang hakbang:
shareVault.hub.instruction.1=1. Ibahagi ang access ng naka-encrypt na folder ng vault sa pamamagitan ng cloud storage.
shareVault.hub.instruction.2=2. Magbigay ng access sa miyembro ng team sa Cryptomator Hub.
shareVault.hub.openHub=Buksan ang Cryptomator Hub
+68 -20
View File
@@ -47,6 +47,7 @@ addvaultwizard.new.nameInstruction=Choisir un nom pour le coffre
addvaultwizard.new.namePrompt=Nom du coffre addvaultwizard.new.namePrompt=Nom du coffre
### Location ### Location
addvaultwizard.new.locationInstruction=Où Cryptomator doit-il stocker les fichiers chiffrés de votre coffre ? addvaultwizard.new.locationInstruction=Où Cryptomator doit-il stocker les fichiers chiffrés de votre coffre ?
addvaultwizard.new.locationLoading=Vérification du système de fichiers local pour les répertoires de stockage par défaut du cloud…
addvaultwizard.new.locationLabel=Emplacement de stockage addvaultwizard.new.locationLabel=Emplacement de stockage
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Emplacement personnalisé addvaultwizard.new.directoryPickerLabel=Emplacement personnalisé
@@ -141,8 +142,8 @@ unlock.error.customPath.description.hideawayNotDir=Le fichier temporaire et cach
unlock.error.customPath.description.couldNotBeCleaned=Votre coffre n'a pas pu être monté au point "%s". Veuillez réessayer ou choisissez un autre point. unlock.error.customPath.description.couldNotBeCleaned=Votre coffre n'a pas pu être monté au point "%s". Veuillez réessayer ou choisissez un autre point.
unlock.error.customPath.description.notEmptyDir=Le chemin de montage personnalisé "%s" n'est pas un dossier vide. Veuillez choisir un dossier vide et réessayez. unlock.error.customPath.description.notEmptyDir=Le chemin de montage personnalisé "%s" n'est pas un dossier vide. Veuillez choisir un dossier vide et réessayez.
unlock.error.customPath.description.generic=Vous avez sélectionné un point de montage personnalisé pour ce coffre, mais son utilisation a échoué avec le message : %2$s unlock.error.customPath.description.generic=Vous avez sélectionné un point de montage personnalisé pour ce coffre, mais son utilisation a échoué avec le message : %2$s
unlock.error.fuseRestartRequired.message=Impossible de déverrouiller le coffre unlock.error.restartRequired.message=Impossible de déverrouiller le volume
unlock.error.fuseRestartRequired.description=Changez le type de volume dans les options du coffre ou redémarrez Cryptomator. unlock.error.restartRequired.description=Modifiez le type de volume dans les options du coffre ou redémarrez Cryptomator.
unlock.error.title=Échec du déverrouillage de "%s" unlock.error.title=Échec du déverrouillage de "%s"
## Hub ## Hub
hub.noKeychain.message=Impossible d'accéder à la clé du périphérique hub.noKeychain.message=Impossible d'accéder à la clé du périphérique
@@ -160,14 +161,19 @@ hub.register.message=Nouvel Appareil
hub.register.description=Il s'agit du premier accès de cet appareil au Hub. Veuillez l'autoriser à l'aide de votre clé de compte. hub.register.description=Il s'agit du premier accès de cet appareil au Hub. Veuillez l'autoriser à l'aide de votre clé de compte.
hub.register.nameLabel=Nom de l'appareil hub.register.nameLabel=Nom de l'appareil
hub.register.invalidAccountKeyLabel=Clé de compte invalide hub.register.invalidAccountKeyLabel=Clé de compte invalide
hub.register.occupiedMsg=Nom déjà utilisé hub.register.registerBtn=Inscription
hub.register.registerBtn=Confirmer ### Register Device Legacy
hub.register.legacy.occupiedMsg=Nom déjà utilisé
hub.register.legacy.description=Il s'agit du premier accès de cet appareil au Hub. Veuillez l'autoriser à l'aide de votre clé de compte.
### Registration Success ### Registration Success
hub.registerSuccess.message=Appareil nommé hub.registerSuccess.message=Appareil enregistré
hub.registerSuccess.description=Pour accéder au coffre, votre appareil doit être autorisé par le propriétaire du coffre. hub.registerSuccess.description=Votre appareil est enregistré avec succès. Vous pouvez maintenant continuer à déverrouiller le coffre.
hub.registerSuccess.unlockBtn=Déverrouiller
hub.registerSuccess.legacy.description=Pour accéder au coffre, votre appareil doit être autorisé par le propriétaire du coffre.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Échec du nommage de l'appareil hub.registerFailed.message=Echec de l'enregistrement de l'appareil
hub.registerFailed.description=Le processus de nommage a retourné une erreur. Pour plus de détails, regardez dans le journal de l'application. hub.registerFailed.description.generic=Le processus de nommage a retourné une erreur. Pour plus de détails, regardez dans le journal de l'application.
hub.registerFailed.description.deviceAlreadyExists=Cet appareil est déjà enregistré pour un autre utilisateur. Essayez de changer de compte ou utilisez un autre appareil.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Accès refusé hub.unauthorized.message=Accès refusé
hub.unauthorized.description=Votre appareil n'a pas encore été autorisé à accéder à ce coffre. Demandez au propriétaire du coffre de l'autoriser. hub.unauthorized.description=Votre appareil n'a pas encore été autorisé à accéder à ce coffre. Demandez au propriétaire du coffre de l'autoriser.
@@ -281,6 +287,7 @@ preferences.general.debugLogging=Activer les logs debug
preferences.general.debugDirectory=Afficher le journal preferences.general.debugDirectory=Afficher le journal
preferences.general.autoStart=Lancer Cryptomator au démarrage du système preferences.general.autoStart=Lancer Cryptomator au démarrage du système
preferences.general.keychainBackend=Stocker les mots de passe avec preferences.general.keychainBackend=Stocker les mots de passe avec
preferences.general.quickAccessService=Ajouter les coffres déverrouillés à la zone d'accès rapide
## Interface ## Interface
preferences.interface=Interface preferences.interface=Interface
preferences.interface.theme=Apparence preferences.interface.theme=Apparence
@@ -293,8 +300,8 @@ preferences.interface.language.auto=Valeur du système
preferences.interface.interfaceOrientation=Orientation de l'interface preferences.interface.interfaceOrientation=Orientation de l'interface
preferences.interface.interfaceOrientation.ltr=De gauche à droite preferences.interface.interfaceOrientation.ltr=De gauche à droite
preferences.interface.interfaceOrientation.rtl=De droite à gauche preferences.interface.interfaceOrientation.rtl=De droite à gauche
preferences.interface.showMinimizeButton=Afficher le bouton Réduire
preferences.interface.showTrayIcon=Montrer l'icône de service (redémarrage nécessaire) preferences.interface.showTrayIcon=Montrer l'icône de service (redémarrage nécessaire)
preferences.interface.compactMode=Activer la liste compacte des coffres
## Volume ## Volume
preferences.volume=Disque virtuel preferences.volume=Disque virtuel
preferences.volume.type=Type de volume par défaut preferences.volume.type=Type de volume par défaut
@@ -314,12 +321,29 @@ 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
preferences.contribute.noCertificate=Soutenez Cryptomator et recevez un certificat de soutien. C'est comme une clé de licence, mais pour des gens géniaux qui utilisent des logiciels libres. ;-) preferences.contribute.noCertificate=Soutenez Cryptomator et recevez un certificat de soutien. C'est comme une clé de licence, mais pour des gens géniaux qui utilisent des logiciels libres. ;-)
preferences.contribute.getCertificate=Vous n'en avez pas encore? Découvrez comment vous pouvez l'obtenir. preferences.contribute.getCertificate=Vous n'en avez pas encore? Découvrez comment vous pouvez l'obtenir.
preferences.contribute.promptText=Collez le code du certificat du supporter ici preferences.contribute.promptText=Collez le code du certificat du supporter ici
preferences.contribute.thankYou=Merci de soutenir le développement open-source de Cryptomator !
preferences.contribute.donate=Faire un don
preferences.contribute.sponsor=Parrain
### Remove License Key Dialog
removeCert.title=Supprimer le certificat
removeCert.message=Supprimer le certificat de soutien ?
removeCert.description=
removeCert.confirmBtn=Retirer
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -361,11 +385,6 @@ stats.access.total=Total des accès: %d
# Main Window # Main Window
main.closeBtn.tooltip=Fermer
main.minimizeBtn.tooltip=Réduire
main.preferencesBtn.tooltip=Préférences
main.debugModeEnabled.tooltip=Le mode débogage est activé
main.supporterCertificateMissing.tooltip=Merci d'envisager un don
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Cliquez ici pour ajouter un volume chiffré main.vaultlist.emptyList.onboardingInstruction=Cliquez ici pour ajouter un volume chiffré
main.vaultlist.contextMenu.remove=Retirer… main.vaultlist.contextMenu.remove=Retirer…
@@ -374,9 +393,11 @@ main.vaultlist.contextMenu.unlock=Déverrouiller…
main.vaultlist.contextMenu.unlockNow=Déverrouiller maintenant main.vaultlist.contextMenu.unlockNow=Déverrouiller maintenant
main.vaultlist.contextMenu.vaultoptions=Afficher les options du volume chiffré main.vaultlist.contextMenu.vaultoptions=Afficher les options du volume chiffré
main.vaultlist.contextMenu.reveal=Afficher le lecteur main.vaultlist.contextMenu.reveal=Afficher le lecteur
main.vaultlist.addVaultBtn=Ajouter main.vaultlist.addVaultBtn.menuItemNew=Créer un nouveau coffre...
main.vaultlist.addVaultBtn.menuItemNew=Nouveau coffre... main.vaultlist.addVaultBtn.menuItemExisting=Ouvrir un coffre existant...
main.vaultlist.addVaultBtn.menuItemExisting=Coffre existant... ##Notificaition
main.notification.updateAvailable=Mise à jour disponible.
main.notification.support=Soutenir Cryptomator.
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Merci d'avoir choisi Cryptomator pour protéger vos fichiers. Si vous avez besoin d'aide, consultez nos guides de démarrage : main.vaultDetail.welcomeOnboarding=Merci d'avoir choisi Cryptomator pour protéger vos fichiers. Si vous avez besoin d'aide, consultez nos guides de démarrage :
@@ -386,6 +407,7 @@ main.vaultDetail.unlockBtn=Déverrouiller…
main.vaultDetail.unlockNowBtn=Déverrouiller maintenant main.vaultDetail.unlockNowBtn=Déverrouiller maintenant
main.vaultDetail.optionsBtn=Options du volume chiffré main.vaultDetail.optionsBtn=Options du volume chiffré
main.vaultDetail.passwordSavedInKeychain=Mot de passe enregistré main.vaultDetail.passwordSavedInKeychain=Mot de passe enregistré
main.vaultDetail.share=Partager...
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=DÉVERROUILLÉ main.vaultDetail.unlockedStatus=DÉVERROUILLÉ
main.vaultDetail.accessLocation=Le contenu de votre coffre est accessible ici : main.vaultDetail.accessLocation=Le contenu de votre coffre est accessible ici :
@@ -451,7 +473,7 @@ vaultOptions.mount.mountPoint.custom=Utiliser le répertoire choisi
vaultOptions.mount.mountPoint.directoryPickerButton=Choisir... vaultOptions.mount.mountPoint.directoryPickerButton=Choisir...
vaultOptions.mount.mountPoint.directoryPickerTitle=Choisissez un répertoire vaultOptions.mount.mountPoint.directoryPickerTitle=Choisissez un répertoire
vaultOptions.mount.volumeType.default=Par défaut (%s) vaultOptions.mount.volumeType.default=Par défaut (%s)
vaultOptions.mount.volumeType.fuseRestartRequired=Pour utiliser ce type de volume, Cryptomator doit être redémarré. vaultOptions.mount.volumeType.restartRequired=Pour utiliser ce type de volume, Cryptomator doit être redémarré.
vaultOptions.mount.volume.tcp.port=Port TCP vaultOptions.mount.volume.tcp.port=Port TCP
vaultOptions.mount.volume.type=Type de volume vaultOptions.mount.volume.type=Type de volume
## Master Key ## Master Key
@@ -470,7 +492,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
@@ -523,4 +545,30 @@ updateReminder.message=Rechercher des mises à jour ?
updateReminder.description=Restez à jour avec de nouvelles fonctionnalités, des corrections de bugs et des améliorations de sécurité. La vérification automatique des mises à jour est recommandée. updateReminder.description=Restez à jour avec de nouvelles fonctionnalités, des corrections de bugs et des améliorations de sécurité. La vérification automatique des mises à jour est recommandée.
updateReminder.notNow=Plus tard 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
shareVault.title=Partager le coffre
shareVault.message=Vous aimeriez partager votre coffre avec d'autres personnes ?
shareVault.description=Soyez toujours prudent lorsque vous partagez votre coffre avec d'autres personnes. En bref, suivez ces étapes :
shareVault.instruction.1=1. Partagez l'accès du dossier de coffre chiffré via le stockage cloud.
shareVault.instruction.2=2. Partagez le mot de passe du coffre de manière sécurisée.
shareVault.remarkBestPractices=Pour plus d'informations, consultez les suggestions des meilleures pratiques de notre documentation.
shareVault.docsTooltip=Ouvrez la documentation pour en savoir plus sur le partage des coffres.
shareVault.hubAd.description=La façon sécurisée de travailler en équipe
shareVault.hubAd.keyManagement=• Gestion des clés sans connaissance
shareVault.hubAd.authentication=• Authentification forte
shareVault.hubAd.encryption=Chiffrement de bout en bout
shareVault.visitHub=Visiter le Hub Cryptomator
shareVault.hub.message=Comment partager un coffre central
shareVault.hub.description=Afin de partager le contenu du coffre avec un autre membre de l'équipe, vous devez effectuer deux étapes :
shareVault.hub.instruction.1=1. Partagez l'accès du dossier de coffre chiffré via le stockage cloud.
shareVault.hub.instruction.2=2. Accorder l'accès au membre de l'équipe dans Cryptomator Hub.
shareVault.hub.openHub=Ouvrir le Hub Cryptomator
+11 -2
View File
@@ -45,6 +45,7 @@ error.message=Produciuse un erro
### Waiting ### Waiting
### Receive Key ### Receive Key
### Register Device ### Register Device
### Register Device Legacy
### Registration Success ### Registration Success
### Registration Failed ### Registration Failed
### Unauthorized ### Unauthorized
@@ -76,7 +77,11 @@ lock.forced.retryBtn=Tentar de novo
## Interface ## Interface
## Volume ## Volume
## Updates ## Updates
## Contribution ## Contribution
### Remove License Key Dialog
removeCert.confirmBtn=Eliminar
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -89,8 +94,8 @@ lock.forced.retryBtn=Tentar de novo
# Main Window # Main Window
main.closeBtn.tooltip=Pechar
## Vault List ## Vault List
##Notificaition
## Vault Detail ## Vault Detail
### Welcome ### Welcome
### Locked ### Locked
@@ -123,4 +128,8 @@ main.closeBtn.tooltip=Pechar
# Forced Quit # Forced Quit
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault
+13 -15
View File
@@ -153,14 +153,10 @@ hub.receive.message=מעבד תשובה…
hub.receive.description=Cryptomator מקבל ומעבד את התשובה מה- האב. אנא המתן. hub.receive.description=Cryptomator מקבל ומעבד את התשובה מה- האב. אנא המתן.
### Register Device ### Register Device
hub.register.nameLabel=שם מכשיר hub.register.nameLabel=שם מכשיר
hub.register.occupiedMsg=שם זה נמצא כבר בשימוש ### Register Device Legacy
hub.register.registerBtn=אישור
### Registration Success ### Registration Success
hub.registerSuccess.message=שם המכשיר hub.registerSuccess.unlockBtn=בטל נעילה
hub.registerSuccess.description=כדי לגשת לכספת, המכשיר שלך צריך לקבל הרשאה על ידי בעלי הכספת.
### Registration Failed ### Registration Failed
hub.registerFailed.message=הגדרת שם למכשיר נכשלה
hub.registerFailed.description=ארעה שגיאה בתהליך עם השם. לפרטים נוספים הסתכל בלוג האפליקציה.
### Unauthorized ### Unauthorized
hub.unauthorized.message=הגישה נדחתה hub.unauthorized.message=הגישה נדחתה
hub.unauthorized.description=המכשיר שלך טרם אושר לגשת לכספת הזאת. יש לבקש אישור גישה מבעל הכספת. hub.unauthorized.description=המכשיר שלך טרם אושר לגשת לכספת הזאת. יש לבקש אישור גישה מבעל הכספת.
@@ -282,7 +278,6 @@ preferences.interface.language.auto=ברירת המחדל של המערכת
preferences.interface.interfaceOrientation=כיוון ממשק preferences.interface.interfaceOrientation=כיוון ממשק
preferences.interface.interfaceOrientation.ltr=משמאל לימין preferences.interface.interfaceOrientation.ltr=משמאל לימין
preferences.interface.interfaceOrientation.rtl=מימין לשמאל preferences.interface.interfaceOrientation.rtl=מימין לשמאל
preferences.interface.showMinimizeButton=הצג כפתור מזעור
preferences.interface.showTrayIcon=הצג צלמית בשורה מטה (דורש הפעלה מחדש) preferences.interface.showTrayIcon=הצג צלמית בשורה מטה (דורש הפעלה מחדש)
## Volume ## Volume
preferences.volume=כונן וירטואלי preferences.volume=כונן וירטואלי
@@ -301,12 +296,16 @@ 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
preferences.contribute.noCertificate=תמכו ב-Cryptomator וקבלו תעודת תמיכה. זה כמו מפתח רישוי רק לאנשים מדהימים שמשתמשים בתוכנה חופשית. ;-) preferences.contribute.noCertificate=תמכו ב-Cryptomator וקבלו תעודת תמיכה. זה כמו מפתח רישוי רק לאנשים מדהימים שמשתמשים בתוכנה חופשית. ;-)
preferences.contribute.getCertificate=עדיין אין לכם אחד? לימדו כיצד אתם יכולים להשיג אותו. preferences.contribute.getCertificate=עדיין אין לכם אחד? לימדו כיצד אתם יכולים להשיג אותו.
preferences.contribute.promptText=הדבק את קוד תעודת התומך כאן preferences.contribute.promptText=הדבק את קוד תעודת התומך כאן
### Remove License Key Dialog
removeCert.confirmBtn=הסר
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -348,11 +347,6 @@ stats.access.total=מספר גישות כולל: %d
# Main Window # Main Window
main.closeBtn.tooltip=סגור
main.minimizeBtn.tooltip=מזער
main.preferencesBtn.tooltip=העדפות
main.debugModeEnabled.tooltip=מצב דיבאג מופעל
main.supporterCertificateMissing.tooltip=תרומתך תתקבל בברכה
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=לחץ כאן להוספת כספת main.vaultlist.emptyList.onboardingInstruction=לחץ כאן להוספת כספת
main.vaultlist.contextMenu.remove=הסר… main.vaultlist.contextMenu.remove=הסר…
@@ -361,8 +355,7 @@ main.vaultlist.contextMenu.unlock=שחרר נעילה…
main.vaultlist.contextMenu.unlockNow=בטל נעילה כעת main.vaultlist.contextMenu.unlockNow=בטל נעילה כעת
main.vaultlist.contextMenu.vaultoptions=הצג את אפשרויות הכספת main.vaultlist.contextMenu.vaultoptions=הצג את אפשרויות הכספת
main.vaultlist.contextMenu.reveal=חשוף את הכונן main.vaultlist.contextMenu.reveal=חשוף את הכונן
main.vaultlist.addVaultBtn=הוספה ##Notificaition
main.vaultlist.addVaultBtn.menuItemNew=פתיחת כספת...
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=תודה שבחרת ב- Cryptomator להגן על הקבצים שלך. אם אתה זקוק לסיוע, אנא עיין במדריכים שלנו: main.vaultDetail.welcomeOnboarding=תודה שבחרת ב- Cryptomator להגן על הקבצים שלך. אם אתה זקוק לסיוע, אנא עיין במדריכים שלנו:
@@ -495,4 +488,9 @@ quit.forced.forceAndQuitBtn=נעילה בכח ויציאה
# Update Reminder # Update Reminder
updateReminder.title=בדיקת עדכון updateReminder.title=בדיקת עדכון
updateReminder.message=חפש עדכונים? updateReminder.message=חפש עדכונים?
updateReminder.notNow=לא עכשיו updateReminder.notNow=לא עכשיו
#Dokany Support End
dokanySupportEnd.preferencesBtn=פתח העדפות
# Share Vault
+44 -6
View File
@@ -20,6 +20,9 @@ error.description=क्रिप्टोमेटर ने ऐसा हो
error.hyperlink.lookup=इस त्रुटि को ढूंढिए error.hyperlink.lookup=इस त्रुटि को ढूंढिए
error.hyperlink.report=त्रुटि रिपोर्ट करें error.hyperlink.report=त्रुटि रिपोर्ट करें
error.technicalDetails=अधिक जानकारी: error.technicalDetails=अधिक जानकारी:
error.hyperlink.solution=समाधान खोजें
error.dismiss=खारिज करें
error.lookUpSolution=समाधान खोजें
# Defaults # Defaults
defaults.vault.vaultName=वॉल्ट defaults.vault.vaultName=वॉल्ट
@@ -36,6 +39,7 @@ traymenu.vault.reveal=प्रत्यक्ष करें
# Add Vault Wizard # Add Vault Wizard
addvaultwizard.title=वाउल्ट डालें addvaultwizard.title=वाउल्ट डालें
## New ## New
addvaultwizard.new.title=नयी तिजोरी बनाये
### Name ### Name
addvaultwizard.new.nameInstruction=वाउल्ट के लिए नाम चुनें addvaultwizard.new.nameInstruction=वाउल्ट के लिए नाम चुनें
addvaultwizard.new.namePrompt=वॉल्ट का नाम addvaultwizard.new.namePrompt=वॉल्ट का नाम
@@ -53,8 +57,15 @@ addvaultwizard.new.locationIsOk=आपकी सुरक्षित तिज
addvaultwizard.new.invalidName=तिजोरी के लिए इस नाम का उपयोग नहीं किया जा सकता addvaultwizard.new.invalidName=तिजोरी के लिए इस नाम का उपयोग नहीं किया जा सकता
addvaultwizard.new.validName=आप इस नाम का उपयोग कर सकते हैं addvaultwizard.new.validName=आप इस नाम का उपयोग कर सकते हैं
addvaultwizard.new.validCharacters.message=नाम के लिए केवल इन वर्णों का उपयोग कर सकते हैं addvaultwizard.new.validCharacters.message=नाम के लिए केवल इन वर्णों का उपयोग कर सकते हैं
addvaultwizard.new.validCharacters.chars=शब्दो के अक्षर (अ. ब., e.g. a, ж और 수)
addvaultwizard.new.validCharacters.numbers=नंबर addvaultwizard.new.validCharacters.numbers=नंबर
addvaultwizard.new.validCharacters.dashes=हाइफ़न (%s) या अंडरस्कोर (%s)
### Expert Settings ### Expert Settings
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=विशेषज्ञ सेटिंग सक्षम करें
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=36 से 220 अक्षरोंका शब्द दर्ज करें (निर्धारित 220)
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=अधिक जानने के लिए दस्तावेज़ खोलें |
addvaultwizard.new.expertSettings.shorteningThreshold.title=एन्क्रिप्टेड फ़ाइल नामों की अधिकतम लंबाई
addvaultwizard.new.expertSettings.shorteningThreshold.valid=मान्य
### Password ### Password
addvaultwizard.new.createVaultBtn=वॉल्ट बनाएं addvaultwizard.new.createVaultBtn=वॉल्ट बनाएं
addvaultwizard.new.generateRecoveryKeyChoice=आप अपने पासवर्ड के बिना अपने डेटा तक नहीं पहुंच पाएंगे। क्या आप उस वक़्त के लिए एक पुनर्प्राप्ति कुंजी चाहते हैं जब आप अपना पासवर्ड खो देते हैं? addvaultwizard.new.generateRecoveryKeyChoice=आप अपने पासवर्ड के बिना अपने डेटा तक नहीं पहुंच पाएंगे। क्या आप उस वक़्त के लिए एक पुनर्प्राप्ति कुंजी चाहते हैं जब आप अपना पासवर्ड खो देते हैं?
@@ -77,6 +88,7 @@ addvault.new.readme.accessLocation.2=आप अपनी वॉल्ट यह
addvault.new.readme.accessLocation.3=इस वॉल्यूम में कोई नई फाइल डालने पर क्रिप्टोमैटोर उसे एन्क्रिप्ट करदेगा। आप इसे कोई भी सामान्य फोल्डर की तरह समझ के काम कर सकते हैं। यह सिर्फ डेक्रिप्टेड व्यू है, हार्ड डिस्क पर आपकी फाइल्स हर समय एन्क्रिप्टेड रहेंगी। addvault.new.readme.accessLocation.3=इस वॉल्यूम में कोई नई फाइल डालने पर क्रिप्टोमैटोर उसे एन्क्रिप्ट करदेगा। आप इसे कोई भी सामान्य फोल्डर की तरह समझ के काम कर सकते हैं। यह सिर्फ डेक्रिप्टेड व्यू है, हार्ड डिस्क पर आपकी फाइल्स हर समय एन्क्रिप्टेड रहेंगी।
addvault.new.readme.accessLocation.4=आप इस फाइल को बेझिझक डिलीट कर सकते हैं। addvault.new.readme.accessLocation.4=आप इस फाइल को बेझिझक डिलीट कर सकते हैं।
## Existing ## Existing
addvaultwizard.existing.title=मौजूदा तिजोरी को जोड़ें
addvaultwizard.existing.chooseBtn=चुनें… addvaultwizard.existing.chooseBtn=चुनें…
addvaultwizard.existing.filePickerTitle=तिजोरी फ़ाइल चुनें addvaultwizard.existing.filePickerTitle=तिजोरी फ़ाइल चुनें
addvaultwizard.existing.filePickerMimeDesc=क्रिप्टोमेटर वॉल्ट addvaultwizard.existing.filePickerMimeDesc=क्रिप्टोमेटर वॉल्ट
@@ -98,6 +110,7 @@ changepassword.finalConfirmation=मैं समझता/समझती ह
# Forget Password # Forget Password
forgetPassword.title=पासवर्ड भूल गए forgetPassword.title=पासवर्ड भूल गए
forgetPassword.message=पासवर्ड भूल गए? forgetPassword.message=पासवर्ड भूल गए?
forgetPassword.description=यह आपके तिजोरी का सहेजा गया पासवर्ड सिस्टम कीचेन से हटा देगा।
forgetPassword.confirmBtn=पासवर्ड भूल गए forgetPassword.confirmBtn=पासवर्ड भूल गए
# Unlock # Unlock
@@ -106,25 +119,43 @@ unlock.passwordPrompt="%s" का पासवर्ड दर्ज करे
unlock.savePassword=पासवर्ड याद रखें unlock.savePassword=पासवर्ड याद रखें
unlock.unlockBtn=अनलॉक करें unlock.unlockBtn=अनलॉक करें
## Select ## Select
unlock.chooseMasterkey.message=मास्टरकी फ़ाइल नहीं मिली
unlock.chooseMasterkey.description=क्रिप्टोमेटर "%s" की मास्टर-चाबी नहीं ढूंढ पाया। कृपया उस फाइल को हाथ से ढूंढे। unlock.chooseMasterkey.description=क्रिप्टोमेटर "%s" की मास्टर-चाबी नहीं ढूंढ पाया। कृपया उस फाइल को हाथ से ढूंढे।
unlock.chooseMasterkey.filePickerTitle=मास्टरकी फ़ाइल का चयन करें
unlock.chooseMasterkey.filePickerMimeDesc=क्रिप्टोमेटर मास्टरकी
## Success ## Success
unlock.success.message=अनलॉक सफल हुआ unlock.success.message=अनलॉक सफल हुआ
unlock.success.rememberChoice=विकल्प याद रखें, दोबारा ना दिखाएं unlock.success.rememberChoice=विकल्प याद रखें, दोबारा ना दिखाएं
unlock.success.revealBtn=फोल्डर खोलें unlock.success.revealBtn=फोल्डर खोलें
## Failure ## Failure
unlock.error.customPath.message=तिजोरी को विशिष्ट स्थान पर प्रस्थापित करने में असमर्थ
unlock.error.customPath.description.notSupported=यदि आप विशिष्ट स्थान का उपयोग जारी रखना चाहते हैं, तो कृपया प्राथमिकताओं पर जाएं और एक ग्रन्थ (वॉल्यूम) प्रकार चुनें जो इसका समर्थन करता हो। अन्यथा, तिजोरी के विकल्पों पर जाएं और एक समर्थित प्रस्थापित स्थान (माउंट पॉइंट) चुनें।
unlock.error.customPath.description.notExists=विशिष्ट प्रस्थापित स्थान (कस्टम माउंट पाथ) मौजूद नहीं है. या तो इसे अपने स्थानीय फ़ाइल प्रणाली में बनाएं या तिजोरी के विकल्पों को बदलें।
unlock.error.customPath.description.hideawayNotDir=तिजोरी खोलने के के लिए उपयोग की गई अस्थायी, छिपी हुई फ़ाइल "%3$s" को हटाया नहीं जा सका। कृपया फ़ाइल की जाँच करें और फिर इसे स्वतः हटा दें।
unlock.error.customPath.description.couldNotBeCleaned=आपका तिजोरी "%s" स्थान पर स्थापित नहीं किया जा सका। कृपया पुनः प्रयास करें या कोई अलग रास्ता चुनें।
unlock.error.title="%s" तिजोरी खोलना विफल रहा
## Hub ## Hub
hub.noKeychain.message=उपकरण के कुंजी तक पहुंचने में असमर्थ
hub.noKeychain.openBtn=प्राथमिकताएँ खोलें
### Waiting ### Waiting
hub.auth.message=प्रमाणन के लिए इंतज़ार कर रहे...
hub.auth.description=आपको स्वचालित रूप से लॉगिन पृष्ठ पर पुनः निर्देशित किया जाना चाहिए।
hub.auth.loginLink=पुनर्निर्देशित नहीं किया गया? इसे खोलने के लिए यहां क्लिक करें.
### Receive Key ### Receive Key
hub.receive.message=अभी संसाधित किया जा रहा है hub.receive.message=अभी संसाधित किया जा रहा है
### Register Device ### Register Device
hub.register.message=नया उपकरण
hub.register.nameLabel=डिवाइस का नाम hub.register.nameLabel=डिवाइस का नाम
hub.register.occupiedMsg=नाम पहले से प्रयोग में है ### Register Device Legacy
hub.register.registerBtn=पुष्टि करें
### Registration Success ### Registration Success
hub.registerSuccess.unlockBtn=अनलॉक करें
### Registration Failed ### Registration Failed
### Unauthorized ### Unauthorized
hub.unauthorized.message=प्रवेश अस्वीकृत hub.unauthorized.message=प्रवेश अस्वीकृत
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=कार्रवाई आवश्यक है
hub.requireAccountInit.description.0=आगे बढ़ने के लिए, कृपया अपने आवश्यक चरणों को पूरा करें
hub.requireAccountInit.description.2=.
### License Exceeded ### License Exceeded
# Lock # Lock
@@ -185,8 +216,12 @@ 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=हमें सपोर्ट करें
### Remove License Key Dialog
removeCert.confirmBtn=हटाएँ
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -199,9 +234,6 @@ preferences.contribute=हमें सपोर्ट करें
# Main Window # Main Window
main.closeBtn.tooltip=बंद करें
main.preferencesBtn.tooltip=प्राथमिकताएं
main.supporterCertificateMissing.tooltip=कृपया दान पर विचार करें।
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=वॉल्ट को डालने के लिए यहाँ क्लिक करें। main.vaultlist.emptyList.onboardingInstruction=वॉल्ट को डालने के लिए यहाँ क्लिक करें।
main.vaultlist.contextMenu.remove=हटाएँ... main.vaultlist.contextMenu.remove=हटाएँ...
@@ -210,6 +242,7 @@ main.vaultlist.contextMenu.unlock=अनलॉक करें...
main.vaultlist.contextMenu.unlockNow=अब अनलॉक करें main.vaultlist.contextMenu.unlockNow=अब अनलॉक करें
main.vaultlist.contextMenu.vaultoptions=वॉल्ट के विकल्प दिखाए main.vaultlist.contextMenu.vaultoptions=वॉल्ट के विकल्प दिखाए
main.vaultlist.contextMenu.reveal=फोल्डर खोलें main.vaultlist.contextMenu.reveal=फोल्डर खोलें
##Notificaition
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Cryptomator को अपनी फाइल्स सिराक्षित रखने को चुनने के लिए धन्यवाद। अगर आपको सहायता चाइये, तो हमारी गेटिंग स्टार्टेड गाइगाइड्स देखिये: main.vaultDetail.welcomeOnboarding=Cryptomator को अपनी फाइल्स सिराक्षित रखने को चुनने के लिए धन्यवाद। अगर आपको सहायता चाइये, तो हमारी गेटिंग स्टार्टेड गाइगाइड्स देखिये:
@@ -277,4 +310,9 @@ quit.title=एप्लीकेशन को बंद करें
# Forced Quit # Forced Quit
quit.forced.message=कुछ वॉल्ट्स लॉक नहीं हो पायी quit.forced.message=कुछ वॉल्ट्स लॉक नहीं हो पायी
# Update Reminder # Update Reminder
#Dokany Support End
dokanySupportEnd.preferencesBtn=प्राथमिकताएँ खोलें
# Share Vault
+12 -9
View File
@@ -115,8 +115,9 @@ unlock.success.revealBtn=Otkrij pogon
### Waiting ### Waiting
### Receive Key ### Receive Key
### Register Device ### Register Device
hub.register.registerBtn=Potvrdi ### Register Device Legacy
### Registration Success ### Registration Success
hub.registerSuccess.unlockBtn=Otključaj
### Registration Failed ### Registration Failed
### Unauthorized ### Unauthorized
### Requires Account Initialization ### Requires Account Initialization
@@ -212,7 +213,6 @@ preferences.interface.language.auto=Zadano sustavom
preferences.interface.interfaceOrientation=Orijentacija sučelja preferences.interface.interfaceOrientation=Orijentacija sučelja
preferences.interface.interfaceOrientation.ltr=S lijeva na desno preferences.interface.interfaceOrientation.ltr=S lijeva na desno
preferences.interface.interfaceOrientation.rtl=S desna na lijevo preferences.interface.interfaceOrientation.rtl=S desna na lijevo
preferences.interface.showMinimizeButton=Prikaži dugme za smanjivanje
preferences.interface.showTrayIcon=Pokaži ikonu u traci (zahtjeva ponovno pokretanje) preferences.interface.showTrayIcon=Pokaži ikonu u traci (zahtjeva ponovno pokretanje)
## Volume ## Volume
preferences.volume=Virtualni pogon preferences.volume=Virtualni pogon
@@ -223,12 +223,16 @@ 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
preferences.contribute.noCertificate=Podržite Cryptomator i primite certifikat podržavatelja. On je kao licenčni ključ, ali za fenomenalne ljude koji koriste slobodni softver. ;-) preferences.contribute.noCertificate=Podržite Cryptomator i primite certifikat podržavatelja. On je kao licenčni ključ, ali za fenomenalne ljude koji koriste slobodni softver. ;-)
preferences.contribute.getCertificate=Još ga nemate? Naučite kako ga dobiti. preferences.contribute.getCertificate=Još ga nemate? Naučite kako ga dobiti.
preferences.contribute.promptText=Zalijepi certifikat podržavatelja ovdje preferences.contribute.promptText=Zalijepi certifikat podržavatelja ovdje
### Remove License Key Dialog
removeCert.confirmBtn=Ukloni
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -262,11 +266,6 @@ stats.write.accessCount=Ukupno pisanja: %d
# Main Window # Main Window
main.closeBtn.tooltip=Zatvori
main.minimizeBtn.tooltip=Smanji
main.preferencesBtn.tooltip=Postavke
main.debugModeEnabled.tooltip=Način otklanjanja pogrešaka je omogućen
main.supporterCertificateMissing.tooltip=Molimo razmislite o doniranju
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Pritisnite ovdje da biste dodali trezor main.vaultlist.emptyList.onboardingInstruction=Pritisnite ovdje da biste dodali trezor
main.vaultlist.contextMenu.remove=Ukloni… main.vaultlist.contextMenu.remove=Ukloni…
@@ -275,7 +274,7 @@ main.vaultlist.contextMenu.unlock=Otključaj…
main.vaultlist.contextMenu.unlockNow=Otključaj sada main.vaultlist.contextMenu.unlockNow=Otključaj sada
main.vaultlist.contextMenu.vaultoptions=Prikaži opcije trezora main.vaultlist.contextMenu.vaultoptions=Prikaži opcije trezora
main.vaultlist.contextMenu.reveal=Otkrij pogon main.vaultlist.contextMenu.reveal=Otkrij pogon
main.vaultlist.addVaultBtn=Dodaj ##Notificaition
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Hvala što ste odabrali Cryptomator za zaštitu Vaših datoteka. Ukoliko trebate pomoć, provjerite naše vodiče za početak rada: main.vaultDetail.welcomeOnboarding=Hvala što ste odabrali Cryptomator za zaštitu Vaših datoteka. Ukoliko trebate pomoć, provjerite naše vodiče za početak rada:
@@ -379,4 +378,8 @@ quit.lockAndQuitBtn=Zaključaj i napusti
# Forced Quit # Forced Quit
# Update Reminder # Update Reminder
#Dokany Support End
# Share Vault
+77 -17
View File
@@ -47,6 +47,7 @@ addvaultwizard.new.nameInstruction=Válasszon egy nevet az új széf számára
addvaultwizard.new.namePrompt=A széf neve addvaultwizard.new.namePrompt=A széf neve
### Location ### Location
addvaultwizard.new.locationInstruction=Hova mentse a Cryptomator a széf titkosított fájljait? addvaultwizard.new.locationInstruction=Hova mentse a Cryptomator a széf titkosított fájljait?
addvaultwizard.new.locationLoading=Helyi fájlrendszer ellenőrzése alapértelmezett felhő tárolási könyvtárakra…
addvaultwizard.new.locationLabel=Tárolási hely addvaultwizard.new.locationLabel=Tárolási hely
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Egyedi hely addvaultwizard.new.directoryPickerLabel=Egyedi hely
@@ -141,6 +142,9 @@ unlock.error.customPath.description.hideawayNotDir=A feloldáshoz használt, "%3
unlock.error.customPath.description.couldNotBeCleaned=A széfet nem lehetett a "%s" elérési útvonalra csatlakoztatni. Kérjük, próbálja meg újra, vagy válasszon másik elérési útvonalat. unlock.error.customPath.description.couldNotBeCleaned=A széfet nem lehetett a "%s" elérési útvonalra csatlakoztatni. Kérjük, próbálja meg újra, vagy válasszon másik elérési útvonalat.
unlock.error.customPath.description.notEmptyDir=A megadott "%s" elérési útvonal nem egy üres mappa. Kérjük, válasszon egy üres mappát, és próbálja meg újra. unlock.error.customPath.description.notEmptyDir=A megadott "%s" elérési útvonal nem egy üres mappa. Kérjük, válasszon egy üres mappát, és próbálja meg újra.
unlock.error.customPath.description.generic=Egyéni csatolási útvonalat választott ehhez a széfhez, de használatakor ez a hibaüzenet érkezett: %2$s unlock.error.customPath.description.generic=Egyéni csatolási útvonalat választott ehhez a széfhez, de használatakor ez a hibaüzenet érkezett: %2$s
unlock.error.restartRequired.message=Nem lehet feloldani a széfet
unlock.error.restartRequired.description=Módosítsa a kötet típusát a széf beállításaiban, vagy indítsa újra a Cryptomator-t.
unlock.error.title=A(z) „%s” feloldása sikertelen
## Hub ## Hub
hub.noKeychain.message=Nem lehet az eszközkulcshoz hozzáférni hub.noKeychain.message=Nem lehet az eszközkulcshoz hozzáférni
hub.noKeychain.description=Hogy feloldja a Hub széfeket, egy eszközkulcs szükséges, mely egy kulcslánccal van biztosítva. A folytatáshoz engedélyezze a következőt: “%s” és válasszon egy kulcsláncot a beállításokban. hub.noKeychain.description=Hogy feloldja a Hub széfeket, egy eszközkulcs szükséges, mely egy kulcslánccal van biztosítva. A folytatáshoz engedélyezze a következőt: “%s” és válasszon egy kulcsláncot a beállításokban.
@@ -154,22 +158,29 @@ hub.receive.message=Válasz feldolgozása…
hub.receive.description=Cryptomator fogadja és feldolgozza a Hub válaszát. Kérem, várjon. hub.receive.description=Cryptomator fogadja és feldolgozza a Hub válaszát. Kérem, várjon.
### Register Device ### Register Device
hub.register.message=Új eszköz hub.register.message=Új eszköz
hub.register.description=Ez az első Hub-hozzáférés erről az eszközről. Kérjük, engedélyezd a Fiókkulcsoddal. hub.register.description=Ez az első Hub hozzáférés erről az eszközről. Kérem, regisztrálja az Account Key használatával.
hub.register.nameLabel=Készülék neve hub.register.nameLabel=Készülék neve
hub.register.invalidAccountKeyLabel=Érvénytelen fiókkulcs hub.register.invalidAccountKeyLabel=Érvénytelen fiókkulcs
hub.register.occupiedMsg=Ez a név már használatban van hub.register.registerBtn=Regisztráció
hub.register.registerBtn=Megerősítés ### Register Device Legacy
hub.register.legacy.occupiedMsg=Név már használatban van
hub.register.legacy.description=Ez az első Hub hozzáférés erről az eszközről. Kérem, regisztrálja.
### Registration Success ### Registration Success
hub.registerSuccess.message=Eszköz elnevezve hub.registerSuccess.message=Az eszköz regisztrálva
hub.registerSuccess.description=A széf hozzáféréséhez a széf tulajdonosának hitelesítenie kell az eszközét. hub.registerSuccess.description=Az eszköze sikeresen regisztrálva. Most már folytathatja a széf feloldását.
hub.registerSuccess.unlockBtn=Feloldás
hub.registerSuccess.legacy.description=A széfhez való hozzáféréshez az eszközének a széf tulajdonosától további engedélyt kell kapnia.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Az eszköz elnevezése sikertelen volt hub.registerFailed.message=Az eszköz regisztrációja sikertelen
hub.registerFailed.description=Hiba állt fel az elnevezési folyamatban. További részletekért tekintse meg az alkalmazásnaplót. hub.registerFailed.description.generic=Hiba történt a regisztrációs folyamat során. További részletekért nézze meg az alkalmazás naplót.
hub.registerFailed.description.deviceAlreadyExists=Ez az eszköz már egy másik felhasználóhoz van regisztrálva. Próbáljon meg felhasználói fiókot váltani, vagy használjon egy másik eszközt.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Hozzáférés megtagadva hub.unauthorized.message=Hozzáférés megtagadva
hub.unauthorized.description=Eszköze még nem kapott engedélyt ehhez a széfhez. Kérje a széf tulajdonosát, hogy engedélyezze a hozzáférést. hub.unauthorized.description=Eszköze még nem kapott engedélyt ehhez a széfhez. Kérje a széf tulajdonosát, hogy engedélyezze a hozzáférést.
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Beavatkozás szükséges hub.requireAccountInit.message=Beavatkozás szükséges
hub.requireAccountInit.description.0=A folytatáshoz kérlek töltsd ki a szükséges lépéseket a te
hub.requireAccountInit.description.1=Hub felhasználói profilodban
hub.requireAccountInit.description.2=. hub.requireAccountInit.description.2=.
### License Exceeded ### License Exceeded
hub.invalidLicense.message=Érvénytelen Hub licenc hub.invalidLicense.message=Érvénytelen Hub licenc
@@ -276,6 +287,7 @@ preferences.general.debugLogging=Hibakeresési naplózás engedélyezése
preferences.general.debugDirectory=Naplófájlok megjelenítése preferences.general.debugDirectory=Naplófájlok megjelenítése
preferences.general.autoStart=Cryptomator indítása a rendszerrel együtt preferences.general.autoStart=Cryptomator indítása a rendszerrel együtt
preferences.general.keychainBackend=Itt tárolja a jelszavakat preferences.general.keychainBackend=Itt tárolja a jelszavakat
preferences.general.quickAccessService=Adja a feloldott széfeket a gyors elérési területhez
## Interface ## Interface
preferences.interface=Kezelőfelület preferences.interface=Kezelőfelület
preferences.interface.theme=Megjelenés preferences.interface.theme=Megjelenés
@@ -288,13 +300,15 @@ preferences.interface.language.auto=Rendszer alapértelmezett
preferences.interface.interfaceOrientation=Felhasználói felület tájolása preferences.interface.interfaceOrientation=Felhasználói felület tájolása
preferences.interface.interfaceOrientation.ltr=Balról jobbra preferences.interface.interfaceOrientation.ltr=Balról jobbra
preferences.interface.interfaceOrientation.rtl=Jobbról balra preferences.interface.interfaceOrientation.rtl=Jobbról balra
preferences.interface.showMinimizeButton=Kicsinyítés ikon megjelenítése
preferences.interface.showTrayIcon=Tálca ikon megjelenítése (újraindítás szükséges) preferences.interface.showTrayIcon=Tálca ikon megjelenítése (újraindítás szükséges)
preferences.interface.compactMode=Kompakt széflista engedélyezése
## Volume ## Volume
preferences.volume=Virtuális meghajtó preferences.volume=Virtuális meghajtó
preferences.volume.type=Alapértelmezett kötet típus
preferences.volume.type.automatic=Automatikus preferences.volume.type.automatic=Automatikus
preferences.volume.docsTooltip=További információért a kötet típusokról kattintson ide, hogy megnyissa a dokumentációt. preferences.volume.docsTooltip=További információért a kötet típusokról kattintson ide, hogy megnyissa a dokumentációt.
preferences.volume.fuseRestartRequired=A változtatások alkalmazásához újra kell indítania a Cryptomatort. preferences.volume.fuseRestartRequired=A változtatások alkalmazásához újra kell indítania a Cryptomatort.
preferences.volume.tcp.port=Alapértelmezett TCP port
preferences.volume.supportedFeatures=A kiválaszott kötet típus az alábbi funkciókat támogatja: preferences.volume.supportedFeatures=A kiválaszott kötet típus az alábbi funkciókat támogatja:
preferences.volume.feature.mountAuto=Automatikus csatlakozási pont választás preferences.volume.feature.mountAuto=Automatikus csatlakozási pont választás
preferences.volume.feature.mountToDir=Egyéni mappa csatlakozási pontként preferences.volume.feature.mountToDir=Egyéni mappa csatlakozási pontként
@@ -307,12 +321,29 @@ 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ő.
preferences.updates.lastUpdateCheck=Utolsó ellenőrzés: %s
preferences.updates.lastUpdateCheck.never=soha
preferences.updates.lastUpdateCheck.recently=mostanában
preferences.updates.lastUpdateCheck.daysAgo=%s nappal ezelőtt
preferences.updates.lastUpdateCheck.hoursAgo=%s órával ezelőtt
preferences.updates.checkFailed=A frissítések keresése sikertelen. Kérem, ellenőrizze az internetkapcsolatát, vagy próbálja meg később újra.
preferences.updates.upToDate=A Cryptomator naprakész.
## 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
preferences.contribute.noCertificate=Ha támogatja a "Cryptomator"-t, kaphat egy "támogatói igazolást". Az olyasmi mint egy licenckulcs klassz embereknek, akik ingyenes szoftvert használnak. ;-) preferences.contribute.noCertificate=Ha támogatja a "Cryptomator"-t, kaphat egy "támogatói igazolást". Az olyasmi mint egy licenckulcs klassz embereknek, akik ingyenes szoftvert használnak. ;-)
preferences.contribute.getCertificate=Még nincs? Ismerje meg, hogyan szerezheti meg. preferences.contribute.getCertificate=Még nincs? Ismerje meg, hogyan szerezheti meg.
preferences.contribute.promptText=Ide illessze be támogatói igazolása kódját preferences.contribute.promptText=Ide illessze be támogatói igazolása kódját
preferences.contribute.thankYou=Köszönjük, hogy támogatja a Cryptomator nyílt forráskódú fejlesztését!
preferences.contribute.donate=Támogatás
preferences.contribute.sponsor=Szponzor
### Remove License Key Dialog
removeCert.title=Tanúsítvány eltávolítása
removeCert.message=Eltávolítja a támogatói tanúsítványt?
removeCert.description=A Cryptomator alapvető funkcióit ez nem érinti. Sem a széfekhez való hozzáférés nem korlátozott, sem a biztonsági szint nem csökken.
removeCert.confirmBtn=Eltávolítás
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
@@ -354,11 +385,6 @@ stats.access.total=Összes hozzáférés: %d
# Main Window # Main Window
main.closeBtn.tooltip=Bezárás
main.minimizeBtn.tooltip=Minimalizálás
main.preferencesBtn.tooltip=Beállítások
main.debugModeEnabled.tooltip=A hibakeresési mód aktiválva van
main.supporterCertificateMissing.tooltip=Kérjük, fontolja meg az adományozást
## Vault List ## Vault List
main.vaultlist.emptyList.onboardingInstruction=Kattintson ide egy széf hozzáadásához main.vaultlist.emptyList.onboardingInstruction=Kattintson ide egy széf hozzáadásához
main.vaultlist.contextMenu.remove=Eltávolítás… main.vaultlist.contextMenu.remove=Eltávolítás…
@@ -367,9 +393,11 @@ main.vaultlist.contextMenu.unlock=Feloldás…
main.vaultlist.contextMenu.unlockNow=Azonnali feloldás main.vaultlist.contextMenu.unlockNow=Azonnali feloldás
main.vaultlist.contextMenu.vaultoptions=Széf beállítások main.vaultlist.contextMenu.vaultoptions=Széf beállítások
main.vaultlist.contextMenu.reveal=Széf megjelenítése main.vaultlist.contextMenu.reveal=Széf megjelenítése
main.vaultlist.addVaultBtn=Hozzáadás main.vaultlist.addVaultBtn.menuItemNew=Új széf létrehozása...
main.vaultlist.addVaultBtn.menuItemNew=Új széf... main.vaultlist.addVaultBtn.menuItemExisting=Meglévő széf megnyitása...
main.vaultlist.addVaultBtn.menuItemExisting=Meglévő széf... ##Notificaition
main.notification.updateAvailable=Frissítés elérhető.
main.notification.support=Cryptomator támogatása.
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Köszönjük, hogy a Cryptomator programot választotta a fájlai védelmére. Ha segítségre van szüksége, akkor olvassa el a kezdő útmutatónk lépéseit: main.vaultDetail.welcomeOnboarding=Köszönjük, hogy a Cryptomator programot választotta a fájlai védelmére. Ha segítségre van szüksége, akkor olvassa el a kezdő útmutatónk lépéseit:
@@ -379,6 +407,7 @@ main.vaultDetail.unlockBtn=Feloldás…
main.vaultDetail.unlockNowBtn=Azonnali feloldás main.vaultDetail.unlockNowBtn=Azonnali feloldás
main.vaultDetail.optionsBtn=Széf beállítások main.vaultDetail.optionsBtn=Széf beállítások
main.vaultDetail.passwordSavedInKeychain=Jelszó mentve main.vaultDetail.passwordSavedInKeychain=Jelszó mentve
main.vaultDetail.share=Megosztás…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=FELOLDVA main.vaultDetail.unlockedStatus=FELOLDVA
main.vaultDetail.accessLocation=A széf tartalma itt érhető el: main.vaultDetail.accessLocation=A széf tartalma itt érhető el:
@@ -433,6 +462,7 @@ vaultOptions.general.startHealthCheckBtn=Épség-ellenőrzés indítása
## Mount ## Mount
vaultOptions.mount=Felcsatolás vaultOptions.mount=Felcsatolás
vaultOptions.mount.info=Nyissa meg a virtuális meghajtó beállításait az alapértelmezett beállítások módosításához.
vaultOptions.mount.readonly=Csak-olvasható vaultOptions.mount.readonly=Csak-olvasható
vaultOptions.mount.customMountFlags=Egyedi csatolási paraméterek vaultOptions.mount.customMountFlags=Egyedi csatolási paraméterek
vaultOptions.mount.winDriveLetterOccupied=foglalt vaultOptions.mount.winDriveLetterOccupied=foglalt
@@ -442,6 +472,10 @@ vaultOptions.mount.mountPoint.driveLetter=Használja a kiválasztott meghajtó b
vaultOptions.mount.mountPoint.custom=Egyéni könyvtár használata vaultOptions.mount.mountPoint.custom=Egyéni könyvtár használata
vaultOptions.mount.mountPoint.directoryPickerButton=Kiválaszt… vaultOptions.mount.mountPoint.directoryPickerButton=Kiválaszt…
vaultOptions.mount.mountPoint.directoryPickerTitle=Válasszon könyvtárat vaultOptions.mount.mountPoint.directoryPickerTitle=Válasszon könyvtárat
vaultOptions.mount.volumeType.default=Alapértelmezett (%s)
vaultOptions.mount.volumeType.restartRequired=Ahhoz, hogy ezt a kötet típust használhassa, újra kell indítania a Cryptomator-t.
vaultOptions.mount.volume.tcp.port=TCP port
vaultOptions.mount.volume.type=Kötet típus
## Master Key ## Master Key
vaultOptions.masterkey=Jelszó vaultOptions.masterkey=Jelszó
vaultOptions.masterkey.changePasswordBtn=Jelszó megváltoztatása vaultOptions.masterkey.changePasswordBtn=Jelszó megváltoztatása
@@ -511,4 +545,30 @@ updateReminder.message=Frissítések ellenőrzése?
updateReminder.description=Maradjon naprakész az új funkciókkal, hibajavításokkal és biztonsági fejlesztésekkel. Javasoljuk, hogy automatikusan ellenőrizze a frissítéseket. updateReminder.description=Maradjon naprakész az új funkciókkal, hibajavításokkal és biztonsági fejlesztésekkel. Javasoljuk, hogy automatikusan ellenőrizze a frissítéseket.
updateReminder.notNow=Most nem 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
shareVault.title=Széf megosztása
shareVault.message=Szeretné megosztani a széfét másokkal?
shareVault.description=Mindig legyen óvatos, amikor másokkal osztja meg a széfét. Röviden, kövesse az alábbi lépéseket:
shareVault.instruction.1=Ossza meg a titkosított széf mappájának hozzáférését felhőalapú tárolón keresztül.
shareVault.instruction.2=2. Ossza meg a széf jelszavát biztonságos módon.
shareVault.remarkBestPractices=További információkért tekintse meg a legjobb gyakorlatokra vonatkozó javaslatokat a dokumentációnkban.
shareVault.docsTooltip=Nyissa meg a dokumentációt, hogy többet megtudjon a széfek megosztásáról.
shareVault.hubAd.description=A biztonságos mód csapatokban való munkavégzéshez
shareVault.hubAd.keyManagement=• Nullaismeretű (Zero-knowledge) kulcskezelés
shareVault.hubAd.authentication=• Erős hitelesítés
shareVault.hubAd.encryption=• Végponttól végpontig terjedő titkosítás
shareVault.visitHub=Látogassa meg a Cryptomator Hubot
shareVault.hub.message=Hogyan osszon meg egy Hub széfet
shareVault.hub.description=Ahhoz, hogy megossza a széf tartalmát egy másik csapattaggal, két lépést kell végrehajtania:
shareVault.hub.instruction.1=Ossza meg a titkosított széf mappájának hozzáférését felhőalapú tárolón keresztül.
shareVault.hub.instruction.2=2. Adjon hozzáférést a csapattagnak a Cryptomator Hubban.
shareVault.hub.openHub=Nyissa meg a Cryptomator Hubot

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