Compare commits

..

15 Commits

Author SHA1 Message Date
Armin Schrenk
85c2901484 Merge branch 'release/1.16.1' 2025-04-30 14:04:43 +02:00
Armin Schrenk
434030b139 finalize 1.16.1 2025-04-30 14:04:32 +02:00
Armin Schrenk
e43bb37758 prepare 1.16.1 2025-04-30 12:12:59 +02:00
Armin Schrenk
2eb9f0fca8 Fixes #3838 2025-04-30 12:12:04 +02:00
Armin Schrenk
9503feb9c4 Feature: Use user and system certificate stores on macOS (#3837) 2025-04-29 17:02:14 +02:00
Armin Schrenk
08e9f130e4 [skip ci] Merge branch 'main' into develop 2025-04-29 11:28:38 +02:00
Armin Schrenk
4e39eaa1f1 Merge branch 'release/1.16.0' 2025-04-29 11:27:56 +02:00
Armin Schrenk
eaca95e8dc finalize 1.16.0 2025-04-29 11:27:44 +02:00
Armin Schrenk
cf32e794c8 Merge branch 'develop' into release/1.16.0 2025-04-29 11:26:48 +02:00
Armin Schrenk
b5b221a5c7 remove manual wix installation from ci 2025-04-29 11:15:13 +02:00
Cryptobot
d7cb99a12d New Crowdin updates (#3819)
New translations strings.properties

Chinese Traditional; Dutch; French; Hebrew; Italian; Latvian; Persian; Portuguese; Portuguese, Brazilian; Russian; Slovak; Spanish; Swedish; 

[ci skip]
2025-04-29 10:55:33 +02:00
Armin Schrenk
b1893c63d4 Bump cryptofs from version 2.9.0-beta2 to 2.9.0 2025-04-28 13:00:21 +02:00
Armin Schrenk
b50cc703b6 Merge branch 'develop' into release/1.16.0 2025-04-15 13:46:30 +02:00
Armin Schrenk
9dc4a1dc5a [skip ci] update distribution build files to jfx 23.0.2 2025-04-15 13:45:14 +02:00
Armin Schrenk
f1a63a1679 update debian workflow to use JDK 23.0.2 2025-04-15 13:42:49 +02:00
26 changed files with 299 additions and 31 deletions

View File

@@ -29,12 +29,12 @@ jobs:
include:
- os: ubuntu-latest
appimage-suffix: x86_64
openjfx-url: 'https://download2.gluonhq.com/openjfx/23.0.1/openjfx-23.0.1_linux-x64_bin-jmods.zip'
openjfx-sha: '2164bca470bf70a5e2764645e2078ba7f787b274e5be3d7df30d87c5bb62bba6'
openjfx-url: 'https://download2.gluonhq.com/openjfx/23.0.2/openjfx-23.0.2_linux-x64_bin-jmods.zip'
openjfx-sha: '063baebc6922e4a89c94b9dfb7a4f53e59e8d6fec400d4e670b31bc2ab324dec'
- os: ubuntu-24.04-arm
appimage-suffix: aarch64
openjfx-url: 'https://download2.gluonhq.com/openjfx/23.0.1/openjfx-23.0.1_linux-aarch64_bin-jmods.zip'
openjfx-sha: '09c92fa9fa0b82adefd88640a14ebb2a49e5f3f733a57d1542f5590d060ffe1b'
openjfx-url: 'https://download2.gluonhq.com/openjfx/23.0.2/openjfx-23.0.2_linux-aarch64_bin-jmods.zip'
openjfx-sha: '9bbedaeae1590b69e2b22237bda310936df33e344dbc243bea2e86acaab3a0d8'
steps:
- uses: actions/checkout@v4
- name: Setup Java

View File

@@ -19,11 +19,11 @@ env:
JAVA_DIST: 'temurin'
JAVA_VERSION: '23.0.2+7'
COFFEELIBS_JDK: 23
COFFEELIBS_JDK_VERSION: '23.0.1+11-0ppa1'
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/23.0.1/openjfx-23.0.1_linux-x64_bin-jmods.zip'
OPENJFX_JMODS_AMD64_HASH: '2164bca470bf70a5e2764645e2078ba7f787b274e5be3d7df30d87c5bb62bba6'
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/23.0.1/openjfx-23.0.1_linux-aarch64_bin-jmods.zip'
OPENJFX_JMODS_AARCH64_HASH: '09c92fa9fa0b82adefd88640a14ebb2a49e5f3f733a57d1542f5590d060ffe1b'
COFFEELIBS_JDK_VERSION: '23.0.2+7-0ppa1'
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/23.0.2/openjfx-23.0.2_linux-x64_bin-jmods.zip'
OPENJFX_JMODS_AMD64_HASH: '063baebc6922e4a89c94b9dfb7a4f53e59e8d6fec400d4e670b31bc2ab324dec'
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/23.0.2/openjfx-23.0.2_linux-aarch64_bin-jmods.zip'
OPENJFX_JMODS_AARCH64_HASH: '9bbedaeae1590b69e2b22237bda310936df33e344dbc243bea2e86acaab3a0d8'
jobs:
build:

View File

@@ -35,8 +35,8 @@ jobs:
architecture: x64
output-suffix: x64
fuse-lib: macFUSE
openjfx-url: 'https://download2.gluonhq.com/openjfx/23.0.1/openjfx-23.0.1_osx-x64_bin-jmods.zip'
openjfx-sha: '8857965975c464a0e5d57709292ce357d0ebb39f6168c41d5ca38301e42c3c8e'
openjfx-url: 'https://download2.gluonhq.com/openjfx/23.0.2/openjfx-23.0.2_osx-x64_bin-jmods.zip'
openjfx-sha: '5e6c65c065eea22430c0eab36f37a5985eb8ad99e19e8772262021740d338f68'
steps:
- uses: actions/checkout@v4
- name: Setup Java

View File

@@ -36,8 +36,8 @@ jobs:
architecture: aarch64
output-suffix: arm64
fuse-lib: FUSE-T
openjfx-url: 'https://download2.gluonhq.com/openjfx/23.0.1/openjfx-23.0.1_osx-aarch64_bin-jmods.zip'
openjfx-sha: 'a800724a1f3e6757ecfa0bd5bf7ed64d2e6a7a3f5b3522650a70b8cfc7782fb6'
openjfx-url: 'https://download2.gluonhq.com/openjfx/23.0.2/openjfx-23.0.2_osx-aarch64_bin-jmods.zip'
openjfx-sha: 'c690cc642a3924cf56622951f478ba57aec9ce09063761f800c3319331bed3fc'
steps:
- uses: actions/checkout@v4
- name: Setup Java

View File

@@ -40,9 +40,6 @@ jobs:
LOOPBACK_ALIAS: 'cryptomator-vault'
WIN_CONSOLE_FLAG: ''
steps:
- name: Upgrade WIX to latest version
run: choco install wixtoolset --version 3.14.1
shell: pwsh
- uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4

View File

@@ -23,12 +23,12 @@ mvn -B -f ../../../pom.xml clean package -Plinux -DskipTests -Djavafx.platform=l
cp ../../../LICENSE.txt ../../../target
cp ../../../target/cryptomator-*.jar ../../../target/mods
JAVAFX_VERSION=22.0.2
JAVAFX_VERSION=23.0.2
JAVAFX_ARCH="x64"
JAVAFX_JMODS_SHA256='2164bca470bf70a5e2764645e2078ba7f787b274e5be3d7df30d87c5bb62bba6'
JAVAFX_JMODS_SHA256='063baebc6922e4a89c94b9dfb7a4f53e59e8d6fec400d4e670b31bc2ab324dec'
if [ "${CPU_ARCH}" = "aarch64" ]; then
JAVAFX_ARCH="aarch64"
JAVAFX_JMODS_SHA256='09c92fa9fa0b82adefd88640a14ebb2a49e5f3f733a57d1542f5590d060ffe1b'
JAVAFX_JMODS_SHA256='9bbedaeae1590b69e2b22237bda310936df33e344dbc243bea2e86acaab3a0d8'
fi
# download javaFX jmods

View File

@@ -83,6 +83,12 @@
</content_rating>
<releases>
<release date="2025-04-30" version="1.16.1">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.16.1</url>
</release>
<release date="2025-04-29" version="1.16.0">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.16.0</url>
</release>
<release date="2025-04-09" version="1.15.3">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.15.3</url>
</release>

View File

@@ -2,7 +2,7 @@ Source: cryptomator
Maintainer: Cryptobot <releases@cryptomator.org>
Section: utils
Priority: optional
Build-Depends: debhelper (>=10), coffeelibs-jdk-23 (>= 23.0.1+11-0ppa1), libgtk-3-0, libxxf86vm1, libgl1
Build-Depends: debhelper (>=10), coffeelibs-jdk-23 (>= 23.0.2+7-0ppa1), libgtk-3-0, libxxf86vm1, libgl1
Standards-Version: 4.5.0
Homepage: https://cryptomator.org
Vcs-Git: https://github.com/cryptomator/cryptomator.git

View File

@@ -32,15 +32,15 @@ REVISION_NO=`git rev-list --count HEAD`
VERSION_NO=`mvn -f../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout | sed -rn 's/.*([0-9]+\.[0-9]+\.[0-9]+).*/\1/p'`
FUSE_LIB="FUSE-T"
JAVAFX_VERSION=23.0.1
JAVAFX_VERSION=23.0.2
JAVAFX_ARCH="undefined"
JAVAFX_JMODS_SHA256="undefined"
if [ "$(machine)" = "arm64e" ]; then
JAVAFX_ARCH="aarch64"
JAVAFX_JMODS_SHA256="a800724a1f3e6757ecfa0bd5bf7ed64d2e6a7a3f5b3522650a70b8cfc7782fb6"
JAVAFX_JMODS_SHA256="c690cc642a3924cf56622951f478ba57aec9ce09063761f800c3319331bed3fc"
else
JAVAFX_ARCH="x64"
JAVAFX_JMODS_SHA256="8857965975c464a0e5d57709292ce357d0ebb39f6168c41d5ca38301e42c3c8e"
JAVAFX_JMODS_SHA256="5e6c65c065eea22430c0eab36f37a5985eb8ad99e19e8772262021740d338f68"
fi
JAVAFX_JMODS_URL="https://download2.gluonhq.com/openjfx/${JAVAFX_VERSION}/openjfx-${JAVAFX_VERSION}_osx-${JAVAFX_ARCH}_bin-jmods.zip"

2
dist/win/build.ps1 vendored
View File

@@ -51,7 +51,7 @@ if ($clean -and (Test-Path -Path $runtimeImagePath)) {
}
## download jfx jmods
$javaFxVersion='23.0.1'
$javaFxVersion='23.0.2'
$javaFxJmodsUrl = "https://download2.gluonhq.com/openjfx/${javaFxVersion}/openjfx-${javaFxVersion}_windows-x64_bin-jmods.zip"
$javaFxJmodsSHA256 = 'ee176dcee3bd78bde7910735bd67f67c792882f5b89626796ae06f7a1c0119d3'
$javaFxJmods = '.\resources\jfxJmods.zip'

View File

@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.cryptomator</groupId>
<artifactId>cryptomator</artifactId>
<version>1.16.0</version>
<version>1.16.1</version>
<name>Cryptomator Desktop App</name>
<organization>
@@ -33,10 +33,10 @@
<nonModularGroupIds>org.ow2.asm,org.apache.jackrabbit,org.apache.httpcomponents</nonModularGroupIds>
<!-- cryptomator dependencies -->
<cryptomator.cryptofs.version>2.9.0-beta2</cryptomator.cryptofs.version>
<cryptomator.cryptofs.version>2.9.0</cryptomator.cryptofs.version>
<cryptomator.integrations.version>1.5.1</cryptomator.integrations.version>
<cryptomator.integrations.win.version>1.3.0</cryptomator.integrations.win.version>
<cryptomator.integrations.mac.version>1.3.0</cryptomator.integrations.mac.version>
<cryptomator.integrations.mac.version>1.3.2</cryptomator.integrations.mac.version>
<cryptomator.integrations.linux.version>1.5.3</cryptomator.integrations.linux.version>
<cryptomator.fuse.version>5.0.5</cryptomator.fuse.version>
<cryptomator.webdav.version>2.0.10</cryptomator.webdav.version>

View File

@@ -0,0 +1,185 @@
package org.cryptomator.networking;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.KeyStoreSpi;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.concurrent.atomic.AtomicInteger;
public class CombinedKeyStoreSpi extends KeyStoreSpi {
private final KeyStore primary;
private final KeyStore fallback;
public static CombinedKeyStoreSpi create(KeyStore primary, KeyStore fallback) {
checkIfLoaded(primary);
checkIfLoaded(fallback);
return new CombinedKeyStoreSpi(primary, fallback);
}
private static void checkIfLoaded(KeyStore s) {
try {
s.aliases();
} catch (KeyStoreException e) {
throw new IllegalArgumentException("Keystore %s is not loaded.".formatted(s.getType()));
}
}
private CombinedKeyStoreSpi(KeyStore primary, KeyStore fallback) {
this.primary = primary;
this.fallback = fallback;
}
@Override
public Key engineGetKey(String alias, char[] password) throws NoSuchAlgorithmException, UnrecoverableKeyException {
try {
Key key = primary.getKey(alias, password);
if (key == null) {
key = fallback.getKey(alias, password);
}
return key;
} catch (KeyStoreException e) {
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
}
}
@Override
public Certificate[] engineGetCertificateChain(String alias) {
try {
Certificate[] chain = primary.getCertificateChain(alias);
if (chain == null) {
chain = fallback.getCertificateChain(alias);
}
return chain;
} catch (KeyStoreException e) {
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
}
}
@Override
public Certificate engineGetCertificate(String alias) {
try {
Certificate cert = primary.getCertificate(alias);
if (cert == null) {
cert = fallback.getCertificate(alias);
}
return cert;
} catch (KeyStoreException e) {
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
}
}
@Override
public Date engineGetCreationDate(String alias) {
try {
Date date = primary.getCreationDate(alias);
if (date == null) {
date = fallback.getCreationDate(alias);
}
return date;
} catch (KeyStoreException e) {
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
}
}
@Override
public void engineSetKeyEntry(String alias, Key key, char[] password, Certificate[] chain) throws KeyStoreException {
throw new UnsupportedOperationException("Read-only KeyStore");
}
@Override
public void engineSetKeyEntry(String alias, byte[] key, Certificate[] chain) throws KeyStoreException {
throw new UnsupportedOperationException("Read-only KeyStore");
}
@Override
public void engineSetCertificateEntry(String alias, Certificate cert) throws KeyStoreException {
throw new UnsupportedOperationException("Read-only KeyStore");
}
@Override
public void engineDeleteEntry(String alias) throws KeyStoreException {
throw new UnsupportedOperationException("Read-only KeyStore");
}
@Override
public Enumeration<String> engineAliases() {
var aliases = new LinkedHashSet<String>();
try {
primary.aliases().asIterator().forEachRemaining(aliases::add);
fallback.aliases().asIterator().forEachRemaining(aliases::add);
return Collections.enumeration(aliases);
} catch (KeyStoreException e) {
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
}
}
@Override
public boolean engineContainsAlias(String alias) {
try {
return primary.containsAlias(alias) || fallback.containsAlias(alias);
} catch (KeyStoreException e) {
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
}
}
@Override
public int engineSize() {
var aliases = engineAliases();
var i = new AtomicInteger(0);
aliases.asIterator().forEachRemaining(_ -> i.incrementAndGet());
return i.get();
}
@Override
public boolean engineIsKeyEntry(String alias) {
try {
return primary.isKeyEntry(alias) || fallback.isKeyEntry(alias);
} catch (KeyStoreException e) {
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
}
}
@Override
public boolean engineIsCertificateEntry(String alias) {
try {
return primary.isCertificateEntry(alias) || fallback.isCertificateEntry(alias);
} catch (KeyStoreException e) {
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
}
}
@Override
public String engineGetCertificateAlias(Certificate cert) {
try {
String alias = primary.getCertificateAlias(cert);
if (alias == null) {
alias = fallback.getCertificateAlias(cert);
}
return alias;
} catch (KeyStoreException e) {
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
}
}
@Override
public void engineStore(OutputStream stream, char[] password) throws IOException, NoSuchAlgorithmException, CertificateException {
throw new UnsupportedOperationException("Read-only KeyStore");
}
@Override
public void engineLoad(InputStream stream, char[] password) throws IOException, NoSuchAlgorithmException, CertificateException {
// Nothing to do; the real keystores are already loaded.
}
}

View File

@@ -6,6 +6,7 @@ import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.cert.CertificateException;
/**
@@ -16,6 +17,16 @@ public class SSLContextWithMacKeychain extends SSLContextDifferentTrustStoreBase
@Override
KeyStore getTruststore() throws KeyStoreException, CertificateException, IOException, NoSuchAlgorithmException {
return KeyStore.getInstance("KeychainStore-ROOT");
var userKeyStore = KeyStore.getInstance("KeychainStore");
var systemRootKeyStore = KeyStore.getInstance("KeychainStore-ROOT");
userKeyStore.load(null);
systemRootKeyStore.load(null);
try {
CombinedKeyStoreSpi spi = CombinedKeyStoreSpi.create(userKeyStore, systemRootKeyStore);
Provider dummyProvider = new Provider("CombinedKeyStoreProvider", "1.0", "Provides a combined, read-only KeyStore") {};
return new KeyStore(spi, dummyProvider, "CombinedKeyStoreProvider") {};
} catch (IllegalArgumentException e) {
throw new KeyStoreException(e);
}
}
}

View File

@@ -599,6 +599,7 @@ decryptNames.dropZone.error.generic=Error al descifrar nombre de archivos
# Event View
eventView.title=Eventos
eventView.filter.allVaults=Todos
eventView.clearListButton.tooltip=Borrar lista
## event list entries
eventView.entry.vaultLocked.description=Desbloquear "%s" para más detalles
eventView.entry.conflictResolved.message=Conflicto resuelto

View File

@@ -3,7 +3,7 @@
# Generics
generic.action.dismiss=لغو
## Button
generic.button.apply=درخواست
generic.button.apply=اعمال
generic.button.back=بازگشت
generic.button.cancel=انصراف
generic.button.change=تغییر

View File

@@ -424,7 +424,9 @@ main.vaultDetail.stats=Statistiques du volume chiffré
main.vaultDetail.locateEncryptedFileBtn=Localiser le fichier chiffré
main.vaultDetail.locateEncryptedFileBtn.tooltip=Choisissez un fichier dans votre coffre pour localiser sa version chiffrée
main.vaultDetail.encryptedPathsCopied=Chemins d'accès copiés dans le presse-papier !
main.vaultDetail.locateEncrypted.filePickerTitle=Sélectionner le fichier dans le coffre
main.vaultDetail.decryptName.buttonLabel=Déchiffrer le nom d'un fichier
main.vaultDetail.decryptName.tooltip=Choisir un fichier de coffre chiffré pour déchiffrer son nom
### Missing
main.vaultDetail.missing.info=Cryptomator n'a pas pu trouver de volume chiffré dans ce chemin d'accès.
main.vaultDetail.missing.recheck=Revérifier
@@ -596,6 +598,7 @@ decryptNames.dropZone.error.generic=Impossible de déchiffrer les noms de fichie
# Event View
eventView.title=Événements
eventView.filter.allVaults=Tous
eventView.clearListButton.tooltip=Effacer la liste
## event list entries
eventView.entry.vaultLocked.description=Déverrouillez "%s" pour plus de détails
eventView.entry.conflictResolved.message=Conflit résolu

View File

@@ -49,6 +49,7 @@ addvaultwizard.new.nameInstruction=בחירת שם עבור הכספת
addvaultwizard.new.namePrompt=שם הכספת
### Location
addvaultwizard.new.locationInstruction=היכן Cryptomator צריך לשמור את הקבצים המוצפנים של הכספת שלך?
addvaultwizard.new.locationLoading=בודק מערכת קבצים מקומית עבור ספריות ברירת מחדל לאחסון ענן…
addvaultwizard.new.locationLabel=מיקום אחסון
addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=מיקום מותאם אישית

View File

@@ -599,6 +599,7 @@ decryptNames.dropZone.error.generic=Decifratura nomi file non riuscita
# Event View
eventView.title=Eventi
eventView.filter.allVaults=Tutti
eventView.clearListButton.tooltip=Cancella elenco
## event list entries
eventView.entry.vaultLocked.description=Sblocca "%s" per i dettagli
eventView.entry.conflictResolved.message=Conflitto risolto

View File

@@ -599,6 +599,7 @@ decryptNames.dropZone.error.generic=Neizdevās atšifrēt datņu nosaukumus
# Event View
eventView.title=Notikumi
eventView.filter.allVaults=Viss
eventView.clearListButton.tooltip=Notīrīt sarakstu
## event list entries
eventView.entry.vaultLocked.description=Atslēgt "%s", lai redzētu informāciju
eventView.entry.conflictResolved.message=Atrisināta nesaderība

View File

@@ -599,6 +599,7 @@ decryptNames.dropZone.error.generic=Kan bestandsnamen niet decoderen
# Event View
eventView.title=Activiteiten
eventView.filter.allVaults=Alle
eventView.clearListButton.tooltip=Wis lijst
## event list entries
eventView.entry.vaultLocked.description=Ontgrendel "%s" voor details
eventView.entry.conflictResolved.message=Opgelost conflict

View File

@@ -599,6 +599,7 @@ decryptNames.dropZone.error.generic=Falha ao desencriptar nomes de ficheiros
# Event View
eventView.title=Eventos
eventView.filter.allVaults=Todos
eventView.clearListButton.tooltip=Limpar lista
## event list entries
eventView.entry.vaultLocked.description=Desbloquear "%s" para detalhes
eventView.entry.conflictResolved.message=Conflito resolvido

View File

@@ -599,6 +599,7 @@ decryptNames.dropZone.error.generic=Falha ao descriptografar nomes de arquivos
# Event View
eventView.title=Eventos
eventView.filter.allVaults=Todos
eventView.clearListButton.tooltip=Limpar lista
## event list entries
eventView.entry.vaultLocked.description=Desbloquear "%s" para detalhes
eventView.entry.conflictResolved.message=Conflito resolvido

View File

@@ -599,6 +599,7 @@ 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=Решённый конфликт

View File

@@ -577,6 +577,7 @@ decryptNames.dropZone.error.generic=Nepodarilo sa dešifrovať názvy súborov
# Event View
eventView.title=Udalosti
eventView.filter.allVaults=Všetko
eventView.clearListButton.tooltip=Vymazať zoznam
## event list entries
eventView.entry.vaultLocked.description=Podrobnosti získate odomknutím „%s“
eventView.entry.conflictResolved.message=Vyriešený konflikt

View File

@@ -394,6 +394,7 @@ main.vaultlist.contextMenu.vaultoptions=Visa inställningar för valv
main.vaultlist.contextMenu.reveal=Visa enhet
main.vaultlist.addVaultBtn.menuItemNew=Skapa nytt valv...
main.vaultlist.addVaultBtn.menuItemExisting=Öppna befintligt valv...
main.vaultlist.showEventsButton.tooltip=Öppna händelsevy
##Notificaition
main.notification.updateAvailable=Uppdatering tillgänglig.
main.notification.support=Stöd Cryptomator.
@@ -422,6 +423,9 @@ main.vaultDetail.stats=Valv Statistik
main.vaultDetail.locateEncryptedFileBtn=Leta upp krypterad fil
main.vaultDetail.locateEncryptedFileBtn.tooltip=Välj en fil från ditt valv för att hitta dess krypterade motsvarighet
main.vaultDetail.encryptedPathsCopied=Sökvägar kopierade till klippbordet!
main.vaultDetail.locateEncrypted.filePickerTitle=Välj fil inuti valvet
main.vaultDetail.decryptName.buttonLabel=Dekryptera filnamn
main.vaultDetail.decryptName.tooltip=Välj en krypterad valvfil för att dekryptera dess namn
### Missing
main.vaultDetail.missing.info=Cryptomator kunde inte hitta någt valv i denna sökväg.
main.vaultDetail.missing.recheck=Kontrollera igen
@@ -578,7 +582,40 @@ shareVault.hub.instruction.2=2. Ge åtkomst till gruppmedlemmen i Cryptomatornav
shareVault.hub.openHub=Öppna kryptomatornav
# Decrypt File Names
decryptNames.title=Dekryptera filnamn
decryptNames.filePicker.title=Välj krypterad fil
decryptNames.filePicker.extensionDescription=Cryptomator krypterad fil
decryptNames.copyTable.tooltip=Kopiera tabell
decryptNames.clearTable.tooltip=Rensa tabell
decryptNames.copyHint=Kopiera cellinnehåll med %s
decryptNames.dropZone.message=Släpp filer eller klicka för att välja
decryptNames.dropZone.error.vaultInternalFiles=Interna valvfiler utan dekrypterbart namn valdes
decryptNames.dropZone.error.foreignFiles=Filer tillhör inte valvet "%s"
decryptNames.dropZone.error.noDirIdBackup=Katalog med valda filer innehåller inte dirId.c9r fil
decryptNames.dropZone.error.generic=Det gick inte att dekryptera filnamn
# Event View
eventView.title=Händelser
eventView.filter.allVaults=Samtliga
eventView.clearListButton.tooltip=Rensa listan
## event list entries
eventView.entry.vaultLocked.description=Lås upp "%s" för detaljer
eventView.entry.conflictResolved.message=Löst konflikt
eventView.entry.conflictResolved.showDecrypted=Visa dekrypterad fil
eventView.entry.conflictResolved.copyDecrypted=Kopiera dekrypterad sökväg
eventView.entry.conflict.message=Konfliktlösning misslyckades
eventView.entry.conflict.showDecrypted=Visa dekrypterad, originalfil
eventView.entry.conflict.copyDecrypted=Kopiera dekrypterad, ursprunglig sökväg
eventView.entry.conflict.showEncrypted=Visa krypterad fil som inte kunde synkroniseras
eventView.entry.conflict.copyEncrypted=Kopiera krypterad sökväg som inte kunde synkroniseras
eventView.entry.decryptionFailed.message=Dekryptering misslyckades
eventView.entry.decryptionFailed.showEncrypted=Visa krypterad fil
eventView.entry.decryptionFailed.copyEncrypted=Kopiera krypterad sökväg
eventView.entry.brokenDirFile.message=Trasig kataloglänk
eventView.entry.brokenDirFile.showEncrypted=Visa trasig, krypterad länk
eventView.entry.brokenDirFile.copyEncrypted=Kopiera sökväg för trasig länk
eventView.entry.brokenFileNode.message=Trasig filsystemsnod
eventView.entry.brokenFileNode.showEncrypted=Visa trasig krypterad nod
eventView.entry.brokenFileNode.copyEncrypted=Kopiera sökväg för trasig, krypterad nod
eventView.entry.brokenFileNode.copyDecrypted=Kopiera dekrypterad sökväg

View File

@@ -94,7 +94,7 @@ addvault.new.readme.accessLocation.2=這是您加密檔案庫的存取位置。
addvault.new.readme.accessLocation.3=所有被加進這個磁區的檔案都將被 Cryptomator 加密。你可以把它當做磁碟或資料夾使用。這裡式顯示出解密後內容,您的檔案總是以被加密的狀態儲存在磁碟中。
addvault.new.readme.accessLocation.4=您可以放心移除這個檔案。
## Existing
addvaultwizard.existing.title=添加現有加密檔案庫
addvaultwizard.existing.title=開啟現有加密檔案庫
addvaultwizard.existing.instruction=請選擇現有加密檔案庫中名為「vault.cryptomator」的檔案。如果只有一個名為「masterkey.cryptomator」的檔案則選擇該檔案。
addvaultwizard.existing.chooseBtn=選取…
addvaultwizard.existing.filePickerTitle=選取加密檔案庫的檔案
@@ -127,7 +127,7 @@ unlock.unlockBtn=解鎖
## Select
unlock.chooseMasterkey.message=未找到主金鑰文件
unlock.chooseMasterkey.description=無法在其預期位置找到加密檔案庫「%s」的主密鑰檔案。請手動選擇密鑰文件。
unlock.chooseMasterkey.filePickerTitle=选择主金鑰文件
unlock.chooseMasterkey.filePickerTitle=選擇主金鑰檔案
unlock.chooseMasterkey.filePickerMimeDesc=Cryptomator 主密鑰
## Success
unlock.success.message=解鎖成功
@@ -177,6 +177,7 @@ hub.registerFailed.description.generic=註冊過程發生錯誤。更多細節
hub.registerFailed.description.deviceAlreadyExists=其他使用者已在此裝置上註冊。請切換至該使用者帳戶或使用其他裝置進行註冊。
### Unauthorized
hub.unauthorized.message=拒絕存取
hub.unauthorized.description=您沒有被授權開啟這個加密檔案庫。請聯絡檔案庫擁有者取得權限。
### Requires Account Initialization
hub.requireAccountInit.message=需進一步操作
hub.requireAccountInit.description.0=請完成您的
@@ -282,6 +283,7 @@ preferences.title=偏好
## General
preferences.general=一般
preferences.general.startHidden=啟動 Cryptomator 時隱藏視窗
preferences.general.autoCloseVaults=當離開應用程式的時候直接鎖定檔案庫而不詢問
preferences.general.debugLogging=啟用除錯日誌
preferences.general.debugDirectory=顯示日誌檔
preferences.general.autoStart=系統啟動時同時啟動 Cryptomator
@@ -393,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.
@@ -421,6 +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=重新檢查
@@ -577,7 +583,21 @@ shareVault.hub.instruction.2=2. 在Cryptomator Hub中允許團隊成員對加密
shareVault.hub.openHub=打開 Cryptomator Hub
# Decrypt File Names
decryptNames.filePicker.title=選擇已加密的檔案
decryptNames.filePicker.extensionDescription=Cryptomator 加密檔案
decryptNames.copyTable.tooltip=複製表格
decryptNames.clearTable.tooltip=清除表格
decryptNames.dropZone.error.foreignFiles=檔案不屬於加密檔案庫「%s」
decryptNames.dropZone.error.generic=解密檔案名稱失敗
# Event View
eventView.title=事件
eventView.filter.allVaults=全部
## event list entries
eventView.entry.decryptionFailed.message=解密失敗
eventView.entry.decryptionFailed.showEncrypted=顯示加密的檔案
eventView.entry.decryptionFailed.copyEncrypted=複製加密路徑
eventView.entry.brokenDirFile.message=損壞的目錄連結
eventView.entry.brokenDirFile.showEncrypted=顯示損壞的加密路徑
eventView.entry.brokenDirFile.copyEncrypted=複製損壞的路徑連結