From 916fa0741899afd7729e1c4a546048b44c0111b1 Mon Sep 17 00:00:00 2001 From: Rithvik Sriram Date: Thu, 15 Jan 2026 00:29:12 +0100 Subject: [PATCH] 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()); + } + + +}