mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-09-25 09:24:14 +00:00
Compare commits
14
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d2cd9c5a5d | ||
|
|
995ece19ae | ||
|
|
99182674ef | ||
|
|
c05ff5d9ec | ||
|
|
7bc231023f | ||
|
|
3244b66c1c | ||
|
|
b72982edd8 | ||
|
|
a1db1272a9 | ||
|
|
e67f235887 | ||
|
|
641066ea07 | ||
|
|
9f035b7d37 | ||
|
|
92b512b719 | ||
|
|
1102f73680 | ||
|
|
cf9663fc26 |
@@ -126,9 +126,6 @@ jobs:
|
|||||||
--no-man-pages
|
--no-man-pages
|
||||||
--strip-debug
|
--strip-debug
|
||||||
--compress zip-0
|
--compress zip-0
|
||||||
- name: Change win-console flag if debug is active
|
|
||||||
if: ${{ inputs.isDebug }}
|
|
||||||
run: echo "WIN_CONSOLE_FLAG=--win-console" >> $GITHUB_ENV
|
|
||||||
- name: Run jpackage
|
- name: Run jpackage
|
||||||
run: >
|
run: >
|
||||||
${JAVA_HOME}/bin/jpackage
|
${JAVA_HOME}/bin/jpackage
|
||||||
@@ -166,7 +163,7 @@ jobs:
|
|||||||
--java-options "-Djavafx.verbose=${{ inputs.isDebug }}"
|
--java-options "-Djavafx.verbose=${{ inputs.isDebug }}"
|
||||||
--resource-dir dist/win/resources
|
--resource-dir dist/win/resources
|
||||||
--icon dist/win/resources/Cryptomator.ico
|
--icon dist/win/resources/Cryptomator.ico
|
||||||
${WIN_CONSOLE_FLAG}
|
--add-launcher "Debug_Cryptomator=dist/win/debug-launcher.properties"
|
||||||
- name: Patch Application Directory
|
- name: Patch Application Directory
|
||||||
run: |
|
run: |
|
||||||
cp dist/win/contrib/* appdir/Cryptomator
|
cp dist/win/contrib/* appdir/Cryptomator
|
||||||
@@ -181,7 +178,9 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
- name: Fix permissions
|
- name: Fix permissions
|
||||||
run: attrib -r appdir/Cryptomator/Cryptomator.exe
|
run: |
|
||||||
|
attrib -r appdir/Cryptomator/Cryptomator.exe
|
||||||
|
attrib -r appdir/Cryptomator/Debug_Cryptomator.exe
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
- name: Extract jars with DLLs for Codesigning
|
- name: Extract jars with DLLs for Codesigning
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
|
|||||||
@@ -83,9 +83,6 @@
|
|||||||
</content_rating>
|
</content_rating>
|
||||||
|
|
||||||
<releases>
|
<releases>
|
||||||
<release date="2025-07-08" version="1.17.1">
|
|
||||||
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.17.1</url>
|
|
||||||
</release>
|
|
||||||
<release date="2025-06-24" version="1.17.0">
|
<release date="2025-06-24" version="1.17.0">
|
||||||
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.17.0</url>
|
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.17.0</url>
|
||||||
</release>
|
</release>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ installer
|
|||||||
*.wixobj
|
*.wixobj
|
||||||
*.pdb
|
*.pdb
|
||||||
*.msi
|
*.msi
|
||||||
|
*Debug.properties
|
||||||
*.exe
|
*.exe
|
||||||
*.jmod
|
*.jmod
|
||||||
resources/jfxJmods.zip
|
resources/jfxJmods.zip
|
||||||
|
|||||||
Vendored
+81
-21
@@ -49,6 +49,7 @@ $buildDir = Split-Path -Parent $PSCommandPath
|
|||||||
$version = $(mvn -f $buildDir/../../pom.xml help:evaluate -Dexpression="project.version" -q -DforceStdout)
|
$version = $(mvn -f $buildDir/../../pom.xml help:evaluate -Dexpression="project.version" -q -DforceStdout)
|
||||||
$semVerNo = $version -replace '(\d+\.\d+\.\d+).*','$1'
|
$semVerNo = $version -replace '(\d+\.\d+\.\d+).*','$1'
|
||||||
$revisionNo = $(git rev-list --count HEAD)
|
$revisionNo = $(git rev-list --count HEAD)
|
||||||
|
$signingCertThumbprint = "TODO"
|
||||||
|
|
||||||
Write-Output "`$version=$version"
|
Write-Output "`$version=$version"
|
||||||
Write-Output "`$semVerNo=$semVerNo"
|
Write-Output "`$semVerNo=$semVerNo"
|
||||||
@@ -117,7 +118,7 @@ switch ($archName) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
## create custom runtime
|
## create custom runtime
|
||||||
### check for JEP 493
|
### adjust for JEP 493
|
||||||
if ((& "$Env:JAVA_HOME\bin\jlink" --help | Select-String -Pattern "Linking from run-time image enabled" -SimpleMatch | Measure-Object).Count -eq 0 ) {
|
if ((& "$Env:JAVA_HOME\bin\jlink" --help | Select-String -Pattern "Linking from run-time image enabled" -SimpleMatch | Measure-Object).Count -eq 0 ) {
|
||||||
$jmodPaths="$Env:JAVA_HOME/jmods;" + $jmodPaths;
|
$jmodPaths="$Env:JAVA_HOME/jmods;" + $jmodPaths;
|
||||||
}
|
}
|
||||||
@@ -139,6 +140,29 @@ if ($clean -and (Test-Path -Path $appPath)) {
|
|||||||
Remove-Item -Path $appPath -Force -Recurse
|
Remove-Item -Path $appPath -Force -Recurse
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$javaOptions = @(
|
||||||
|
"--java-options", "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.win,org.cryptomator.integrations.win"
|
||||||
|
"--java-options", "-Xss5m"
|
||||||
|
"--java-options", "-Xmx256m"
|
||||||
|
"--java-options", "-Dcryptomator.appVersion=`"$semVerNo`""
|
||||||
|
"--java-options", "-Dfile.encoding=`"utf-8`""
|
||||||
|
"--java-options", "-Djava.net.useSystemProxies=true"
|
||||||
|
"--java-options", "-Dcryptomator.logDir=`"@{localappdata}/$AppName`""
|
||||||
|
"--java-options", "-Dcryptomator.pluginDir=`"@{appdata}/$AppName/Plugins`""
|
||||||
|
"--java-options", "-Dcryptomator.settingsPath=`"@{appdata}/$AppName/settings.json;@{userhome}/AppData/Roaming/$AppName/settings.json`""
|
||||||
|
"--java-options", "-Dcryptomator.ipcSocketPath=`"@{localappdata}/$AppName/ipc.socket`""
|
||||||
|
"--java-options", "-Dcryptomator.p12Path=`"@{appdata}/$AppName/key.p12;@{userhome}/AppData/Roaming/$AppName/key.p12`""
|
||||||
|
"--java-options", "-Dcryptomator.mountPointsDir=`"@{userhome}/$AppName`""
|
||||||
|
"--java-options", "-Dcryptomator.loopbackAlias=`"$LoopbackAlias`""
|
||||||
|
"--java-options", "-Dcryptomator.integrationsWin.autoStartShellLinkName=`"$AppName`""
|
||||||
|
"--java-options", "-Dcryptomator.integrationsWin.keychainPaths=`"@{appdata}/$AppName/keychain.json;@{userhome}/AppData/Roaming/$AppName/keychain.json`""
|
||||||
|
"--java-options", "-Dcryptomator.integrationsWin.windowsHelloKeychainPaths=`"@{appdata}/$AppName/windowsHelloKeychain.json`""
|
||||||
|
"--java-options", "-Dcryptomator.showTrayIcon=true"
|
||||||
|
"--java-options", "-Dcryptomator.buildNumber=`"msi-$revisionNo`""
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# create app dir
|
# create app dir
|
||||||
& "$Env:JAVA_HOME\bin\jpackage" `
|
& "$Env:JAVA_HOME\bin\jpackage" `
|
||||||
--verbose `
|
--verbose `
|
||||||
@@ -151,28 +175,16 @@ if ($clean -and (Test-Path -Path $appPath)) {
|
|||||||
--name $AppName `
|
--name $AppName `
|
||||||
--vendor $Vendor `
|
--vendor $Vendor `
|
||||||
--copyright $copyright `
|
--copyright $copyright `
|
||||||
--java-options "--enable-preview" `
|
|
||||||
--java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.win,org.cryptomator.integrations.win" `
|
|
||||||
--java-options "-Xss5m" `
|
|
||||||
--java-options "-Xmx256m" `
|
|
||||||
--java-options "-Dcryptomator.appVersion=`"$semVerNo`"" `
|
|
||||||
--app-version "$semVerNo.$revisionNo" `
|
--app-version "$semVerNo.$revisionNo" `
|
||||||
--java-options "-Dfile.encoding=`"utf-8`"" `
|
|
||||||
--java-options "-Djava.net.useSystemProxies=true" `
|
|
||||||
--java-options "-Dcryptomator.logDir=`"@{localappdata}/$AppName`"" `
|
|
||||||
--java-options "-Dcryptomator.pluginDir=`"@{appdata}/$AppName/Plugins`"" `
|
|
||||||
--java-options "-Dcryptomator.settingsPath=`"@{appdata}/$AppName/settings.json;@{userhome}/AppData/Roaming/$AppName/settings.json`"" `
|
|
||||||
--java-options "-Dcryptomator.ipcSocketPath=`"@{localappdata}/$AppName/ipc.socket`"" `
|
|
||||||
--java-options "-Dcryptomator.p12Path=`"@{appdata}/$AppName/key.p12;@{userhome}/AppData/Roaming/$AppName/key.p12`"" `
|
|
||||||
--java-options "-Dcryptomator.mountPointsDir=`"@{userhome}/$AppName`"" `
|
|
||||||
--java-options "-Dcryptomator.loopbackAlias=`"$LoopbackAlias`"" `
|
|
||||||
--java-options "-Dcryptomator.integrationsWin.autoStartShellLinkName=`"$AppName`"" `
|
|
||||||
--java-options "-Dcryptomator.integrationsWin.keychainPaths=`"@{appdata}/$AppName/keychain.json;@{userhome}/AppData/Roaming/$AppName/keychain.json`"" `
|
|
||||||
--java-options "-Dcryptomator.integrationsWin.windowsHelloKeychainPaths=`"@{appdata}/$AppName/windowsHelloKeychain.json`"" `
|
|
||||||
--java-options "-Dcryptomator.showTrayIcon=true" `
|
|
||||||
--java-options "-Dcryptomator.buildNumber=`"msi-$revisionNo`"" `
|
|
||||||
--resource-dir resources `
|
--resource-dir resources `
|
||||||
--icon resources/$AppName.ico
|
--icon resources/$AppName.ico `
|
||||||
|
--add-launcher "Debug_${AppName}=$buildDir\debug-launcher.properties" `
|
||||||
|
@javaOptions
|
||||||
|
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Error "jpackage Appimage failed with exit code $LASTEXITCODE"
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
#Create RTF license for msi
|
#Create RTF license for msi
|
||||||
&mvn -B -f $buildDir/../../pom.xml license:add-third-party "-Djavafx.platform=win" `
|
&mvn -B -f $buildDir/../../pom.xml license:add-third-party "-Djavafx.platform=win" `
|
||||||
@@ -187,6 +199,7 @@ if ($clean -and (Test-Path -Path $appPath)) {
|
|||||||
# patch app dir
|
# patch app dir
|
||||||
Copy-Item "contrib\*" -Destination "$AppName"
|
Copy-Item "contrib\*" -Destination "$AppName"
|
||||||
attrib -r "$AppName\$AppName.exe"
|
attrib -r "$AppName\$AppName.exe"
|
||||||
|
attrib -r "$AppName\Debug_${AppName}.exe"
|
||||||
# patch batch script to set hostfile
|
# patch batch script to set hostfile
|
||||||
$webDAVPatcher = "$AppName\patchWebDAV.bat"
|
$webDAVPatcher = "$AppName\patchWebDAV.bat"
|
||||||
try {
|
try {
|
||||||
@@ -196,6 +209,53 @@ try {
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# sign app dir
|
||||||
|
## extract
|
||||||
|
Add-Type -AssemblyName "System.io.compression.filesystem"
|
||||||
|
$jarFolder = Resolve-Path "$AppName\app\mods"
|
||||||
|
$jarExtractDir = New-Item -Path "$AppName\jar-extract" -ItemType Directory
|
||||||
|
Get-ChildItem -Path $jarFolder -Filter "*.jar" | ForEach-Object {
|
||||||
|
$jar = [Io.compression.zipfile]::OpenRead($_.FullName)
|
||||||
|
if (@($jar.Entries | Where-Object {
|
||||||
|
$_.Name.ToString().EndsWith(".dll")} | Select-Object -First 1).Count -gt 0) {
|
||||||
|
#jars containing dlls extract
|
||||||
|
Set-Location $jarExtractDir
|
||||||
|
Expand-Archive -Path $_.FullName
|
||||||
|
|
||||||
|
}
|
||||||
|
$jar.Dispose()
|
||||||
|
}
|
||||||
|
Set-Location $buildDir
|
||||||
|
## Extract wixhelper.dll for Codesigning #see https://github.com/cryptomator/cryptomator/issues/3130
|
||||||
|
if($jmodPaths -like "${env:JAVA_HOME}\jmods") {
|
||||||
|
$wixHelperDir = New-Item -Path ${AppName}/jpackage-jmod -ItemType Directory
|
||||||
|
& ${env:JAVA_HOME}\bin\jmod.exe extract --dir $wixHelperDir "${env:JAVA_HOME}\jmods\jdk.jpackage.jmod"
|
||||||
|
Get-ChildItem -Recurse -Path "$wixHelperDir" -File wixhelper.dll | Select-Object -Last 1 | Copy-Item -Destination "${AppName}/"
|
||||||
|
}
|
||||||
|
|
||||||
|
## prepare signtool
|
||||||
|
Write-Output "Signing files in app dir $AppName..."
|
||||||
|
$signTool = Get-ChildItem -Path "${Env:ProgramFiles(x86)}\Windows Kits\10\bin\" -Recurse -Filter "signtool.exe" | Where-Object FullName -like "*${archName}*" | Sort-Object LastWriteTime -Descending | Select-Object -First 1
|
||||||
|
if ($null -eq $signTool) {
|
||||||
|
Write-Error "Unable to find signtool.exe in ${Env:ProgramFiles(x86)}\Windows Kits\10\bin\. Please ensure Windows SDK is installed."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
Write-Output "Using signtool: $($signTool.FullName)"
|
||||||
|
Write-Output "Using signing certificate with thumbprint: $signingCertThumbprint"
|
||||||
|
## sign files inside app dir
|
||||||
|
$filesToSign = Get-ChildItem -Path $AppName -Recurse -File -Include "*.exe","*.dll","*.sys"
|
||||||
|
|
||||||
|
foreach ($file in $filesToSign) {
|
||||||
|
& $signTool sign /as /sha1 $signingCertThumbprint /tr "http://timestamp.digicert.com" /td SHA256 /fd SHA256 /d "Cryptomator" $file.FullName
|
||||||
|
if( $? -eq $false) {
|
||||||
|
Write-Error "Failed to sign file: $($file.FullName)"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#TODO: Sign wixhelper.dll with signtool.exe
|
||||||
|
#TODO: patch jar files with signed dlls
|
||||||
|
|
||||||
# create .msi
|
# create .msi
|
||||||
$Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources"
|
$Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources"
|
||||||
$Env:JP_WIXHELPER_DIR = "."
|
$Env:JP_WIXHELPER_DIR = "."
|
||||||
|
|||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
win-console=true
|
||||||
@@ -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.17.1</version>
|
<version>1.18.0-SNAPSHOT</version>
|
||||||
<name>Cryptomator Desktop App</name>
|
<name>Cryptomator Desktop App</name>
|
||||||
|
|
||||||
<organization>
|
<organization>
|
||||||
|
|||||||
@@ -25,8 +25,6 @@ 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.nio.file.Path;
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@@ -77,7 +75,6 @@ public class Settings {
|
|||||||
public final BooleanProperty checkForUpdates;
|
public final BooleanProperty checkForUpdates;
|
||||||
public final ObjectProperty<Instant> lastUpdateCheckReminder;
|
public final ObjectProperty<Instant> lastUpdateCheckReminder;
|
||||||
public final ObjectProperty<Instant> lastSuccessfulUpdateCheck;
|
public final ObjectProperty<Instant> lastSuccessfulUpdateCheck;
|
||||||
public final ObjectProperty<Path> previouslyUsedVaultDirectory;
|
|
||||||
|
|
||||||
private Consumer<Settings> saveCmd;
|
private Consumer<Settings> saveCmd;
|
||||||
|
|
||||||
@@ -117,7 +114,6 @@ public class Settings {
|
|||||||
this.checkForUpdates = new SimpleBooleanProperty(this, "checkForUpdates", json.checkForUpdatesEnabled);
|
this.checkForUpdates = new SimpleBooleanProperty(this, "checkForUpdates", json.checkForUpdatesEnabled);
|
||||||
this.lastUpdateCheckReminder = new SimpleObjectProperty<>(this, "lastUpdateCheckReminder", json.lastReminderForUpdateCheck);
|
this.lastUpdateCheckReminder = new SimpleObjectProperty<>(this, "lastUpdateCheckReminder", json.lastReminderForUpdateCheck);
|
||||||
this.lastSuccessfulUpdateCheck = new SimpleObjectProperty<>(this, "lastSuccessfulUpdateCheck", json.lastSuccessfulUpdateCheck);
|
this.lastSuccessfulUpdateCheck = new SimpleObjectProperty<>(this, "lastSuccessfulUpdateCheck", json.lastSuccessfulUpdateCheck);
|
||||||
this.previouslyUsedVaultDirectory = new SimpleObjectProperty<>(this, "previouslyUsedVaultDirectory", json.previouslyUsedVaultDirectory);
|
|
||||||
|
|
||||||
this.directories.addAll(json.directories.stream().map(VaultSettings::new).toList());
|
this.directories.addAll(json.directories.stream().map(VaultSettings::new).toList());
|
||||||
|
|
||||||
@@ -147,7 +143,6 @@ public class Settings {
|
|||||||
checkForUpdates.addListener(this::somethingChanged);
|
checkForUpdates.addListener(this::somethingChanged);
|
||||||
lastUpdateCheckReminder.addListener(this::somethingChanged);
|
lastUpdateCheckReminder.addListener(this::somethingChanged);
|
||||||
lastSuccessfulUpdateCheck.addListener(this::somethingChanged);
|
lastSuccessfulUpdateCheck.addListener(this::somethingChanged);
|
||||||
previouslyUsedVaultDirectory.addListener(this::somethingChanged);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
@@ -209,7 +204,6 @@ public class Settings {
|
|||||||
json.checkForUpdatesEnabled = checkForUpdates.get();
|
json.checkForUpdatesEnabled = checkForUpdates.get();
|
||||||
json.lastReminderForUpdateCheck = lastUpdateCheckReminder.get();
|
json.lastReminderForUpdateCheck = lastUpdateCheckReminder.get();
|
||||||
json.lastSuccessfulUpdateCheck = lastSuccessfulUpdateCheck.get();
|
json.lastSuccessfulUpdateCheck = lastSuccessfulUpdateCheck.get();
|
||||||
json.previouslyUsedVaultDirectory = previouslyUsedVaultDirectory.get();
|
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ 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.nio.file.Path;
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -93,7 +92,4 @@ class SettingsJson {
|
|||||||
|
|
||||||
@JsonProperty("quickAccessService")
|
@JsonProperty("quickAccessService")
|
||||||
String quickAccessService = Settings.DEFAULT_QUICKACCESS_SERVICE;
|
String quickAccessService = Settings.DEFAULT_QUICKACCESS_SERVICE;
|
||||||
|
|
||||||
@JsonProperty("previouslyUsedVaultDirectory")
|
|
||||||
Path previouslyUsedVaultDirectory;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,13 +9,13 @@
|
|||||||
package org.cryptomator.common.vaults;
|
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.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.cryptomator.integrations.mount.MountService;
|
||||||
import org.cryptomator.ui.keyloading.masterkeyfile.MasterkeyFileLoadingStrategy;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -125,7 +125,7 @@ public class VaultListManager {
|
|||||||
vaultSettings.lastKnownKeyLoader.set(keyIdScheme);
|
vaultSettings.lastKnownKeyLoader.set(keyIdScheme);
|
||||||
}
|
}
|
||||||
} else if (vaultState == NEEDS_MIGRATION) {
|
} else if (vaultState == NEEDS_MIGRATION) {
|
||||||
vaultSettings.lastKnownKeyLoader.set(MasterkeyFileLoadingStrategy.SCHEME);
|
vaultSettings.lastKnownKeyLoader.set(Constants.DEFAULT_KEY_ID.toString());
|
||||||
}
|
}
|
||||||
return vaultComponentFactory.create(vaultSettings, wrapper, vaultState, null).vault();
|
return vaultComponentFactory.create(vaultSettings, wrapper, vaultState, null).vault();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|||||||
+1
-1
@@ -26,7 +26,7 @@ public class CreateNewVaultExpertSettingsController implements FxController {
|
|||||||
|
|
||||||
public static final int MAX_SHORTENING_THRESHOLD = 220;
|
public static final int MAX_SHORTENING_THRESHOLD = 220;
|
||||||
public static final int MIN_SHORTENING_THRESHOLD = 36;
|
public static final int MIN_SHORTENING_THRESHOLD = 36;
|
||||||
private static final String DOCS_NAME_SHORTENING_URL = "https://docs.cryptomator.org/security/vault/#name-shortening";
|
private static final String DOCS_NAME_SHORTENING_URL = "https://docs.cryptomator.org/security/architecture/#name-shortening";
|
||||||
|
|
||||||
private final Stage window;
|
private final Stage window;
|
||||||
private final Lazy<Application> application;
|
private final Lazy<Application> application;
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import dagger.Lazy;
|
|||||||
import org.cryptomator.common.ObservableUtil;
|
import org.cryptomator.common.ObservableUtil;
|
||||||
import org.cryptomator.common.locationpresets.LocationPreset;
|
import org.cryptomator.common.locationpresets.LocationPreset;
|
||||||
import org.cryptomator.common.locationpresets.LocationPresetsProvider;
|
import org.cryptomator.common.locationpresets.LocationPresetsProvider;
|
||||||
import org.cryptomator.common.settings.Settings;
|
|
||||||
import org.cryptomator.ui.common.FxController;
|
import org.cryptomator.ui.common.FxController;
|
||||||
import org.cryptomator.ui.common.FxmlFile;
|
import org.cryptomator.ui.common.FxmlFile;
|
||||||
import org.cryptomator.ui.common.FxmlScene;
|
import org.cryptomator.ui.common.FxmlScene;
|
||||||
@@ -39,7 +38,6 @@ 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.InvalidPathException;
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -66,7 +64,6 @@ public class CreateNewVaultLocationController implements FxController {
|
|||||||
private final BooleanProperty loadingPresetLocations = new SimpleBooleanProperty(false);
|
private final BooleanProperty loadingPresetLocations = new SimpleBooleanProperty(false);
|
||||||
private final ObservableList<Node> radioButtons;
|
private final ObservableList<Node> radioButtons;
|
||||||
private final ObservableList<Node> sortedRadioButtons;
|
private final ObservableList<Node> sortedRadioButtons;
|
||||||
private final Settings settings;
|
|
||||||
|
|
||||||
private Path customVaultPath = DEFAULT_CUSTOM_VAULT_PATH;
|
private Path customVaultPath = DEFAULT_CUSTOM_VAULT_PATH;
|
||||||
|
|
||||||
@@ -85,7 +82,6 @@ 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, //
|
||||||
Settings settings, //
|
|
||||||
ExecutorService backgroundExecutor, ResourceBundle resourceBundle) {
|
ExecutorService backgroundExecutor, ResourceBundle resourceBundle) {
|
||||||
this.window = window;
|
this.window = window;
|
||||||
this.chooseNameScene = chooseNameScene;
|
this.chooseNameScene = chooseNameScene;
|
||||||
@@ -100,18 +96,6 @@ public class CreateNewVaultLocationController implements FxController {
|
|||||||
this.usePresetPath = new SimpleBooleanProperty();
|
this.usePresetPath = new SimpleBooleanProperty();
|
||||||
this.radioButtons = FXCollections.observableArrayList();
|
this.radioButtons = FXCollections.observableArrayList();
|
||||||
this.sortedRadioButtons = radioButtons.sorted(this::compareLocationPresets);
|
this.sortedRadioButtons = radioButtons.sorted(this::compareLocationPresets);
|
||||||
this.settings = settings;
|
|
||||||
|
|
||||||
Path previouslyUsedDirectory = settings.previouslyUsedVaultDirectory.get();
|
|
||||||
if (previouslyUsedDirectory != null) {
|
|
||||||
try {
|
|
||||||
if (Files.exists(previouslyUsedDirectory) && Files.isDirectory(previouslyUsedDirectory) && isActuallyWritable(previouslyUsedDirectory)) {
|
|
||||||
this.customVaultPath = previouslyUsedDirectory;
|
|
||||||
}
|
|
||||||
} catch (InvalidPathException | NullPointerException e) {
|
|
||||||
LOG.warn("Invalid previously used vault directory path: {}", previouslyUsedDirectory, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private VaultPathStatus validatePath(Path p) throws NullPointerException {
|
private VaultPathStatus validatePath(Path p) throws NullPointerException {
|
||||||
@@ -212,12 +196,6 @@ public class CreateNewVaultLocationController implements FxController {
|
|||||||
@FXML
|
@FXML
|
||||||
public void next() {
|
public void next() {
|
||||||
if (validVaultPath.getValue()) {
|
if (validVaultPath.getValue()) {
|
||||||
if (this.getVaultPath() != null) {
|
|
||||||
Path parentPath = this.getVaultPath().getParent();
|
|
||||||
if (parentPath != null) {
|
|
||||||
this.settings.previouslyUsedVaultDirectory.setValue(parentPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
window.setScene(chooseExpertSettingsScene.get());
|
window.setScene(chooseExpertSettingsScene.get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,16 +46,15 @@ public interface KeyLoadingStrategy extends MasterkeyLoader {
|
|||||||
/**
|
/**
|
||||||
* Determines whether the provided key loader scheme corresponds to a Masterkey File Vault.
|
* Determines whether the provided key loader scheme corresponds to a Masterkey File Vault.
|
||||||
* <p>
|
* <p>
|
||||||
* This method checks if the {@code keyLoader} parameter starts with the known Masterkey File Vault scheme
|
* This method checks if the {@code keyLoader} parameter matches the known Masterkey File Vault scheme
|
||||||
* {@link MasterkeyFileLoadingStrategy#SCHEME}.
|
* {@link MasterkeyFileLoadingStrategy#SCHEME}.
|
||||||
* This allows identifying not only exact matches but also variants or extended schemes based on the Masterkey scheme.
|
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param keyLoader A string representing the key loader scheme to be checked.
|
* @param keyLoader A string representing the key loader scheme to be checked.
|
||||||
* @return {@code true} if the given key loader scheme starts with the Masterkey File Vault scheme; {@code false} otherwise.
|
* @return {@code true} if the given key loader scheme represents a Masterkey File Vault; {@code false} otherwise.
|
||||||
*/
|
*/
|
||||||
static boolean isMasterkeyFileVault(String keyLoader) {
|
static boolean isMasterkeyFileVault(String keyLoader) {
|
||||||
return keyLoader.startsWith(MasterkeyFileLoadingStrategy.SCHEME);
|
return MasterkeyFileLoadingStrategy.SCHEME.equals(keyLoader);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public class ShareVaultController implements FxController {
|
|||||||
|
|
||||||
private static final String SCHEME_PREFIX = "hub+";
|
private static final String SCHEME_PREFIX = "hub+";
|
||||||
private static final String VISIT_HUB_URL = "https://cryptomator.org/hub/";
|
private static final String VISIT_HUB_URL = "https://cryptomator.org/hub/";
|
||||||
private static final String BEST_PRACTICES_URL = "https://docs.cryptomator.org/security/best-practices/#sharing-of-vaults";
|
private static final String BEST_PRACTICES_URL = "https://docs.cryptomator.org/en/latest/security/best-practices/#sharing-of-vaults";
|
||||||
|
|
||||||
private final Stage window;
|
private final Stage window;
|
||||||
private final Lazy<Application> application;
|
private final Lazy<Application> application;
|
||||||
|
|||||||
@@ -62,9 +62,9 @@ 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=أحرف لكن دون علامات (#, $, !, @...)
|
addvaultwizard.new.validCharacters.chars=أحرف الكلمات (أمثلة: a, ж, 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=الأرقام
|
addvaultwizard.new.validCharacters.numbers=الأعداد
|
||||||
addvaultwizard.new.validCharacters.dashes=ناقص (%s) أو شِرْطَةٌ سفلية (%s)
|
addvaultwizard.new.validCharacters.dashes=الشرطة (%s) أو الشرطة السفلية (%s)
|
||||||
### Expert Settings
|
### Expert Settings
|
||||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=تمكين إعدادات الخبراء
|
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=تمكين إعدادات الخبراء
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=أدخل قيمة بين 36 و 220 (الافتراضي 220)
|
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=أدخل قيمة بين 36 و 220 (الافتراضي 220)
|
||||||
@@ -319,7 +319,7 @@ 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=آخر فحص: %s
|
||||||
@@ -395,7 +395,6 @@ main.vaultlist.contextMenu.vaultoptions=إظهار خيارات المخزن
|
|||||||
main.vaultlist.contextMenu.reveal=اظهار القرص
|
main.vaultlist.contextMenu.reveal=اظهار القرص
|
||||||
main.vaultlist.addVaultBtn.menuItemNew=إنشاء مخزن جديد...
|
main.vaultlist.addVaultBtn.menuItemNew=إنشاء مخزن جديد...
|
||||||
main.vaultlist.addVaultBtn.menuItemExisting=افتح مخزن موجود...
|
main.vaultlist.addVaultBtn.menuItemExisting=افتح مخزن موجود...
|
||||||
main.vaultlist.showEventsButton.tooltip=عرض الإشعارات
|
|
||||||
##Notificaition
|
##Notificaition
|
||||||
main.notification.updateAvailable=هناك تحديث متاح.
|
main.notification.updateAvailable=هناك تحديث متاح.
|
||||||
main.notification.support=دعم Cryptomator.
|
main.notification.support=دعم Cryptomator.
|
||||||
@@ -424,9 +423,7 @@ main.vaultDetail.stats=إحصائيات الخزنة
|
|||||||
main.vaultDetail.locateEncryptedFileBtn=تحديد موقع الملف المشفر
|
main.vaultDetail.locateEncryptedFileBtn=تحديد موقع الملف المشفر
|
||||||
main.vaultDetail.locateEncryptedFileBtn.tooltip=اختر ملف من خزانتك لتحديد مكان نظيره المشفر
|
main.vaultDetail.locateEncryptedFileBtn.tooltip=اختر ملف من خزانتك لتحديد مكان نظيره المشفر
|
||||||
main.vaultDetail.encryptedPathsCopied=تم نسخ مسارات الملفات إلى الحافظة!
|
main.vaultDetail.encryptedPathsCopied=تم نسخ مسارات الملفات إلى الحافظة!
|
||||||
main.vaultDetail.locateEncrypted.filePickerTitle=اختر الملَف من الخزنة
|
|
||||||
main.vaultDetail.decryptName.buttonLabel=فك تشفير اسم الملف
|
main.vaultDetail.decryptName.buttonLabel=فك تشفير اسم الملف
|
||||||
main.vaultDetail.decryptName.tooltip=اختر ملَف مشفر لفك تشفير اسمه
|
|
||||||
### Missing
|
### Missing
|
||||||
main.vaultDetail.missing.info=لم يتمكن Cryptomator من العثور على خزنة في هذا المسار.
|
main.vaultDetail.missing.info=لم يتمكن Cryptomator من العثور على خزنة في هذا المسار.
|
||||||
main.vaultDetail.missing.recheck=إعادة الفحص
|
main.vaultDetail.missing.recheck=إعادة الفحص
|
||||||
@@ -476,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.restartRequired=لاستخدام هذا النوع من وحدة التخزين يحتاج 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
|
||||||
@@ -583,40 +580,7 @@ shareVault.hub.instruction.2=2. امنح الوصول لعضو الفريق في
|
|||||||
shareVault.hub.openHub=زيارة Cryptomator Hub
|
shareVault.hub.openHub=زيارة Cryptomator Hub
|
||||||
|
|
||||||
# Decrypt File Names
|
# Decrypt File Names
|
||||||
decryptNames.title=فك تشفير اسم الملَف
|
|
||||||
decryptNames.filePicker.title=اختر ملَف مشفر
|
|
||||||
decryptNames.filePicker.extensionDescription=ملف مشفر
|
|
||||||
decryptNames.copyTable.tooltip=نسخ الجدول
|
|
||||||
decryptNames.clearTable.tooltip=مسح الجدول
|
|
||||||
decryptNames.copyHint=نسخ محتوى الخلية مع %s
|
|
||||||
decryptNames.dropZone.message=إسقاط الملفات أو انقر لتحديد
|
|
||||||
decryptNames.dropZone.error.vaultInternalFiles=مخزن الملفات الداخلية مع عدم تحديد اسم قابل للتشفير
|
|
||||||
decryptNames.dropZone.error.foreignFiles=الملفات لا تنتمي إلى مخزن "%s"
|
|
||||||
decryptNames.dropZone.error.noDirIdBackup=مسار الملفات المحددة لا يحتوي على ملَف dirId.c9r
|
|
||||||
decryptNames.dropZone.error.generic=فشل فك تشفير أسماء الملفات
|
|
||||||
|
|
||||||
|
|
||||||
# Event View
|
# Event View
|
||||||
eventView.title=أحداث
|
|
||||||
eventView.filter.allVaults=الكل
|
|
||||||
eventView.clearListButton.tooltip=تفريغ القائمة
|
|
||||||
## event list entries
|
## event list entries
|
||||||
eventView.entry.vaultLocked.description=فتح "%s" للحصول على التفاصيل
|
|
||||||
eventView.entry.conflictResolved.message=تم حل التضارب
|
|
||||||
eventView.entry.conflictResolved.showDecrypted=إظهار الملف غير المشفر
|
|
||||||
eventView.entry.conflictResolved.copyDecrypted=نسخ المسار غير المشفر
|
|
||||||
eventView.entry.conflict.message=فشل حل التضارب
|
|
||||||
eventView.entry.conflict.showDecrypted=إظهار الملَف غير المشفر الأصلي
|
|
||||||
eventView.entry.conflict.copyDecrypted=نسخ المسار غير المشفر والأصلي
|
|
||||||
eventView.entry.conflict.showEncrypted=إظهار ملف متضارب ومشفر
|
|
||||||
eventView.entry.conflict.copyEncrypted=نسخ مسار التشفير المتعارض
|
|
||||||
eventView.entry.decryptionFailed.message=فشل فك التشفير
|
|
||||||
eventView.entry.decryptionFailed.showEncrypted=عرض ملَف المشفر
|
|
||||||
eventView.entry.decryptionFailed.copyEncrypted=نسخ مسار المشفر
|
|
||||||
eventView.entry.brokenDirFile.message=رابط الدليل المكسور
|
|
||||||
eventView.entry.brokenDirFile.showEncrypted=إظهار الرابط المكسور، المشفر
|
|
||||||
eventView.entry.brokenDirFile.copyEncrypted=نسخ مسار الرابط المكسور
|
|
||||||
eventView.entry.brokenFileNode.message=عقدة ملفات النظام التافلة
|
|
||||||
eventView.entry.brokenFileNode.showEncrypted=عرض العقدة المشفّرة التافلة
|
|
||||||
eventView.entry.brokenFileNode.copyEncrypted=نسخ مسار العقدة المشفّرة التافلة
|
|
||||||
eventView.entry.brokenFileNode.copyDecrypted=نسخ المسار غير المشفر
|
|
||||||
|
|||||||
@@ -424,9 +424,9 @@ main.vaultDetail.stats=Estatísticas do Cofre
|
|||||||
main.vaultDetail.locateEncryptedFileBtn=Localizar Ficheiro Encriptado
|
main.vaultDetail.locateEncryptedFileBtn=Localizar Ficheiro Encriptado
|
||||||
main.vaultDetail.locateEncryptedFileBtn.tooltip=Escolha um ficheiro do seu cofre para localizar a sua contraparte encriptada
|
main.vaultDetail.locateEncryptedFileBtn.tooltip=Escolha um ficheiro do seu cofre para localizar a sua contraparte encriptada
|
||||||
main.vaultDetail.encryptedPathsCopied=Caminhos copiados para a área de transferência!
|
main.vaultDetail.encryptedPathsCopied=Caminhos copiados para a área de transferência!
|
||||||
main.vaultDetail.locateEncrypted.filePickerTitle=Selecione o ficheiro no cofre
|
main.vaultDetail.locateEncrypted.filePickerTitle=Selecionar ficheiro dentro do cofre
|
||||||
main.vaultDetail.decryptName.buttonLabel=Descriptografar o nome do ficheiro
|
main.vaultDetail.decryptName.buttonLabel=Desencriptar nome do ficheiro
|
||||||
main.vaultDetail.decryptName.tooltip=Escolha um ficheiro encriptado do cofre para desencriptar o seu nome
|
main.vaultDetail.decryptName.tooltip=Escolha um ficheiro de cofre encriptado para desencriptar o seu nome
|
||||||
### Missing
|
### Missing
|
||||||
main.vaultDetail.missing.info=O Cryptomator não conseguiu encontrar um cofre neste diretório.
|
main.vaultDetail.missing.info=O Cryptomator não conseguiu encontrar um cofre neste diretório.
|
||||||
main.vaultDetail.missing.recheck=Verificar novamente
|
main.vaultDetail.missing.recheck=Verificar novamente
|
||||||
@@ -583,17 +583,17 @@ shareVault.hub.instruction.2=2. Conceder acesso ao membro da equipe no Hub Crypt
|
|||||||
shareVault.hub.openHub=Abrir Hub do Cryptomator
|
shareVault.hub.openHub=Abrir Hub do Cryptomator
|
||||||
|
|
||||||
# Decrypt File Names
|
# Decrypt File Names
|
||||||
decryptNames.title=Desencriptar os nomes dos ficheiros
|
decryptNames.title=Desencriptar nomes de ficheiros
|
||||||
decryptNames.filePicker.title=Selecione o ficheiro encriptado
|
decryptNames.filePicker.title=Selecione o ficheiro encriptado
|
||||||
decryptNames.filePicker.extensionDescription=Ficheiro encriptado pelo Criptomator
|
decryptNames.filePicker.extensionDescription=Ficheiro encriptado do Cryptomator
|
||||||
decryptNames.copyTable.tooltip=Copiar a tabela
|
decryptNames.copyTable.tooltip=Copiar tabela
|
||||||
decryptNames.clearTable.tooltip=Limpar a tabela
|
decryptNames.clearTable.tooltip=Limpar tabela
|
||||||
decryptNames.copyHint=Copiar o conteúdo da célula com %s
|
decryptNames.copyHint=Copiar conteúdo da célula com %s
|
||||||
decryptNames.dropZone.message=Largue os ficheiros ou clique para selecionar
|
decryptNames.dropZone.message=Solte os ficheiros ou clique para selecionar
|
||||||
decryptNames.dropZone.error.vaultInternalFiles=Ficheiros internos do coftre sem nome desencriptável selecionado
|
decryptNames.dropZone.error.vaultInternalFiles=Ficheiros internos do cofre sem nome decifrável selecionado
|
||||||
decryptNames.dropZone.error.foreignFiles=Os ficheiros não pertencem ao cofre "%s"
|
decryptNames.dropZone.error.foreignFiles=Ficheiros não pertencem ao cofre "%s"
|
||||||
decryptNames.dropZone.error.noDirIdBackup=O diretório dos ficheiros selecionados não contém o ficheiro dirId.c9r
|
decryptNames.dropZone.error.noDirIdBackup=O diretório dos ficheiros selecionados não contém o ficheiro dirId.c9r
|
||||||
decryptNames.dropZone.error.generic=Falha ao desencriptar os nomes dos ficheiros
|
decryptNames.dropZone.error.generic=Falha ao desencriptar nomes de ficheiros
|
||||||
|
|
||||||
|
|
||||||
# Event View
|
# Event View
|
||||||
@@ -603,20 +603,20 @@ eventView.clearListButton.tooltip=Limpar lista
|
|||||||
## event list entries
|
## event list entries
|
||||||
eventView.entry.vaultLocked.description=Desbloquear "%s" para detalhes
|
eventView.entry.vaultLocked.description=Desbloquear "%s" para detalhes
|
||||||
eventView.entry.conflictResolved.message=Conflito resolvido
|
eventView.entry.conflictResolved.message=Conflito resolvido
|
||||||
eventView.entry.conflictResolved.showDecrypted=Mostrar o ficheiro desencriptado
|
eventView.entry.conflictResolved.showDecrypted=Mostrar ficheiro desencriptado
|
||||||
eventView.entry.conflictResolved.copyDecrypted=Copiar o caminho desencriptado
|
eventView.entry.conflictResolved.copyDecrypted=Copiar caminho desencriptado
|
||||||
eventView.entry.conflict.message=A resolução do conflito falhou
|
eventView.entry.conflict.message=Resolução de conflito falhou
|
||||||
eventView.entry.conflict.showDecrypted=Mostrar o ficheiro original desencriptado
|
eventView.entry.conflict.showDecrypted=Mostrar ficheiro original desencriptado
|
||||||
eventView.entry.conflict.copyDecrypted=Copie o caminho original desencriptado
|
eventView.entry.conflict.copyDecrypted=Copie caminho original desencriptado
|
||||||
eventView.entry.conflict.showEncrypted=Mostrar o ficheiro encriptado em conflito
|
eventView.entry.conflict.showEncrypted=Mostrar ficheiro encriptado conflitante
|
||||||
eventView.entry.conflict.copyEncrypted=Copiar o caminho encriptado em conflito
|
eventView.entry.conflict.copyEncrypted=Copiar caminho encriptado conflituante
|
||||||
eventView.entry.decryptionFailed.message=A desencriptação falhou
|
eventView.entry.decryptionFailed.message=Falha na desencriptação
|
||||||
eventView.entry.decryptionFailed.showEncrypted=Mostrar ficheiro encriptado
|
eventView.entry.decryptionFailed.showEncrypted=Mostrar ficheiro encriptado
|
||||||
eventView.entry.decryptionFailed.copyEncrypted=Copiar o caminho encriptado
|
eventView.entry.decryptionFailed.copyEncrypted=Copiar caminho de encriptação
|
||||||
eventView.entry.brokenDirFile.message=Link de diretório quebrado
|
eventView.entry.brokenDirFile.message=Link de diretório quebrado
|
||||||
eventView.entry.brokenDirFile.showEncrypted=Mostrar o link quebrado e encriptado
|
eventView.entry.brokenDirFile.showEncrypted=Mostrar link quebrado e encriptado
|
||||||
eventView.entry.brokenDirFile.copyEncrypted=Copiar caminho do link quebrado
|
eventView.entry.brokenDirFile.copyEncrypted=Copiar caminho do link quebrado
|
||||||
eventView.entry.brokenFileNode.message=Nó do sistema de ficheiros avariado
|
eventView.entry.brokenFileNode.message=Nó do sistema de ficheiros avariado
|
||||||
eventView.entry.brokenFileNode.showEncrypted=Mostrar nó encriptado e danificado
|
eventView.entry.brokenFileNode.showEncrypted=Mostrar nó encriptado quebrado
|
||||||
eventView.entry.brokenFileNode.copyEncrypted=Copiar o caminho do nó encriptado e danificado
|
eventView.entry.brokenFileNode.copyEncrypted=Copiar o caminho do nó encriptado e danificado
|
||||||
eventView.entry.brokenFileNode.copyDecrypted=Copiar o caminho desencriptado
|
eventView.entry.brokenFileNode.copyDecrypted=Copiar caminho desencriptado
|
||||||
|
|||||||
Reference in New Issue
Block a user