Compare commits

...

31 Commits
1.6.0 ... 1.6.3

Author SHA1 Message Date
Sebastian Stenzel
f7f1afbf7d Merge branch 'release/1.6.3' 2021-11-03 09:01:11 +01:00
Sebastian Stenzel
14395516c5 preparing 1.6.3 2021-11-03 08:59:12 +01:00
Cryptobot
9ef9499506 New Crowdin updates (#1886)
* New translations strings.properties
[ci skip]
2021-11-03 08:58:04 +01:00
Sebastian Stenzel
1ca803691b Revert "increase robustness of vault creation:"
This reverts commit f7fdb87d6d.
2021-11-03 08:57:35 +01:00
Cryptobot
27aea6cce9 New Crowdin updates (#1844)
New translations strings.properties

Arabic; Bosnian; Catalan; Chinese Simplified; Chinese Traditional; Czech; Dutch; Filipino; French; German; Greek; Hungarian; Indonesian; Italian; Japanese; Korean; Latvian; Macedonian; Norwegian Bokmal; Norwegian Nynorsk; Polish; Portuguese; Portuguese, Brazilian; Punjabi; Romanian; Russian; Serbian (Cyrillic); Serbian (Latin); Slovak; Spanish; Swedish; Turkish; Ukrainian; 

[ci skip]
2021-11-02 15:37:46 +01:00
Armin Schrenk
e2ff3f10c1 reset dev branch to SNAPSHOT version 2021-11-02 15:36:09 +01:00
Armin Schrenk
811b538668 Merge tag '1.6.2' into develop
1.6.2
2021-11-02 12:21:57 +01:00
Armin Schrenk
8151cc9714 Merge branch 'release/1.6.2' 2021-11-02 12:21:56 +01:00
Armin Schrenk
fdbaa5b892 prepare 1.6.2 2021-11-02 12:11:48 +01:00
Armin Schrenk
f7fdb87d6d increase robustness of vault creation:
* clean up after failed vault creation
* ignore if storage readme cannot be created
2021-11-02 11:50:14 +01:00
what-next-github
9408117028 Including pluginDir to linux/appimage/build.sh (#1850) 2021-11-02 10:40:41 +01:00
Armin Schrenk
c6c2133b34 closes #1863 2021-10-29 17:08:03 +02:00
Sebastian Stenzel
7a3205b19c updated choose file dialog screenshots for Windows #1863 2021-10-29 17:02:24 +02:00
Sebastian Stenzel
8fadd34498 prepared (currently unused) dark mode screenshots for #1863 2021-10-29 16:49:51 +02:00
Sebastian Stenzel
1ffcc8eacb desaturate irrelevant parts of image 2021-10-29 16:03:10 +02:00
Sebastian Stenzel
dfd4b86b06 Updated "choose file dialog" image
references #1863
2021-10-29 14:22:02 +02:00
Sebastian Stenzel
02a59dd538 support loading @2x images 2021-10-29 14:21:04 +02:00
Sebastian Stenzel
a79e385594 fixes #1866 2021-10-28 08:23:45 +02:00
Tobias Hagemann
a4070f551b fixes #1404 2021-10-27 11:56:49 +02:00
Sebastian Stenzel
5c98fe4145 fixed accessibility issue 2021-10-25 19:50:39 +02:00
Sebastian Stenzel
9b79e9e69e fixed second part of error code (#1741) 2021-10-25 19:34:45 +02:00
Bart
520b3a8f08 Remove IPC socket before creation (#1852)
(to make sure that socket path can be created)
2021-10-25 09:47:02 +02:00
Armin Schrenk
28d2262962 on windows allow installations only on windows 10 1803 or newer due to unix socket support 2021-10-22 19:21:10 +02:00
Julian Raufelder
c87b559313 Merge branch 'main' into develop 2021-10-20 13:47:39 +02:00
Julian Raufelder
cea8b7556e Merge branch 'release/1.6.1' 2021-10-20 13:40:49 +02:00
Julian Raufelder
5dde332b8b Preparing 1.6.1 2021-10-20 13:39:20 +02:00
Sebastian Stenzel
0980e4776b fixes #1843 2021-10-20 12:46:37 +02:00
Tobias Hagemann
fd7a6f42f1 added x64 suffix to msi installer name 2021-10-19 22:05:59 +02:00
Armin Schrenk
8bfbfc7700 Update installer workflow to add options introduced in JDK 17 2021-10-19 19:12:53 +02:00
Armin Schrenk
ec72762548 fix windows installer 2021-10-19 18:45:25 +02:00
Sebastian Stenzel
6abe39679e Merge branch 'master' into develop
[ci skip]
2021-10-19 15:58:51 +02:00
59 changed files with 610 additions and 234 deletions

View File

@@ -145,6 +145,7 @@ jobs:
jpackageoptions: >
--app-version "${{ needs.metadata.outputs.semVerNum }}"
--java-options "-Dfile.encoding=\"utf-8\""
--java-options "-Dapple.awt.enableTemplateImages=true"
--java-options "-Dcryptomator.logDir=\"~/Library/Logs/Cryptomator\""
--java-options "-Dcryptomator.pluginDir=\"~/Library/Application Support/Cryptomator/Plugins\""
--java-options "-Dcryptomator.settingsPath=\"~/Library/Application Support/Cryptomator/settings.json\""
@@ -534,6 +535,9 @@ jobs:
--app-version "${{ needs.metadata.outputs.semVerNum }}"
--win-menu
--win-dir-chooser
--win-shortcut-prompt
--win-update-url "https:\\cryptomator.org"
--win-menu-group Cryptomator
--resource-dir dist/win/resources
--license-file dist/win/resources/license.rtf
--file-associations dist/win/resources/FAvaultFile.properties
@@ -549,7 +553,7 @@ jobs:
timestampUrl: 'http://timestamp.digicert.com'
folder: installer
- name: Add possible alpha/beta tags to installer name
run: mv installer/Cryptomator-*.msi installer/Cryptomator-${{ needs.metadata.outputs.semVerStr }}.msi
run: mv installer/Cryptomator-*.msi installer/Cryptomator-${{ needs.metadata.outputs.semVerStr }}-x64.msi
- name: Upload win-msi
uses: actions/upload-artifact@v2
with:

View File

@@ -5,7 +5,7 @@
</envs>
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
<module name="cryptomator" />
<option name="VM_PARAMETERS" value="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/Library/Application Support/Cryptomator/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/Library/Application Support/Cryptomator/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/Library/Logs/Cryptomator&quot; -Dcryptomator.pluginDir=&quot;~/Library/Application Support/Cryptomator/Plugins&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m -ea" />
<option name="VM_PARAMETERS" value="-Duser.language=en -Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath=&quot;~/Library/Application Support/Cryptomator/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/Library/Application Support/Cryptomator/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/Library/Logs/Cryptomator&quot; -Dcryptomator.pluginDir=&quot;~/Library/Application Support/Cryptomator/Plugins&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m -ea" />
<method v="2">
<option name="Make" enabled="true" />
</method>

View File

@@ -5,7 +5,7 @@
</envs>
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
<module name="cryptomator" />
<option name="VM_PARAMETERS" value="-Duser.language=en -Dcryptomator.settingsPath=&quot;~/Library/Application Support/Cryptomator-Dev/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/Library/Application Support/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/Library/Logs/Cryptomator-Dev&quot; -Dcryptomator.pluginDir=&quot;~/Library/Application Support/Cryptomator-Dev/Plugins&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m -ea" />
<option name="VM_PARAMETERS" value="-Duser.language=en -Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath=&quot;~/Library/Application Support/Cryptomator-Dev/settings.json&quot; -Dcryptomator.ipcSocketPath=&quot;~/Library/Application Support/Cryptomator-Dev/ipc.socket&quot; -Dcryptomator.logDir=&quot;~/Library/Logs/Cryptomator-Dev&quot; -Dcryptomator.pluginDir=&quot;~/Library/Application Support/Cryptomator-Dev/Plugins&quot; -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m -ea" />
<method v="2">
<option name="Make" enabled="true" />
</method>

View File

@@ -41,6 +41,7 @@ ${JAVA_HOME}/bin/jpackage \
--app-version "${VERSION}.${REVISION_NO}" \
--java-options "-Dfile.encoding=\"utf-8\"" \
--java-options "-Dcryptomator.logDir=\"~/.local/share/Cryptomator/logs\"" \
--java-options "-Dcryptomator.pluginDir=\"~/.local/share/Cryptomator/plugins\"" \
--java-options "-Dcryptomator.settingsPath=\"~/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json\"" \
--java-options "-Dcryptomator.ipcSocketPath=\"~/.config/Cryptomator/ipc.socket\"" \
--java-options "-Dcryptomator.mountPointsDir=\"~/.local/share/Cryptomator/mnt\"" \

View File

@@ -1,15 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Cryptomator's Jpackage Wix installer file
Remark: Expressions like $(var.name) are preprocessor variables, see also https://wixtoolset.org/documentation/manual/v3/overview/preprocessor.html
-->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<?ifdef JpIsSystemWide ?>
<?define JpInstallScope="perMachine"?>
<?define JpInstallScope="perMachine"?>
<?else?>
<?define JpInstallScope="perUser"?>
<?define JpInstallScope="perUser"?>
<?endif?>
<?define JpProductLanguage=1033 ?>
@@ -17,27 +13,49 @@
<?define JpCompressedMsi=yes ?>
<?ifdef JpAllowUpgrades ?>
<?define JpUpgradeVersionOnlyDetectUpgrade="no"?>
<?define JpUpgradeVersionOnlyDetectUpgrade="no"?>
<?else?>
<?define JpUpgradeVersionOnlyDetectUpgrade="yes"?>
<?define JpUpgradeVersionOnlyDetectUpgrade="yes"?>
<?endif?>
<?ifdef JpAllowDowngrades ?>
<?define JpUpgradeVersionOnlyDetectDowngrade="no"?>
<?define JpUpgradeVersionOnlyDetectDowngrade="no"?>
<?else?>
<?define JpUpgradeVersionOnlyDetectDowngrade="yes"?>
<?define JpUpgradeVersionOnlyDetectDowngrade="yes"?>
<?endif?>
<?include $(var.JpConfigDir)/overrides.wxi ?>
<Product Id="$(var.JpProductCode)" Name="$(var.JpAppName)" Language="$(var.JpProductLanguage)" Version="$(var.JpAppVersion)" Manufacturer="$(var.JpAppVendor)" UpgradeCode="$(var.JpProductUpgradeCode)">
<Product
Id="$(var.JpProductCode)"
Name="$(var.JpAppName)"
Language="$(var.JpProductLanguage)"
Version="$(var.JpAppVersion)"
Manufacturer="$(var.JpAppVendor)"
UpgradeCode="$(var.JpProductUpgradeCode)">
<Package Description="$(var.JpAppDescription)" Manufacturer="$(var.JpAppVendor)" InstallerVersion="$(var.JpInstallerVersion)" Compressed="$(var.JpCompressedMsi)" InstallScope="$(var.JpInstallScope)" Platform="x64" />
<Package
Description="$(var.JpAppDescription)"
Manufacturer="$(var.JpAppVendor)"
InstallerVersion="$(var.JpInstallerVersion)"
Compressed="$(var.JpCompressedMsi)"
InstallScope="$(var.JpInstallScope)" Platform="x64"
/>
<Media Id="1" Cabinet="Data.cab" EmbedCab="yes" />
<Upgrade Id="$(var.JpProductUpgradeCode)">
<UpgradeVersion OnlyDetect="$(var.JpUpgradeVersionOnlyDetectUpgrade)" Property="JP_UPGRADABLE_FOUND" Maximum="$(var.JpAppVersion)" MigrateFeatures="yes" IncludeMaximum="$(var.JpUpgradeVersionOnlyDetectUpgrade)" />
<UpgradeVersion OnlyDetect="$(var.JpUpgradeVersionOnlyDetectDowngrade)" Property="JP_DOWNGRADABLE_FOUND" Minimum="$(var.JpAppVersion)" MigrateFeatures="yes" IncludeMinimum="$(var.JpUpgradeVersionOnlyDetectDowngrade)" />
<UpgradeVersion
OnlyDetect="$(var.JpUpgradeVersionOnlyDetectUpgrade)"
Property="JP_UPGRADABLE_FOUND"
Maximum="$(var.JpAppVersion)"
MigrateFeatures="yes"
IncludeMaximum="$(var.JpUpgradeVersionOnlyDetectUpgrade)" />
<UpgradeVersion
OnlyDetect="$(var.JpUpgradeVersionOnlyDetectDowngrade)"
Property="JP_DOWNGRADABLE_FOUND"
Minimum="$(var.JpAppVersion)"
MigrateFeatures="yes"
IncludeMinimum="$(var.JpUpgradeVersionOnlyDetectDowngrade)" />
</Upgrade>
<?ifndef JpAllowUpgrades ?>
@@ -47,6 +65,7 @@
<CustomAction Id="JpDisallowDowngrade" Error="!(loc.DowngradeErrorMessage)" />
<?endif?>
<!-- Looking for legacy Cryptomator versions-->
<Property Id="OLDEXEINSTALLER">
<RegistrySearch Id="InnoSetupInstallation" Root="HKLM" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\Cryptomator_is1" Type="raw" Name="DisplayName" />
@@ -56,9 +75,13 @@
<Condition Message="A lower version of [ProductName] is already installed. Uninstall it first and then start the setup again. Setup will now exit.">
<![CDATA[Installed OR NOT OLDEXEINSTALLER]]>
</Condition>
<!-- Standard required root -->
<Directory Id="TARGETDIR" Name="SourceDir"/>
<!-- Cryptomator uses UNIX Sockets, which are supported starting with Windows 10 v1803-->
<Property Id="WINDOWSBUILDNUMBER" Secure="yes">
<RegistrySearch Id="BuildNumberSearch" Root="HKLM" Key="SOFTWARE\Microsoft\Windows NT\CurrentVersion" Name="CurrentBuildNumber" Type="raw" />
</Property>
<Condition Message="This application requires Windows 10 version 1803 (build 17134) or newer.">
<![CDATA[Installed OR (WINDOWSBUILDNUMBER >= 17134)]]>
</Condition>
<!-- Non-Opening ProgID -->
<DirectoryRef Id="INSTALLDIR">
@@ -73,6 +96,9 @@
</Component>
</DirectoryRef>
<!-- Standard required root -->
<Directory Id="TARGETDIR" Name="SourceDir"/>
<Feature Id="DefaultFeature" Title="!(loc.MainFeatureTitle)" Level="1">
<ComponentGroupRef Id="Shortcuts"/>
<ComponentGroupRef Id="Files"/>
@@ -81,68 +107,45 @@
<ComponentRef Id="nonStartingProgID" />
</Feature>
<?ifdef JpInstallDirChooser ?>
<Binary Id="JpCaDll" SourceFile="wixhelper.dll"/>
<CustomAction Id="JpCheckInstallDir" BinaryKey="JpCaDll" DllEntry="CheckInstallDir" />
<CustomAction Id="JpSetARPINSTALLLOCATION" Property="ARPINSTALLLOCATION" Value="[INSTALLDIR]" />
<CustomAction Id="JpSetARPCOMMENTS" Property="ARPCOMMENTS" Value="$(var.JpAppDescription)" />
<CustomAction Id="JpSetARPCONTACT" Property="ARPCONTACT" Value="$(var.JpAppVendor)" />
<CustomAction Id="JpSetARPSIZE" Property="ARPSIZE" Value="$(var.JpAppSizeKb)" />
<?ifdef JpHelpURL ?>
<CustomAction Id="JpSetARPHELPLINK" Property="ARPHELPLINK" Value="$(var.JpHelpURL)" />
<?endif?>
<CustomAction Id="JpSetARPINSTALLLOCATION" Property="ARPINSTALLLOCATION" Value="[INSTALLDIR]" />
<?ifdef JpAboutURL ?>
<CustomAction Id="JpSetARPURLINFOABOUT" Property="ARPURLINFOABOUT" Value="$(var.JpAboutURL)" />
<?endif?>
<?ifdef JpUpdateURL ?>
<CustomAction Id="JpSetARPURLUPDATEINFO" Property="ARPURLUPDATEINFO" Value="$(var.JpUpdateURL)" />
<?endif?>
<?ifdef JpIcon ?>
<Property Id="ARPPRODUCTICON" Value="JpARPPRODUCTICON"/>
<Icon Id="JpARPPRODUCTICON" SourceFile="$(var.JpIcon)"/>
<?endif?>
<UI>
<?ifdef JpInstallDirChooser ?>
<Dialog Id="JpInvalidInstallDir" Width="300" Height="85" Title="[ProductName] Setup" NoMinimize="yes">
<Control Id="JpInvalidInstallDirYes" Type="PushButton" X="100" Y="55" Width="50" Height="15" Default="no" Cancel="no" Text="Yes">
<Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
</Control>
<Control Id="JpInvalidInstallDirNo" Type="PushButton" X="150" Y="55" Width="50" Height="15" Default="yes" Cancel="yes" Text="No">
<Publish Event="NewDialog" Value="InstallDirDlg">1</Publish>
</Control>
<Control Id="Text" Type="Text" X="25" Y="15" Width="250" Height="30" TabSkip="no">
<Text>!(loc.message.install.dir.exist)</Text>
</Control>
</Dialog>
<!--
Run our custom wizard in the default install directory.
-->
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"/>
<!-- included at the end -->
<UIRef Id="CustomWizard" />
<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="JpCheckInstallDir" Order="3">1</Publish>
<Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="JpInvalidInstallDir" Order="5">INSTALLDIR_VALID="0"</Publish>
<Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="5">INSTALLDIR_VALID="1"</Publish>
<?ifndef JpLicenseRtf ?>
<!--
No license file provided.
Override the dialog sequence in built-in dialog set "WixUI_InstallDir"
to exclude license dialog.
-->
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2">1</Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">1</Publish>
<?endif?>
<?else?>
<?ifdef JpLicenseRtf ?>
<UIRef Id="WixUI_Minimal" />
<?endif?>
<?endif?>
</UI>
<?ifdef JpLicenseRtf ?>
<WixVariable Id="WixUILicenseRtf" Value="$(var.JpLicenseRtf)"/>
<?endif?>
<UIRef Id="JpUI"/>
<InstallExecuteSequence>
<Custom Action="JpSetARPINSTALLLOCATION" After="CostFinalize">Not Installed</Custom>
<Custom Action="JpSetARPCOMMENTS" After="CostFinalize">Not Installed</Custom>
<Custom Action="JpSetARPCONTACT" After="CostFinalize">Not Installed</Custom>
<Custom Action="JpSetARPSIZE" After="CostFinalize">Not Installed</Custom>
<?ifdef JpHelpURL ?>
<Custom Action="JpSetARPHELPLINK" After="CostFinalize">Not Installed</Custom>
<?endif?>
<?ifdef JpAboutURL ?>
<Custom Action="JpSetARPURLINFOABOUT" After="CostFinalize">Not Installed</Custom>
<?endif?>
<?ifdef JpUpdateURL ?>
<Custom Action="JpSetARPURLUPDATEINFO" After="CostFinalize">Not Installed</Custom>
<?endif?>
<?ifndef JpAllowUpgrades ?>
<Custom Action="JpDisallowUpgrade" After="FindRelatedProducts">JP_UPGRADABLE_FOUND</Custom>
<?endif?>
@@ -156,5 +159,4 @@
<WixVariable Id="WixUIDialogBmp" Value="$(env.JP_WIXWIZARD_RESOURCES)\background.bmp" />
</Product>
<?include $(env.JP_WIXWIZARD_RESOURCES)\customWizard.wxi ?>
</Wix>

16
dist/win/resources/ui.wxf vendored Normal file
View File

@@ -0,0 +1,16 @@
<?xml version="1.0" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Fragment>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"></Property>
<WixVariable Id="WixUILicenseRtf" Value="$(var.JpLicenseRtf)"></WixVariable>
<UI Id="JpUI">
<UIRef Id="CustomWizard" />
<DialogRef Id="InstallDirNotEmptyDlg"></DialogRef>
<Publish Dialog="ShortcutPromptDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg">1</Publish>
<Publish Dialog="ShortcutPromptDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="ShortcutPromptDlg" Order="6">NOT Installed</Publish>
<UIRef Id="CustomWizard" />
</UI>
</Fragment>
<?include $(env.JP_WIXWIZARD_RESOURCES)\customWizard.wxi ?>
</Wix>

View File

@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.cryptomator</groupId>
<artifactId>cryptomator</artifactId>
<version>1.6.0-SNAPSHOT</version>
<version>1.6.3</version>
<name>Cryptomator Desktop App</name>
<organization>
@@ -27,11 +27,11 @@
<nonModularGroupIds>com.github.serceman,com.github.jnr,org.ow2.asm,net.java.dev.jna,org.apache.jackrabbit,org.apache.httpcomponents,de.swiesend,org.purejava,com.github.hypfvieh</nonModularGroupIds>
<!-- cryptomator dependencies -->
<cryptomator.cryptofs.version>2.1.0</cryptomator.cryptofs.version>
<cryptomator.cryptofs.version>2.1.1</cryptomator.cryptofs.version>
<cryptomator.integrations.version>1.0.0</cryptomator.integrations.version>
<cryptomator.integrations.win.version>1.0.0</cryptomator.integrations.win.version>
<cryptomator.integrations.mac.version>1.0.0</cryptomator.integrations.mac.version>
<cryptomator.integrations.linux.version>1.0.0</cryptomator.integrations.linux.version>
<cryptomator.integrations.linux.version>1.0.1</cryptomator.integrations.linux.version>
<cryptomator.fuse.version>1.3.3</cryptomator.fuse.version>
<cryptomator.dokany.version>1.3.3</cryptomator.dokany.version>
<cryptomator.webdav.version>1.2.6</cryptomator.webdav.version>

View File

@@ -1,5 +1,6 @@
package org.cryptomator.common;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.base.Throwables;
@@ -80,7 +81,7 @@ public class ErrorCode {
if (causalChain.size() > 1) {
var rootCause = causalChain.get(causalChain.size() - 1);
var parentOfRootCause = causalChain.get(causalChain.size() - 2);
var rootSpecificFrames = nonOverlappingFrames(parentOfRootCause.getStackTrace(), rootCause.getStackTrace());
var rootSpecificFrames = countTopmostFrames(rootCause.getStackTrace(), parentOfRootCause.getStackTrace());
return new ErrorCode(throwable, rootCause, rootSpecificFrames);
} else {
return new ErrorCode(throwable, throwable, ALL_FRAMES);
@@ -107,11 +108,31 @@ public class ErrorCode {
return result;
}
private static int nonOverlappingFrames(StackTraceElement[] frames, StackTraceElement[] enclosingFrames) {
// Compute the number of elements in `frames` not contained in `enclosingFrames` by iterating backwards
// Result should usually be equal to the difference in size of both traces
var i = reverseStream(enclosingFrames).iterator();
return (int) reverseStream(frames).dropWhile(f -> i.hasNext() && i.next().equals(f)).count();
/**
* Counts the number of <em>additional</em> frames contained in <code>allFrames</code> but not in <code>bottomFrames</code>.
* <p>
* If <code>allFrames</code> does not end with <code>bottomFrames</code>, it is considered distinct and all its frames are counted.
*
* @param allFrames Some stack frames
* @param bottomFrames Other stack frames, potentially forming the bottom of the stack of <code>allFrames</code>
* @return The number of additional frames in <code>allFrames</code>. In most cases this should be equal to the difference in size.
*/
// visible for testing
static int countTopmostFrames(StackTraceElement[] allFrames, StackTraceElement[] bottomFrames) {
if (allFrames.length < bottomFrames.length) {
// if frames had been stacked on top of bottomFrames, allFrames would be larger
return allFrames.length;
} else {
return allFrames.length - commonSuffixLength(allFrames, bottomFrames);
}
}
// visible for testing
static <T> int commonSuffixLength(T[] set, T[] subset) {
Preconditions.checkArgument(set.length >= subset.length);
// iterate items backwards as long as they are identical
var iterator = reverseStream(subset).iterator();
return (int) reverseStream(set).takeWhile(item -> iterator.hasNext() && iterator.next().equals(item)).count();
}
private static <T> Stream<T> reverseStream(T[] array) {

View File

@@ -44,7 +44,9 @@ public interface IpcCommunicator extends Closeable {
}
// Didn't get any connection yet? I.e. we're the first app instance, so let's launch a server:
try {
return Server.create(socketPaths.iterator().next());
final var socketPath = socketPaths.iterator().next();
Files.deleteIfExists(socketPath); // ensure path does not exist before creating it
return Server.create(socketPath);
} catch (IOException e) {
LOG.warn("Failed to create IPC server", e);
return new LoopbackCommunicator();

View File

@@ -56,11 +56,10 @@ public class ChooseExistingVaultController implements FxController {
@FXML
public void initialize() {
final String resource = SystemUtils.IS_OS_MAC ? "/img/select-masterkey-mac.png" : "/img/select-masterkey-win.png";
try (InputStream in = getClass().getResourceAsStream(resource)) {
this.screenshot = new Image(in);
} catch (IOException e) {
throw new UncheckedIOException(e);
if (SystemUtils.IS_OS_MAC) {
this.screenshot = new Image(getClass().getResource("/img/select-masterkey-mac.png").toString());
} else {
this.screenshot = new Image(getClass().getResource("/img/select-masterkey-win.png").toString());
}
}
@@ -73,7 +72,7 @@ public class ChooseExistingVaultController implements FxController {
public void chooseFileAndNext() {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(resourceBundle.getString("addvaultwizard.existing.filePickerTitle"));
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Cryptomator Masterkey", "*.cryptomator"));
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Cryptomator Vault", "*.cryptomator"));
File masterkeyFile = fileChooser.showOpenDialog(window);
if (masterkeyFile != null) {
vaultPath.setValue(masterkeyFile.toPath().toAbsolutePath().getParent());

View File

@@ -2,9 +2,6 @@ package org.cryptomator.ui.traymenu;
import com.google.common.base.Preconditions;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.integrations.uiappearance.Theme;
import org.cryptomator.integrations.uiappearance.UiAppearanceException;
import org.cryptomator.integrations.uiappearance.UiAppearanceProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -12,38 +9,25 @@ import javax.inject.Inject;
import java.awt.AWTException;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.util.Optional;
@TrayMenuScoped
public class TrayIconController {
private static final Logger LOG = LoggerFactory.getLogger(TrayIconController.class);
private final TrayImageFactory imageFactory;
private final Optional<UiAppearanceProvider> appearanceProvider;
private final TrayMenuController trayMenuController;
private final TrayIcon trayIcon;
private volatile boolean initialized;
@Inject
TrayIconController(TrayImageFactory imageFactory, TrayMenuController trayMenuController, Optional<UiAppearanceProvider> appearanceProvider) {
TrayIconController(TrayImageFactory imageFactory, TrayMenuController trayMenuController) {
this.trayMenuController = trayMenuController;
this.imageFactory = imageFactory;
this.appearanceProvider = appearanceProvider;
this.trayIcon = new TrayIcon(imageFactory.loadImage(), "Cryptomator", trayMenuController.getMenu());
}
public synchronized void initializeTrayIcon() throws IllegalStateException {
Preconditions.checkState(!initialized);
appearanceProvider.ifPresent(appearanceProvider -> {
try {
appearanceProvider.addListener(this::systemInterfaceThemeChanged);
} catch (UiAppearanceException e) {
LOG.error("Failed to enable automatic tray icon theme switching.");
}
});
trayIcon.setImageAutoSize(true);
if (SystemUtils.IS_OS_WINDOWS) {
trayIcon.addActionListener(trayMenuController::showMainWindow);
@@ -61,10 +45,6 @@ public class TrayIconController {
this.initialized = true;
}
private void systemInterfaceThemeChanged(Theme theme) {
trayIcon.setImage(imageFactory.loadImage()); // TODO refactor "theme" is re-queried in loadImage()
}
public boolean isInitialized() {
return initialized;
}

View File

@@ -25,11 +25,7 @@ class TrayImageFactory {
}
private String getMacResourceName() {
var theme = appearanceProvider.map(UiAppearanceProvider::getSystemTheme).orElse(Theme.LIGHT);
return switch (theme) {
case DARK -> "/img/tray_icon_mac_white.png";
case LIGHT -> "/img/tray_icon_mac_black.png";
};
return "/img/tray_icon_mac.png";
}
private String getWinOrLinuxResourceName() {

View File

@@ -76,9 +76,9 @@ addvault.new.readme.accessLocation.2=This is your vault's access location.
addvault.new.readme.accessLocation.3=Any files added to this volume will be encrypted by Cryptomator. You can work on it like on any other drive/folder. This is only a decrypted view of its content, your files stay encrypted on your hard drive all the time.
addvault.new.readme.accessLocation.4=Feel free to remove this file.
## Existing
addvaultwizard.existing.instruction=Choose the "masterkey.cryptomator" file of your existing vault.
addvaultwizard.existing.instruction=Choose the "vault.cryptomator" file of your existing vault. If only a file named "masterkey.cryptomator" exists, select that instead.
addvaultwizard.existing.chooseBtn=Choose…
addvaultwizard.existing.filePickerTitle=Select Masterkey File
addvaultwizard.existing.filePickerTitle=Select Vault File
## 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

View File

@@ -70,9 +70,7 @@ addvault.new.readme.accessLocation.2=هذا هو موقع الوصول للخر
addvault.new.readme.accessLocation.3=سيتم تشفير أي ملفات تضاف إلى هذا المجلد من قبل Cryptomator. يمكنك العمل عليه كأي مجلد آخر. هذه فقط طريقة عرض غير مشفرة لمحتوياتها، ملفاتك تبقى مشفرة على القرص الصلب الخاص بك طوال الوقت.
addvault.new.readme.accessLocation.4=لا تتردد في إزالة هذا الملف.
## Existing
addvaultwizard.existing.instruction=اختر ملف "masterkey.cryptomator" الخاص بالخزنة الموجودة لديك سابقاً.
addvaultwizard.existing.chooseBtn=اختر…
addvaultwizard.existing.filePickerTitle=اختر ملف الـ Masterkey
## Success
addvaultwizard.success.nextStepsInstructions=تم إضافة مخزن "%s".\nتحتاج إلى فتح هذا المخزن للوصول أو إضافة محتويات إليه. بدلاً من ذلك، يمكنك فتحه في أي وقت لاحق.
addvaultwizard.success.unlockNow=افتح الان

View File

@@ -70,9 +70,7 @@ addvault.new.readme.accessLocation.2=Ovo je pristupna lokacija vašeg sefa.
addvault.new.readme.accessLocation.3=Sve datoteke dodane u ovaj prostor enkriptovati će Cryptomator. Na njemu možete raditi kao na bilo kojem drugom pogonu / folderu. Ovo je samo dešifrirani prikaz njegovog sadržaja, vaše datoteke stalno ostaju enkriptovane na vašem disku.
addvault.new.readme.accessLocation.4=Slobodno uklonite ovu datoteku.
## Existing
addvaultwizard.existing.instruction=Odaberite datoteku "masterkey.cryptomator" vašeg postojećeg sefa.
addvaultwizard.existing.chooseBtn=Odaberi…
addvaultwizard.existing.filePickerTitle=Odaberite Masterkey Datoteku
## Success
addvaultwizard.success.nextStepsInstructions=Dodan je sef "%s".\nZa pristup ili dodavanje sadržaja morate otključati ovaj sef. Možete ga otključati u bilo kojem kasnijem trenutku.
addvaultwizard.success.unlockNow=Otključaj sada

View File

@@ -75,9 +75,7 @@ addvault.new.readme.accessLocation.2=Aquesta és la ubicació d'accès de la vos
addvault.new.readme.accessLocation.3=Cryptomator xifra tots els fitxers afegits a aquest volum. Podeu treballar en aquest volum com en qualsevol altra unitat o carpeta. La vista mostra el contingut desxifrat però els fitxers sempre estan xifrats en el vostre disc dur.
addvault.new.readme.accessLocation.4=Pots esborrar aquest fitxer si vols.
## Existing
addvaultwizard.existing.instruction=Seleccioneu el fitxer "masterkey.cryptomator" de la vostra caixa forta.
addvaultwizard.existing.chooseBtn=Trieu…
addvaultwizard.existing.filePickerTitle=Seleccioneu el fitxer Masterkey
## Success
addvaultwizard.success.nextStepsInstructions=S'ha afegit la caixa forta "%s".\nHeu de desbloquejar-la si voleu accedir-hi o afegir nou contingut. També podeu desbloquejar-la en qualsevol altre moment.
addvaultwizard.success.unlockNow=Desbloqueja ara

View File

@@ -75,9 +75,9 @@ 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.4=Tento soubor můžete odstranit.
## Existing
addvaultwizard.existing.instruction=Vyberte soubor "masterkey.cryptomator" z vašeho stávajícího trezoru.
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.filePickerTitle=Vyberte soubor s hlavním klíčem
addvaultwizard.existing.filePickerTitle=Vyberte soubor trezoru
## Success
addvaultwizard.success.nextStepsInstructions=Vytvořen trezor "%s".\nNejprve odemkněte tento trezor, pak do něj můžete přidat svůj obsah. Nebo jej můžete odemknout kdykoliv v budoucnu.
addvaultwizard.success.unlockNow=Odemknout nyní
@@ -300,6 +300,7 @@ main.vaultDetail.missing.changeLocation=Změnit umístění trezoru…
main.vaultDetail.migrateButton=Upgrade trezoru
main.vaultDetail.migratePrompt=Váš trezor musí být aktualizován na nový formát, než k němu budete mít přístup
### Error
main.vaultDetail.error.reload=Obnovit
# Wrong File Alert
wrongFileAlert.title=Jak šifrovat soubory

View File

@@ -68,16 +68,16 @@ addvault.new.readme.storageLocation.6=Falls du Dateien verschlüsseln und den In
addvault.new.readme.storageLocation.7=1. Füge diesen Tresor zu Cryptomator hinzu.
addvault.new.readme.storageLocation.8=2. Entsperre den Tresor in Cryptomator.
addvault.new.readme.storageLocation.9=3. Öffne den Zugangsort durch Klicken auf die Schaltfläche „Anzeigen“.
addvault.new.readme.storageLocation.10=Falls du Hilfe brauchst, lies die Dokumentation: %s
addvault.new.readme.storageLocation.10=Falls Du Hilfe brauchst, lies die Dokumentation: %s
addvault.new.readme.accessLocation.fileName=WILLKOMMEN.rtf
addvault.new.readme.accessLocation.1=🔐️ VERSCHLÜSSELTES LAUFWERK 🔐️
addvault.new.readme.accessLocation.2=Dies ist der Zugangsort deines Tresors.
addvault.new.readme.accessLocation.3=Alle zu diesem Laufwerk hinzugefügten Dateien werden von Cryptomator verschlüsselt. Du kannst mit diesem arbeiten wie mit jedem anderen Laufwerk bzw. Ordner. Dies ist lediglich eine unverschlüsselte Ansicht des Laufwerkinhalts; auf deiner Festplatte bleiben deine Dateien weiterhin verschlüsselt.
addvault.new.readme.accessLocation.4=Diese Datei kannst du löschen.
## Existing
addvaultwizard.existing.instruction=Wähle die Datei masterkey.cryptomator“ deines vorhandenen Tresors aus.
addvaultwizard.existing.instruction=Wähle die Datei "vault.cryptomator" deines bestehenden Tresors aus. Falls nur eine Datei mit der Bezeichnung "masterkey.cryptomator" vorhanden sein sollte, nutze stattdessen diese.
addvaultwizard.existing.chooseBtn=Durchsuchen…
addvaultwizard.existing.filePickerTitle=Masterkey-Datei auswählen
addvaultwizard.existing.filePickerTitle=Tresor Datei auswählen
## Success
addvaultwizard.success.nextStepsInstructions=Tresor „%s“ hinzugefügt.\nUm auf Inhalte zuzugreifen oder welche hinzuzufügen, musst du den Tresor entsperren. Du kannst ihn aber auch zu jedem späteren Zeitpunkt entsperren.
addvaultwizard.success.unlockNow=Jetzt entsperren
@@ -113,7 +113,7 @@ unlock.success.revealBtn=Laufwerk anzeigen
unlock.error.heading=Tresor konnte nicht entsperrt werden
### Invalid Mount Point
unlock.error.invalidMountPoint.notExisting=Einhängepunkt ist kein leeres Verzeichnis oder existiert nicht: %s
unlock.error.invalidMountPoint.existing=Einhängepunkt/Ordner bereits vorhanden oder übergeordneter Ordner fehlt: %s
unlock.error.invalidMountPoint.existing=Einhängepunkt/Ordner bereits vorhanden oder übergeordneter Ordner fehlt: %s.
# Lock
## Force

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Αυτή είναι η τοποθεσία
addvault.new.readme.accessLocation.3=Κάθε αρχείο που θα προστεθεί σε αυτό τον τόμο θα κωδικοποιηθεί από το Cryptomator. Μπορείτε να το επεξεργαστείτε όπως θα κάνατε σε κάθε δίσκο/φάκελο. Αυτή είναι μόνο για αποκρυπτογραφημένη μορφή των περιεχομένων του, τα αρχεία σας μένουν κωδικοποιημένα στον σκληρό σας δίσκο συνέχεια.
addvault.new.readme.accessLocation.4=Μπορείτε ελεύθερα να αφαιρέσετε το αρχείο.
## Existing
addvaultwizard.existing.instruction=Επιλέξτε το αρχείο "masterkey.cryptomator" του υπάρχοντος vault σας.
addvaultwizard.existing.instruction=Επιλέξτε το αρχείο "vault.cryptomator" της υπάρχοντος κρύπτης. Αν υπάρχει μόνο ένα αρχείο με όνομα "masterkey.cryptomator", επιλέξτε αυτό.
addvaultwizard.existing.chooseBtn=Επιλογή…
addvaultwizard.existing.filePickerTitle=Επιλέξτε το αρχείο Masterkey
addvaultwizard.existing.filePickerTitle=Επιλέξτε Αρχείο Κρύπτης
## Success
addvaultwizard.success.nextStepsInstructions=Προστέθηκε το vault "%s".\nΠρέπει να ξεκλειδώσετε αυτό το vault για να έχετε πρόσβαση ή να προσθέσετε περιεχόμενο. Εναλλακτικά μπορείτε να το ξεκλειδώσετε κάποια άλλη στιγμή.
addvaultwizard.success.unlockNow=Ξεκλείδωμα τώρα

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Este es el lugar de acceso de la bóveda.
addvault.new.readme.accessLocation.3=Los archivos agregados a este volumen serán cifrados por Cryptomator. Se puede trabajar con ellos como en cualquier otra unidad/carpeta. Esta es sólo una vista descifrada del contenido, sus archivos permanecen cifrados en el disco duro todo el tiempo.
addvault.new.readme.accessLocation.4=No dude en eliminar este archivo.
## Existing
addvaultwizard.existing.instruction=Elegir el archivo "masterkey.cryptomator" de la bóveda existente.
addvaultwizard.existing.instruction=Elija el archivo "vault.cryptomator" de su bóveda existente. Si solo existe un archivo llamado "masterkey.cryptomator", selecciónelo en su lugar.
addvaultwizard.existing.chooseBtn=Elegir…
addvaultwizard.existing.filePickerTitle=Seleccionar archivo Masterkey
addvaultwizard.existing.filePickerTitle=Seleccionar archivo de bóveda
## Success
addvaultwizard.success.nextStepsInstructions=Bóveda "%s" añadida.\nSe necesita desbloquear esta bóveda para acceder o añadir contenido. Alternativamente se \n puede desbloquear en otro momento.
addvaultwizard.success.unlockNow=Desbloquear ahora

View File

@@ -0,0 +1,132 @@
# Locale Specific CSS files such as CJK, RTL,...
# Generics
## Button
generic.button.apply=I-apply
generic.button.back=Bumalik
generic.button.cancel=Kanselahin
generic.button.change=Baguhin
generic.button.close=Isara
generic.button.copy=Kopyahin
generic.button.copied=Nakopya na!
generic.button.done=Tapos na
generic.button.next=Sunod
generic.button.print=I-print
## Error
generic.error.title=Error %s
generic.error.instruction=Oops! Hindi inaasahan ng Cryptomator na ito'y mangyari. Maaari kang humanap ng umiiral na solusyon sa problemang ito. Maaaring i-report ito kung hindi pa umiiral.
generic.error.hyperlink.lookup=Hanapin ang solusyon
generic.error.hyperlink.report=I-report ang problema
generic.error.technicalDetails=Mga detalye:
# Defaults
defaults.vault.vaultName=Vault
# Tray Menu
traymenu.showMainWindow=Ipakita
traymenu.showPreferencesWindow=Mga Kagustuhan
traymenu.lockAllVaults=I-lock lahat
traymenu.quitApplication=Umalis
traymenu.vault.unlock=I-unlock
traymenu.vault.lock=I-lock
traymenu.vault.reveal=Ipakita
# Add Vault Wizard
addvaultwizard.title=Magdagdag ng Vault
## Welcome
addvaultwizard.welcome.newButton=Gumawa ng Bagong Vault
addvaultwizard.welcome.existingButton=Magbukas ng Umiiral na Vault
## New
### Name
addvaultwizard.new.nameInstruction=Pangalanan ang vault
addvaultwizard.new.namePrompt=Pangalan ng Vault
### Location
addvaultwizard.new.locationInstruction=Saan maaaring ilagay ng Cryptomator ang mga encrypted files ng iyong vault?
addvaultwizard.new.locationLabel=Storage location
addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Custom Location
addvaultwizard.new.directoryPickerButton=Mamili…
addvaultwizard.new.directoryPickerTitle=Pumili ng Direktoryo
### Password
### Information
## Existing
addvaultwizard.existing.chooseBtn=Mamili…
## Success
# Remove Vault
# Change Password
# Forget Password
# Unlock
unlock.unlockBtn=I-unlock
##
## Success
## Failure
### Invalid Mount Point
# Lock
## Force
## Failure
# Migration
## Start
## Run
## Success
## Missing file system capabilities
## Impossible
# Health Check
## Start
## Start Failure
## Check Selection
## Detail view
## Fix Application
# Preferences
preferences.title=Mga Kagustuhan
## General
## Volume
## Updates
## Contribution
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
# Vault Statistics
## Read
## Write
# Main Window
main.closeBtn.tooltip=Isara
main.preferencesBtn.tooltip=Mga Kagustuhan
## Drag 'n' Drop
## Vault List
main.vaultlist.contextMenu.lock=I-lock
main.vaultlist.addVaultBtn=Magdagdag ng Vault
## Vault Detail
### Welcome
### Locked
### Unlocked
main.vaultDetail.lockBtn=I-lock
### Missing
### Needs Migration
### Error
# Wrong File Alert
# Vault Options
## General
vaultOptions.general.vaultName=Pangalan ng Vault
## Mount
vaultOptions.mount.mountPoint.directoryPickerButton=Mamili…
## Master Key
# Recovery Key
# New Password
# Quit

View File

@@ -9,15 +9,15 @@ generic.button.change=Modifier
generic.button.close=Fermer
generic.button.copy=Copier
generic.button.copied=Copié !
generic.button.done=Terminé
generic.button.done=Ok
generic.button.next=Suivant
generic.button.print=Imprimer
## Error
generic.error.title=Erreur: %s
generic.error.title=Erreur : %s
generic.error.instruction=Oups ! Cryptomator ne s'attendait pas à ce que cela se produise. Vous pouvez rechercher des solutions existantes pour cette erreur. Ou si elle n'a pas encore été signalée, n'hésitez pas à le faire.
generic.error.hyperlink.lookup=Rechercher cette erreur
generic.error.hyperlink.report=Signaler cette erreur
generic.error.technicalDetails=Détails:
generic.error.technicalDetails=Détails :
# Defaults
defaults.vault.vaultName=Coffre
@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Ceci est le chemin d'accès de votre coffre
addvault.new.readme.accessLocation.3=Tous les fichiers ajoutés à ce volume seront chiffrés par Cryptomator. Vous pouvez l'utiliser comme n'importe quel lecteur/répertoire. Ceci est seulement une vue déchiffrée de son contenu, vos fichiers restent chiffrés dans votre disque dur à tout le temps.
addvault.new.readme.accessLocation.4=Vous pouvez supprimer ce fichier.
## Existing
addvaultwizard.existing.instruction=Sélectionner le fichier "masterkey.cryptomator" de votre coffre existant.
addvaultwizard.existing.instruction=Choisissez le fichier "vault.cryptomator" de votre coffre existant. S'il existe seulement un fichier "masterkey.cryptomator", sélectionnez celui-ci.
addvaultwizard.existing.chooseBtn=Choisir...
addvaultwizard.existing.filePickerTitle=Sélectionner le fichier clef
addvaultwizard.existing.filePickerTitle=Sélectionnez le fichier du coffre
## Success
addvaultwizard.success.nextStepsInstructions=Coffre “%s” ajouté.\nIl faudra déverrouiller ce coffre afin dy accéder ou dy ajouter du contenu. Cette action peut être réalisée ultérieurement.
addvaultwizard.success.unlockNow=Déverrouiller

View File

@@ -65,9 +65,7 @@ addvault.new.readme.accessLocation.2=Ez a széf hozzáférési helye.
addvault.new.readme.accessLocation.3=Bármilyen, a kötethez hozzáadott fájl titkosításra kerül a Cryptomator által. Úgy dolgozhat vele, mint minden más meghajtóval/mappával. Ez az egyetlen dekódolt tartalmi nézet. A fájlai folyamatosan titkosítva maradnak a merevlemezén.
addvault.new.readme.accessLocation.4=Bátran eltávolíthatja ezt a fájlt.
## Existing
addvaultwizard.existing.instruction=Válassza ki a már létező széfjéhez tartozó "masterkey.cryptomator" fájlt.
addvaultwizard.existing.chooseBtn=Kiválaszt…
addvaultwizard.existing.filePickerTitle=Mesterkulcs fájl kiválasztása
## Success
addvaultwizard.success.nextStepsInstructions=Széf létrehozva "%s".\nA tartalom eléréséhez, vagy hozzáadásához fel kell oldania a széfet. Alternatív megoldásként később bármikor feloldhatja.
addvaultwizard.success.unlockNow=Azonnali feloldás

View File

@@ -70,9 +70,7 @@ addvault.new.readme.accessLocation.2=Ini adalah lokasi akses brankas kamu.
addvault.new.readme.accessLocation.3=File yang ditambahkan ke volume ini akan dienkripsi oleh Cryptomator. Anda dapat mempergunakan isi vault seperti dalam folder lain. Saat ini Anda sedang mengakses tampilan versi dekripsi, file Anda selalu terenkripsi di dalam cakram keras Anda.
addvault.new.readme.accessLocation.4=Anda dapat menghapus file ini.
## Existing
addvaultwizard.existing.instruction=Pilih file "masterkey.cryptomator" dalam vault Anda.
addvaultwizard.existing.chooseBtn=Pilih…
addvaultwizard.existing.filePickerTitle=Pilih File Kunci Induk
## Success
addvaultwizard.success.nextStepsInstructions=Vault "%s" telah dibuat.\nAnda harus membuka kunci vault ini untuk mengakses atau menambahkan konten. Anda juga dapat membuka kunci vault ini kapan saja di kemudian hari.
addvaultwizard.success.unlockNow=Buka Kunci Sekarang

View File

@@ -75,9 +75,7 @@ addvault.new.readme.accessLocation.2=Questa è la posizione d'accesso della tua
addvault.new.readme.accessLocation.3=Ogni file aggiunto a questo volume sarà crittografato da Cryptomator. Puoi lavorarci come su ogni altra unità/cartella. Questa è solo una vista decrittografata del suo contenuto, i tuoi file restano sempre crittografati sul tuo disco rigido.
addvault.new.readme.accessLocation.4=Sentiti libero di rimuovere questo file.
## Existing
addvaultwizard.existing.instruction=Scegli il file "masterkey.cryptomator" della tua cassaforte esistente.
addvaultwizard.existing.chooseBtn=Scegli…
addvaultwizard.existing.filePickerTitle=Seleziona il File Masterkey
## Success
addvaultwizard.success.nextStepsInstructions=Cassaforte "%s" aggiunta.\nDevi sbloccare questa cassaforte per accedere o aggiungere contenuti. Altrimenti, puoi sbloccarla in qualsiasi momento successivo.
addvaultwizard.success.unlockNow=Sblocca Ora

View File

@@ -75,9 +75,7 @@ addvault.new.readme.accessLocation.2=ここは金庫のアクセス先です。
addvault.new.readme.accessLocation.3=このボリュームに追加したファイルは Cryptomator によって暗号化されます。一般的なドライブ/フォルダー上のように作業することができます。ここでは復号したコンテンツのビューにすぎず、ファイルは常にハードドライブ上で暗号化されています。
addvault.new.readme.accessLocation.4=このファイルはいつでも削除できます。
## Existing
addvaultwizard.existing.instruction=既存の金庫の "masterkey.cryptomator" ファイルを選択してください。
addvaultwizard.existing.chooseBtn=選択...
addvaultwizard.existing.filePickerTitle=Masterkey ファイルを選択
## Success
addvaultwizard.success.nextStepsInstructions=金庫 "%s" を追加しました。\n金庫にアクセスしたり、コンテンツを追加したりするには、金庫を解錠する必要があります。あるいは、後で解錠することが可能です。
addvaultwizard.success.unlockNow=今すぐ解錠

View File

@@ -73,9 +73,7 @@ addvault.new.readme.accessLocation.2=이것은 당신의 Vault 접근 위치입
addvault.new.readme.accessLocation.3=이 볼륨에 추가된 모든 파일은 Cryptomator로 암호화됩니다. 다른 드라이브/폴더처럼 작업할 수 있습니다. 볼륨의 내용은 복호화 된 것 처럼 보여지지만, 모든 파일은 항상 암호화되어 하드디스크에 저장됩니다.
addvault.new.readme.accessLocation.4=이 파일은 지우셔도 무방합니다.
## Existing
addvaultwizard.existing.instruction=기존 Vault 의 "masterkey.cryptomator" 파일을 선택하여 주십시요.
addvaultwizard.existing.chooseBtn=선택
addvaultwizard.existing.filePickerTitle=마스터키 파일 선택
## Success
addvaultwizard.success.nextStepsInstructions="%s" Vault가 추가되었습니다.\n이 Vault를 접근하거나 컨텐츠를 추가하려면 잠금해제가 필요합니다. 그렇지만 언제든지 잠금해제가 가능합니다.
addvaultwizard.success.unlockNow=지금 잠금해제

View File

@@ -65,9 +65,7 @@ addvault.new.readme.accessLocation.2=Šī ir jūsu glabātuves piekļuves vieta.
addvault.new.readme.accessLocation.3=Visas šeit pievienotās datnes tiks šifrētas ar Cryptomator. Jūs variet ar to strādāt kā ar jebkuru citu disku/mapi. Šis it tikai atšifrēts satura skats, jūsu dati diskā visu laiku ir šifrēti.
addvault.new.readme.accessLocation.4=Jūs variet droši noņemt šo datni.
## Existing
addvaultwizard.existing.instruction=Izvēlieties "masterkey.cryptomator" datni no jūsu esošās glabātuves.
addvaultwizard.existing.chooseBtn=Izvēlies...
addvaultwizard.existing.filePickerTitle=Atlasīt galveno atslēgas datni
## Success
addvaultwizard.success.nextStepsInstructions=Pievienota "%s" glabātuve.\nlai piekļūtu vai pievienotu datus, jums šo glabātuvi ir jāatslēdz. Vai arī jūs to variet atslēgt vēlāk jebkurā laikā.
addvaultwizard.success.unlockNow=Atslēgt tagad

View File

@@ -0,0 +1,88 @@
# Locale Specific CSS files such as CJK, RTL,...
# Generics
## Button
## Error
# Defaults
# Tray Menu
# Add Vault Wizard
## Welcome
## New
### Name
### Location
### Password
### Information
## Existing
## Success
# Remove Vault
# Change Password
# Forget Password
# Unlock
##
## Success
## Failure
### Invalid Mount Point
# Lock
## Force
## Failure
# Migration
## Start
## Run
## Success
## Missing file system capabilities
## Impossible
# Health Check
## Start
## Start Failure
## Check Selection
## Detail view
## Fix Application
# Preferences
## General
## Volume
## Updates
## Contribution
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
# Vault Statistics
## Read
## Write
# Main Window
## Drag 'n' Drop
## Vault List
## Vault Detail
### Welcome
### Locked
### Unlocked
### Missing
### Needs Migration
### Error
# Wrong File Alert
# Vault Options
## General
## Mount
## Master Key
# Recovery Key
# New Password
# Quit

View File

@@ -68,9 +68,7 @@ addvault.new.readme.accessLocation.2=Dette er hvelvets lagringssted.
addvault.new.readme.accessLocation.3=Alle filer som er lagt til i dette volumet, blir kryptert av Cryptomator. Du kan jobbe med dem som på alle andre enheter/mapper. Dette er bare en dekryptert visning av innholdet, filene dine forblir kryptert på harddisken hele tiden.
addvault.new.readme.accessLocation.4=Denne filen kan fjernes hvis ønskelig.
## Existing
addvaultwizard.existing.instruction=Velg filen "masterkey.cryptomator" i det eksisterende hvelvet.
addvaultwizard.existing.chooseBtn=Velg…
addvaultwizard.existing.filePickerTitle=Velg hovednøkkelfil
## Success
addvaultwizard.success.nextStepsInstructions=Lagt til hvelvet "%s".\nDu må låse opp dette hvelvet for å få tilgang til eller legge til innhold. Alternativt kan du låse det opp på et hvilket som helst senere tidspunkt.
addvaultwizard.success.unlockNow=Lås opp nå

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Dit is de opslaglocatie van uw kluis.
addvault.new.readme.accessLocation.3=Alle bestanden die aan dit volume worden toegevoegd zullen worden versleuteld door Cryptomator. U kunt deze bestanden gebruiken zoals in elke andere map/schijf. Dit is alleen een ontsleutelde weergave van de inhoud, uw bestanden blijven ten alle tijden versleuteld op uw harde schijf.
addvault.new.readme.accessLocation.4=Voel je vrij om dit bestand te verwijderen.
## Existing
addvaultwizard.existing.instruction=Kies het "masterkey.cryptomator" bestand van uw bestaande kluis.
addvaultwizard.existing.instruction=Kies het "vault.cryptomator"-bestand van uw bestaande kluis. Indien er enkel een bestand genaamd "masterkey.cryptomator" anwezig is, kies deze dan in de plaats.
addvaultwizard.existing.chooseBtn=Kies…
addvaultwizard.existing.filePickerTitle=Selecteer het Masterkey-bestand
addvaultwizard.existing.filePickerTitle=Kies kluisbestand
## Success
addvaultwizard.success.nextStepsInstructions=Toegevoegde kluis "%s".\nOntgrendel deze kluis om toegang te krijgen tot of om inhoud toe te voegen. Optioneel kunt u deze op elk later tijdstip ontgrendelen.
addvaultwizard.success.unlockNow=Nu Ontgrendelen

View File

@@ -65,9 +65,7 @@ addvault.new.readme.accessLocation.2=Dette er lagringsstaden til kvelven.
addvault.new.readme.accessLocation.3=Alle filer som er lagt til i dette volumet, blir kryptert av Cryptomator. Du kan jobba med dei som på alle andre einingar/mapper. Dette er berre ein dekryptert visning av innhaldet, filene dine blir verande kryptert på harddisken heile tida.
addvault.new.readme.accessLocation.4=Du kan fjerna denne fila viss ønskeleg.
## Existing
addvaultwizard.existing.instruction=Vel fila "masterkey.cryptomator" i den eksisterande kvelven.
addvaultwizard.existing.chooseBtn=Vel…
addvaultwizard.existing.filePickerTitle=Vel hovudnøkkelfil
## Success
addvaultwizard.success.nextStepsInstructions=Lagt til kvelven "%s".\nDu må låsa opp denne kvelven for å få tilgang til eller legga til innhald. Alternativt kan du låsa det opp på eit kva som helst seinare tidspunkt.
addvaultwizard.success.unlockNow=Lås opp no

View File

@@ -66,9 +66,7 @@ addvault.new.readme.accessLocation.2=ਇਹ ਤੁਹਾਡੇ ਵਾਲਟ ਦ
addvault.new.readme.accessLocation.3=ਇਸ ਵਾਲੀਅਮ ਵਿੱਚ ਜੋੜੀ ਗਈ ਕੋਈ ਵੀ ਫਾਇਲ Cryptomator ਵਲੋਂ ਇੰਕ੍ਰਿਪਟ ਕੀਤੀ ਜਾਵੇਗੀ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਕਿਸੇ ਵੀ ਆਮ ਡਰਾਇਵ/ਫੋਲਡਰ ਵਾਂਗ ਵਰਤ ਸਕਦੇ ਹੋ। ਇਹ ਕੇਵਲ ਇਸ ਦੀ ਸਮੱਗਰੀ ਵੇਖਣ ਲਈ ਹੀ ਡਿ-ਕ੍ਰਿਪਟ ਹੁੰਦਾ ਹੈ, ਤੁਹਾਡੀਆਂ ਫਾਇਲਾਂ ਤੁਹਾਡੀ ਹਾਰਡ ਡਰਾਇਵ ਉੱਤੇ ਹਮੇਸ਼ਾਂ ਇੰਕ੍ਰਿਪਟ ਰਹਿੰਦੀਆਂ ਹਨ।
addvault.new.readme.accessLocation.4=ਇਹ ਫਾਇਲ ਕਿਸੇ ਵੀ ਵੇਲੇ ਹਟਾ ਸਕਦੇ ਹੋ।
## Existing
addvaultwizard.existing.instruction=ਆਪਣੇ ਮੌਜੂਦਾ ਵਾਲਟ ਦੀ "masterkey.cryptomator" ਫਾਇਲ ਚੁਣੋ।
addvaultwizard.existing.chooseBtn=…ਚੁਣੋ
addvaultwizard.existing.filePickerTitle=ਮਾਸਟਰ-ਕੁੰਜੀ ਫਾਇਲ ਚੁਣੋ
## Success
addvaultwizard.success.nextStepsInstructions="%s" ਵਾਲਟ ਜੋੜਿਆ ਗਿਆ।\nਇਸ ਵਾਲਟ ਲਈ ਪਹੁੰਚ ਜਾਂ ਸਮੱਗਰੀ ਜੋੜਨ ਵਾਸਤੇ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਅਣ-ਲਾਕ ਕਰਨਾ ਹੋਵੇਗਾ। ਬਦਲਵੇਂ ਰੂਪ ਵਿੱਚ ਤੁਸੀਂ ਕਿਸੇ ਵੀ ਵੇਲੇ ਇਸ ਨੂੰ ਅਣ-ਲਾਕ ਕਰ ਸਕਦੇ ਹੋ।
addvaultwizard.success.unlockNow=ਹੁਣੇ ਅਣ-ਲਾਕ ਕਰੋ

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Tu są przechowywane pliki Twojego sejfu.
addvault.new.readme.accessLocation.3=Wszystkie pliki dodane tutaj zostaną zaszyfrowane przez Cryptomator. Możesz tu wykonywać operacje jak na każdym innym dysku czy katalogu. To jest jedynie odszyfrowany podgląd Twoich plików, wszystkie pozostają cały czas zaszyfrowane na Twoim dysku twardym.
addvault.new.readme.accessLocation.4=Jeśli chcesz możesz spokojnie usunąć ten plik.
## Existing
addvaultwizard.existing.instruction=Wybierz plik "masterkey.cryptomator" w swoim istniejącym sejfie.
addvaultwizard.existing.instruction=Wybierz plik "vault.cryptomator" w istniejącym sejfie. Jeśli istnieje tylko plik "masterkey.cryptomator", wybierz ten plik.
addvaultwizard.existing.chooseBtn=Wybierz…
addvaultwizard.existing.filePickerTitle=Wybierz plik Masterkey
addvaultwizard.existing.filePickerTitle=Wybierz plik sejfu
## Success
addvaultwizard.success.nextStepsInstructions=Dodano sejf "%s".\nMusisz odblokować ten sejf, aby uzyskać dostęp lub dodać zawartość. Możesz go również odblokować kiedy indziej.
addvaultwizard.success.unlockNow=Odblokuj teraz

View File

@@ -63,7 +63,6 @@ addvault.new.readme.accessLocation.1=🔐 VOLUME CRIPTOGRAFADO 🔐
addvault.new.readme.accessLocation.4=Sinta-se livre para remover este ficheiro.
## Existing
addvaultwizard.existing.chooseBtn=Escolher…
addvaultwizard.existing.filePickerTitle=Selecionar ficheiro MasterKey
## Success
addvaultwizard.success.nextStepsInstructions=Adicionado cofre "%s".\nPrecisa de destrancar este cofre para aceder ou adicionar conteúdo. Como alternativa, pode destrancá-lo a qualquer momento mais tarde.
addvaultwizard.success.unlockNow=Destrancar agora

View File

@@ -75,9 +75,7 @@ addvault.new.readme.accessLocation.2=Este é o local de acesso ao seu cofre.
addvault.new.readme.accessLocation.3=Todos os arquivos adicionados a este volume serão encriptados pelo Cryptomator. Você pode trabalhar nele tal como em qualquer outra unidade/pasta. Esta é apenas uma visão desencriptada do seu conteúdo, seus arquivos ficam encriptados em seu disco rígido o tempo todo.
addvault.new.readme.accessLocation.4=Sinta-se livre para apagar este arquivo.
## Existing
addvaultwizard.existing.instruction=Selecione o arquivo "masterkey.cryptomator" do seu cofre existente.
addvaultwizard.existing.chooseBtn=Selecionar…
addvaultwizard.existing.filePickerTitle=Selecionar Arquivo Masterkey
## Success
addvaultwizard.success.nextStepsInstructions=Cofre "%s" adicionado.\nVocê precisa desbloquear este cofre para acessar ou adicionar conteúdo. Você também pode desbloqueá-lo a qualquer momento.
addvaultwizard.success.unlockNow=Desbloquear Agora

View File

@@ -70,9 +70,7 @@ addvault.new.readme.accessLocation.2=Aceasta este locația de acces a seifului d
addvault.new.readme.accessLocation.3=Orice fișier adăugat la acest volum va fi criptat de către Cryptomator. Puteți lucra la el ca pe orice altă unitate/folder. Aceasta este doar o vizualizare decriptată a conținutului său, fișierele sunt criptate tot timpul pe hard disk-ul tău.
addvault.new.readme.accessLocation.4=Puteți să ștergeți acest fișier.
## Existing
addvaultwizard.existing.instruction=Alegeți fișierul "masterkey.cryptomator" din seiful dvs. existent.
addvaultwizard.existing.chooseBtn=Alege…
addvaultwizard.existing.filePickerTitle=Selectaţi fişierul Masterkey
## Success
addvaultwizard.success.nextStepsInstructions=Seiful "%s" a fost adăugat.\nTrebuie să deblocați acest seif pentru a accesa sau adăuga conținut. Alternativ, îl puteți debloca în orice moment ulterior.
addvaultwizard.success.unlockNow=Deblochează acum

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Это место доступа к ваш
addvault.new.readme.accessLocation.3=Любые файлы, добавленные в этот том, будут зашифрованы Cryptomator. Вы можете работать с ним как с любым другим диском или папкой. Здесь отображается только расшифрованное содержимое тома, ваши файлы остаются зашифрованными на жёстком диске постоянно.
addvault.new.readme.accessLocation.4=Этот файл можно удалить.
## Existing
addvaultwizard.existing.instruction=Выберите файл "masterkey.cryptomator" от имеющегося хранилища.
addvaultwizard.existing.instruction=Выберите файл "vault.cryptomator" существующего хранилища. Если имеется только файл "masterkey.cryptomator", выберите его.
addvaultwizard.existing.chooseBtn=Выбрать…
addvaultwizard.existing.filePickerTitle=Выберите файл MasterKey
addvaultwizard.existing.filePickerTitle=Выберите файл хранилища
## Success
addvaultwizard.success.nextStepsInstructions=Добавлено хранилище "%s".\nДля добавления данных или доступа к содержимому нужно разблокировать хранилище. Его можно разблокировать и позже.
addvaultwizard.success.unlockNow=Разблокировать

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Toto je prístupové miesto vášho trezoru
addvault.new.readme.accessLocation.3=Všetky súbory pridané do tohto zväzku budú šifrované programom Cryptomator. Môžete na tom pracovať ako na akomkoľvek inom disku / priečinku. Toto je iba dešifrované zobrazenie jeho obsahu, vaše súbory zostávajú stále šifrované na pevnom disku.
addvault.new.readme.accessLocation.4=Tento súbor môžete kedykoľvek odstrániť.
## Existing
addvaultwizard.existing.instruction=Vyberte súbor „masterkey.cryptomator“ existujúceho trezoru.
addvaultwizard.existing.instruction=Zvoľte "vault.cryptomator" súbor Vášho existujúceho trezora. Ak existuje iba súbor s menom "masterkey.cryptomator", vyberte ho namiesto.
addvaultwizard.existing.chooseBtn=Vybrať…
addvaultwizard.existing.filePickerTitle=Zvoľte hlavný kľúčový súbor
addvaultwizard.existing.filePickerTitle=Zvoľte súbor trezora
## Success
addvaultwizard.success.nextStepsInstructions=Pridaný trezor "%s".\nAk chcete získať prístup alebo pridať obsah, musíte tento trezor odomknúť. Prípadne ju môžete odomknúť kedykoľvek neskôr.
addvaultwizard.success.unlockNow=Odomknúť teraz

View File

@@ -70,9 +70,7 @@ addvault.new.readme.accessLocation.2=Ово је приступна локаци
addvault.new.readme.accessLocation.3=Било која датотека додата у ову партицију биће шифровани са Cryptomator. Можете да радите у њој баш као у било којој другој партицији или директоријуму. Ово је само дешифрован преглед њеног садржаја, ваше датотеке остају шифроване на вашем тврдом диску све време.
addvault.new.readme.accessLocation.4=Слободно можете да обришете ову датотеку.
## Existing
addvaultwizard.existing.instruction=Изабери "masterkey.cryptomator" датотеку свог постојећег сефа.
addvaultwizard.existing.chooseBtn=Изабери…
addvaultwizard.existing.filePickerTitle=Изабери "Masterkey" датотеку
## Success
addvaultwizard.success.nextStepsInstructions=Додат је сеф "%s".\nМорате да откључате овај сеф да бисте приступили или додали садржај. Такође можете да га откључате касније у било ком тренутку.
addvaultwizard.success.unlockNow=Откључај сада

View File

@@ -70,9 +70,7 @@ addvault.new.readme.accessLocation.2=Ovo je pristupna lokacija vašeg sefa.
addvault.new.readme.accessLocation.3=Bilo koja datoteka dodata u ovu particiju biće šifrovana sa Cryptomator. Možete da radite u njoj baš kao i u bilo kojoj drugoj particiji ili direktorijumu. Ovo je samo dešifrovan pregled njenog sadržaja, vaše datoteke ostaju šifrovane na vašem tvrdom disku sve vreme.
addvault.new.readme.accessLocation.4=Slobodno možete da obrišete ovu datoteku.
## Existing
addvaultwizard.existing.instruction=Izaberi "masterkey.cryptomator" datoteku svog postojećeg sefa.
addvaultwizard.existing.chooseBtn=Izaberi…
addvaultwizard.existing.filePickerTitle=Izaberi "Masterkey" datoteku
## Success
addvaultwizard.success.nextStepsInstructions=Dodat je sef "%s".\nMorate da otključate ovaj sef da biste pristupili ili dodali sadržaj. Takođe možete da ga otključate kasnije u bilo kom trenutku.
addvaultwizard.success.unlockNow=Otključaj sada

View File

@@ -75,9 +75,7 @@ addvault.new.readme.accessLocation.2=Detta är ditt valvs åtkomstplats.
addvault.new.readme.accessLocation.3=Alla filer som läggs till denna volym kommer att krypteras av Cryptomator. Du kan arbeta med dem som i vilken annan enhet/mapp som helst. Detta är bara en dekrypterad vy av dess innehåll, dina filer förblir krypterade på din hårddisk hela tiden.
addvault.new.readme.accessLocation.4=Du kan ta bort denna fil.
## Existing
addvaultwizard.existing.instruction=Välj "masterkey.cryptomator" för ditt befintliga valv.
addvaultwizard.existing.chooseBtn=Välj…
addvaultwizard.existing.filePickerTitle=Välj Masterkey-fil
## Success
addvaultwizard.success.nextStepsInstructions=Lade till valv "%s".\nDu måste låsa upp detta valv för att komma åt eller lägga till innehåll. Du kan även låsa upp det vid ett senare tillfälle.
addvaultwizard.success.unlockNow=Lås upp nu

View File

@@ -75,9 +75,9 @@ addvault.new.readme.accessLocation.2=Burası kasanızın erişim konumudur.
addvault.new.readme.accessLocation.3=Bu birime eklenen tüm dosyalar Cryptomator tarafından şifrelenecektir. Başka herhangi bir sürücü/klasörde olduğu gibi üzerinde çalışabilirsiniz. Bu sadece içeriğinin şifresi çözülmüş bir görünümüdür, dosyalarınız her zaman sabit sürücünüzde şifrelenmiş halde kalır.
addvault.new.readme.accessLocation.4=Bu dosyayı silmeye çekinmeyin.
## Existing
addvaultwizard.existing.instruction=Varolan kasanızın "masterkey.cryptomator" dosyasını seçin.
addvaultwizard.existing.instruction=Mevcut kasanızın "vault.cryptomator" dosyasını seçin. Yalnızca "masterkey.cryptomator" adlı bir dosya varsa, bunun yerine onu seçin.
addvaultwizard.existing.chooseBtn=Seç…
addvaultwizard.existing.filePickerTitle=Masterkey Dosyasını Seç
addvaultwizard.existing.filePickerTitle=Kasa Dosyasını Seçin
## Success
addvaultwizard.success.nextStepsInstructions="%s" kasası eklendi.\nİçeriğe erişmek veya içerik eklemek için bu kasanın kilidini açmanız gerekir. Alternatif olarak, daha sonra herhangi bir zamanda kilidini açabilirsiniz.
addvaultwizard.success.unlockNow=Kilidi Şimdi Aç

View File

@@ -0,0 +1,88 @@
# Locale Specific CSS files such as CJK, RTL,...
# Generics
## Button
## Error
# Defaults
# Tray Menu
# Add Vault Wizard
## Welcome
## New
### Name
### Location
### Password
### Information
## Existing
## Success
# Remove Vault
# Change Password
# Forget Password
# Unlock
##
## Success
## Failure
### Invalid Mount Point
# Lock
## Force
## Failure
# Migration
## Start
## Run
## Success
## Missing file system capabilities
## Impossible
# Health Check
## Start
## Start Failure
## Check Selection
## Detail view
## Fix Application
# Preferences
## General
## Volume
## Updates
## Contribution
#<-- Add entries for donations and code/translation/documentation contribution -->
## About
# Vault Statistics
## Read
## Write
# Main Window
## Drag 'n' Drop
## Vault List
## Vault Detail
### Welcome
### Locked
### Unlocked
### Missing
### Needs Migration
### Error
# Wrong File Alert
# Vault Options
## General
## Mount
## Master Key
# Recovery Key
# New Password
# Quit

View File

@@ -75,17 +75,17 @@ addvault.new.readme.accessLocation.2=这是您的保险库的访问路径。
addvault.new.readme.accessLocation.3=任何添加到此卷的文件都将被 Cryptomator 加密。您可以像在一般磁盘/文件夹上那样操作它。 这只是对其内容的解密查看,您的文件会在硬盘上一直保持加密。
addvault.new.readme.accessLocation.4=您可以随时删除此文件。
## Existing
addvaultwizard.existing.instruction=请选择现有保险库中的 "masterkey.cryptomator" 文件
addvaultwizard.existing.instruction=请选择现有保险库中的“vault.cryptomator”文件。如果只有一个名为“masterkey.cryptomator”的文件,则改为选择该文件。
addvaultwizard.existing.chooseBtn=选择...
addvaultwizard.existing.filePickerTitle=选择 Masterkey 文件
addvaultwizard.existing.filePickerTitle=选择保险库对应文件
## Success
addvaultwizard.success.nextStepsInstructions=已添加保险库 "%s"\n您需要先解锁此保险库才能访问或添加内容。或者您可以在稍后任何时候再解锁它
addvaultwizard.success.unlockNow=立即解锁
# Remove Vault
removeVault.title=除保险库
removeVault.title=除保险库
removeVault.information=这将只会使 Cryptomator 忘记这个保险库,您可以稍后再添加它。任何加密的文件不会从您的硬盘中删除。
removeVault.confirmBtn=除保险库
removeVault.confirmBtn=除保险库
# Change Password
changepassword.title=更改密码
@@ -188,8 +188,8 @@ preferences.title=首选项
preferences.general=常规​​​​​
preferences.general.theme=界面外观
preferences.general.theme.automatic=自动
preferences.general.theme.light=
preferences.general.theme.dark=
preferences.general.theme.light=
preferences.general.theme.dark=
preferences.general.unlockThemes=解锁暗黑模式
preferences.general.showMinimizeButton=显示最小化按钮
preferences.general.showTrayIcon=显示托盘图标 (需重启)
@@ -264,7 +264,7 @@ main.dropZone.dropVault=添加此保险库
main.dropZone.unknownDragboardContent=如果您想要添加一个保险库,将其拖动到此窗口
## Vault List
main.vaultlist.emptyList.onboardingInstruction=点击此处添加一个保险库
main.vaultlist.contextMenu.remove=除…
main.vaultlist.contextMenu.remove=除…
main.vaultlist.contextMenu.lock=锁定
main.vaultlist.contextMenu.unlock=解锁…
main.vaultlist.contextMenu.unlockNow=立即解锁
@@ -298,7 +298,7 @@ main.vaultDetail.missing.remove=从保险库列表中移除...
main.vaultDetail.missing.changeLocation=更改保险库位置…
### Needs Migration
main.vaultDetail.migrateButton=升级保险库
main.vaultDetail.migratePrompt=您的保险库需要升级到新格式,然后才能访问
main.vaultDetail.migratePrompt=您的保险库需要升级到新格式后才能访问
### Error
main.vaultDetail.error.info=从磁盘加载保险库时发生错误
main.vaultDetail.error.reload=重新加载

View File

@@ -13,6 +13,11 @@ generic.button.done=完成
generic.button.next=繼續
generic.button.print=列印
## Error
generic.error.title=錯誤:%s
generic.error.instruction=糟糕Cryptomator 發生了錯誤。您可以嘗試查找該錯誤的現有解決方案,如果是新錯誤,請隨時向我們報告。
generic.error.hyperlink.lookup=查找該錯誤
generic.error.hyperlink.report=報告這個錯誤
generic.error.technicalDetails=詳情:
# Defaults
defaults.vault.vaultName=加密檔案庫
@@ -70,9 +75,9 @@ addvault.new.readme.accessLocation.2=這是您加密檔案庫的存取位置。
addvault.new.readme.accessLocation.3=所有被加進這個磁區的檔案都將被 Cryptomator 加密。你可以把它當做磁碟或資料夾使用。這裡式顯示出解密後內容,您的檔案總是以被加密的狀態儲存在磁碟中。
addvault.new.readme.accessLocation.4=您可以放心移除這個檔案。
## Existing
addvaultwizard.existing.instruction=請選取您現有加密檔案庫的 "masterkey.cryptomator" 檔案。
addvaultwizard.existing.instruction=請選擇現有保險庫中名為「vault.cryptomator」的檔案。如果只有一個名為「masterkey.cryptomator」的檔案,則選擇該檔案。
addvaultwizard.existing.chooseBtn=選取
addvaultwizard.existing.filePickerTitle=選擇主金鑰檔案
addvaultwizard.existing.filePickerTitle=選擇保險庫對應檔案
## Success
addvaultwizard.success.nextStepsInstructions=已加入加密檔案庫 "%s"。您需要將這個加密檔案庫解鎖以存取內容,或是您也可以之後再解鎖。
addvaultwizard.success.unlockNow=立即解鎖
@@ -295,6 +300,9 @@ main.vaultDetail.missing.changeLocation=更改加密檔案庫位置…
main.vaultDetail.migrateButton=升級加密檔案庫
main.vaultDetail.migratePrompt=您必須先更新加密檔案庫才能存取內容
### Error
main.vaultDetail.error.info=從磁盤加載保管庫時發生錯誤。
main.vaultDetail.error.reload=重新載入
main.vaultDetail.error.windowTitle=載入加密檔案庫時出錯
# Wrong File Alert
wrongFileAlert.title=如何加密檔案

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 749 B

View File

@@ -1,59 +1,119 @@
package org.cryptomator.common;
import com.google.common.base.CharMatcher;
import com.google.common.base.Splitter;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.converter.ConvertWith;
import org.junit.jupiter.params.converter.SimpleArgumentConverter;
import org.junit.jupiter.params.provider.CsvSource;
import org.mockito.Mockito;
public class ErrorCodeTest {
private static ErrorCode codeCaughtFrom(RunnableThrowingException<RuntimeException> runnable) {
try {
runnable.run();
throw new IllegalStateException("should not reach this point");
} catch (RuntimeException e) {
return ErrorCode.of(e);
}
}
private final StackTraceElement foo = new StackTraceElement("ErrorCodeTest", "foo", null, 0);
private final StackTraceElement bar = new StackTraceElement("ErrorCodeTest", "bar", null, 0);
private final StackTraceElement baz = new StackTraceElement("ErrorCodeTest", "baz", null, 0);
private final Exception fooException = Mockito.mock(NullPointerException.class, "fooException");
@Test
@DisplayName("same exception leads to same error code")
public void testDifferentErrorCodes() {
var code1 = codeCaughtFrom(this::throwNpe);
var code2 = codeCaughtFrom(this::throwNpe);
public void testDeterministicErrorCode() {
Mockito.doReturn(new StackTraceElement[]{foo, bar, baz}).when(fooException).getStackTrace();
var code1 = ErrorCode.of(fooException);
var code2 = ErrorCode.of(fooException);
Assertions.assertEquals(code1.toString(), code2.toString());
}
private void throwNpe() {
throwException(new NullPointerException());
@Test
@DisplayName("three error code segments change independently")
public void testErrorCodeSegments() {
Exception fooBarException = Mockito.mock(IndexOutOfBoundsException.class, "fooBarException");
Mockito.doReturn(new StackTraceElement[]{foo, foo, foo}).when(fooBarException).getStackTrace();
Mockito.doReturn(fooException).when(fooBarException).getCause();
Mockito.doReturn(new StackTraceElement[]{bar, bar, bar, foo, foo, foo}).when(fooException).getStackTrace();
var code = ErrorCode.of(fooBarException);
Assertions.assertNotEquals(code.throwableCode(), code.rootCauseCode());
Assertions.assertNotEquals(code.rootCauseCode(), code.methodCode());
}
private void throwException(RuntimeException e) throws RuntimeException {
throw e;
@DisplayName("commonSuffixLength()")
@ParameterizedTest
@CsvSource({"1 2 3, 1 2 3, 3", "1 2 3, 0 2 3, 2", "1 2 3 4, 3 4, 2", "1 2 3 4, 5 6, 0", "1 2 3 4 5 6,, 0",})
public void commonSuffixLength1(@ConvertWith(IntegerArrayConverter.class) Integer[] set, @ConvertWith(IntegerArrayConverter.class) Integer[] subset, int expected) {
var result = ErrorCode.commonSuffixLength(set, subset);
Assertions.assertEquals(expected, result);
}
@DisplayName("when different cause but same root cause")
@DisplayName("commonSuffixLength() with too short array")
@ParameterizedTest
@CsvSource({"1 2, 3 4 5 6", ",1 2 3 4 5 6",})
public void commonSuffixLength2(@ConvertWith(IntegerArrayConverter.class) Integer[] set, @ConvertWith(IntegerArrayConverter.class) Integer[] subset) {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
ErrorCode.commonSuffixLength(set, subset);
});
}
@Test
@DisplayName("countTopmostFrames() with partially overlapping suffix")
public void testCountTopmostFrames1() {
var allFrames = new StackTraceElement[]{foo, bar, baz, bar, foo};
var bottomFrames = new StackTraceElement[]{baz, bar, foo};
int result = ErrorCode.countTopmostFrames(allFrames, bottomFrames);
Assertions.assertEquals(2, result);
}
@Test
@DisplayName("countTopmostFrames() without overlapping suffix")
public void testCountTopmostFrames2() {
var allFrames = new StackTraceElement[]{foo, foo, foo};
var bottomFrames = new StackTraceElement[]{bar, bar, bar};
int result = ErrorCode.countTopmostFrames(allFrames, bottomFrames);
Assertions.assertEquals(3, result);
}
@Test
@DisplayName("countUniqueFrames() fully overlapping")
public void testCountUniqueFrames3() {
var allFrames = new StackTraceElement[]{foo, bar, baz};
var bottomFrames = new StackTraceElement[]{foo, bar, baz};
int result = ErrorCode.countTopmostFrames(allFrames, bottomFrames);
Assertions.assertEquals(0, result);
}
@DisplayName("when different exception with same root cause")
@Nested
public class SameRootCauseDifferentCause {
public class DifferentExceptionWithSameRootCause {
private final ErrorCode code1 = codeCaughtFrom(this::foo);
private final ErrorCode code2 = codeCaughtFrom(this::bar);
private final Exception fooBarException = Mockito.mock(IllegalArgumentException.class, "fooBarException");
private final Exception fooBazException = Mockito.mock(IndexOutOfBoundsException.class, "fooBazException");
private void foo() throws IllegalArgumentException {
try {
throwNpe();
} catch (NullPointerException e) {
throw new IllegalArgumentException(e);
}
}
private ErrorCode code1;
private ErrorCode code2;
private void bar() throws IllegalStateException {
try {
throwNpe();
} catch (NullPointerException e) {
throw new IllegalStateException(e);
}
@BeforeEach
public void setup() {
Mockito.doReturn(new StackTraceElement[]{baz, bar, foo}).when(fooException).getStackTrace();
Mockito.doReturn(new StackTraceElement[]{foo}).when(fooBarException).getStackTrace();
Mockito.doReturn(new StackTraceElement[]{foo}).when(fooBazException).getStackTrace();
Mockito.doReturn(fooException).when(fooBarException).getCause();
Mockito.doReturn(fooException).when(fooBazException).getCause();
this.code1 = ErrorCode.of(fooBarException);
this.code2 = ErrorCode.of(fooBazException);
}
@Test
@@ -82,23 +142,21 @@ public class ErrorCodeTest {
}
@DisplayName("when same cause but different call stack")
@DisplayName("when same exception with different call stacks")
@Nested
public class SameCauseDifferentCallStack {
public class SameExceptionDifferentCallStack {
private final ErrorCode code1 = codeCaughtFrom(this::foo);
private final ErrorCode code2 = codeCaughtFrom(this::bar);
private final Exception barException = Mockito.mock(NullPointerException.class, "barException");
private void foo() throws NullPointerException {
try {
throwNpe();
} catch (NullPointerException e) {
throw new IllegalArgumentException(e);
}
}
private ErrorCode code1;
private ErrorCode code2;
private void bar() throws NullPointerException {
foo();
@BeforeEach
public void setup() {
Mockito.doReturn(new StackTraceElement[]{foo, bar, baz}).when(fooException).getStackTrace();
Mockito.doReturn(new StackTraceElement[]{foo, baz, bar}).when(barException).getStackTrace();
this.code1 = ErrorCode.of(fooException);
this.code2 = ErrorCode.of(barException);
}
@Test
@@ -114,9 +172,9 @@ public class ErrorCodeTest {
}
@Test
@DisplayName("rootCauseCodes are equal")
@DisplayName("rootCauseCodes are different")
public void testSameRootCauseCodes() {
Assertions.assertEquals(code1.rootCauseCode(), code2.rootCauseCode());
Assertions.assertNotEquals(code1.rootCauseCode(), code2.rootCauseCode());
}
@Test
@@ -127,4 +185,19 @@ public class ErrorCodeTest {
}
public static class IntegerArrayConverter extends SimpleArgumentConverter {
@Override
protected Integer[] convert(Object source, Class<?> targetType) {
if (source == null) {
return new Integer[0];
} else if (source instanceof String s && Integer[].class.isAssignableFrom(targetType)) {
return Splitter.on(CharMatcher.inRange('0', '9').negate()).splitToStream(s).map(Integer::valueOf).toArray(Integer[]::new);
} else {
throw new IllegalArgumentException("Conversion from " + source.getClass() + " to " + targetType + " not supported.");
}
}
}
}