Merge branch 'release/1.2.1'

This commit is contained in:
Sebastian Stenzel
2016-11-10 15:23:11 +01:00
29 changed files with 354 additions and 53 deletions

View File

@@ -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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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(() -> {

View File

@@ -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) {

View File

@@ -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);
}
}

View 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);
}
}

View File

@@ -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

View 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 = 无法验证消息验证代码的版本。

View 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 = 無法認證消息驗證碼版本。

View 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 = 無法認證消息驗證碼版本。

View File

@@ -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