Merge pull request #4103 from cryptomator/feature/basic-accessibility

Feature: Improve accessibility for core functionality
This commit is contained in:
Armin Schrenk
2026-01-15 10:44:16 +01:00
committed by GitHub
59 changed files with 267 additions and 115 deletions
+1 -1
View File
@@ -15,7 +15,7 @@ Changes to prior versions can be found on the [Github release page](https://gith
* Implemented Flatpak update mechanism
* App notifications ([#4069](https://github.com/cryptomator/cryptomator/pull/4069))
* Mark files in-use for Hub vaults ([#4078](https://github.com/cryptomator/cryptomator/pull/4078))
* Accessibility labels for GUI elements ([#4064](https://github.com/cryptomator/cryptomator/issues/4064), [#4066](https://github.com/cryptomator/cryptomator/pull/4066), [#4055](https://github.com/cryptomator/cryptomator/issues/4055))
* Accessibility: Adjust app to be used with a screen reader ([#547](https://github.com/cryptomator/cryptomator/issues/547))
* Show Archived Vault Dialog on unlock when Hub returns 410 ([#4081](https://github.com/cryptomator/cryptomator/pull/4081))
### Changed
@@ -4,24 +4,27 @@ import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.fxml.FXML;
import javafx.geometry.Pos;
import javafx.scene.AccessibleRole;
import javafx.scene.control.Button;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import java.util.ResourceBundle;
public class NotificationBar extends HBox {
public class InfoBar extends HBox {
@FXML
private Label notificationLabel;
private Label infoMessage;
private final BooleanProperty dismissable = new SimpleBooleanProperty();
private final BooleanProperty notify = new SimpleBooleanProperty();
public NotificationBar() {
public InfoBar() {
setAlignment(Pos.CENTER);
setStyle("-fx-alignment: center;");
getStyleClass().addAll("info-bar");
Region spacer = new Region();
spacer.setMinWidth(40);
@@ -36,14 +39,21 @@ public class NotificationBar extends HBox {
vbox.setAlignment(Pos.CENTER);
HBox.setHgrow(vbox, javafx.scene.layout.Priority.ALWAYS);
notificationLabel = new Label();
notificationLabel.getStyleClass().add("notification-label");
notificationLabel.setStyle("-fx-alignment: center;");
vbox.getChildren().add(notificationLabel);
infoMessage = new Label();
infoMessage.setFocusTraversable(true);
infoMessage.setAccessibleRole(AccessibleRole.BUTTON);
vbox.getChildren().add(infoMessage);
Button closeButton = new Button("X");
var closeGraphic = new FontAwesome5IconView();
closeGraphic.setGlyph(FontAwesome5Icon.TIMES);
closeGraphic.setGlyphSize(12);
closeGraphic.getStyleClass().add("glyph");
Button closeButton = new Button();
closeButton.setGraphic(closeGraphic);
closeButton.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
closeButton.setAccessibleText(ResourceBundle.getBundle("i18n.strings").getString("main.notification.closeButton.tooltip"));
closeButton.setMinWidth(40);
closeButton.setStyle("-fx-background-color: transparent; -fx-text-fill: white; -fx-font-weight: bold;");
closeButton.visibleProperty().bind(dismissable);
closeButton.setOnAction(_ -> {
@@ -61,11 +71,11 @@ public class NotificationBar extends HBox {
}
public String getText() {
return notificationLabel.getText();
return infoMessage.getText();
}
public void setText(String text) {
notificationLabel.setText(text);
infoMessage.setText(text);
}
public void setStyleClass(String styleClass) {
@@ -16,6 +16,7 @@ import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.geometry.Insets;
import javafx.scene.layout.HBox;
import java.util.ResourceBundle;
// unscoped because each cell needs its own controller
public class VaultListCellController implements FxController {
@@ -23,9 +24,12 @@ public class VaultListCellController implements FxController {
private static final Insets COMPACT_INSETS = new Insets(6, 12, 6, 12);
private static final Insets DEFAULT_INSETS = new Insets(12);
private final ResourceBundle resourceBundle;
private final ObjectProperty<Vault> vault = new SimpleObjectProperty<>();
private final ObservableValue<VaultState.Value> vaultState;
private final ObservableValue<FontAwesome5Icon> glyph;
private final ObservableValue<Boolean> compactMode;
private final ObservableValue<String> accessibleText;
private AutoAnimator spinAnimation;
@@ -35,17 +39,21 @@ public class VaultListCellController implements FxController {
public HBox vaultListCell;
@Inject
VaultListCellController(Settings settings) {
this.glyph = vault.flatMap(Vault::stateProperty).map(this::getGlyphForVaultState);
VaultListCellController(Settings settings, ResourceBundle resourceBundle) {
this.resourceBundle = resourceBundle;
this.vaultState = vault.flatMap(Vault::stateProperty);
this.glyph = vaultState.map(this::getGlyphForVaultState);
this.accessibleText = vaultState.map(this::getAccessibleTextForVaultState);
this.compactMode = settings.compactMode;
}
public void initialize() {
this.spinAnimation = AutoAnimator.animate(Animations.createDiscrete360Rotation(vaultStateView)) //
.onCondition(vault.flatMap(Vault::stateProperty).map(VaultState.Value.PROCESSING::equals).orElse(false)) //
.onCondition(vaultState.map(VaultState.Value.PROCESSING::equals).orElse(false)) //
.afterStop(() -> vaultStateView.setRotate(0)) //
.build();
this.vaultListCell.paddingProperty().bind(compactMode.map(c -> c ? COMPACT_INSETS : DEFAULT_INSETS));
this.vaultListCell.accessibleTextProperty().bind(accessibleText);
}
// TODO deduplicate w/ VaultDetailController
@@ -62,6 +70,25 @@ public class VaultListCellController implements FxController {
}
}
private String getAccessibleTextForVaultState(VaultState.Value state) {
var v = vault.get();
if (state != null && v != null) {
var translationKey = switch (state) {
case LOCKED -> "vault.state.locked";
case PROCESSING -> "vault.state.processing";
case UNLOCKED -> "vault.state.unlocked";
case NEEDS_MIGRATION -> "vault.state.migrationNeeded";
case MISSING -> "vault.state.missing";
case VAULT_CONFIG_MISSING, ALL_MISSING, ERROR -> "vault.state.error";
};
var localizedState = resourceBundle.getString(translationKey);
return resourceBundle.getString("main.vaultlist.listEntry").formatted(v.getDisplayName(), localizedState);
} else {
return "";
}
}
/* Getter/Setter */
public ObservableValue<FontAwesome5Icon> glyphProperty() {
+45 -19
View File
@@ -50,6 +50,7 @@
GREEN_5: PRIMARY;
RED_5: #E74C3C;
ORANGE_5: #E67E22;
YELLOW_4: #C19F0E;
YELLOW_5: #F1C40F;
MAIN_BG: GRAY_1;
@@ -387,37 +388,62 @@
/*******************************************************************************
* *
* NotificationBar *
* InfoBar *
* *
******************************************************************************/
.info-bar {
-fx-alignment: center;
-fx-min-height:24px;
-fx-max-height:24px;
-fx-background-color: -bar-bg;
}
.notification-label {
-fx-text-fill: white;
.info-bar--green {
-bar-bg: GREEN_5;
-button-bg: GREEN_5;
-button-bg-pressed: GREEN_3;
}
.info-bar--yellow {
-bar-bg: YELLOW_5;
-button-bg: YELLOW_5;
-button-bg-pressed: YELLOW_4;
}
.info-bar--red {
-bar-bg: RED_5;
-button-bg: RED_5;
-button-bg-pressed: RED_5;
}
.info-bar .label {
-fx-text-fill: GRAY_9;
-fx-font-weight: bold;
}
.notification-debug {
-fx-min-height:24px;
-fx-max-height:24px;
-fx-background-color: RED_5;
.info-bar--yellow .label {
-fx-text-fill: GRAY_9;
-fx-font-weight: bold;
-fx-effect: dropshadow( gaussian , rgba(0,0,0,0.45) , 2 , 0 , 0 , 1 );
}
.notification-update {
-fx-min-height:24px;
-fx-max-height:24px;
-fx-background-color: YELLOW_5;
.info-bar .glyph {
-fx-fill: GRAY_9;
}
.notification-support {
-fx-min-height:24px;
-fx-max-height:24px;
-fx-background-color: PRIMARY;
.info-bar:hover .label {
-fx-underline:true;
}
.notification-debug:hover .notification-label,
.notification-update:hover .notification-label,
.notification-support:hover .notification-label {
-fx-underline:true;
.info-bar .button {
-fx-background-color: transparent;
-fx-border-color: transparent;
-fx-padding: 2 2 2 2;
}
.info-bar .button:armed {
-fx-background-color: -button-bg-pressed;
-fx-background-radius: 8;
}
/*******************************************************************************
+46 -20
View File
@@ -50,6 +50,7 @@
GREEN_5: PRIMARY;
RED_5: #E74C3C;
ORANGE_5: #E67E22;
YELLOW_4: #C19F0E;
YELLOW_5: #F1C40F;
MAIN_BG: GRAY_9;
@@ -387,39 +388,64 @@
/*******************************************************************************
* *
* NotificationBar *
* InfoBar *
* *
******************************************************************************/
.info-bar {
-fx-alignment: center;
-fx-min-height:24px;
-fx-max-height:24px;
-fx-background-color: -bar-bg;
}
.notification-label {
-fx-text-fill: white;
.info-bar--green {
-bar-bg: GREEN_5;
-button-bg: GREEN_5;
-button-bg-pressed: GREEN_3;
}
.info-bar--yellow {
-bar-bg: YELLOW_5;
-button-bg: YELLOW_5;
-button-bg-pressed: YELLOW_4;
}
.info-bar--red {
-bar-bg: RED_5;
-button-bg: RED_5;
-button-bg-pressed: RED_5;
}
.info-bar .label {
-fx-text-fill: GRAY_9;
-fx-font-weight: bold;
}
.notification-debug {
-fx-min-height:24px;
-fx-max-height:24px;
-fx-background-color: RED_5;
.info-bar--yellow .label {
-fx-text-fill: GRAY_9;
-fx-font-weight: bold;
-fx-effect: dropshadow( gaussian , rgba(0,0,0,0.45) , 2 , 0 , 0 , 1 );
}
.notification-update {
-fx-min-height:24px;
-fx-max-height:24px;
-fx-background-color: YELLOW_5;
.info-bar .glyph {
-fx-fill: GRAY_9;
}
.notification-support {
-fx-min-height:24px;
-fx-max-height:24px;
-fx-background-color: PRIMARY;
}
.notification-debug:hover .notification-label,
.notification-update:hover .notification-label,
.notification-support:hover .notification-label {
.info-bar:hover .label {
-fx-underline:true;
}
.info-bar .button {
-fx-background-color: transparent;
-fx-border-color: transparent;
-fx-padding: 2 2 2 2;
}
.info-bar .button:armed {
-fx-background-color: -button-bg-pressed;
-fx-background-radius: 8;
}
/*******************************************************************************
* *
* ScrollBar *
@@ -13,7 +13,8 @@
prefWidth="450"
prefHeight="450"
spacing="24"
alignment="CENTER">
alignment="CENTER"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="24"/>
</padding>
@@ -19,7 +19,8 @@
prefWidth="450"
prefHeight="450"
spacing="12"
alignment="CENTER_LEFT">
alignment="CENTER_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="24"/>
</padding>
@@ -19,7 +19,8 @@
prefWidth="450"
prefHeight="450"
spacing="12"
alignment="CENTER_LEFT">
alignment="CENTER_LEFT"
accessibleRole="DIALOG">
<fx:define>
<ToggleGroup fx:id="locationPresetsToggler"/>
<FontAwesome5IconView fx:id="badLocation" styleClass="glyph-icon-red" glyph="TIMES"/>
@@ -17,7 +17,8 @@
prefWidth="450"
prefHeight="450"
spacing="12"
alignment="CENTER_LEFT">
alignment="CENTER_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="24"/>
</padding>
@@ -15,7 +15,8 @@
prefWidth="450"
prefHeight="450"
spacing="12"
alignment="CENTER_LEFT">
alignment="CENTER_LEFT"
accessibleRole="DIALOG">
<fx:define>
<ToggleGroup fx:id="recoveryKeyChoice"/>
</fx:define>
@@ -11,7 +11,8 @@
prefWidth="450"
prefHeight="450"
spacing="12"
alignment="CENTER_LEFT">
alignment="CENTER_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="24"/>
</padding>
@@ -16,7 +16,8 @@
prefWidth="450"
prefHeight="450"
spacing="12"
alignment="TOP_CENTER">
alignment="TOP_CENTER"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="24"/>
</padding>
+2 -1
View File
@@ -13,7 +13,8 @@
fx:controller="org.cryptomator.ui.changepassword.ChangePasswordController"
minWidth="400"
maxWidth="400"
spacing="12">
spacing="12"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -18,7 +18,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_CENTER">
alignment="TOP_CENTER"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -15,7 +15,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_CENTER">
alignment="TOP_CENTER"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -19,7 +19,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+2 -1
View File
@@ -22,7 +22,8 @@
minHeight="450"
prefWidth="450"
prefHeight="450"
spacing="12">
spacing="12"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="24"/>
</padding>
+2 -1
View File
@@ -21,7 +21,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -18,7 +18,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -20,7 +20,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -18,7 +18,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+2 -1
View File
@@ -20,7 +20,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+2 -1
View File
@@ -18,7 +18,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -20,7 +20,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -11,6 +11,7 @@
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?>
<!-- TODO: simple dialog -->
<HBox xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx"
fx:controller="org.cryptomator.ui.keyloading.hub.RegisterFailedController"
@@ -18,7 +19,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -18,7 +18,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -18,7 +18,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -21,7 +21,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -18,7 +18,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+2 -1
View File
@@ -19,7 +19,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+2 -1
View File
@@ -19,7 +19,8 @@
maxWidth="500"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+7 -7
View File
@@ -3,7 +3,7 @@
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<?import org.cryptomator.ui.controls.NotificationBar?>
<?import org.cryptomator.ui.controls.InfoBar?>
<StackPane xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx"
@@ -11,23 +11,23 @@
fx:controller="org.cryptomator.ui.mainwindow.MainWindowController"
styleClass="main-window">
<VBox minWidth="600">
<NotificationBar onMouseClicked="#showUpdatePreferences"
<InfoBar onMouseClicked="#showUpdatePreferences"
text="%main.notification.updateAvailable"
dismissable="true"
notify="${controller.updateAvailable}"
styleClass="notification-update"/>
<NotificationBar onMouseClicked="#showContributePreferences"
styleClass="info-bar--yellow"/>
<InfoBar onMouseClicked="#showContributePreferences"
text="%main.notification.support"
dismissable="true"
notify="${!controller.licenseValid}"
styleClass="notification-support"/>
styleClass="info-bar--green"/>
<SplitPane dividerPositions="0.33" orientation="HORIZONTAL" VBox.vgrow="ALWAYS">
<fx:include source="vault_list.fxml" SplitPane.resizableWithParent="false"/>
<fx:include source="vault_detail.fxml" SplitPane.resizableWithParent="true"/>
</SplitPane>
<NotificationBar onMouseClicked="#showGeneralPreferences"
<InfoBar onMouseClicked="#showGeneralPreferences"
text="DEBUG MODE"
styleClass="notification-debug"
styleClass="info-bar--red"
notify="${controller.debugModeEnabled}"/>
</VBox>
</StackPane>
@@ -16,7 +16,8 @@
minWidth="400"
maxWidth="400"
minHeight="145"
spacing="12">
spacing="12"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -19,7 +19,8 @@
minWidth="400"
maxWidth="400"
minHeight="145"
spacing="12">
spacing="12"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+2 -1
View File
@@ -20,7 +20,8 @@
fx:controller="org.cryptomator.ui.migration.MigrationStartController"
prefWidth="580"
prefHeight="350"
spacing="12">
spacing="12"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -15,7 +15,8 @@
minWidth="400"
maxWidth="400"
minHeight="145"
spacing="12">
spacing="12"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+2 -1
View File
@@ -16,7 +16,8 @@
xmlns:fx="http://javafx.com/fxml"
fx:controller="org.cryptomator.ui.notification.NotificationController"
prefHeight="200.0" prefWidth="400.0" maxHeight="200.0" maxWidth="400.0"
styleClass="notification-window">
styleClass="notification-window"
accessibleRole="DIALOG">
<padding>
<Insets top="12" right="12" bottom="12" left="12"/>
</padding>
+2 -1
View File
@@ -19,7 +19,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+2 -1
View File
@@ -19,7 +19,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -20,7 +20,8 @@
maxWidth="400"
minHeight="175"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -14,7 +14,8 @@
minWidth="350"
minHeight="280"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<children>
<FormattedLabel format="%recoveryKey.display.description" arg1="${controller.vaultName}" wrapText="true" labelFor="$textarea"/>
@@ -22,7 +22,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_CENTER">
alignment="TOP_CENTER"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -25,7 +25,8 @@
prefWidth="480"
minHeight="242"
spacing="12"
VBox.vgrow="ALWAYS">
VBox.vgrow="ALWAYS"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -17,7 +17,8 @@
minWidth="400"
maxWidth="400"
minHeight="145"
spacing="12">
spacing="12"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -17,7 +17,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_CENTER">
alignment="TOP_CENTER"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -12,7 +12,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_CENTER">
alignment="TOP_CENTER"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -10,7 +10,8 @@
fx:controller="org.cryptomator.ui.recoverykey.RecoveryKeyValidateController"
maxWidth="400"
minHeight="145"
spacing="12">
spacing="12"
accessibleRole="DIALOG">
<children>
<FormattedLabel format="%recoveryKey.recover.prompt" arg1="${controller.vault.displayName}" wrapText="true" labelFor="$textarea"/>
+2 -1
View File
@@ -21,7 +21,8 @@
xmlns="http://javafx.com/javafx"
fx:controller="org.cryptomator.ui.sharevault.ShareVaultController"
prefWidth="540"
spacing="12">
spacing="12"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+2 -1
View File
@@ -17,7 +17,8 @@
minWidth="400"
maxWidth="400"
minHeight="145"
spacing="12">
spacing="12"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -18,7 +18,8 @@
minWidth="400"
maxWidth="400"
minHeight="145"
spacing="12">
spacing="12"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -19,7 +19,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -19,7 +19,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
@@ -20,7 +20,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+2 -1
View File
@@ -21,7 +21,8 @@
maxWidth="400"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+2 -1
View File
@@ -18,7 +18,8 @@
prefWidth="500"
minHeight="145"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+1 -1
View File
@@ -36,7 +36,7 @@
<Label styleClass="badge,badge-pill,badge-muted" text="…" minWidth="-Infinity" visible="${controller.vault.processing}" managed="${controller.vault.processing}"/>
<Label styleClass="badge,badge-pill,badge-primary" text="%main.vaultDetail.unlockedStatus" minWidth="-Infinity" visible="${controller.vault.unlocked}" managed="${controller.vault.unlocked}"/>
</HBox>
<Hyperlink styleClass="hyperlink-muted,hyperlink-hover-icon" text="${controller.vault.displayablePath}" textOverrun="CENTER_ELLIPSIS" onAction="#revealStorageLocation">
<Hyperlink styleClass="hyperlink-muted,hyperlink-hover-icon" text="${controller.vault.displayablePath}" textOverrun="CENTER_ELLIPSIS" onAction="#revealStorageLocation" accessibleText="%main.vaultDetail.storageLocation" accessibleRole="BUTTON">
<graphic>
<FontAwesome5IconView styleClass="glyph-icon-muted" glyph="EYE"/>
</graphic>
+1 -1
View File
@@ -22,7 +22,7 @@
<VBox>
<StackPane VBox.vgrow="ALWAYS">
<VBox>
<ListView fx:id="vaultList" editable="true" fixedCellSize="${controller.cellSize}">
<ListView fx:id="vaultList" editable="true" fixedCellSize="${controller.cellSize}" accessibleText="%main.vaultlist">
<contextMenu>
<fx:include source="vault_list_contextmenu.fxml"/>
</contextMenu>
+2 -1
View File
@@ -23,7 +23,8 @@
minWidth="-Infinity"
minHeight="-Infinity"
spacing="12"
alignment="TOP_LEFT">
alignment="TOP_LEFT"
accessibleRole="DIALOG">
<padding>
<Insets topRightBottomLeft="12"/>
</padding>
+13 -1
View File
@@ -18,6 +18,14 @@ generic.button.next=Next
generic.button.print=Print
generic.button.remove=Remove
## Vault state
vault.state.locked=Locked
vault.state.unlocked=Unlocked
vault.state.missing=Missing
vault.state.migrationNeeded=Migration required
vault.state.processing=Processing
vault.state.error=Error
# Error
error.message=An error occurred
error.description=Cryptomator didn't expect this to happen. You can look up existing solutions for this error. Or if it has not been reported yet, feel free to do so.
@@ -402,6 +410,8 @@ stats.access.total=Total accesses: %d
# Main Window
## Vault List
main.vaultlist=Vaults
main.vaultlist.listEntry=Vault %s (%s)
main.vaultlist.emptyList.onboardingInstruction=Click here to add a vault
main.vaultlist.contextMenu.remove=Remove…
main.vaultlist.contextMenu.lock=Lock
@@ -416,12 +426,14 @@ main.vaultlist.addVaultBtn.menuItemRecover=Recover Existing Vault…
main.vaultlist.addVaultButton.tooltip=Add Vault
main.vaultlist.showEventsButton.tooltip=Open Event View
main.vaultlist.showPreferencesButton.tooltip=Show Preferences
##Notificaition
##Notification
main.notification.updateAvailable=Update is available.
main.notification.support=Support Cryptomator.
main.notification.closeButton.tooltip=Close info bar
## Vault Detail
### Welcome
main.vaultDetail.welcomeOnboarding=Thanks for choosing Cryptomator to protect your files. If you need any assistance, check out our getting started guides:
main.vaultDetail.storageLocation=Vault storage location
### Locked
main.vaultDetail.lockedStatus=LOCKED
main.vaultDetail.unlockBtn=Unlock…