Prechádzať zdrojové kódy

Merge branch 'release/1.5.6'

Sebastian Stenzel 4 rokov pred
rodič
commit
ac2dc06bd6

+ 1 - 1
main/buildkit/pom.xml

@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>org.cryptomator</groupId>
 		<artifactId>main</artifactId>
-		<version>1.5.5</version>
+		<version>1.5.6</version>
 	</parent>
 	<artifactId>buildkit</artifactId>
 	<packaging>pom</packaging>

+ 1 - 1
main/commons/pom.xml

@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>org.cryptomator</groupId>
 		<artifactId>main</artifactId>
-		<version>1.5.5</version>
+		<version>1.5.6</version>
 	</parent>
 	<artifactId>commons</artifactId>
 	<name>Cryptomator Commons</name>

+ 10 - 5
main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java

@@ -34,9 +34,10 @@ public class VaultSettings {
 	public static final boolean DEFAULT_USES_INDIVIDUAL_MOUNTPATH = false;
 	public static final boolean DEFAULT_USES_READONLY_MODE = false;
 	public static final String DEFAULT_MOUNT_FLAGS = "";
+	public static final String DEFAULT_MOUNT_NAME = "Vault";
 	public static final int DEFAULT_FILENAME_LENGTH_LIMIT = -1;
 	public static final WhenUnlocked DEFAULT_ACTION_AFTER_UNLOCK = WhenUnlocked.ASK;
-	
+
 	private static final Random RNG = new Random(); 
 
 	private final String id;
@@ -55,16 +56,20 @@ public class VaultSettings {
 	public VaultSettings(String id) {
 		this.id = Objects.requireNonNull(id);
 
-		EasyBind.subscribe(path, this::deriveMountNameFromPath);
+		EasyBind.subscribe(path, this::deriveMountNameFromPathOrUseDefault);
 	}
 
 	Observable[] observables() {
 		return new Observable[]{path, mountName, winDriveLetter, unlockAfterStartup, revealAfterMount, useCustomMountPath, customMountPath, usesReadOnlyMode, mountFlags, filenameLengthLimit, actionAfterUnlock};
 	}
 
-	private void deriveMountNameFromPath(Path path) {
-		if (path != null && StringUtils.isBlank(mountName.get())) {
-			mountName.set(normalizeMountName(path.getFileName().toString()));
+	private void deriveMountNameFromPathOrUseDefault(Path path) {
+		if (StringUtils.isBlank(mountName.get())) {
+			if (path != null && path.getFileName() != null) {
+				mountName.set(normalizeMountName(path.getFileName().toString()));
+			} else {
+				mountName.set(DEFAULT_MOUNT_NAME);
+			}
 		}
 	}
 

+ 1 - 1
main/keychain/pom.xml

@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>org.cryptomator</groupId>
 		<artifactId>main</artifactId>
-		<version>1.5.5</version>
+		<version>1.5.6</version>
 	</parent>
 	<artifactId>keychain</artifactId>
 	<name>System Keychain Access</name>

+ 1 - 1
main/launcher/pom.xml

@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>org.cryptomator</groupId>
 		<artifactId>main</artifactId>
-		<version>1.5.5</version>
+		<version>1.5.6</version>
 	</parent>
 	<artifactId>launcher</artifactId>
 	<name>Cryptomator Launcher</name>

+ 30 - 0
main/launcher/src/main/java/org/cryptomator/logging/LaunchAndSizeBasedTriggerinPolicy.java

@@ -0,0 +1,30 @@
+package org.cryptomator.logging;
+
+import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
+import ch.qos.logback.core.rolling.TriggeringPolicyBase;
+import ch.qos.logback.core.util.FileSize;
+
+import java.io.File;
+
+/**
+ * Triggers a roll-over either on the first log event or if watched log file reaches a certain size
+ *
+ * @param <E> Event type the policy possibly reacts to
+ */
+public class LaunchAndSizeBasedTriggerinPolicy<E> extends TriggeringPolicyBase<E> {
+
+	LaunchBasedTriggeringPolicy<E> launchBasedTriggeringPolicy;
+	SizeBasedTriggeringPolicy<E> sizeBasedTriggeringPolicy;
+
+	public LaunchAndSizeBasedTriggerinPolicy(FileSize threshold) {
+		this.launchBasedTriggeringPolicy = new LaunchBasedTriggeringPolicy<>();
+		this.sizeBasedTriggeringPolicy = new SizeBasedTriggeringPolicy<>();
+		sizeBasedTriggeringPolicy.setMaxFileSize(threshold);
+	}
+
+	@Override
+	public boolean isTriggeringEvent(File activeFile, E event) {
+		return launchBasedTriggeringPolicy.isTriggeringEvent(activeFile, event) || sizeBasedTriggeringPolicy.isTriggeringEvent(activeFile, event);
+	}
+
+}

+ 4 - 3
main/launcher/src/main/java/org/cryptomator/logging/LoggerModule.java

@@ -9,10 +9,9 @@ import ch.qos.logback.core.Appender;
 import ch.qos.logback.core.ConsoleAppender;
 import ch.qos.logback.core.FileAppender;
 import ch.qos.logback.core.helpers.NOPAppender;
-import ch.qos.logback.core.hook.DelayingShutdownHook;
 import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
 import ch.qos.logback.core.rolling.RollingFileAppender;
-import ch.qos.logback.core.util.Duration;
+import ch.qos.logback.core.util.FileSize;
 import dagger.Module;
 import dagger.Provides;
 import org.cryptomator.common.Environment;
@@ -33,6 +32,8 @@ public class LoggerModule {
 	private static final int LOGFILE_ROLLING_MIN = 1;
 	private static final int LOGFILE_ROLLING_MAX = 9;
 	private static final String LOG_PATTERN = "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n";
+	private static final String LOG_MAX_SIZE = "100mb";
+
 	static final Map<String, Level> DEFAULT_LOG_LEVELS = Map.of( //
 			Logger.ROOT_LOGGER_NAME, Level.INFO, //
 			"org.cryptomator", Level.INFO //
@@ -84,7 +85,7 @@ public class LoggerModule {
 			appender.setContext(context);
 			appender.setFile(logDir.resolve(LOGFILE_NAME).toString());
 			appender.setEncoder(encoder);
-			LaunchBasedTriggeringPolicy triggeringPolicy = new LaunchBasedTriggeringPolicy();
+			LaunchAndSizeBasedTriggerinPolicy triggeringPolicy = new LaunchAndSizeBasedTriggerinPolicy(FileSize.valueOf(LOG_MAX_SIZE));
 			triggeringPolicy.setContext(context);
 			triggeringPolicy.start();
 			appender.setTriggeringPolicy(triggeringPolicy);

+ 7 - 7
main/pom.xml

@@ -3,7 +3,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>org.cryptomator</groupId>
 	<artifactId>main</artifactId>
-	<version>1.5.5</version>
+	<version>1.5.6</version>
 	<packaging>pom</packaging>
 	<name>Cryptomator</name>
 
@@ -24,7 +24,7 @@
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 
 		<!-- cryptomator dependencies -->
-		<cryptomator.cryptofs.version>1.9.11</cryptomator.cryptofs.version>
+		<cryptomator.cryptofs.version>1.9.12</cryptomator.cryptofs.version>
 		<cryptomator.jni.version>2.2.2</cryptomator.jni.version>
 		<cryptomator.fuse.version>1.2.3</cryptomator.fuse.version>
 		<cryptomator.dokany.version>1.1.15</cryptomator.dokany.version>
@@ -32,18 +32,18 @@
 
 		<!-- 3rd party dependencies -->
 		<javafx.version>14</javafx.version>
-		<commons-lang3.version>3.9</commons-lang3.version>
+		<commons-lang3.version>3.10</commons-lang3.version>
 		<secret-service.version>1.0.0</secret-service.version>
-		<jwt.version>3.10.2</jwt.version>
+		<jwt.version>3.10.3</jwt.version>
 		<easybind.version>1.0.3</easybind.version>
-		<guava.version>28.2-jre</guava.version>
-		<dagger.version>2.27</dagger.version>
+		<guava.version>29.0-jre</guava.version>
+		<dagger.version>2.22</dagger.version>
 		<gson.version>2.8.6</gson.version>
 		<slf4j.version>1.7.30</slf4j.version>
 		<logback.version>1.2.3</logback.version>
 
 		<!-- test dependencies -->
-		<junit.jupiter.version>5.6.1</junit.jupiter.version>
+		<junit.jupiter.version>5.6.2</junit.jupiter.version>
 		<mockito.version>3.3.3</mockito.version>
 		<hamcrest.version>2.2</hamcrest.version>
 	</properties>

+ 1 - 1
main/ui/pom.xml

@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>org.cryptomator</groupId>
 		<artifactId>main</artifactId>
-		<version>1.5.5</version>
+		<version>1.5.6</version>
 	</parent>
 	<artifactId>ui</artifactId>
 	<name>Cryptomator GUI</name>

+ 32 - 0
main/ui/src/main/java/org/cryptomator/ui/common/WeakBindings.java

@@ -0,0 +1,32 @@
+package org.cryptomator.ui.common;
+
+import javafx.beans.binding.StringBinding;
+import javafx.beans.value.ObservableObjectValue;
+
+
+/**
+ * Contains a variety of method to create {@link java.util.function.Function#identity() identity}-bindings
+ * to facilitate the Weak References used internally in JavaFX's Bindings.
+ */
+public final class WeakBindings {
+
+	/**
+	 * Create a new StringBinding that listens to changes from the given observable without being strongly referenced by it.
+	 *
+	 * @param observable The observable
+	 * @return a StringBinding weakly referenced from the given observable
+	 */
+	public static StringBinding bindString(ObservableObjectValue<String> observable) {
+		return new StringBinding() {
+			{
+				bind(observable);
+			}
+
+			@Override
+			protected String computeValue() {
+				return observable.get();
+			}
+		};
+	}
+
+}

+ 11 - 3
main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockController.java

@@ -8,6 +8,7 @@ import javafx.animation.Timeline;
 import javafx.beans.binding.Bindings;
 import javafx.beans.binding.BooleanBinding;
 import javafx.beans.binding.ObjectBinding;
+import javafx.beans.binding.StringBinding;
 import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.ReadOnlyBooleanProperty;
 import javafx.beans.property.SimpleBooleanProperty;
@@ -23,6 +24,7 @@ import org.cryptomator.common.vaults.Vault;
 import org.cryptomator.keychain.KeychainManager;
 import org.cryptomator.ui.common.FxController;
 import org.cryptomator.ui.common.UserInteractionLock;
+import org.cryptomator.ui.common.WeakBindings;
 import org.cryptomator.ui.controls.NiceSecurePasswordField;
 import org.cryptomator.ui.forgetPassword.ForgetPasswordComponent;
 import org.slf4j.Logger;
@@ -51,7 +53,8 @@ public class UnlockController implements FxController {
 	private final ObjectBinding<ContentDisplay> unlockButtonContentDisplay;
 	private final BooleanBinding userInteractionDisabled;
 	private final BooleanProperty unlockButtonDisabled;
-	
+	private final StringBinding vaultName;
+
 	public NiceSecurePasswordField passwordField;
 	public CheckBox savePasswordCheckbox;
 	public ImageView face;
@@ -74,6 +77,7 @@ public class UnlockController implements FxController {
 		this.unlockButtonContentDisplay = Bindings.createObjectBinding(this::getUnlockButtonContentDisplay, passwordEntryLock.awaitingInteraction());
 		this.userInteractionDisabled = passwordEntryLock.awaitingInteraction().not();
 		this.unlockButtonDisabled = new SimpleBooleanProperty();
+		this.vaultName = WeakBindings.bindString(vault.displayableNameProperty());
 		this.window.setOnCloseRequest(windowEvent -> cancel());
 	}
 
@@ -177,8 +181,12 @@ public class UnlockController implements FxController {
 
 	/* Getter/Setter */
 
-	public Vault getVault() {
-		return vault;
+	public String getVaultName() {
+		return vaultName.get();
+	}
+	
+	public StringBinding vaultNameProperty() {
+		return vaultName;
 	}
 
 	public ObjectBinding<ContentDisplay> unlockButtonContentDisplayProperty() {

+ 1 - 1
main/ui/src/main/resources/fxml/unlock.fxml

@@ -46,7 +46,7 @@
 				</ImageView>
 			</StackPane>
 			<VBox spacing="6" HBox.hgrow="ALWAYS">
-				<FormattedLabel format="%unlock.passwordPrompt" arg1="${controller.vault.displayableName}" wrapText="true"/>
+				<FormattedLabel format="%unlock.passwordPrompt" arg1="${controller.vaultName}" wrapText="true"/>
 				<NiceSecurePasswordField fx:id="passwordField" disable="${controller.userInteractionDisabled}"/>
 				<CheckBox fx:id="savePasswordCheckbox" text="%unlock.savePassword" onAction="#didClickSavePasswordCheckbox" disable="${controller.userInteractionDisabled}" visible="${controller.keychainAccessAvailable}"/>
 			</VBox>

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 196 - 0
main/ui/src/main/resources/i18n/strings_el.properties


+ 5 - 0
main/ui/src/main/resources/i18n/strings_hi.properties

@@ -14,6 +14,7 @@ generic.button.next=अगला
 generic.button.print=प्रिंट करें
 ## Error
 generic.error.title=कोई अनपेक्षित त्रुटि हो गई है
+generic.error.instruction=ऐसा नहीं होना चाहिए था। कृपया नीचे त्रुटि पाठ की रिपोर्ट करें और इस त्रुटि के लिए क्या कदम उठाए, इसका विवरण शामिल करें।
 
 # Tray Menu
 traymenu.showMainWindow=दिखाएँ
@@ -49,6 +50,7 @@ addvaultwizard.existing.chooseBtn=चुनें…
 # Remove Vault
 
 # Change Password
+changepassword.title=पासवर्ड बदलें
 
 # Forget Password
 
@@ -107,10 +109,13 @@ vaultOptions.mount.mountPoint.directoryPickerButton=चुनें…
 vaultOptions.mount.mountPoint.directoryPickerTitle=कोई खाली जगह चुने
 ## Master Key
 vaultOptions.masterkey=पासवर्ड
+vaultOptions.masterkey.changePasswordBtn=पासवर्ड बदलें
 
 # Recovery Key
 
 # New Password
+newPassword.promptText=नया पासवर्ड दर्ज करें
+newPassword.reenterPassword=नए पासवर्ड की पुष्टि करें
 passwordStrength.messageLabel.0=बहुत कमज़ोर
 passwordStrength.messageLabel.1=कमजोर
 passwordStrength.messageLabel.2=बढ़िया

+ 2 - 0
main/ui/src/main/resources/i18n/strings_ko.properties

@@ -42,6 +42,7 @@ addvaultwizard.new.directoryPickerLabel=사용자 지정 위치
 addvaultwizard.new.directoryPickerButton=선택
 addvaultwizard.new.directoryPickerTitle=디렉터리 선택
 addvaultwizard.new.fileAlreadyExists=이미 다른 객체가 존재하고 있어 해당 경로에 Vault를 생성할 수 없습니다.
+addvaultwizard.new.locationDoesNotExist=하나 이상의 경로 구성 요소가 없기 때문에 이 경로에 Vault가 생성 될 수 없습니다.
 addvaultwizard.new.invalidName=유효하지 않은 Vault 이름입니다. 일반적인 디렉터리 이름으로 지정해주십시요.
 ### Password
 addvaultwizard.new.createVaultBtn=Vault 생성
@@ -228,6 +229,7 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=빈 디렉터리를 선택
 ## Master Key
 vaultOptions.masterkey=비밀번호
 vaultOptions.masterkey.changePasswordBtn=비밀번호 변경
+vaultOptions.masterkey.forgetSavedPasswordBtn=저장된 비밀번호 삭제
 vaultOptions.masterkey.recoveryKeyExpanation=복구 키는 비밀번호를 잊어버렸을 때, Vault의 접근을 복원 할 수 있는 유일한 방법입니다.
 vaultOptions.masterkey.showRecoveryKeyBtn=복구 키 표시
 vaultOptions.masterkey.recoverPasswordBtn=비밀번호 복구

+ 4 - 0
main/ui/src/main/resources/i18n/strings_nb.properties

@@ -42,6 +42,7 @@ addvaultwizard.new.directoryPickerLabel=Tilpasset lagringssted
 addvaultwizard.new.directoryPickerButton=Velg…
 addvaultwizard.new.directoryPickerTitle=Velg mappe
 addvaultwizard.new.fileAlreadyExists=Hvelvet kan ikke opprettes på denne søkestien fordi et objekt allerede eksisterer.
+addvaultwizard.new.locationDoesNotExist=Hvelvet kan ikke opprettes på denne søkestien fordi minst én søkestikomponent ikke finnes.
 addvaultwizard.new.invalidName=Ugyldig navn på hvelvet. Vennligst vurder et vanlig mappenavn.
 ### Password
 addvaultwizard.new.createVaultBtn=Opprett hvelv
@@ -175,8 +176,10 @@ main.vaultlist.addVaultBtn=Legg til hvelv
 main.vaultDetail.welcomeOnboarding=Takk for at du valgte Cryptomator for å beskytte filene dine. Hvis du trenger hjelp, sjekk ut våre guider for å komme i gang:
 ### Locked
 main.vaultDetail.lockedStatus=LÅST
+main.vaultDetail.unlockBtn=Lås opp…
 main.vaultDetail.unlockNowBtn=Lås opp nå
 main.vaultDetail.optionsBtn=Alternativer for hvelvet
+main.vaultDetail.passwordSavedInKeychain=Passordet er lagret
 ### Unlocked
 main.vaultDetail.unlockedStatus=ULÅST
 main.vaultDetail.accessLocation=Innholdet i hvelvet ditt er tilgjengelig her:
@@ -226,6 +229,7 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Velg en tom mappe
 ## Master Key
 vaultOptions.masterkey=Passord
 vaultOptions.masterkey.changePasswordBtn=Endre passord
+vaultOptions.masterkey.forgetSavedPasswordBtn=Glem passord
 vaultOptions.masterkey.recoveryKeyExpanation=En gjenopprettingsnøkkel er den eneste måten å gjenopprette tilgangen til et hvelv på hvis du mister passordet.
 vaultOptions.masterkey.showRecoveryKeyBtn=Vis gjenopprettingsnøkkelen
 vaultOptions.masterkey.recoverPasswordBtn=Gjenopprett passord

+ 4 - 0
main/ui/src/main/resources/i18n/strings_nn.properties

@@ -42,6 +42,7 @@ addvaultwizard.new.directoryPickerLabel=Tilpassa lagringsstad
 addvaultwizard.new.directoryPickerButton=Vel…
 addvaultwizard.new.directoryPickerTitle=Vel mappe
 addvaultwizard.new.fileAlreadyExists=Kvelven kan ikkje opprettast på denne søkestien fordi eit objekt allereie eksisterer her.
+addvaultwizard.new.locationDoesNotExist=Kvelven kan ikkje opprettast på denne søkjestien fordi minst éin søkjestikomponent ikkje finst.
 addvaultwizard.new.invalidName=Ugyldig namn på kvelven. Ver vennleg og vurder eit vanleg mappenamn.
 ### Password
 addvaultwizard.new.createVaultBtn=Opprett kvelven
@@ -175,8 +176,10 @@ main.vaultlist.addVaultBtn=Legg til kvelv
 main.vaultDetail.welcomeOnboarding=Takk for at du valde Cryptomator for å verna filene dine. Viss du treng hjelp, sjekk ut guidane våre for å komma i gang:
 ### Locked
 main.vaultDetail.lockedStatus=LÅST
+main.vaultDetail.unlockBtn=Lås opp…
 main.vaultDetail.unlockNowBtn=Lås opp no
 main.vaultDetail.optionsBtn=Alternativ for kvelven
+main.vaultDetail.passwordSavedInKeychain=Passordet er lagra
 ### Unlocked
 main.vaultDetail.unlockedStatus=ULÅST
 main.vaultDetail.accessLocation=Innhaldet i kvelven din er tilgjengeleg her:
@@ -226,6 +229,7 @@ vaultOptions.mount.mountPoint.directoryPickerTitle=Vel ei tom mappe
 ## Master Key
 vaultOptions.masterkey=Passord
 vaultOptions.masterkey.changePasswordBtn=Byt passord
+vaultOptions.masterkey.forgetSavedPasswordBtn=Gløym passord
 vaultOptions.masterkey.recoveryKeyExpanation=Ein "retta opp igjen"-nøkkel er den einaste måten å retta opp igjen tilgangen til ein kvelv på viss du mistar passordet.
 vaultOptions.masterkey.showRecoveryKeyBtn=Vis 'Retta opp igjen'-nøkkelen
 vaultOptions.masterkey.recoverPasswordBtn=Rett opp igjen passord

+ 88 - 2
main/ui/src/main/resources/i18n/strings_pl.properties

@@ -62,7 +62,7 @@ addvault.new.readme.storageLocation.8=2. Odblokuj sejf w programie Cryptomator.
 addvault.new.readme.storageLocation.9=3. Otwórz miejsce z odszyfrowanymi plikami, klikając przycisk "Pokaż".
 addvault.new.readme.storageLocation.10=Jeśli potrzebujesz pomocy, sprawdź dokumentację: %s
 addvault.new.readme.accessLocation.fileName=WELCOME.rtf
-addvault.new.readme.accessLocation.1=🔐 ZASZYFROWANY DYSK 🔐
+addvault.new.readme.accessLocation.1=🔐 ZASZYFROWANY UDZIAŁ 🔐
 addvault.new.readme.accessLocation.2=Tu są przechowywane pliki Twojego sejfu.
 addvault.new.readme.accessLocation.3=Wszystkie pliki dodane tutaj zostaną zaszyfrowane przez Cryptomator. Możesz tu wykonywać operacje jak na każdym innym dysku czy katalogu. To jest jedynie odszyfrowany podgląd Twoich plików, wszystkie pozostają cały czas zaszyfrowane na Twoim dysku twardym.
 addvault.new.readme.accessLocation.4=Jeśli chcesz możesz spokojnie usunąć ten plik.
@@ -96,7 +96,7 @@ unlock.savePassword=Zapamiętaj hasło
 unlock.unlockBtn=Odblokuj
 ## Success
 unlock.success.message="%s" został odblokowany! Twój sejf jest teraz dostępny.
-unlock.success.rememberChoice=Zapamiętaj wybór i nie pokazuj ponownie tego okna
+unlock.success.rememberChoice=Zapamiętaj wybór, nie pokazuj tego ponownie
 unlock.success.revealBtn=Otwórz sejf
 ## Invalid Mount Point
 unlock.error.invalidMountPoint=Punkt montowania nie jest pustym katalogiem: %s
@@ -135,40 +135,126 @@ preferences.general.theme.dark=Ciemny
 preferences.general.unlockThemes=Odblokuj tryb ciemny
 preferences.general.startHidden=Ukryj okno podczas uruchamiania programu Cryptomator
 preferences.general.debugLogging=Włącz logowanie w trybie debug
+preferences.general.debugDirectory=Pokaż pliki logowania
+preferences.general.autoStart=Uruchom Cryptomator po uruchomieniu systemu
+preferences.general.interfaceOrientation=Układ interfejsu
+preferences.general.interfaceOrientation.ltr=Od lewej do prawej
+preferences.general.interfaceOrientation.rtl=Od prawej do lewej
 ## Volume
+preferences.volume=Dysk wirtualny
+preferences.volume.type=Typ udziału
+preferences.volume.webdav.port=WebDAV Port
+preferences.volume.webdav.scheme=WebDAV Scheme
 ## Updates
+preferences.updates=Aktualizacje
+preferences.updates.currentVersion=Obecna wersja: %s
+preferences.updates.autoUpdateCheck=Automatycznie sprawdzaj aktualizacje
+preferences.updates.checkNowBtn=Sprawdź teraz
+preferences.updates.updateAvailable=Dostępna jest aktualizacja do wersji %s.
 ## Donation Key
+preferences.donationKey=Dotacja
+preferences.donationKey.registeredFor=Zarejestrowano dla %s
+preferences.donationKey.noDonationKey=Nie znaleziono aktualnego klucza dotacji. To taki klucz licencyjny, ale dla niesamowitych ludzi używających darmowego oprogramowania. ;-)
+preferences.donationKey.getDonationKey=Zdobądź klucz dotacji
 ## About
+preferences.about=O programie
 
 # Main Window
 main.closeBtn.tooltip=Zamknij
+main.minimizeBtn.tooltip=Minimalizuj
 main.preferencesBtn.tooltip=Ustawienia
+main.donationKeyMissing.tooltip=Rozważ przekazanie dotacji
 ## Drag 'n' Drop
+main.dropZone.dropVault=Dodaj ten sejf
+main.dropZone.unknownDragboardContent=Jeśli chcesz dodać sejf, przeciągnij go do tego okna
 ## Vault List
+main.vaultlist.emptyList.onboardingInstruction=Kliknij tutaj, aby dodać sejf
 main.vaultlist.contextMenu.remove=Usuń sejf
 main.vaultlist.addVaultBtn=Dodaj sejf
 ## Vault Detail
 ### Welcome
+main.vaultDetail.welcomeOnboarding=Dziękujemy za wybranie programu Cryptomator do ochrony plików. Jeśli potrzebujesz pomocy, sprawdź nasze przewodniki:
 ### Locked
+main.vaultDetail.lockedStatus=ZABLOKOWANY
+main.vaultDetail.unlockBtn=Odblokuj…
 main.vaultDetail.unlockNowBtn=Odblokuj teraz
+main.vaultDetail.optionsBtn=Ustawienia sejfu
+main.vaultDetail.passwordSavedInKeychain=Hasło zapisane
 ### Unlocked
+main.vaultDetail.unlockedStatus=ODBLOKOWANE
+main.vaultDetail.accessLocation=Zawartość Twojego sejfu dostępna jest tutaj:
+main.vaultDetail.revealBtn=Otwórz lokalizację
 main.vaultDetail.lockBtn=Blokuj
+main.vaultDetail.bytesPerSecondRead=odczyt:
+main.vaultDetail.bytesPerSecondWritten=zapis:
+main.vaultDetail.throughput.idle=bezczynny
+main.vaultDetail.throughput.kbps=%.1f kiB/s
+main.vaultDetail.throughput.mbps=%.1f MiB/s
 ### Missing
+main.vaultDetail.missing.info=Cryptomator nie mógł znaleźć sejfu w tej lokalizacji.
 ### Needs Migration
 main.vaultDetail.migrateButton=Aktualizuj sejf
+main.vaultDetail.migratePrompt=Twój sejf musi zostać zaktualizowany do nowego formatu, zanim będziesz mógł go używać
 
 # Wrong File Alert
+wrongFileAlert.title=Jak szyfrować pliki
+wrongFileAlert.header.title=Czy chciałeś zaszyfrować te pliki?
+wrongFileAlert.header.lead=W tym celu Cryptomator zapewnia udział dostępny w menedżerze plików.
+wrongFileAlert.instruction.0=Aby zaszyfrować pliki, wykonaj następujące kroki:
+wrongFileAlert.instruction.1=1. Odblokuj swój sejf.
+wrongFileAlert.instruction.2=2. Kliknij na "Otwórz lokalizację", aby otworzyć udział w menedżerze plików.
+wrongFileAlert.instruction.3=3. Dodaj pliki do tego udziału.
+wrongFileAlert.link=Aby uzyskać pomoc, wejdź na
 
 # Vault Options
 ## General
 vaultOptions.general=Ogólne
+vaultOptions.general.unlockAfterStartup=Odblokuj sejf podczas uruchamiania programu Cryptomator
+vaultOptions.general.actionAfterUnlock=Po udanym odblokowaniu
+vaultOptions.general.actionAfterUnlock.ignore=Nic nie rób
+vaultOptions.general.actionAfterUnlock.reveal=Otwórz lokalizację
+vaultOptions.general.actionAfterUnlock.ask=Zapytaj
 ## Mount
+vaultOptions.mount=Montowanie
+vaultOptions.mount.readonly=Tylko do odczytu
+vaultOptions.mount.driveName=Nazwa udziału
+vaultOptions.mount.customMountFlags=Własne flagi montowania udziału
+vaultOptions.mount.winDriveLetterOccupied=zajęty
+vaultOptions.mount.mountPoint=Punkt montowania
+vaultOptions.mount.mountPoint.auto=Automatycznie wybierz odpowiednią lokalizację
+vaultOptions.mount.mountPoint.driveLetter=Użyj przypisanej litery dysku
+vaultOptions.mount.mountPoint.custom=Własna ścieżka
 vaultOptions.mount.mountPoint.directoryPickerButton=Wybierz…
+vaultOptions.mount.mountPoint.directoryPickerTitle=Wybierz pusty katalog
 ## Master Key
+vaultOptions.masterkey=Hasło
 vaultOptions.masterkey.changePasswordBtn=Zmiana Hasła
+vaultOptions.masterkey.forgetSavedPasswordBtn=Zapomnij zapamiętane hasło
+vaultOptions.masterkey.recoveryKeyExpanation=Klucz odzyskiwania jest twoim jedynym sposobem przywrócenia dostępu do sejfu w przypadku utraty hasła.
+vaultOptions.masterkey.showRecoveryKeyBtn=Wyświetl klucz odzyskiwania
+vaultOptions.masterkey.recoverPasswordBtn=Odzyskaj hasło
 
 # Recovery Key
+recoveryKey.title=Klucz odzyskiwania
+recoveryKey.enterPassword.prompt=Wprowadź hasło, aby pokazać klucz odzyskiwania dla "%s":
+recoveryKey.display.message=Poniższy klucz odzyskiwania służy do przywrócenia dostępu do "%s":
+recoveryKey.display.StorageHints=Trzymaj go w bezpiecznym miejscu, np.\n • Przechowuj go za pomocą menedżera haseł\n • Zapisz go na przenośnej pamięci USB\n • Wydrukuj na papierze
+recoveryKey.recover.prompt=Wprowadź swój klucz odzyskiwania dla "%s":
+recoveryKey.recover.validKey=To jest prawidłowy klucz odzyskiwania
+recoveryKey.printout.heading=Cryptomator - Klucz odzyskiwania "%s"\n
 
 # New Password
+newPassword.promptText=Wprowadź nowe hasło
+newPassword.reenterPassword=Potwierdź nowe hasło
+newPassword.passwordsMatch=Hasła identyczne!
+newPassword.passwordsDoNotMatch=Różne hasła
+passwordStrength.messageLabel.tooShort=Użyj co najmniej %d znaków
+passwordStrength.messageLabel.0=Bardzo słabe
+passwordStrength.messageLabel.1=Słabe
+passwordStrength.messageLabel.2=Średnie
+passwordStrength.messageLabel.3=Silne
+passwordStrength.messageLabel.4=Bardzo silne
 
 # Quit
+quit.prompt=Zamknąć aplikację? Niektore sejfy są odblokowane.
+quit.lockAndQuit=Zablokuj i wyjdź

+ 115 - 0
main/ui/src/main/resources/i18n/strings_pt.properties

@@ -2,62 +2,177 @@
 
 # Generics
 ## Button
+generic.button.apply=Aplicar
+generic.button.back=Anterior
+generic.button.cancel=Cancelar
+generic.button.change=Alterar
+generic.button.close=Fechar
+generic.button.copy=Copiar
+generic.button.copied=Copiado!
+generic.button.done=Ok
+generic.button.next=Seguinte
+generic.button.print=Imprimir
 ## Error
+generic.error.title=Ocorreu um erro inesperado
+generic.error.instruction=Isto não devia ter acontecido. Por favor reporte o texto do erro abaixo e descreva os passos que levaram a este problema.
 
 # Tray Menu
+traymenu.showMainWindow=Mostrar
+traymenu.showPreferencesWindow=Preferências
+traymenu.lockAllVaults=Bloquear Todos
+traymenu.quitApplication=Fechar
+traymenu.vault.unlock=Destrancar
+traymenu.vault.lock=Trancar
+traymenu.vault.reveal=Revelar
 
 # Add Vault Wizard
+addvaultwizard.title=Adicionar Cofre
 ## Welcome
+addvaultwizard.welcome.newButton=Criar Novo Cofre
+addvaultwizard.welcome.existingButton=Abrir Cofre Existente
 ## New
 ### Name
+addvaultwizard.new.nameInstruction=Escolha um nome para o cofre
+addvaultwizard.new.namePrompt=Nome do Cofre
 ### Location
+addvaultwizard.new.locationInstruction=Onde deve o Cryptomator armazenar os arquivos criptografados do cofre?
+addvaultwizard.new.locationLabel=Local de armazenamento
+addvaultwizard.new.locationPrompt=…
+addvaultwizard.new.directoryPickerLabel=Outro Local
+addvaultwizard.new.directoryPickerButton=Escolher…
+addvaultwizard.new.directoryPickerTitle=Selecionar diretório
+addvaultwizard.new.fileAlreadyExists=O cofre não pode ser criado neste diretório porque algum objeto já existe.
+addvaultwizard.new.locationDoesNotExist=O cofre não pode ser criado neste diretório porque pelo menos um componente de diretório não existe.
+addvaultwizard.new.invalidName=Nome de cofre inválido. Por favor considere um nome de diretório regular.
 ### Password
+addvaultwizard.new.createVaultBtn=Criar Cofre
+addvaultwizard.new.generateRecoveryKeyChoice=Não será capaz de aceder aos seus dados sem a sua senha. Você quer uma chave de recuperação para caso perca a sua senha?
+addvaultwizard.new.generateRecoveryKeyChoice.yes=Sim por favor, melhor prevenir do que remediar
+addvaultwizard.new.generateRecoveryKeyChoice.no=Não obrigado, não vou perder a minha senha
 ### Information
+addvault.new.readme.storageLocation.fileName=IMPORTANTE.rtf
+addvault.new.readme.storageLocation.1=⚠ ARQUIVOS DO COFRE ⚠
+addvault.new.readme.storageLocation.2=Este é o local de armazenamento do seu cofre.
+addvault.new.readme.storageLocation.6=Se deseja criptografar arquivos e visualizar o conteúdo do cofre, faça o seguinte:
+addvault.new.readme.storageLocation.7=1. Adicione este cofre ao Cryptomator.
+addvault.new.readme.storageLocation.8=2. Desbloqueie o cofre no Cryptomator.
+addvault.new.readme.storageLocation.9=3. Abra o local de acesso clicando no botão "Revelar".
+addvault.new.readme.storageLocation.10=Se precisar de ajuda, visite a documentação: %s
+addvault.new.readme.accessLocation.fileName=BEM-VINDO.rtf
+addvault.new.readme.accessLocation.1=🔐 VOLUME CRIPTOGRAFADO 🔐
+addvault.new.readme.accessLocation.4=Sinta-se livre para remover este ficheiro.
 ## Existing
+addvaultwizard.existing.chooseBtn=Escolher…
+addvaultwizard.existing.filePickerTitle=Selecionar ficheiro MasterKey
 ## Success
+addvaultwizard.success.nextStepsInstructions=Adicionado cofre "%s".\nPrecisa de destrancar este cofre para aceder ou adicionar conteúdo. Como alternativa, pode destrancá-lo a qualquer momento mais tarde.
+addvaultwizard.success.unlockNow=Destrancar agora
 
 # Remove Vault
+removeVault.confirmBtn=Remover Cofre
 
 # Change Password
+changepassword.title=Alterar Senha
+changepassword.enterOldPassword=Digite a senha atual para "%s"
+changepassword.finalConfirmation=Eu entendo que não poderei aceder aos meus dados se esquecer a minha senha
 
 # Forget Password
+forgetPassword.title=Esqueci a Senha
+forgetPassword.confirmBtn=Esqueci a Senha
 
 # Unlock
+unlock.title=Destrancar Cofre
+unlock.passwordPrompt=Insira a senha para "%s":
+unlock.savePassword=Lembrar Senha
+unlock.unlockBtn=Destrancar
 ## Success
+unlock.success.message=Desbloqueado "%s" com sucesso! O seu cofre está agora acessível.
+unlock.success.rememberChoice=Lembrar escolha, não mostrar isto novamente
+unlock.success.revealBtn=Revelar Cofre
 ## Invalid Mount Point
 
 # Migration
+migration.title=Atualizar Cofre
 ## Start
 ## Run
+migration.run.startMigrationBtn=Migrar Cofre
+migration.run.progressHint=Isso pode levar algum tempo…
 ## Sucess
+migration.success.unlockNow=Destrancar agora
 ## Missing file system capabilities
 ## Impossible
 
 # Preferences
+preferences.title=Preferências
 ## General
+preferences.general=Geral
 ## Volume
+preferences.volume.webdav.port=Porta WebDAV
+preferences.volume.webdav.scheme=WebDAV Scheme
 ## Updates
+preferences.updates=Atualizações
+preferences.updates.currentVersion=Versão atual: %s
+preferences.updates.autoUpdateCheck=Verificar automaticamente por atualizações
+preferences.updates.checkNowBtn=Verificar Agora
+preferences.updates.updateAvailable=Atualização para a versão %s disponível.
 ## Donation Key
+preferences.donationKey=Doação
+preferences.donationKey.registeredFor=Registado para %s
+preferences.donationKey.noDonationKey=Não foi encontrada uma chave de doação válida. É como uma chave de licença, mas para pessoas incríveis que usam software livre. ;-)
+preferences.donationKey.getDonationKey=Obter chave de doação
 ## About
+preferences.about=Sobre
 
 # Main Window
+main.closeBtn.tooltip=Fechar
+main.minimizeBtn.tooltip=Minimizar
+main.preferencesBtn.tooltip=Preferências
 ## Drag 'n' Drop
 ## Vault List
+main.vaultlist.addVaultBtn=Adicionar Cofre
 ## Vault Detail
 ### Welcome
 ### Locked
+main.vaultDetail.unlockNowBtn=Destrancar agora
 ### Unlocked
+main.vaultDetail.lockBtn=Trancar
+main.vaultDetail.bytesPerSecondWritten=escrito:
+main.vaultDetail.throughput.idle=inativo
+main.vaultDetail.throughput.kbps=%.1f kiB/s
+main.vaultDetail.throughput.mbps=%.1f MiB/s
 ### Missing
+main.vaultDetail.missing.info=O Cryptomator não conseguiu encontrar um cofre neste diretório.
 ### Needs Migration
+main.vaultDetail.migrateButton=Atualizar Cofre
+main.vaultDetail.migratePrompt=O cofre precisa de ser atualizado para um novo formato, antes que possa acessá-lo
 
 # Wrong File Alert
+wrongFileAlert.title=Como criptografar arquivos
+wrongFileAlert.header.title=Você tentou criptografar esses arquivos?
+wrongFileAlert.instruction.1=1. Desbloqueie o seu cofre.
+wrongFileAlert.instruction.3=3. Adicione ficheiros a este volume.
+wrongFileAlert.link=Para obter assistência, visite
 
 # Vault Options
 ## General
+vaultOptions.general=Geral
+vaultOptions.general.unlockAfterStartup=Destrancar o cofre ao iniciar o Cryptomator
+vaultOptions.general.actionAfterUnlock=Após destrancar com sucesso
+vaultOptions.general.actionAfterUnlock.ask=Perguntar
 ## Mount
+vaultOptions.mount.readonly=Somente leitura
+vaultOptions.mount.driveName=Nome da unidade
+vaultOptions.mount.mountPoint.directoryPickerButton=Escolher…
 ## Master Key
+vaultOptions.masterkey=Senha
+vaultOptions.masterkey.changePasswordBtn=Alterar Senha
+vaultOptions.masterkey.forgetSavedPasswordBtn=Esqueça a senha salva
+vaultOptions.masterkey.recoveryKeyExpanation=Uma chave de recuperação é a única forma de restaurar o acesso a um cofre se perder a senha.
+vaultOptions.masterkey.showRecoveryKeyBtn=Exibir Chave de Recuperação
+vaultOptions.masterkey.recoverPasswordBtn=Recuperar Senha
 
 # Recovery Key
+recoveryKey.title=Chave de Recuperação
 
 # New Password