diff --git a/README.md b/README.md
index b587298b5..400222c7d 100644
--- a/README.md
+++ b/README.md
@@ -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
diff --git a/main/ant-kit/pom.xml b/main/ant-kit/pom.xml
index 601346301..a8071f010 100644
--- a/main/ant-kit/pom.xml
+++ b/main/ant-kit/pom.xml
@@ -8,7 +8,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
ant-kit
pom
diff --git a/main/commons-test/pom.xml b/main/commons-test/pom.xml
index 21158bbaa..be5582cd7 100644
--- a/main/commons-test/pom.xml
+++ b/main/commons-test/pom.xml
@@ -10,7 +10,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
commons-test
Cryptomator common test dependencies
diff --git a/main/commons/pom.xml b/main/commons/pom.xml
index 152fa7313..4b3ee1003 100644
--- a/main/commons/pom.xml
+++ b/main/commons/pom.xml
@@ -10,7 +10,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
commons
Cryptomator common
diff --git a/main/filesystem-api/pom.xml b/main/filesystem-api/pom.xml
index 3f7342a3b..cdd06797c 100644
--- a/main/filesystem-api/pom.xml
+++ b/main/filesystem-api/pom.xml
@@ -9,7 +9,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
filesystem-api
Cryptomator filesystem: API
diff --git a/main/filesystem-charsets/pom.xml b/main/filesystem-charsets/pom.xml
index e8aa48799..5e07d6763 100644
--- a/main/filesystem-charsets/pom.xml
+++ b/main/filesystem-charsets/pom.xml
@@ -12,7 +12,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
filesystem-charsets
Cryptomator filesystem: Charset compatibility layer
diff --git a/main/filesystem-crypto-integration-tests/pom.xml b/main/filesystem-crypto-integration-tests/pom.xml
index af67a1480..d5194f98c 100644
--- a/main/filesystem-crypto-integration-tests/pom.xml
+++ b/main/filesystem-crypto-integration-tests/pom.xml
@@ -12,7 +12,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
filesystem-crypto-integration-tests
Cryptomator filesystem: Encryption layer tests
diff --git a/main/filesystem-crypto/pom.xml b/main/filesystem-crypto/pom.xml
index 517566bbe..20919972b 100644
--- a/main/filesystem-crypto/pom.xml
+++ b/main/filesystem-crypto/pom.xml
@@ -12,7 +12,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
filesystem-crypto
Cryptomator filesystem: Encryption layer
diff --git a/main/filesystem-inmemory/pom.xml b/main/filesystem-inmemory/pom.xml
index d40ac9f35..04427d655 100644
--- a/main/filesystem-inmemory/pom.xml
+++ b/main/filesystem-inmemory/pom.xml
@@ -12,7 +12,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
filesystem-inmemory
Cryptomator filesystem: In-memory mock
diff --git a/main/filesystem-invariants-tests/pom.xml b/main/filesystem-invariants-tests/pom.xml
index 9ba7f6433..7ddd03d0e 100644
--- a/main/filesystem-invariants-tests/pom.xml
+++ b/main/filesystem-invariants-tests/pom.xml
@@ -9,7 +9,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
filesystem-invariants-tests
Cryptomator filesystem: Invariants tests
diff --git a/main/filesystem-nameshortening/pom.xml b/main/filesystem-nameshortening/pom.xml
index 362163018..4336ebb53 100644
--- a/main/filesystem-nameshortening/pom.xml
+++ b/main/filesystem-nameshortening/pom.xml
@@ -12,7 +12,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
filesystem-nameshortening
Cryptomator filesystem: Name shortening layer
diff --git a/main/filesystem-nio/pom.xml b/main/filesystem-nio/pom.xml
index 7df577334..c1da3d816 100644
--- a/main/filesystem-nio/pom.xml
+++ b/main/filesystem-nio/pom.xml
@@ -7,7 +7,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
filesystem-nio
Cryptomator filesystem: NIO-based physical layer
diff --git a/main/filesystem-stats/pom.xml b/main/filesystem-stats/pom.xml
index 3a7937188..5a86d503e 100644
--- a/main/filesystem-stats/pom.xml
+++ b/main/filesystem-stats/pom.xml
@@ -12,7 +12,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
filesystem-stats
Cryptomator filesystem: Throughput statistics
diff --git a/main/frontend-api/pom.xml b/main/frontend-api/pom.xml
index f06a270db..0caca5bbc 100644
--- a/main/frontend-api/pom.xml
+++ b/main/frontend-api/pom.xml
@@ -12,7 +12,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
frontend-api
Cryptomator frontend: API
diff --git a/main/frontend-webdav/pom.xml b/main/frontend-webdav/pom.xml
index 083961c2a..12fa71d63 100644
--- a/main/frontend-webdav/pom.xml
+++ b/main/frontend-webdav/pom.xml
@@ -12,7 +12,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
frontend-webdav
Cryptomator frontend: WebDAV frontend
diff --git a/main/jacoco-report/pom.xml b/main/jacoco-report/pom.xml
index 3131db4ea..29b003937 100644
--- a/main/jacoco-report/pom.xml
+++ b/main/jacoco-report/pom.xml
@@ -5,7 +5,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
jacoco-report
Cryptomator Code Coverage Report
diff --git a/main/keychain/pom.xml b/main/keychain/pom.xml
index 2d497f4d7..246ac4d9c 100644
--- a/main/keychain/pom.xml
+++ b/main/keychain/pom.xml
@@ -3,7 +3,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
keychain
System Keychain Access
diff --git a/main/pom.xml b/main/pom.xml
index 313f85004..01a9a958e 100644
--- a/main/pom.xml
+++ b/main/pom.xml
@@ -6,7 +6,7 @@
4.0.0
org.cryptomator
main
- 1.2.0
+ 1.2.1
pom
Cryptomator
@@ -27,7 +27,7 @@
UTF-8
- 1.0.2
+ 1.0.7
1.0.0
2.1
1.7.7
diff --git a/main/uber-jar/pom.xml b/main/uber-jar/pom.xml
index dadceab2a..f078456b9 100644
--- a/main/uber-jar/pom.xml
+++ b/main/uber-jar/pom.xml
@@ -12,7 +12,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
uber-jar
pom
diff --git a/main/ui/pom.xml b/main/ui/pom.xml
index 82b2df321..f72545892 100644
--- a/main/ui/pom.xml
+++ b/main/ui/pom.xml
@@ -12,7 +12,7 @@
org.cryptomator
main
- 1.2.0
+ 1.2.1
ui
Cryptomator GUI
diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java
index f6b19cb8a..a8d241431 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java
@@ -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(() -> {
diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategy.java b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategy.java
index 8f80f693b..9dba19a37 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategy.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategy.java
@@ -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) {
diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion4to5.java b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion4to5.java
index 487f98b85..0629083d6 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion4to5.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion4to5.java
@@ -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);
}
}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/settings/Localization.java b/main/ui/src/main/java/org/cryptomator/ui/settings/Localization.java
index c13000625..b51382fcd 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/settings/Localization.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/settings/Localization.java
@@ -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);
}
}
diff --git a/main/ui/src/main/resources/localization/nl.txt b/main/ui/src/main/resources/localization/nl.txt
index f037ef101..001920dbc 100644
--- a/main/ui/src/main/resources/localization/nl.txt
+++ b/main/ui/src/main/resources/localization/nl.txt
@@ -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.
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/zh.txt b/main/ui/src/main/resources/localization/zh.txt
new file mode 100644
index 000000000..f2b47e554
--- /dev/null
+++ b/main/ui/src/main/resources/localization/zh.txt
@@ -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 = 无法验证消息验证代码的版本。
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/zh_HK.txt b/main/ui/src/main/resources/localization/zh_HK.txt
new file mode 100644
index 000000000..777e7a168
--- /dev/null
+++ b/main/ui/src/main/resources/localization/zh_HK.txt
@@ -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 = 無法認證消息驗證碼版本。
\ No newline at end of file
diff --git a/main/ui/src/main/resources/localization/zh_TW.txt b/main/ui/src/main/resources/localization/zh_TW.txt
new file mode 100644
index 000000000..4eb8df637
--- /dev/null
+++ b/main/ui/src/main/resources/localization/zh_TW.txt
@@ -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 = 無法認證消息驗證碼版本。
\ No newline at end of file
diff --git a/main/ui/src/test/java/org/cryptomator/ui/LocalizationTest.java b/main/ui/src/test/java/org/cryptomator/ui/settings/LocalizationTest.java
similarity index 96%
rename from main/ui/src/test/java/org/cryptomator/ui/LocalizationTest.java
rename to main/ui/src/test/java/org/cryptomator/ui/settings/LocalizationTest.java
index 6f086064c..82899c64b 100644
--- a/main/ui/src/test/java/org/cryptomator/ui/LocalizationTest.java
+++ b/main/ui/src/test/java/org/cryptomator/ui/settings/LocalizationTest.java
@@ -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