mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-16 01:31:28 +00:00
Compare commits
15 Commits
1.16.0-bet
...
1.16.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
85c2901484 | ||
|
|
434030b139 | ||
|
|
e43bb37758 | ||
|
|
2eb9f0fca8 | ||
|
|
9503feb9c4 | ||
|
|
08e9f130e4 | ||
|
|
4e39eaa1f1 | ||
|
|
eaca95e8dc | ||
|
|
cf32e794c8 | ||
|
|
b5b221a5c7 | ||
|
|
d7cb99a12d | ||
|
|
b1893c63d4 | ||
|
|
b50cc703b6 | ||
|
|
9dc4a1dc5a | ||
|
|
f1a63a1679 |
8
.github/workflows/appimage.yml
vendored
8
.github/workflows/appimage.yml
vendored
@@ -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
|
||||
|
||||
10
.github/workflows/debian.yml
vendored
10
.github/workflows/debian.yml
vendored
@@ -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:
|
||||
|
||||
4
.github/workflows/mac-dmg-x64.yml
vendored
4
.github/workflows/mac-dmg-x64.yml
vendored
@@ -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
|
||||
|
||||
4
.github/workflows/mac-dmg.yml
vendored
4
.github/workflows/mac-dmg.yml
vendored
@@ -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
|
||||
|
||||
3
.github/workflows/win-exe.yml
vendored
3
.github/workflows/win-exe.yml
vendored
@@ -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
|
||||
|
||||
6
dist/linux/appimage/build.sh
vendored
6
dist/linux/appimage/build.sh
vendored
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
2
dist/linux/debian/control
vendored
2
dist/linux/debian/control
vendored
@@ -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
|
||||
|
||||
6
dist/mac/dmg/build.sh
vendored
6
dist/mac/dmg/build.sh
vendored
@@ -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
2
dist/win/build.ps1
vendored
@@ -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'
|
||||
|
||||
6
pom.xml
6
pom.xml
@@ -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>
|
||||
|
||||
@@ -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.
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# Generics
|
||||
generic.action.dismiss=لغو
|
||||
## Button
|
||||
generic.button.apply=درخواست
|
||||
generic.button.apply=اعمال
|
||||
generic.button.back=بازگشت
|
||||
generic.button.cancel=انصراف
|
||||
generic.button.change=تغییر
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=מיקום מותאם אישית
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=Решённый конфликт
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=複製損壞的路徑連結
|
||||
|
||||
Reference in New Issue
Block a user