Change language buttons added. Made UI update all text on language change

This commit is contained in:
Ticho Hidding
2025-10-03 02:37:38 +02:00
parent ef550f353d
commit f037412e9a
15 changed files with 371 additions and 32 deletions

View File

@@ -1,5 +1,6 @@
package org.toop.app;
import javafx.application.Platform;
import org.toop.app.menu.MainMenu;
import org.toop.app.menu.Menu;
@@ -15,8 +16,13 @@ import javafx.scene.text.Text;
import javafx.stage.Stage;
import org.toop.framework.asset.ResourceManager;
import org.toop.framework.asset.resources.CssAsset;
import org.toop.framework.asset.resources.LocalizationAsset;
import org.toop.framework.audio.events.AudioEvents;
import org.toop.framework.eventbus.EventFlow;
import org.toop.local.AppContext;
import org.toop.local.LocalizationEvents;
import java.util.Locale;
public final class App extends Application {
private static Stage stage;
@@ -26,15 +32,19 @@ public final class App extends Application {
private static int height;
private static boolean isQuitting;
private Locale currentLocale = AppContext.getLocale();
private final LocalizationAsset loc = ResourceManager.get("localization.properties");
private static class QuitMenu extends Menu {
public QuitMenu() {
private Locale currentLocale = AppContext.getLocale();
private final LocalizationAsset loc = ResourceManager.get("localization.properties");
public QuitMenu() {
final Region background = createBackground("quit_background");
final Text sure = createText("Are you sure?");
final Text sure = createText(loc.getString("quitMenuTextSure",currentLocale));
final Button yes = createButton("Yes", () -> { stage.close(); });
final Button no = createButton("No", () -> { pop(); isQuitting = false; });
final Button yes = createButton(loc.getString("quitMenuButtonYes",currentLocale), () -> { stage.close(); });
final Button no = createButton(loc.getString("quitMenuButtonNo",currentLocale), () -> { pop(); isQuitting = false; });
final HBox buttons = new HBox(50, yes, no);
buttons.setAlignment(Pos.CENTER);
@@ -62,7 +72,7 @@ public final class App extends Application {
final Scene scene = new Scene(root);
scene.getStylesheets().add(((CssAsset) ResourceManager.get("app.css")).getUrl());
stage.setTitle("pism");
stage.setTitle(loc.getString("windowTitle",currentLocale));
stage.setMinWidth(1080);
stage.setMinHeight(720);
@@ -89,7 +99,23 @@ public final class App extends Application {
new EventFlow().addPostEvent(new AudioEvents.ChangeVolume(0.1)).asyncPostEvent();
App.isQuitting = false;
}
try {
new EventFlow()
.listen(this::handleChangeLanguage);
}catch (Exception e){
System.out.println("Something went wrong while trying to change the language.");
throw e;
}
}
private void handleChangeLanguage(LocalizationEvents.LanguageHasChanged event) {
Platform.runLater(() -> {
currentLocale = AppContext.getLocale();
stage.setTitle(loc.getString("windowTitle",currentLocale));
});
}
public static void quitPopup() {
isQuitting = true;
@@ -102,7 +128,7 @@ public final class App extends Application {
}
public static void push(Menu menu) {
root.getChildren().addLast(menu.getPane());
root.getChildren().addLast(menu.getPane());
}
public static void pop() {

View File

@@ -1,8 +1,11 @@
package org.toop.app.menu;
import javafx.application.Platform;
import org.toop.framework.asset.ResourceManager;
import org.toop.framework.asset.resources.LocalizationAsset;
import org.toop.framework.eventbus.EventFlow;
import org.toop.local.AppContext;
import org.toop.local.LocalizationEvents;
import java.util.Locale;
@@ -10,5 +13,21 @@ public final class CreditsMenu extends Menu {
private Locale currentLocale = AppContext.getLocale();
private LocalizationAsset loc = ResourceManager.get("localization.properties");
public CreditsMenu() {
}
try {
new EventFlow()
.listen(this::handleChangeLanguage);
}catch (Exception e){
System.out.println("Something went wrong while trying to change the language.");
throw e;
}
}
private void handleChangeLanguage(LocalizationEvents.LanguageHasChanged event) {
Platform.runLater(() -> {
currentLocale = AppContext.getLocale();
//credits.setText(loc.getString("credits",currentLocale));
});
}
}

View File

@@ -1,5 +1,6 @@
package org.toop.app.menu;
import javafx.application.Platform;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
@@ -7,27 +8,60 @@ import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import org.toop.app.GameType;
import org.toop.framework.asset.ResourceManager;
import org.toop.framework.asset.resources.LocalizationAsset;
import org.toop.framework.eventbus.EventFlow;
import org.toop.local.AppContext;
import org.toop.local.LocalizationEvents;
import java.util.Locale;
public class GameSelectMenu extends Menu {
private Locale currentLocale = AppContext.getLocale();
private final LocalizationAsset loc = ResourceManager.get("localization.properties");
final ComboBox<String> selectedMode, selectedGame;
final TextField serverIpField;
public GameSelectMenu(GameType type) {
final Region background = createBackground();
final ComboBox<String> selectedGame = new ComboBox<>();
selectedGame = new ComboBox<>();
selectedGame.getItems().add(GameType.toName(GameType.TICTACTOE));
selectedGame.getItems().add(GameType.toName(GameType.REVERSI));
selectedGame.setValue(GameType.toName(type));
final ComboBox<String> selectedMode = new ComboBox<>();
selectedMode = new ComboBox<>();
selectedMode.getItems().add("Local");
selectedMode.getItems().add("Online");
selectedMode.setValue("Local");
final HBox selectedContainer = new HBox(10, selectedGame, selectedMode);
final TextField serverIpField = new TextField();
serverIpField.setPromptText("Enter here your server ip address");
serverIpField = new TextField();
serverIpField.setPromptText(loc.getString("gameSelectMenuEnterIP",currentLocale));
VBox box = new VBox(selectedContainer, serverIpField);
pane = new StackPane(background, box);
}
try {
new EventFlow()
.listen(this::handleChangeLanguage);
}catch (Exception e){
System.out.println("Something went wrong while trying to change the language.");
throw e;
}
}
private void handleChangeLanguage(LocalizationEvents.LanguageHasChanged event) {
Platform.runLater(() -> {
currentLocale = AppContext.getLocale();
serverIpField.setPromptText(loc.getString("gameSelectMenuEnterIP",currentLocale));
selectedGame.getItems().set(0, loc.getString("mainMenuSelectTicTacToe",currentLocale));
selectedGame.getItems().set(1, loc.getString("mainMenuSelectReversi",currentLocale));
selectedMode.getItems().set(0, loc.getString("gameSelectMenuLocal",currentLocale));
selectedMode.getItems().set(1, loc.getString("gameSelectMenuOnline",currentLocale));
});
}
}

View File

@@ -1,5 +1,6 @@
package org.toop.app.menu;
import javafx.application.Platform;
import org.toop.app.App;
import org.toop.app.GameType;
@@ -7,14 +8,24 @@ import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.layout.*;
import org.toop.app.menu.game.TicTacToeMenu;
import org.toop.framework.asset.ResourceManager;
import org.toop.framework.asset.resources.LocalizationAsset;
import org.toop.framework.eventbus.EventFlow;
import org.toop.game.tictactoe.TicTacToe;
import org.toop.local.AppContext;
import org.toop.local.LocalizationEvents;
import java.util.Locale;
public final class MainMenu extends Menu {
public MainMenu() {
private Locale currentLocale = AppContext.getLocale();
private final LocalizationAsset loc = ResourceManager.get("localization.properties");
private final Button tictactoe,reversi,credits,options,quit;
public MainMenu() {
final Region background = createBackground();
final Button tictactoe = createButton("Tic Tac Toe", () -> { App.activate(new TicTacToeMenu(new TicTacToe("player 1", true, "player 2", true))); });
final Button reversi = createButton("Reversi", () -> { App.activate(new GameSelectMenu(GameType.REVERSI)); });
tictactoe = createButton(loc.getString("mainMenuSelectTicTacToe",currentLocale), () -> { App.activate(new TicTacToeMenu(new TicTacToe("player 1", true, "player 2", true))); });
reversi = createButton(loc.getString("mainMenuSelectReversi",currentLocale), () -> { App.activate(new GameSelectMenu(GameType.REVERSI)); });
final VBox gamesBox = new VBox(10, tictactoe, reversi);
gamesBox.setAlignment(Pos.TOP_LEFT);
@@ -22,9 +33,9 @@ public final class MainMenu extends Menu {
gamesBox.setTranslateY(50);
gamesBox.setTranslateX(25);
final Button credits = createButton("Credits", () -> { App.push(new CreditsMenu()); });
final Button options = createButton("Options", () -> { App.push(new OptionsMenu()); });
final Button quit = createButton("Quit", () -> { App.quitPopup(); });
credits = createButton(loc.getString("mainMenuSelectCredits",currentLocale), () -> { App.push(new CreditsMenu()); });
options = createButton(loc.getString("mainMenuSelectOptions",currentLocale), () -> { App.push(new OptionsMenu()); });
quit = createButton(loc.getString("mainMenuSelectQuit",currentLocale), () -> { App.quitPopup(); });
final VBox controlBox = new VBox(10, credits, options, quit);
controlBox.setAlignment(Pos.BOTTOM_LEFT);
@@ -33,5 +44,25 @@ public final class MainMenu extends Menu {
controlBox.setTranslateX(25);
pane = new StackPane(background, gamesBox, controlBox);
}
try {
new EventFlow()
.listen(this::handleChangeLanguage);
}catch (Exception e){
System.out.println("Something went wrong while trying to change the language.");
throw e;
}
}
private void handleChangeLanguage(LocalizationEvents.LanguageHasChanged event) {
Platform.runLater(() -> {
currentLocale = AppContext.getLocale();
tictactoe.setText(loc.getString("mainMenuSelectTicTacToe",currentLocale));
reversi.setText(loc.getString("mainMenuSelectReversi",currentLocale));
credits.setText(loc.getString("mainMenuSelectCredits",currentLocale));
options.setText(loc.getString("mainMenuSelectOptions",currentLocale));
quit.setText(loc.getString("mainMenuSelectQuit",currentLocale));
});
}
}

View File

@@ -1,14 +1,69 @@
package org.toop.app.menu;
import javafx.application.Platform;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import org.toop.framework.asset.ResourceManager;
import org.toop.framework.asset.resources.LocalizationAsset;
import org.toop.framework.eventbus.EventFlow;
import org.toop.local.AppContext;
import org.toop.local.LocalizationEvents;
import java.util.Locale;
public final class OptionsMenu extends Menu {
private Locale currentLocale = AppContext.getLocale();
private LocalizationAsset loc = ResourceManager.get("localization.properties");
private final LocalizationAsset loc = ResourceManager.get("localization.properties");
private Text chooseLang;
private Button english,dutch,german,french,italian,spanish,chinese;
public OptionsMenu() {
}
final Region background = createBackground("quit_background");
chooseLang = createText(loc.getString("languageChangeText",currentLocale));
english = createButton(loc.getString("languageEnglish",currentLocale), () -> AppContext.setCurrentLocale(Locale.ENGLISH));
dutch = createButton(loc.getString("languageDutch",currentLocale), () -> AppContext.setCurrentLocale(Locale.of("nl")));
german = createButton(loc.getString("languageGerman",currentLocale), () -> AppContext.setCurrentLocale(Locale.of("de")));
french = createButton(loc.getString("languageFrench",currentLocale), () -> AppContext.setCurrentLocale(Locale.of("fr")));
italian = createButton(loc.getString("languageItalian",currentLocale), () -> AppContext.setCurrentLocale(Locale.of("it")));
spanish = createButton(loc.getString("languageSpanish",currentLocale), () -> AppContext.setCurrentLocale(Locale.of("es")));
chinese = createButton(loc.getString("languageChinese",currentLocale), () -> AppContext.setCurrentLocale(Locale.of("zh")));
final VBox buttons = new VBox(10, chooseLang, english,dutch,german,french,italian,spanish,chinese);
buttons.setAlignment(Pos.CENTER);
buttons.getStyleClass().add("quit_box");
buttons.setMaxWidth(300);
buttons.setMaxHeight(600);
pane = new StackPane(background, buttons);
try {
new EventFlow()
.listen(this::handleChangeLanguage);
}catch (Exception e){
System.out.println("Something went wrong while trying to change the language.");
throw e;
}
}
private void handleChangeLanguage(LocalizationEvents.LanguageHasChanged event) {
Platform.runLater(() -> {
currentLocale = AppContext.getLocale();
chooseLang.setText(loc.getString("languageChangeText",currentLocale));
english.setText(loc.getString("languageEnglish",currentLocale));
dutch.setText(loc.getString("languageDutch",currentLocale));
german.setText(loc.getString("languageGerman",currentLocale));
french.setText(loc.getString("languageFrench",currentLocale));
italian.setText(loc.getString("languageItalian",currentLocale));
spanish.setText(loc.getString("languageSpanish",currentLocale));
chinese.setText(loc.getString("languageChinese",currentLocale));
});
}
}

View File

@@ -1,5 +1,6 @@
package org.toop.app.menu.game;
import javafx.application.Platform;
import javafx.geometry.Pos;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
@@ -12,6 +13,13 @@ import javafx.scene.text.Text;
import org.toop.app.App;
import org.toop.app.menu.MainMenu;
import org.toop.app.menu.Menu;
import org.toop.framework.asset.ResourceManager;
import org.toop.framework.asset.resources.LocalizationAsset;
import org.toop.framework.eventbus.EventFlow;
import org.toop.local.AppContext;
import org.toop.local.LocalizationEvents;
import java.util.Locale;
public abstract class GameMenu extends Menu {
protected final class Cell {
@@ -46,7 +54,11 @@ public abstract class GameMenu extends Menu {
protected final Cell[] cells;
private Locale currentLocale = AppContext.getLocale();
private final LocalizationAsset loc = ResourceManager.get("localization.properties");
private final Button hint,back;
protected GameMenu(int rows, int columns, int gapSize) {
final int size = Math.min(App.getWidth(), App.getHeight()) / 5 * 4;
final Canvas canvas = new Canvas(size, size);
@@ -87,13 +99,30 @@ public abstract class GameMenu extends Menu {
playersContainer.setPickOnBounds(false);
playersContainer.setTranslateY(50);
final Button hint = createButton("Hint", () -> {});
final Button back = createButton("Back", () -> { App.activate(new MainMenu()); });
hint = createButton(loc.getString("gameMenuHint",currentLocale), () -> {});
back = createButton(loc.getString("gameMenuBack",currentLocale), () -> { App.activate(new MainMenu()); });
final VBox controlContainer = new VBox(hint, back);
StackPane.setAlignment(controlContainer, Pos.BOTTOM_LEFT);
controlContainer.setPickOnBounds(false);
pane = new StackPane(background, canvas, playersContainer, controlContainer);
}
try {
new EventFlow()
.listen(this::handleChangeLanguage);
}catch (Exception e){
System.out.println("Something went wrong while trying to change the language.");
throw e;
}
}
private void handleChangeLanguage(LocalizationEvents.LanguageHasChanged event) {
Platform.runLater(() -> {
currentLocale = AppContext.getLocale();
hint.setText(loc.getString("gameMenuHint",currentLocale));
back.setText(loc.getString("gameMenuBack",currentLocale));
});
}
}

View File

@@ -1,5 +1,7 @@
package org.toop.local;
import org.toop.framework.eventbus.EventFlow;
import java.util.Locale;
public class AppContext {
@@ -7,6 +9,7 @@ public class AppContext {
public static void setCurrentLocale(Locale locale) {
currentLocale = locale;
new EventFlow().addPostEvent(new LocalizationEvents.LanguageHasChanged(locale.getLanguage())).asyncPostEvent();
}
public static Locale getLocale() {
return currentLocale;

View File

@@ -0,0 +1,9 @@
package org.toop.local;
import org.toop.framework.eventbus.events.EventWithoutSnowflake;
import org.toop.framework.eventbus.events.EventsBase;
public class LocalizationEvents extends EventsBase {
public record LanguageHasChanged(String language) implements EventWithoutSnowflake {}
}

View File

@@ -14,4 +14,23 @@ mainMenuSelectQuit=Quit
# Quit Menu text and buttons
quitMenuTextSure=Are you sure?
quitMenuButtonYes=Yes
quitMenuButtonNo=No
quitMenuButtonNo=No
# Language menu
languageChangeText=Choose a language.
languageEnglish=English
languageDutch=Dutch
languageGerman=German
languageFrench=French
languageItalian=Italian
languageSpanish=Spanish
languageChinese=Chinese
# Game select menu
gameSelectMenuLocal=Local
gameSelectMenuOnline=Online
gameSelectMenuEnterIP=Enter your IP address here:
# Game Menu
gameMenuHint=Hint
gameMenuBack=Back

View File

@@ -14,4 +14,23 @@ mainMenuSelectQuit=Beenden
# Quit Menu text and buttons
quitMenuTextSure=Bist du sicher?
quitMenuButtonYes=Ja
quitMenuButtonNo=Nein
quitMenuButtonNo=Nein
# Language menu
languageChangeText=Sprache w\u00E4hlen.
languageEnglish=Englisch
languageDutch=Niederl\u00E4ndisch
languageGerman=Deutsch
languageFrench=Franz\u00F6sisch
languageItalian=Italienisch
languageSpanish=Spanisch
languageChinese=Chinesisch
# Game select menu
gameSelectMenuLocal=Lokal
gameSelectMenuOnline=Online
gameSelectMenuEnterIP=Gib hier deine IP-Adresse ein:
# Game Menu
gameMenuHint=Tipp
gameMenuBack=Zur\u00FCck

View File

@@ -14,4 +14,23 @@ mainMenuSelectQuit=Salir
# Quit Menu text and buttons
quitMenuTextSure=\u00BFEst\u00E1s seguro?
quitMenuButtonYes=S\u00ED
quitMenuButtonNo=No
quitMenuButtonNo=No
# Language menu
languageChangeText=Elige un idioma.
languageEnglish=Ingl\u00E9s
languageDutch=Neerland\u00E9s
languageGerman=Alem\u00E1n
languageFrench=Franc\u00E9s
languageItalian=Italiano
languageSpanish=Espa\u00F1ol
languageChinese=Chino
# Game select menu
gameSelectMenuLocal=Local
gameSelectMenuOnline=En l\u00EDnea
gameSelectMenuEnterIP=Introduce aqu\u00ED tu direcci\u00F3n IP:
# Game Menu
gameMenuHint=Pista
gameMenuBack=Atr\u00E1s

View File

@@ -14,4 +14,23 @@ mainMenuSelectQuit=Quitter
# Quit Menu text and buttons
quitMenuTextSure=\u00CAtes-vous s\u00FBr?
quitMenuButtonYes=Oui
quitMenuButtonNo=Non
quitMenuButtonNo=Non
# Language menu
languageChangeText=Choisissez une langue.
languageEnglish=Anglais
languageDutch=N\u00E9erlandais
languageGerman=Allemand
languageFrench=Fran\u00E7ais
languageItalian=Italien
languageSpanish=Espagnol
languageChinese=Chinois
# Game select menu
gameSelectMenuLocal=Local
gameSelectMenuOnline=En ligne
gameSelectMenuEnterIP=Entrez votre adresse IP ici :
# Game Menu
gameMenuHint=Indice
gameMenuBack=Retour

View File

@@ -14,4 +14,24 @@ mainMenuSelectQuit=Esci
# Quit Menu text and buttons
quitMenuTextSure=Sei sicuro?
quitMenuButtonYes=S\u00EC
quitMenuButtonNo=No
quitMenuButtonNo=No
# Language menu
languageChangeText=Scegli una lingua.
languageEnglish=Inglese
languageDutch=Olandese
languageGerman=Tedesco
languageFrench=Francese
languageItalian=Italiano
languageSpanish=Spagnolo
languageChinese=Cinese
# Game select menu
gameSelectMenuLocal=Locale
gameSelectMenuOnline=Online
gameSelectMenuEnterIP=Inserisci qui il tuo indirizzo IP:
# Game Menu
gameMenuHint=Suggerimento
gameMenuBack=Indietro

View File

@@ -14,4 +14,23 @@ mainMenuSelectQuit=Afsluiten
# Quit Menu text and buttons
quitMenuTextSure=Weet je het zeker?
quitMenuButtonYes=Ja
quitMenuButtonNo=Nee
quitMenuButtonNo=Nee
# Language menu
languageChangeText=Kies een taal.
languageEnglish=Engels
languageDutch=Nederlands
languageGerman=Duits
languageFrench=Frans
languageItalian=Italiaans
languageSpanish=Spaans
languageChinese=Chinees
# Game select menu
gameSelectMenuLocal=Lokaal
gameSelectMenuOnline=Online
gameSelectMenuEnterIP=Voer hier je IP-adres in:
# Game Menu
gameMenuHint=Hint
gameMenuBack=Terug

View File

@@ -27,4 +27,22 @@ quitMenuTextSure=\u4F60\u786E\u5B9A\u5417\uFF1F
quitMenuButtonYes=\u662F
# ?
quitMenuButtonNo=\u5426
# ?
# ?
# Language menu
languageChangeText=\u9009\u62E9\u4E00\u79CD\u8BED\u8A00\u3002
languageEnglish=\u82F1\u8BED
languageDutch=\u8377\u5170\u8BED
languageGerman=\u5FB7\u8BED
languageFrench=\u6CD5\u8BED
languageItalian=\u610F\u5927\u5229\u8BED
languageSpanish=\u897F\u73ED\u7259\u8BED
languageChinese=\u4E2D\u6587
# Game select menu
gameSelectMenuLocal=\u672C\u5730
gameSelectMenuOnline=\u5728\u7EBF
gameSelectMenuEnterIP=\u5728\u6B64\u8F93\u5165\u4F60\u7684IP\u5730\u5740\uFF1A
# Game Menu
gameMenuHint=\u63D0\u793A
gameMenuBack=\u8FD4\u56DE