From 65fa47e6dceee460b2f2caf64c0d5415e3f65a61 Mon Sep 17 00:00:00 2001 From: WiredSpast Date: Wed, 10 Aug 2022 14:45:57 +0200 Subject: [PATCH] Made translation dynamic (Doesn't require G-Earth to restart) --- .../GExtensionStoreController.java | 7 ++ .../uilogger/UiLoggerController.java | 97 ++++++++++++++++--- .../main/java/gearth/ui/GEarthController.java | 14 +-- .../connection/ConnectionController.java | 59 ++++------- .../extensions/ExtensionItemContainer.java | 18 ++-- .../extensions/ExtensionsController.java | 26 ++++- .../extensions/logger/ExtensionLogger.java | 3 +- .../ui/subforms/extra/ExtraController.java | 22 +++++ .../ui/subforms/info/InfoController.java | 22 ++++- .../injection/InjectionController.java | 55 +++++++---- .../scheduler/SchedulerController.java | 55 +++++++++-- .../ui/subforms/tools/ToolsController.java | 21 ++++ .../ui/translations/LanguageBundle.java | 2 + .../ui/translations/TranslatableString.java | 70 ++++++++++++- .../uilogger/UiLogger.fxml | 78 +++++++-------- .../ui/subforms/connection/Connection.fxml | 5 +- .../ui/subforms/extensions/Extensions.fxml | 18 ++-- .../gearth/ui/subforms/extra/Extra.fxml | 22 ++--- .../gearth/ui/subforms/info/Info.fxml | 12 +-- .../ui/subforms/injection/Injection.fxml | 12 +-- .../ui/subforms/scheduler/Scheduler.fxml | 28 +++--- .../gearth/ui/subforms/tools/Tools.fxml | 16 +-- .../gearth/ui/themes/G-Earth/styling.css | 4 +- .../gearth/ui/themes/G-Earth_Dark/styling.css | 4 +- .../gearth/ui/themes/Tanji/styling.css | 4 +- .../ui/translations/messages.properties | 42 ++++---- .../ui/translations/messages_de.properties | 42 ++++---- .../ui/translations/messages_es.properties | 47 ++++----- .../ui/translations/messages_fi.properties | 42 ++++---- .../ui/translations/messages_fr.properties | 94 +++++++++--------- .../ui/translations/messages_it.properties | 42 ++++---- .../ui/translations/messages_nl.properties | 46 ++++----- .../ui/translations/messages_pt.properties | 42 ++++---- .../ui/translations/messages_tr.properties | 42 ++++---- 34 files changed, 681 insertions(+), 432 deletions(-) diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/GExtensionStoreController.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/GExtensionStoreController.java index 297864a..604f2d7 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/GExtensionStoreController.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/GExtensionStoreController.java @@ -24,6 +24,7 @@ import java.util.*; import java.util.function.Supplier; public class GExtensionStoreController implements Initializable { + private static GExtensionStoreController instance; private GExtensionStore extensionStore = null; @@ -38,6 +39,8 @@ public class GExtensionStoreController implements Initializable { @Override public void initialize(URL location, ResourceBundle resources) { + instance = this; + webView = new WebView(); borderPane.setCenter(webView); @@ -238,4 +241,8 @@ public class GExtensionStoreController implements Initializable { public String getContentItemsContainer() { return contentItemsContainer; } + + public static void reloadPage() { + instance.webView.getEngine().reload(); + } } diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java index ff41456..cbda232 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java @@ -1,14 +1,15 @@ package gearth.services.internal_extensions.uilogger; import at.favre.lib.bytes.Bytes; - import gearth.GEarth; import gearth.misc.Cacher; import gearth.services.internal_extensions.uilogger.hexdumper.Hexdump; import gearth.services.packet_info.PacketInfo; import gearth.protocol.HMessage; import gearth.protocol.HPacket; import gearth.ui.subforms.logger.loggerdisplays.PacketLogger; -import javafx.application.Platform; + import gearth.ui.translations.LanguageBundle; + import gearth.ui.translations.TranslatableString; + import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.fxml.Initializable; import javafx.scene.control.*; @@ -40,7 +41,7 @@ public class UiLoggerController implements Initializable { public CheckMenuItem chkViewIncoming; public CheckMenuItem chkViewOutgoing; public CheckMenuItem chkDisplayStructure; - public Label lblAutoScrolll; + public Label lblAutoScroll; public CheckMenuItem chkAutoscroll; public CheckMenuItem chkSkipBigPackets; public CheckMenuItem chkMessageName; @@ -72,6 +73,7 @@ public class UiLoggerController implements Initializable { public RadioMenuItem chkReprHex; public RadioMenuItem chkReprRawHex; public RadioMenuItem chkReprNone; + public MenuItem menuItem_clear, menuItem_exportAll; private Map> filterTimestamps = new HashMap<>(); @@ -87,6 +89,11 @@ public class UiLoggerController implements Initializable { private List allMenuItems = new ArrayList<>(); private UiLogger uiLogger; + public Menu menu_window, menu_window_onConnect, menu_window_onDisconnect, menu_view, menu_packets, + menu_packets_details, menu_packets_details_byteRep, menu_packets_details_message, menu_packets_antiSpam; + + private TranslatableString viewIncoming, viewOutgoing, autoScroll, packetInfo, filtered; + private boolean isSelected(MenuItem item) { if (item instanceof CheckMenuItem) { return ((CheckMenuItem)item).isSelected(); @@ -158,6 +165,8 @@ public class UiLoggerController implements Initializable { appendLater.clear(); } } + + initLanguageBinding(); } private static String cleanTextContent(String text) { @@ -220,7 +229,7 @@ public class UiLoggerController implements Initializable { if (chkTimestamp.isSelected()) { - elements.add(new Element(String.format("(%s: %d)\n", GEarth.translation.getString("ext.logger.element.timestamp"), System.currentTimeMillis()), "timestamp")); + elements.add(new Element(String.format("(%s: %d)\n", LanguageBundle.get("ext.logger.element.timestamp"), System.currentTimeMillis()), "timestamp")); } boolean packetInfoAvailable = uiLogger.getPacketInfoManager().getPacketInfoList().size() > 0; @@ -257,8 +266,8 @@ public class UiLoggerController implements Initializable { elements.add(new Element("\n", "")); } - if (isBlocked) elements.add(new Element(String.format("[%s]\n", GEarth.translation.getString("ext.logger.element.blocked")), "blocked")); - else if (isReplaced) elements.add(new Element(String.format("[%s]\n", GEarth.translation.getString("ext.logger.element.replaced")), "replaced")); + if (isBlocked) elements.add(new Element(String.format("[%s]\n", LanguageBundle.get("ext.logger.element.blocked")), "blocked")); + else if (isReplaced) elements.add(new Element(String.format("[%s]\n", LanguageBundle.get("ext.logger.element.replaced")), "replaced")); if (!chkReprNone.isSelected()) { boolean isSkipped = chkSkipBigPackets.isSelected() && (packet.length() > 4000 || (packet.length() > 1000 && chkReprHex.isSelected())); @@ -266,7 +275,7 @@ public class UiLoggerController implements Initializable { Hexdump.hexdump(packet.toBytes()) : (chkReprRawHex.isSelected() ? Bytes.wrap(packet.toBytes()).encodeHex() : packet.toString()); - String type = isIncoming ? GEarth.translation.getString("ext.logger.element.direction.incoming") : GEarth.translation.getString("ext.logger.element.direction.outgoing"); + String type = isIncoming ? LanguageBundle.get("ext.logger.element.direction.incoming") : LanguageBundle.get("ext.logger.element.direction.outgoing"); if (!chkReprHex.isSelected()) { elements.add(new Element(String.format("%s[", type), type.toLowerCase())); @@ -277,7 +286,7 @@ public class UiLoggerController implements Initializable { } if (isSkipped) { - elements.add(new Element(String.format("<%s>", GEarth.translation.getString("ext.logger.element.skipped")), "skipped")); + elements.add(new Element(String.format("<%s>", LanguageBundle.get("ext.logger.element.skipped")), "skipped")); } else elements.add(new Element(packetRepresentation, String.format(chkReprHex.isSelected() ? "%sHex": "%s", type.toLowerCase()))); elements.add(new Element("\n", "")); @@ -344,13 +353,13 @@ public class UiLoggerController implements Initializable { public void updateLoggerInfo() { Platform.runLater(() -> { - lblViewIncoming.setText(String.format("%s: %s", GEarth.translation.getString("ext.logger.menu.view.incoming"), (chkViewIncoming.isSelected() ? "True" : "False"))); - lblViewOutgoing.setText(String.format("%s: %s", GEarth.translation.getString("ext.logger.menu.view.outgoing"), (chkViewOutgoing.isSelected() ? "True" : "False"))); - lblAutoScrolll.setText(String.format("%s: %s", GEarth.translation.getString("ext.logger.menu.view.autoscroll"), (chkAutoscroll.isSelected() ? "True" : "False"))); - lblFiltered.setText(String.format("%s: %d", GEarth.translation.getString("ext.logger.state.filtered"), filteredAmount)); + viewIncoming.setKey(1, "ext.logger.state." + (chkViewIncoming.isSelected() ? "true" : "false")); + viewIncoming.setKey(1, "ext.logger.state." + (chkViewOutgoing.isSelected() ? "true" : "false")); + autoScroll.setKey(1, "ext.logger.state." + (chkAutoscroll.isSelected() ? "true" : "false")); + filtered.setFormat("%s: " + filteredAmount); boolean packetInfoAvailable = uiLogger.getPacketInfoManager().getPacketInfoList().size() > 0; - lblPacketInfo.setText(String.format("%s: %s", GEarth.translation.getString("ext.logger.state.packetinfo"), (packetInfoAvailable ? "True" : "False"))); + packetInfo.setKey(1, "ext.logger.state." + (packetInfoAvailable ? "true" : "false")); }); } @@ -390,9 +399,9 @@ public class UiLoggerController implements Initializable { //Set extension filter FileChooser.ExtensionFilter extFilter = - new FileChooser.ExtensionFilter(String.format("%s (*.txt)", GEarth.translation.getString("ext.logger.menu.packets.exportall.filetype")), "*.txt"); + new FileChooser.ExtensionFilter(String.format("%s (*.txt)", LanguageBundle.get("ext.logger.menu.packets.exportall.filetype")), "*.txt"); fileChooser.getExtensionFilters().add(extFilter); - fileChooser.setTitle(GEarth.translation.getString("ext.logger.menu.packets.exportall.windowtitle")); + fileChooser.setTitle(LanguageBundle.get("ext.logger.menu.packets.exportall.windowtitle")); //Show save file dialog File file = fileChooser.showSaveDialog(stage); @@ -417,4 +426,62 @@ public class UiLoggerController implements Initializable { public void init(UiLogger uiLogger) { this.uiLogger = uiLogger; } + + private void initLanguageBinding() { + menu_window.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.window")); + chkAlwaysOnTop.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.window.alwaysontop")); + + menu_window_onConnect.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.window.onconnect")); + chkOpenOnConnect.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.window.onconnect.openwindow")); + chkResetOnConnect.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.window.onconnect.reset")); + + menu_window_onDisconnect.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.window.ondisconnect")); + chkHideOnDisconnect.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.window.ondisconnect.hidewindow")); + chkResetOnDisconnect.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.window.ondisconnect.reset")); + + menu_view.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.view")); + chkViewIncoming.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.view.incoming")); + chkViewOutgoing.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.view.outgoing")); + chkAutoscroll.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.view.autoscroll")); + menuItem_clear.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.view.cleartext")); + + menu_packets.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets")); + menu_packets_details.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.displaydetails")); + chkDisplayStructure.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.displaydetails.structure")); + chkTimestamp.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.displaydetails.timestamp")); + + menu_packets_details_byteRep.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.displaydetails.byterep")); + chkReprLegacy.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.displaydetails.byterep.legacy")); + chkReprHex.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.displaydetails.byterep.hexdump")); + chkReprRawHex.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.displaydetails.byterep.rawhex")); + chkReprNone.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.displaydetails.byterep.none")); + + menu_packets_details_message.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.displaydetails.message")); + chkMessageHash.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.displaydetails.message.hash")); + chkMessageName.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.displaydetails.message.name")); + chkMessageId.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.displaydetails.message.id")); + + menu_packets_antiSpam.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.antispam")); + chkAntiSpam_none.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.antispam.none")); + chkAntiSpam_low.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.antispam.low")); + chkAntiSpam_medium.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.antispam.med")); + chkAntiSpam_high.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.antispam.high")); + chkAntiSpam_ultra.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.antispam.ultra")); + + chkSkipBigPackets.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.skipbig")); + + menuItem_exportAll.textProperty().bind(new TranslatableString("%s", "ext.logger.menu.packets.exportall")); + + viewIncoming = new TranslatableString("%s: %s", "ext.logger.menu.view.incoming", "ext.logger.state.true"); + viewOutgoing = new TranslatableString("%s: %s", "ext.logger.menu.view.outgoing", "ext.logger.state.true"); + autoScroll = new TranslatableString("%s: %s", "ext.logger.menu.view.autoscroll", "ext.logger.state.true"); + packetInfo = new TranslatableString("%s: %s", "ext.logger.state.packetinfo", "ext.logger.state.false"); + filtered = new TranslatableString("%s: 0", "ext.logger.state.filtered"); + + lblViewIncoming.textProperty().bind(viewIncoming); + lblViewOutgoing.textProperty().bind(viewOutgoing); + lblAutoScroll.textProperty().bind(autoScroll); + lblPacketInfo.textProperty().bind(packetInfo); + lblFiltered.textProperty().bind(filtered); + } } diff --git a/G-Earth/src/main/java/gearth/ui/GEarthController.java b/G-Earth/src/main/java/gearth/ui/GEarthController.java index be6333b..55d22d0 100644 --- a/G-Earth/src/main/java/gearth/ui/GEarthController.java +++ b/G-Earth/src/main/java/gearth/ui/GEarthController.java @@ -121,12 +121,12 @@ public class GEarthController { } private void initLanguageBinding() { - tab_Connection.textProperty().bind(new TranslatableString("tab.connection")); - tab_Injection.textProperty().bind(new TranslatableString("tab.injection")); - tab_Tools.textProperty().bind(new TranslatableString("tab.tools")); - tab_Scheduler.textProperty().bind(new TranslatableString("tab.scheduler")); - tab_Extensions.textProperty().bind(new TranslatableString("tab.extensions")); - tab_Extra.textProperty().bind(new TranslatableString("tab.extra")); - tab_Info.textProperty().bind(new TranslatableString("tab.info")); + tab_Connection.textProperty().bind(new TranslatableString("%s", "tab.connection")); + tab_Injection.textProperty().bind(new TranslatableString("%s", "tab.injection")); + tab_Tools.textProperty().bind(new TranslatableString("%s", "tab.tools")); + tab_Scheduler.textProperty().bind(new TranslatableString("%s", "tab.scheduler")); + tab_Extensions.textProperty().bind(new TranslatableString("%s", "tab.extensions")); + tab_Extra.textProperty().bind(new TranslatableString("%s", "tab.extra")); + tab_Info.textProperty().bind(new TranslatableString("%s", "tab.info")); } } diff --git a/G-Earth/src/main/java/gearth/ui/subforms/connection/ConnectionController.java b/G-Earth/src/main/java/gearth/ui/subforms/connection/ConnectionController.java index 2f70ec0..1a38967 100644 --- a/G-Earth/src/main/java/gearth/ui/subforms/connection/ConnectionController.java +++ b/G-Earth/src/main/java/gearth/ui/subforms/connection/ConnectionController.java @@ -49,6 +49,8 @@ public class ConnectionController extends SubForm { private volatile int initcount = 0; + private TranslatableString connect, state; + public void initialize() { Constants.UNITY_PACKETS = rd_unity.isSelected(); @@ -179,20 +181,20 @@ public class ConnectionController extends SubForm { getHConnection().getStateObservable().addListener((oldState, newState) -> Platform.runLater(() -> { updateInputUI(); if (newState == HState.NOT_CONNECTED) { - lblState.textProperty().bind(ConnectionState.NOTCONNECTED.value); - btnConnect.textProperty().bind(ConnectButton.CONNECT.value); + state.setKey(0, "tab.connection.state.notconnected"); + connect.setKey(0, "tab.connection.button.connect"); outHost.setText(""); outPort.setText(""); } else if (oldState == HState.NOT_CONNECTED) { - btnConnect.textProperty().bind(ConnectButton.ABORT.value); + connect.setKey(0, "tab.connection.button.abort"); } if (newState == HState.CONNECTED) { - lblState.textProperty().bind(ConnectionState.CONNECTED.value); + state.setKey(0, "tab.connection.state.connected"); } if (newState == HState.WAITING_FOR_CLIENT) { - lblState.textProperty().bind(ConnectionState.WAITING.value); + state.setKey(0, "tab.connection.state.waiting"); } if (newState == HState.CONNECTED && useFlash()) { @@ -318,44 +320,23 @@ public class ConnectionController extends SubForm { return false; } - private enum ConnectButton { - CONNECT ("tab.connection.button.connect"), - ABORT ("tab.connection.button.abort"); - - public final TranslatableString value; - - ConnectButton(String key) { - this.value = new TranslatableString(key); - } - } - - private enum ConnectionState { - CONNECTED ("tab.connection.state.connected"), - NOTCONNECTED ("tab.connection.state.notconnected"), - WAITING ("tab.connection.state.waiting"); - - public final TranslatableString value; - - ConnectionState(String key) { - this.value = new TranslatableString(key); - } - } - private void initLanguageBinding() { - TranslatableString port = new TranslatableString("tab.connection.port"); - TranslatableString host = new TranslatableString("tab.connection.host"); + TranslatableString port = new TranslatableString("%s", "tab.connection.port"); + TranslatableString host = new TranslatableString("%s", "tab.connection.host"); lblInpPort.textProperty().bind(port); lblInpHost.textProperty().bind(host); lblPort.textProperty().bind(port); lblHost.textProperty().bind(host); - cbx_autodetect.textProperty().bind(new TranslatableString("tab.connection.autodetect")); - btnConnect.textProperty().bind(ConnectButton.CONNECT.value); - lblHotelVersion.textProperty().bind(new TranslatableString("tab.connection.version")); - lblClient.textProperty().bind(new TranslatableString("tab.connection.client")); - rd_unity.textProperty().bind(new TranslatableString("tab.connection.client.unity")); - rd_flash.textProperty().bind(new TranslatableString("tab.connection.client.flash")); - rd_nitro.textProperty().bind(new TranslatableString("tab.connection.client.nitro")); - lblStateHead.textProperty().bind(new TranslatableString("tab.connection.state")); - lblState.textProperty().bind(ConnectionState.NOTCONNECTED.value); + cbx_autodetect.textProperty().bind(new TranslatableString("%s", "tab.connection.autodetect")); + connect = new TranslatableString("%s", "tab.connection.button.connect"); + btnConnect.textProperty().bind(connect); + lblHotelVersion.textProperty().bind(new TranslatableString("%s", "tab.connection.version")); + lblClient.textProperty().bind(new TranslatableString("%s", "tab.connection.client")); + rd_unity.textProperty().bind(new TranslatableString("%s", "tab.connection.client.unity")); + rd_flash.textProperty().bind(new TranslatableString("%s", "tab.connection.client.flash")); + rd_nitro.textProperty().bind(new TranslatableString("%s", "tab.connection.client.nitro")); + lblStateHead.textProperty().bind(new TranslatableString("%s", "tab.connection.state")); + state = new TranslatableString("%s", "tab.connection.state.notconnected"); + lblState.textProperty().bind(state); } } diff --git a/G-Earth/src/main/java/gearth/ui/subforms/extensions/ExtensionItemContainer.java b/G-Earth/src/main/java/gearth/ui/subforms/extensions/ExtensionItemContainer.java index a1adad2..60c8605 100644 --- a/G-Earth/src/main/java/gearth/ui/subforms/extensions/ExtensionItemContainer.java +++ b/G-Earth/src/main/java/gearth/ui/subforms/extensions/ExtensionItemContainer.java @@ -4,6 +4,8 @@ import gearth.GEarth; import gearth.services.extension_handler.extensions.ExtensionType; import gearth.services.extension_handler.extensions.GEarthExtension; import gearth.ui.titlebar.TitleBarController; +import gearth.ui.translations.LanguageBundle; +import gearth.ui.translations.TranslatableString; import javafx.application.Platform; import javafx.event.EventHandler; import javafx.geometry.Insets; @@ -81,7 +83,8 @@ public class ExtensionItemContainer extends GridPane { add(versionLabel, 3, 0); exitButton = new ExitButton(); - Tooltip delete = new Tooltip(GEarth.translation.getString("tab.extensions.table.edit.delete.tooltip")); + Tooltip delete = new Tooltip(); + delete.textProperty().bind(new TranslatableString("%s", "tab.extensions.table.edit.delete.tooltip")); Tooltip.install(exitButton,delete); exitButton.show(); clickButton = new SimpleClickButton(); @@ -90,7 +93,8 @@ public class ExtensionItemContainer extends GridPane { buttonsBox = new HBox(clickButton, exitButton); reloadButton = new ReloadButton(); - Tooltip reload = new Tooltip(GEarth.translation.getString("tab.extensions.table.edit.restart.tooltip")); + Tooltip reload = new Tooltip(); + reload.textProperty().bind(new TranslatableString("%s", "tab.extensions.table.edit.restart.tooltip")); Tooltip.install(reloadButton, reload); reloadButton.show(); reloadButton.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> { @@ -100,8 +104,6 @@ public class ExtensionItemContainer extends GridPane { }); DeleteButton deleteButton = new DeleteButton(); - Tooltip uninstall = new Tooltip(GEarth.translation.getString("tab.extensions.table.edit.uninstall.tooltip")); - Tooltip.install(deleteButton, uninstall); deleteButton.show(); GridPane this2 = this; @@ -111,8 +113,8 @@ public class ExtensionItemContainer extends GridPane { if (ConfirmationDialog.showDialog(uninstallKey)) { Alert alert = ConfirmationDialog.createAlertWithOptOut(Alert.AlertType.CONFIRMATION, uninstallKey - , GEarth.translation.getString("alert.confirmation.windowtitle"), null, - GEarth.translation.getString("tab.extensions.table.edit.uninstall.confirmation"), GEarth.translation.getString("alert.confirmation.button.donotaskagain"), + , LanguageBundle.get("alert.confirmation.windowtitle"), null, + LanguageBundle.get("tab.extensions.table.edit.uninstall.confirmation"), LanguageBundle.get("alert.confirmation.button.donotaskagain"), ButtonType.YES, ButtonType.NO ); @@ -218,4 +220,8 @@ public class ExtensionItemContainer extends GridPane { } return null; } + + private void initLanguageBinding() { + + } } diff --git a/G-Earth/src/main/java/gearth/ui/subforms/extensions/ExtensionsController.java b/G-Earth/src/main/java/gearth/ui/subforms/extensions/ExtensionsController.java index bab3c85..1254be5 100644 --- a/G-Earth/src/main/java/gearth/ui/subforms/extensions/ExtensionsController.java +++ b/G-Earth/src/main/java/gearth/ui/subforms/extensions/ExtensionsController.java @@ -11,6 +11,8 @@ import gearth.services.extension_handler.extensions.implementations.network.exec import gearth.services.g_python.GPythonShell; import gearth.ui.SubForm; import gearth.ui.subforms.extensions.logger.ExtensionLogger; +import gearth.ui.translations.LanguageBundle; +import gearth.ui.translations.TranslatableString; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.scene.control.*; @@ -40,12 +42,14 @@ public class ExtensionsController extends SubForm { private NetworkExtensionsProducer networkExtensionsProducer; // needed for port private ExtensionLogger extensionLogger = null; - + public Label lbl_tableTitle, lbl_tableDesc, lbl_tableAuthor, lbl_tableVersion, lbl_tableEdit, lbl_port; public void initialize() { scroller.widthProperty().addListener(observable -> header_ext.setPrefWidth(scroller.getWidth())); extensionLogger = new ExtensionLogger(); + + initLanguageBinding(); } protected void onParentSet() { @@ -81,9 +85,9 @@ public class ExtensionsController extends SubForm { public void installBtnClicked(ActionEvent actionEvent) { FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle(GEarth.translation.getString("tab.extensions.button.install.windowtitle")); + fileChooser.setTitle(LanguageBundle.get("tab.extensions.button.install.windowtitle")); fileChooser.getExtensionFilters().addAll( - new FileChooser.ExtensionFilter(GEarth.translation.getString("tab.extensions.button.install.filetype"), ExecutionInfo.ALLOWEDEXTENSIONTYPES)); + new FileChooser.ExtensionFilter(LanguageBundle.get("tab.extensions.button.install.filetype"), ExecutionInfo.ALLOWEDEXTENSIONTYPES)); File selectedFile = fileChooser.showOpenDialog(parentController.getStage()); if (selectedFile != null) { extensionRunner.installAndRunExtension(selectedFile.getPath(), networkExtensionsProducer.getPort()); @@ -117,7 +121,7 @@ public class ExtensionsController extends SubForm { pythonShellLaunching = true; Platform.runLater(() -> btn_gpython.setDisable(true)); GPythonShell shell = new GPythonShell( - String.format("%s %d", GEarth.translation.getString("tab.extensions.button.pythonshell.windowtitle"),gpytonShellCounter++), + String.format("%s %d", LanguageBundle.get("tab.extensions.button.pythonshell.windowtitle"),gpytonShellCounter++), networkExtensionsProducer.getPort(), Authenticator.generatePermanentCookie() ); @@ -130,4 +134,18 @@ public class ExtensionsController extends SubForm { public ExtensionHandler getExtensionHandler() { return extensionHandler; } + + private void initLanguageBinding() { + lbl_tableTitle.textProperty().bind(new TranslatableString("%s", "tab.extensions.table.title")); + lbl_tableDesc.textProperty().bind(new TranslatableString("%s", "tab.extensions.table.description")); + lbl_tableAuthor.textProperty().bind(new TranslatableString("%s", "tab.extensions.table.author")); + lbl_tableVersion.textProperty().bind(new TranslatableString("%s", "tab.extensions.table.version")); + lbl_tableEdit.textProperty().bind(new TranslatableString("%s", "tab.extensions.table.edit")); + + lbl_port.textProperty().bind(new TranslatableString("%s:", "tab.extensions.port")); + + btn_gpython.textProperty().bind(new TranslatableString("%s", "tab.extensions.button.pythonshell")); + btn_viewExtensionConsole.textProperty().bind(new TranslatableString("%s", "tab.extensions.button.logs")); + btn_install.textProperty().bind(new TranslatableString("%s", "tab.extensions.button.install")); + } } diff --git a/G-Earth/src/main/java/gearth/ui/subforms/extensions/logger/ExtensionLogger.java b/G-Earth/src/main/java/gearth/ui/subforms/extensions/logger/ExtensionLogger.java index 9f27bf1..c821011 100644 --- a/G-Earth/src/main/java/gearth/ui/subforms/extensions/logger/ExtensionLogger.java +++ b/G-Earth/src/main/java/gearth/ui/subforms/extensions/logger/ExtensionLogger.java @@ -4,6 +4,7 @@ import gearth.GEarth; import gearth.ui.titlebar.DefaultTitleBarConfig; import gearth.ui.titlebar.GEarthThemedTitleBarConfig; import gearth.ui.titlebar.TitleBarController; +import gearth.ui.translations.TranslatableString; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; @@ -38,7 +39,7 @@ public class ExtensionLogger { stage = new Stage(); - stage.setTitle(String.format("G-Earth | %s", GEarth.translation.getString("tab.extensions.button.logs.windowtitle"))); + stage.titleProperty().bind(new TranslatableString("G-Earth | %s", "tab.extensions.button.logs.windowtitle")); stage.initModality(Modality.NONE); stage.setAlwaysOnTop(true); stage.setMinHeight(235); diff --git a/G-Earth/src/main/java/gearth/ui/subforms/extra/ExtraController.java b/G-Earth/src/main/java/gearth/ui/subforms/extra/ExtraController.java index 44b4557..7aa64bd 100644 --- a/G-Earth/src/main/java/gearth/ui/subforms/extra/ExtraController.java +++ b/G-Earth/src/main/java/gearth/ui/subforms/extra/ExtraController.java @@ -11,6 +11,7 @@ import gearth.services.g_python.GPythonVersionUtils; import gearth.ui.SubForm; import gearth.ui.subforms.info.InfoController; import gearth.ui.titlebar.TitleBarController; +import gearth.ui.translations.TranslatableString; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.scene.control.*; @@ -59,6 +60,7 @@ public class ExtraController extends SubForm implements SocksConfiguration { public TextField txt_socksPort; public TextField txt_socksIp; public CheckBox cbx_admin; + public Label lbl_notepad, lbl_proxyIp, lbl_proxyPort; private AdminService adminService; @@ -92,6 +94,8 @@ public class ExtraController extends SubForm implements SocksConfiguration { cbx_useSocks.selectedProperty().addListener(observable -> grd_socksInfo.setDisable(!cbx_useSocks.isSelected())); ProxyProviderFactory.setSocksConfig(this); + + initLanguageBinding(); } @Override @@ -220,4 +224,22 @@ public class ExtraController extends SubForm implements SocksConfiguration { adminService.setEnabled(cbx_admin.isSelected()); } + + private void initLanguageBinding() { + url_troubleshooting.textProperty().bind(new TranslatableString("%s", "tab.extra.troubleshooting")); + + lbl_notepad.textProperty().bind(new TranslatableString("%s:", "tab.extra.notepad")); + lbl_proxyIp.textProperty().bind(new TranslatableString("%s:", "tab.extra.options.advanced.proxy.ip")); + lbl_proxyPort.textProperty().bind(new TranslatableString("%s:", "tab.extra.options.advanced.proxy.port")); + + cbx_alwaysOnTop.textProperty().bind(new TranslatableString("%s", "tab.extra.options.alwaysontop")); + + cbx_admin.textProperty().bind(new TranslatableString("%s", "tab.extra.options.staffpermissions")); + cbx_gpython.textProperty().bind(new TranslatableString("%s", "tab.extra.options.pythonscripting")); + cbx_advanced.textProperty().bind(new TranslatableString("%s", "tab.extra.options.advanced")); + + cbx_useSocks.textProperty().bind(new TranslatableString("%s", "tab.extra.options.advanced.socks")); + cbx_disableDecryption.textProperty().bind(new TranslatableString("%s", "tab.extra.options.advanced.disabledecryption")); + cbx_debug.textProperty().bind(new TranslatableString("%s", "tab.extra.options.advanced.debugstdout")); + } } diff --git a/G-Earth/src/main/java/gearth/ui/subforms/info/InfoController.java b/G-Earth/src/main/java/gearth/ui/subforms/info/InfoController.java index bf1b284..8187826 100644 --- a/G-Earth/src/main/java/gearth/ui/subforms/info/InfoController.java +++ b/G-Earth/src/main/java/gearth/ui/subforms/info/InfoController.java @@ -2,6 +2,8 @@ package gearth.ui.subforms.info; import gearth.GEarth; import gearth.ui.titlebar.TitleBarController; +import gearth.ui.translations.LanguageBundle; +import gearth.ui.translations.TranslatableString; import javafx.event.ActionEvent; import javafx.scene.control.*; import gearth.ui.SubForm; @@ -24,7 +26,8 @@ public class InfoController extends SubForm { public Hyperlink link_g_store; public Hyperlink link_t_gearth; - public Label version; + public Label version, lbl_description, lbl_createdBy, lbl_contrib, lbl_links; + public Button btn_donate; public static void activateHyperlink(Hyperlink link) { link.setOnAction((ActionEvent event) -> { @@ -49,16 +52,18 @@ public class InfoController extends SubForm { activateHyperlink(link_g_tanji); activateHyperlink(link_g_store); activateHyperlink(link_t_gearth); + + initLanguageBinding(); } public void donate(ActionEvent actionEvent) { String pubkey = "1GEarthEV9Ua3RcixsKTcuc1PPZd9hqri3"; - Alert alert = new Alert(Alert.AlertType.INFORMATION, GEarth.translation.getString("tab.info.donate.alert.title"), ButtonType.OK); - alert.setHeaderText(GEarth.translation.getString("tab.info.donate.alert.title")); + Alert alert = new Alert(Alert.AlertType.INFORMATION, LanguageBundle.get("tab.info.donate.alert.title"), ButtonType.OK); + alert.setHeaderText(LanguageBundle.get("tab.info.donate.alert.title")); VBox test = new VBox(); - test.getChildren().add(new Label(GEarth.translation.getString("tab.info.donate.alert.content"))); + test.getChildren().add(new Label(LanguageBundle.get("tab.info.donate.alert.content"))); TextArea pubText = new TextArea(pubkey); pubText.setPrefHeight(28); pubText.setMaxWidth(250); @@ -73,4 +78,13 @@ public class InfoController extends SubForm { e.printStackTrace(); } } + + private void initLanguageBinding() { + lbl_description.textProperty().bind(new TranslatableString("%s", "tab.info.description")); + lbl_createdBy.textProperty().bind(new TranslatableString("%s:", "tab.info.createdby")); + lbl_contrib.textProperty().bind(new TranslatableString("%s:", "tab.info.contributors")); + lbl_links.textProperty().bind(new TranslatableString("%s:", "tab.info.links")); + + btn_donate.textProperty().bind(new TranslatableString("%s", "tab.info.donate")); + } } diff --git a/G-Earth/src/main/java/gearth/ui/subforms/injection/InjectionController.java b/G-Earth/src/main/java/gearth/ui/subforms/injection/InjectionController.java index 3206116..78c051b 100644 --- a/G-Earth/src/main/java/gearth/ui/subforms/injection/InjectionController.java +++ b/G-Earth/src/main/java/gearth/ui/subforms/injection/InjectionController.java @@ -34,6 +34,9 @@ public class InjectionController extends SubForm { public Button btn_sendToClient; public ListView history; public Label lblHistory; + public Hyperlink lnk_clearHistory; + + private TranslatableString corruption, pcktInfo; protected void onParentSet() { getHConnection().getStateObservable().addListener((oldState, newState) -> Platform.runLater(this::updateUI)); @@ -54,15 +57,14 @@ public class InjectionController extends SubForm { } }); - lblHistory.setTooltip(new Tooltip()); - lblHistory.getTooltip().textProperty().bind(new TranslatableString("tab.injection.history.tooltip")); - List rawHistory = Cacher.getList(HISTORY_CACHE_KEY); if (rawHistory != null) { List history = rawHistory.stream() .map(o -> (String)o).limit(historylimit - 1).map(InjectedPackets::new).collect(Collectors.toList()); updateHistoryView(history); } + + initLanguageBinding(); } private static boolean isPacketIncomplete(String line) { @@ -106,7 +108,7 @@ public class InjectionController extends SubForm { private void updateUI() { boolean dirty = false; - lbl_corruption.setText(GEarth.translation.getString("tab.injection.corrupted.false")); + corruption.setKey(1, "tab.injection.corrupted.false"); lbl_corruption.getStyleClass().clear(); lbl_corruption.getStyleClass().add("not-corrupted-label"); @@ -122,17 +124,18 @@ public class InjectionController extends SubForm { for (int i = 0; i < packets.length; i++) { if (packets[i].isCorrupted()) { if (!dirty) { - lbl_corruption.setText(String.format("%s -> %d", GEarth.translation.getString("tab.injection.corrupted.true"), i)); + corruption.setFormat("%s: %s -> " + i); + corruption.setKey(1, "tab.injection.corrupted.true"); lbl_corruption.getStyleClass().clear(); lbl_corruption.getStyleClass().add("corrupted-label"); dirty = true; } else - lbl_corruption.setText(lbl_corruption.getText() + ", " + i); + corruption.setFormat(corruption.getFormat() + ", " + i); } } if (dirty && packets.length == 1) { - lbl_corruption.setText(GEarth.translation.getString("tab.injection.corrupted.true")); // no index needed + corruption.setFormatAndKeys("%s: %s", "tab.injection.corrupted", "tab.injection.corrupted.true"); } if (!dirty) { @@ -150,26 +153,23 @@ public class InjectionController extends SubForm { btn_sendToClient.setDisable(!canSendToClient || getHConnection().getState() != HState.CONNECTED); btn_sendToServer.setDisable(!canSendToServer || getHConnection().getState() != HState.CONNECTED); if (packets.length == 1) { - lbl_pcktInfo.setText(String.format("%s (%s: %d, %s: %d)", - GEarth.translation.getString("tab.injection.description.header"), - GEarth.translation.getString("tab.injection.description.id"), - packets[0].headerId(), - GEarth.translation.getString("tab.injection.description.length"), - packets[0].length())); + pcktInfo.setFormatAndKeys("%s (%s: " + packets[0].headerId() + ", %s: " + packets[0].length() + ")", + "tab.injection.description.header", + "tab.injection.description.id", + "tab.injection.description.length"); } else { lbl_pcktInfo.setText(""); } } else { if (packets.length == 1) { - lbl_pcktInfo.setText(String.format("%s (%s:NULL, %s: %d)", - GEarth.translation.getString("tab.injection.description.header"), - GEarth.translation.getString("tab.injection.description.id"), - GEarth.translation.getString("tab.injection.description.length"), - packets[0].getBytesLength())); + pcktInfo.setFormatAndKeys("%s (%s:NULL, %s: " + packets[0].getBytesLength() + ")", + "tab.injection.description.header", + "tab.injection.description.id", + "tab.injection.description.length"); } else { - lbl_pcktInfo.setText(""); + pcktInfo.setFormatAndKeys(""); } btn_sendToClient.setDisable(true); @@ -235,6 +235,23 @@ public class InjectionController extends SubForm { updateHistoryView(new ArrayList<>()); } + private void initLanguageBinding() { + lblHistory.textProperty().bind(new TranslatableString("%s", "tab.injection.history")); + lblHistory.setTooltip(new Tooltip()); + lblHistory.getTooltip().textProperty().bind(new TranslatableString("%s", "tab.injection.history.tooltip")); + + corruption = new TranslatableString("%s: %s", "tab.injection.corrupted", "tab.injection.corrupted.true"); + lbl_corruption.textProperty().bind(corruption); + + pcktInfo = new TranslatableString("%s (%s:NULL, %s:0)", "tab.injection.description.header", "tab.injection.description.id", "tab.injection.description.length"); + lbl_pcktInfo.textProperty().bind(pcktInfo); + + btn_sendToServer.textProperty().bind(new TranslatableString("%s", "tab.injection.send.toserver")); + btn_sendToClient.textProperty().bind(new TranslatableString("%s", "tab.injection.send.toclient")); + + lnk_clearHistory.textProperty().bind(new TranslatableString("%s", "tab.injection.history.clear")); + } + public static void main(String[] args) { HPacket[] packets = parsePackets("{l}{h:3}{i:967585}{i:9589}{s:\"furni_inscriptionfuckfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\"}{s:\"sirjonasxx-II\"}{s:\"\"}{i:188}{i:0}{i:0}{b:false}"); System.out.println(new HPacket("{l}{h:2550}{s:\"ClientPerf\"\"ormance\\\"}\"}{s:\"23\"}{s:\"fps\"}{s:\"Avatars: 1, Objects: 0\"}{i:76970180}").toExpression()); diff --git a/G-Earth/src/main/java/gearth/ui/subforms/scheduler/SchedulerController.java b/G-Earth/src/main/java/gearth/ui/subforms/scheduler/SchedulerController.java index 4c02495..5f0552b 100644 --- a/G-Earth/src/main/java/gearth/ui/subforms/scheduler/SchedulerController.java +++ b/G-Earth/src/main/java/gearth/ui/subforms/scheduler/SchedulerController.java @@ -4,8 +4,11 @@ import com.tulskiy.keymaster.common.Provider; import gearth.GEarth; import gearth.services.scheduler.Interval; import gearth.services.scheduler.Scheduler; +import gearth.ui.translations.LanguageBundle; +import gearth.ui.translations.TranslatableString; import javafx.application.Platform; import javafx.event.ActionEvent; +import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.layout.GridPane; import javafx.scene.layout.VBox; @@ -49,6 +52,9 @@ public class SchedulerController extends SubForm { private Scheduler scheduler = null; + private TranslatableString addoredit; + public Label lbl_tableIndex, lbl_tablePacket, lbl_tableInterval, lbl_tableDest, lbl_tableEdit, lbl_setupPacket, lbl_setupInterval; + public void initialize() { scrollpane.widthProperty().addListener(observable -> header.setPrefWidth(scrollpane.getWidth())); @@ -57,10 +63,6 @@ public class SchedulerController extends SubForm { txt_packet.textProperty().addListener(event -> Platform.runLater(this::updateUI)); txt_delay.textProperty().addListener(event -> Platform.runLater(this::updateUI)); - btn_clear.setTooltip(new Tooltip(GEarth.translation.getString("tab.scheduler.button.clear.tooltip"))); - btn_save.setTooltip(new Tooltip(GEarth.translation.getString("tab.scheduler.button.save.tooltip"))); - btn_load.setTooltip(new Tooltip(GEarth.translation.getString("tab.scheduler.button.load.tooltip"))); - updateUI(); //register hotkeys @@ -77,6 +79,8 @@ public class SchedulerController extends SubForm { provider.register(KeyStroke.getKeyStroke("control shift " + ii[0]), hotKey -> switchPauseHotkey(ii[0])); } System.setErr(err); + + initLanguageBinding(); } @Override @@ -158,7 +162,7 @@ public class SchedulerController extends SubForm { rb_outgoing.setSelected(newItem.getDestinationProperty().get() == HMessage.Direction.TOSERVER); isBeingEdited = newItem; - btn_addoredit.setText(GEarth.translation.getString("tab.scheduler.button.edit")); + addoredit.setKey(0, "tab.scheduler.button.edit"); updateUI(); newItem.onIsBeingUpdatedTrigger(); } @@ -176,7 +180,7 @@ public class SchedulerController extends SubForm { rb_incoming.setSelected(true); rb_outgoing.setSelected(false); - btn_addoredit.setText(GEarth.translation.getString("tab.scheduler.button.add")); + addoredit.setKey(0, "tab.scheduler.button.add"); updateUI(); } @@ -204,9 +208,9 @@ public class SchedulerController extends SubForm { //Set extension filter FileChooser.ExtensionFilter extFilter = - new FileChooser.ExtensionFilter(GEarth.translation.getString("tab.scheduler.filetype"), "*.sched"); + new FileChooser.ExtensionFilter(LanguageBundle.get("tab.scheduler.filetype"), "*.sched"); fileChooser.getExtensionFilters().add(extFilter); - fileChooser.setTitle(GEarth.translation.getString("tab.scheduler.button.save.windowtitle")); + fileChooser.setTitle(LanguageBundle.get("tab.scheduler.button.save.windowtitle")); //Show save file dialog File file = fileChooser.showSaveDialog(parentController.getStage()); @@ -235,9 +239,9 @@ public class SchedulerController extends SubForm { List list = new ArrayList<>(); FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle(GEarth.translation.getString("tab.scheduler.button.load.windowtitle")); + fileChooser.setTitle(LanguageBundle.get("tab.scheduler.button.load.windowtitle")); fileChooser.getExtensionFilters().addAll( - new FileChooser.ExtensionFilter(GEarth.translation.getString("tab.scheduler.filetype"), "*.sched")); + new FileChooser.ExtensionFilter(LanguageBundle.get("tab.scheduler.filetype"), "*.sched")); File selectedFile = fileChooser.showOpenDialog(parentController.getStage()); if (selectedFile != null) { @@ -263,4 +267,35 @@ public class SchedulerController extends SubForm { load(list); } + + private void initLanguageBinding() { + addoredit = new TranslatableString("%s", "tab.scheduler.button.add"); + btn_addoredit.textProperty().bind(addoredit); + + btn_clear.textProperty().bind(new TranslatableString("%s", "tab.scheduler.button.clear")); + btn_clear.setTooltip(new Tooltip()); + btn_clear.getTooltip().textProperty().bind(new TranslatableString("%s", "tab.scheduler.button.clear.tooltip")); + + btn_save.textProperty().bind(new TranslatableString("%s", "tab.scheduler.button.save")); + btn_save.setTooltip(new Tooltip()); + btn_save.getTooltip().textProperty().bind(new TranslatableString("%s", "tab.scheduler.button.save.tooltip")); + + btn_load.textProperty().bind(new TranslatableString("%s", "tab.scheduler.button.load")); + btn_load.setTooltip(new Tooltip()); + btn_load.getTooltip().textProperty().bind(new TranslatableString("%s", "tab.scheduler.button.load.tooltip")); + + lbl_tableIndex.textProperty().bind(new TranslatableString("%s", "tab.scheduler.table.index")); + lbl_tablePacket.textProperty().bind(new TranslatableString("%s", "tab.scheduler.table.packet")); + lbl_tableInterval.textProperty().bind(new TranslatableString("%s", "tab.scheduler.table.interval")); + lbl_tableDest.textProperty().bind(new TranslatableString("%s", "tab.scheduler.table.destination")); + lbl_tableEdit.textProperty().bind(new TranslatableString("%s", "tab.scheduler.table.edit")); + + lbl_setupPacket.textProperty().bind(new TranslatableString("%s:", "tab.scheduler.setup.packet")); + lbl_setupInterval.textProperty().bind(new TranslatableString("%s:", "tab.scheduler.setup.interval")); + + rb_incoming.textProperty().bind(new TranslatableString("%s", "tab.scheduler.direction.in")); + rb_outgoing.textProperty().bind(new TranslatableString("%s", "tab.scheduler.direction.out")); + + cbx_hotkeys.textProperty().bind(new TranslatableString("%s", "tab.scheduler.hotkeys")); + } } diff --git a/G-Earth/src/main/java/gearth/ui/subforms/tools/ToolsController.java b/G-Earth/src/main/java/gearth/ui/subforms/tools/ToolsController.java index bd27506..874283a 100644 --- a/G-Earth/src/main/java/gearth/ui/subforms/tools/ToolsController.java +++ b/G-Earth/src/main/java/gearth/ui/subforms/tools/ToolsController.java @@ -1,8 +1,10 @@ package gearth.ui.subforms.tools; import gearth.services.packet_info.PacketInfoManager; +import gearth.ui.translations.TranslatableString; import javafx.event.ActionEvent; import javafx.scene.control.Button; +import javafx.scene.control.Label; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; @@ -27,6 +29,8 @@ public class ToolsController extends SubForm { public Button btn_toPacket; public TextArea txt_exprArea; + public Label lbl_integer, lbl_uShort, lbl_encodingDecoding, lbl_packetToExpression; + //TODO: toExpression() without bytelength limit for this use only public void initialize() { @@ -115,6 +119,7 @@ public class ToolsController extends SubForm { } }); + initLanguageBinding(); } public void btnEncodeInt_clicked(ActionEvent actionEvent) { @@ -156,4 +161,20 @@ public class ToolsController extends SubForm { public void btn_toPacket_clicked(ActionEvent actionEvent) { txt_packetArea.setText(parseToPacket(txt_exprArea.getText()).toString()); } + + private void initLanguageBinding() { + lbl_integer.textProperty().bind(new TranslatableString("%s:", "tab.tools.type.integer")); + lbl_uShort.textProperty().bind(new TranslatableString("%s:", "tab.tools.type.ushort")); + + TranslatableString encode = new TranslatableString("%s", "tab.tools.button.encode"); + TranslatableString decode = new TranslatableString("%s", "tab.tools.button.decode"); + btnEncodeInt.textProperty().bind(encode); + btnEncodeUShort.textProperty().bind(encode); + btnDecodeInt.textProperty().bind(decode); + btnDecodeUshort.textProperty().bind(decode); + + lbl_encodingDecoding.textProperty().bind(new TranslatableString("%s/%s", "tab.tools.encoding", "tab.tools.decoding")); + + lbl_packetToExpression.textProperty().bind(new TranslatableString("%s <-> %s", "tab.tools.packet", "tab.tools.expression")); + } } diff --git a/G-Earth/src/main/java/gearth/ui/translations/LanguageBundle.java b/G-Earth/src/main/java/gearth/ui/translations/LanguageBundle.java index ca36311..61be4e2 100644 --- a/G-Earth/src/main/java/gearth/ui/translations/LanguageBundle.java +++ b/G-Earth/src/main/java/gearth/ui/translations/LanguageBundle.java @@ -2,6 +2,7 @@ package gearth.ui.translations; import gearth.GEarth; import gearth.misc.Cacher; +import gearth.services.internal_extensions.extensionstore.application.GExtensionStoreController; import gearth.ui.themes.Theme; import java.util.Enumeration; @@ -41,6 +42,7 @@ public class LanguageBundle extends ResourceBundle { public static void setLanguage(Language lang) { current = lang; requireUpdate.forEach(TranslatableString::trigger); + GExtensionStoreController.reloadPage(); Cacher.put(LANGUAGE_CACHE_KEY, current.toString()); } diff --git a/G-Earth/src/main/java/gearth/ui/translations/TranslatableString.java b/G-Earth/src/main/java/gearth/ui/translations/TranslatableString.java index 4bdf181..df0d0f1 100644 --- a/G-Earth/src/main/java/gearth/ui/translations/TranslatableString.java +++ b/G-Earth/src/main/java/gearth/ui/translations/TranslatableString.java @@ -1,22 +1,82 @@ package gearth.ui.translations; +import gearth.misc.StringifyAble; import javafx.beans.value.ObservableValueBase; +import org.json.JSONArray; +import org.json.JSONObject; -public class TranslatableString extends ObservableValueBase { - private final String key; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; - public TranslatableString(String key) { - this.key = key; +public class TranslatableString extends ObservableValueBase implements StringifyAble { + private String format; + private String[] keys; + + public TranslatableString(String format, String... keys) { + this.format = format; + this.keys = keys; this.fireValueChangedEvent(); LanguageBundle.addTranslatableString(this); } + private TranslatableString(String fromString) { + constructFromString(fromString); + } + + public String getFormat() { + return format; + } + @Override public String getValue() { - return LanguageBundle.get(key); + return String.format(format, Arrays.stream(keys).map(LanguageBundle::get).toArray()); + } + + public void setKey(int index, String key) { + keys[index] = key; + fireValueChangedEvent(); + } + + public void setKeys(String... keys) { + this.keys = keys; + fireValueChangedEvent(); + } + + public void setFormat(String format) { + this.format = format; + fireValueChangedEvent(); + } + + public void setFormatAndKeys(String format, String... keys) { + this.format = format; + this.keys = keys; + fireValueChangedEvent(); } protected void trigger() { fireValueChangedEvent(); } + + @Override + public String stringify() { + return new JSONObject() + .put("format", format) + .put("keys", keys) + .toString(); + } + + @Override + public void constructFromString(String str) { + JSONObject jsonObject = new JSONObject(str); + this.format = jsonObject.getString("format"); + this.keys = jsonObject.getJSONArray("keys") + .toList().stream() + .map(k -> (String) k) + .toArray(String[]::new); + } + + public static TranslatableString fromString(String str) { + return new TranslatableString(str); + } } diff --git a/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml index 072518d..c607a31 100644 --- a/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml +++ b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml @@ -8,83 +8,83 @@ - + - - + + - - + + - + - - + + - - + + - + - + - + - + - + - + - + - - - + + + - + - - - + + + - - + + - + - + - - - - + + + + - - + + @@ -94,7 +94,7 @@ -