added localization options

//todo add all the strings
This commit is contained in:
Ticho Hidding
2025-09-25 14:38:06 +02:00
parent 7431d1b03f
commit 2c4719f6d4
8 changed files with 62 additions and 97 deletions

96
.idea/compiler.xml generated
View File

@@ -6,96 +6,6 @@
<sourceOutputDir name="target/generated-sources/annotations" /> <sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" /> <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" /> <outputRelativeToContentRoot value="true" />
<module name="pis" />
</profile>
<profile name="Annotation profile for pism" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<processorPath useClasspath="false">
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_core/2.42.0/error_prone_core-2.42.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotation/2.42.0/error_prone_annotation-2.42.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/guava/guava/33.4.0-jre/guava-33.4.0-jre.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/guava/failureaccess/1.0.2/failureaccess-1.0.2.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" />
<entry name="$MAVEN_REPOSITORY$/org/checkerframework/checker-qual/3.43.0/checker-qual-3.43.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.42.0/error_prone_annotations-2.42.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/j2objc/j2objc-annotations/3.0.0/j2objc-annotations-3.0.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_check_api/2.42.0/error_prone_check_api-2.42.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jspecify/jspecify/1.0.0/jspecify-1.0.0.jar" />
<entry name="$MAVEN_REPOSITORY$/io/github/eisop/dataflow-errorprone/3.41.0-eisop1/dataflow-errorprone-3.41.0-eisop1.jar" />
<entry name="$MAVEN_REPOSITORY$/io/github/java-diff-utils/java-diff-utils/4.12/java-diff-utils-4.12.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/auto/value/auto-value-annotations/1.9/auto-value-annotations-1.9.jar" />
<entry name="$MAVEN_REPOSITORY$/com/github/kevinstern/software-and-algorithms/1.0/software-and-algorithms-1.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/github/ben-manes/caffeine/caffeine/3.0.5/caffeine-3.0.5.jar" />
<entry name="$MAVEN_REPOSITORY$/javax/inject/javax.inject/1/javax.inject-1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_test_helpers/2.42.0/error_prone_test_helpers-2.42.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/googlejavaformat/google-java-format/1.27.0/google-java-format-1.27.0.jar" />
<entry name="$MAVEN_REPOSITORY$/junit/junit/4.13.2/junit-4.13.2.jar" />
<entry name="$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/2.2/hamcrest-core-2.2.jar" />
<entry name="$MAVEN_REPOSITORY$/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar" />
<entry name="$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-library/2.2/hamcrest-library-2.2.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/truth/truth/1.4.0/truth-1.4.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/ow2/asm/asm/9.6/asm-9.6.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/jimfs/jimfs/1.3.0/jimfs-1.3.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/testing/compile/compile-testing/0.21.0/compile-testing-0.21.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/auto/value/auto-value/1.9/auto-value-1.9.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/auto/auto-common/1.2.2/auto-common-1.2.2.jar" />
<entry name="$MAVEN_REPOSITORY$/org/pcollections/pcollections/4.0.1/pcollections-4.0.1.jar" />
<entry name="$MAVEN_REPOSITORY$/org/gwtproject/gwt-user/2.10.0/gwt-user-2.10.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/jsinterop/jsinterop-annotations/2.0.0/jsinterop-annotations-2.0.0.jar" />
<entry name="$MAVEN_REPOSITORY$/javax/validation/validation-api/1.0.0.GA/validation-api-1.0.0.GA.jar" />
<entry name="$MAVEN_REPOSITORY$/javax/validation/validation-api/1.0.0.GA/validation-api-1.0.0.GA-sources.jar" />
<entry name="$MAVEN_REPOSITORY$/javax/servlet/javax.servlet-api/3.1.0/javax.servlet-api-3.1.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/w3c/css/sac/1.3/sac-1.3.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/testparameterinjector/test-parameter-injector/1.16/test-parameter-injector-1.16.jar" />
<entry name="$MAVEN_REPOSITORY$/org/yaml/snakeyaml/2.0/snakeyaml-2.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/truth/extensions/truth-java8-extension/1.4.0/truth-java8-extension-1.4.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/truth/extensions/truth-proto-extension/1.4.0/truth-proto-extension-1.4.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/truth/extensions/truth-liteproto-extension/1.4.0/truth-liteproto-extension-1.4.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/3.25.5/protobuf-java-3.25.5.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/inject/guice/5.1.0/guice-5.1.0.jar" />
<entry name="$MAVEN_REPOSITORY$/aopalliance/aopalliance/1.0/aopalliance-1.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/inject/extensions/guice-assistedinject/5.1.0/guice-assistedinject-5.1.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/inject/extensions/guice-servlet/5.1.0/guice-servlet-5.1.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/inject/extensions/guice-testlib/5.1.0/guice-testlib-5.1.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/inject/extensions/guice-throwingproviders/5.1.0/guice-throwingproviders-5.1.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/gwt/inject/gin/2.1.2/gin-2.1.2.jar" />
<entry name="$MAVEN_REPOSITORY$/org/mockito/mockito-core/4.9.0/mockito-core-4.9.0.jar" />
<entry name="$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy/1.12.16/byte-buddy-1.12.16.jar" />
<entry name="$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy-agent/1.12.16/byte-buddy-agent-1.12.16.jar" />
<entry name="$MAVEN_REPOSITORY$/org/objenesis/objenesis/3.3/objenesis-3.3.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jmock/jmock/2.12.0/jmock-2.12.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jmock/jmock-testjar/2.12.0/jmock-testjar-2.12.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/code/findbugs/annotations/3.0.1/annotations-3.0.1.jar" />
<entry name="$MAVEN_REPOSITORY$/net/jcip/jcip-annotations/1.0/jcip-annotations-1.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/apache-extras/beanshell/bsh/2.0b6/bsh-2.0b6.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jmock/jmock-junit4/2.12.0/jmock-junit4-2.12.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jmock/jmock-legacy/2.12.0/jmock-legacy-2.12.0.jar" />
<entry name="$MAVEN_REPOSITORY$/cglib/cglib/3.2.8/cglib-3.2.8.jar" />
<entry name="$MAVEN_REPOSITORY$/org/jmock/jmock-imposters/2.12.0/jmock-imposters-2.12.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger/2.50/dagger-2.50.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/dagger/dagger-producers/2.50/dagger-producers-2.50.jar" />
<entry name="$MAVEN_REPOSITORY$/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/auto/factory/auto-factory/1.1.0/auto-factory-1.1.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/auto/service/auto-service-annotations/1.0.1/auto-service-annotations-1.0.1.jar" />
<entry name="$MAVEN_REPOSITORY$/com/squareup/javapoet/1.13.0/javapoet-1.13.0.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/guava/guava-testlib/33.4.0-jre/guava-testlib-33.4.0-jre.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java-util/3.25.5/protobuf-java-util-3.25.5.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar" />
<entry name="$MAVEN_REPOSITORY$/com/ibm/icu/icu4j/74.2/icu4j-74.2.jar" />
<entry name="$MAVEN_REPOSITORY$/io/netty/netty-all/5.0.0.Alpha2/netty-all-5.0.0.Alpha2.jar" />
<entry name="$MAVEN_REPOSITORY$/joda-time/joda-time/2.12.5/joda-time-2.12.5.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/common/html/types/proto/1.0.8/proto-1.0.8.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/common/html/types/types/1.0.8/types-1.0.8.jar" />
<entry name="$MAVEN_REPOSITORY$/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar" />
<entry name="$MAVEN_REPOSITORY$/org/assertj/assertj-core/3.25.1/assertj-core-3.25.1.jar" />
<entry name="$MAVEN_REPOSITORY$/org/easymock/easymock/5.2.0/easymock-5.2.0.jar" />
<entry name="$MAVEN_REPOSITORY$/pl/pragmatists/JUnitParams/1.1.1/JUnitParams-1.1.1.jar" />
<entry name="$MAVEN_REPOSITORY$/org/threeten/threeten-extra/1.7.2/threeten-extra-1.7.2.jar" />
<entry name="$MAVEN_REPOSITORY$/com/google/flogger/flogger/0.7.4/flogger-0.7.4.jar" />
</processorPath>
<module name="pism_framework" /> <module name="pism_framework" />
<module name="pism_game" /> <module name="pism_game" />
<module name="pism_app" /> <module name="pism_app" />
@@ -104,9 +14,9 @@
</component> </component>
<component name="JavacSettings"> <component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE"> <option name="ADDITIONAL_OPTIONS_OVERRIDE">
<module name="pism_app" options="-XDcompilePolicy=simple --should-stop=ifError=FLOW -Xplugin:ErrorProne" /> <module name="pism_app" options="" />
<module name="pism_framework" options="-XDcompilePolicy=simple --should-stop=ifError=FLOW -Xplugin:ErrorProne" /> <module name="pism_framework" options="" />
<module name="pism_game" options="-XDcompilePolicy=simple --should-stop=ifError=FLOW -Xplugin:ErrorProne" /> <module name="pism_game" options="" />
</option> </option>
</component> </component>
</project> </project>

