From c4f0a5335dbf669075e623cb14b4e3339c2b469f Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Fri, 13 May 2022 18:57:27 +0200 Subject: [PATCH] Create Language Change --- .../turnierverwaltung/FXController.java | 20 ++- .../projekt2/turnierverwaltung/Factory.java | 16 +- .../LanguageConfigurator.java | 144 ++++++++++++++++++ .../turnierverwaltung/main/MainWindow.java | 9 +- .../main/MainWindowController.java | 29 +++- .../main/gameScheduleView/GameController.java | 14 +- .../GameScheduleController.java | 11 +- .../ParticipantFormularController.java | 13 ++ .../PlacesFormularController.java | 12 ++ .../TournamentListController.java | 13 +- .../turnierverwaltung/MainWindow.fxml | 7 +- .../gameScheduleView/Game.fxml | 2 +- .../gameScheduleView/GameSchedule.fxml | 2 +- 13 files changed, 268 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/LanguageConfigurator.java diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FXController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FXController.java index c2c7a87..1b28669 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FXController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FXController.java @@ -8,8 +8,9 @@ public abstract class FXController { FileIO fileIO; Pane pane; IsObserver listener; + LanguageConfigurator languageConfigurator; - public FXController(){ + public FXController() { listener = new IsObserver() { @Override public void update() { @@ -18,21 +19,30 @@ public abstract class FXController { }; } - public void setup(TournamentDecorator tournamentDecorator, FileIO fileIO, FactoryDecorator factoryDecorator, Pane pane){ + public void setup(LanguageConfigurator languageConfigurator) { + this.languageConfigurator = languageConfigurator; + shareGUIElementWithLanguageConfigurator(); + } + + public void setup(TournamentDecorator tournamentDecorator, FileIO fileIO, FactoryDecorator factoryDecorator, Pane pane, LanguageConfigurator languageConfigurator) { this.tournamentDecorator = tournamentDecorator; this.fileIO = fileIO; this.factoryDecorator = factoryDecorator; this.pane = pane; + this.languageConfigurator = languageConfigurator; + shareGUIElementWithLanguageConfigurator(); addListener(); } + public abstract void shareGUIElementWithLanguageConfigurator(); + public abstract void loadContent(); protected void setTournamentDecorator(TournamentDecorator tournamentDecorator) { this.tournamentDecorator = tournamentDecorator; } - public void addListener(){ + public void addListener() { tournamentDecorator.addListener(listener); factoryDecorator.addListener(listener); } @@ -64,4 +74,8 @@ public abstract class FXController { protected Pane getPane() { return pane; } + + protected LanguageConfigurator getLanguageConfigurator() { + return languageConfigurator; + } } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java index dec1687..46b08bd 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java @@ -14,11 +14,12 @@ import java.io.IOException; public class Factory { private TournamentDecorator tournamentDecorator; private FileIO fileIO; + private static LanguageConfigurator languageConfigurator; - public Factory(FileIO fileIO, TournamentDecorator tournamentDecorator) { + public Factory(FileIO fileIO, TournamentDecorator tournamentDecorator, LanguageConfigurator languageConfigurator) { this.fileIO = fileIO; this.tournamentDecorator = tournamentDecorator; - + this.languageConfigurator = languageConfigurator; } public TournamentDecorator getTournamentDecorator() { @@ -30,9 +31,12 @@ public class Factory { } public BorderPane loadMainWindow() { - FXMLLoader loader = new FXMLLoader(getClass().getResource("mainWindow.fxml")); + FXMLLoader loader = new FXMLLoader(getClass().getResource("MainWindow.fxml")); try { - return loader.load(); + BorderPane pane = loader.load(); + FXController controller = loader.getController(); + controller.setup(languageConfigurator); + return pane; } catch (IOException e) { e.printStackTrace(); //TODO handle and logging @@ -82,7 +86,7 @@ public class Factory { FXMLLoader loader = new FXMLLoader(getClass().getResource("gameScheduleView/Game.fxml")); box.getChildren().add(loader.load()); GameController controller = loader.getController(); - controller.setup(tournamentDecorator, fileIO, factoryDecorator, box, gameDecorator); + controller.setup(tournamentDecorator, fileIO, factoryDecorator, box, gameDecorator, languageConfigurator); return controller; } catch (IOException e) { e.printStackTrace(); @@ -151,7 +155,7 @@ public class Factory { FXMLLoader loader = new FXMLLoader(getClass().getResource(fxmlFileName)); this.pane = loader.load(); FXController controller = loader.getController(); - controller.setup(tournamentDecorator, fileIO, factoryDecorator, borderPane); + controller.setup(tournamentDecorator, fileIO, factoryDecorator, borderPane, languageConfigurator); } } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/LanguageConfigurator.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/LanguageConfigurator.java new file mode 100644 index 0000000..72efb0a --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/LanguageConfigurator.java @@ -0,0 +1,144 @@ +package ch.zhaw.projekt2.turnierverwaltung; + +import javafx.scene.control.Labeled; +import javafx.scene.control.MenuItem; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LanguageConfigurator { + + private Language selectedLanguage; + private Map germanDictionary; + private Map englishDictionary; + private List labelList; + private List menuItemList; + + public LanguageConfigurator() { + selectedLanguage = Language.GERMAN; + labelList = new ArrayList<>(); + menuItemList = new ArrayList<>(); + germanDictionary = new HashMap<>(); + englishDictionary = new HashMap<>(); + setUpDictionaries(); + } + + private void setUpDictionaries() { + //Main + germanDictionary.put("menuItemLanguage","Sprache"); + englishDictionary.put("menuItemLanguage","Language"); + germanDictionary.put("closeBtn","Beenden"); + englishDictionary.put("closeBtn","Close"); + germanDictionary.put("mainTitle","Turnier Manager"); + englishDictionary.put("mainTitle","Tournament Manager"); + //Tournamentlist + germanDictionary.put("tournamentListTitle","Bestehende Turniere"); + englishDictionary.put("tournamentListTitle","Existing tournaments"); + germanDictionary.put("openBtn","Öffnen"); + englishDictionary.put("openBtn","Open"); + germanDictionary.put("deleteBtn","Löschen"); + englishDictionary.put("deleteBtn","Delete"); + germanDictionary.put("newTournamentFormularTitle","Neues Turnier erstellen"); + englishDictionary.put("newTournamentFormularTitle","Create new tournament"); + germanDictionary.put("tournamentNameLabel","Turnier Name:"); + englishDictionary.put("tournamentNameLabel","Tournament Name:"); + germanDictionary.put("tournamentModLabel","Turnier Modus"); + englishDictionary.put("tournamentModLabel","Tournament Mode"); + germanDictionary.put("createBtn","Erstellen"); + englishDictionary.put("createBtn","Create"); + //PlaceList + germanDictionary.put("placeListTitle","Hinzugefügt"); + englishDictionary.put("placeListTitle","Added"); + germanDictionary.put("saveBtn","Speichern"); + englishDictionary.put("saveBtn","Save"); + germanDictionary.put("newplaceFormularTitle","Ort ändern/erstellen"); + englishDictionary.put("newplaceFormularTitle","Location change/create"); + //GameSchedule + germanDictionary.put("treeView","Baumansicht"); + englishDictionary.put("treeView","Treeview"); + germanDictionary.put("createScheduleBtn","Spielplan erstellen"); + englishDictionary.put("createScheduleBtn","Create game schedule"); + germanDictionary.put("editParticipantBtn","Teilnehmer bearbeiten"); + englishDictionary.put("editParticipantBtn","Edit Participants"); + germanDictionary.put("editLocBtn","Orte bearbeiten"); + englishDictionary.put("editLocBtn","Edit Locations"); + germanDictionary.put("closeTournamentBtn","Turnier schliessen"); + englishDictionary.put("closeTournamentBtn","Close tournament"); + //ParticipantFormular + germanDictionary.put("participantListTitle","Hinzugefügt"); + englishDictionary.put("participantListTitle","Added"); + germanDictionary.put("newParticipantFormularTitle","Teilnehmer ändern/erstellen"); + englishDictionary.put("newParticipantFormularTitle","Participant change/create"); + germanDictionary.put("participantNameLabel","Name:"); + englishDictionary.put("participantNameLabel","Name:"); + germanDictionary.put("firstNameLabel","Vorname:"); + englishDictionary.put("firstNameLabel","First Name:"); + germanDictionary.put("phoneNumberLabel","Telefon:"); + englishDictionary.put("phoneNumberLabel","Phone:"); + germanDictionary.put("birthDateLabel","Geb. Datum:"); + englishDictionary.put("birthDateLabel","Birthday:"); + //Game + germanDictionary.put("locationLabel","Ort:"); + englishDictionary.put("locationLabel","Location:"); + germanDictionary.put("participantNameOne","Teilnehmer A"); + englishDictionary.put("participantNameOne","Participant One"); + germanDictionary.put("participantNameTwo","Teilnehmer B"); + englishDictionary.put("participantNameTwo","Participant Two"); + } + + public void translateGUI() { + String word = ""; + for (Labeled label : labelList) { + switch (selectedLanguage) { + case GERMAN -> { + word = germanDictionary.get(label.getId()); + } + case ENGLISH -> { + word = englishDictionary.get(label.getId()); + } + } + if(word != null) { + label.setText(word); + } else { + //TODO LOG + } + } + + for (MenuItem item : menuItemList) { + switch (selectedLanguage) { + case GERMAN -> { + word = germanDictionary.get(item.getId()); + } + case ENGLISH -> { + word = englishDictionary.get(item.getId()); + } + } + if(word != null) { + item.setText(word); + } else { + //TODO LOG + } + } + } + + public void recieveLabel(Labeled label) { + if (label != null) { + labelList.add(label); + } + } + + public void recieveMenuItem(MenuItem item) { + menuItemList.add(item); + } + + public void changeLanguage(Language language) { + this.selectedLanguage = language; + translateGUI(); + } + + public enum Language { + ENGLISH,GERMAN + } +} diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java index 82d4c0a..8c4d22c 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java @@ -1,9 +1,6 @@ package ch.zhaw.projekt2.turnierverwaltung.main; -import ch.zhaw.projekt2.turnierverwaltung.Factory; -import ch.zhaw.projekt2.turnierverwaltung.FactoryDecorator; -import ch.zhaw.projekt2.turnierverwaltung.FileIO; -import ch.zhaw.projekt2.turnierverwaltung.TournamentDecorator; +import ch.zhaw.projekt2.turnierverwaltung.*; import javafx.application.Application; import javafx.event.EventHandler; import javafx.fxml.FXMLLoader; @@ -19,7 +16,8 @@ public class MainWindow extends Application { private FileIO fileIO = new FileIO(System.getProperty("user.dir") + System.getProperty("file.separator") + "tournierverwaltung_angrynerds"); private FactoryDecorator factoryDecorator; private TournamentDecorator tournamentDecorator = new TournamentDecorator(fileIO); - private Factory factory = new Factory(fileIO, tournamentDecorator); + private LanguageConfigurator languageConfigurator = new LanguageConfigurator(); + private Factory factory = new Factory(fileIO, tournamentDecorator, languageConfigurator); private static final Logger logger = Logger.getLogger(FileIO.class.getCanonicalName()); @Override @@ -29,6 +27,7 @@ public class MainWindow extends Application { factory.loadAllViews(factoryDecorator, pane); tournamentDecorator.setFactoryDecorator(factoryDecorator); factoryDecorator.openTournamentList(); + languageConfigurator.translateGUI(); Scene scene = new Scene(pane); primaryStage.setScene(scene); diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindowController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindowController.java index ffb528b..2fd43e0 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindowController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindowController.java @@ -1,15 +1,33 @@ package ch.zhaw.projekt2.turnierverwaltung.main; import ch.zhaw.projekt2.turnierverwaltung.FXController; +import ch.zhaw.projekt2.turnierverwaltung.LanguageConfigurator; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.fxml.FXML; +import javafx.scene.control.Label; +import javafx.scene.control.Menu; +import javafx.scene.control.MenuItem; public class MainWindowController extends FXController { @FXML - void changeLangToGerman(ActionEvent event) { + private MenuItem closeBtn; + @FXML + private Label mainTitle; + + @FXML + private Menu menuItemLanguage; + + @FXML + void changeLangToGerman(ActionEvent event) { + getLanguageConfigurator().changeLanguage(LanguageConfigurator.Language.GERMAN); + } + + @FXML + void changeLangToEnglish(ActionEvent event) { + getLanguageConfigurator().changeLanguage(LanguageConfigurator.Language.ENGLISH); } @FXML @@ -17,6 +35,15 @@ public class MainWindowController extends FXController { Platform.exit(); } + @Override + public void shareGUIElementWithLanguageConfigurator() { + getLanguageConfigurator().recieveLabel(mainTitle); + getLanguageConfigurator().recieveMenuItem(closeBtn); + getLanguageConfigurator().recieveMenuItem(menuItemLanguage); + } + + + @Override public void loadContent() { diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java index 07f4de1..0664462 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java @@ -32,6 +32,16 @@ public class GameController extends FXController{ @FXML private TextField pointsTeamTwo; + @FXML + private Label locationLabel; + + @Override + public void shareGUIElementWithLanguageConfigurator() { + getLanguageConfigurator().recieveLabel(participantNameOne); + getLanguageConfigurator().recieveLabel(participantNameTwo); + getLanguageConfigurator().recieveLabel(locationLabel); + } + @FXML void saveGameResult(Event event) { gameDecorator.saveGameResult(pointsTeamOne.getText(), pointsTeamTwo.getText()); @@ -48,6 +58,7 @@ public class GameController extends FXController{ @Override public void loadContent() { + getLanguageConfigurator().translateGUI(); participantNameOne.setText(gameDecorator.getParticipantOne()); participantNameTwo.setText(gameDecorator.getParticipantTwo()); pointsTeamOne.setText(String.valueOf(gameDecorator.getPoints1())); @@ -71,9 +82,10 @@ public class GameController extends FXController{ } - public void setup(TournamentDecorator tournamentDecorator, FileIO fileIO, FactoryDecorator factoryDecorator, Pane pane, GameDecorator gameDecorator) { + public void setup(TournamentDecorator tournamentDecorator, FileIO fileIO, FactoryDecorator factoryDecorator, Pane pane, GameDecorator gameDecorator,LanguageConfigurator languageConfigurator) { setTournamentDecorator(tournamentDecorator); this.gameDecorator = gameDecorator; + setup(languageConfigurator); placesChoiceBox.getSelectionModel().selectedItemProperty().addListener((ObservableValue observable, Place oldValue, Place newValue) -> saveGamePlace(newValue == null ? oldValue : newValue)); } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameScheduleController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameScheduleController.java index 3c8352e..c9f042f 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameScheduleController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameScheduleController.java @@ -1,11 +1,11 @@ package ch.zhaw.projekt2.turnierverwaltung.main.gameScheduleView; import ch.zhaw.projekt2.turnierverwaltung.FXController; -import ch.zhaw.projekt2.turnierverwaltung.Tournament; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; +import javafx.scene.control.Labeled; import javafx.scene.layout.HBox; public class GameScheduleController extends FXController { @@ -28,6 +28,15 @@ public class GameScheduleController extends FXController { @FXML private CheckBox treeView; + @Override + public void shareGUIElementWithLanguageConfigurator() { + getLanguageConfigurator().recieveLabel(treeView); + getLanguageConfigurator().recieveLabel(createScheduleBtn); + getLanguageConfigurator().recieveLabel(editParticipantBtn); + getLanguageConfigurator().recieveLabel(editLocBtn); + getLanguageConfigurator().recieveLabel(closeTournamentBtn); + } + @FXML void createNewSchedule(ActionEvent event) { getTournamentDecorator().createNewGameSchedule(); diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java index fec9af8..384e6da 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java @@ -68,6 +68,19 @@ public class ParticipantFormularController extends FXController { @FXML private Button saveBtn; + @Override + public void shareGUIElementWithLanguageConfigurator() { + getLanguageConfigurator().recieveLabel(participantListTitle); + getLanguageConfigurator().recieveLabel(closeBtn); + getLanguageConfigurator().recieveLabel(deleteBtn); + getLanguageConfigurator().recieveLabel(newParticipantFormularTitle); + getLanguageConfigurator().recieveLabel(participantNameLabel); + getLanguageConfigurator().recieveLabel(firstNameLabel); + getLanguageConfigurator().recieveLabel(phoneNumberLabel); + getLanguageConfigurator().recieveLabel(birthDateLabel); + getLanguageConfigurator().recieveLabel(saveBtn); + } + @FXML void changedSelection(MouseEvent event){ Player participant = (Player) participantListView.getSelectionModel().getSelectedItems().get(0); diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/placesAddFormular/PlacesFormularController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/placesAddFormular/PlacesFormularController.java index b2a031a..15c1063 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/placesAddFormular/PlacesFormularController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/placesAddFormular/PlacesFormularController.java @@ -50,6 +50,18 @@ public class PlacesFormularController extends FXController { @FXML private Button saveBtn; + @Override + public void shareGUIElementWithLanguageConfigurator() { + getLanguageConfigurator().recieveLabel(placeListTitle); + getLanguageConfigurator().recieveLabel(newPlaceFormularTitle); + getLanguageConfigurator().recieveLabel(placeNameLabel); + getLanguageConfigurator().recieveLabel(closeBtn); + getLanguageConfigurator().recieveLabel(deleteBtn); + getLanguageConfigurator().recieveLabel(saveBtn); + + + } + @FXML void changedSelection(MouseEvent event){ Place place = placeListView.getSelectionModel().getSelectedItems().get(0); diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/TournamentListController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/TournamentListController.java index ab26504..a1c85e9 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/TournamentListController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/TournamentListController.java @@ -25,8 +25,6 @@ public class TournamentListController extends FXController { @FXML private Button createBtn; - @FXML - private GridPane grid; @FXML private ChoiceBox modusChoiceBox; @@ -55,6 +53,17 @@ public class TournamentListController extends FXController { @FXML private TextField tournamentNameField; + @Override + public void shareGUIElementWithLanguageConfigurator() { + getLanguageConfigurator().recieveLabel(createBtn); + getLanguageConfigurator().recieveLabel(newTournamentFormularTitle); + getLanguageConfigurator().recieveLabel(openBtn); + getLanguageConfigurator().recieveLabel(deleteBtn); + getLanguageConfigurator().recieveLabel(tournamentListTitle); + getLanguageConfigurator().recieveLabel(tournamentModLabel); + getLanguageConfigurator().recieveLabel(tournamentNameLabel); + } + @FXML void createTournament(ActionEvent event) { getTournamentDecorator().createTournament(tournamentNameField.getText(), modusChoiceBox.getValue()); diff --git a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/MainWindow.fxml b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/MainWindow.fxml index 0648e2f..2681533 100644 --- a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/MainWindow.fxml +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/MainWindow.fxml @@ -16,17 +16,18 @@ - + + - + -