From 916fa0741899afd7729e1c4a546048b44c0111b1 Mon Sep 17 00:00:00 2001 From: Rithvik Sriram Date: Thu, 15 Jan 2026 00:29:12 +0100 Subject: [PATCH 1/3] Add persistent language selection with ConfigService integration --- client/src/main/java/client/MyFXML.java | 4 +- .../main/java/client/utils/LocaleManager.java | 24 +++++++- .../java/client/scenes/LocaleManagerTest.java | 61 +++++++++++++++++++ 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 client/src/test/java/client/scenes/LocaleManagerTest.java diff --git a/client/src/main/java/client/MyFXML.java b/client/src/main/java/client/MyFXML.java index 0d5e9c5..995d3e2 100644 --- a/client/src/main/java/client/MyFXML.java +++ b/client/src/main/java/client/MyFXML.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.net.URL; import java.nio.charset.StandardCharsets; +import client.utils.LocaleManager; import com.google.inject.Injector; import javafx.fxml.FXMLLoader; @@ -38,7 +39,8 @@ public class MyFXML { public Pair load(Class c, String... parts) { try { - var loader = new FXMLLoader(getLocation(parts), null, null, new MyFactory(), StandardCharsets.UTF_8); + var localeManager = injector.getInstance(LocaleManager.class); + var loader = new FXMLLoader(getLocation(parts), localeManager.getBundle(), null, new MyFactory(), StandardCharsets.UTF_8); Parent parent = loader.load(); T ctrl = loader.getController(); return new Pair<>(ctrl, parent); diff --git a/client/src/main/java/client/utils/LocaleManager.java b/client/src/main/java/client/utils/LocaleManager.java index edf342a..167228c 100644 --- a/client/src/main/java/client/utils/LocaleManager.java +++ b/client/src/main/java/client/utils/LocaleManager.java @@ -1,5 +1,6 @@ package client.utils; +import com.google.inject.Inject; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import java.util.Locale; @@ -10,13 +11,30 @@ public class LocaleManager { private final ObjectProperty currentBundle = new SimpleObjectProperty<>(); private static final String RESOURCE_BUNDLE_PATH = "locale/lang"; + private final ConfigService configService; + + @Inject + public LocaleManager(ConfigService configService) { + this.configService = configService; + String savedLanguage = configService.getConfig().getLanguage(); + Locale initialLocale = Locale.forLanguageTag(savedLanguage); + currentLocale.set(initialLocale); - public LocaleManager() { - // TODO: Set currentLocale to config value instead of EN default. updateBundle(); + + currentLocale.addListener((_, oldLocale, newLocale) -> { + updateBundle(); + saveLanguagePreference(newLocale.getLanguage()); + }); + currentLocale.addListener((_, _, _) -> updateBundle()); } + private void saveLanguagePreference(String languageCode) { + configService.getConfig().setLanguage(languageCode); + configService.save(); + } + private void updateBundle() { ResourceBundle bundle = ResourceBundle.getBundle(RESOURCE_BUNDLE_PATH, currentLocale.get(), @@ -44,4 +62,6 @@ public class LocaleManager { public ObjectProperty getBundleProperty() { return currentBundle; } + + } \ No newline at end of file diff --git a/client/src/test/java/client/scenes/LocaleManagerTest.java b/client/src/test/java/client/scenes/LocaleManagerTest.java new file mode 100644 index 0000000..3116af3 --- /dev/null +++ b/client/src/test/java/client/scenes/LocaleManagerTest.java @@ -0,0 +1,61 @@ +package client.scenes; + +import client.utils.ConfigService; +import client.utils.LocaleManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.nio.file.Path; +import java.util.Locale; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class LocaleManagerTest { + + @TempDir + Path tempDir; + + private ConfigService configService; + private LocaleManager localeManager; + + @BeforeEach + void setUp() { + Path configPath = tempDir.resolve("test-config.json"); + configService = new ConfigService(configPath); + localeManager = new LocaleManager(configService); + } + + @Test + void testSetLocaleChangesCurrentLocale() { + localeManager.setLocale(Locale.forLanguageTag("nl")); + assertEquals("nl", localeManager.getLocale().getLanguage()); + } + + @Test + void testSetLocaleSavesToConfig() { + localeManager.setLocale(Locale.forLanguageTag("pl")); + assertEquals("pl", configService.getConfig().getLanguage()); + } + + @Test + void testLocalePersistsAcrossInstances() { + localeManager.setLocale(Locale.forLanguageTag("en")); + LocaleManager newLocaleManager = new LocaleManager(configService); + assertEquals("en", newLocaleManager.getLocale().getLanguage()); + } + + @Test + void testBundleIsNotNull() { + assertNotNull(localeManager.getBundle()); + } + + @Test + void testBundlePropertyIsNotNull() { + assertNotNull(localeManager.getBundleProperty()); + assertNotNull(localeManager.getBundleProperty().get()); + } + + +} From 981b64ae11637579abfca03303083c9c89c5cba6 Mon Sep 17 00:00:00 2001 From: Rithvik Sriram Date: Thu, 15 Jan 2026 13:34:01 +0100 Subject: [PATCH 2/3] Removed redundant listener --- client/src/main/java/client/utils/LocaleManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/main/java/client/utils/LocaleManager.java b/client/src/main/java/client/utils/LocaleManager.java index 167228c..ea614c5 100644 --- a/client/src/main/java/client/utils/LocaleManager.java +++ b/client/src/main/java/client/utils/LocaleManager.java @@ -27,7 +27,6 @@ public class LocaleManager { saveLanguagePreference(newLocale.getLanguage()); }); - currentLocale.addListener((_, _, _) -> updateBundle()); } private void saveLanguagePreference(String languageCode) { From b972023a6e8e1fb26805e83ed316bab2649c00a4 Mon Sep 17 00:00:00 2001 From: Rithvik Sriram Date: Thu, 15 Jan 2026 13:46:42 +0100 Subject: [PATCH 3/3] Added changes where when the lang select menu gets initialized, the value is set to the previously selected language --- client/src/main/java/client/scenes/LangSelectMenuCtrl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/main/java/client/scenes/LangSelectMenuCtrl.java b/client/src/main/java/client/scenes/LangSelectMenuCtrl.java index 41df1bd..2a86c2e 100644 --- a/client/src/main/java/client/scenes/LangSelectMenuCtrl.java +++ b/client/src/main/java/client/scenes/LangSelectMenuCtrl.java @@ -46,6 +46,7 @@ public class LangSelectMenuCtrl implements LocaleAware { @Override public void initializeComponents() { langSelectMenu.getItems().setAll("en", "pl", "nl"); + langSelectMenu.setValue(manager.getLocale().getLanguage()); langSelectMenu.setConverter(new StringConverter() { @Override public String toString(String s) {