From 6e9ac2b05559b4a50f84546f40605cee04cdb17f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Rasie=C5=84ski?= Date: Thu, 4 Dec 2025 00:00:38 +0100 Subject: [PATCH 01/10] Added base locale functionality. Works in AddNameCtrl for now. --- client/src/main/java/client/MyModule.java | 3 ++ .../main/java/client/scenes/AddNameCtrl.java | 29 ++++++++++++-- .../client/scenes/FoodpalApplicationCtrl.java | 10 ++++- .../main/java/client/utils/LocaleAware.java | 38 ++++++++++++++++++ .../main/java/client/utils/LocaleManager.java | 40 +++++++++++++++++++ .../main/resources/client/scenes/AddName.fxml | 8 ++-- .../src/main/resources/locale/lang.properties | 4 ++ .../main/resources/locale/lang_en.properties | 4 ++ .../main/resources/locale/lang_nl.properties | 4 ++ .../main/resources/locale/lang_pl.properties | 4 ++ 10 files changed, 136 insertions(+), 8 deletions(-) create mode 100644 client/src/main/java/client/utils/LocaleAware.java create mode 100644 client/src/main/java/client/utils/LocaleManager.java create mode 100644 client/src/main/resources/locale/lang.properties create mode 100644 client/src/main/resources/locale/lang_en.properties create mode 100644 client/src/main/resources/locale/lang_nl.properties create mode 100644 client/src/main/resources/locale/lang_pl.properties diff --git a/client/src/main/java/client/MyModule.java b/client/src/main/java/client/MyModule.java index df14aa2..f0d95ed 100644 --- a/client/src/main/java/client/MyModule.java +++ b/client/src/main/java/client/MyModule.java @@ -16,6 +16,7 @@ package client; import client.scenes.FoodpalApplicationCtrl; +import client.utils.LocaleManager; import com.google.inject.Binder; import com.google.inject.Module; import com.google.inject.Scopes; @@ -30,5 +31,7 @@ public class MyModule implements Module { binder.bind(MainCtrl.class).in(Scopes.SINGLETON); binder.bind(AddNameCtrl.class).in(Scopes.SINGLETON); binder.bind(FoodpalApplicationCtrl.class).in(Scopes.SINGLETON); + + binder.bind(LocaleManager.class).in(Scopes.SINGLETON); } } \ No newline at end of file diff --git a/client/src/main/java/client/scenes/AddNameCtrl.java b/client/src/main/java/client/scenes/AddNameCtrl.java index 354c653..528ff90 100644 --- a/client/src/main/java/client/scenes/AddNameCtrl.java +++ b/client/src/main/java/client/scenes/AddNameCtrl.java @@ -15,28 +15,50 @@ */ package client.scenes; +import client.utils.LocaleAware; +import client.utils.LocaleManager; import client.utils.ServerUtils; import com.google.inject.Inject; import jakarta.ws.rs.WebApplicationException; import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.input.KeyEvent; import javafx.stage.Modality; import java.io.IOException; -public class AddNameCtrl { +public class AddNameCtrl implements LocaleAware { private final ServerUtils server; private final MainCtrl mainCtrl; - public TextField recipeName; + private final LocaleManager localeManager; + + public TextField recipeName; + public Label recipeNameLabel; + public Button cancelButton; + public Button okButton; @Inject - public AddNameCtrl(ServerUtils server, MainCtrl mainCtrl) { + public AddNameCtrl(ServerUtils server, MainCtrl mainCtrl, LocaleManager localeManager) { this.mainCtrl = mainCtrl; this.server = server; + this.localeManager = localeManager; + } + + @Override + public void updateText() { + recipeNameLabel.setText(getLocaleString("add.recipe.label")); + okButton.setText(getLocaleString("add.recipe.button.ok")); + cancelButton.setText(getLocaleString("add.recipe.button.cancel")); + } + + @Override + public LocaleManager getLocaleManager() { + return localeManager; } public void cancel() throws IOException, InterruptedException { @@ -78,4 +100,5 @@ public class AddNameCtrl { break; } } + } \ No newline at end of file diff --git a/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java b/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java index 93a2507..b3faacf 100644 --- a/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java +++ b/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java @@ -3,7 +3,9 @@ package client.scenes; import java.io.IOException; import java.util.List; +import java.util.Locale; +import client.utils.LocaleManager; import client.utils.ServerUtils; import commons.Recipe; @@ -17,6 +19,7 @@ import javafx.scene.control.ListView; public class FoodpalApplicationCtrl { private final MainCtrl mainCtrl; private final ServerUtils server; + private final LocaleManager localeManager; // all of these aren't used with only my part of the code @@ -72,9 +75,10 @@ public class FoodpalApplicationCtrl { private Button addPreparationStepButton; @Inject - public FoodpalApplicationCtrl(MainCtrl mainCtrl, ServerUtils server) { + public FoodpalApplicationCtrl(MainCtrl mainCtrl, ServerUtils server, LocaleManager localeManager) { this.mainCtrl = mainCtrl; this.server = server; + this.localeManager = localeManager; } @FXML @@ -192,16 +196,20 @@ public class FoodpalApplicationCtrl { @FXML private void switchToEnglish() { System.out.println("Switch language to EN"); + localeManager.setLocale(Locale.of("en")); } @FXML private void switchToDutch() { System.out.println("Switch language to NL"); + localeManager.setLocale(Locale.of("nl")); } @FXML private void switchToPolish() { System.out.println("Switch language to PL"); + localeManager.setLocale(Locale.of("pl")); + } diff --git a/client/src/main/java/client/utils/LocaleAware.java b/client/src/main/java/client/utils/LocaleAware.java new file mode 100644 index 0000000..72bf3dd --- /dev/null +++ b/client/src/main/java/client/utils/LocaleAware.java @@ -0,0 +1,38 @@ +package client.utils; + +import javafx.fxml.Initializable; +import java.net.URL; +import java.util.ResourceBundle; + +public interface LocaleAware extends Initializable { + + /** + * Updates all text when locale changes. + * Must be implemented by each controller. + */ + void updateText(); + + /** + * Returns the injected LocaleManager. + * Must be implemented by each controller. + */ + LocaleManager getLocaleManager(); + + @Override + default void initialize(URL location, ResourceBundle resources) { + updateText(); + + getLocaleManager().getBundleProperty().addListener((_, _, _) -> updateText()); + + initializeComponents(); + } + + default String getLocaleString(String key) { + return getLocaleManager().getBundle().getString(key); + } + + /** + * Optional function for initialization of components. Runs after localization. + */ + default void initializeComponents() {} +} diff --git a/client/src/main/java/client/utils/LocaleManager.java b/client/src/main/java/client/utils/LocaleManager.java new file mode 100644 index 0000000..6fbaf5e --- /dev/null +++ b/client/src/main/java/client/utils/LocaleManager.java @@ -0,0 +1,40 @@ +package client.utils; + +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import java.util.Locale; +import java.util.ResourceBundle; + +public class LocaleManager { + private final ObjectProperty currentLocale = new SimpleObjectProperty<>(Locale.ENGLISH); + private final ObjectProperty currentBundle = new SimpleObjectProperty<>(); + + private static final String RESOURCE_BUNDLE_PATH = "locale/lang"; + + public LocaleManager() { + // TODO: Set currentLocale to config value instead of EN default. + updateBundle(); + currentLocale.addListener((_, _, _) -> updateBundle()); + } + + private void updateBundle() { + ResourceBundle bundle = ResourceBundle.getBundle(RESOURCE_BUNDLE_PATH, currentLocale.get()); + currentBundle.set(bundle); + } + + public void setLocale(Locale locale) { + currentLocale.set(locale); + } + + public Locale getLocale() { + return currentLocale.get(); + } + + public ResourceBundle getBundle() { + return currentBundle.get(); + } + + public ObjectProperty getBundleProperty() { + return currentBundle; + } +} \ No newline at end of file diff --git a/client/src/main/resources/client/scenes/AddName.fxml b/client/src/main/resources/client/scenes/AddName.fxml index f838454..8273c33 100644 --- a/client/src/main/resources/client/scenes/AddName.fxml +++ b/client/src/main/resources/client/scenes/AddName.fxml @@ -7,9 +7,9 @@ -