mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-14 08:41:28 +00:00
Merge branch 'release/1.2.1'
This commit is contained in:
@@ -19,7 +19,8 @@ Download native binaries of Cryptomator on [cryptomator.org](https://cryptomator
|
||||
- Client-side: No accounts, no data shared with any online service
|
||||
- Totally transparent: Just work on the virtual drive as if it were a USB flash drive
|
||||
- AES encryption with 256-bit key length
|
||||
- Filenames get encrypted, too
|
||||
- File names get encrypted
|
||||
- Folder structure gets obfuscated
|
||||
- Use as many vaults in your Dropbox as you want, each having individual passwords
|
||||
|
||||
### Privacy
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>ant-kit</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>commons-test</artifactId>
|
||||
<name>Cryptomator common test dependencies</name>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>commons</artifactId>
|
||||
<name>Cryptomator common</name>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>filesystem-api</artifactId>
|
||||
<name>Cryptomator filesystem: API</name>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>filesystem-charsets</artifactId>
|
||||
<name>Cryptomator filesystem: Charset compatibility layer</name>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>filesystem-crypto-integration-tests</artifactId>
|
||||
<name>Cryptomator filesystem: Encryption layer tests</name>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>filesystem-crypto</artifactId>
|
||||
<name>Cryptomator filesystem: Encryption layer</name>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>filesystem-inmemory</artifactId>
|
||||
<name>Cryptomator filesystem: In-memory mock</name>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>filesystem-invariants-tests</artifactId>
|
||||
<name>Cryptomator filesystem: Invariants tests</name>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>filesystem-nameshortening</artifactId>
|
||||
<name>Cryptomator filesystem: Name shortening layer</name>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>filesystem-nio</artifactId>
|
||||
<name>Cryptomator filesystem: NIO-based physical layer</name>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>filesystem-stats</artifactId>
|
||||
<name>Cryptomator filesystem: Throughput statistics</name>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>frontend-api</artifactId>
|
||||
<name>Cryptomator frontend: API</name>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>frontend-webdav</artifactId>
|
||||
<name>Cryptomator frontend: WebDAV frontend</name>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>jacoco-report</artifactId>
|
||||
<name>Cryptomator Code Coverage Report</name>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>keychain</artifactId>
|
||||
<name>System Keychain Access</name>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>Cryptomator</name>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
|
||||
<!-- dependency versions -->
|
||||
<cryptomator.cryptolib.version>1.0.2</cryptomator.cryptolib.version>
|
||||
<cryptomator.cryptolib.version>1.0.7</cryptomator.cryptolib.version>
|
||||
<cryptomator.jni.version>1.0.0</cryptomator.jni.version>
|
||||
<log4j.version>2.1</log4j.version>
|
||||
<slf4j.version>1.7.7</slf4j.version>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>uber-jar</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<parent>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>main</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>1.2.1</version>
|
||||
</parent>
|
||||
<artifactId>ui</artifactId>
|
||||
<name>Cryptomator GUI</name>
|
||||
|
||||
@@ -301,7 +301,7 @@ public class UnlockController extends LocalizedFXMLViewController {
|
||||
if (keychainAccess.isPresent() && savePassword.isSelected()) {
|
||||
keychainAccess.get().storePassphrase(vault.getId(), password);
|
||||
} else {
|
||||
passwordField.swipe();
|
||||
Platform.runLater(passwordField::swipe);
|
||||
}
|
||||
} catch (InvalidPassphraseException e) {
|
||||
Platform.runLater(() -> {
|
||||
|
||||
@@ -41,6 +41,7 @@ public abstract class UpgradeStrategy {
|
||||
* Upgrades a vault. Might take a moment, should be run in a background thread.
|
||||
*/
|
||||
public void upgrade(Vault vault, CharSequence passphrase) throws UpgradeFailedException {
|
||||
LOG.info("Upgrading {} from {} to {}.", vault.path().getValue(), vaultVersionBeforeUpgrade, vaultVersionAfterUpgrade);
|
||||
Cryptor cryptor = null;
|
||||
try {
|
||||
final Path masterkeyFile = vault.path().getValue().resolve(Constants.MASTERKEY_FILENAME);
|
||||
@@ -49,12 +50,14 @@ public abstract class UpgradeStrategy {
|
||||
// create backup, as soon as we know the password was correct:
|
||||
final Path masterkeyBackupFile = vault.path().getValue().resolve(Constants.MASTERKEY_BACKUP_FILENAME);
|
||||
Files.copy(masterkeyFile, masterkeyBackupFile, StandardCopyOption.REPLACE_EXISTING);
|
||||
LOG.info("Backuped masterkey.");
|
||||
// do stuff:
|
||||
upgrade(vault, cryptor);
|
||||
// write updated masterkey file:
|
||||
final byte[] upgradedMasterkeyFileContents = cryptor.writeKeysToMasterkeyFile(passphrase, vaultVersionAfterUpgrade).serialize();
|
||||
final Path masterkeyFileAfterUpgrade = vault.path().getValue().resolve(Constants.MASTERKEY_FILENAME); // path may have changed
|
||||
Files.write(masterkeyFileAfterUpgrade, upgradedMasterkeyFileContents, StandardOpenOption.TRUNCATE_EXISTING);
|
||||
LOG.info("Updated masterkey.");
|
||||
} catch (InvalidPassphraseException e) {
|
||||
throw new UpgradeFailedException(localization.getString("unlock.errorMessage.wrongPassword"));
|
||||
} catch (UnsupportedVaultFormatException e) {
|
||||
|
||||
@@ -57,6 +57,8 @@ class UpgradeVersion4to5 extends UpgradeStrategy {
|
||||
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
||||
if (BASE32_PATTERN.matcher(file.getFileName().toString()).find() && attrs.size() > cryptor.fileHeaderCryptor().headerSize()) {
|
||||
migrate(file, attrs, cryptor);
|
||||
} else {
|
||||
LOG.info("Skipping irrelevant file {}.", file);
|
||||
}
|
||||
return FileVisitResult.CONTINUE;
|
||||
}
|
||||
@@ -70,18 +72,20 @@ class UpgradeVersion4to5 extends UpgradeStrategy {
|
||||
}
|
||||
|
||||
private void migrate(Path file, BasicFileAttributes attrs, Cryptor cryptor) throws IOException {
|
||||
LOG.info("Starting migration of {}...", file);
|
||||
try (FileChannel ch = FileChannel.open(file, StandardOpenOption.READ, StandardOpenOption.WRITE)) {
|
||||
// read header:
|
||||
ByteBuffer headerBuf = ByteBuffer.allocate(cryptor.fileHeaderCryptor().headerSize());
|
||||
ch.read(headerBuf);
|
||||
headerBuf.flip();
|
||||
LOG.info("\tHeader read");
|
||||
FileHeader header = cryptor.fileHeaderCryptor().decryptHeader(headerBuf);
|
||||
long cleartextSize = header.getFilesize();
|
||||
if (cleartextSize < 0) {
|
||||
LOG.info("Skipping already migrated file {}.", file);
|
||||
LOG.info("\tSkipping already migrated file");
|
||||
return;
|
||||
} else if (cleartextSize > attrs.size()) {
|
||||
LOG.warn("Skipping file {} with invalid file size {}/{}", file, cleartextSize, attrs.size());
|
||||
LOG.warn("\tSkipping file with invalid file size {}/{}", cleartextSize, attrs.size());
|
||||
return;
|
||||
}
|
||||
int headerSize = cryptor.fileHeaderCryptor().headerSize();
|
||||
@@ -93,12 +97,13 @@ class UpgradeVersion4to5 extends UpgradeStrategy {
|
||||
long newAdditionalCiphertextBytes = newCiphertextSize % ciphertextChunkSize;
|
||||
if (newAdditionalCiphertextBytes == 0) {
|
||||
// (new) last block is already correct. just truncate:
|
||||
LOG.info("Migrating {} of cleartext size {}: Truncating to new ciphertext size: {}", file, cleartextSize, newEOF);
|
||||
LOG.info("\tMigrating cleartext size {}: Truncating to new ciphertext size: {}", cleartextSize, newEOF);
|
||||
ch.truncate(newEOF);
|
||||
LOG.info("\tFile truncated");
|
||||
} else {
|
||||
// last block may contain padding and needs to be re-encrypted:
|
||||
long lastChunkIdx = newFullChunks;
|
||||
LOG.info("Migrating {} of cleartext size {}: Re-encrypting chunk {}. New ciphertext size: {}", file, cleartextSize, lastChunkIdx, newEOF);
|
||||
LOG.info("\tMigrating cleartext size {}: Re-encrypting chunk {}. New ciphertext size: {}", cleartextSize, lastChunkIdx, newEOF);
|
||||
long beginOfLastChunk = headerSize + lastChunkIdx * ciphertextChunkSize;
|
||||
assert beginOfLastChunk < newEOF;
|
||||
int lastCleartextChunkLength = (int) (cleartextSize % cleartextChunkSize);
|
||||
@@ -116,15 +121,18 @@ class UpgradeVersion4to5 extends UpgradeStrategy {
|
||||
ch.truncate(beginOfLastChunk);
|
||||
ch.write(newLastChunkCiphertext);
|
||||
} else {
|
||||
LOG.error("Reached EOF at position {}/{}", beginOfLastChunk, newEOF);
|
||||
LOG.error("\tReached EOF at position {}/{}", beginOfLastChunk, newEOF);
|
||||
return; // must exit method before changing header!
|
||||
}
|
||||
LOG.info("\tReencrypted last block");
|
||||
}
|
||||
header.setFilesize(-1l);
|
||||
ByteBuffer newHeaderBuf = cryptor.fileHeaderCryptor().encryptHeader(header);
|
||||
ch.position(0);
|
||||
ch.write(newHeaderBuf);
|
||||
LOG.info("\tUpdated header");
|
||||
}
|
||||
LOG.info("Finished migration of {}.", file);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@@ -28,31 +29,50 @@ public class Localization extends ResourceBundle {
|
||||
|
||||
private static final String LOCALIZATION_DEFAULT_FILE = "/localization/en.txt";
|
||||
private static final String LOCALIZATION_FILENAME_FMT = "/localization/%s.txt";
|
||||
private static final String LOCALIZATION_FILE = String.format(LOCALIZATION_FILENAME_FMT, Locale.getDefault().getLanguage());
|
||||
|
||||
private final ResourceBundle fallback;
|
||||
private final ResourceBundle localized;
|
||||
|
||||
@Inject
|
||||
public Localization() {
|
||||
try (InputStream in = getClass().getResourceAsStream(LOCALIZATION_DEFAULT_FILE)) {
|
||||
Objects.requireNonNull(in);
|
||||
Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
|
||||
this.fallback = new PropertyResourceBundle(reader);
|
||||
LOG.info("Loaded localization from bundle:{}", LOCALIZATION_FILE);
|
||||
try {
|
||||
this.fallback = Objects.requireNonNull(loadLocalizationFile(LOCALIZATION_DEFAULT_FILE));
|
||||
LOG.debug("Loaded localization default file: {}", LOCALIZATION_DEFAULT_FILE);
|
||||
|
||||
String language = Locale.getDefault().getLanguage();
|
||||
String region = Locale.getDefault().getCountry();
|
||||
LOG.info("Detected language \"{}\" and region \"{}\"", language, region);
|
||||
|
||||
ResourceBundle localizationBundle = null;
|
||||
if (StringUtils.isNotEmpty(language) && StringUtils.isNotEmpty(region)) {
|
||||
String file = String.format(LOCALIZATION_FILENAME_FMT, language + "_" + region);
|
||||
LOG.info("Attempting to load localization from: {}", file);
|
||||
localizationBundle = loadLocalizationFile(file);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(language) && localizationBundle == null) {
|
||||
String file = String.format(LOCALIZATION_FILENAME_FMT, language);
|
||||
LOG.info("Attempting to load localization from: {}", file);
|
||||
localizationBundle = loadLocalizationFile(file);
|
||||
}
|
||||
if (localizationBundle == null) {
|
||||
LOG.info("No localization found. Falling back to default language.");
|
||||
localizationBundle = this.fallback;
|
||||
}
|
||||
this.localized = Objects.requireNonNull(localizationBundle);
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
}
|
||||
}
|
||||
|
||||
try (InputStream in = getClass().getResourceAsStream(LOCALIZATION_FILE)) {
|
||||
// returns null if no resource for given path
|
||||
private ResourceBundle loadLocalizationFile(String resourcePath) throws IOException {
|
||||
try (InputStream in = getClass().getResourceAsStream(resourcePath)) {
|
||||
if (in != null) {
|
||||
Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
|
||||
this.localized = new PropertyResourceBundle(reader);
|
||||
return new PropertyResourceBundle(reader);
|
||||
} else {
|
||||
this.localized = this.fallback;
|
||||
return null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,10 +3,10 @@ app.name = Cryptomator
|
||||
main.emptyListInstructions = Klik hier om een kluis toe te voegen
|
||||
main.directoryList.contextMenu.remove = Verwijder van lijst
|
||||
main.directoryList.contextMenu.changePassword = Verander wachtwoord
|
||||
main.addDirectory.contextMenu.new = Creeer nieuwe kluis
|
||||
main.addDirectory.contextMenu.new = Creëer nieuwe kluis
|
||||
main.addDirectory.contextMenu.open = Open bestaande kluis
|
||||
# welcome.fxml
|
||||
welcome.checkForUpdates.label.currentlyChecking = Controleren op Updates...
|
||||
welcome.checkForUpdates.label.currentlyChecking = Controleren op updates...
|
||||
welcome.newVersionMessage = Versie %1$s kan worden gedownload.\nDit is %2$s.
|
||||
# initialize.fxml
|
||||
initialize.label.password = Wachtwoord
|
||||
@@ -32,8 +32,8 @@ unlock.button.advancedOptions.hide = Minder opties
|
||||
unlock.choicebox.winDriveLetter.auto = Automatisch toekennen
|
||||
unlock.errorMessage.wrongPassword = Verkeerd wachtwoord
|
||||
unlock.errorMessage.mountingFailed = Mounten mislukt. Zie logbestand voor details.
|
||||
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = Niet ondersteunde kluis. Deze kluis is gecreëerd met een oudere versie van Cryptomator.
|
||||
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = Niet ondersteunde kluis. Deze kluis is gecreëerd met een nieuwere versie van Cryptomator.
|
||||
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = Kluis ontoegankelijk. Deze kluis is gecreëerd met een oudere versie van Cryptomator.
|
||||
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = Kluis ontoegankelijk. Deze kluis is gecreëerd met een nieuwere versie van Cryptomator.
|
||||
unlock.messageLabel.startServerFailed = WebDAV server starten mislukt.
|
||||
# change_password.fxml
|
||||
changePassword.label.oldPassword = Huidig wachtwoord
|
||||
@@ -43,12 +43,11 @@ changePassword.label.downloadsPageLink = Alle Cryptomator versies
|
||||
changePassword.button.change = Verander wachtwoord
|
||||
changePassword.errorMessage.wrongPassword = Alle Cryptomator versies
|
||||
changePassword.errorMessage.decryptionFailed = Decoderen mislukt
|
||||
changePassword.infoMessage.success = Wachtwoord verandert
|
||||
# unlocked.fxml
|
||||
unlocked.button.lock = Vergrendel kluis
|
||||
unlocked.moreOptions.reveal = Maak schijf zichtbaar
|
||||
unlocked.moreOptions.copyUrl = Kopieer WebDAV URL
|
||||
unlocked.label.revealFailed = Commando mislukt
|
||||
unlocked.label.revealFailed = Opdracht mislukt
|
||||
unlocked.label.unmountFailed = Uitwerpen schijf mislukt
|
||||
unlocked.label.statsEncrypted = versleuteld
|
||||
unlocked.label.statsDecrypted = gedecodeerd
|
||||
@@ -57,7 +56,7 @@ unlocked.ioGraph.yAxis.label = Doorvoer (MiB/s)
|
||||
macWarnings.windowTitle = Pas op - Corrupt bestand in %s
|
||||
macWarnings.message = Cryptomator heeft mogelijk kwaadwillende corrupte items aangetroffen in de volgende bestanden\:
|
||||
macWarnings.moreInformationButton = Leer meer
|
||||
macWarnings.whitelistButton = Doorgaan met decoderen van selectie
|
||||
macWarnings.whitelistButton = Desondanks selectie decoderen
|
||||
# settings.fxml
|
||||
settings.version.label = Versie %s
|
||||
settings.checkForUpdates.label = Controleer op updates
|
||||
@@ -81,10 +80,10 @@ main.directoryList.remove.confirmation.title = Verwijder Kluis
|
||||
main.directoryList.remove.confirmation.header = Weet je zeker dat je deze kluis wilt verwijderen?
|
||||
main.directoryList.remove.confirmation.content = De kluis zal alleen van de lijst worden verwijdert. Verwijder de bestanden van het bestandssysteem voor permanente verwijdering.
|
||||
upgrade.version3to4.msg = Deze kluis dient gemigreerd te worden naar een nieuwer type. \nVersleutelde mapnamen zullen worden geüpdatet. \nZorg ervoor dat de synchronisatie voltooid is alvorens door te gaan.
|
||||
upgrade.version3to4.err.io = Migratie mislukt door een I/O Exception. Zie logbestand voor details.
|
||||
settings.prefGvfsScheme.label = WebDAV scheme
|
||||
upgrade.version3to4.err.io = I/O Exception\: migratie mislukt. Zie logbestand voor details.
|
||||
settings.prefGvfsScheme.label = WebDAV schema
|
||||
# upgrade.fxml
|
||||
upgrade.confirmation.label = Yes, I've made sure that synchronization has finished
|
||||
initialize.messageLabel.notEmpty = Vault not empty
|
||||
unlock.label.savePassword = Save password
|
||||
unlock.errorMessage.unauthenticVersionMac = Could not authenticate version MAC.
|
||||
upgrade.confirmation.label = Ja, ik heb geverifieerd dat de synchronisatie voltooid is
|
||||
initialize.messageLabel.notEmpty = Kluis niet leeg
|
||||
unlock.label.savePassword = Wachtwoord bewaren
|
||||
unlock.errorMessage.unauthenticVersionMac = MAC authenticatie mislukt
|
||||
91
main/ui/src/main/resources/localization/zh.txt
Normal file
91
main/ui/src/main/resources/localization/zh.txt
Normal file
@@ -0,0 +1,91 @@
|
||||
app.name = Cryptomator
|
||||
# main.fxml
|
||||
main.emptyListInstructions = 单击此处添加保管库
|
||||
main.directoryList.contextMenu.remove = 从列表中删除
|
||||
main.directoryList.contextMenu.changePassword = 更改密码
|
||||
main.addDirectory.contextMenu.new = 创建新保管库
|
||||
main.addDirectory.contextMenu.open = 打开现有保管库
|
||||
# welcome.fxml
|
||||
welcome.checkForUpdates.label.currentlyChecking = 正在检查更新……
|
||||
welcome.newVersionMessage = 发现新版本版本%1$s\n当前版本%2$s
|
||||
# initialize.fxml
|
||||
initialize.label.password = 密码
|
||||
initialize.label.retypePassword = 确认密码
|
||||
initialize.button.ok = 创建保管库
|
||||
initialize.messageLabel.alreadyInitialized = 保管库已初始化
|
||||
initialize.messageLabel.initializationFailed = 无法初始化保管库。 有关详情,请参阅日志文件。
|
||||
# notfound.fxml
|
||||
notfound.label = 找不到保险柜。 是否已被移动?
|
||||
# upgrade.fxml
|
||||
upgrade.button = 升级保险柜
|
||||
upgrade.version3dropBundleExtension.msg = 此保管库需要迁移到较新的格式。\n"%1$s"将重命名为"%2$s"。\n请确保同步已完成,然后再继续。
|
||||
upgrade.version3dropBundleExtension.err.alreadyExists = 自动迁移失败。\n"%s"已存在
|
||||
# unlock.fxml
|
||||
unlock.label.password = 密码
|
||||
unlock.label.mountName = 驱动器名称
|
||||
unlock.label.winDriveLetter = 驱动器号
|
||||
unlock.label.downloadsPageLink = 所有Cryptomator版本
|
||||
unlock.label.advancedHeading = 高级选项
|
||||
unlock.button.unlock = 保险柜解锁
|
||||
unlock.button.advancedOptions.show = 更多选项
|
||||
unlock.button.advancedOptions.hide = 更少选项
|
||||
unlock.choicebox.winDriveLetter.auto = 自动分配
|
||||
unlock.errorMessage.wrongPassword = 密码错误
|
||||
unlock.errorMessage.mountingFailed = 挂载失败。有关详情,请参阅日志文件。
|
||||
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = 不支持的保管库。 此保管库由旧版本的Cryptomator创建。
|
||||
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = 不支持的保管库。 此保管库由较新版本的Cryptomator创建。
|
||||
unlock.messageLabel.startServerFailed = 启动WebDAV服务器失败。
|
||||
# change_password.fxml
|
||||
changePassword.label.oldPassword = 旧密码
|
||||
changePassword.label.newPassword = 新密码
|
||||
changePassword.label.retypePassword = 确认新密码
|
||||
changePassword.label.downloadsPageLink = 所有Cryptomator版本
|
||||
changePassword.button.change = 更改密码
|
||||
changePassword.errorMessage.wrongPassword = 密码错误
|
||||
changePassword.errorMessage.decryptionFailed = 解密失败
|
||||
# unlocked.fxml
|
||||
unlocked.button.lock = 保险柜上锁
|
||||
unlocked.moreOptions.reveal = 显示驱动器
|
||||
unlocked.moreOptions.copyUrl = 复制WebDAV地址(URL)
|
||||
unlocked.label.revealFailed = 命令失败
|
||||
unlocked.label.unmountFailed = 弹出驱动器失败
|
||||
unlocked.label.statsEncrypted = 加密
|
||||
unlocked.label.statsDecrypted = 解密
|
||||
unlocked.ioGraph.yAxis.label = 吞吐量(Mib/s)
|
||||
# mac_warnings.fxml
|
||||
macWarnings.windowTitle = 危险 - 在%s有文件损坏
|
||||
macWarnings.message = Cryptomator检测到以下文件中的潜在恶意损坏:
|
||||
macWarnings.moreInformationButton = 了解更多
|
||||
macWarnings.whitelistButton = 任然解密选择项
|
||||
# settings.fxml
|
||||
settings.version.label = 版本%s
|
||||
settings.checkForUpdates.label = 检查更新
|
||||
# What's the "*" mean?
|
||||
settings.port.label = WebDAV 端口 *
|
||||
settings.port.prompt = 0 \=自动选择
|
||||
settings.useipv6.label = 使用IPv6
|
||||
settings.requiresRestartLabel = * Cryptomator需要重新启动
|
||||
# tray icon
|
||||
tray.menu.open = 打开
|
||||
tray.menu.quit = 退出
|
||||
tray.infoMsg.title = 仍在运行
|
||||
tray.infoMsg.msg = Cryptomator仍在运行。 从托盘图标中退出。
|
||||
tray.infoMsg.msg.osx = Cryptomator仍在运行。 从菜单栏图标中退出。
|
||||
initialize.messageLabel.passwordStrength.0 = 非常简单
|
||||
initialize.messageLabel.passwordStrength.1 = 简单
|
||||
initialize.messageLabel.passwordStrength.2 = 平均水平
|
||||
initialize.messageLabel.passwordStrength.3 = 强壮
|
||||
initialize.messageLabel.passwordStrength.4 = 非常强壮
|
||||
initialize.label.doNotForget = 重要信息:如果您忘记了密码,将无法恢复您的数据。
|
||||
main.directoryList.remove.confirmation.title = 移除保险柜
|
||||
main.directoryList.remove.confirmation.header = 您确定要删除此保管库吗?
|
||||
main.directoryList.remove.confirmation.content = 文件库将仅从列表中删除。 要永久删除它,请从文件系统中删除这些文件。
|
||||
upgrade.version3to4.msg = 此保管库需要迁移到较新的格式。\n加密的文件夹名称将更新。\n请确保同步已完成,然后再继续。
|
||||
upgrade.version3to4.err.io = 由于I/O异常,迁移失败。有关详情,请参阅日志文件。
|
||||
settings.prefGvfsScheme.label = WebDAV方案
|
||||
# upgrade.fxml
|
||||
upgrade.confirmation.label = 是的,我确保同步已完成
|
||||
initialize.messageLabel.notEmpty = 保险柜非空
|
||||
unlock.label.savePassword = 保存密码
|
||||
# This Mac means Mac(Apple) or Mac address?
|
||||
unlock.errorMessage.unauthenticVersionMac = 无法验证消息验证代码的版本。
|
||||
89
main/ui/src/main/resources/localization/zh_HK.txt
Normal file
89
main/ui/src/main/resources/localization/zh_HK.txt
Normal file
@@ -0,0 +1,89 @@
|
||||
app.name = Cryptomator
|
||||
# main.fxml
|
||||
main.emptyListInstructions = 按這裡新增檔案庫
|
||||
main.directoryList.contextMenu.remove = 從清單移除
|
||||
main.directoryList.contextMenu.changePassword = 變更密碼
|
||||
main.addDirectory.contextMenu.new = 建立新的檔案庫
|
||||
main.addDirectory.contextMenu.open = 打開現有的檔案庫
|
||||
# welcome.fxml
|
||||
welcome.checkForUpdates.label.currentlyChecking = 檢查更新...
|
||||
welcome.newVersionMessage = 版本%1$s可下載。這是%2$s。
|
||||
# initialize.fxml
|
||||
initialize.label.password = 密碼
|
||||
initialize.label.retypePassword = 重新輸入密碼
|
||||
initialize.button.ok = 建立檔案庫
|
||||
initialize.messageLabel.alreadyInitialized = 已初始化檔案庫
|
||||
initialize.messageLabel.initializationFailed = 無法初始化檔案庫。取得詳細資訊,請查看紀錄。
|
||||
# notfound.fxml
|
||||
notfound.label = 無法找到檔案庫。已經移置別的地方?
|
||||
# upgrade.fxml
|
||||
upgrade.button = 升級檔案庫
|
||||
upgrade.version3dropBundleExtension.msg = 這個檔案庫需要被轉移到新的格式。\n"%1$s"將會重新命名為"%2$s"。\n在進行之前,請確認同步已完成。
|
||||
upgrade.version3dropBundleExtension.err.alreadyExists = 自動轉移失敗。\n"%s"已存在。
|
||||
# unlock.fxml
|
||||
unlock.label.password = 密碼
|
||||
unlock.label.mountName = 磁碟名稱
|
||||
unlock.label.winDriveLetter = 磁碟代號
|
||||
unlock.label.downloadsPageLink = 所有的Cryptomator版本
|
||||
unlock.label.advancedHeading = 進階選項
|
||||
unlock.button.unlock = 解鎖檔案庫
|
||||
unlock.button.advancedOptions.show = 更多選項
|
||||
unlock.button.advancedOptions.hide = 更少選項
|
||||
unlock.choicebox.winDriveLetter.auto = 自動指定
|
||||
unlock.errorMessage.wrongPassword = 錯誤的密碼
|
||||
unlock.errorMessage.mountingFailed = 掛載失敗。取得詳細資訊,請查看紀錄。
|
||||
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = 不支援的檔案庫。這個檔案庫是由舊版本的Cryptomator所建立的。
|
||||
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = 不支援的檔案庫。這個檔案庫是由新版本的Cryptomator所建立的。
|
||||
unlock.messageLabel.startServerFailed = 啟動WebDAV的伺服器失敗。
|
||||
# change_password.fxml
|
||||
changePassword.label.oldPassword = 舊密碼
|
||||
changePassword.label.newPassword = 新密碼
|
||||
changePassword.label.retypePassword = 重新輸入密碼
|
||||
changePassword.label.downloadsPageLink = 所有的Cryptomator版本
|
||||
changePassword.button.change = 變更密碼
|
||||
changePassword.errorMessage.wrongPassword = 錯誤的密碼
|
||||
changePassword.errorMessage.decryptionFailed = 解密失敗
|
||||
# unlocked.fxml
|
||||
unlocked.button.lock = 鎖住檔案庫
|
||||
unlocked.moreOptions.reveal = 打開磁碟
|
||||
unlocked.moreOptions.copyUrl = 複製WebDAV的網址
|
||||
unlocked.label.revealFailed = 指令錯誤
|
||||
unlocked.label.unmountFailed = 插入磁碟錯誤
|
||||
unlocked.label.statsEncrypted = 加密的
|
||||
unlocked.label.statsDecrypted = 解密的
|
||||
unlocked.ioGraph.yAxis.label = 傳輸量(MIB / S)
|
||||
# mac_warnings.fxml
|
||||
macWarnings.windowTitle = 危險 - 損壞的檔案在%s
|
||||
macWarnings.message = Cryptomator在下列檔案中,偵測到潛在的損壞威脅:
|
||||
macWarnings.moreInformationButton = 取得更多
|
||||
macWarnings.whitelistButton = 總是解密所選的
|
||||
# settings.fxml
|
||||
settings.version.label = 版本%s
|
||||
settings.checkForUpdates.label = 檢查更新
|
||||
settings.port.label = WebDAV的埠號*
|
||||
settings.port.prompt = 0 \=自動選擇
|
||||
settings.useipv6.label = 使用IPv6
|
||||
settings.requiresRestartLabel = * Cryptomator需要更新
|
||||
# tray icon
|
||||
tray.menu.open = 打開
|
||||
tray.menu.quit = 離開
|
||||
tray.infoMsg.title = 仍然在執行
|
||||
tray.infoMsg.msg = Cryptomator仍然在運作。從工具列的圖示點選離開。
|
||||
tray.infoMsg.msg.osx = Cryptomator仍然在運作。從選單列上點選離開。
|
||||
initialize.messageLabel.passwordStrength.0 = 非常弱的
|
||||
initialize.messageLabel.passwordStrength.1 = 弱的
|
||||
initialize.messageLabel.passwordStrength.2 = 正常的
|
||||
initialize.messageLabel.passwordStrength.3 = 強的
|
||||
initialize.messageLabel.passwordStrength.4 = 非常強的
|
||||
initialize.label.doNotForget = 重要:如果你忘記的密碼,就無法還原你的資料。
|
||||
main.directoryList.remove.confirmation.title = 移除檔案庫
|
||||
main.directoryList.remove.confirmation.header = 你真的想要移除這個檔案庫?
|
||||
main.directoryList.remove.confirmation.content = 這個檔案庫只會從清單中移除。如果要永久刪除,請從檔案系統中刪除。
|
||||
upgrade.version3to4.msg = 這個檔案庫需要被轉移到新的格式。\n加密的資料夾名稱將會被更新。\n在進行之前,請確認同步已完成。
|
||||
upgrade.version3to4.err.io = 由於I/O的例外,轉移失敗。取得詳細資訊,請查看紀錄。
|
||||
settings.prefGvfsScheme.label = WebDAV的格式
|
||||
# upgrade.fxml
|
||||
upgrade.confirmation.label = 是的,請確認同步已完成。
|
||||
initialize.messageLabel.notEmpty = 檔案庫不是空的
|
||||
unlock.label.savePassword = 儲存密碼
|
||||
unlock.errorMessage.unauthenticVersionMac = 無法認證消息驗證碼版本。
|
||||
89
main/ui/src/main/resources/localization/zh_TW.txt
Normal file
89
main/ui/src/main/resources/localization/zh_TW.txt
Normal file
@@ -0,0 +1,89 @@
|
||||
app.name = Cryptomator
|
||||
# main.fxml
|
||||
main.emptyListInstructions = 按這裡新增檔案庫
|
||||
main.directoryList.contextMenu.remove = 從清單移除
|
||||
main.directoryList.contextMenu.changePassword = 變更密碼
|
||||
main.addDirectory.contextMenu.new = 建立新的檔案庫
|
||||
main.addDirectory.contextMenu.open = 打開現有的檔案庫
|
||||
# welcome.fxml
|
||||
welcome.checkForUpdates.label.currentlyChecking = 檢查更新...
|
||||
welcome.newVersionMessage = 版本 %1$s 可下載。這是 %2$s 。
|
||||
# initialize.fxml
|
||||
initialize.label.password = 密碼
|
||||
initialize.label.retypePassword = 重新輸入密碼
|
||||
initialize.button.ok = 建立檔案庫
|
||||
initialize.messageLabel.alreadyInitialized = 已初始化檔案庫
|
||||
initialize.messageLabel.initializationFailed = 無法初始化檔案庫。取得詳細資訊,請查看紀錄。
|
||||
# notfound.fxml
|
||||
notfound.label = 無法找到檔案庫。已經移置別的地方?
|
||||
# upgrade.fxml
|
||||
upgrade.button = 升級檔案庫
|
||||
upgrade.version3dropBundleExtension.msg = 這個檔案庫需要被轉移到新的格式。\n"%1$s" 將會重新命名為 "%2$s"。\n在進行之前,請確認同步已完成。
|
||||
upgrade.version3dropBundleExtension.err.alreadyExists = 自動轉移失敗。\n"%s" 已存在。
|
||||
# unlock.fxml
|
||||
unlock.label.password = 密碼
|
||||
unlock.label.mountName = 磁碟名稱
|
||||
unlock.label.winDriveLetter = 磁碟代號
|
||||
unlock.label.downloadsPageLink = 所有的 Cryptomator 版本
|
||||
unlock.label.advancedHeading = 進階選項
|
||||
unlock.button.unlock = 解鎖檔案庫
|
||||
unlock.button.advancedOptions.show = 更多選項
|
||||
unlock.button.advancedOptions.hide = 更少選項
|
||||
unlock.choicebox.winDriveLetter.auto = 自動指定
|
||||
unlock.errorMessage.wrongPassword = 錯誤的密碼
|
||||
unlock.errorMessage.mountingFailed = 掛載失敗。取得詳細資訊,請查看紀錄。
|
||||
unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware = 不支援的檔案庫。這個檔案庫是由舊版本的 Cryptomator 所建立的。
|
||||
unlock.errorMessage.unsupportedVersion.softwareOlderThanVault = 不支援的檔案庫。這個檔案庫是由新版本的 Cryptomator 所建立的。
|
||||
unlock.messageLabel.startServerFailed = 啟動 WebDAV 伺服器失敗。
|
||||
# change_password.fxml
|
||||
changePassword.label.oldPassword = 舊密碼
|
||||
changePassword.label.newPassword = 新密碼
|
||||
changePassword.label.retypePassword = 重新輸入密碼
|
||||
changePassword.label.downloadsPageLink = 所有的 Cryptomator 版本
|
||||
changePassword.button.change = 變更密碼
|
||||
changePassword.errorMessage.wrongPassword = 錯誤的密碼
|
||||
changePassword.errorMessage.decryptionFailed = 解密失敗
|
||||
# unlocked.fxml
|
||||
unlocked.button.lock = 鎖住檔案庫
|
||||
unlocked.moreOptions.reveal = 打開磁碟
|
||||
unlocked.moreOptions.copyUrl = 複製 WebDAV 網址
|
||||
unlocked.label.revealFailed = 指令錯誤
|
||||
unlocked.label.unmountFailed = 插入磁碟錯誤
|
||||
unlocked.label.statsEncrypted = 加密的
|
||||
unlocked.label.statsDecrypted = 解密的
|
||||
unlocked.ioGraph.yAxis.label = 傳輸量 (MiB/s)
|
||||
# mac_warnings.fxml
|
||||
macWarnings.windowTitle = 危險 - 損壞的檔案在 %s
|
||||
macWarnings.message = Cryptomator 在下列檔案中,偵測到潛在的損壞威脅:
|
||||
macWarnings.moreInformationButton = 取得更多
|
||||
macWarnings.whitelistButton = 總是解密所選的
|
||||
# settings.fxml
|
||||
settings.version.label = 版本 %s
|
||||
settings.checkForUpdates.label = 檢查更新
|
||||
settings.port.label = WebDAV 埠號 *
|
||||
settings.port.prompt = 0 \= 自動選擇
|
||||
settings.useipv6.label = 使用 IPv6 literal
|
||||
settings.requiresRestartLabel = * Cryptomator 需要更新
|
||||
# tray icon
|
||||
tray.menu.open = 打開
|
||||
tray.menu.quit = 離開
|
||||
tray.infoMsg.title = 仍然在執行
|
||||
tray.infoMsg.msg = Cryptomator 仍然在運作。從工具列的圖示點選離開。
|
||||
tray.infoMsg.msg.osx = Cryptomator 仍然在運作。從選單列上點選離開。
|
||||
initialize.messageLabel.passwordStrength.0 = 非常弱的
|
||||
initialize.messageLabel.passwordStrength.1 = 弱的
|
||||
initialize.messageLabel.passwordStrength.2 = 正常的
|
||||
initialize.messageLabel.passwordStrength.3 = 強的
|
||||
initialize.messageLabel.passwordStrength.4 = 非常強的
|
||||
initialize.label.doNotForget = 重要:如果你忘記的密碼,就無法還原你的資料。
|
||||
main.directoryList.remove.confirmation.title = 移除檔案庫
|
||||
main.directoryList.remove.confirmation.header = 你真的想要移除這個檔案庫?
|
||||
main.directoryList.remove.confirmation.content = 這個檔案庫只會從清單中移除。如果要永久刪除,請從檔案系統中刪除。
|
||||
upgrade.version3to4.msg = 這個檔案庫需要被轉移到新的格式。\n加密的資料夾名稱將會被更新。\n在進行之前,請確認同步已完成。
|
||||
upgrade.version3to4.err.io = 由於 I/O 的例外,轉移失敗。取得詳細資訊,請查看紀錄。
|
||||
settings.prefGvfsScheme.label = WebDAV 格式
|
||||
# upgrade.fxml
|
||||
upgrade.confirmation.label = 是的,請確認同步已完成。
|
||||
initialize.messageLabel.notEmpty = 檔案庫不是空的
|
||||
unlock.label.savePassword = 儲存密碼
|
||||
unlock.errorMessage.unauthenticVersionMac = 無法認證消息驗證碼版本。
|
||||
@@ -6,7 +6,7 @@
|
||||
* Contributors:
|
||||
* Sebastian Stenzel - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.cryptomator.ui;
|
||||
package org.cryptomator.ui.settings;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@@ -31,7 +31,8 @@ public class LocalizationTest {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(LocalizationTest.class);
|
||||
private static final String RESOURCE_FOLDER_PATH = "/localization/";
|
||||
private static final String REF_FILE_NAME = "en.txt";
|
||||
private static final String[] LANG_FILE_NAMES = {"de.txt", "es.txt", "fr.txt", "hu.txt", "it.txt", "kr.txt", "lv.txt", "nl.txt", "pl.txt", "pt.txt", "ru.txt", "sk.txt", "tr.txt", "uk.txt"};
|
||||
private static final String[] LANG_FILE_NAMES = {"de.txt", "es.txt", "fr.txt", "hu.txt", "it.txt", "kr.txt", "lv.txt", "nl.txt", "pl.txt", "pt.txt", "ru.txt", "sk.txt", "tr.txt", "uk.txt", "zh_HK.txt", "zh_TW.txt",
|
||||
"zh.txt"};
|
||||
|
||||
/*
|
||||
* @see Formatter
|
||||
Reference in New Issue
Block a user