Compare commits

..

10 Commits

Author SHA1 Message Date
Armin Schrenk
6c5f3cb72c Merge branch 'release/1.17.1' 2025-07-08 14:06:54 +02:00
Armin Schrenk
581b16e354 finalize 1.17.1 2025-07-08 13:42:43 +02:00
Armin Schrenk
d74248ff63 prepare 1.17.1 2025-07-08 13:41:04 +02:00
Cryptobot
698ac639e9 New Crowdin updates (#3913)
New translations strings.properties

Arabic; Portuguese;

[ci skip]
2025-07-08 13:40:09 +02:00
Armin Schrenk
5a086f52b5 Revert "exclude early access javafx versions in dependency updates"
This reverts commit 54b7f3c842.
2025-07-08 13:35:43 +02:00
Armin Schrenk
54b7f3c842 exclude early access javafx versions in dependency updates 2025-07-07 16:13:17 +02:00
mindmonk
94b9813c50 Merge pull request #3918 from cryptomator/feature/fix-password-tab-on-migrated-legacy-vaults
Fix: Show Change Password tab after vault migration by improving KeyLoader scheme handling
2025-07-07 15:15:06 +02:00
Jan-Peter Klein
78cffe2f60 fix password tab on migrated legacy vaults 2025-07-07 11:32:19 +02:00
Jan-Peter Klein
9d15a7664d fix docs links 2025-07-07 11:14:19 +02:00
Mateo
5d8457cbdd Feature: Default to previously used vault directory when creating a vault (#3903) 2025-07-04 11:08:22 +02:00
15 changed files with 136 additions and 125 deletions

View File

@@ -126,6 +126,9 @@ jobs:
--no-man-pages
--strip-debug
--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
run: >
${JAVA_HOME}/bin/jpackage
@@ -163,7 +166,7 @@ jobs:
--java-options "-Djavafx.verbose=${{ inputs.isDebug }}"
--resource-dir dist/win/resources
--icon dist/win/resources/Cryptomator.ico
--add-launcher "Debug_Cryptomator=dist/win/debug-launcher.properties"
${WIN_CONSOLE_FLAG}
- name: Patch Application Directory
run: |
cp dist/win/contrib/* appdir/Cryptomator
@@ -178,9 +181,7 @@ jobs:
exit 1
}
- name: Fix permissions
run: |
attrib -r appdir/Cryptomator/Cryptomator.exe
attrib -r appdir/Cryptomator/Debug_Cryptomator.exe
run: attrib -r appdir/Cryptomator/Cryptomator.exe
shell: pwsh
- name: Extract jars with DLLs for Codesigning
shell: pwsh

View File

@@ -83,6 +83,9 @@
</content_rating>
<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">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.17.0</url>
</release>

3
dist/win/.gitignore vendored
View File

@@ -4,8 +4,7 @@ installer
*.wixobj
*.pdb
*.msi
*Debug.properties
*.exe
*.jmod
resources/jfxJmods.zip
license.rtf
license.rtf

102
dist/win/build.ps1 vendored
View File

@@ -49,7 +49,6 @@ $buildDir = Split-Path -Parent $PSCommandPath
$version = $(mvn -f $buildDir/../../pom.xml help:evaluate -Dexpression="project.version" -q -DforceStdout)
$semVerNo = $version -replace '(\d+\.\d+\.\d+).*','$1'
$revisionNo = $(git rev-list --count HEAD)
$signingCertThumbprint = "TODO"
Write-Output "`$version=$version"
Write-Output "`$semVerNo=$semVerNo"
@@ -118,7 +117,7 @@ switch ($archName) {
}
## create custom runtime
### adjust for JEP 493
### check 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 ) {
$jmodPaths="$Env:JAVA_HOME/jmods;" + $jmodPaths;
}
@@ -140,29 +139,6 @@ if ($clean -and (Test-Path -Path $appPath)) {
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
& "$Env:JAVA_HOME\bin\jpackage" `
--verbose `
@@ -175,16 +151,28 @@ $javaOptions = @(
--name $AppName `
--vendor $Vendor `
--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" `
--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 `
--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;
}
--icon resources/$AppName.ico
#Create RTF license for msi
&mvn -B -f $buildDir/../../pom.xml license:add-third-party "-Djavafx.platform=win" `
@@ -199,7 +187,6 @@ if ($LASTEXITCODE -ne 0) {
# patch app dir
Copy-Item "contrib\*" -Destination "$AppName"
attrib -r "$AppName\$AppName.exe"
attrib -r "$AppName\Debug_${AppName}.exe"
# patch batch script to set hostfile
$webDAVPatcher = "$AppName\patchWebDAV.bat"
try {
@@ -209,53 +196,6 @@ try {
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
$Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources"
$Env:JP_WIXHELPER_DIR = "."

View File

@@ -1 +0,0 @@
win-console=true

View File

@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.cryptomator</groupId>
<artifactId>cryptomator</artifactId>
<version>1.18.0-SNAPSHOT</version>
<version>1.17.1</version>
<name>Cryptomator Desktop App</name>
<organization>

View File

@@ -25,6 +25,8 @@ import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.NodeOrientation;
import java.nio.file.Path;
import java.time.Instant;
import java.util.function.Consumer;
@@ -75,6 +77,7 @@ public class Settings {
public final BooleanProperty checkForUpdates;
public final ObjectProperty<Instant> lastUpdateCheckReminder;
public final ObjectProperty<Instant> lastSuccessfulUpdateCheck;
public final ObjectProperty<Path> previouslyUsedVaultDirectory;
private Consumer<Settings> saveCmd;
@@ -114,6 +117,7 @@ public class Settings {
this.checkForUpdates = new SimpleBooleanProperty(this, "checkForUpdates", json.checkForUpdatesEnabled);
this.lastUpdateCheckReminder = new SimpleObjectProperty<>(this, "lastUpdateCheckReminder", json.lastReminderForUpdateCheck);
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());
@@ -143,6 +147,7 @@ public class Settings {
checkForUpdates.addListener(this::somethingChanged);
lastUpdateCheckReminder.addListener(this::somethingChanged);
lastSuccessfulUpdateCheck.addListener(this::somethingChanged);
previouslyUsedVaultDirectory.addListener(this::somethingChanged);
}
@SuppressWarnings("deprecation")
@@ -204,6 +209,7 @@ public class Settings {
json.checkForUpdatesEnabled = checkForUpdates.get();
json.lastReminderForUpdateCheck = lastUpdateCheckReminder.get();
json.lastSuccessfulUpdateCheck = lastSuccessfulUpdateCheck.get();
json.previouslyUsedVaultDirectory = previouslyUsedVaultDirectory.get();
return json;
}

View File

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.nio.file.Path;
import java.time.Instant;
import java.util.List;
@@ -92,4 +93,7 @@ class SettingsJson {
@JsonProperty("quickAccessService")
String quickAccessService = Settings.DEFAULT_QUICKACCESS_SERVICE;
@JsonProperty("previouslyUsedVaultDirectory")
Path previouslyUsedVaultDirectory;
}

View File

@@ -9,13 +9,13 @@
package org.cryptomator.common.vaults;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.Constants;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.cryptofs.CryptoFileSystemProvider;
import org.cryptomator.cryptofs.DirStructure;
import org.cryptomator.cryptofs.migration.Migrators;
import org.cryptomator.integrations.mount.MountService;
import org.cryptomator.ui.keyloading.masterkeyfile.MasterkeyFileLoadingStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -125,7 +125,7 @@ public class VaultListManager {
vaultSettings.lastKnownKeyLoader.set(keyIdScheme);
}
} else if (vaultState == NEEDS_MIGRATION) {
vaultSettings.lastKnownKeyLoader.set(Constants.DEFAULT_KEY_ID.toString());
vaultSettings.lastKnownKeyLoader.set(MasterkeyFileLoadingStrategy.SCHEME);
}
return vaultComponentFactory.create(vaultSettings, wrapper, vaultState, null).vault();
} catch (IOException e) {

View File

@@ -26,7 +26,7 @@ public class CreateNewVaultExpertSettingsController implements FxController {
public static final int MAX_SHORTENING_THRESHOLD = 220;
public static final int MIN_SHORTENING_THRESHOLD = 36;
private static final String DOCS_NAME_SHORTENING_URL = "https://docs.cryptomator.org/security/architecture/#name-shortening";
private static final String DOCS_NAME_SHORTENING_URL = "https://docs.cryptomator.org/security/vault/#name-shortening";
private final Stage window;
private final Lazy<Application> application;

View File

@@ -4,6 +4,7 @@ import dagger.Lazy;
import org.cryptomator.common.ObservableUtil;
import org.cryptomator.common.locationpresets.LocationPreset;
import org.cryptomator.common.locationpresets.LocationPresetsProvider;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.common.FxmlFile;
import org.cryptomator.ui.common.FxmlScene;
@@ -38,6 +39,7 @@ import javafx.stage.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
@@ -64,6 +66,7 @@ public class CreateNewVaultLocationController implements FxController {
private final BooleanProperty loadingPresetLocations = new SimpleBooleanProperty(false);
private final ObservableList<Node> radioButtons;
private final ObservableList<Node> sortedRadioButtons;
private final Settings settings;
private Path customVaultPath = DEFAULT_CUSTOM_VAULT_PATH;
@@ -82,6 +85,7 @@ public class CreateNewVaultLocationController implements FxController {
@FxmlScene(FxmlFile.ADDVAULT_NEW_EXPERT_SETTINGS) Lazy<Scene> chooseExpertSettingsScene, //
ObjectProperty<Path> vaultPath, //
@Named("vaultName") StringProperty vaultName, //
Settings settings, //
ExecutorService backgroundExecutor, ResourceBundle resourceBundle) {
this.window = window;
this.chooseNameScene = chooseNameScene;
@@ -96,6 +100,18 @@ public class CreateNewVaultLocationController implements FxController {
this.usePresetPath = new SimpleBooleanProperty();
this.radioButtons = FXCollections.observableArrayList();
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 {
@@ -196,6 +212,12 @@ public class CreateNewVaultLocationController implements FxController {
@FXML
public void next() {
if (validVaultPath.getValue()) {
if (this.getVaultPath() != null) {
Path parentPath = this.getVaultPath().getParent();
if (parentPath != null) {
this.settings.previouslyUsedVaultDirectory.setValue(parentPath);
}
}
window.setScene(chooseExpertSettingsScene.get());
}
}

View File

@@ -46,15 +46,16 @@ public interface KeyLoadingStrategy extends MasterkeyLoader {
/**
* Determines whether the provided key loader scheme corresponds to a Masterkey File Vault.
* <p>
* This method checks if the {@code keyLoader} parameter matches the known Masterkey File Vault scheme
* This method checks if the {@code keyLoader} parameter starts with the known Masterkey File Vault scheme
* {@link MasterkeyFileLoadingStrategy#SCHEME}.
* This allows identifying not only exact matches but also variants or extended schemes based on the Masterkey scheme.
* </p>
*
* @param keyLoader A string representing the key loader scheme to be checked.
* @return {@code true} if the given key loader scheme represents a Masterkey File Vault; {@code false} otherwise.
* @return {@code true} if the given key loader scheme starts with the Masterkey File Vault scheme; {@code false} otherwise.
*/
static boolean isMasterkeyFileVault(String keyLoader) {
return MasterkeyFileLoadingStrategy.SCHEME.equals(keyLoader);
return keyLoader.startsWith(MasterkeyFileLoadingStrategy.SCHEME);
}
/**

View File

@@ -19,7 +19,7 @@ public class ShareVaultController implements FxController {
private static final String SCHEME_PREFIX = "hub+";
private static final String VISIT_HUB_URL = "https://cryptomator.org/hub/";
private static final String BEST_PRACTICES_URL = "https://docs.cryptomator.org/en/latest/security/best-practices/#sharing-of-vaults";
private static final String BEST_PRACTICES_URL = "https://docs.cryptomator.org/security/best-practices/#sharing-of-vaults";
private final Stage window;
private final Lazy<Application> application;

View File

@@ -62,9 +62,9 @@ addvaultwizard.new.locationIsOk=الموقع المناسب للمخزن الخ
addvaultwizard.new.invalidName=اسم المخزن غير صالح
addvaultwizard.new.validName=اسم المخزن صالح
addvaultwizard.new.validCharacters.message=قد يحتوي اسم المخزن على الأحرف التالية:
addvaultwizard.new.validCharacters.chars=أحرف الكلمات (أمثلة: a, ж, )
addvaultwizard.new.validCharacters.numbers=الأعداد
addvaultwizard.new.validCharacters.dashes=الشرطة (%s) أو الشرطة السفلية (%s)
addvaultwizard.new.validCharacters.chars=أحرف لكن دون علامات (#, $, !, @...)
addvaultwizard.new.validCharacters.numbers=الأرقام
addvaultwizard.new.validCharacters.dashes=ناقص (%s) أو شِرْطَةٌ سفلية (%s)
### Expert Settings
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=تمكين إعدادات الخبراء
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=أدخل قيمة بين 36 و 220 (الافتراضي 220)
@@ -319,7 +319,7 @@ preferences.volume.feature.readOnly=تحميل للقراءة فقط
## Updates
preferences.updates=تحديثات
preferences.updates.currentVersion=الإصدار الحالي: %s
preferences.updates.autoUpdateCheck=تحقق من التحديثات اوتوماتيكيا
preferences.updates.autoUpdateCheck=التحقق من وجود تحديثات تلقائياً
preferences.updates.checkNowBtn=تحقق الان
preferences.updates.updateAvailable=التحديث إلى الإصدار %s متاح.
preferences.updates.lastUpdateCheck=آخر فحص: %s
@@ -395,6 +395,7 @@ main.vaultlist.contextMenu.vaultoptions=إظهار خيارات المخزن
main.vaultlist.contextMenu.reveal=اظهار القرص
main.vaultlist.addVaultBtn.menuItemNew=إنشاء مخزن جديد...
main.vaultlist.addVaultBtn.menuItemExisting=افتح مخزن موجود...
main.vaultlist.showEventsButton.tooltip=عرض الإشعارات
##Notificaition
main.notification.updateAvailable=هناك تحديث متاح.
main.notification.support=دعم Cryptomator.
@@ -423,7 +424,9 @@ main.vaultDetail.stats=إحصائيات الخزنة
main.vaultDetail.locateEncryptedFileBtn=تحديد موقع الملف المشفر
main.vaultDetail.locateEncryptedFileBtn.tooltip=اختر ملف من خزانتك لتحديد مكان نظيره المشفر
main.vaultDetail.encryptedPathsCopied=تم نسخ مسارات الملفات إلى الحافظة!
main.vaultDetail.locateEncrypted.filePickerTitle=اختر الملَف من الخزنة
main.vaultDetail.decryptName.buttonLabel=فك تشفير اسم الملف
main.vaultDetail.decryptName.tooltip=اختر ملَف مشفر لفك تشفير اسمه
### Missing
main.vaultDetail.missing.info=لم يتمكن Cryptomator من العثور على خزنة في هذا المسار.
main.vaultDetail.missing.recheck=إعادة الفحص
@@ -473,7 +476,7 @@ vaultOptions.mount.mountPoint.custom=استخدام المجلد المختار
vaultOptions.mount.mountPoint.directoryPickerButton=اختر…
vaultOptions.mount.mountPoint.directoryPickerTitle=إختر مجلد
vaultOptions.mount.volumeType.default=الافتراضي (%s)
vaultOptions.mount.volumeType.restartRequired=لاستخدام هذا النوع من وحدة التخزين يحتاج Cryptomator إلى إعادة تشغيله.
vaultOptions.mount.volumeType.restartRequired=لاستخدام هذا النوع من وحدة التخزين يحتاج Cryptomator إلى إعادة تشغيل.
vaultOptions.mount.volume.tcp.port=منفذ TCP
vaultOptions.mount.volume.type=‮نوع وحدة التخزين
## Master Key
@@ -580,7 +583,40 @@ shareVault.hub.instruction.2=2. امنح الوصول لعضو الفريق في
shareVault.hub.openHub=زيارة Cryptomator Hub
# 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
eventView.title=أحداث
eventView.filter.allVaults=الكل
eventView.clearListButton.tooltip=تفريغ القائمة
## 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=نسخ المسار غير المشفر

View File

@@ -424,9 +424,9 @@ main.vaultDetail.stats=Estatísticas do Cofre
main.vaultDetail.locateEncryptedFileBtn=Localizar Ficheiro Encriptado
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.locateEncrypted.filePickerTitle=Selecionar ficheiro dentro do cofre
main.vaultDetail.decryptName.buttonLabel=Desencriptar nome do ficheiro
main.vaultDetail.decryptName.tooltip=Escolha um ficheiro de cofre encriptado para desencriptar o seu nome
main.vaultDetail.locateEncrypted.filePickerTitle=Selecione o ficheiro no cofre
main.vaultDetail.decryptName.buttonLabel=Descriptografar o nome do ficheiro
main.vaultDetail.decryptName.tooltip=Escolha um ficheiro encriptado do cofre para desencriptar o seu nome
### Missing
main.vaultDetail.missing.info=O Cryptomator não conseguiu encontrar um cofre neste diretório.
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
# Decrypt File Names
decryptNames.title=Desencriptar nomes de ficheiros
decryptNames.title=Desencriptar os nomes dos ficheiros
decryptNames.filePicker.title=Selecione o ficheiro encriptado
decryptNames.filePicker.extensionDescription=Ficheiro encriptado do Cryptomator
decryptNames.copyTable.tooltip=Copiar tabela
decryptNames.clearTable.tooltip=Limpar tabela
decryptNames.copyHint=Copiar conteúdo da célula com %s
decryptNames.dropZone.message=Solte os ficheiros ou clique para selecionar
decryptNames.dropZone.error.vaultInternalFiles=Ficheiros internos do cofre sem nome decifrável selecionado
decryptNames.dropZone.error.foreignFiles=Ficheiros não pertencem ao cofre "%s"
decryptNames.filePicker.extensionDescription=Ficheiro encriptado pelo Criptomator
decryptNames.copyTable.tooltip=Copiar a tabela
decryptNames.clearTable.tooltip=Limpar a tabela
decryptNames.copyHint=Copiar o conteúdo da célula com %s
decryptNames.dropZone.message=Largue os ficheiros ou clique para selecionar
decryptNames.dropZone.error.vaultInternalFiles=Ficheiros internos do coftre sem nome desencriptável selecionado
decryptNames.dropZone.error.foreignFiles=Os 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.generic=Falha ao desencriptar nomes de ficheiros
decryptNames.dropZone.error.generic=Falha ao desencriptar os nomes dos ficheiros
# Event View
@@ -603,20 +603,20 @@ eventView.clearListButton.tooltip=Limpar lista
## event list entries
eventView.entry.vaultLocked.description=Desbloquear "%s" para detalhes
eventView.entry.conflictResolved.message=Conflito resolvido
eventView.entry.conflictResolved.showDecrypted=Mostrar ficheiro desencriptado
eventView.entry.conflictResolved.copyDecrypted=Copiar caminho desencriptado
eventView.entry.conflict.message=Resolução de conflito falhou
eventView.entry.conflict.showDecrypted=Mostrar ficheiro original desencriptado
eventView.entry.conflict.copyDecrypted=Copie caminho original desencriptado
eventView.entry.conflict.showEncrypted=Mostrar ficheiro encriptado conflitante
eventView.entry.conflict.copyEncrypted=Copiar caminho encriptado conflituante
eventView.entry.decryptionFailed.message=Falha na desencriptação
eventView.entry.conflictResolved.showDecrypted=Mostrar o ficheiro desencriptado
eventView.entry.conflictResolved.copyDecrypted=Copiar o caminho desencriptado
eventView.entry.conflict.message=A resolução do conflito falhou
eventView.entry.conflict.showDecrypted=Mostrar o ficheiro original desencriptado
eventView.entry.conflict.copyDecrypted=Copie o caminho original desencriptado
eventView.entry.conflict.showEncrypted=Mostrar o ficheiro encriptado em conflito
eventView.entry.conflict.copyEncrypted=Copiar o caminho encriptado em conflito
eventView.entry.decryptionFailed.message=A desencriptação falhou
eventView.entry.decryptionFailed.showEncrypted=Mostrar ficheiro encriptado
eventView.entry.decryptionFailed.copyEncrypted=Copiar caminho de encriptação
eventView.entry.decryptionFailed.copyEncrypted=Copiar o caminho encriptado
eventView.entry.brokenDirFile.message=Link de diretório quebrado
eventView.entry.brokenDirFile.showEncrypted=Mostrar link quebrado e encriptado
eventView.entry.brokenDirFile.showEncrypted=Mostrar o link quebrado e encriptado
eventView.entry.brokenDirFile.copyEncrypted=Copiar caminho do link quebrado
eventView.entry.brokenFileNode.message=Nó do sistema de ficheiros avariado
eventView.entry.brokenFileNode.showEncrypted=Mostrar nó encriptado quebrado
eventView.entry.brokenFileNode.showEncrypted=Mostrar nó encriptado e danificado
eventView.entry.brokenFileNode.copyEncrypted=Copiar o caminho do nó encriptado e danificado
eventView.entry.brokenFileNode.copyDecrypted=Copiar caminho desencriptado
eventView.entry.brokenFileNode.copyDecrypted=Copiar o caminho desencriptado