diff --git a/src/de/deadlocker8/budgetmaster/logic/Settings.java b/src/de/deadlocker8/budgetmaster/logic/Settings.java index 0a633663eefc9316b73cdcdea657d440a85dff0b..29da9144f034f48ca750422b9ab76899a8a21eb7 100644 --- a/src/de/deadlocker8/budgetmaster/logic/Settings.java +++ b/src/de/deadlocker8/budgetmaster/logic/Settings.java @@ -2,6 +2,8 @@ package de.deadlocker8.budgetmaster.logic; import java.util.ArrayList; +import de.deadlocker8.budgetmaster.logic.utils.LanguageType; + public class Settings { private String clientSecret; @@ -10,6 +12,7 @@ public class Settings private String currency; private boolean restActivated; private ArrayList<String> trustedHosts; + private LanguageType language; public Settings() { @@ -74,8 +77,18 @@ public class Settings public void setTrustedHosts(ArrayList<String> trustedHosts) { this.trustedHosts = trustedHosts; - } + } + public LanguageType getLanguage() + { + return language; + } + + public void setLanguage(LanguageType language) + { + this.language = language; + } + public boolean isComplete() { if(url == null) @@ -91,6 +104,6 @@ public class Settings @Override public String toString() { - return "Settings [clientSecret=" + clientSecret + ", url=" + url + ", secret=" + secret + ", currency=" + currency + ", restActivated=" + restActivated + ", trustedHosts=" + trustedHosts + "]"; + return "Settings [clientSecret=" + clientSecret + ", url=" + url + ", secret=" + secret + ", currency=" + currency + ", restActivated=" + restActivated + ", trustedHosts=" + trustedHosts + ", language=" + language + "]"; } } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/utils/LanguageType.java b/src/de/deadlocker8/budgetmaster/logic/utils/LanguageType.java new file mode 100644 index 0000000000000000000000000000000000000000..f9ed0a08066df8eee6cd6866cbbd2702ab89bd1b --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/utils/LanguageType.java @@ -0,0 +1,35 @@ +package de.deadlocker8.budgetmaster.logic.utils; + +import java.util.Locale; + +public enum LanguageType +{ + GERMAN("Deutsch", Locale.GERMAN, "german"), + ENGLISH("English", Locale.ENGLISH, "english"); + + private String name; + private Locale locale; + private String iconName; + + private LanguageType(String name, Locale locale, String iconName) + { + this.name = name; + this.locale = locale; + this.iconName = iconName; + } + + public String getName() + { + return name; + } + + public Locale getLocale() + { + return locale; + } + + public String getIconName() + { + return iconName; + } +} \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java b/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java index 545c847ae46f9d07c1a2af8f8929700f78ec63b0..6e38376d818dca2360933e93bf21129adf805b02 100644 --- a/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java +++ b/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java @@ -8,6 +8,7 @@ public class Strings public static final String VERSION_NAME = "version.name"; public static final String VERSION_DATE = "version.date"; public static final String AUTHOR = "author"; + public static final String CREDITS = "credits"; public static final String FOLDER = "folder"; //TITLE @@ -128,6 +129,10 @@ public class Strings public static final String INFO_HEADER_TEXT_WELCOME = "info.header.text.welcome"; public static final String INFO_TEXT_WELCOME_FIRST_START = "info.text.welcome.first.start"; public static final String INFO_TEXT_WELCOME_COMPATIBILITY = "info.text.welcome.compatibility"; + public static final String INFO_TITLE_LANGUAGE_CHANGED = "info.title.language.changed"; + public static final String INFO_TEXT_LANGUAGE_CHANGED = "info.text.language.changed"; + public static final String INFO_TEXT_LANGUAGE_CHANGED_RESTART_NOW = "info.text.language.changed.restart.now"; + public static final String INFO_TEXT_LANGUAGE_CHANGED_RESTART_LATER = "info.text.language.changed.restart.later"; //WARNING public static final String WARNING_ENDDATE_BEFORE_STARTDATE = "warning.enddate.before.startdate"; diff --git a/src/de/deadlocker8/budgetmaster/resources/_de.properties b/src/de/deadlocker8/budgetmaster/resources/_de.properties index 99ffe43b1cf0fe055ed381c0508cae7a491b5195..9525724647f640fbe2d7b2345e1ec373132d8e1f 100644 --- a/src/de/deadlocker8/budgetmaster/resources/_de.properties +++ b/src/de/deadlocker8/budgetmaster/resources/_de.properties @@ -1,9 +1,10 @@ # DEFAULT app.name=BudgetMaster -version.code=6 +version.code=7 version.name=1.4.0_alpha version.date=12.08.17 author=Robert Goldmann +credits=L�nderflaggen von Freepik auf https://www.flaticon.com folder=Deadlocker/BudgetMaster @@ -127,6 +128,11 @@ info.header.text.welcome=Willkommen beim BudgetMaster info.text.welcome.first.start=Dies scheint dein erster Besuch zu sein, da noch keine Einstellungen existieren.\nDamit es losgehen kann, �berlege dir ein Passwort und trage es in das Passwortfeld ein.\n\n(Hinweis: Das Passwort kann sp�ter jederzeit ge�ndert werden.)\n " info.text.welcome.compatibility=Deine Einstellungsdatei ist veraltet und muss aktualisert werden.\nSeit Version v1.3.0 wird ein Passwort ben�tigt, um BudgetMaster zu entsperren. Damit es losgehen kann, �berlege dir ein Passwort und trage es in das Passwortfeld ein.\n\n(Hinweis: Das Passwort kann sp�ter jederzeit ge�ndert werden.)\n " +info.title.language.changed=Neustarten +info.text.language.changed=�nderungen der Sprache werden erst nach einem Neustart des Programms wirksam. +info.text.language.changed.restart.now=Jetzt neustarten +info.text.language.changed.restart.later=Sp�ter neustarten + # WARNING warning.enddate.before.startdate=Das Enddatum darf zeitlich nicht vor dem Startdatum liegen. warning.empty.width.in.pixels=Bitte gib eine Breite in Pixeln an. @@ -250,6 +256,7 @@ settingstab.label.rest.activated=aktiviert settingstab.label.rest.deactivated=deaktiviert settingstab.label.trusted.hosts=Vertrauensw�rdige Hosts: settingstab.label.trusted.hosts.info=(ein Host pro Zeile) +settingstab.label.language=Sprache: settingstab.label.database=Datenbank: settingstab.button.database.export=Exportieren settingstab.button.database.import=Importieren diff --git a/src/de/deadlocker8/budgetmaster/resources/flags/english.png b/src/de/deadlocker8/budgetmaster/resources/flags/english.png new file mode 100644 index 0000000000000000000000000000000000000000..56268bc43902937b857b586498cf5059a7926f36 Binary files /dev/null and b/src/de/deadlocker8/budgetmaster/resources/flags/english.png differ diff --git a/src/de/deadlocker8/budgetmaster/resources/flags/german.png b/src/de/deadlocker8/budgetmaster/resources/flags/german.png new file mode 100644 index 0000000000000000000000000000000000000000..2644cdb785a2ef8eb806b0ae25bcc03c1160ae52 Binary files /dev/null and b/src/de/deadlocker8/budgetmaster/resources/flags/german.png differ diff --git a/src/de/deadlocker8/budgetmaster/ui/cells/LanguageCell.java b/src/de/deadlocker8/budgetmaster/ui/cells/LanguageCell.java new file mode 100644 index 0000000000000000000000000000000000000000..d7da4df94a8325a5aee359f03de9d46f5cac5c69 --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/ui/cells/LanguageCell.java @@ -0,0 +1,63 @@ +package de.deadlocker8.budgetmaster.ui.cells; + +import de.deadlocker8.budgetmaster.logic.utils.LanguageType; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.scene.control.ListCell; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; + +public class LanguageCell extends ListCell<LanguageType> +{ + private final double HEIGHT = 20.0; + private boolean useBorder; + + public LanguageCell(boolean useBorder) + { + this.useBorder = useBorder; + } + + @Override + protected void updateItem(LanguageType item, boolean empty) + { + super.updateItem(item, empty); + + if(!empty) + { + HBox hbox = new HBox(); + + Image image = new Image("de/deadlocker8/budgetmaster/resources/flags/" + item.getIconName() + ".png"); + ImageView imageView = new ImageView(image); + imageView.setFitWidth(HEIGHT); + imageView.setFitHeight(HEIGHT); + hbox.getChildren().add(imageView); + + Label labelName = new Label(item.getName()); + labelName.setPrefHeight(HEIGHT); + labelName.setStyle("-fx-font-weight: bold; -fx-font-size: 14; -fx-text-fill: #212121"); + labelName.setAlignment(Pos.CENTER); + hbox.getChildren().add(labelName); + HBox.setMargin(labelName, new Insets(0, 0, 0, 20)); + + hbox.setPadding(new Insets(0)); + if(useBorder) + { + setStyle("-fx-background: transparent; -fx-border-color: #545454; -fx-border-width: 0 0 1 0"); + } + else + { + setStyle("-fx-background: transparent;"); + } + setGraphic(hbox); + setAlignment(Pos.CENTER); + } + else + { + setStyle("-fx-background: transparent"); + setText(null); + setGraphic(null); + } + } +} \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java b/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java index f87742a17469a388aec0847937bfe3dac922decd..2d960d0a2bbb93b4911a366543f0ebf1e02ff7ae 100644 --- a/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java +++ b/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java @@ -328,12 +328,19 @@ public class Controller public void about() { - AlertGenerator.showAboutAlert(Localization.getString(Strings.APP_NAME), - Localization.getString(Strings.VERSION_NAME), - Localization.getString(Strings.VERSION_CODE), - Localization.getString(Strings.VERSION_DATE), - Localization.getString(Strings.AUTHOR), - icon, stage, null, false); + ArrayList<String> creditLines = new ArrayList<>(); + creditLines.add(Localization.getString(Strings.CREDITS)); + + AlertGenerator.showAboutAlertWithCredits(Localization.getString(Strings.APP_NAME), + Localization.getString(Strings.VERSION_NAME), + Localization.getString(Strings.VERSION_CODE), + Localization.getString(Strings.VERSION_DATE), + Localization.getString(Strings.AUTHOR), + creditLines, + icon, + stage, + null, + false); } public void refresh(FilterSettings newFilterSettings) diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/SettingsController.java b/src/de/deadlocker8/budgetmaster/ui/controller/SettingsController.java index 5d8dc9535aec4c07129e457d812e447e22e69fc2..506a7f6480dba8b70a52f3d7608f0abdb586543d 100644 --- a/src/de/deadlocker8/budgetmaster/ui/controller/SettingsController.java +++ b/src/de/deadlocker8/budgetmaster/ui/controller/SettingsController.java @@ -11,7 +11,9 @@ import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; import de.deadlocker8.budgetmaster.logic.utils.Colors; import de.deadlocker8.budgetmaster.logic.utils.FileHelper; import de.deadlocker8.budgetmaster.logic.utils.Helpers; +import de.deadlocker8.budgetmaster.logic.utils.LanguageType; import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmaster.ui.cells.LanguageCell; import de.deadlocker8.budgetmasterserver.logic.database.Database; import javafx.application.Platform; import javafx.fxml.FXML; @@ -20,6 +22,7 @@ import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Button; import javafx.scene.control.ButtonBar.ButtonData; import javafx.scene.control.ButtonType; +import javafx.scene.control.ComboBox; import javafx.scene.control.Label; import javafx.scene.control.RadioButton; import javafx.scene.control.TextArea; @@ -56,8 +59,10 @@ public class SettingsController @FXML private RadioButton radioButtonRestActivated; @FXML private RadioButton radioButtonRestDeactivated; @FXML private TextArea textAreaTrustedHosts; + @FXML private ComboBox<LanguageType> comboBoxLanguage; private Controller controller; + private LanguageType previousLanguage; public void init(Controller controller) { @@ -66,6 +71,15 @@ public class SettingsController textFieldClientSecret.setText("******"); radioButtonRestDeactivated.setSelected(true); + comboBoxLanguage.setCellFactory((view) -> { + return new LanguageCell(true); + }); + + comboBoxLanguage.getItems().addAll(LanguageType.values()); + comboBoxLanguage.setButtonCell(new LanguageCell(false)); + comboBoxLanguage.setValue(LanguageType.GERMAN); + previousLanguage = LanguageType.GERMAN; + if(controller.getSettings().isComplete()) { textFieldURL.setText(controller.getSettings().getUrl()); @@ -80,8 +94,15 @@ public class SettingsController radioButtonRestDeactivated.setSelected(true); } setTextAreaTrustedHosts(controller.getSettings().getTrustedHosts()); + + if(controller.getSettings().getLanguage() != null) + { + LanguageType language = controller.getSettings().getLanguage(); + comboBoxLanguage.setValue(language); + previousLanguage = language; + } } - + anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND)); labelClientSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); labelSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); @@ -206,6 +227,7 @@ public class SettingsController controller.getSettings().setCurrency(currency); controller.getSettings().setRestActivated(radioButtonRestActivated.isSelected()); controller.getSettings().setTrustedHosts(trustedHosts); + controller.getSettings().setLanguage(comboBoxLanguage.getValue()); } else { @@ -232,6 +254,7 @@ public class SettingsController settings.setCurrency(currency); settings.setRestActivated(radioButtonRestActivated.isSelected()); settings.setTrustedHosts(trustedHosts); + settings.setLanguage(comboBoxLanguage.getValue()); controller.setSettings(settings); } @@ -257,6 +280,30 @@ public class SettingsController controller.refresh(controller.getFilterSettings()); controller.showNotification(Localization.getString(Strings.NOTIFICATION_SETTINGS_SAVE)); + + if(controller.getSettings().getLanguage() != previousLanguage) + { + Alert alert = new Alert(AlertType.INFORMATION); + alert.setTitle(Localization.getString(Strings.INFO_TITLE_LANGUAGE_CHANGED)); + alert.setHeaderText(""); + alert.setContentText(Localization.getString(Strings.INFO_TEXT_LANGUAGE_CHANGED)); + Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); + dialogStage.getIcons().add(controller.getIcon()); + + ButtonType buttonTypeOne = new ButtonType(Localization.getString(Strings.INFO_TEXT_LANGUAGE_CHANGED_RESTART_NOW)); + ButtonType buttonTypeTwo = new ButtonType(Localization.getString(Strings.INFO_TEXT_LANGUAGE_CHANGED_RESTART_LATER)); + alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo); + + Optional<ButtonType> result = alert.showAndWait(); + if (result.get() == buttonTypeOne) + { + //TODO restart programm + } + else + { + alert.close(); + } + } } public void exportDB() diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/SplashScreenController.java b/src/de/deadlocker8/budgetmaster/ui/controller/SplashScreenController.java index 8fe0b27393c633a0d78c02940100fc66b9119abc..65bea18bd2166a6279557b026bbe606a576568e7 100644 --- a/src/de/deadlocker8/budgetmaster/ui/controller/SplashScreenController.java +++ b/src/de/deadlocker8/budgetmaster/ui/controller/SplashScreenController.java @@ -62,6 +62,12 @@ public class SplashScreenController }); settings = FileHelper.loadSettings(); + //load correct language + if(settings.getLanguage() != null) + { + Localization.loadLanguage(settings.getLanguage().getLocale()); + } + if(settings == null) { settings = new Settings(); @@ -172,7 +178,7 @@ public class SplashScreenController Parent root = (Parent)fxmlLoader.load(); Stage newStage = new Stage(); newStage.setTitle(Localization.getString(Strings.APP_NAME)); - newStage.setScene(new Scene(root, 650, 650)); + newStage.setScene(new Scene(root, 650, 675)); newStage.getIcons().add(icon); newStage.setResizable(true); newStage.setMinHeight(650); diff --git a/src/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml b/src/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml index 96f3f6aed567868a15d4d358698577ce8057cb85..209c927ab5f71f8a98649360fe60e01515576a2a 100644 --- a/src/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml +++ b/src/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml @@ -2,6 +2,7 @@ <?import javafx.geometry.Insets?> <?import javafx.scene.control.Button?> +<?import javafx.scene.control.ComboBox?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.RadioButton?> <?import javafx.scene.control.TextArea?> @@ -53,7 +54,7 @@ <Font name="System Bold" size="16.0" /> </font> <VBox.margin> - <Insets top="-5.0" /> + <Insets top="-7.0" /> </VBox.margin> </Label> <Label fx:id="labelSecret1111" alignment="CENTER" contentDisplay="CENTER" maxHeight="-Infinity" text="%settingstab.label.trusted.hosts.info" textAlignment="CENTER" wrapText="true" VBox.vgrow="ALWAYS"> @@ -64,7 +65,7 @@ <Insets top="-20.0" /> </VBox.margin> </Label> - <Label fx:id="labelSecret1112" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.database" textAlignment="RIGHT" wrapText="true"> + <Label fx:id="labelSecret1112" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.language" textAlignment="RIGHT" wrapText="true"> <font> <Font name="System Bold" size="16.0" /> </font> @@ -72,6 +73,14 @@ <Insets top="35.0" /> </VBox.margin> </Label> + <Label fx:id="labelSecret11122" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.database" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets /> + </VBox.margin> + </Label> <Label fx:id="labelSecret11121" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" textAlignment="RIGHT" wrapText="true"> <font> <Font name="System Bold" size="16.0" /> @@ -113,6 +122,7 @@ <VBox.margin> <Insets /> </VBox.margin></TextArea> + <ComboBox fx:id="comboBoxLanguage" maxWidth="1.7976931348623157E308" /> <HBox alignment="CENTER_LEFT" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> <children> <Button fx:id="buttonExportDB" mnemonicParsing="false" onAction="#exportDB" text="%settingstab.button.database.export"> diff --git a/src/de/deadlocker8/budgetmasterserver/main/_de.properties b/src/de/deadlocker8/budgetmasterserver/main/_de.properties index 9eb890aca03c5d0cae11b3f10073c9ad0a45d340..dd7db603ab1211376122c7b8d202c0d535c2c0bb 100644 --- a/src/de/deadlocker8/budgetmasterserver/main/_de.properties +++ b/src/de/deadlocker8/budgetmasterserver/main/_de.properties @@ -1,5 +1,5 @@ app.name=BudgetMasterServer -version.code=6 +version.code=7 version.name=1.4.0_alpha version.date=12.08.17 author=Robert Goldmann \ No newline at end of file