Added base locale functionality. Works in AddNameCtrl for now.

This commit is contained in:
Oskar Rasieński 2025-12-04 00:00:38 +01:00
commit 6e9ac2b055
10 changed files with 136 additions and 8 deletions

View file

@ -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);
}
}

View file

@ -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;
}
}
}

View file

@ -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"));
}

View file

@ -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() {}
}

View file

@ -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<Locale> currentLocale = new SimpleObjectProperty<>(Locale.ENGLISH);
private final ObjectProperty<ResourceBundle> 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<ResourceBundle> getBundleProperty() {
return currentBundle;
}
}

View file

@ -7,9 +7,9 @@
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="94.0" prefWidth="470.0" xmlns="http://javafx.com/javafx/23.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="client.scenes.AddNameCtrl">
<children>
<Button layoutX="417.0" layoutY="54.0" mnemonicParsing="false" onAction="#ok" text="Ok" />
<Button layoutX="349.0" layoutY="54.0" mnemonicParsing="false" onAction="#cancel" text="Cancel" />
<Button fx:id="okButton" layoutX="417.0" layoutY="54.0" mnemonicParsing="false" onAction="#ok" text="Ok" />
<Button fx:id="cancelButton" layoutX="349.0" layoutY="54.0" mnemonicParsing="false" onAction="#cancel" text="Cancel" />
<TextField fx:id="recipeName" layoutX="109.0" layoutY="24.0" prefHeight="18.0" prefWidth="292.0" />
<Label layoutX="28.0" layoutY="29.0" text="Recipe Name" />
<Label fx:id="recipeNameLabel" layoutX="28.0" layoutY="29.0" text="Recipe Name" />
</children>
</AnchorPane>

View file

@ -0,0 +1,4 @@
add.recipe.title=Create recipe
add.recipe.label=Recipe Name
add.recipe.button.ok=Ok
add.recipe.button.cancel=Cancel

View file

@ -0,0 +1,4 @@
add.recipe.title=Create recipe
add.recipe.label=Recipe Name
add.recipe.button.ok=Ok
add.recipe.button.cancel=Cancel

View file

@ -0,0 +1,4 @@
add.recipe.title=Recept aanmaken
add.recipe.label=Receptnaam
add.recipe.button.ok=Ok
add.recipe.button.cancel=Annuleren

View file

@ -0,0 +1,4 @@
add.recipe.title=Utwórz przepis
add.recipe.label=Nazwa przepisu
add.recipe.button.ok=Ok
add.recipe.button.cancel=Anuluj