View File

@@ -1,5 +1,6 @@
package org.toop; package org.toop;
import org.toop.app.gui.LocalServerSelector;
import org.toop.framework.networking.NetworkingClientManager; import org.toop.framework.networking.NetworkingClientManager;
import org.toop.framework.networking.NetworkingInitializationException; import org.toop.framework.networking.NetworkingInitializationException;
@@ -7,6 +8,7 @@ import org.toop.framework.networking.NetworkingInitializationException;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
initSystems(); initSystems();
javax.swing.SwingUtilities.invokeLater(LocalServerSelector::new);
} }
private static void initSystems() throws NetworkingInitializationException { private static void initSystems() throws NetworkingInitializationException {

View File

@@ -1,15 +1,23 @@
package org.toop.app.gui; package org.toop.app.gui;
import org.toop.events.WindowEvents;
import org.toop.framework.eventbus.EventFlow;
import org.toop.local.AppContext;
import javax.swing.*; import javax.swing.*;
import java.util.Locale;
import java.util.ResourceBundle;
public class LocalServerSelector { public class LocalServerSelector {
private JPanel panel1; private JPanel panel1;
private JButton serverButton; private JButton serverButton;
private JButton localButton; private JButton localButton;
private final JFrame frame; private final JFrame frame;
Locale locale = AppContext.getLocale();
ResourceBundle resourceBundle = ResourceBundle.getBundle("Localization", locale);
public LocalServerSelector() { public LocalServerSelector() {
frame = new JFrame("Server Selector"); frame = new JFrame(resourceBundle.getString("windowTitleServerSelector"));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(panel1); frame.setContentPane(panel1);
frame.setSize(1920, 1080); frame.setSize(1920, 1080);
@@ -17,9 +25,15 @@ public class LocalServerSelector {
frame.setVisible(true); frame.setVisible(true);
serverButton.addActionListener(e -> onServerClicked()); serverButton.addActionListener(e -> onServerClicked());
serverButton.setText(resourceBundle.getString("buttonSelectServer"));
localButton.addActionListener(e -> onLocalClicked()); localButton.addActionListener(e -> onLocalClicked());
localButton.setText(resourceBundle.getString("buttonSelectLocal"));
new EventFlow().listen(WindowEvents.LanguageChanged.class, this::changeLanguage);
}
private void changeLanguage(WindowEvents.LanguageChanged event) {
locale = AppContext.getLocale();
resourceBundle = ResourceBundle.getBundle("Localization", locale);
} }
private void onServerClicked() { private void onServerClicked() {
frame.dispose(); frame.dispose();
new RemoteGameSelector(); new RemoteGameSelector();

View File

@@ -22,4 +22,7 @@ public class WindowEvents extends EventsBase {
/** Triggers when the mouse is released within the window. */ /** Triggers when the mouse is released within the window. */
public record OnMouseRelease(int button) implements EventWithoutSnowflake {} public record OnMouseRelease(int button) implements EventWithoutSnowflake {}
/** Triggers when the language is changed. */
public record LanguageChanged() implements EventWithoutSnowflake {}
} }

View File

@@ -0,0 +1,14 @@
package org.toop.local;
import java.util.Locale;
public class AppContext {
private static Locale currentLocale = Locale.getDefault();
public static void setCurrentLocale(Locale locale) {
currentLocale = locale;
}
public static Locale getLocale() {
return currentLocale;
}
}

View File

@@ -2,11 +2,16 @@ package org.toop.tictactoe.gui;
import java.awt.*; import java.awt.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.swing.*; import javax.swing.*;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.toop.app.gui.LocalGameSelector; import org.toop.app.gui.LocalGameSelector;
import org.toop.app.gui.RemoteGameSelector; import org.toop.app.gui.RemoteGameSelector;
import org.toop.events.WindowEvents;
import org.toop.framework.eventbus.EventFlow;
import org.toop.local.AppContext;
import org.toop.tictactoe.LocalTicTacToe; import org.toop.tictactoe.LocalTicTacToe;
import org.toop.game.GameBase; import org.toop.game.GameBase;
@@ -26,6 +31,8 @@ public class UIGameBoard {
private LocalTicTacToe localTicTacToe; private LocalTicTacToe localTicTacToe;
private boolean gameOver = false; private boolean gameOver = false;
Locale locale = AppContext.getLocale();
ResourceBundle resourceBundle = ResourceBundle.getBundle("Localization", locale);
public UIGameBoard(LocalTicTacToe lttt, Object parent) { public UIGameBoard(LocalTicTacToe lttt, Object parent) {
if (!(parent == null)) { if (!(parent == null)) {
@@ -43,7 +50,7 @@ public class UIGameBoard {
tttPanel = new JPanel(new BorderLayout()); tttPanel = new JPanel(new BorderLayout());
// Back button // Back button
backToMainMenuButton = new JButton("Back to Main Menu"); backToMainMenuButton = new JButton(resourceBundle.getString("buttonBackToMainMenu"));
tttPanel.add(backToMainMenuButton, BorderLayout.SOUTH); tttPanel.add(backToMainMenuButton, BorderLayout.SOUTH);
backToMainMenuButton.addActionListener( backToMainMenuButton.addActionListener(
_ -> { _ -> {
@@ -65,7 +72,11 @@ public class UIGameBoard {
// cells[moveIndex].setText(String.valueOf(symbol)); // cells[moveIndex].setText(String.valueOf(symbol));
// }); // });
// }); // });
new EventFlow().listen(WindowEvents.LanguageChanged.class, this::changeLanguage);
}
private void changeLanguage(WindowEvents.LanguageChanged event) {
locale = AppContext.getLocale();
resourceBundle = ResourceBundle.getBundle("Localization", locale);
} }
private JPanel createGridPanel(int sizeX, int sizeY) { private JPanel createGridPanel(int sizeX, int sizeY) {

View File

@@ -0,0 +1,9 @@
# Window titles
windowTitleServerSelector=Server Selector
# Buttons on the server selector screen
buttonSelectServer=Connect to a server
buttonSelectLocal=Play a game on this computer
# Buttons on the UI gameboard
buttonBackToMainMenu=Go back to the main menu

View File

@@ -0,0 +1,2 @@
# Window titles
windowTitleServerSelector=Selecteer een server