Sfoglia il codice sorgente

Merge branch 'develop' into feature/vault-format-8
[ci skip]

Sebastian Stenzel 4 anni fa
parent
commit
3f928cf958

+ 6 - 4
main/commons/src/main/java/org/cryptomator/common/vaults/DokanyVolume.java

@@ -52,10 +52,11 @@ public class DokanyVolume extends AbstractVolume {
 	}
 
 	@Override
-	public void reveal() throws VolumeException {
-		boolean success = mount.reveal();
-		if (!success) {
-			throw new VolumeException("Reveal failed.");
+	public void reveal(Revealer revealer) throws VolumeException {
+		try {
+			mount.reveal(revealer::reveal);
+		} catch (Exception e) {
+			throw new VolumeException(e);
 		}
 	}
 
@@ -79,6 +80,7 @@ public class DokanyVolume extends AbstractVolume {
 	public boolean supportsForcedUnmount() {
 		return true;
 	}
+
 	@Override
 	public boolean isSupported() {
 		return DokanyVolume.isSupportedStatic();

+ 3 - 5
main/commons/src/main/java/org/cryptomator/common/vaults/FuseVolume.java

@@ -20,7 +20,6 @@ import javax.inject.Named;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.SortedSet;
 import java.util.regex.Pattern;
 
 public class FuseVolume extends AbstractVolume {
@@ -73,11 +72,10 @@ public class FuseVolume extends AbstractVolume {
 	}
 
 	@Override
-	public void reveal() throws VolumeException {
+	public void reveal(Revealer revealer) throws VolumeException {
 		try {
-			mount.revealInFileManager();
-		} catch (CommandFailedException e) {
-			LOG.debug("Revealing the vault in file manger failed: " + e.getMessage());
+			mount.reveal(revealer::reveal);
+		} catch (Exception e) {
 			throw new VolumeException(e);
 		}
 	}

+ 2 - 2
main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java

@@ -162,8 +162,8 @@ public class Vault {
 		destroyCryptoFileSystem();
 	}
 
-	public void reveal() throws VolumeException {
-		volume.reveal();
+	public void reveal(Volume.Revealer vaultRevealer) throws VolumeException {
+		volume.reveal(vaultRevealer);
 	}
 
 	// ******************************************************************************

+ 19 - 1
main/commons/src/main/java/org/cryptomator/common/vaults/Volume.java

@@ -34,7 +34,15 @@ public interface Volume {
 	 */
 	void mount(CryptoFileSystem fs, String mountFlags) throws IOException, VolumeException, InvalidMountPointException;
 
-	void reveal() throws VolumeException;
+	/**
+	 * Reveals the mounted volume.
+	 * <p>
+	 * The given {@code revealer} might be used to do it, but not necessarily.
+	 *
+	 * @param revealer An object capable of revealing the location of the mounted vault to view the content (e.g. in the default file browser).
+	 * @throws VolumeException
+	 */
+	void reveal(Revealer revealer) throws VolumeException;
 
 	void unmount() throws VolumeException;
 
@@ -79,4 +87,14 @@ public interface Volume {
 
 	}
 
+	/**
+	 * Hides and unifies the different Revealer implementations in the different nio-adapters.
+	 */
+	@FunctionalInterface
+	interface Revealer {
+
+		void reveal(Path p) throws VolumeException;
+
+	}
+
 }

+ 24 - 11
main/commons/src/main/java/org/cryptomator/common/vaults/WebDavVolume.java

@@ -17,6 +17,7 @@ import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.nio.file.Path;
 import java.util.Optional;
+import java.util.function.Supplier;
 
 public class WebDavVolume implements Volume {
 
@@ -25,21 +26,27 @@ public class WebDavVolume implements Volume {
 	private final Provider<WebDavServer> serverProvider;
 	private final VaultSettings vaultSettings;
 	private final Settings settings;
+	private final WindowsDriveLetters windowsDriveLetters;
 
 	private WebDavServer server;
 	private WebDavServletController servlet;
 	private Mounter.Mount mount;
-	private Path mountPoint;
 
 	@Inject
-	public WebDavVolume(Provider<WebDavServer> serverProvider, VaultSettings vaultSettings, Settings settings) {
+	public WebDavVolume(Provider<WebDavServer> serverProvider, VaultSettings vaultSettings, Settings settings, WindowsDriveLetters windowsDriveLetters) {
 		this.serverProvider = serverProvider;
 		this.vaultSettings = vaultSettings;
 		this.settings = settings;
+		this.windowsDriveLetters = windowsDriveLetters;
 	}
 
 	@Override
 	public void mount(CryptoFileSystem fs, String mountFlags) throws VolumeException {
+		startServlet(fs);
+		mountServlet();
+	}
+
+	private void startServlet(CryptoFileSystem fs){
 		if (server == null) {
 			server = serverProvider.get();
 		}
@@ -50,32 +57,38 @@ public class WebDavVolume implements Volume {
 		String urlConformMountName = acceptable.negate().collapseFrom(vaultSettings.mountName().get(), '_');
 		servlet = server.createWebDavServlet(fs.getPath("/"), vaultSettings.getId() + "/" + urlConformMountName);
 		servlet.start();
-		mount();
 	}
 
-	private void mount() throws VolumeException {
+	private void mountServlet() throws VolumeException {
 		if (servlet == null) {
 			throw new IllegalStateException("Mounting requires unlocked WebDAV servlet.");
 		}
+
+		//on windows, prevent an automatic drive letter selection in the upstream library. Either we choose already a specifc one or there is no free.
+		Supplier<String> driveLetterSupplier;
+		if(System.getProperty("os.name").toLowerCase().contains("windows") && vaultSettings.winDriveLetter().isEmpty().get()) {
+			driveLetterSupplier = () -> windowsDriveLetters.getAvailableDriveLetter().orElse(null);
+		} else {
+			driveLetterSupplier = () -> vaultSettings.winDriveLetter().get();
+		}
+
 		MountParams mountParams = MountParams.create() //
-				.withWindowsDriveLetter(vaultSettings.winDriveLetter().get()) //
+				.withWindowsDriveLetter(driveLetterSupplier.get()) //
 				.withPreferredGvfsScheme(settings.preferredGvfsScheme().get().getPrefix())//
 				.withWebdavHostname(getLocalhostAliasOrNull()) //
 				.build();
 		try {
 			this.mount = servlet.mount(mountParams); // might block this thread for a while
 		} catch (Mounter.CommandFailedException e) {
-			e.printStackTrace();
 			throw new VolumeException(e);
 		}
 	}
 
 	@Override
-	public void reveal() throws VolumeException {
+	public void reveal(Revealer revealer) throws VolumeException {
 		try {
-			mount.reveal();
-		} catch (Mounter.CommandFailedException e) {
-			e.printStackTrace();
+			mount.reveal(revealer::reveal);
+		} catch (Exception e) {
 			throw new VolumeException(e);
 		}
 	}
@@ -102,7 +115,7 @@ public class WebDavVolume implements Volume {
 
 	@Override
 	public Optional<Path> getMountPoint() {
-		return Optional.ofNullable(mountPoint); //TODO
+		return mount.getMountPoint();
 	}
 
 	@Override

+ 3 - 3
main/pom.xml

@@ -29,9 +29,9 @@
 		<cryptomator.integrations.win.version>0.2.1</cryptomator.integrations.win.version>
 		<cryptomator.integrations.mac.version>0.1.0-beta3</cryptomator.integrations.mac.version>
 		<cryptomator.integrations.linux.version>0.1.0-beta2</cryptomator.integrations.linux.version>
-		<cryptomator.fuse.version>1.2.6</cryptomator.fuse.version>
-		<cryptomator.dokany.version>1.2.1</cryptomator.dokany.version>
-		<cryptomator.webdav.version>1.0.14</cryptomator.webdav.version>
+		<cryptomator.fuse.version>1.2.8</cryptomator.fuse.version>
+		<cryptomator.dokany.version>1.2.3</cryptomator.dokany.version>
+		<cryptomator.webdav.version>1.1.1</cryptomator.webdav.version>
 
 		<!-- 3rd party dependencies -->
 		<javafx.version>15</javafx.version>

+ 25 - 0
main/ui/src/main/java/org/cryptomator/ui/common/HostServiceRevealer.java

@@ -0,0 +1,25 @@
+package org.cryptomator.ui.common;
+
+import dagger.Lazy;
+import org.cryptomator.common.vaults.Volume;
+import org.cryptomator.ui.fxapp.FxApplicationScoped;
+
+import javax.inject.Inject;
+import javafx.application.Application;
+import java.nio.file.Path;
+
+@FxApplicationScoped
+public class HostServiceRevealer implements Volume.Revealer {
+
+	private final Lazy<Application> application;
+
+	@Inject
+	public HostServiceRevealer(Lazy<Application> application) {
+		this.application = application;
+	}
+
+	@Override
+	public void reveal(Path p) throws Volume.VolumeException {
+		application.get().getHostServices().showDocument(p.toUri().toString());
+	}
+}

+ 9 - 4
main/ui/src/main/java/org/cryptomator/ui/common/VaultService.java

@@ -23,10 +23,12 @@ public class VaultService {
 	private static final Logger LOG = LoggerFactory.getLogger(VaultService.class);
 
 	private final ExecutorService executorService;
+	private final HostServiceRevealer vaultRevealer;
 
 	@Inject
-	public VaultService(ExecutorService executorService) {
+	public VaultService(ExecutorService executorService, HostServiceRevealer vaultRevealer) {
 		this.executorService = executorService;
+		this.vaultRevealer = vaultRevealer;
 	}
 
 	public void reveal(Vault vault) {
@@ -39,7 +41,7 @@ public class VaultService {
 	 * @param vault The vault to reveal
 	 */
 	public Task<Vault> createRevealTask(Vault vault) {
-		Task<Vault> task = new RevealVaultTask(vault);
+		Task<Vault> task = new RevealVaultTask(vault, vaultRevealer);
 		task.setOnSucceeded(evt -> LOG.info("Revealed {}", vault.getDisplayName()));
 		task.setOnFailed(evt -> LOG.error("Failed to reveal " + vault.getDisplayName(), evt.getSource().getException()));
 		return task;
@@ -99,19 +101,22 @@ public class VaultService {
 	private static class RevealVaultTask extends Task<Vault> {
 
 		private final Vault vault;
+		private final Volume.Revealer revealer;
 
 		/**
 		 * @param vault The vault to lock
+		 * @param revealer The object to use to show the vault content to the user.
 		 */
-		public RevealVaultTask(Vault vault) {
+		public RevealVaultTask(Vault vault, Volume.Revealer revealer) {
 			this.vault = vault;
+			this.revealer = revealer;
 
 			setOnFailed(evt -> LOG.error("Failed to reveal " + vault.getDisplayName(), getException()));
 		}
 
 		@Override
 		protected Vault call() throws Volume.VolumeException {
-			vault.reveal();
+			vault.reveal(revealer);
 			return vault;
 		}
 	}

+ 0 - 1
main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuComponent.java

@@ -7,7 +7,6 @@ package org.cryptomator.ui.traymenu;
 
 import dagger.Lazy;
 import dagger.Subcomponent;
-
 import java.awt.SystemTray;
 
 @TrayMenuScoped

+ 1 - 1
main/ui/src/main/resources/i18n/strings_de.properties

@@ -286,7 +286,7 @@ vaultOptions.mount.mountPoint.directoryPickerButton=Durchsuchen …
 vaultOptions.mount.mountPoint.directoryPickerTitle=Wähle ein leeres Verzeichnis
 ## Master Key
 vaultOptions.masterkey=Passwort
-vaultOptions.masterkey.changePasswordBtn=Password ändern
+vaultOptions.masterkey.changePasswordBtn=Passwort ändern
 vaultOptions.masterkey.forgetSavedPasswordBtn=Gespeichertes Passwort vergessen
 vaultOptions.masterkey.recoveryKeyExpanation=Bei Verlust deines Passworts ist ein Wiederherstellungsschlüssel deine einzige Möglichkeit, den Zugriff auf einen Tresor wiederherzustellen.
 vaultOptions.masterkey.showRecoveryKeyBtn=Wiederherstellungsschlüssel anzeigen

+ 308 - 0
main/ui/src/main/resources/i18n/strings_hu.properties

@@ -0,0 +1,308 @@
+# Locale Specific CSS files such as CJK, RTL,...
+additionalStyleSheets=
+
+# Generics
+## Button
+generic.button.apply=Alkalmaz
+generic.button.back=Vissza
+generic.button.cancel=Mégse
+generic.button.change=Változtat
+generic.button.close=Bezár
+generic.button.copy=Másolás
+generic.button.copied=Másolva!
+generic.button.done=Kész
+generic.button.next=Következő
+generic.button.print=Nyomtatás
+## Error
+generic.error.title=Egy váratlan hiba történt
+generic.error.instruction=Ennek nem lett volna szabad megtörténnie. Kérjük jelezze a hibát az alábbi szöveggel valamint a hiba reprodukálásához szükséges lépésekkel.
+
+# Defaults
+defaults.vault.vaultName=Széf
+
+# Tray Menu
+traymenu.showMainWindow=Megmutatás
+traymenu.showPreferencesWindow=Beállítások
+traymenu.lockAllVaults=Az összes zárolása
+traymenu.quitApplication=Kilépés
+traymenu.vault.unlock=Feloldás
+traymenu.vault.lock=Zárolás
+traymenu.vault.reveal=Megmutatás
+
+# Add Vault Wizard
+addvaultwizard.title=Széf hozzáadása
+## Welcome
+addvaultwizard.welcome.newButton=Új széf létrehozása
+addvaultwizard.welcome.existingButton=Meglévő széf megnyitása
+## New
+### Name
+addvaultwizard.new.nameInstruction=Válasszon egy nevet az új széf számára
+addvaultwizard.new.namePrompt=A széf neve
+### Location
+addvaultwizard.new.locationInstruction=Hova mentse a Cryptomator a széf titkosított fájljait?
+addvaultwizard.new.locationLabel=Tárolási hely
+addvaultwizard.new.locationPrompt=…
+addvaultwizard.new.directoryPickerLabel=Egyedi hely
+addvaultwizard.new.directoryPickerButton=Választás…
+addvaultwizard.new.directoryPickerTitle=Könyvtár kiválasztása
+addvaultwizard.new.fileAlreadyExists=Nem lehet a széfet létrehozni ezen a helyen, mert egy fájl már létezik itt.
+addvaultwizard.new.locationDoesNotExist=Nem lehet a széfet létrehozni ezen a helyen, mert az útvonal legalább egy darabja nem létezik.
+addvaultwizard.new.invalidName=Érvénytelen széf elnevezés. Kérjük vegye figyelembe a szabályos könyvtárelnevezésre vonatkozó szabályokat.
+### Password
+addvaultwizard.new.createVaultBtn=Széf létrehozása
+addvaultwizard.new.generateRecoveryKeyChoice=Nem fog tudni hozzáférni az adataihoz a jelszó nélkül. Akar egy visszaállítási kulcsot arra az esetre, ha elveszíti a jelszavát?
+addvaultwizard.new.generateRecoveryKeyChoice.yes=Igen kérem, jobb félni, mint megijedni.
+addvaultwizard.new.generateRecoveryKeyChoice.no=Nem köszönöm, nem fogom elveszíteni a jelszavam.
+### Information
+addvault.new.readme.storageLocation.fileName=FONTOS.rtf
+addvault.new.readme.storageLocation.1=⚠️  SZÉF FÁJLOK  ⚠️
+addvault.new.readme.storageLocation.2=Ez a széfjének a tárolási helye.
+addvault.new.readme.storageLocation.3=NE
+addvault.new.readme.storageLocation.4=•  ne módosítson semmilyen fájlt ebbe a könyvtárba
+addvault.new.readme.storageLocation.5=•  ne tegyen titkosítani való fájlokat ebbe a könyvtárba
+addvault.new.readme.storageLocation.6=Ha fájlokat akr titkosítani és a széf tartalmát akarja szerkeszteni akkor tegye a következőt:
+addvault.new.readme.storageLocation.7=1.  Adja hozzá a széfet a Cryptomator-hoz.
+addvault.new.readme.storageLocation.8=2.  Nyissa meg a széfet a Cryptomator-ban.
+addvault.new.readme.storageLocation.9=3.  Nyissa meg a hozzáférési helyet a "Megjelenítés" gombra való kattintással.
+addvault.new.readme.storageLocation.10=Ha segítségre van szüksége, akkor látogasson el a dokumentáció oldalára: %s
+addvault.new.readme.accessLocation.fileName=ÜDVÖZÖLJÜK.rtf
+addvault.new.readme.accessLocation.1=🔐️  TITKOSÍTOTT KÖTET  🔐️
+addvault.new.readme.accessLocation.2=Ez a széf hozzáférési helye.
+addvault.new.readme.accessLocation.3=Bármilyen, a kötethez hozzáadott fájl titkosításra kerül a Cryptomator által. Úgy dolgozhat vele, mint minden más meghajtóval/mappával. Ez az egyetlen dekódolt tartalmi nézet. A fájlai folyamatosan titkosítva maradnak a merevlemezén.
+addvault.new.readme.accessLocation.4=Bátran eltávolíthatja ezt a fájlt.
+## Existing
+addvaultwizard.existing.instruction=Válassza ki a már létező széfjéhez tartozó "masterkey.cryptomator" fájlt.
+addvaultwizard.existing.chooseBtn=Kiválaszt…
+addvaultwizard.existing.filePickerTitle=Mesterkulcs fájl kiválasztása
+## Success
+addvaultwizard.success.nextStepsInstructions=Széf létrehozva "%s".\nA tartalom eléréséhez, vagy hozzáadásához fel kell oldania a széfet. Alternatív megoldásként később bármikor feloldhatja.
+addvaultwizard.success.unlockNow=Azonnali feloldás
+
+# Remove Vault
+removeVault.title=Széf eltávolitása
+removeVault.information=Ez kizárolag a Cryptomator-ból távolitja el ezt a széfet. Később hozzáadhatja újra. A titkosított fájlokat nem törli a merevlemezről.
+removeVault.confirmBtn=Széf eltávolitása
+
+# Change Password
+changepassword.title=Jelszó megváltoztatása
+changepassword.enterOldPassword=Írja be a jelenlegi jelszavat a következő széfhez "%s"
+changepassword.finalConfirmation=Megértettem, hogy nem fogok hozzáférni az adataimhoz amennyiben elfelejtem a jelszavam
+
+# Forget Password
+forgetPassword.title=Jelszó elfelejtése
+forgetPassword.information=Eltávolítja a széf mentett jelszavát a rendszere kulcstartójából.
+forgetPassword.confirmBtn=Jelszó elfelejtése
+
+# Unlock
+unlock.title=Széf feloldása
+unlock.passwordPrompt=Írja be a jelszavát a következő széfhez "%s":
+unlock.savePassword=Jelszó mentése
+unlock.unlockBtn=Feloldás
+## Success
+unlock.success.message="%s" sikreresen feloldásra került! Mostmár hozzáférhet a széféhez.
+unlock.success.rememberChoice=Jegyezze meg a választást és ne mutassa többet
+unlock.success.revealBtn=Széf megjelenítése
+## Failure
+unlock.error.heading=Nem lehet feloldani a széfet
+### Invalid Mount Point
+unlock.error.invalidMountPoint.notExisting=A csatolási pont "%s" nem egy könyvtár, nem üres vagy nem létezik.
+unlock.error.invalidMountPoint.existing=A csatolási pont "%s" már létezik vagy a already exists or szülőmappa hiányzik.
+
+# Migration
+migration.title=Széf frissítése
+## Start
+migration.start.prompt=A "%s" széf formátuma frissítésre szorul. A folytatás előtt győződjön meg arról, hogy nincs függőben lévő szinkronizálás, amely befolyásolja ezt a széfet.
+migration.start.confirm=Igen, a széfem teljes mértékben szinkronizálva van
+## Run
+migration.run.enterPassword=Írja be a jelszót a következőhöz Enter the password for "%s"
+migration.run.startMigrationBtn=Széf migrációja
+migration.run.progressHint=Ez eltarthat egy darabig…
+## Sucess
+migration.success.nextStepsInstructions=A "%s" sikeresen migrálva. \nMost már feloldhatja a széfet.
+migration.success.unlockNow=Azonnali feloldás
+## Missing file system capabilities
+migration.error.missingFileSystemCapabilities.title=Nem támogatott fájlrendszer
+migration.error.missingFileSystemCapabilities.description=A migráció nem kezdődött el, mert a széf nem megfelelő fájlrendszeren található.
+migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=A fájlrendszer nem támogatja a hosszú fájlneveket.
+migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=A fájlrendszer nem támogatja a hosszú útvonalakat.
+migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=A fájlrendszer nem teszi lehetővé az olvasást.
+migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=A fájlrendszer nem teszi lehetővé az írást.
+## Impossible
+migration.impossible.heading=A széf frissítése sikertelen
+migration.impossible.reason=A széfet nem lehet automatikusan frissíteni, mert a tárolási helye vagy a hozzáférési pontja nem kompatibilis.
+migration.impossible.moreInfo=A széf továbbra is megnyitható marad egy régebbi verzióval. A széf kézi frissítésével kapcsolatos utasításokért keresse fel a következő címet:
+
+# Preferences
+preferences.title=Beállítások
+## General
+preferences.general=Általános
+preferences.general.theme=Megjelenés
+preferences.general.theme.automatic=Autómatikus
+preferences.general.theme.light=Világos
+preferences.general.theme.dark=Sötét
+preferences.general.unlockThemes=Sötét mód feloldása
+preferences.general.startHidden=Az ablak elrejtése a Cryptomator indítása után
+preferences.general.debugLogging=Hibakeresési naplózás engedélyezése
+preferences.general.debugDirectory=Naplófájlok megjelenítése
+preferences.general.autoStart=Cryptomator indítása a rendszerrel együtt
+preferences.general.keychainBackend=Itt tárolja a jelszavakat
+preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
+preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
+preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Keychain Access
+preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection
+preferences.general.interfaceOrientation=Felhasználói felület orientációja
+preferences.general.interfaceOrientation.ltr=Balról jobbra
+preferences.general.interfaceOrientation.rtl=Jobbról balra
+## Volume
+preferences.volume=Virtuális meghajtó
+preferences.volume.type=Kötet tipusa
+preferences.volume.webdav.port=WebDAV Port
+preferences.volume.webdav.scheme=WebDAV Scheme
+## Updates
+preferences.updates=Frissítések
+preferences.updates.currentVersion=Jelenlegi verzió: %s
+preferences.updates.autoUpdateCheck=Frissítések autómatikus keresése
+preferences.updates.checkNowBtn=Ellenőrzés most
+preferences.updates.updateAvailable=Frissítés a %s verzióra elérhető.
+## Donation Key
+preferences.donationKey=Adomány
+preferences.donationKey.registeredFor=Regisztrálva %s számára
+preferences.donationKey.noDonationKey=Nem található érvényes adománykulcs. Mint egy licenckulcs, csak olyan nagyszerű emberek számára, akik ingyenes szofvereket használnak. ;-)
+preferences.donationKey.getDonationKey=Adománykulcs beszerzése
+## About
+preferences.about=Rólunk
+
+# Vault Statistics
+stats.title=Statisztika ehhez %s
+stats.cacheHitRate=Gyorsítótár találati arány
+## Read
+stats.read.throughput.idle=Olvasás: tétlen
+stats.read.throughput.kibs=Olvasás: %.2f kiB/s
+stats.read.throughput.mibs=Olvasás: %.2f MiB/s
+stats.read.total.data.none=Olvasott adat: -
+stats.read.total.data.kib=Olvasott adat: %.1f kiB
+stats.read.total.data.mib=Olvasott adat: %.1f MiB
+stats.read.total.data.gib=Olvasott adat: %.1f GiB
+stats.decr.total.data.none=Dekódolt adat: -
+stats.decr.total.data.kib=Dekódolt adat: %.1f kiB
+stats.decr.total.data.mib=Dekódolt adat: %.1f MiB
+stats.decr.total.data.gib=Dekódolt adat: %.1f GiB
+stats.read.accessCount=Összes olvasás: %d
+## Write
+stats.write.throughput.idle=Írás: tétlen
+stats.write.throughput.kibs=Írás: %.2f kiB/s
+stats.write.throughput.mibs=Írás: %.2f MiB/s
+stats.write.total.data.none=Írott adat: -
+stats.write.total.data.kib=Írott adat: %.1f kiB
+stats.write.total.data.mib=Írott adat: %.1f MiB
+stats.write.total.data.gib=Írott adat: %.1f GiB
+stats.encr.total.data.none=Titkosított adat: -
+stats.encr.total.data.kib=Titkosított adat: %.1f kiB
+stats.encr.total.data.mib=Titkosított adat: %.1f MiB
+stats.encr.total.data.gib=Titkosított adat: %.1f GiB
+stats.write.accessCount=Összes írás: %d
+
+# Main Window
+main.closeBtn.tooltip=Bezárás
+main.minimizeBtn.tooltip=Minimalizálás
+main.preferencesBtn.tooltip=Beállítások
+main.debugModeEnabled.tooltip=A hibakeresési mód aktiválva van
+main.donationKeyMissing.tooltip=Kérjük, fontolja meg az adományozást
+## Drag 'n' Drop
+main.dropZone.dropVault=Adja hozzá ezt a széfet
+main.dropZone.unknownDragboardContent=Ha egy széfet szeretne hozzáadni, akkor húzza át erre az ablakra.
+## Vault List
+main.vaultlist.emptyList.onboardingInstruction=Kattintson ide egy széf hozzáadásához
+main.vaultlist.contextMenu.remove=Széf eltávolítása…
+main.vaultlist.addVaultBtn=Széf hozzáadása
+## Vault Detail
+### Welcome
+main.vaultDetail.welcomeOnboarding=Köszönjük, hogy a Cryptomator programot választotta a fájlai védelmére. Ha segítségre van szüksége, akkor olvassa el a kezdő útmutatónk lépéseit:
+### Locked
+main.vaultDetail.lockedStatus=ZÁROLVA
+main.vaultDetail.unlockBtn=Feloldás…
+main.vaultDetail.unlockNowBtn=Azonnali feloldás
+main.vaultDetail.optionsBtn=Széf beállítások
+main.vaultDetail.passwordSavedInKeychain=Jelszó mentve
+### Unlocked
+main.vaultDetail.unlockedStatus=FELOLDVA
+main.vaultDetail.accessLocation=A széf tartalma itt érhető el:
+main.vaultDetail.revealBtn=Széf megjelenítése
+main.vaultDetail.lockBtn=Zárolás
+main.vaultDetail.bytesPerSecondRead=Olvasás:
+main.vaultDetail.bytesPerSecondWritten=Írás:
+main.vaultDetail.throughput.idle=tétlen
+main.vaultDetail.throughput.kbps=%.1f kiB/s
+main.vaultDetail.throughput.mbps=%.1f MiB/s
+main.vaultDetail.stats=Széf statisztika
+### Missing
+main.vaultDetail.missing.info=A Cryptomator nem talált széfet ezen az útvonalon.
+main.vaultDetail.missing.recheck=Ellenőrizze újra
+main.vaultDetail.missing.remove=A széf eltávolítása a listából…
+main.vaultDetail.missing.changeLocation=A széf helyének megváltoztatása…
+### Needs Migration
+main.vaultDetail.migrateButton=Széf frissítése
+main.vaultDetail.migratePrompt=A széfet új formátumra kell frissíteni, mielőtt hozzáférhet
+
+# Wrong File Alert
+wrongFileAlert.title=Hogyan lehet fájlokat titkosítani
+wrongFileAlert.header.title=Próbálta ezeket a fájlokat titkosítani?
+wrongFileAlert.header.lead=Erre a célra a Cryptomator egy kötetet biztosít a rendszer fájlkezelőjében.
+wrongFileAlert.instruction.0=Hogy titkosítsa a fájlokat kövesse a következő lépéseket:
+wrongFileAlert.instruction.1=1. Oldja fel a széfet.
+wrongFileAlert.instruction.2=2. Kattintson a "Megjelenítés" gombra, hogy megnyissa a kötetet a fájlkezelőjében.
+wrongFileAlert.instruction.3=3. Adjon hozzá fájlokat a kötethez.
+wrongFileAlert.link=További segítségért látogasson el ide
+
+# Vault Options
+## General
+vaultOptions.general=Általános
+vaultOptions.general.vaultName=A széf neve
+vaultOptions.general.unlockAfterStartup=A széf feloldása a Cryptomator indításakor
+vaultOptions.general.actionAfterUnlock=Sikeres feloldás után
+vaultOptions.general.actionAfterUnlock.ignore=Ne tegyen semmit
+vaultOptions.general.actionAfterUnlock.reveal=Jelenítse meg a kötetet
+vaultOptions.general.actionAfterUnlock.ask=Kérdezzen
+## Mount
+vaultOptions.mount=Csatolás
+vaultOptions.mount.readonly=Csak olvasható
+vaultOptions.mount.customMountFlags=Egyedi csatolási paraméterek
+vaultOptions.mount.winDriveLetterOccupied=foglalt
+vaultOptions.mount.mountPoint=Csatolási pont
+vaultOptions.mount.mountPoint.auto=Válasszon egy megfelelő helyet autómatikusan
+vaultOptions.mount.mountPoint.driveLetter=Használja a kiválasztott meghajtó betűjelét
+vaultOptions.mount.mountPoint.custom=Egyedi útvonal
+vaultOptions.mount.mountPoint.directoryPickerButton=Kiválasztás…
+vaultOptions.mount.mountPoint.directoryPickerTitle=Válasszon egy üres könyvtárat
+## Master Key
+vaultOptions.masterkey=Jelszó
+vaultOptions.masterkey.changePasswordBtn=Jelszó megváltoztatása
+vaultOptions.masterkey.forgetSavedPasswordBtn=Elmentett jelszó elfelejtése
+vaultOptions.masterkey.recoveryKeyExpanation=A helyreállítási kulcs az egyetlen módja annak, hogy visszaállítsa a széfhez való hozzáférést, ha elveíti a jelszavát.
+vaultOptions.masterkey.showRecoveryKeyBtn=Visszaállítási kulcs megjelenítése
+vaultOptions.masterkey.recoverPasswordBtn=Jelszó visszaállítása
+
+# Recovery Key
+recoveryKey.title=Visszaállítási kulcs
+recoveryKey.enterPassword.prompt=Írja be a jelszavát a "%s" visszaállítási kulcsának megjelenítéséhez:
+recoveryKey.display.message=A következő helyreállítási kulcs használható a "%s" hozzáférésének visszaállítására:
+recoveryKey.display.StorageHints=Tartsa nagyon biztonságos helyen. pl.:\n •Tárolja egy jelszókezelővel\n •Mentse el egy USB meghajtóra\n •Nyomtassa egy papírra
+recoveryKey.recover.prompt=Írja be a visszaállítási kulcsát a következőhöz "%s":
+recoveryKey.recover.validKey=Ez egy érvényes visszaállítási kulcs
+recoveryKey.printout.heading=Cryptomator visszaállítási kulcs\n"%s"\n
+
+# New Password
+newPassword.promptText=Írja be az új jelszavát
+newPassword.reenterPassword=Erősítse meg az új jelszavát
+newPassword.passwordsMatch=A jelszavak megegyeznek!
+newPassword.passwordsDoNotMatch=A jelszavak nem egyeznek meg
+passwordStrength.messageLabel.tooShort=Használjon legalább %d karaktert
+passwordStrength.messageLabel.0=Nagyon gyenge
+passwordStrength.messageLabel.1=Gyenge
+passwordStrength.messageLabel.2=Átlagos
+passwordStrength.messageLabel.3=Erős
+passwordStrength.messageLabel.4=Nagyon erős
+
+# Quit
+quit.prompt=Kilép az alkalmazásból? Vannak még lezáratlan széfek.
+quit.lockAndQuit=Zárolás és kilépés

+ 1 - 0
main/ui/src/main/resources/i18n/strings_ja.properties

@@ -105,6 +105,7 @@ unlock.success.revealBtn=金庫を表示
 unlock.error.heading=金庫の解錠に失敗
 ### Invalid Mount Point
 unlock.error.invalidMountPoint.notExisting=マウントポイントが空のディレクトリか存在していません: %s
+unlock.error.invalidMountPoint.existing=マウント ポイント "%s" が既に存在するか、親フォルダーがありません。
 
 # Lock
 ## Force

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

@@ -109,9 +109,12 @@ unlock.error.invalidMountPoint.existing=Monteringspunktet "%s" finnes enten alle
 
 # Lock
 ## Force
+lock.forced.heading=Låsingen mislyktes
+lock.forced.message=Låsing "%s" ble blokkert av ventende operasjoner eller åpne filer. Du kan tvinge låsing av dette hvelvet, men avbrytelse av I/O kan føre til tap av ulagrede data.
 lock.forced.confirmBtn=Tving låsing
 ## Failure
 lock.fail.heading=Låsing av hvelvet mislyktes.
+lock.fail.message=Hvelvet "%s" kunne ikke låses. Forsikre deg om at ulagrede arbeider lagres andre steder, og at viktige lese/skrive-operasjoner er fullført. For å lukke hvelvet må du avbryte Cryptomatorprosessen.
 
 # Migration
 migration.title=Oppgrader hvelv
@@ -146,11 +149,17 @@ preferences.general.theme.automatic=Automatisk
 preferences.general.theme.light=Lys
 preferences.general.theme.dark=Mørk
 preferences.general.unlockThemes=Lås opp mørk modus
+preferences.general.showMinimizeButton=Vis minimerknapp
+preferences.general.showTrayIcon=Vis verktøykasseikon (krever omstart)
 preferences.general.startHidden=Skjul vinduet når du starter Cryptomator
 preferences.general.debugLogging=Aktiver loggføring av feilsøk
 preferences.general.debugDirectory=Vis loggfiler
 preferences.general.autoStart=Start Cryptomator ved systemstart
 preferences.general.keychainBackend=Lagre passord med
+preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring
+preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet
+preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS nøkkelringtilgang
+preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection
 preferences.general.interfaceOrientation=Grensesnittorientering
 preferences.general.interfaceOrientation.ltr=Fra venstre til høyre
 preferences.general.interfaceOrientation.rtl=Fra høyre til venstre

+ 1 - 2
main/ui/src/main/resources/license/THIRD-PARTY.txt

@@ -11,7 +11,7 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see http://www.gnu.org/licenses/.
 
-Cryptomator uses 47 third-party dependencies under the following licenses:
+Cryptomator uses 46 third-party dependencies under the following licenses:
         Apache License v2.0:
 			- jffi (com.github.jnr:jffi:1.2.23 - http://github.com/jnr/jffi)
 			- jnr-a64asm (com.github.jnr:jnr-a64asm:1.0.0 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-a64asm)
@@ -26,7 +26,6 @@ Cryptomator uses 47 third-party dependencies under the following licenses:
 			- Guava ListenableFuture only (com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava - https://github.com/google/guava/listenablefuture)
 			- J2ObjC Annotations (com.google.j2objc:j2objc-annotations:1.3 - https://github.com/google/j2objc/)
 			- Apache Commons CLI (commons-cli:commons-cli:1.4 - http://commons.apache.org/proper/commons-cli/)
-			- Apache Commons IO (commons-io:commons-io:2.6 - http://commons.apache.org/proper/commons-io/)
 			- javax.inject (javax.inject:javax.inject:1 - http://code.google.com/p/atinject/)
 			- Java Native Access (net.java.dev.jna:jna:5.6.0 - https://github.com/java-native-access/jna)
 			- Java Native Access Platform (net.java.dev.jna:jna-platform:5.5.0 - https://github.com/java-native-access/jna)