diff --git a/G-Earth/src/main/java/gearth/GEarth.java b/G-Earth/src/main/java/gearth/GEarth.java
index d5e859d..476b9ad 100644
--- a/G-Earth/src/main/java/gearth/GEarth.java
+++ b/G-Earth/src/main/java/gearth/GEarth.java
@@ -3,10 +3,8 @@ package gearth;
import gearth.misc.AdminValidator;
import gearth.misc.Cacher;
import gearth.misc.UpdateChecker;
-import gearth.misc.listenerpattern.Observable;
import gearth.misc.listenerpattern.ObservableObject;
import gearth.ui.GEarthController;
-import gearth.ui.subforms.logger.loggerdisplays.PacketLogger;
import gearth.ui.themes.Theme;
import gearth.ui.themes.ThemeFactory;
import gearth.ui.titlebar.TitleBarConfig;
@@ -20,9 +18,6 @@ import javafx.scene.control.Alert;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
-import sun.misc.Cache;
-
-import java.util.function.Consumer;
public class GEarth extends Application {
diff --git a/G-Earth/src/main/java/gearth/misc/AdminValidator.java b/G-Earth/src/main/java/gearth/misc/AdminValidator.java
index 7a96735..8b1c81e 100644
--- a/G-Earth/src/main/java/gearth/misc/AdminValidator.java
+++ b/G-Earth/src/main/java/gearth/misc/AdminValidator.java
@@ -1,11 +1,11 @@
package gearth.misc;
import gearth.ui.titlebar.TitleBarController;
+import gearth.ui.translations.LanguageBundle;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Label;
-import javafx.scene.layout.Region;
import java.io.IOException;
import java.io.PrintStream;
@@ -47,7 +47,7 @@ public class AdminValidator {
if (!AdminValidator.isAdmin()) {
Platform.runLater(() -> {
Alert alert = new Alert(Alert.AlertType.WARNING, "", ButtonType.OK);
- alert.getDialogPane().setContent(new Label("G-Earth needs admin privileges in order to work on Flash,\nplease restart G-Earth with admin permissions unless\nyou're using Unity"));
+ alert.getDialogPane().setContent(new Label(LanguageBundle.get("alert.adminvalidator.content").replaceAll("\\\\n", System.lineSeparator())));
try {
TitleBarController.create(alert).showAlert();
} catch (IOException e) {
diff --git a/G-Earth/src/main/java/gearth/misc/UpdateChecker.java b/G-Earth/src/main/java/gearth/misc/UpdateChecker.java
index 93a0827..ec001b8 100644
--- a/G-Earth/src/main/java/gearth/misc/UpdateChecker.java
+++ b/G-Earth/src/main/java/gearth/misc/UpdateChecker.java
@@ -2,6 +2,7 @@ package gearth.misc;
import gearth.GEarth;
import gearth.ui.titlebar.TitleBarController;
+import gearth.ui.translations.LanguageBundle;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
@@ -37,10 +38,10 @@ public class UpdateChecker {
String body = (String)object.get("body");
boolean isForcedUpdate = body.contains("(!)");
- Alert alert = new Alert(isForcedUpdate ? Alert.AlertType.ERROR : Alert.AlertType.INFORMATION, "G-Earth is outdated!", ButtonType.OK);
+ Alert alert = new Alert(isForcedUpdate ? Alert.AlertType.ERROR : Alert.AlertType.INFORMATION, LanguageBundle.get("alert.outdated.title"), ButtonType.OK);
FlowPane fp = new FlowPane();
- Label lbl = new Label("A new version of G-Earth has been found ("+gitv+")" + System.lineSeparator()+ System.lineSeparator() + "Update to the latest version:");
+ Label lbl = new Label(LanguageBundle.get("alert.outdated.content.newversion") + " ("+gitv+")" + System.lineSeparator()+ System.lineSeparator() + LanguageBundle.get("alert.outdated.content.update") + ":");
Hyperlink link = new Hyperlink("https://github.com/sirjonasxx/G-Earth/releases");
fp.getChildren().addAll( lbl, link);
link.setOnAction(event -> {
@@ -51,7 +52,7 @@ public class UpdateChecker {
WebView webView = new WebView();
- webView.getEngine().loadContent("A new version of G-Earth has been found ("+gitv+") Update to the latest version:https://github.com/sirjonasxx/G-Earth/releases ");
+ webView.getEngine().loadContent(String.format("%s (%s) %s:https://github.com/sirjonasxx/G-Earth/releases ", LanguageBundle.get("alert.outdated.content.newversion"), gitv, LanguageBundle.get("alert.outdated.content.update")));
webView.setPrefSize(500, 200);
alert.setResizable(false);
diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/ProxyProviderFactory.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/ProxyProviderFactory.java
index 783f4d0..9070132 100644
--- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/ProxyProviderFactory.java
+++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/ProxyProviderFactory.java
@@ -1,6 +1,5 @@
package gearth.protocol.connection.proxy;
-import gearth.GEarth;
import gearth.misc.Cacher;
import gearth.misc.OSValidator;
import gearth.protocol.HConnection;
@@ -10,6 +9,7 @@ import gearth.protocol.connection.proxy.flash.NormalFlashProxyProvider;
import gearth.protocol.connection.proxy.flash.unix.LinuxRawIpFlashProxyProvider;
import gearth.protocol.connection.proxy.flash.windows.WindowsRawIpFlashProxyProvider;
import gearth.ui.titlebar.TitleBarController;
+import gearth.ui.translations.LanguageBundle;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
@@ -108,9 +108,7 @@ public class ProxyProviderFactory {
Platform.runLater(() -> {
Alert alert = new Alert(Alert.AlertType.ERROR, "", ButtonType.OK);
- alert.getDialogPane().getChildren().add(new Label("G-Earth is already connected to this hotel.\n" +
- "Due to current limitations you can only connect one session per hotel to G-Earth in Raw IP mode on Windows.\n\n" +
- "You can bypass this by using a SOCKS proxy [Extra -> Advanced -> SOCKS]"));
+ alert.getDialogPane().getChildren().add(new Label(LanguageBundle.get("alert.alreadyconnected.content").replaceAll("\\\\n", System.lineSeparator())));
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.setResizable(false);
try {
diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/flash/FlashProxyProvider.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/flash/FlashProxyProvider.java
index dbbc7af..6df5f7a 100644
--- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/flash/FlashProxyProvider.java
+++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/flash/FlashProxyProvider.java
@@ -1,6 +1,5 @@
package gearth.protocol.connection.proxy.flash;
-import gearth.GEarth;
import gearth.protocol.HConnection;
import gearth.protocol.connection.HProxy;
import gearth.protocol.connection.HProxySetter;
@@ -12,6 +11,7 @@ import gearth.protocol.packethandler.flash.IncomingFlashPacketHandler;
import gearth.protocol.packethandler.flash.OutgoingFlashPacketHandler;
import gearth.protocol.packethandler.flash.FlashPacketHandler;
import gearth.ui.titlebar.TitleBarController;
+import gearth.ui.translations.LanguageBundle;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
@@ -126,7 +126,7 @@ public abstract class FlashProxyProvider implements ProxyProvider {
protected void showInvalidConnectionError() {
Platform.runLater(() -> {
Alert alert = new Alert(Alert.AlertType.ERROR, "", ButtonType.OK);
- alert.getDialogPane().getChildren().add(new Label("You entered invalid connection information, G-Earth could not connect"));
+ alert.getDialogPane().getChildren().add(new Label(LanguageBundle.get("alert.invalidconnection.content")));
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.setResizable(false);
try {
diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxy.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxy.java
index d5ef004..c0098f3 100644
--- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxy.java
+++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxy.java
@@ -5,6 +5,7 @@ import gearth.protocol.connection.proxy.nitro.NitroConstants;
import gearth.protocol.connection.proxy.nitro.os.NitroOsFunctions;
import gearth.protocol.connection.proxy.nitro.os.NitroOsFunctionsFactory;
import gearth.ui.titlebar.TitleBarController;
+import gearth.ui.translations.LanguageBundle;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
@@ -50,14 +51,12 @@ public class NitroHttpProxy {
Platform.runLater(() -> {
Alert alert = ConfirmationDialog.createAlertWithOptOut(Alert.AlertType.WARNING, ADMIN_WARNING_KEY,
- "Root certificate installation", null,
- "", "Remember my choice",
+ LanguageBundle.get("alert.rootcertificate.title"), null,
+ "", LanguageBundle.get("alert.rootcertificate.remember"),
ButtonType.YES, ButtonType.NO
);
- alert.getDialogPane().setContent(new Label("G-Earth detected that you do not have the root certificate authority installed.\n" +
- "This is required for Nitro to work, do you want to continue?\n" +
- "G-Earth will ask you for Administrator permission if you do so."));
+ alert.getDialogPane().setContent(new Label(LanguageBundle.get("alert.rootcertificate.content").replaceAll("\\\\n", System.lineSeparator())));
try {
shouldInstall.set(TitleBarController.create(alert).showAlertAndWait()
diff --git a/G-Earth/src/main/java/gearth/protocol/memory/Rc4Obtainer.java b/G-Earth/src/main/java/gearth/protocol/memory/Rc4Obtainer.java
index 50d37ad..616354c 100644
--- a/G-Earth/src/main/java/gearth/protocol/memory/Rc4Obtainer.java
+++ b/G-Earth/src/main/java/gearth/protocol/memory/Rc4Obtainer.java
@@ -10,6 +10,7 @@ import gearth.protocol.packethandler.PayloadBuffer;
import gearth.protocol.packethandler.flash.BufferChangeListener;
import gearth.protocol.packethandler.flash.FlashPacketHandler;
import gearth.ui.titlebar.TitleBarController;
+import gearth.ui.translations.LanguageBundle;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
@@ -72,10 +73,10 @@ public class Rc4Obtainer {
System.err.println("COULD NOT FIND RC4 TABLE");
Platform.runLater(() -> {
- Alert alert = new Alert(Alert.AlertType.WARNING, "Something went wrong!", ButtonType.OK);
+ Alert alert = new Alert(Alert.AlertType.WARNING, LanguageBundle.get("alert.somethingwentwrong.title"), ButtonType.OK);
FlowPane fp = new FlowPane();
- Label lbl = new Label("G-Earth has experienced an issue" + System.lineSeparator() + System.lineSeparator() + "Head over to our Troubleshooting page to solve the problem:");
+ Label lbl = new Label(LanguageBundle.get("alert.somethingwentwrong.content").replaceAll("\\\\n", System.lineSeparator()));
Hyperlink link = new Hyperlink("https://github.com/sirjonasxx/G-Earth/wiki/Troubleshooting");
fp.getChildren().addAll(lbl, link);
link.setOnAction(event -> {
diff --git a/G-Earth/src/main/java/gearth/services/extension_handler/extensions/implementations/network/authentication/Authenticator.java b/G-Earth/src/main/java/gearth/services/extension_handler/extensions/implementations/network/authentication/Authenticator.java
index 5f6b694..7c67f49 100644
--- a/G-Earth/src/main/java/gearth/services/extension_handler/extensions/implementations/network/authentication/Authenticator.java
+++ b/G-Earth/src/main/java/gearth/services/extension_handler/extensions/implementations/network/authentication/Authenticator.java
@@ -3,6 +3,7 @@ package gearth.services.extension_handler.extensions.implementations.network.aut
import gearth.misc.ConfirmationDialog;
import gearth.services.extension_handler.extensions.implementations.network.NetworkExtension;
import gearth.ui.titlebar.TitleBarController;
+import gearth.ui.translations.LanguageBundle;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
@@ -68,13 +69,12 @@ public class Authenticator {
boolean[] done = {false};
Platform.runLater(() -> {
Alert alert = ConfirmationDialog.createAlertWithOptOut(Alert.AlertType.WARNING, connectExtensionKey
- ,"Confirmation Dialog", null,
- "", "Remember my choice",
+ , LanguageBundle.get("alert.confirmation.windowtitle"), null,
+ "", LanguageBundle.get("alert.confirmation.button.remember"),
ButtonType.YES, ButtonType.NO
);
- alert.getDialogPane().setContent(new Label("Extension \""+extension.getTitle()+"\" tries to connect but isn't known to G-Earth,\n" +
- "accept this connection?"));
+ alert.getDialogPane().setContent(new Label(String.format(LanguageBundle.get("alert.extconnection.content"), extension.getTitle()).replaceAll("\\\\n", System.lineSeparator())));
try {
if (!(TitleBarController.create(alert).showAlertAndWait()
diff --git a/G-Earth/src/main/java/gearth/services/g_python/GPythonShell.java b/G-Earth/src/main/java/gearth/services/g_python/GPythonShell.java
index da92ac6..080ddb9 100644
--- a/G-Earth/src/main/java/gearth/services/g_python/GPythonShell.java
+++ b/G-Earth/src/main/java/gearth/services/g_python/GPythonShell.java
@@ -3,6 +3,7 @@ package gearth.services.g_python;
import gearth.GEarth;
import gearth.ui.subforms.extra.ExtraController;
import gearth.ui.titlebar.TitleBarController;
+import gearth.ui.translations.LanguageBundle;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
@@ -170,13 +171,11 @@ public class GPythonShell {
private void showError() {
Platform.runLater(() -> {
- Alert alert = new Alert(Alert.AlertType.ERROR, "G-Python error", ButtonType.OK);
- alert.setTitle("G-Python error");
+ Alert alert = new Alert(Alert.AlertType.ERROR, LanguageBundle.get("alert.gpythonerror.title"), ButtonType.OK);
+ alert.setTitle(LanguageBundle.get("alert.gpythonerror.title"));
FlowPane fp = new FlowPane();
- Label lbl = new Label("Something went wrong launching the G-Python shell," +
- System.lineSeparator() + "are you sure you followed the installation guide correctly?" +
- System.lineSeparator() + System.lineSeparator() + "More information here:");
+ Label lbl = new Label(LanguageBundle.get("alert.gpythonerror.content").replaceAll("\\\\n", System.lineSeparator()));
Hyperlink link = new Hyperlink(ExtraController.INFO_URL_GPYTHON);
fp.getChildren().addAll(lbl, link);
link.setOnAction(event -> {
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 f01de68..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);
@@ -107,6 +110,7 @@ public class GExtensionStoreController implements Initializable {
});
webView.getEngine().load(GExtensionStoreController.class.getResource("webview/index.html").toString());
+
}
@@ -237,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/extensionstore/application/WebUtils.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/WebUtils.java
index 7565b34..7e45109 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/WebUtils.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/WebUtils.java
@@ -1,5 +1,7 @@
package gearth.services.internal_extensions.extensionstore.application;
+import gearth.GEarth;
+import gearth.ui.translations.LanguageBundle;
import org.w3c.dom.Element;
import java.time.LocalDateTime;
@@ -43,19 +45,19 @@ public class WebUtils {
}
public static String elapsedTime(long time) {
- if (time < 60) return time + (time == 1 ? " second" : " seconds");
+ if (time < 60) return time + " " + LanguageBundle.get("ext.store.elapsedtime.second." + (time == 1 ? "single": "multiple"));
time = time/60;
- if (time < 60) return time + (time == 1 ? " minute" : " minutes");
+ if (time < 60) return time + " " + LanguageBundle.get("ext.store.elapsedtime.minute." + (time == 1 ? "single": "multiple"));
time = time/60;
- if (time < 24) return time + (time == 1 ? " hour" : " hours");
+ if (time < 24) return time + " " + LanguageBundle.get("ext.store.elapsedtime.hour." + (time == 1 ? "single": "multiple"));
long days = time/24;
- if (days < 7) return days + (days == 1 ? " day" : " days");
+ if (days < 7) return days + " " + LanguageBundle.get("ext.store.elapsedtime.day." + (days == 1 ? "single": "multiple"));
long weeks = days/7;
- if (weeks < 6) return weeks + (weeks == 1 ? " week" : " weeks");
+ if (weeks < 6) return weeks + " " + LanguageBundle.get("ext.store.elapsedtime.week." + (weeks == 1 ? "single": "multiple"));
long months = days/31;
- if (months < 12) return months + (months == 1 ? " month" : " months");
+ if (months < 12) return months + " " + LanguageBundle.get("ext.store.elapsedtime.month." + (months == 1 ? "single": "multiple"));
long years = days/365;
- return years + (years == 1 ? " year" : " years");
+ return years + " " + LanguageBundle.get("ext.store.elapsedtime.year." + (years == 1 ? "single": "multiple"));
}
public static String escapeMessage(String text) {
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/StoreExtensionItem.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/StoreExtensionItem.java
index 45f7fd1..d859bbc 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/StoreExtensionItem.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/StoreExtensionItem.java
@@ -1,5 +1,6 @@
package gearth.services.internal_extensions.extensionstore.application.entities;
+import gearth.GEarth;
import gearth.protocol.HMessage;
import gearth.protocol.HPacket;
import gearth.services.internal_extensions.extensionstore.GExtensionStore;
@@ -9,6 +10,7 @@ import gearth.services.internal_extensions.extensionstore.application.entities.e
import gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews.CategorizedOverview;
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension;
+import gearth.ui.translations.LanguageBundle;
import netscape.javascript.JSObject;
public class StoreExtensionItem implements ContentItem {
@@ -56,12 +58,12 @@ public class StoreExtensionItem implements ContentItem {
.append("
")
.append("
").append(WebUtils.escapeMessage(storeExtension.getTitle())).append("
")
- .append("
By ").append(storeExtension.getAuthors().get(0).getName()).append(", last updated ").append(WebUtils.elapsedSince(storeExtension.getUpdateDate())).append(" ago
")
+ .append("
").append(String.format(LanguageBundle.get("ext.store.extension.madeby"), storeExtension.getAuthors().get(0).getName())).append(", ").append(String.format(LanguageBundle.get("ext.store.extension.lastupdated"), WebUtils.elapsedSince(storeExtension.getUpdateDate()))).append("
")
.append("
")
.append("")
- .append("
").append("Version: ").append(displayVersion()).append("
")
- .append("
").append("Rating: ").append(storeExtension.getRating()).append("
")
+ .append("
").append(LanguageBundle.get("ext.store.extension.version")).append(": ").append(displayVersion()).append("
")
+ .append("
").append(LanguageBundle.get("ext.store.extension.rating")).append(": ").append(storeExtension.getRating()).append("
")
// .append("
").append(storeExtension.getFramework().getFramework().getName().replace("Native", "")).append("
")
.append("
")
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/categories/CategoryItem.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/categories/CategoryItem.java
index d998c3f..abf0a8c 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/categories/CategoryItem.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/categories/CategoryItem.java
@@ -8,6 +8,7 @@ import gearth.services.internal_extensions.extensionstore.application.entities.q
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
import gearth.services.internal_extensions.extensionstore.repository.models.ExtCategory;
import gearth.services.internal_extensions.extensionstore.repository.querying.ExtensionOrdering;
+import gearth.ui.translations.LanguageBundle;
import netscape.javascript.JSObject;
import java.util.Arrays;
@@ -58,7 +59,7 @@ public class CategoryItem implements ContentItem {
.append("")
.append("")
- .append("
").append(releasesCount).append(" releases").append("
")
+ .append("
").append(releasesCount).append(" ").append(LanguageBundle.get("ext.store.extension.author.releases")).append("
")
// .append("
").append(storeExtension.getFramework().getFramework().getName().replace("Native", "")).append("
")
.append("
")
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/categories/CategoryOverview.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/categories/CategoryOverview.java
index c773b4f..4222c75 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/categories/CategoryOverview.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/categories/CategoryOverview.java
@@ -1,10 +1,12 @@
package gearth.services.internal_extensions.extensionstore.application.entities.categories;
+import gearth.GEarth;
import gearth.services.internal_extensions.extensionstore.GExtensionStore;
import gearth.services.internal_extensions.extensionstore.application.entities.ContentItem;
import gearth.services.internal_extensions.extensionstore.application.entities.HOverview;
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
import gearth.services.internal_extensions.extensionstore.repository.models.ExtCategory;
+import gearth.ui.translations.LanguageBundle;
import java.util.List;
import java.util.stream.Collectors;
@@ -57,17 +59,17 @@ public class CategoryOverview extends HOverview {
@Override
public String title() {
- return "Categories";
+ return LanguageBundle.get("ext.store.categories.title");
}
@Override
public String description() {
- return "Explore the different kinds of extensions G-Earth has to offer";
+ return LanguageBundle.get("ext.store.categories.description");
}
@Override
public String contentTitle() {
- return "Categories";
+ return LanguageBundle.get("ext.store.categories.contenttitle");
}
};
}
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsItem.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsItem.java
index e4a335e..3668be0 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsItem.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsItem.java
@@ -8,6 +8,7 @@ import gearth.services.internal_extensions.extensionstore.application.entities.H
import gearth.services.internal_extensions.extensionstore.repository.models.ExtCategory;
import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension;
import gearth.services.internal_extensions.extensionstore.tools.EncodingUtil;
+import gearth.ui.translations.LanguageBundle;
import netscape.javascript.JSObject;
import org.apache.commons.io.IOUtils;
import org.json.JSONObject;
@@ -45,32 +46,32 @@ public class StoreExtensionDetailsItem implements ContentItem {
contentBuilder
.append(String.format("*%s*", storeExtension.getTitle())).append(" - v").append(storeExtension.getVersion()).append("\n\n")
- .append("*Description*\n").append(descriptionQuoted).append("\n \n")
- .append("*Author(s):* ").append(storeExtension.getAuthors().stream().map(StoreExtension.Author::getName).collect(Collectors.joining(", "))).append("\n\n")
- .append("*Categories:* ").append(storeExtension.getCategories().stream().map(ExtCategory::getName).collect(Collectors.joining(", "))).append("\n\n");
+ .append("*").append(LanguageBundle.get("ext.store.extension.details.description")).append(":*\n").append(descriptionQuoted).append("\n \n")
+ .append("*").append(LanguageBundle.get("ext.store.extension.details.authors")).append(":* ").append(storeExtension.getAuthors().stream().map(StoreExtension.Author::getName).collect(Collectors.joining(", "))).append("\n\n")
+ .append("*").append(LanguageBundle.get("ext.store.extension.details.categories")).append(":* ").append(storeExtension.getCategories().stream().map(ExtCategory::getName).collect(Collectors.joining(", "))).append("\n\n");
- contentBuilder.append("*Technical information*").append("\n");
+ contentBuilder.append("*").append(LanguageBundle.get("ext.store.extension.details.technical_information")).append("*").append("\n");
if(storeExtension.getReleases() != null)
- contentBuilder.append("> Releases: --url:Click Here-").append(storeExtension.getReleases()).append("\n");
+ contentBuilder.append("> ").append(LanguageBundle.get("ext.store.extension.details.releases")).append(": --url:").append(LanguageBundle.get("ext.store.extension.details.click_here")).append("-").append(storeExtension.getReleases()).append("\n");
- contentBuilder.append("> Language: ").append(storeExtension.getLanguage()).append("\n")
- .append("> Source: --url:Click Here-").append(storeExtension.getSource()).append("\n")
- .append("> Framework: ").append(storeExtension.getFramework().getFramework().getName()).append(" - v").append(storeExtension.getFramework().getVersion()).append("\n")
- .append("> Systems: ").append(String.join(", ", storeExtension.getCompatibility().getSystems())).append("\n \n");
+ contentBuilder.append("> ").append(LanguageBundle.get("ext.store.extension.details.language")).append(": ").append(storeExtension.getLanguage()).append("\n")
+ .append("> ").append(LanguageBundle.get("ext.store.extension.details.source")).append(": --url:").append(LanguageBundle.get("ext.store.extension.details.click_here")).append("-").append(storeExtension.getSource()).append("\n")
+ .append("> ").append(LanguageBundle.get("ext.store.extension.details.framework")).append(": ").append(storeExtension.getFramework().getFramework().getName()).append(" - v").append(storeExtension.getFramework().getVersion()).append("\n")
+ .append("> ").append(LanguageBundle.get("ext.store.extension.details.systems")).append(": ").append(String.join(", ", storeExtension.getCompatibility().getSystems())).append("\n \n");
- contentBuilder.append("*Compatible clients:* ").append(String.join(", ", storeExtension.getCompatibility().getClients())).append("\n\n");
+ contentBuilder.append("*").append(LanguageBundle.get("ext.store.extension.details.clients")).append(":* ").append(String.join(", ", storeExtension.getCompatibility().getClients())).append("\n\n");
if (storeExtension.getFramework().getFramework().isInstallationRequired()) {
- contentBuilder.append("Warning: the framework requires --url:additional installations-")
+ contentBuilder.append(LanguageBundle.get("ext.store.extension.warning.requirement"))
.append(storeExtension.getFramework().getFramework().getInstallationInstructions()).append(" !\n\n");
}
if (!storeExtension.isStable()) {
- contentBuilder.append("Warning: this extension has been marked unstable!\n\n");
+ contentBuilder.append(LanguageBundle.get("ext.store.extension.warning.unstable")).append("\n\n");
}
contentBuilder.append("--startdiv--")
- .append("\n*Screenshot: *").append("\n")
+ .append("\n*").append(LanguageBundle.get("ext.store.extension.details.screenshot")).append(": *").append("\n")
.append("--img:").append(gExtensionStore.getRepository().getResourceUrl("store", "extensions", storeExtension.getTitle(), "screenshot.png"))
.append(" --enddiv--");
@@ -151,8 +152,8 @@ public class StoreExtensionDetailsItem implements ContentItem {
.append("")
.append("
")
.append("
").append(WebUtils.escapeMessage(mainAuthor.getName())).append("
")
- .append("
").append(mainAuthor.getReputation()).append(" reputation
")
- .append("
").append(mainAuthor.getExtensionsCount()).append(" releases
")
+ .append("
").append(mainAuthor.getReputation()).append(" ").append(LanguageBundle.get("ext.store.extension.author.reputation")).append("
")
+ .append("
").append(mainAuthor.getExtensionsCount()).append(" ").append(LanguageBundle.get("ext.store.extension.author.releases")).append("
")
.append("
") // todo look
.append("
")
.append("
").append(contentsInHtml()).append("
")
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsOverview.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsOverview.java
index 7c06d56..de8b040 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsOverview.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsOverview.java
@@ -1,5 +1,6 @@
package gearth.services.internal_extensions.extensionstore.application.entities.extensiondetails;
+import gearth.GEarth;
import gearth.services.extension_handler.extensions.implementations.network.NetworkExtensionsProducer;
import gearth.services.extension_handler.extensions.implementations.network.executer.NormalExtensionRunner;
import gearth.services.internal_extensions.extensionstore.GExtensionStore;
@@ -12,6 +13,7 @@ import gearth.services.internal_extensions.extensionstore.repository.models.Stor
import gearth.services.internal_extensions.extensionstore.tools.InstalledExtension;
import gearth.services.internal_extensions.extensionstore.tools.StoreExtensionTools;
import gearth.ui.titlebar.TitleBarController;
+import gearth.ui.translations.LanguageBundle;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
@@ -62,7 +64,7 @@ public class StoreExtensionDetailsOverview extends HOverview {
public String buttonText() {
int mode = mode();
// return mode == 2 ? "Update" : "Install";
- return mode == 0 ? "Install" : (mode == 1 ? "Installed" : "Update");
+ return LanguageBundle.get("ext.store.button." + (mode == 0 ? "install" : (mode == 1 ? "installed" : "update")));
}
@Override
@@ -91,23 +93,23 @@ public class StoreExtensionDetailsOverview extends HOverview {
private void awaitPopup(String mode) {
popup(Alert.AlertType.WARNING,
- String.format("%s extension", mode),
- String.format("%s extension [%s]", mode, extension.getTitle()),
- String.format("Press \"OK\" and wait while the extension is being %sed", mode.toLowerCase()));
+ LanguageBundle.get(String.format("ext.store.extension.status.await.%s", mode)),
+ String.format("%s [%s]", LanguageBundle.get(String.format("ext.store.extension.status.await.%s", mode)), extension.getTitle()),
+ LanguageBundle.get(String.format("ext.store.extension.status.await.%s.message", mode)));
}
private void successPopup(String mode) {
popup(Alert.AlertType.INFORMATION,
- String.format("%s completed", mode),
- String.format("%s completed [%s]", mode, extension.getTitle()),
- String.format("Extension %s completed successfully", mode.toLowerCase()));
+ LanguageBundle.get(String.format("ext.store.extension.status.success.%s", mode)),
+ String.format("%s [%s]", LanguageBundle.get(String.format("ext.store.extension.status.success.%s", mode)), extension.getTitle()),
+ LanguageBundle.get(String.format("ext.store.extension.status.success.%s.message", mode)));
}
private void errorPopup(String mode, String error) {
popup(Alert.AlertType.ERROR,
- String.format("%s failed", mode),
- String.format("%s failed [%s]", mode, extension.getTitle()),
- String.format("%s failed with the following message: %s", mode, error));
+ LanguageBundle.get(String.format("ext.store.extension.status.success.%s", mode)),
+ String.format("%s [%s]", LanguageBundle.get(String.format("ext.store.extension.status.success.%s", mode)), extension.getTitle()),
+ String.format("%s: %s", LanguageBundle.get(String.format("ext.store.extension.status.success.%s.message", mode)), error));
}
private void popup(Alert.AlertType alertType, String title, String header, String context) {
@@ -128,7 +130,7 @@ public class StoreExtensionDetailsOverview extends HOverview {
int mode = mode();
if (mode == 1) return;
- String modeString = mode() == 0 ? "Install" : "Update";
+ String modeString = mode() == 0 ? "install" : "update";
HOverview selff = this;
StoreExtensionTools.InstallExtListener listener = new StoreExtensionTools.InstallExtListener() {
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/installed/InstalledOverview.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/installed/InstalledOverview.java
index b64d1c2..4d0b10e 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/installed/InstalledOverview.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/installed/InstalledOverview.java
@@ -7,6 +7,7 @@ import gearth.services.internal_extensions.extensionstore.repository.StoreReposi
import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension;
import gearth.services.internal_extensions.extensionstore.tools.InstalledExtension;
import gearth.services.internal_extensions.extensionstore.tools.StoreExtensionTools;
+import gearth.ui.translations.LanguageBundle;
import org.apache.maven.artifact.versioning.ComparableVersion;
import java.awt.*;
@@ -30,7 +31,7 @@ public class InstalledOverview extends HOverview {
@Override
public String buttonText() {
- return "Open folder";
+ return LanguageBundle.get("ext.store.overview.folder");
}
@Override
@@ -75,17 +76,17 @@ public class InstalledOverview extends HOverview {
@Override
public String title() {
- return "Installed Extensions";
+ return LanguageBundle.get("ext.store.overview.title");
}
@Override
public String description() {
- return "Extensions that are already installed into G-Earth";
+ return LanguageBundle.get("ext.store.overview.description");
}
@Override
public String contentTitle() {
- return "Installed extensions";
+ return LanguageBundle.get("ext.store.overview.contenttitle");
}
};
}
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/installed/StoreExtensionInstalledItem.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/installed/StoreExtensionInstalledItem.java
index f5d6cda..84cb3ff 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/installed/StoreExtensionInstalledItem.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/installed/StoreExtensionInstalledItem.java
@@ -6,6 +6,7 @@ import gearth.services.internal_extensions.extensionstore.application.WebUtils;
import gearth.services.internal_extensions.extensionstore.application.entities.StoreExtensionItem;
import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension;
import gearth.services.internal_extensions.extensionstore.tools.InstalledExtension;
+import gearth.ui.translations.LanguageBundle;
import org.apache.maven.artifact.versioning.ComparableVersion;
public class StoreExtensionInstalledItem extends StoreExtensionItem {
@@ -55,11 +56,11 @@ public class StoreExtensionInstalledItem extends StoreExtensionItem {
.append("
")
.append("
").append(WebUtils.escapeMessage(installedExtension.getName())).append("
")
- .append("
Not found in G-ExtensionStore
")
+ .append("
").append(LanguageBundle.get("ext.store.extension.notinstore")).append("
")
.append("
")
.append("
")
- .append("
").append("Version: ").append(displayVersion()).append("
")
+ .append("
").append(LanguageBundle.get("ext.store.extension.version")).append(": ").append(displayVersion()).append("
")
.append("
")
.append("
")
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/ByDateOverview.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/ByDateOverview.java
index 1ea07db..acd0906 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/ByDateOverview.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/ByDateOverview.java
@@ -1,11 +1,11 @@
package gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews;
import gearth.misc.OSValidator;
-import gearth.services.internal_extensions.extensionstore.application.GExtensionStoreController;
import gearth.services.internal_extensions.extensionstore.application.entities.HOverview;
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension;
import gearth.services.internal_extensions.extensionstore.repository.querying.ExtensionOrdering;
+import gearth.ui.translations.LanguageBundle;
import java.util.Collections;
import java.util.List;
@@ -32,17 +32,17 @@ public class ByDateOverview extends QueriedExtensionOverview {
@Override
public String title() {
- return "New Releases";
+ return LanguageBundle.get("ext.store.search.ordering.bydate.title");
}
@Override
public String description() {
- return "Extensions that were recently added to the G-ExtensionStore";
+ return LanguageBundle.get("ext.store.search.ordering.bydate.description");
}
@Override
public String contentTitle() {
- return "New Releases";
+ return LanguageBundle.get("ext.store.search.ordering.bydate.contenttitle");
}
};
}
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/ByRatingOverview.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/ByRatingOverview.java
index bd080b9..de8d8d9 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/ByRatingOverview.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/ByRatingOverview.java
@@ -1,11 +1,11 @@
package gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews;
import gearth.misc.OSValidator;
-import gearth.services.internal_extensions.extensionstore.application.GExtensionStoreController;
import gearth.services.internal_extensions.extensionstore.application.entities.HOverview;
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension;
import gearth.services.internal_extensions.extensionstore.repository.querying.ExtensionOrdering;
+import gearth.ui.translations.LanguageBundle;
import java.util.Collections;
import java.util.List;
@@ -32,17 +32,17 @@ public class ByRatingOverview extends QueriedExtensionOverview {
@Override
public String title() {
- return "Popular Extensions";
+ return LanguageBundle.get("ext.store.search.ordering.byrating.title");
}
@Override
public String description() {
- return "Extensions sorted by rating";
+ return LanguageBundle.get("ext.store.search.ordering.byrating.description");
}
@Override
public String contentTitle() {
- return "Popular Extensions";
+ return LanguageBundle.get("ext.store.search.ordering.byrating.contenttitle");
}
};
}
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/ByUpdateOverview.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/ByUpdateOverview.java
index 36137ba..cb87d34 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/ByUpdateOverview.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/ByUpdateOverview.java
@@ -5,6 +5,7 @@ import gearth.services.internal_extensions.extensionstore.application.entities.H
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension;
import gearth.services.internal_extensions.extensionstore.repository.querying.ExtensionOrdering;
+import gearth.ui.translations.LanguageBundle;
import java.util.Collections;
import java.util.List;
@@ -31,17 +32,17 @@ public class ByUpdateOverview extends QueriedExtensionOverview {
@Override
public String title() {
- return "Recently Updated";
+ return LanguageBundle.get("ext.store.search.ordering.byupdate.title");
}
@Override
public String description() {
- return "Extensions that were recently updated";
+ return LanguageBundle.get("ext.store.search.ordering.byupdate.description");
}
@Override
public String contentTitle() {
- return "Recently Updated";
+ return LanguageBundle.get("ext.store.search.ordering.byupdate.contenttitle");
}
};
}
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/CategorizedOverview.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/CategorizedOverview.java
index e530256..3829d6c 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/CategorizedOverview.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/CategorizedOverview.java
@@ -1,12 +1,12 @@
package gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews;
import gearth.misc.OSValidator;
-import gearth.services.internal_extensions.extensionstore.application.WebUtils;
import gearth.services.internal_extensions.extensionstore.application.entities.HOverview;
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
import gearth.services.internal_extensions.extensionstore.repository.models.ExtCategory;
import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension;
import gearth.services.internal_extensions.extensionstore.repository.querying.ExtensionOrdering;
+import gearth.ui.translations.LanguageBundle;
import java.util.Collections;
import java.util.List;
@@ -47,7 +47,7 @@ public class CategorizedOverview extends QueriedExtensionOverview {
@Override
public String contentTitle() {
- return "Category: " + category.getName();
+ return LanguageBundle.get("ext.store.category") + ": " + category.getName();
}
};
}
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/SearchedQueryOverview.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/SearchedQueryOverview.java
index 0709ced..cf951a9 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/SearchedQueryOverview.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/SearchedQueryOverview.java
@@ -5,6 +5,7 @@ import gearth.services.internal_extensions.extensionstore.application.entities.H
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension;
import gearth.services.internal_extensions.extensionstore.repository.querying.ExtensionOrdering;
+import gearth.ui.translations.LanguageBundle;
import java.util.Collections;
import java.util.List;
@@ -48,17 +49,17 @@ public class SearchedQueryOverview extends QueriedExtensionOverview {
@Override
public String title() {
- return "Search";
+ return LanguageBundle.get("ext.store.search.title");
}
@Override
public String description() {
- return "Find the extension that fits your needs";
+ return LanguageBundle.get("ext.store.search.description");
}
@Override
public String contentTitle() {
- return "Search results";
+ return LanguageBundle.get("ext.store.search.results");
}
};
}
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/search/SearchComponent.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/search/SearchComponent.java
index b53b3f1..a8f462f 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/search/SearchComponent.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/search/SearchComponent.java
@@ -1,10 +1,12 @@
package gearth.services.internal_extensions.extensionstore.application.entities.search;
+import gearth.GEarth;
import gearth.services.internal_extensions.extensionstore.GExtensionStore;
import gearth.services.internal_extensions.extensionstore.application.GExtensionStoreController;
import gearth.services.internal_extensions.extensionstore.application.entities.ContentItem;
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
import gearth.services.internal_extensions.extensionstore.repository.querying.ExtensionOrdering;
+import gearth.ui.translations.LanguageBundle;
import netscape.javascript.JSObject;
import java.util.ArrayList;
@@ -92,13 +94,13 @@ public class SearchComponent implements ContentItem {
.append("
")
.append("
")
- .append("Search by keyword: ")
+ .append("").append(LanguageBundle.get("ext.store.search.bykeyword")).append(": ")
.append(String.format(" ", searchKeyword, id))
.append("
")
.append("
")
- .append("Extensions ordering: ");
+ .append("").append(LanguageBundle.get("ext.store.search.ordering")).append(" ");
// add ordering stuff
htmlBuilder.append(String.format("");
- addFilterBoxHtml(htmlBuilder, "Client", "Clients:", clients, id);
- addFilterBoxHtml(htmlBuilder, "Category", "Categories:", categories, id);
- addFilterBoxHtml(htmlBuilder, "Framework", "Frameworks:", frameworks, id);
+ addFilterBoxHtml(htmlBuilder, "Client", LanguageBundle.get("ext.store.search.filter.clients") + ":", clients, id);
+ addFilterBoxHtml(htmlBuilder, "Category", LanguageBundle.get("ext.store.search.filter.categories") + ":", categories, id);
+ addFilterBoxHtml(htmlBuilder, "Framework", LanguageBundle.get("ext.store.search.filter.frameworks") + ":", frameworks, id);
htmlBuilder
.append("
")
- .append("
Info: you are automatically filtering on the OS you use
")
+ .append("
").append(LanguageBundle.get("ext.store.search.info.automaticosfiltering")).append("
")
.append("
")
.append("
");
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/search/SearchOverview.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/search/SearchOverview.java
index 1c23d4d..95811a9 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/search/SearchOverview.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/search/SearchOverview.java
@@ -6,6 +6,7 @@ import gearth.services.internal_extensions.extensionstore.application.entities.H
import gearth.services.internal_extensions.extensionstore.application.entities.extensiondetails.StoreExtensionDetailsOverview;
import gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews.SearchedQueryOverview;
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
+import gearth.ui.translations.LanguageBundle;
import java.util.Collections;
import java.util.List;
@@ -27,7 +28,7 @@ public class SearchOverview extends HOverview {
@Override
public String buttonText() {
- return "Search";
+ return LanguageBundle.get("ext.store.button.search");
}
@Override
@@ -74,17 +75,17 @@ public class SearchOverview extends HOverview {
@Override
public String title() {
- return "Search";
+ return LanguageBundle.get("ext.store.search.title");
}
@Override
public String description() {
- return "Find the extension that fits your needs";
+ return LanguageBundle.get("ext.store.search.description");
}
@Override
public String contentTitle() {
- return "Search extensions";
+ return LanguageBundle.get("ext.store.search.contenttitle");
}
};
}
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/querying/ExtensionOrdering.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/querying/ExtensionOrdering.java
index bf1f564..d7a200e 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/querying/ExtensionOrdering.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/querying/ExtensionOrdering.java
@@ -1,27 +1,29 @@
package gearth.services.internal_extensions.extensionstore.repository.querying;
+import gearth.ui.translations.LanguageBundle;
+
public enum ExtensionOrdering {
- RATING("Rating"),
- ALPHABETICAL("Alphabetical"),
- LAST_UPDATED("Last updated"),
- NEW_RELEASES("New releases");
+ RATING("ext.store.ordering.rating"),
+ ALPHABETICAL("ext.store.ordering.alphabetical"),
+ LAST_UPDATED("ext.store.ordering.lastupdated"),
+ NEW_RELEASES("ext.store.ordering.newreleases");
- private String orderName;
+ private String orderKey;
- ExtensionOrdering(String orderName) {
- this.orderName = orderName;
+ ExtensionOrdering(String orderKey) {
+ this.orderKey = orderKey;
}
public String getOrderName() {
- return orderName;
+ return LanguageBundle.get(orderKey);
}
public static ExtensionOrdering fromString(String text) {
for (ExtensionOrdering b : ExtensionOrdering.values()) {
- if (b.orderName.equalsIgnoreCase(text)) {
+ if (LanguageBundle.get(b.orderKey).equalsIgnoreCase(text)) {
return b;
}
}
diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/tools/StoreExtensionTools.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/tools/StoreExtensionTools.java
index eb70240..2b520f5 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/tools/StoreExtensionTools.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/tools/StoreExtensionTools.java
@@ -8,6 +8,7 @@ import gearth.services.extension_handler.extensions.implementations.network.exec
import gearth.services.internal_extensions.extensionstore.repository.StoreFetch;
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension;
+import gearth.ui.translations.LanguageBundle;
import org.apache.commons.io.FileUtils;
import org.apache.maven.artifact.versioning.ComparableVersion;
import org.json.JSONArray;
@@ -137,29 +138,29 @@ public class StoreExtensionTools {
} catch (IOException e) {
e.printStackTrace();
- listener.fail("Error while unzipping");
+ listener.fail(LanguageBundle.get("ext.store.fail.unzip"));
removeExtension(path);
}
} catch (MalformedURLException e) {
- listener.fail("Invalid extension URL");
+ listener.fail(LanguageBundle.get("ext.store.fail.invalidurl"));
try {
removeExtension(path); // cleanup
} catch (IOException ignore) { }
} catch (IOException e) {
- listener.fail("Extension not available in repository");
+ listener.fail(LanguageBundle.get("ext.store.fail.notavailable"));
try {
removeExtension(path); // cleanup
} catch (IOException ignore) { }
}
}
else {
- listener.fail("Something went wrong creating the extension directory, does the extension already exist?");
+ listener.fail(LanguageBundle.get("ext.store.fail.alreadyexists"));
// don't do cleanup since you might not want removal of current extension files
}
}
else {
- listener.fail("Extension wasn't found");
+ listener.fail(LanguageBundle.get("ext.store.fail.notfound"));
}
}).start();
@@ -233,8 +234,7 @@ public class StoreExtensionTools {
}
}
} catch (Exception e) {
- listener.fail("Something went wrong with uninstalling the extension, make sure to disconnect" +
- " the extension if it was still running.");
+ listener.fail(LanguageBundle.get("ext.store.fail.uninstall"));
return;
}
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 26b6af0..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
@@ -7,7 +7,9 @@ package gearth.services.internal_extensions.uilogger;
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.*;
@@ -39,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;
@@ -71,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<>();
@@ -86,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();
@@ -157,6 +165,8 @@ public class UiLoggerController implements Initializable {
appendLater.clear();
}
}
+
+ initLanguageBinding();
}
private static String cleanTextContent(String text) {
@@ -219,7 +229,7 @@ public class UiLoggerController implements Initializable {
if (chkTimestamp.isSelected()) {
- elements.add(new Element(String.format("(timestamp: %d)\n", 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;
@@ -256,8 +266,8 @@ public class UiLoggerController implements Initializable {
elements.add(new Element("\n", ""));
}
- if (isBlocked) elements.add(new Element("[Blocked]\n", "blocked"));
- else if (isReplaced) elements.add(new Element("[Replaced]\n", "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()));
@@ -265,7 +275,7 @@ public class UiLoggerController implements Initializable {
Hexdump.hexdump(packet.toBytes()) :
(chkReprRawHex.isSelected() ? Bytes.wrap(packet.toBytes()).encodeHex() : packet.toString());
- String type = isIncoming ? "Incoming" : "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()));
@@ -276,7 +286,7 @@ public class UiLoggerController implements Initializable {
}
if (isSkipped) {
- elements.add(new Element("", "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", ""));
@@ -343,13 +353,13 @@ public class UiLoggerController implements Initializable {
public void updateLoggerInfo() {
Platform.runLater(() -> {
- lblViewIncoming.setText("View Incoming: " + (chkViewIncoming.isSelected() ? "True" : "False"));
- lblViewOutgoing.setText("View Outgoing: " + (chkViewOutgoing.isSelected() ? "True" : "False"));
- lblAutoScrolll.setText("Autoscroll: " + (chkAutoscroll.isSelected() ? "True" : "False"));
- lblFiltered.setText("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("Packet info: " + (packetInfoAvailable ? "True" : "False"));
+ packetInfo.setKey(1, "ext.logger.state." + (packetInfoAvailable ? "true" : "false"));
});
}
@@ -389,9 +399,9 @@ public class UiLoggerController implements Initializable {
//Set extension filter
FileChooser.ExtensionFilter extFilter =
- new FileChooser.ExtensionFilter("TXT files (*.txt)", "*.txt");
+ new FileChooser.ExtensionFilter(String.format("%s (*.txt)", LanguageBundle.get("ext.logger.menu.packets.exportall.filetype")), "*.txt");
fileChooser.getExtensionFilters().add(extFilter);
- fileChooser.setTitle("Save Packets");
+ fileChooser.setTitle(LanguageBundle.get("ext.logger.menu.packets.exportall.windowtitle"));
//Show save file dialog
File file = fileChooser.showSaveDialog(stage);
@@ -416,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/services/internal_extensions/uilogger/UiLoggerCreator.java b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerCreator.java
index 43f43ce..927920b 100644
--- a/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerCreator.java
+++ b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerCreator.java
@@ -1,5 +1,6 @@
package gearth.services.internal_extensions.uilogger;
+import gearth.GEarth;
import gearth.extensions.InternalExtensionFormCreator;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
diff --git a/G-Earth/src/main/java/gearth/ui/GEarthController.java b/G-Earth/src/main/java/gearth/ui/GEarthController.java
index 557295b..55d22d0 100644
--- a/G-Earth/src/main/java/gearth/ui/GEarthController.java
+++ b/G-Earth/src/main/java/gearth/ui/GEarthController.java
@@ -3,8 +3,8 @@ package gearth.ui;
import gearth.protocol.connection.proxy.ProxyProviderFactory;
import gearth.protocol.connection.proxy.SocksConfiguration;
import gearth.ui.subforms.logger.loggerdisplays.PacketLoggerFactory;
+import gearth.ui.translations.TranslatableString;
import javafx.scene.control.*;
-import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;
import gearth.protocol.HConnection;
import gearth.ui.subforms.connection.ConnectionController;
@@ -21,7 +21,7 @@ import java.util.List;
public class GEarthController {
- public Tab tab_Logger;
+ public Tab tab_Connection, tab_Logger, tab_Injection, tab_Tools, tab_Scheduler, tab_Extensions, tab_Extra, tab_Info;
public TabPane tabBar;
private Stage stage = null;
private volatile HConnection hConnection;
@@ -67,6 +67,10 @@ public class GEarthController {
trySetController();
}
+ if (PacketLoggerFactory.usesUIlogger()) {
+ tabBar.getTabs().remove(tab_Logger);
+ }
+
List uiTabs = tabBar.getTabs();
for (int i = 0; i < uiTabs.size(); i++) {
Tab tab = uiTabs.get(i);
@@ -79,11 +83,7 @@ public class GEarthController {
});
}
- if (PacketLoggerFactory.usesUIlogger()) {
- tabBar.getTabs().remove(tab_Logger);
- }
-
-
+ initLanguageBinding();
}
public void setStage(Stage stage) {
@@ -120,4 +120,13 @@ public class GEarthController {
hConnection.abort();
}
+ private void initLanguageBinding() {
+ 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 3add757..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
@@ -6,6 +6,7 @@ import gearth.protocol.connection.HClient;
import gearth.protocol.connection.HState;
import gearth.protocol.connection.proxy.ProxyProviderFactory;
import gearth.services.Constants;
+import gearth.ui.translations.TranslatableString;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.scene.control.*;
@@ -29,7 +30,7 @@ public class ConnectionController extends SubForm {
public ComboBox inpPort;
public ComboBox inpHost;
public Button btnConnect;
- public Label lblState;
+ public Label lblInpPort, lblInpHost, lblPort, lblHost, lblHotelVersion, lblClient, lblStateHead, lblState;
public TextField outHost;
public TextField outPort;
public CheckBox cbx_autodetect;
@@ -48,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();
@@ -131,6 +134,8 @@ public class ConnectionController extends SubForm {
synchronized (this) {
tryMaybeConnectOnInit();
}
+
+ initLanguageBinding();
}
@@ -176,20 +181,20 @@ public class ConnectionController extends SubForm {
getHConnection().getStateObservable().addListener((oldState, newState) -> Platform.runLater(() -> {
updateInputUI();
if (newState == HState.NOT_CONNECTED) {
- lblState.setText("Not connected");
- btnConnect.setText("Connect");
+ 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.setText("Abort");
+ connect.setKey(0, "tab.connection.button.abort");
}
if (newState == HState.CONNECTED) {
- lblState.setText("Connected");
+ state.setKey(0, "tab.connection.state.connected");
}
if (newState == HState.WAITING_FOR_CLIENT) {
- lblState.setText("Waiting for connection");
+ state.setKey(0, "tab.connection.state.waiting");
}
if (newState == HState.CONNECTED && useFlash()) {
@@ -314,4 +319,24 @@ public class ConnectionController extends SubForm {
return false;
}
+
+ private void initLanguageBinding() {
+ 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("%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 b1623fe..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
@@ -1,8 +1,11 @@
package gearth.ui.subforms.extensions;
+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;
@@ -80,7 +83,8 @@ public class ExtensionItemContainer extends GridPane {
add(versionLabel, 3, 0);
exitButton = new ExitButton();
- Tooltip delete = new Tooltip("Close connection with this extension");
+ 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();
@@ -89,7 +93,8 @@ public class ExtensionItemContainer extends GridPane {
buttonsBox = new HBox(clickButton, exitButton);
reloadButton = new ReloadButton();
- Tooltip reload = new Tooltip("Restart this extension");
+ 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 -> {
@@ -99,8 +104,6 @@ public class ExtensionItemContainer extends GridPane {
});
DeleteButton deleteButton = new DeleteButton();
- Tooltip uninstall = new Tooltip("Uninstall this extension");
- Tooltip.install(deleteButton, uninstall);
deleteButton.show();
GridPane this2 = this;
@@ -110,8 +113,8 @@ public class ExtensionItemContainer extends GridPane {
if (ConfirmationDialog.showDialog(uninstallKey)) {
Alert alert = ConfirmationDialog.createAlertWithOptOut(Alert.AlertType.CONFIRMATION, uninstallKey
- ,"Confirmation Dialog", null,
- "Are you sure want to uninstall this extension?", "Do not ask again",
+ , LanguageBundle.get("alert.confirmation.windowtitle"), null,
+ LanguageBundle.get("tab.extensions.table.edit.uninstall.confirmation"), LanguageBundle.get("alert.confirmation.button.donotaskagain"),
ButtonType.YES, ButtonType.NO
);
@@ -217,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 d51f7fd..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
@@ -1,5 +1,6 @@
package gearth.ui.subforms.extensions;
+import gearth.GEarth;
import gearth.services.extension_handler.ExtensionHandler;
import gearth.services.extension_handler.extensions.ExtensionListener;
import gearth.services.extension_handler.extensions.implementations.network.NetworkExtensionsProducer;
@@ -10,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.*;
@@ -39,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() {
@@ -80,9 +85,9 @@ public class ExtensionsController extends SubForm {
public void installBtnClicked(ActionEvent actionEvent) {
FileChooser fileChooser = new FileChooser();
- fileChooser.setTitle("Install extension");
+ fileChooser.setTitle(LanguageBundle.get("tab.extensions.button.install.windowtitle"));
fileChooser.getExtensionFilters().addAll(
- new FileChooser.ExtensionFilter("G-Earth extensions", 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());
@@ -116,7 +121,7 @@ public class ExtensionsController extends SubForm {
pythonShellLaunching = true;
Platform.runLater(() -> btn_gpython.setDisable(true));
GPythonShell shell = new GPythonShell(
- "Scripting shell " + gpytonShellCounter++,
+ String.format("%s %d", LanguageBundle.get("tab.extensions.button.pythonshell.windowtitle"),gpytonShellCounter++),
networkExtensionsProducer.getPort(),
Authenticator.generatePermanentCookie()
);
@@ -129,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 bba6600..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("G-Earth | Extension Console");
+ 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 ce02079..a0ba435 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,8 @@ 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.LanguageBundle;
+import gearth.ui.translations.TranslatableString;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.scene.control.*;
@@ -59,6 +61,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 +95,8 @@ public class ExtraController extends SubForm implements SocksConfiguration {
cbx_useSocks.selectedProperty().addListener(observable -> grd_socksInfo.setDisable(!cbx_useSocks.isSelected()));
ProxyProviderFactory.setSocksConfig(this);
+
+ initLanguageBinding();
}
@Override
@@ -177,12 +182,13 @@ public class ExtraController extends SubForm implements SocksConfiguration {
});
if (!GPythonVersionUtils.validInstallation()) {
Platform.runLater(() -> {
- Alert alert = new Alert(Alert.AlertType.ERROR, "G-Python installation", ButtonType.OK);
- alert.setTitle("G-Python installation");
+ Alert alert = new Alert(Alert.AlertType.ERROR, LanguageBundle.get("tab.extra.options.pythonscripting.alert.title"), ButtonType.OK);
+ alert.setTitle(LanguageBundle.get("tab.extra.options.pythonscripting.alert.title"));
FlowPane fp = new FlowPane();
- Label lbl = new Label("Before using G-Python, install the right packages using pip!" +
- System.lineSeparator() + System.lineSeparator() + "More information here:");
+ Label lbl = new Label(LanguageBundle.get("tab.extra.options.pythonscripting.alert.content") +
+ System.lineSeparator() + System.lineSeparator() +
+ LanguageBundle.get("tab.extra.options.pythonscripting.alert.moreinformation"));
Hyperlink link = new Hyperlink(INFO_URL_GPYTHON);
fp.getChildren().addAll( lbl, link);
link.setOnAction(event -> {
@@ -219,4 +225,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 81e8e07..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, "Donate Bitcoins", ButtonType.OK);
- alert.setHeaderText("Donate Bitcoins");
+ 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("Bitcoin public address:"));
+ 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/InjectedPackets.java b/G-Earth/src/main/java/gearth/ui/subforms/injection/InjectedPackets.java
index 45f8219..e0bc58c 100644
--- a/G-Earth/src/main/java/gearth/ui/subforms/injection/InjectedPackets.java
+++ b/G-Earth/src/main/java/gearth/ui/subforms/injection/InjectedPackets.java
@@ -1,10 +1,12 @@
package gearth.ui.subforms.injection;
+import gearth.GEarth;
import gearth.misc.StringifyAble;
import gearth.protocol.HMessage;
import gearth.protocol.HPacket;
import gearth.services.packet_info.PacketInfo;
import gearth.services.packet_info.PacketInfoManager;
+import gearth.ui.translations.LanguageBundle;
import org.json.JSONObject;
import java.util.HashMap;
@@ -19,7 +21,7 @@ public class InjectedPackets implements StringifyAble {
public InjectedPackets(String packetsAsString, int amountPackets, PacketInfoManager packetInfoManager, HMessage.Direction direction) {
String description;
if (amountPackets > 1) {
- description = String.format("(packets: %d, length: %d)", amountPackets, packetsAsString.length());
+ description = String.format("(%s: %d, %s: %d)", LanguageBundle.get("tab.injection.description.packets"), amountPackets, LanguageBundle.get("tab.injection.description.length"), packetsAsString.length());
}
else { // assume 1 packet
HPacket packet = new HPacket(packetsAsString);
@@ -40,7 +42,7 @@ public class InjectedPackets implements StringifyAble {
description = String.format("%s", identifier);
}
else {
- description = String.format("(id: %d, length: %d)", packet.headerId(), packet.length());
+ description = String.format("(%s: %d, %s: %d)", LanguageBundle.get("tab.injection.description.id"), packet.headerId(), LanguageBundle.get("tab.injection.description.length"), packet.length());
}
}
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 3ad4317..dc4120d 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
@@ -1,9 +1,12 @@
package gearth.ui.subforms.injection;
+import gearth.GEarth;
import gearth.misc.Cacher;
import gearth.services.packet_info.PacketInfoManager;
import gearth.protocol.HMessage;
import gearth.protocol.connection.HState;
+import gearth.ui.translations.LanguageBundle;
+import gearth.ui.translations.TranslatableString;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.scene.control.*;
@@ -26,12 +29,15 @@ public class InjectionController extends SubForm {
private static final int historylimit = 69;
public TextArea inputPacket;
- public Text lbl_corrruption;
+ public Text lbl_corruption;
public Text lbl_pcktInfo;
public Button btn_sendToServer;
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));
@@ -52,14 +58,14 @@ public class InjectionController extends SubForm {
}
});
- lblHistory.setTooltip(new Tooltip("Double click a packet to restore it"));
-
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) {
@@ -103,33 +109,34 @@ public class InjectionController extends SubForm {
private void updateUI() {
boolean dirty = false;
- lbl_corrruption.setText("isCorrupted: False");
- lbl_corrruption.getStyleClass().clear();
- lbl_corrruption.getStyleClass().add("not-corrupted-label");
+ corruption.setKey(1, "tab.injection.corrupted.false");
+ lbl_corruption.getStyleClass().clear();
+ lbl_corruption.getStyleClass().add("not-corrupted-label");
HPacket[] packets = parsePackets(inputPacket.getText());
if (packets.length == 0) {
dirty = true;
- lbl_corrruption.setFill(Paint.valueOf("#ee0404b2"));
- lbl_corrruption.getStyleClass().clear();
- lbl_corrruption.getStyleClass().add("corrupted-label");
+ lbl_corruption.setFill(Paint.valueOf("#ee0404b2"));
+ lbl_corruption.getStyleClass().clear();
+ lbl_corruption.getStyleClass().add("corrupted-label");
}
for (int i = 0; i < packets.length; i++) {
if (packets[i].isCorrupted()) {
if (!dirty) {
- lbl_corrruption.setText("isCorrupted: True -> " + i);
- lbl_corrruption.getStyleClass().clear();
- lbl_corrruption.getStyleClass().add("corrupted-label");
+ 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_corrruption.setText(lbl_corrruption.getText() + ", " + i);
+ corruption.setFormat(corruption.getFormat() + ", " + i);
}
}
if (dirty && packets.length == 1) {
- lbl_corrruption.setText("isCorrupted: True"); // no index needed
+ corruption.setFormatAndKeys("%s: %s", "tab.injection.corrupted", "tab.injection.corrupted.true");
}
if (!dirty) {
@@ -147,18 +154,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("header (id:" + packets[0].headerId() + ", 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("header (id:NULL, 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);
@@ -171,7 +183,7 @@ public class InjectionController extends SubForm {
HPacket[] packets = parsePackets(inputPacket.getText());
for (HPacket packet : packets) {
getHConnection().sendToServer(packet);
- writeToLog(Color.BLUE, "SS -> packet with id: " + packet.headerId());
+ writeToLog(Color.BLUE, String.format("SS -> %s: %d", LanguageBundle.get("tab.injection.log.packetwithid"), packet.headerId()));
}
addToHistory(packets, inputPacket.getText(), HMessage.Direction.TOSERVER);
@@ -181,7 +193,7 @@ public class InjectionController extends SubForm {
HPacket[] packets = parsePackets(inputPacket.getText());
for (HPacket packet : packets) {
getHConnection().sendToClient(packet);
- writeToLog(Color.RED, "CS -> packet with id: " + packet.headerId());
+ writeToLog(Color.RED, String.format("CS -> %s: %d", LanguageBundle.get("tab.injection.log.packetwithid"), packet.headerId()));
}
addToHistory(packets, inputPacket.getText(), HMessage.Direction.TOCLIENT);
@@ -224,6 +236,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/logger/loggerdisplays/LinuxTerminalLogger.java b/G-Earth/src/main/java/gearth/ui/subforms/logger/loggerdisplays/LinuxTerminalLogger.java
index d6f7946..64c2247 100644
--- a/G-Earth/src/main/java/gearth/ui/subforms/logger/loggerdisplays/LinuxTerminalLogger.java
+++ b/G-Earth/src/main/java/gearth/ui/subforms/logger/loggerdisplays/LinuxTerminalLogger.java
@@ -55,7 +55,7 @@ class LinuxTerminalLogger extends SimpleTerminalLogger {
packet.toString()
);
- output.append(colorizePackets.get("DEFAULT"));
+ output.append(colorizePackets.get("ENGLISH"));
System.out.println(output.toString());
}
@@ -67,7 +67,7 @@ class LinuxTerminalLogger extends SimpleTerminalLogger {
System.out.println(
colorizePackets.get("EXPRESSION") +
expr +
- colorizePackets.get("DEFAULT")
+ colorizePackets.get("ENGLISH")
);
}
}
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 0f1ea75..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
@@ -1,10 +1,14 @@
package gearth.ui.subforms.scheduler;
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;
@@ -48,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()));
@@ -56,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("Clear all items"));
- btn_save.setTooltip(new Tooltip("Save to file"));
- btn_load.setTooltip(new Tooltip("Load from file"));
-
updateUI();
//register hotkeys
@@ -76,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
@@ -157,7 +162,7 @@ public class SchedulerController extends SubForm {
rb_outgoing.setSelected(newItem.getDestinationProperty().get() == HMessage.Direction.TOSERVER);
isBeingEdited = newItem;
- btn_addoredit.setText("Edit");
+ addoredit.setKey(0, "tab.scheduler.button.edit");
updateUI();
newItem.onIsBeingUpdatedTrigger();
}
@@ -175,7 +180,7 @@ public class SchedulerController extends SubForm {
rb_incoming.setSelected(true);
rb_outgoing.setSelected(false);
- btn_addoredit.setText("Add");
+ addoredit.setKey(0, "tab.scheduler.button.add");
updateUI();
}
@@ -203,9 +208,9 @@ public class SchedulerController extends SubForm {
//Set extension filter
FileChooser.ExtensionFilter extFilter =
- new FileChooser.ExtensionFilter("SCHED files (*.sched)", "*.sched");
+ new FileChooser.ExtensionFilter(LanguageBundle.get("tab.scheduler.filetype"), "*.sched");
fileChooser.getExtensionFilters().add(extFilter);
- fileChooser.setTitle("Save Schedule File");
+ fileChooser.setTitle(LanguageBundle.get("tab.scheduler.button.save.windowtitle"));
//Show save file dialog
File file = fileChooser.showSaveDialog(parentController.getStage());
@@ -234,9 +239,9 @@ public class SchedulerController extends SubForm {
List list = new ArrayList<>();
FileChooser fileChooser = new FileChooser();
- fileChooser.setTitle("Load Schedule File");
+ fileChooser.setTitle(LanguageBundle.get("tab.scheduler.button.load.windowtitle"));
fileChooser.getExtensionFilters().addAll(
- new FileChooser.ExtensionFilter("Schedule Files", "*.sched"));
+ new FileChooser.ExtensionFilter(LanguageBundle.get("tab.scheduler.filetype"), "*.sched"));
File selectedFile = fileChooser.showOpenDialog(parentController.getStage());
if (selectedFile != null) {
@@ -262,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/titlebar/TitleBarController.java b/G-Earth/src/main/java/gearth/ui/titlebar/TitleBarController.java
index b2a7c16..21186df 100644
--- a/G-Earth/src/main/java/gearth/ui/titlebar/TitleBarController.java
+++ b/G-Earth/src/main/java/gearth/ui/titlebar/TitleBarController.java
@@ -2,16 +2,18 @@ package gearth.ui.titlebar;
import gearth.GEarth;
import gearth.ui.themes.ThemeFactory;
+import gearth.ui.translations.Language;
+import gearth.ui.translations.LanguageBundle;
import javafx.application.Platform;
import javafx.beans.InvalidationListener;
+import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
-import javafx.scene.control.Alert;
-import javafx.scene.control.ButtonType;
-import javafx.scene.control.Label;
+import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
+import javafx.scene.input.ContextMenuEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
@@ -19,6 +21,7 @@ import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
+import javafx.stage.WindowEvent;
import java.io.IOException;
import java.util.Optional;
@@ -30,6 +33,7 @@ public class TitleBarController {
public ImageView titleIcon;
public ImageView themeBtn;
public ImageView minimizeBtn;
+ public MenuButton languagePicker;
private Stage stage;
private TitleBarConfig config;
@@ -83,6 +87,9 @@ public class TitleBarController {
stage.titleProperty().addListener((i) -> controller.setTitle(stage.getTitle()));
controller.setTitle(stage.getTitle());
+ controller.languagePicker.getItems().addAll(Language.getMenuItems());
+ controller.languagePicker.setGraphic(LanguageBundle.getLanguage().getIcon());
+
stage.getIcons().addListener((InvalidationListener) observable -> controller.updateIcon());
controller.updateIcon();
@@ -96,11 +103,16 @@ public class TitleBarController {
if (!config.displayThemePicker()) {
((GridPane) controller.themeBtn.getParent()).getChildren().remove(controller.themeBtn);
+ ((GridPane) controller.languagePicker.getParent()).getChildren().remove(controller.languagePicker);
}
});
return controller;
}
+ private static void initLanguagePicker() {
+
+ }
+
public void updateIcon() {
Platform.runLater(() -> titleIcon.setImage(stage.getIcons().size() > 0 ? stage.getIcons().get(0) :
new Image(GEarth.class.getResourceAsStream(
@@ -158,5 +170,4 @@ public class TitleBarController {
}
return Optional.empty();
}
-
}
diff --git a/G-Earth/src/main/java/gearth/ui/translations/Language.java b/G-Earth/src/main/java/gearth/ui/translations/Language.java
new file mode 100644
index 0000000..f2f27ab
--- /dev/null
+++ b/G-Earth/src/main/java/gearth/ui/translations/Language.java
@@ -0,0 +1,82 @@
+package gearth.ui.translations;
+
+import javafx.event.ActionEvent;
+import javafx.scene.control.ContextMenu;
+import javafx.scene.control.MenuButton;
+import javafx.scene.control.MenuItem;
+import javafx.scene.image.ImageView;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.PropertyResourceBundle;
+import java.util.ResourceBundle;
+
+public enum Language {
+ ENGLISH ("en"),
+ DUTCH ("nl"),
+ FRENCH ("fr"),
+ GERMAN ("de"),
+ SPANISH ("es"),
+ PORTUGUESE ("pt"),
+ ITALIAN ("it"),
+ FINNISH ("fi"),
+ TURKISH ("tr");
+
+ public final ResourceBundle messages;
+ private final String locale;
+
+ Language(String locale) {
+ this.locale = locale;
+
+ ResourceBundle resBundle;
+ try {
+ InputStream stream = Language.class.getResourceAsStream(String.format("/gearth/ui/translations/messages_%s.properties", locale));
+ InputStreamReader isr = new InputStreamReader(stream, StandardCharsets.UTF_8);
+ resBundle = new PropertyResourceBundle(isr);
+ } catch (Exception e) {
+ System.out.printf("/gearth/ui/translations/messages_%s.properties%n", locale);
+ System.out.println("Couldn't load language file: " + locale);
+ resBundle = null;
+ }
+
+ this.messages = resBundle;
+ }
+
+ public MenuItem asMenuItem() {
+ MenuItem menuItem = new MenuItem(null, getIcon());
+ menuItem.setOnAction(this::onSelect);
+ return menuItem;
+ }
+
+ private void onSelect(ActionEvent actionEvent) {
+ ContextMenu ctxMenu = ((MenuItem) actionEvent.getSource()).getParentPopup();
+ ((MenuButton) ctxMenu.getOwnerNode()).setGraphic(getIcon());
+ LanguageBundle.setLanguage(this);
+ }
+
+ public ImageView getIcon() {
+ ImageView icon = new ImageView();
+ icon.getStyleClass().addAll("language-icon", locale);
+ icon.setFitWidth(18);
+ icon.setFitHeight(18);
+ return icon;
+ }
+
+ public static MenuItem[] getMenuItems() {
+ return Arrays.stream(values())
+ .map(Language::asMenuItem)
+ .toArray(MenuItem[]::new);
+ }
+
+ public static Language getSystemLanguage() {
+ String locale = System.getProperty("user.language");
+ System.out.println(locale);
+ for (Language l : values())
+ if (l.locale.equals(locale))
+ return l;
+
+ return ENGLISH;
+ }
+}
diff --git a/G-Earth/src/main/java/gearth/ui/translations/LanguageBundle.java b/G-Earth/src/main/java/gearth/ui/translations/LanguageBundle.java
new file mode 100644
index 0000000..d4002e1
--- /dev/null
+++ b/G-Earth/src/main/java/gearth/ui/translations/LanguageBundle.java
@@ -0,0 +1,54 @@
+package gearth.ui.translations;
+
+import gearth.misc.Cacher;
+import gearth.services.internal_extensions.extensionstore.application.GExtensionStoreController;
+
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.ResourceBundle;
+import java.util.Set;
+
+public class LanguageBundle extends ResourceBundle {
+
+ private static final String LANGUAGE_CACHE_KEY = "language";
+ private static Language current;
+ private static final Set requireUpdate = new HashSet<>();
+
+ static {
+ try {
+ current = Language.valueOf((String) Cacher.get(LANGUAGE_CACHE_KEY));
+ } catch (Exception e) {
+ current = Language.getSystemLanguage();
+ Cacher.put(LANGUAGE_CACHE_KEY, current.toString());
+ }
+ }
+
+ public static void addTranslatableString(TranslatableString translatableString) {
+ requireUpdate.add(translatableString);
+ }
+
+ @Override
+ protected Object handleGetObject(String key) {
+ return current.messages.getObject(key);
+ }
+
+ @Override
+ public Enumeration getKeys() {
+ return current.messages.getKeys();
+ }
+
+ public static void setLanguage(Language lang) {
+ current = lang;
+ requireUpdate.forEach(TranslatableString::trigger);
+ GExtensionStoreController.reloadPage();
+ Cacher.put(LANGUAGE_CACHE_KEY, current.toString());
+ }
+
+ public static Language getLanguage() {
+ return current;
+ }
+
+ public static String get(String key) {
+ return current.messages.getString(key);
+ }
+}
diff --git a/G-Earth/src/main/java/gearth/ui/translations/TranslatableString.java b/G-Earth/src/main/java/gearth/ui/translations/TranslatableString.java
new file mode 100644
index 0000000..df0d0f1
--- /dev/null
+++ b/G-Earth/src/main/java/gearth/ui/translations/TranslatableString.java
@@ -0,0 +1,82 @@
+package gearth.ui.translations;
+
+import gearth.misc.StringifyAble;
+import javafx.beans.value.ObservableValueBase;
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+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 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 c257d5e..f5afda1 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
@@ -5,19 +5,19 @@
-
+
-
+
-
+
-
+
@@ -25,12 +25,12 @@
-
-
+
+
-
+
@@ -38,16 +38,16 @@
-
+
-
+
-
+
-
+
@@ -59,7 +59,7 @@
-
+
@@ -70,7 +70,7 @@
-
+
@@ -84,7 +84,7 @@
-
+
@@ -94,7 +94,7 @@
-
+
@@ -104,7 +104,7 @@
-
+
@@ -114,7 +114,7 @@
-
+
@@ -123,7 +123,7 @@
-
+
diff --git a/G-Earth/src/main/resources/gearth/ui/G-Earth.fxml b/G-Earth/src/main/resources/gearth/ui/G-Earth.fxml
index 549ec24..3db6aa7 100644
--- a/G-Earth/src/main/resources/gearth/ui/G-Earth.fxml
+++ b/G-Earth/src/main/resources/gearth/ui/G-Earth.fxml
@@ -5,30 +5,31 @@
-
+
-
+
+ tab.connection
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/G-Earth/src/main/resources/gearth/ui/subforms/connection/Connection.fxml b/G-Earth/src/main/resources/gearth/ui/subforms/connection/Connection.fxml
index 923279c..90b708b 100644
--- a/G-Earth/src/main/resources/gearth/ui/subforms/connection/Connection.fxml
+++ b/G-Earth/src/main/resources/gearth/ui/subforms/connection/Connection.fxml
@@ -45,7 +45,7 @@
-
+
@@ -60,7 +60,7 @@
-
+
@@ -78,13 +78,10 @@
-
+
-
-
-
@@ -114,7 +111,7 @@
-
+
@@ -140,10 +137,13 @@
-
+
-
+
+
+
+
@@ -196,7 +196,7 @@
-
+
@@ -225,12 +225,12 @@
-
+
-
+
diff --git a/G-Earth/src/main/resources/gearth/ui/subforms/extensions/Extensions.fxml b/G-Earth/src/main/resources/gearth/ui/subforms/extensions/Extensions.fxml
index 0614878..44a9666 100644
--- a/G-Earth/src/main/resources/gearth/ui/subforms/extensions/Extensions.fxml
+++ b/G-Earth/src/main/resources/gearth/ui/subforms/extensions/Extensions.fxml
@@ -31,11 +31,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -61,13 +61,13 @@
-
+
-
+
diff --git a/G-Earth/src/main/resources/gearth/ui/subforms/extra/Extra.fxml b/G-Earth/src/main/resources/gearth/ui/subforms/extra/Extra.fxml
index f16dba0..e793056 100644
--- a/G-Earth/src/main/resources/gearth/ui/subforms/extra/Extra.fxml
+++ b/G-Earth/src/main/resources/gearth/ui/subforms/extra/Extra.fxml
@@ -4,7 +4,7 @@
-
+
@@ -16,8 +16,8 @@
-
-
+
+
@@ -77,8 +77,8 @@
-
-
+
+
diff --git a/G-Earth/src/main/resources/gearth/ui/subforms/info/Info.fxml b/G-Earth/src/main/resources/gearth/ui/subforms/info/Info.fxml
index 12d7e97..b6dd3e7 100644
--- a/G-Earth/src/main/resources/gearth/ui/subforms/info/Info.fxml
+++ b/G-Earth/src/main/resources/gearth/ui/subforms/info/Info.fxml
@@ -20,22 +20,22 @@
-
+
-
+
-
+
-
+
@@ -75,7 +75,7 @@
-
+
@@ -85,7 +85,7 @@
-
+
diff --git a/G-Earth/src/main/resources/gearth/ui/subforms/injection/Injection.fxml b/G-Earth/src/main/resources/gearth/ui/subforms/injection/Injection.fxml
index d615c13..c760718 100644
--- a/G-Earth/src/main/resources/gearth/ui/subforms/injection/Injection.fxml
+++ b/G-Earth/src/main/resources/gearth/ui/subforms/injection/Injection.fxml
@@ -5,7 +5,7 @@
-
+
@@ -37,12 +37,12 @@
-
+
-
+
@@ -92,7 +92,7 @@
-
+
diff --git a/G-Earth/src/main/resources/gearth/ui/subforms/scheduler/Scheduler.fxml b/G-Earth/src/main/resources/gearth/ui/subforms/scheduler/Scheduler.fxml
index 50abd20..e60d45b 100644
--- a/G-Earth/src/main/resources/gearth/ui/subforms/scheduler/Scheduler.fxml
+++ b/G-Earth/src/main/resources/gearth/ui/subforms/scheduler/Scheduler.fxml
@@ -31,11 +31,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -67,7 +67,7 @@
-
+
@@ -96,7 +96,7 @@
-
+
diff --git a/G-Earth/src/main/resources/gearth/ui/subforms/tools/Tools.fxml b/G-Earth/src/main/resources/gearth/ui/subforms/tools/Tools.fxml
index 55f0241..9d362df 100644
--- a/G-Earth/src/main/resources/gearth/ui/subforms/tools/Tools.fxml
+++ b/G-Earth/src/main/resources/gearth/ui/subforms/tools/Tools.fxml
@@ -46,7 +46,7 @@
-
+
@@ -80,7 +80,7 @@
-
+
@@ -116,7 +116,7 @@
-
+
@@ -179,7 +179,7 @@
-
+
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/DE.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/DE.png
new file mode 100644
index 0000000..5cb900a
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/DE.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/EN.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/EN.png
new file mode 100644
index 0000000..9c45388
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/EN.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/ES.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/ES.png
new file mode 100644
index 0000000..d8eb881
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/ES.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/FI.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/FI.png
new file mode 100644
index 0000000..9c6b63b
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/FI.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/FR.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/FR.png
new file mode 100644
index 0000000..dce083f
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/FR.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/IT.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/IT.png
new file mode 100644
index 0000000..07f3cd5
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/IT.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/NL.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/NL.png
new file mode 100644
index 0000000..8be1c9a
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/NL.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/PT.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/PT.png
new file mode 100644
index 0000000..dbe60b7
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/PT.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/TR.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/TR.png
new file mode 100644
index 0000000..5a4b324
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/lang/TR.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/styling.css b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/styling.css
index a1f8f91..66a8550 100644
--- a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/styling.css
+++ b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/styling.css
@@ -1006,4 +1006,72 @@ VBox > .split-menu-button.last > .arrow-button {
.scroll-pane {
-fx-background-color: white;
+}
+
+#language-picker {
+ -fx-background-color: transparent;
+ -fx-border-color: transparent;
+ -fx-padding: 0;
+}
+
+#language-picker .context-menu {
+ -fx-padding: 0;
+}
+
+#language-picker .context-menu .menu-item {
+ -fx-padding: 10 0 0 5;
+}
+
+#language-picker .label {
+ -fx-padding: 0 5;
+ -fx-max-width: 0;
+}
+
+#language-picker .arrow,
+#language-picker .arrow-button {
+ -fx-opacity: 0;
+ -fx-max-width: 0;
+ -fx-padding: 0;
+}
+
+#language-picker .menu-item .label {
+ -fx-max-width: 0;
+ -fx-padding: 0;
+ -fx-label-padding: 0;
+}
+
+.language-icon.en {
+ -fx-image: url("lang/EN.png");
+}
+
+.language-icon.nl {
+ -fx-image: url("lang/NL.png");
+}
+
+.language-icon.fr {
+ -fx-image: url("lang/FR.png");
+}
+
+.language-icon.es {
+ -fx-image: url("lang/ES.png");
+}
+
+.language-icon.de {
+ -fx-image: url("lang/DE.png");
+}
+
+.language-icon.tr {
+ -fx-image: url("lang/TR.png");
+}
+
+.language-icon.pt {
+ -fx-image: url("lang/PT.png");
+}
+
+.language-icon.fi {
+ -fx-image: url("lang/FI.png");
+}
+
+.language-icon.it {
+ -fx-image: url("lang/IT.png");
}
\ No newline at end of file
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/DE.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/DE.png
new file mode 100644
index 0000000..5781b6c
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/DE.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/EN.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/EN.png
new file mode 100644
index 0000000..854047a
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/EN.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/ES.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/ES.png
new file mode 100644
index 0000000..90472d0
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/ES.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/FI.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/FI.png
new file mode 100644
index 0000000..7bff561
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/FI.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/FR.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/FR.png
new file mode 100644
index 0000000..ead2012
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/FR.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/IT.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/IT.png
new file mode 100644
index 0000000..2ae300b
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/IT.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/NL.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/NL.png
new file mode 100644
index 0000000..759fab7
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/NL.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/PT.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/PT.png
new file mode 100644
index 0000000..952f3df
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/PT.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/TR.png b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/TR.png
new file mode 100644
index 0000000..0659f59
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/lang/TR.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/styling.css b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/styling.css
index fd0babd..ddf5279 100644
--- a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/styling.css
+++ b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/styling.css
@@ -1112,4 +1112,72 @@ VBox > .split-menu-button.last > .arrow-button {
-fx-background-color: #222222;
-fx-border-radius: 10;
-fx-border-color: rgba(240, 240, 240, 0.8);
+}
+
+#language-picker {
+ -fx-background-color: transparent;
+ -fx-border-color: transparent;
+ -fx-padding: 0;
+}
+
+#language-picker .context-menu {
+ -fx-padding: 0;
+}
+
+#language-picker .context-menu .menu-item {
+ -fx-padding: 10 0 0 5;
+}
+
+#language-picker .label {
+ -fx-padding: 0;
+ -fx-max-width: 0;
+}
+
+#language-picker .arrow,
+#language-picker .arrow-button {
+ -fx-opacity: 0;
+ -fx-max-width: 0;
+ -fx-padding: 0;
+}
+
+#language-picker .menu-item .label {
+ -fx-max-width: 0;
+ -fx-padding: 0;
+ -fx-label-padding: 0;
+}
+
+.language-icon.en {
+ -fx-image: url("lang/EN.png");
+}
+
+.language-icon.nl {
+ -fx-image: url("lang/NL.png");
+}
+
+.language-icon.fr {
+ -fx-image: url("lang/FR.png");
+}
+
+.language-icon.es {
+ -fx-image: url("lang/ES.png");
+}
+
+.language-icon.de {
+ -fx-image: url("lang/DE.png");
+}
+
+.language-icon.tr {
+ -fx-image: url("lang/TR.png");
+}
+
+.language-icon.pt {
+ -fx-image: url("lang/PT.png");
+}
+
+.language-icon.fi {
+ -fx-image: url("lang/FI.png");
+}
+
+.language-icon.it {
+ -fx-image: url("lang/IT.png");
}
\ No newline at end of file
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/DE.png b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/DE.png
new file mode 100644
index 0000000..5df5124
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/DE.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/EN.png b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/EN.png
new file mode 100644
index 0000000..08d1601
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/EN.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/ES.png b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/ES.png
new file mode 100644
index 0000000..ea94c26
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/ES.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/FI.png b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/FI.png
new file mode 100644
index 0000000..a55c0fe
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/FI.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/FR.png b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/FR.png
new file mode 100644
index 0000000..7d60122
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/FR.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/IT.png b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/IT.png
new file mode 100644
index 0000000..8fb639e
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/IT.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/NL.png b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/NL.png
new file mode 100644
index 0000000..e0d035a
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/NL.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/PT.png b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/PT.png
new file mode 100644
index 0000000..cf4dc52
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/PT.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/TR.png b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/TR.png
new file mode 100644
index 0000000..7f3eaf5
Binary files /dev/null and b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/lang/TR.png differ
diff --git a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/styling.css b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/styling.css
index c27f7d3..b7c9cba 100644
--- a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/styling.css
+++ b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/styling.css
@@ -1005,4 +1005,72 @@ VBox > .split-menu-button.last > .arrow-button {
.scroll-pane {
-fx-background-color: white;
+}
+
+#language-picker {
+ -fx-background-color: transparent;
+ -fx-border-color: transparent;
+ -fx-padding: 0;
+}
+
+#language-picker .context-menu {
+ -fx-padding: 0;
+}
+
+#language-picker .context-menu .menu-item {
+ -fx-padding: 10 0 0 5;
+}
+
+#language-picker .label {
+ -fx-padding: 0;
+ -fx-max-width: 0;
+}
+
+#language-picker .arrow,
+#language-picker .arrow-button {
+ -fx-opacity: 0;
+ -fx-max-width: 0;
+ -fx-padding: 0;
+}
+
+#language-picker .menu-item .label {
+ -fx-max-width: 0;
+ -fx-padding: 0;
+ -fx-label-padding: 0;
+}
+
+.language-icon.en {
+ -fx-image: url("lang/EN.png");
+}
+
+.language-icon.nl {
+ -fx-image: url("lang/NL.png");
+}
+
+.language-icon.fr {
+ -fx-image: url("lang/FR.png");
+}
+
+.language-icon.es {
+ -fx-image: url("lang/ES.png");
+}
+
+.language-icon.de {
+ -fx-image: url("lang/DE.png");
+}
+
+.language-icon.tr {
+ -fx-image: url("lang/TR.png");
+}
+
+.language-icon.pt {
+ -fx-image: url("lang/PT.png");
+}
+
+.language-icon.fi {
+ -fx-image: url("lang/FI.png");
+}
+
+.language-icon.it {
+ -fx-image: url("lang/IT.png");
}
\ No newline at end of file
diff --git a/G-Earth/src/main/resources/gearth/ui/titlebar/Titlebar.fxml b/G-Earth/src/main/resources/gearth/ui/titlebar/Titlebar.fxml
index d5c4bf6..2f92a39 100644
--- a/G-Earth/src/main/resources/gearth/ui/titlebar/Titlebar.fxml
+++ b/G-Earth/src/main/resources/gearth/ui/titlebar/Titlebar.fxml
@@ -5,54 +5,59 @@
-
+
-
+
+
-
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/G-Earth/src/main/resources/gearth/ui/translations/messages_de.properties b/G-Earth/src/main/resources/gearth/ui/translations/messages_de.properties
new file mode 100644
index 0000000..dea36c0
--- /dev/null
+++ b/G-Earth/src/main/resources/gearth/ui/translations/messages_de.properties
@@ -0,0 +1,329 @@
+# German (Translated by @MAIK#5094)
+
+! (English messages provided below, require translation to German)
+
+## Tabs
+
+### Tab - Connection
+tab.connection=Verbindung
+tab.connection.client=Client Typ:
+tab.connection.client.flash=Flash / Air
+tab.connection.client.unity=Unity
+tab.connection.client.nitro=Nitro
+tab.connection.version=Hotel Version:
+tab.connection.state=Verbindungsstatus:
+tab.connection.state.notconnected=Nicht verbunden.
+tab.connection.state.connected=Verbunden!
+tab.connection.state.waiting=Auf Verbindung warten...
+tab.connection.port=Port:
+tab.connection.host=Host:
+tab.connection.button.connect=Verbinden
+tab.connection.button.abort=Abbrechen
+tab.connection.autodetect=Automatisch
+
+### Tab - Injection
+tab.injection=Injektion
+tab.injection.corrupted=Paket fehlerhaft?
+tab.injection.corrupted.true=Ja
+tab.injection.corrupted.false=Nein
+tab.injection.description.header=Header
+tab.injection.description.packets=Pakete
+tab.injection.description.id=ID
+tab.injection.description.length=Länge
+tab.injection.send.toserver=Zum Server senden
+tab.injection.send.toclient=Zum Client senden
+tab.injection.history=Verlauf:
+tab.injection.history.clear=Leeren
+tab.injection.history.tooltip=Doppelklick, um ein Paket wiederherzustellen
+tab.injection.log.packetwithid=Paket mit ID
+
+### Tab - Tools
+tab.tools=Tools
+tab.tools.button.encode=kodieren
+tab.tools.button.decode=dekodieren
+tab.tools.type.integer=Ganze Zahl
+tab.tools.type.ushort=Kurze Zahl
+tab.tools.encoding=Codierung
+tab.tools.decoding=Dekodierung
+tab.tools.packet=Paket
+tab.tools.expression=Bezeichnung
+
+### Tab - Scheduler
+tab.scheduler=Ablauf
+tab.scheduler.table.index=Nr.
+tab.scheduler.table.packet=Paket
+tab.scheduler.table.interval=Intervall
+tab.scheduler.table.destination=Server/Client
+tab.scheduler.table.edit=Aktionen
+tab.scheduler.setup.packet=Paket
+tab.scheduler.setup.interval=Intervall
+tab.scheduler.button.clear=Leeren
+tab.scheduler.button.clear.tooltip=Alles löschen
+tab.scheduler.button.save=S
+tab.scheduler.button.save.tooltip=Datei speichern
+tab.scheduler.button.save.windowtitle=Planer Datei speichern
+tab.scheduler.button.load=Ö
+tab.scheduler.button.load.tooltip=Datei öffnen
+tab.scheduler.button.load.windowtitle=Ablauf-Datei öffnen
+tab.scheduler.button.add=Hinzufügen
+tab.scheduler.button.edit=Ändern
+tab.scheduler.direction.in=In
+tab.scheduler.direction.out=Out
+tab.scheduler.hotkeys=Hotkey nutzen (Strg+Shift+Nr.)
+tab.scheduler.filetype=Ablauf-Dateien (*.sched)
+
+### Tab - Extensions
+tab.extensions=Erweiterungen
+tab.extensions.table.title=Titel
+tab.extensions.table.description=Beschreibung
+tab.extensions.table.author=Autor(en)
+tab.extensions.table.version=Version
+tab.extensions.table.edit=Aktionen
+tab.extensions.table.edit.delete.tooltip=Verbindung der Erweiterung abbrechen
+tab.extensions.table.edit.restart.tooltip=Erweiterung neustarten
+tab.extensions.table.edit.uninstall.tooltip=Erweiterung deinstallieren
+tab.extensions.table.edit.uninstall.confirmation=Bist du dir sicher, dass du die Erweiterung deinstallieren möchtest?
+tab.extensions.port=Port
+tab.extensions.button.pythonshell=G-Python Shell
+tab.extensions.button.pythonshell.windowtitle=Scripting Shell
+tab.extensions.button.install=Installieren
+tab.extensions.button.install.windowtitle=Erweiterung installieren
+tab.extensions.button.install.filetype=G-Earth Erweiterungen
+tab.extensions.button.logs=Verlauf
+tab.extensions.button.logs.windowtitle=Verlauf der Erweiterungen
+
+### Tab - Extra
+tab.extra=Extras
+tab.extra.notepad=Notepad
+tab.extra.troubleshooting=Fehlerbehebungen
+tab.extra.options.alwaysontop=Immer im Vordergrund
+tab.extra.options.staffpermissions=Client-seitige Staff-Berechtigungen
+tab.extra.options.pythonscripting=G-Python Scripting
+tab.extra.options.pythonscripting.alert.title=G-Python Installation
+tab.extra.options.pythonscripting.alert.content=Bevor du G-Python verwendest, installiere die richtigen Pakete mit "pip"!
+tab.extra.options.pythonscripting.alert.moreinformation=Weitere Informationen hier:
+tab.extra.options.advanced=Erweitert
+tab.extra.options.advanced.socks=SOCKS Proxy benutzen
+tab.extra.options.advanced.proxy.ip=Proxy IP
+tab.extra.options.advanced.proxy.port=Proxy Port
+tab.extra.options.advanced.disabledecryption=Entschlüsselung deaktivieren
+tab.extra.options.advanced.debugstdout=Debuggen nach stdout
+
+### Tab - Info
+tab.info=Info
+tab.info.description=Habbo Paket-Manipulator für Linux, Windows & Mac
+tab.info.donate=BTC spenden
+tab.info.donate.alert.title=Bitcoins spenden
+tab.info.donate.alert.content=Öffentliche Bitcoin-Adresse:
+tab.info.createdby=Erstellt von
+tab.info.links=Links
+tab.info.contributors=Mitwirkende
+
+
+## Alert
+
+### Alert - Confirmation
+alert.confirmation.windowtitle=Halt, du musst vorher noch etwas bestätigen
+alert.confirmation.button.donotaskagain=Nicht nochmal nachfragen
+alert.confirmation.button.remember=Meine Auswahl merken
+
+### Alert - AdminValidator
+alert.adminvalidator.content=G-Earth braucht Administrator-Rechte, damit der Flash-Client funktioniert,\n\
+ bitte starte G-Earth mit Administrator-Rechten neu,\n\
+ außer du möchtest dich mit dem Unity-Client einloggen.
+
+### Alert - Outdated
+alert.outdated.title=Huch, G-Earth ist veraltet!
+alert.outdated.content.newversion=Eine neue Version von G-Earth wurde gefunden.
+alert.outdated.content.update=Auf neueste Version updaten
+
+### Alert - Invalid connection
+alert.invalidconnection.content=Du hast falsche Verbindungsinformationen eingegeben, G-Earth kann dazu keine Verbindung herstellen
+
+### Alert - Nitro root certificate
+alert.rootcertificate.title=Root Zertifikat Installation
+alert.rootcertificate.remember=Meine Auswahl merken
+alert.rootcertificate.content=G-Earth meldet, dass du noch nicht das Root Zertifikat installiert hast.\n\
+ Dies ist notwendig, damit der Nitro-Client funktioniert. Möchtest du fortfahren?\n\
+ G-Earth wird dich nach Administrator-Rechten fragen, wenn du fortfährst.
+
+### Alert - Already connected
+alert.alreadyconnected.content=G-Earth ist bereits zu diesem Hotel verbunden.\n\
+ Aufgrund aktuelles Einschränkungen, kannst du nur pro Hotel nur eine Verbindung aufbauen im Raw IP Modus auf Windows.\n\
+ \n\
+ Du kannst dies mit SOCKS Proxys umgehen [Extras -> Erweitert -> SOCKS]
+
+### Alert - Something went wrong
+alert.somethingwentwrong.title=Oops, etwas ist schiefgelaufen!
+alert.somethingwentwrong.content=Oops, da ist wohl etwas schiefgelaufen!\n\
+ \n\
+ Geh zu unserer Fehlerbehebungs-Seite, um das Problem zu lösen:
+
+### Alert - Allow extension connection
+alert.extconnection.content=Die Erweiterung "%s" versucht eine Verbindung zu G-Earth aufzubauen.\n\
+ Diese ist aber nicht in G-Earth bekannt, akzeptierst du trotzdem die Verbindung?
+
+### Alert - G-Python error
+alert.gpythonerror.title=G-Python Fehler
+alert.gpythonerror.content=Etwas ist schiefgelaufen beim Start von G-Python Shell,\n\
+ bist du sicher, dass du die Installation richtig durchgeführt hast?\n\
+ \n\
+ Weitere Informationen hier:
+
+
+## Internal extension
+
+### Internal extension - G-Erweiterungs-Laden
+ext.store.elapsedtime.second.single=Sekunde
+ext.store.elapsedtime.second.multiple=Sekunden
+ext.store.elapsedtime.minute.single=Minute
+ext.store.elapsedtime.minute.multiple=Minuten
+ext.store.elapsedtime.hour.single=Stunde
+ext.store.elapsedtime.hour.multiple=Stunden
+ext.store.elapsedtime.day.single=Tag
+ext.store.elapsedtime.day.multiple=Tagen
+ext.store.elapsedtime.week.single=Woche
+ext.store.elapsedtime.week.multiple=Wochen
+ext.store.elapsedtime.month.single=Monat
+ext.store.elapsedtime.month.multiple=Monaten
+ext.store.elapsedtime.year.single=Jahr
+ext.store.elapsedtime.year.multiple=Jahren
+
+ext.store.extension.version=Version
+ext.store.extension.rating=Bewertung
+ext.store.extension.madeby=von %s
+ext.store.extension.lastupdated=letzte Aktualisierung vor %s
+ext.store.extension.notinstore=Nicht im G-Erweiterungs-Laden gefunden
+
+ext.store.extension.details.description=Beschreibung
+ext.store.extension.details.authors=Autor(en)
+ext.store.extension.details.categories=Kategorie(n)
+ext.store.extension.details.technical_information=Technische Informationen:
+ext.store.extension.details.click_here=Hier klicken
+ext.store.extension.details.releases=Release
+ext.store.extension.details.language=Sprache
+ext.store.extension.details.source=Quelle
+ext.store.extension.details.framework=Framework
+ext.store.extension.details.systems=System(e)
+ext.store.extension.details.clients=Kompatibel mit folgenden Clienten
+ext.store.extension.details.screenshot=Screenshot
+
+ext.store.extension.author.reputation=Bewertungen
+ext.store.extension.author.releases=Releases
+
+ext.store.extension.warning.requirement=Warnung: Das Framework benötigt --url:additional installations-
+! IMPORTANT: the previous line has to end with the --url component like the english version
+ext.store.extension.warning.unstable=Warnung: Diese Erweiterung ist als instabil gekennzeichnet!
+
+ext.store.extension.status.await.install=Erweiterung installieren
+ext.store.extension.status.await.install.message=Klick auf "OK" und warte, bis die Erweiterung installiert ist
+ext.store.extension.status.await.update=Erweiterung aktualisieren
+ext.store.extension.status.await.update.message=Klick auf "OK" und warte bis die Erweiterung aktualisiert worden ist
+ext.store.extension.status.success.install=Installation beendet
+ext.store.extension.status.success.install.message=Die Erweiterung wurde erfolgreich installiert
+ext.store.extension.status.success.update=Aktualisierung beendet
+ext.store.extension.status.success.update.message=Die Erweiterung wurde erfolgreich aktualisiert
+ext.store.extension.status.error.install=Installation fehlgeschlagen
+ext.store.extension.status.error.install.message=Die Installation ist mit folgendem Hinweis fehlgeschlagen
+ext.store.extension.status.error.update=Aktualisierung fehlgeschlagen
+ext.store.extension.status.error.update.message=Die Aktualisierung ist mit folgendem Hinweis fehlgeschlagen
+
+ext.store.button.search=Suche
+ext.store.button.install=Installieren
+ext.store.button.installed=Installiert
+ext.store.button.update=Aktualisieren
+
+ext.store.search.title=Suche
+ext.store.search.description=Du bist auf der Suche nach Erweiterungen? Hier kannst du nach Erweiterungen suchen!
+ext.store.search.contenttitle=Erweiterung suchen
+ext.store.search.bykeyword=Nach Stichwort suchen
+ext.store.search.results=Suchergebnisse
+ext.store.search.ordering=Sortieren nach:
+ext.store.search.ordering.bydate.title=Neuste Releases
+ext.store.search.ordering.bydate.description=Diese Erweiterungen sind vor kurzem hinzugefügt worden.
+ext.store.search.ordering.bydate.contenttitle=Neuste Releases
+ext.store.search.ordering.byrating.title=Beliebte Erweiterungen
+ext.store.search.ordering.byrating.description=Diese Erweiterungen kommen gut bei anderen Nutzern an.
+ext.store.search.ordering.byrating.contenttitle=Beliebte Erweiterungen
+ext.store.search.ordering.byupdate.title=Zuletzt aktualisiert
+ext.store.search.ordering.byupdate.description=Diese Erweiterungen sind vor kurzem aktualisiert worden und somit auf dem neusten Stand!
+ext.store.search.ordering.byupdate.contenttitle=Vor kurzem aktualisiert
+ext.store.search.filter.clients=Client
+ext.store.search.filter.categories=Kategorien
+ext.store.search.filter.frameworks=Framework
+ext.store.search.info.automaticosfiltering=Hinweis: Du filterst automatisch nach dem Betriebssystem, welches du aktuell verwendest.
+
+ext.store.category=Kategorien
+
+ext.store.overview.title=Installierte Erweiterungen
+ext.store.overview.description=Hier siehst du alle Erweiterungen, die du bereits installiert hast.
+ext.store.overview.contenttitle=Bereits installierte Erweiterungen
+ext.store.overview.folder=Ordner öffnen
+
+ext.store.categories.title=Kategorien
+ext.store.categories.description=Hier findest du die verschiedesten Kategorien. Schau sie dir mal an, vielleicht findest du eine Erweiterung, die dir helfen kann.
+ext.store.categories.contenttitle=Kategorie
+
+ext.store.fail.unzip=Beim Entpacken ist ein Fehler aufgetreten
+ext.store.fail.invalidurl=Ungültige Erweiterungs-URL
+ext.store.fail.notavailable=Erweiterung nicht verfügbar
+ext.store.fail.alreadyexists=Oops, etwas ist beim Erstellen des Erweiterungs-Verzeichnis schiefgelaufen, existiert die Erweiterung bereits?
+ext.store.fail.notfound=Erweiterung nicht gefunden
+ext.store.fail.uninstall=Oops, etwas ist beim Deinstallieren der Erweiterung schiefgelaufen. Achte darauf, dass du die Erweiterung erst beendest und dann die Deinstallation beginnst.
+
+ext.store.ordering.rating=Bewertungen
+ext.store.ordering.alphabetical=Alphabet (A-Z)
+ext.store.ordering.lastupdated=Zuletzt aktualisiert
+ext.store.ordering.newreleases=Neuste Release
+
+### Internal extension - Logger
+ext.logger.menu.window=Fenster
+ext.logger.menu.window.alwaysontop=Immer im Vordergrund
+ext.logger.menu.window.onconnect=Beim verbinden ...
+ext.logger.menu.window.onconnect.openwindow=Fenster öffnen
+ext.logger.menu.window.onconnect.reset=Paketlogger reseten
+ext.logger.menu.window.ondisconnect=Beim beenden ...
+ext.logger.menu.window.ondisconnect.hidewindow=Fenster verstecken
+ext.logger.menu.window.ondisconnect.reset=Paketlogger reseten
+
+ext.logger.menu.view=Ein-/Ausblenden
+ext.logger.menu.view.incoming=Incoming (ankommende) Pakete anzeigen
+ext.logger.menu.view.outgoing=Outgoing (weggehende) Pakete anzeigen
+ext.logger.menu.view.autoscroll=Automatisch scrollen
+ext.logger.menu.view.cleartext=Inhalt leeren
+
+ext.logger.menu.packets=Pakete
+ext.logger.menu.packets.displaydetails=Details anzeigen
+ext.logger.menu.packets.displaydetails.byterep=Byte-Darstellung
+ext.logger.menu.packets.displaydetails.byterep.legacy=Legacy
+ext.logger.menu.packets.displaydetails.byterep.hexdump=Hexdump
+ext.logger.menu.packets.displaydetails.byterep.rawhex=Raw hex
+ext.logger.menu.packets.displaydetails.byterep.none=Keine
+ext.logger.menu.packets.displaydetails.message=Message
+ext.logger.menu.packets.displaydetails.message.name=Name
+ext.logger.menu.packets.displaydetails.message.hash=Hash
+ext.logger.menu.packets.displaydetails.message.id=ID
+ext.logger.menu.packets.displaydetails.structure=Structure
+ext.logger.menu.packets.displaydetails.timestamp=Timestamp
+ext.logger.menu.packets.antispam=Anti-Spam Filter
+ext.logger.menu.packets.antispam.none=Keiner
+ext.logger.menu.packets.antispam.low=Gering
+ext.logger.menu.packets.antispam.med=Medium
+ext.logger.menu.packets.antispam.high=Hoch
+ext.logger.menu.packets.antispam.ultra=Sehr hoch
+ext.logger.menu.packets.skipbig=Große Pakete überspringen
+ext.logger.menu.packets.exportall=Alle Pakete exportieren
+ext.logger.menu.packets.exportall.windowtitle=Pakete speichern
+ext.logger.menu.packets.exportall.filetype=.TXT Dateien
+
+ext.logger.state.packetinfo=Paket-Info
+ext.logger.state.filtered=Gefiltert
+
+ext.logger.element.timestamp=Zeitstempel
+ext.logger.element.blocked=Blockiert
+ext.logger.element.replaced=Ersetzt
+ext.logger.element.direction.outgoing=Outgoing (weggehen)
+ext.logger.element.direction.incoming=Incoming (ankommen)
+ext.logger.element.skipped=Paket übersprungen
+ext.logger.state.true=Ja
+ext.logger.state.false=Nein
\ No newline at end of file
diff --git a/G-Earth/src/main/resources/gearth/ui/translations/messages_en.properties b/G-Earth/src/main/resources/gearth/ui/translations/messages_en.properties
new file mode 100644
index 0000000..5171b37
--- /dev/null
+++ b/G-Earth/src/main/resources/gearth/ui/translations/messages_en.properties
@@ -0,0 +1,325 @@
+# English (Original)
+
+## Tabs
+
+### Tab - Connection
+tab.connection=Connection
+tab.connection.client=Client type:
+tab.connection.client.flash=Flash / Air
+tab.connection.client.unity=Unity
+tab.connection.client.nitro=Nitro
+tab.connection.version=Hotel version:
+tab.connection.state=Connection state:
+tab.connection.state.notconnected=Not connected
+tab.connection.state.connected=Connected
+tab.connection.state.waiting=Waiting for connection
+tab.connection.port=Port:
+tab.connection.host=Host:
+tab.connection.button.connect=Connect
+tab.connection.button.abort=Abort
+tab.connection.autodetect=Auto-detect
+
+### Tab - Injection
+tab.injection=Injection
+tab.injection.corrupted=isCorrupted
+tab.injection.corrupted.true=True
+tab.injection.corrupted.false=False
+tab.injection.description.header=header
+tab.injection.description.packets=packets
+tab.injection.description.id=id
+tab.injection.description.length=length
+tab.injection.send.toserver=Send to server
+tab.injection.send.toclient=Send to client
+tab.injection.history=History:
+tab.injection.history.clear=Clear
+tab.injection.history.tooltip=Double click a packet to restore it
+tab.injection.log.packetwithid=Packet with id
+
+### Tab - Tools
+tab.tools=Tools
+tab.tools.button.encode=Encode
+tab.tools.button.decode=Decode
+tab.tools.type.integer=Integer
+tab.tools.type.ushort=Ushort
+tab.tools.encoding=Encoding
+tab.tools.decoding=Decoding
+tab.tools.packet=Packet
+tab.tools.expression=Expression
+### Tab - Scheduler
+tab.scheduler=Scheduler
+tab.scheduler.table.index=Index
+tab.scheduler.table.packet=Packet
+tab.scheduler.table.interval=Interval
+tab.scheduler.table.destination=Destination
+tab.scheduler.table.edit=Edit
+tab.scheduler.setup.packet=Packet
+tab.scheduler.setup.interval=Interval
+tab.scheduler.button.clear=Clear
+tab.scheduler.button.clear.tooltip=Clear all items
+tab.scheduler.button.save=S
+tab.scheduler.button.save.tooltip=Save to file
+tab.scheduler.button.save.windowtitle=Save Schedule File
+tab.scheduler.button.load=L
+tab.scheduler.button.load.tooltip=Load from file
+tab.scheduler.button.load.windowtitle=Load Schedule File
+tab.scheduler.button.add=Add
+tab.scheduler.button.edit=Edit
+tab.scheduler.direction.in=In
+tab.scheduler.direction.out=Out
+tab.scheduler.hotkeys=Enable hotkeys (Ctrl+Shift+Index)
+tab.scheduler.filetype=Schedule Files (*.sched)
+
+### Tab - Extensions
+tab.extensions=Extensions
+tab.extensions.table.title=Title
+tab.extensions.table.description=Description
+tab.extensions.table.author=Author
+tab.extensions.table.version=Version
+tab.extensions.table.edit=Edit
+tab.extensions.table.edit.delete.tooltip=Close connection with this extension
+tab.extensions.table.edit.restart.tooltip=Restart this extension
+tab.extensions.table.edit.uninstall.tooltip=Uninstall this extension
+tab.extensions.table.edit.uninstall.confirmation=Are you sure want to uninstall this extension?
+tab.extensions.port=Port
+tab.extensions.button.pythonshell=G-Python shell
+tab.extensions.button.pythonshell.windowtitle=Scripting shell
+tab.extensions.button.install=Install
+tab.extensions.button.install.windowtitle=Install extension
+tab.extensions.button.install.filetype=G-Earth extensions
+tab.extensions.button.logs=View logs
+tab.extensions.button.logs.windowtitle=Extension Console
+
+### Tab - Extra
+tab.extra=Extra
+tab.extra.notepad=Notepad
+tab.extra.troubleshooting=Troubleshooting
+tab.extra.options.alwaysontop=Always on top
+tab.extra.options.staffpermissions=Client-side staff permissions
+tab.extra.options.pythonscripting=G-Python scripting
+tab.extra.options.pythonscripting.alert.title=G-Python installation
+tab.extra.options.pythonscripting.alert.content=Before using G-Python, install the right packages using pip!
+tab.extra.options.pythonscripting.alert.moreinformation=More information here:
+tab.extra.options.advanced=Advanced
+tab.extra.options.advanced.socks=Use SOCKS proxy
+tab.extra.options.advanced.proxy.ip=Proxy IP
+tab.extra.options.advanced.proxy.port=Proxy port
+tab.extra.options.advanced.disabledecryption=Disable decryption
+tab.extra.options.advanced.debugstdout=Debug to stdout
+
+### Tab - Info
+tab.info=Info
+tab.info.description=Habbo packet manipulator for Linux, Windows & Mac
+tab.info.donate=Donate BTC
+tab.info.donate.alert.title=Donate Bitcoins
+tab.info.donate.alert.content=Bitcoin public address:
+tab.info.createdby=Created by
+tab.info.links=Links
+tab.info.contributors=Contributors
+
+
+## Alert
+
+### Alert - Confirmation
+alert.confirmation.windowtitle=Confirmation Dialog
+alert.confirmation.button.donotaskagain=Do not ask again
+alert.confirmation.button.remember=Remember my choice
+
+### Alert - AdminValidator
+alert.adminvalidator.content=G-Earth needs admin privileges in order to work on Flash,\n\
+ please restart G-Earth with admin permissions unless\n\
+ you're using Unity
+
+### Alert - Outdated
+alert.outdated.title=G-Earth is outdated!
+alert.outdated.content.newversion=A new version of G-Earth has been found
+alert.outdated.content.update=Update to the latest version
+
+### Alert - Invalid connection
+alert.invalidconnection.content=You entered invalid connection information, G-Earth could not connect
+
+### Alert - Nitro root certificate
+alert.rootcertificate.title=Root certificate installation
+alert.rootcertificate.remember=Remember my choice
+alert.rootcertificate.content=G-Earth detected that you do not have the root certificate authority installed.\n\
+ This is required for Nitro to work, do you want to continue?\n\
+ G-Earth will ask you for Administrator permission if you do so.
+
+### Alert - Already connected
+alert.alreadyconnected.content=G-Earth is already connected to this hotel.\n\
+ Due to current limitations you can only connect one session per hotel to G-Earth in Raw IP mode on Windows.\n\
+ \n\
+ You can bypass this by using a SOCKS proxy [Extra -> Advanced -> SOCKS]
+
+### Alert - Something went wrong
+alert.somethingwentwrong.title=Something went wrong!
+alert.somethingwentwrong.content=Something went wrong!\n\
+ \n\
+ Head over to our Troubleshooting page to solve the problem:
+
+### Alert - Allow extension connection
+alert.extconnection.content=Extension "%s" tries to connect but isn't known to G-Earth,\n\
+ accept this connection?
+
+### Alert - G-Python error
+alert.gpythonerror.title=G-Python error
+alert.gpythonerror.content=Something went wrong launching the G-Python shell,\n\
+ are you sure you followed the installation guide correctly?\n\
+ \n\
+ More information here:
+
+
+## Internal extension
+
+### Internal extension - G-ExtensionStore
+ext.store.elapsedtime.second.single=second
+ext.store.elapsedtime.second.multiple=seconds
+ext.store.elapsedtime.minute.single=minute
+ext.store.elapsedtime.minute.multiple=minutes
+ext.store.elapsedtime.hour.single=hour
+ext.store.elapsedtime.hour.multiple=hours
+ext.store.elapsedtime.day.single=day
+ext.store.elapsedtime.day.multiple=days
+ext.store.elapsedtime.week.single=week
+ext.store.elapsedtime.week.multiple=weeks
+ext.store.elapsedtime.month.single=month
+ext.store.elapsedtime.month.multiple=months
+ext.store.elapsedtime.year.single=year
+ext.store.elapsedtime.year.multiple=years
+
+ext.store.extension.version=Version
+ext.store.extension.rating=Rating
+ext.store.extension.madeby=By %s
+ext.store.extension.lastupdated=last updated %s ago
+ext.store.extension.notinstore=Not found in G-ExtensionStore
+
+ext.store.extension.details.description=Description
+ext.store.extension.details.authors=Author(s)
+ext.store.extension.details.categories=Categories
+ext.store.extension.details.technical_information=Technical information
+ext.store.extension.details.click_here=Click here
+ext.store.extension.details.releases=Releases
+ext.store.extension.details.language=Language
+ext.store.extension.details.source=Source
+ext.store.extension.details.framework=Framework
+ext.store.extension.details.systems=Systems
+ext.store.extension.details.clients=Compatible clients
+ext.store.extension.details.screenshot=Screenshot
+
+ext.store.extension.author.reputation=reputation
+ext.store.extension.author.releases=releases
+
+ext.store.extension.warning.requirement=Warning: the framework requires --url:additional installations-
+! IMPORTANT: the previous line has to end with the --url component like the english version
+ext.store.extension.warning.unstable=Warning: this extension has been marked unstable!
+
+ext.store.extension.status.await.install=Install extension
+ext.store.extension.status.await.install.message=Press "OK" and wait while the extension is begin installed
+ext.store.extension.status.await.update=Update extension
+ext.store.extension.status.await.update.message=Press "OK" and wait while the extension is begin updated
+ext.store.extension.status.success.install=Install completed
+ext.store.extension.status.success.install.message=Extension installation completed successfully
+ext.store.extension.status.success.update=Update completed
+ext.store.extension.status.success.update.message=Extension update completed successfully
+ext.store.extension.status.error.install=Install failed
+ext.store.extension.status.error.install.message=Installation failed with the following message
+ext.store.extension.status.error.update=Update failed
+ext.store.extension.status.error.update.message=Update failed with the following message
+
+ext.store.button.search=Search
+ext.store.button.install=Install
+ext.store.button.installed=Installed
+ext.store.button.update=Update
+
+ext.store.search.title=Search
+ext.store.search.description=Find the extension that fits your needs
+ext.store.search.contenttitle=Search extensions
+ext.store.search.bykeyword=Search by keyword
+ext.store.search.results=Search results
+ext.store.search.ordering=Extensions ordering
+ext.store.search.ordering.bydate.title=New Releases
+ext.store.search.ordering.bydate.description=Extensions that were recently added to the G-ExtensionStore
+ext.store.search.ordering.bydate.contenttitle=New Releases
+ext.store.search.ordering.byrating.title=Popular Extensions
+ext.store.search.ordering.byrating.description=Extensions sorted by rating
+ext.store.search.ordering.byrating.contenttitle=Popular Extensions
+ext.store.search.ordering.byupdate.title=Recently Updated
+ext.store.search.ordering.byupdate.description=Extensions that were recently updated
+ext.store.search.ordering.byupdate.contenttitle=Recently Updated
+ext.store.search.filter.clients=Clients
+ext.store.search.filter.categories=Categories
+ext.store.search.filter.frameworks=Frameworks
+ext.store.search.info.automaticosfiltering=Info: you are automatically filtering on the OS you use
+
+ext.store.category=Category
+
+ext.store.overview.title=Installed Extensions
+ext.store.overview.description=Extensions that are already installed into G-Earth
+ext.store.overview.contenttitle=Installed extensions
+ext.store.overview.folder=Open folder
+
+ext.store.categories.title=Categories
+ext.store.categories.description=Explore the different kinds of extensions G-Earth has to offer
+ext.store.categories.contenttitle=Categories
+
+ext.store.fail.unzip=Error while unzipping
+ext.store.fail.invalidurl=Invalid extension URL
+ext.store.fail.notavailable=Extension not available in repository
+ext.store.fail.alreadyexists=Something went wrong creating the extension directory, does the extension already exist?
+ext.store.fail.notfound=Extension wasn't found
+ext.store.fail.uninstall=Something went wrong with uninstalling the extension, make sure to disconnect the extension if it was still running.
+
+ext.store.ordering.rating=Rating
+ext.store.ordering.alphabetical=Alphabetical
+ext.store.ordering.lastupdated=Last updated
+ext.store.ordering.newreleases=New releases
+
+### Internal extension - Logger
+ext.logger.menu.window=Window
+ext.logger.menu.window.alwaysontop=Always on top
+ext.logger.menu.window.onconnect=On connect
+ext.logger.menu.window.onconnect.openwindow=Open window
+ext.logger.menu.window.onconnect.reset=Reset packetlogger
+ext.logger.menu.window.ondisconnect=On disconnect
+ext.logger.menu.window.ondisconnect.hidewindow=Hide window
+ext.logger.menu.window.ondisconnect.reset=Reset packetlogger
+
+ext.logger.menu.view=View
+ext.logger.menu.view.incoming=View incoming
+ext.logger.menu.view.outgoing=View outgoing
+ext.logger.menu.view.autoscroll=Autoscroll
+ext.logger.menu.view.cleartext=Clear text
+
+ext.logger.menu.packets=Packets
+ext.logger.menu.packets.displaydetails=Display details
+ext.logger.menu.packets.displaydetails.byterep=Byte representation
+ext.logger.menu.packets.displaydetails.byterep.legacy=Legacy
+ext.logger.menu.packets.displaydetails.byterep.hexdump=Hexdump
+ext.logger.menu.packets.displaydetails.byterep.rawhex=Raw hex
+ext.logger.menu.packets.displaydetails.byterep.none=None
+ext.logger.menu.packets.displaydetails.message=Message
+ext.logger.menu.packets.displaydetails.message.name=Name
+ext.logger.menu.packets.displaydetails.message.hash=Hash
+ext.logger.menu.packets.displaydetails.message.id=Id
+ext.logger.menu.packets.displaydetails.structure=Structure
+ext.logger.menu.packets.displaydetails.timestamp=Timestamp
+ext.logger.menu.packets.antispam=Anti-spam filter
+ext.logger.menu.packets.antispam.none=None
+ext.logger.menu.packets.antispam.low=Low
+ext.logger.menu.packets.antispam.med=Medium
+ext.logger.menu.packets.antispam.high=High
+ext.logger.menu.packets.antispam.ultra=Ultra
+ext.logger.menu.packets.skipbig=Skip big packets
+ext.logger.menu.packets.exportall=Export all
+ext.logger.menu.packets.exportall.windowtitle=Save Packets
+ext.logger.menu.packets.exportall.filetype=TXT files
+
+ext.logger.state.packetinfo=Packet info
+ext.logger.state.filtered=Filtered
+ext.logger.element.timestamp=timestamp
+ext.logger.element.blocked=Blocked
+ext.logger.element.replaced=Replaced
+ext.logger.element.direction.outgoing=Outgoing
+ext.logger.element.direction.incoming=Incoming
+ext.logger.element.skipped=packet skipped
+ext.logger.state.true=True
+ext.logger.state.false=False
diff --git a/G-Earth/src/main/resources/gearth/ui/translations/messages_es.properties b/G-Earth/src/main/resources/gearth/ui/translations/messages_es.properties
new file mode 100644
index 0000000..e7b19f0
--- /dev/null
+++ b/G-Earth/src/main/resources/gearth/ui/translations/messages_es.properties
@@ -0,0 +1,325 @@
+# Spanish (Translated by denio4321)
+
+## Tabs
+
+### Tab - Connection
+tab.connection=Conexión
+tab.connection.client=Tipo de cliente:
+tab.connection.client.flash=Flash / Air
+tab.connection.client.unity=Unity
+tab.connection.client.nitro=Nitro
+tab.connection.version=Versión del Hotel:
+tab.connection.state=Estado de la conexión:
+tab.connection.state.notconnected=No conectado
+tab.connection.state.connected=Conectado
+tab.connection.state.waiting=Esperando para la conexión
+tab.connection.port=Puerto:
+tab.connection.host=Host:
+tab.connection.button.connect=Conectar
+tab.connection.button.abort=Abortar
+tab.connection.autodetect=Auto-Detección
+
+### Tab - Injection
+tab.injection=Inyectar
+tab.injection.corrupted=isCorrupted
+tab.injection.corrupted.true=True
+tab.injection.corrupted.false=False
+tab.injection.description.header=header
+tab.injection.description.packets=packets
+tab.injection.description.id=id
+tab.injection.description.length=longitud
+tab.injection.send.toserver=Enviar al servidor
+tab.injection.send.toclient=Enviar a cliente
+tab.injection.history=Historial
+tab.injection.history.clear=Borrar
+tab.injection.history.tooltip=Doble click para restaurar un paquete.
+tab.injection.log.packetwithid=Paquete con id
+
+### Tab - Tools
+tab.tools=Herramientas
+tab.tools.button.encode=Codificar
+tab.tools.button.decode=Decodificar
+tab.tools.type.integer=Integer
+tab.tools.type.ushort=Ushort
+tab.tools.encoding=Encoding
+tab.tools.decoding=Decoding
+tab.tools.packet=Packet
+tab.tools.expression=Expression
+
+### Tab - Scheduler
+tab.scheduler=Planificador
+tab.scheduler.table.index=Index
+tab.scheduler.table.packet=Packet
+tab.scheduler.table.interval=Interval
+tab.scheduler.table.destination=Destinación
+tab.scheduler.table.edit=Editar
+tab.scheduler.setup.packet=Packet
+tab.scheduler.setup.interval=Interval
+tab.scheduler.button.clear=Borrar
+tab.scheduler.button.clear.tooltip=Borrar todos los items
+tab.scheduler.button.save=S
+tab.scheduler.button.save.tooltip=Guardar a un archivo
+tab.scheduler.button.save.windowtitle=Guardar Planificador a un archivo
+tab.scheduler.button.load=L
+tab.scheduler.button.load.tooltip=Cargar de un archivo
+tab.scheduler.button.load.windowtitle=Cargar archivo Planificador
+tab.scheduler.button.add=Añadir
+tab.scheduler.button.edit=Editar
+tab.scheduler.direction.in=In
+tab.scheduler.direction.out=Out
+tab.scheduler.hotkeys=Activar Atajos (Ctrl+Shift+Index)
+tab.scheduler.filetype=Archivos Planificador (*.sched)
+
+### Tab - Extensions
+tab.extensions=Extensiones
+tab.extensions.table.title=Titulo
+tab.extensions.table.description=Descripción
+tab.extensions.table.author=Autor
+tab.extensions.table.version=Versión
+tab.extensions.table.edit=Editar
+tab.extensions.table.edit.delete.tooltip=Cerrar la conexión de esta extensión
+tab.extensions.table.edit.restart.tooltip=Reiniciar extensión
+tab.extensions.table.edit.uninstall.tooltip=Desinstalar esta extensión
+tab.extensions.table.edit.uninstall.confirmation=¿Seguro que quieres desinstalar esta extensión?
+tab.extensions.port=Port
+tab.extensions.button.pythonshell=G-Python shell
+tab.extensions.button.pythonshell.windowtitle=Scripting shell
+tab.extensions.button.install=Instalar
+tab.extensions.button.install.windowtitle=Instalar extensión
+tab.extensions.button.install.filetype=Extensiones de G-Earth
+tab.extensions.button.logs=Ver logs
+tab.extensions.button.logs.windowtitle=Consola de extensión
+
+### Tab - Extra
+tab.extra=Extra
+tab.extra.notepad=Notepad
+tab.extra.troubleshooting=Ayuda
+tab.extra.options.alwaysontop=Mostrar siempre arriba
+tab.extra.options.staffpermissions=Permisos Staff en cliente
+tab.extra.options.pythonscripting=G-Python scripting
+tab.extra.options.pythonscripting.alert.title=Instalación de G-Python
+tab.extra.options.pythonscripting.alert.content=Antes de instalar G-Python, instala los paquetes con pip!
+tab.extra.options.pythonscripting.alert.moreinformation=Mas información aqui:
+tab.extra.options.advanced=Avanzado
+tab.extra.options.advanced.socks=Usar proxy SOCKS
+tab.extra.options.advanced.proxy.ip=Proxy IP
+tab.extra.options.advanced.proxy.port=Proxy port
+tab.extra.options.advanced.disabledecryption=Deshabilitar desencriptación
+tab.extra.options.advanced.debugstdout=Debug to stdout
+
+### Tab - Info
+tab.info=Info
+tab.info.description=Habbo packet manipulador para Linux, Windows & Mac
+tab.info.donate=Donar BTC
+tab.info.donate.alert.title=Donar Bitcoins
+tab.info.donate.alert.content=Dirección pública de bitcoins:
+tab.info.createdby=Creado por
+tab.info.links=Enlaces
+tab.info.contributors=Contribuidores
+
+
+## Alert
+
+### Alert - Confirmation
+alert.confirmation.windowtitle=Diálogo de confirmación
+alert.confirmation.button.donotaskagain=No me preguntes de nuevo
+alert.confirmation.button.remember=Recordar mi elección
+
+### Alert - AdminValidator
+alert.adminvalidator.content=G-Earth necesita permisos de administrador para funcionar en flash,\n\
+ por favor reinicie G-Earth con los permisos si no estás usando Unity
+
+### Alert - Outdated
+alert.outdated.title=¡G-Earth está desactualizado!
+alert.outdated.content.newversion=Una nueva versión de G-Earth ha sido encontrada
+alert.outdated.content.update=Actualizar a la versión mas reciente
+
+### Alert - Invalid connection
+alert.invalidconnection.content=Has introducida una conexión inválida, G-Earth no se ha podido conectar
+
+### Alert - Nitro root certificate
+alert.rootcertificate.title=Instalar Certificado Root
+alert.rootcertificate.remember=Recordar mi elección
+alert.rootcertificate.content=G-Earth detectó que no tienes un certificado de autoridad root instalado.\n\
+ Esto es requerido para que Nitro funcione, ¿Quieres continuar?\n\
+ G-Earth te pedirá permisos de administrador para instalarlo.
+
+### Alert - Already connected
+alert.alreadyconnected.content=G-Earth ya está conectado a este hotel.\n\
+ Debido a actuales limitaciones solo puedes conectarte una sesión por hotel a G-Earth en el modo Raw IP.\n\
+ \n\
+ Puedes saltarte esto usando un proxy SOCKS [Extra -> Avanzado -> SOCKS]
+
+### Alert - Something went wrong
+alert.somethingwentwrong.title=¡Algo ha salido mal!
+alert.somethingwentwrong.content=¡Algo ha salido mal!\n\
+ \n\
+ Ve a nuestra página de ayuda para solucionar el problema:
+
+### Alert - Allow extension connection
+alert.extconnection.content=La extensión "%s" intenta conectarse pero es desconocida para G-Earth,\n\
+ ¿Aceptar conexión?
+
+### Alert - G-Python error
+alert.gpythonerror.title=G-Python error
+alert.gpythonerror.content=Algo ha salido mal al iniciar la G-Python shell,\n\
+ ¿Estás seguro de que has seguido la guia correctamente?\n\
+ \n\
+ Mas información aqui:
+
+
+## Internal extension
+
+### Internal extension - G-ExtensionStore
+ext.store.elapsedtime.second.single=segundo
+ext.store.elapsedtime.second.multiple=segundos
+ext.store.elapsedtime.minute.single=minuto
+ext.store.elapsedtime.minute.multiple=minutos
+ext.store.elapsedtime.hour.single=hora
+ext.store.elapsedtime.hour.multiple=horas
+ext.store.elapsedtime.day.single=día
+ext.store.elapsedtime.day.multiple=dias
+ext.store.elapsedtime.week.single=semana
+ext.store.elapsedtime.week.multiple=semanas
+ext.store.elapsedtime.month.single=mes
+ext.store.elapsedtime.month.multiple=meses
+ext.store.elapsedtime.year.single=año
+ext.store.elapsedtime.year.multiple=años
+
+ext.store.extension.version=Versión
+ext.store.extension.rating=Valoración
+ext.store.extension.madeby=Por %s
+ext.store.extension.lastupdated=Última actualización hace %s
+ext.store.extension.notinstore=No encontrado en G-ExtensionStore
+
+ext.store.extension.details.description=Descripción
+ext.store.extension.details.authors=Autor(es)
+ext.store.extension.details.categories=Categorias
+ext.store.extension.details.technical_information=Información técnica
+ext.store.extension.details.click_here=Pulsa aqui
+ext.store.extension.details.releases=Versiones
+ext.store.extension.details.language=Lenguaje
+ext.store.extension.details.source=Source
+ext.store.extension.details.framework=Framework
+ext.store.extension.details.systems=Sistemas
+ext.store.extension.details.clients=Clientes compatibles
+ext.store.extension.details.screenshot=Capturas de pantalla
+
+ext.store.extension.author.reputation=reputación
+ext.store.extension.author.releases=Versiones
+ext.store.extension.warning.requirement=Atención: el framework requiere --url:instalaciones adicionales-
+! IMPORTANT: the previous line has to end with the --url component like the english version
+ext.store.extension.warning.unstable=Atención: ¡Esta extensión está marcada como no estable!
+
+ext.store.extension.status.await.install=Instalar extensión
+ext.store.extension.status.await.install.message=Presione "OK" y espere mientras comienza la instalación
+ext.store.extension.status.await.update=Actualizar extension
+ext.store.extension.status.await.update.message=Presione "OK" y espere mientras comienza la actualización
+ext.store.extension.status.success.install=Instalación completa
+ext.store.extension.status.success.install.message=La instalación se ha completado satisfactoriamente
+ext.store.extension.status.success.update=Actualización completa
+ext.store.extension.status.success.update.message=La actualización se ha completado satisfactoriamente
+ext.store.extension.status.error.install=Instalación fallida
+ext.store.extension.status.error.install.message=Instalación fallida con el siguiente mensaje
+ext.store.extension.status.error.update=Actualización fallida
+ext.store.extension.status.error.update.message=Actualización fallida con el siguiente mensaje
+
+ext.store.button.search=Buscar
+ext.store.button.install=Instalar
+ext.store.button.installed=Instalados
+ext.store.button.update=Actualizar
+
+ext.store.search.title=Buscar
+ext.store.search.description=Busca la extensión que mejor satisface tus necesidades
+ext.store.search.contenttitle=Buscar extensions
+ext.store.search.bykeyword=Buscar por palabras clave
+ext.store.search.results=Resultados de la busqueda
+ext.store.search.ordering=Orden de extensiones
+ext.store.search.ordering.bydate.title=Nuevas extensiones
+ext.store.search.ordering.bydate.description=Extensiones que han sido recientemente añadidas a la G-ExtensionStore
+ext.store.search.ordering.bydate.contenttitle=Nuevas extensiones
+ext.store.search.ordering.byrating.title=Extensiones populares
+ext.store.search.ordering.byrating.description=Extensiones por valoración
+ext.store.search.ordering.byrating.contenttitle=Extensiones populares
+ext.store.search.ordering.byupdate.title=Recientemente actualizadas
+ext.store.search.ordering.byupdate.description=Extensiones que han sido recientemente actualizadas
+ext.store.search.ordering.byupdate.contenttitle=Recientemente actualizadas
+ext.store.search.filter.clients=Clientes
+ext.store.search.filter.categories=Categorias
+ext.store.search.filter.frameworks=Frameworks
+ext.store.search.info.automaticosfiltering=Nota: automaticamente se filtran las extensiones disponibles al OS que estás utilizando
+
+ext.store.category=Categoria
+
+ext.store.overview.title=Extensiones Instaladas
+ext.store.overview.description=Extensiones que ya están instaladas en G-Earth
+ext.store.overview.contenttitle=Extensiones Instaladas
+ext.store.overview.folder=Abrir carpeta
+
+ext.store.categories.title=Categorias
+ext.store.categories.description=Explora las diferentes categorias que G-Earth tiene por ofrecerte
+ext.store.categories.contenttitle=Categorias
+
+ext.store.fail.unzip=Error while unzipping
+ext.store.fail.invalidurl=Invalid extension URL
+ext.store.fail.notavailable=Extension not available in repository
+ext.store.fail.alreadyexists=Something went wrong creating the extension directory, does the extension already exist?
+ext.store.fail.notfound=Extension wasn't found
+ext.store.fail.uninstall=Something went wrong with uninstalling the extension, make sure to disconnect the extension if it was still running.
+
+ext.store.ordering.rating=Rating
+ext.store.ordering.alphabetical=Alphabetical
+ext.store.ordering.lastupdated=Last updated
+ext.store.ordering.newreleases=New releases
+
+### Internal extension - Logger
+ext.logger.menu.window=Ventana
+ext.logger.menu.window.alwaysontop=Siempre arriba
+ext.logger.menu.window.onconnect=Al conectar
+ext.logger.menu.window.onconnect.openwindow=Abrir ventana
+ext.logger.menu.window.onconnect.reset=Reiniciar packetlogger
+ext.logger.menu.window.ondisconnect=Al desconectar
+ext.logger.menu.window.ondisconnect.hidewindow=Esconder ventana
+ext.logger.menu.window.ondisconnect.reset=Reiniciar packetlogger
+
+ext.logger.menu.view=Vista
+ext.logger.menu.view.incoming=Mostrar incoming
+ext.logger.menu.view.outgoing=Mostrar outgoing
+ext.logger.menu.view.autoscroll=Autoscroll
+ext.logger.menu.view.cleartext=Limpiar texto
+
+ext.logger.menu.packets=Packets
+ext.logger.menu.packets.displaydetails=Mostrar detalles
+ext.logger.menu.packets.displaydetails.byterep=Representación Byte
+ext.logger.menu.packets.displaydetails.byterep.legacy=Legacy
+ext.logger.menu.packets.displaydetails.byterep.hexdump=Hexdump
+ext.logger.menu.packets.displaydetails.byterep.rawhex=Raw hex
+ext.logger.menu.packets.displaydetails.byterep.none=Ninguno
+ext.logger.menu.packets.displaydetails.message=Message
+ext.logger.menu.packets.displaydetails.message.name=Nombre
+ext.logger.menu.packets.displaydetails.message.hash=Hash
+ext.logger.menu.packets.displaydetails.message.id=Id
+ext.logger.menu.packets.displaydetails.structure=Structure
+ext.logger.menu.packets.displaydetails.timestamp=Hora
+ext.logger.menu.packets.antispam=Filtro Anti-spam
+ext.logger.menu.packets.antispam.none=None
+ext.logger.menu.packets.antispam.low=Bajo
+ext.logger.menu.packets.antispam.med=Medio
+ext.logger.menu.packets.antispam.high=Alto
+ext.logger.menu.packets.antispam.ultra=Ultra
+ext.logger.menu.packets.skipbig=Saltar paquetes grandes
+ext.logger.menu.packets.exportall=Exportar todos
+ext.logger.menu.packets.exportall.windowtitle=Guardar Packets
+ext.logger.menu.packets.exportall.filetype=archivos TXT
+
+ext.logger.state.packetinfo=Packet info
+ext.logger.state.filtered=Filtrado
+
+ext.logger.element.timestamp=hora
+ext.logger.element.blocked=Bloqueado
+ext.logger.element.replaced=Replazado
+ext.logger.element.direction.outgoing=Outgoing
+ext.logger.element.direction.incoming=Incoming
+ext.logger.element.skipped=packet skipped
+ext.logger.state.true=True
+ext.logger.state.false=False
diff --git a/G-Earth/src/main/resources/gearth/ui/translations/messages_fi.properties b/G-Earth/src/main/resources/gearth/ui/translations/messages_fi.properties
new file mode 100644
index 0000000..492d870
--- /dev/null
+++ b/G-Earth/src/main/resources/gearth/ui/translations/messages_fi.properties
@@ -0,0 +1,325 @@
+# Finnish (Translated by justeeri)
+
+## Tabs
+
+### Tab - Connection
+tab.connection=Yhteys
+tab.connection.client=Asiakasohjelma:
+tab.connection.client.flash=Flash / Air
+tab.connection.client.unity=Unity
+tab.connection.client.nitro=Nitro
+tab.connection.version=Versio
+tab.connection.state=Yhteyden tila:
+tab.connection.state.notconnected=Ei yhdistetty
+tab.connection.state.connected=Yhdistetty
+tab.connection.state.waiting=Odotetaan yhteyttä
+tab.connection.port=Portti:
+tab.connection.host=Isäntä:
+tab.connection.button.connect=Yhdistä
+tab.connection.button.abort=Keskeytä
+tab.connection.autodetect=Automaattitunnistus
+
+### Tab - Injection
+tab.injection=Injektio
+tab.injection.corrupted=onVioittunut
+tab.injection.corrupted.true=Tosi
+tab.injection.corrupted.false=Epätosi
+tab.injection.description.header=otsake
+tab.injection.description.packets=paketit
+tab.injection.description.id=id
+tab.injection.description.length=pituus
+tab.injection.send.toserver=Lähetä palvelimelle
+tab.injection.send.toclient=Lähetä asiakkaalle
+tab.injection.history=Historia:
+tab.injection.history.clear=Tyhjennä
+tab.injection.history.tooltip=Palauta paketti kaksoisnapsauttamalla sitä
+tab.injection.log.packetwithid=Paketti tunnuksella
+
+### Tab - Tools
+tab.tools=Työkalut
+tab.tools.button.encode=Enkoodaa
+tab.tools.button.decode=Dekoodaa
+tab.tools.type.integer=Integer
+tab.tools.type.ushort=Ushort
+tab.tools.encoding=Enkoodaus
+tab.tools.decoding=Dekoodaus
+tab.tools.packet=Paketti
+tab.tools.expression=Ilmaisu
+
+### Tab - Scheduler
+tab.scheduler=Ajastus
+tab.scheduler.table.index=Indeksi
+tab.scheduler.table.packet=Paketti
+tab.scheduler.table.interval=Aikaväli
+tab.scheduler.table.destination=Kohde
+tab.scheduler.table.edit=Muokkaa
+tab.scheduler.setup.packet=Paketti
+tab.scheduler.setup.interval=Aikaväli
+tab.scheduler.button.clear=Tyhjennä
+tab.scheduler.button.clear.tooltip=Tyhjennä kaikki kohteet
+tab.scheduler.button.save=S
+tab.scheduler.button.save.tooltip=Tallenna tiedostoon
+tab.scheduler.button.save.windowtitle=Tallenna ajastustiedosto
+tab.scheduler.button.load=L
+tab.scheduler.button.load.tooltip=Lataa tiedostosta
+tab.scheduler.button.load.windowtitle=Lataa ajastustiedosto
+tab.scheduler.button.add=Lisää
+tab.scheduler.button.edit=Muokkaa
+tab.scheduler.direction.in=Sisään
+tab.scheduler.direction.out=Ulos
+tab.scheduler.hotkeys=Salli oikopolut (Ctrl+Shift+Index)
+tab.scheduler.filetype=Ajastustiedostot (*.sched)
+
+### Tab - Extensions
+tab.extensions=Laajennukset
+tab.extensions.table.title=Otsikko
+tab.extensions.table.description=Kuvaus
+tab.extensions.table.author=Tekijä
+tab.extensions.table.version=Versio
+tab.extensions.table.edit=Muokkaa
+tab.extensions.table.edit.delete.tooltip=Katkaise yhteys tähän laajennukseen
+tab.extensions.table.edit.restart.tooltip=Käynnistä tämä laajennus uudelleen
+tab.extensions.table.edit.uninstall.tooltip=Poista tämän laajennuksen asennus
+tab.extensions.table.edit.uninstall.confirmation=Haluatko varmasti poistaa tämän laajennuksen?
+tab.extensions.port=Portti
+tab.extensions.button.pythonshell=G-Python shell
+tab.extensions.button.pythonshell.windowtitle=Scripting shell
+tab.extensions.button.install=Asenna
+tab.extensions.button.install.windowtitle=Asenna laajennus
+tab.extensions.button.install.filetype=G-Earth -laajennus
+tab.extensions.button.logs=Näytä lokit
+tab.extensions.button.logs.windowtitle=Laajennuskonsoli
+
+### Tab - Extra
+tab.extra=Lisät
+tab.extra.notepad=Muistio
+tab.extra.troubleshooting=Vianmääritys
+tab.extra.options.alwaysontop=Aina ylimmäisenä
+tab.extra.options.staffpermissions=Client-side staffioikeudet
+tab.extra.options.pythonscripting=G-Python scripting
+tab.extra.options.pythonscripting.alert.title=G-Python -asennus
+tab.extra.options.pythonscripting.alert.content=Ennen kuin käytät G-Pythonia, asenna oikeat paketit pip:llä!
+tab.extra.options.pythonscripting.alert.moreinformation=Lisätietoja täältä:
+tab.extra.options.advanced=Lisäasetukset
+tab.extra.options.advanced.socks=Käytä SOCKS-proxya
+tab.extra.options.advanced.proxy.ip=Proxy IP
+tab.extra.options.advanced.proxy.port=Proxy-portti
+tab.extra.options.advanced.disabledecryption=Poista salauksen purku käytöstä
+tab.extra.options.advanced.debugstdout=Virheenkorjaus stdoutiin
+
+### Tab - Info
+tab.info=Tiedot
+tab.info.description=Habbo pakettimanipulaattori Linuxille, Windowsille ja Macille
+tab.info.donate=Lahjoita BTC
+tab.info.donate.alert.title=Lahjoita Bitcoineja
+tab.info.donate.alert.content=Bitcoin julkinen osoite:
+tab.info.createdby=Luonut
+tab.info.links=Linkit
+tab.info.contributors=Avustajat
+
+
+## Alert
+
+### Alert - Confirmation
+alert.confirmation.windowtitle=Vahvistus
+alert.confirmation.button.donotaskagain=Älä kysy uudestaan
+alert.confirmation.button.remember=Muista valintani
+
+### Alert - AdminValidator
+alert.adminvalidator.content=G-Earth tarvitsee järjestelmänvalvojan oikeudet toimiakseen Flashin kanssa.\n\
+ Käynnistä G-Earth uudelleen järjestelmänvalvojan oikeuksilla, jos et käytä Unityä.
+
+### Alert - Outdated
+alert.outdated.title=G-Earth on vanhentunut!
+alert.outdated.content.newversion=G-Earthista on löydetty uusi versio
+alert.outdated.content.update=Päivitä uusimpaan versioon
+
+### Alert - Invalid connection
+alert.invalidconnection.content=Annoit virheelliset yhteystiedot, G-Earth ei voinut muodostaa yhteyttä
+
+### Alert - Nitro root certificate
+alert.rootcertificate.title=Juurivarmenteen asennus
+alert.rootcertificate.remember=Muista valintani
+alert.rootcertificate.content=G-Earth havaitsi, että sinulla ei ole juurivarmentajaa asennettuna.\n\
+ Tämä tarvitaan, jotta Nitro toimii, haluatko jatkaa?\n\
+ G-Earth pyytää sinulta järjestelmänvalvojan lupaa, jos teet niin.
+
+### Alert - Already connected
+alert.alreadyconnected.content=G-Earth on jo yhdistetty tähän hotelliin.\n\
+ Nykyisten rajoitusten vuoksi voit yhdistää vain yhden istunnon hotellia kohti G-Earthiin Raw IP -tilassa Windowsissa.\n\
+ \n\
+ Voit ohittaa tämän käyttämällä SOCKS-välityspalvelinta [Lisät -> Lisäasetukset -> SOCKS]
+
+### Alert - Something went wrong
+alert.somethingwentwrong.title=Jokin meni pieleen!
+alert.somethingwentwrong.content=Jokin meni pieleen!\n\
+ \n\
+ Siirry Vianetsintä-sivullemme ratkaistaksesi ongelma:
+
+### Alert - Allow extension connection
+alert.extconnection.content=Laajennus "%s" yrittää muodostaa yhteyden, mutta G-Earth ei tunne sitä.\n\
+ Hyväksytkö tämän yhteyden?
+
+### Alert - G-Python error
+alert.gpythonerror.title=G-Python virhe
+alert.gpythonerror.content=Jotain meni pieleen G-Python-kuoren käynnistämisessä.\n\
+ Oletko varma, että noudatit asennusopasta oikein?\n\
+ \n\
+ Lisätietoja täältä:
+
+
+## Internal extension
+
+### Internal extension - G-ExtensionStore
+ext.store.elapsedtime.second.single=sekunti
+ext.store.elapsedtime.second.multiple=sekuntia
+ext.store.elapsedtime.minute.single=minuutti
+ext.store.elapsedtime.minute.multiple=minuuttia
+ext.store.elapsedtime.hour.single=tunti
+ext.store.elapsedtime.hour.multiple=tuntia
+ext.store.elapsedtime.day.single=päivä
+ext.store.elapsedtime.day.multiple=päivää
+ext.store.elapsedtime.week.single=viikko
+ext.store.elapsedtime.week.multiple=viikkoa
+ext.store.elapsedtime.month.single=kuukausi
+ext.store.elapsedtime.month.multiple=kuukautta
+ext.store.elapsedtime.year.single=vuosi
+ext.store.elapsedtime.year.multiple=vuotta
+
+ext.store.extension.version=Versio
+ext.store.extension.rating=Arvio
+ext.store.extension.madeby=Tekijä: %s
+ext.store.extension.lastupdated=viimeksi päivitetty %s sitten
+ext.store.extension.notinstore=Ei löydy G-ExtensionStoresta
+
+ext.store.extension.details.description=Kuvaus
+ext.store.extension.details.authors=Tekijä(t))
+ext.store.extension.details.categories=Kategoriat
+ext.store.extension.details.technical_information=Tekniset tiedot
+ext.store.extension.details.click_here=Klikkaa tästä
+ext.store.extension.details.releases=Julkaisut
+ext.store.extension.details.language=Ohjelmointikieli
+ext.store.extension.details.source=Lähde
+ext.store.extension.details.framework=Kehys
+ext.store.extension.details.systems=Järjestelmät
+ext.store.extension.details.clients=Yhteensopivat asiakasohjelmat
+ext.store.extension.details.screenshot=Kuvakaappaus
+
+ext.store.extension.author.reputation=maine
+ext.store.extension.author.releases=julkaisua
+
+ext.store.extension.warning.requirement=Varoitus: runko vaatii --url:lisäasennuksia-
+! IMPORTANT: the previous line has to end with the --url component like the english version
+ext.store.extension.warning.unstable=Warning: tämä laajennus on merkitty epävakaaksi!
+
+ext.store.extension.status.await.install=Asenna laajennus
+ext.store.extension.status.await.install.message=Paina "OK" ja odota laajennuksen asentumista
+ext.store.extension.status.await.update=Päivitä laajennus
+ext.store.extension.status.await.update.message=Paina "OK" ja odota laajennuksen päivittymistä
+ext.store.extension.status.success.install=Asennus valmis
+ext.store.extension.status.success.install.message=Laajennuksen asennus onnistui
+ext.store.extension.status.success.update=Päivitys valmis
+ext.store.extension.status.success.update.message=Laajennuksen päivitys onnistui
+ext.store.extension.status.error.install=Asennus epäonnistui
+ext.store.extension.status.error.install.message=Asennus epäonnistui seuraavalla viestillä
+ext.store.extension.status.error.update=Päivitys epäonnistui
+ext.store.extension.status.error.update.message=Päivitys epäonnistui seuraavalla viestillä
+
+ext.store.button.search=Etsi
+ext.store.button.install=Asenna
+ext.store.button.installed=Asennettu
+ext.store.button.update=Päivitä
+
+ext.store.search.title=Hae
+ext.store.search.description=Hae tarpeitasi vastaava laajennus
+ext.store.search.contenttitle=Hae laajennuksia
+ext.store.search.bykeyword=Etsi hakusanalla
+ext.store.search.results=Hakutulokset
+ext.store.search.ordering=Laajennusten järjestys
+ext.store.search.ordering.bydate.title=Uudet julkaisut
+ext.store.search.ordering.bydate.description=Laajennukset, jotka on äskettäin lisätty G-ExtensionStoreen
+ext.store.search.ordering.bydate.contenttitle=Uudet julkaisut
+ext.store.search.ordering.byrating.title=Suositut laajennukset
+ext.store.search.ordering.byrating.description=Laajennukset lajiteltu arvioiden mukaan
+ext.store.search.ordering.byrating.contenttitle=Suositut laajennukset
+ext.store.search.ordering.byupdate.title=Äskettäin päivitetty
+ext.store.search.ordering.byupdate.description=Hiljattain päivitetyt laajennukset
+ext.store.search.ordering.byupdate.contenttitle=Äskettäin päivitetty
+ext.store.search.filter.clients=Asiakasohjelmat
+ext.store.search.filter.categories=Kategoriat
+ext.store.search.filter.frameworks=Kehykset
+ext.store.search.info.automaticosfiltering=Info: suodatat automaattisesti käyttämäsi käyttöjärjestelmän mukaan
+
+ext.store.category=Kategoria
+
+ext.store.overview.title=Asennetut laajennukset
+ext.store.overview.description=Laajennukset, jotka on jo asennettu G-Earthiin
+ext.store.overview.contenttitle=Asennetut laajennukset
+ext.store.overview.folder=Avaa kansio
+
+ext.store.categories.title=Kategoriat
+ext.store.categories.description=Tutustu G-Earthin tarjoamiin erilaisiin laajennuksiin
+ext.store.categories.contenttitle=Kategoriat
+
+ext.store.fail.unzip=Virhe purettaessa
+ext.store.fail.invalidurl=Virheellinen laajennuksen URL-osoite
+ext.store.fail.notavailable=Laajennus ei ole saatavilla arkistossa
+ext.store.fail.alreadyexists=Jotain meni pieleen laajennushakemiston luomisessa. Onko laajennus jo olemassa?
+ext.store.fail.notfound=Laajennusta ei löytynyt
+ext.store.fail.uninstall=Jotain meni pieleen laajennuksen poistamisessa. Muista pysäyttää laajennus, jos se on edelleen käynnissä.
+
+ext.store.ordering.rating=Pisteet
+ext.store.ordering.alphabetical=Aakkosjärjestys
+ext.store.ordering.lastupdated=Viimeksi päivitetty
+ext.store.ordering.newreleases=Uudet julkaisut
+
+### Internal extension - Logger
+ext.logger.menu.window=Ikkuna
+ext.logger.menu.window.alwaysontop=Aina päälimmäisenä
+ext.logger.menu.window.onconnect=Yhdistäessä
+ext.logger.menu.window.onconnect.openwindow=Avaa ikkuna
+ext.logger.menu.window.onconnect.reset=Nollaa pakettiloki
+ext.logger.menu.window.ondisconnect=Yhteyden katketessa
+ext.logger.menu.window.ondisconnect.hidewindow=Piilota ikkuna
+ext.logger.menu.window.ondisconnect.reset=Nollaa pakettiloki
+
+ext.logger.menu.view=Näkymä
+ext.logger.menu.view.incoming=Näytä sisääntulevat
+ext.logger.menu.view.outgoing=Näytä uloslähtevät
+ext.logger.menu.view.autoscroll=Automaattirullaus
+ext.logger.menu.view.cleartext=Tyhjennä teksti
+
+ext.logger.menu.packets=Paketit
+ext.logger.menu.packets.displaydetails=Näytä tiedot
+ext.logger.menu.packets.displaydetails.byterep=Bittiesitys
+ext.logger.menu.packets.displaydetails.byterep.legacy=Legacy
+ext.logger.menu.packets.displaydetails.byterep.hexdump=Hexdump
+ext.logger.menu.packets.displaydetails.byterep.rawhex=Raaka hex
+ext.logger.menu.packets.displaydetails.byterep.none=Ei mikään
+ext.logger.menu.packets.displaydetails.message=Viesti
+ext.logger.menu.packets.displaydetails.message.name=Nimi
+ext.logger.menu.packets.displaydetails.message.hash=Tiiviste
+ext.logger.menu.packets.displaydetails.message.id=Id
+ext.logger.menu.packets.displaydetails.structure=Rakenne
+ext.logger.menu.packets.displaydetails.timestamp=Aika
+ext.logger.menu.packets.antispam=Spämmifiltteri
+ext.logger.menu.packets.antispam.none=Ei käytössä
+ext.logger.menu.packets.antispam.low=Alhainen
+ext.logger.menu.packets.antispam.med=Keskitaso
+ext.logger.menu.packets.antispam.high=Korkea
+ext.logger.menu.packets.antispam.ultra=Ultra
+ext.logger.menu.packets.skipbig=Ohita suuret paketit
+ext.logger.menu.packets.exportall=Vie kaikki
+ext.logger.menu.packets.exportall.windowtitle=Tallenna paketit
+ext.logger.menu.packets.exportall.filetype=Tekstitiedostot
+
+ext.logger.state.packetinfo=Paketin tiedot
+ext.logger.state.filtered=Suodatettu
+ext.logger.element.timestamp=aika
+ext.logger.element.blocked=Estetty
+ext.logger.element.replaced=Korvattu
+ext.logger.element.direction.outgoing=Uloslähtevät
+ext.logger.element.direction.incoming=Sisääntulevat
+ext.logger.element.skipped=paketti ohitettu
+ext.logger.state.true=Tosi
+ext.logger.state.false=Epätosi
diff --git a/G-Earth/src/main/resources/gearth/ui/translations/messages_fr.properties b/G-Earth/src/main/resources/gearth/ui/translations/messages_fr.properties
new file mode 100644
index 0000000..8ff3f61
--- /dev/null
+++ b/G-Earth/src/main/resources/gearth/ui/translations/messages_fr.properties
@@ -0,0 +1,328 @@
+# French (Translated by Lande)
+
+# Note by Lande : sorry if some translations are wrong, incorrect, missing or otherwise
+# thank you for taking the time to modify them
+
+## Tabs
+
+### Tab - Connection
+tab.connection=Connexion
+tab.connection.client=Type de client:
+tab.connection.client.flash=Flash / Air
+tab.connection.client.unity=Unity
+tab.connection.client.nitro=Nitro
+tab.connection.version=Hôtel version:
+tab.connection.state=État de connexion:
+tab.connection.state.notconnected=Pas connecté
+tab.connection.state.connected=Connecté
+tab.connection.state.waiting=En attente de connexion
+tab.connection.port=Port:
+tab.connection.host=Host:
+tab.connection.button.connect=Connecter
+tab.connection.button.abort=Annuler
+tab.connection.autodetect=Détection auto
+
+### Tab - Injection
+tab.injection=Injecter
+tab.injection.corrupted=isCorrupted
+tab.injection.corrupted.true=True
+tab.injection.corrupted.false=False
+tab.injection.description.header=header
+tab.injection.description.packets=packets
+tab.injection.description.id=id
+tab.injection.description.length=taille
+tab.injection.send.toserver=Envoyer au serveur
+tab.injection.send.toclient=Envoyer au client
+tab.injection.history=Historique:
+tab.injection.history.clear=Effacer
+tab.injection.history.tooltip=Double clique un packet pour le restaurer
+tab.injection.log.packetwithid=Packet avec id
+
+### Tab - Tools
+tab.tools=Outils
+tab.tools.button.encode=Encode
+tab.tools.button.decode=Decode
+tab.tools.type.integer=Integer
+tab.tools.type.ushort=Ushort
+tab.tools.encoding=Encoder
+tab.tools.decoding=Decoder
+tab.tools.packet=Packet
+tab.tools.expression=Expression
+### Tab - Scheduler
+tab.scheduler=Planificateur
+tab.scheduler.table.index=Index
+tab.scheduler.table.packet=Packet
+tab.scheduler.table.interval=Interval
+tab.scheduler.table.destination=Destination
+tab.scheduler.table.edit=Modifier
+tab.scheduler.setup.packet=Packet
+tab.scheduler.setup.interval=Interval
+tab.scheduler.button.clear=Effacer
+tab.scheduler.button.clear.tooltip=Effacer tous
+tab.scheduler.button.save=S
+tab.scheduler.button.save.tooltip=Sauvegarder dans un fichier
+tab.scheduler.button.save.windowtitle=Sauvegarder le planificateur dans un fichier
+tab.scheduler.button.load=L
+tab.scheduler.button.load.tooltip=Charger depuis un fichier
+tab.scheduler.button.load.windowtitle=Charger le planificateur depuis un fichier
+tab.scheduler.button.add=Ajouter
+tab.scheduler.button.edit=Modifier
+tab.scheduler.direction.in=In
+tab.scheduler.direction.out=Out
+tab.scheduler.hotkeys=Activer raccourcis (Ctrl+Shift+Index)
+tab.scheduler.filetype=Fichier planificateur (*.sched)
+
+### Tab - Extensions
+tab.extensions=Extensions
+tab.extensions.table.title=Titre
+tab.extensions.table.description=Description
+tab.extensions.table.author=Auteur
+tab.extensions.table.version=Version
+tab.extensions.table.edit=Modifier
+tab.extensions.table.edit.delete.tooltip=Arreter la connexion avec l'extension
+tab.extensions.table.edit.restart.tooltip=Recharger l'extension
+tab.extensions.table.edit.uninstall.tooltip=Désinstaller l'extension
+tab.extensions.table.edit.uninstall.confirmation=Es-tu sûr de vouloir désinstaller l'extension?
+tab.extensions.port=Port
+tab.extensions.button.pythonshell=G-Python shell
+tab.extensions.button.pythonshell.windowtitle=Scripting shell
+tab.extensions.button.install=Installer
+tab.extensions.button.install.windowtitle=Installer l'extension
+tab.extensions.button.install.filetype=G-Earth extensions
+tab.extensions.button.logs=Logs
+tab.extensions.button.logs.windowtitle=Extension Console
+
+### Tab - Extra
+tab.extra=Extra
+tab.extra.notepad=Notepad
+tab.extra.troubleshooting=Dépannage
+tab.extra.options.alwaysontop=Toujours au top
+tab.extra.options.staffpermissions=Permission staff client
+tab.extra.options.pythonscripting=G-Python scripting
+tab.extra.options.pythonscripting.alert.title=G-Python installation
+tab.extra.options.pythonscripting.alert.content=Avant d'utiliser G-Python, installer les packages avec pip!
+tab.extra.options.pythonscripting.alert.moreinformation=Plus d'informations ici:
+tab.extra.options.advanced=Avancer
+tab.extra.options.advanced.socks=Utiliser SOCKS proxy
+tab.extra.options.advanced.proxy.ip=Proxy IP
+tab.extra.options.advanced.proxy.port=Proxy port
+tab.extra.options.advanced.disabledecryption=Désactiver le décryptage
+tab.extra.options.advanced.debugstdout=Debug to stdout
+
+### Tab - Info
+tab.info=Info
+tab.info.description=Habbo packet manipulateur pour Linux, Windows & Mac
+tab.info.donate=Donner BTC
+tab.info.donate.alert.title=Donner Bitcoins
+tab.info.donate.alert.content=Bitcoin adresse publique:
+tab.info.createdby=Crée par
+tab.info.links=Liens
+tab.info.contributors=Contributeurs
+
+
+## Alert
+
+### Alert - Confirmation
+alert.confirmation.windowtitle=Dialogue de Confirmation
+alert.confirmation.button.donotaskagain=Ne pas demander à nouveau
+alert.confirmation.button.remember=Se souvenir de mon choix
+
+### Alert - AdminValidator
+alert.adminvalidator.content=G-Earth a besoin des privilèges d'administrateur pour pouvoir fonctionner sur Flash,\n\
+ merci de redémarrer G-Earth avec les privilèges d''administrateur sauf si tu utilises Unity
+
+### Alert - Outdated
+alert.outdated.title=G-Earth est obsolète!
+alert.outdated.content.newversion=Une nouvelle version de G-Earth a été trouvée
+alert.outdated.content.update=Mettre à jour la dernière version.
+
+### Alert - Invalid connection
+alert.invalidconnection.content=Tu as entré des informations invalides, G-Earth ne peut pas se connecter
+
+### Alert - Nitro root certificate
+alert.rootcertificate.title=Installation du certificat root
+alert.rootcertificate.remember=Se souvenir de mon choix
+alert.rootcertificate.content=G-Earth a détecté que tu n'avais pas le certificat root d'installer.\n\
+ Il est nécessaire pour que Nitro fonctionne, veux-tu continuer?\n\
+ G-Earth va te demander les permissions administrateurs si tu le souhaites.
+
+### Alert - Already connected
+alert.alreadyconnected.content=G-Earth est déjà connecté à cet hôtel.\n\
+ Dû à la restriction actuelle tu peux connecter seulement une session par hôtel à G-Earth\n\
+ en mode "Raw IP" (127.0.0.1) sur Windows.\n\
+ \n\
+ Tu peux passer outre en utilisant un SOCKS proxy [Extra -> Avancer -> SOCKS]
+
+### Alert - Something went wrong
+alert.somethingwentwrong.title=Quelque chose s'est mal passé!
+alert.somethingwentwrong.content=Quelque chose s'est mal passé!\n\
+ \n\
+ Rendez-vous sur notre page de dépannage pour résoudre le problème:
+
+### Alert - Allow extension connection
+alert.extconnection.content=Extension "%s" essaie de se connecter mais n'est pas connu de G-Earth,\n\
+ Accepter la connection?
+
+### Alert - G-Python error
+alert.gpythonerror.title=G-Python erreur
+alert.gpythonerror.content=Quelque chose s'est mal passé lors du lancement de G-Python shell,\n\
+ es-tu sûr d'avoir suivi le guide d'installation correctement?\n\
+ \n\
+ Plus d'information ici:
+
+
+## Internal extension
+
+### Internal extension - G-ExtensionStore
+ext.store.elapsedtime.second.single=seconde
+ext.store.elapsedtime.second.multiple=secondes
+ext.store.elapsedtime.minute.single=minute
+ext.store.elapsedtime.minute.multiple=minutes
+ext.store.elapsedtime.hour.single=heure
+ext.store.elapsedtime.hour.multiple=heures
+ext.store.elapsedtime.day.single=jour
+ext.store.elapsedtime.day.multiple=jours
+ext.store.elapsedtime.week.single=semaine
+ext.store.elapsedtime.week.multiple=semaines
+ext.store.elapsedtime.month.single=mois
+ext.store.elapsedtime.month.multiple=mois
+ext.store.elapsedtime.year.single=année
+ext.store.elapsedtime.year.multiple=années
+
+ext.store.extension.version=Version
+ext.store.extension.rating=Évaluation
+ext.store.extension.madeby=De %s
+ext.store.extension.lastupdated=dernière mise à jour depuis %s
+ext.store.extension.notinstore=Pas trouvé dans G-ExtensionStore
+
+ext.store.extension.details.description=Description
+ext.store.extension.details.authors=Auteur(s)
+ext.store.extension.details.categories=Catégories
+ext.store.extension.details.technical_information=Information technique
+ext.store.extension.details.click_here=Clique ici
+ext.store.extension.details.releases=Versions
+ext.store.extension.details.language=Language
+ext.store.extension.details.source=Source
+ext.store.extension.details.framework=Framework
+ext.store.extension.details.systems=Systemes
+ext.store.extension.details.clients=Clients compatibles
+ext.store.extension.details.screenshot=Screenshot
+
+ext.store.extension.author.reputation=réputation
+ext.store.extension.author.releases=Versions
+ext.store.extension.warning.requirement=Attention: ce framework a besoin --url:des installations supplémentaires-
+! IMPORTANT: the previous line has to end with the --url component like the english version
+ext.store.extension.warning.unstable=Warning: this extension has been marked unstable!
+
+ext.store.extension.status.await.install=Installer l'extension
+ext.store.extension.status.await.install.message=Appuie sur "OK" et attend que l'extension soit installer
+ext.store.extension.status.await.update=Mettre à jour l'extension
+ext.store.extension.status.await.update.message=Appuie sur "OK" et attend que l'extension soit mise à jour
+ext.store.extension.status.success.install=Installation complétée
+ext.store.extension.status.success.install.message=L'installation de l'extension s'est terminée
+ext.store.extension.status.success.update=Mise à jour complétée
+ext.store.extension.status.success.update.message=La mise à jour de l'extension s'est terminée
+ext.store.extension.status.error.install=Installation échoué
+ext.store.extension.status.error.install.message=L'installation a échoué avec le message suivant
+ext.store.extension.status.error.update=Mise à jour échoué
+ext.store.extension.status.error.update.message=La mise à jour a échoué avec le message suivant
+
+ext.store.button.search=Chercher
+ext.store.button.install=Installer
+ext.store.button.installed=Déjà installé
+ext.store.button.update=Mettre à jour
+
+ext.store.search.title=Chercher
+ext.store.search.description=Chercher l'extension dont t'as besoin
+ext.store.search.contenttitle=Chercher extensions
+ext.store.search.bykeyword=Chercher par mot clé
+ext.store.search.results=Résultats de recherche
+ext.store.search.ordering=Extensions par ordre
+ext.store.search.ordering.bydate.title=Nouvelles extensions
+ext.store.search.ordering.bydate.description=Extensions récemment ajouté à G-ExtensionStore
+ext.store.search.ordering.bydate.contenttitle=Nouvelles extensions
+ext.store.search.ordering.byrating.title=Extensions populaires
+ext.store.search.ordering.byrating.description=Extensions par ordre d'évaluation
+ext.store.search.ordering.byrating.contenttitle=Extensions populaires
+ext.store.search.ordering.byupdate.title=Récemment mis à jour
+ext.store.search.ordering.byupdate.description=Extensions qui ont été récemment mis à jour
+ext.store.search.ordering.byupdate.contenttitle=Récemment mis à jour
+ext.store.search.filter.clients=Clients
+ext.store.search.filter.categories=Catégories
+ext.store.search.filter.frameworks=Frameworks
+ext.store.search.info.automaticosfiltering=Info: automatiquement filtré en fonction de l'OS que tu utilises
+
+ext.store.category=Catégories
+
+ext.store.overview.title=Extensions installés
+ext.store.overview.description=Extensions qui sont déjà installés dans G-Earth
+ext.store.overview.contenttitle=Extensions installés
+ext.store.overview.folder=Ouvrir le dossier
+
+ext.store.categories.title=Catégories
+ext.store.categories.description=Explorer les différentes extensions que G-Earth a à te proposer
+ext.store.categories.contenttitle=Catégories
+
+ext.store.fail.unzip=Error while unzipping
+ext.store.fail.invalidurl=Invalid extension URL
+ext.store.fail.notavailable=Extension not available in repository
+ext.store.fail.alreadyexists=Something went wrong creating the extension directory, does the extension already exist?
+ext.store.fail.notfound=Extension wasn't found
+ext.store.fail.uninstall=Something went wrong with uninstalling the extension, make sure to disconnect the extension if it was still running.
+
+ext.store.ordering.rating=Rating
+ext.store.ordering.alphabetical=Alphabetical
+ext.store.ordering.lastupdated=Last updated
+ext.store.ordering.newreleases=New releases
+
+### Internal extension - Logger
+ext.logger.menu.window=Fenêtre
+ext.logger.menu.window.alwaysontop=Toujours au top
+ext.logger.menu.window.onconnect=À la connection
+ext.logger.menu.window.onconnect.openwindow=Ouvrir la Fenêtre
+ext.logger.menu.window.onconnect.reset=Réinitialiser le packetlogger
+ext.logger.menu.window.ondisconnect=À la déconnexion
+ext.logger.menu.window.ondisconnect.hidewindow=Masquer la fenêtre
+ext.logger.menu.window.ondisconnect.reset=Réinitialiser le packetlogger
+
+ext.logger.menu.view=Voir
+ext.logger.menu.view.incoming=Voir les incoming
+ext.logger.menu.view.outgoing=Voir les outgoing
+ext.logger.menu.view.autoscroll=Autoscroll
+ext.logger.menu.view.cleartext=Effacer le texte
+
+ext.logger.menu.packets=Packets
+ext.logger.menu.packets.displaydetails=Afficher les details
+ext.logger.menu.packets.displaydetails.byterep=Byte représentation
+ext.logger.menu.packets.displaydetails.byterep.legacy=Legacy
+ext.logger.menu.packets.displaydetails.byterep.hexdump=Hexdump
+ext.logger.menu.packets.displaydetails.byterep.rawhex=Raw hex
+ext.logger.menu.packets.displaydetails.byterep.none=None
+ext.logger.menu.packets.displaydetails.message=Message
+ext.logger.menu.packets.displaydetails.message.name=Nom
+ext.logger.menu.packets.displaydetails.message.hash=Hash
+ext.logger.menu.packets.displaydetails.message.id=Id
+ext.logger.menu.packets.displaydetails.structure=Structure
+ext.logger.menu.packets.displaydetails.timestamp=Heure
+ext.logger.menu.packets.antispam=Anti-spam filtre
+ext.logger.menu.packets.antispam.none=None
+ext.logger.menu.packets.antispam.low=Bas
+ext.logger.menu.packets.antispam.med=Moyen
+ext.logger.menu.packets.antispam.high=Élevé
+ext.logger.menu.packets.antispam.ultra=Ultra
+ext.logger.menu.packets.skipbig=Skip big packets
+ext.logger.menu.packets.exportall=Exporter tout
+ext.logger.menu.packets.exportall.windowtitle=Sauvegarder les Packets
+ext.logger.menu.packets.exportall.filetype=TXT files
+
+ext.logger.state.packetinfo=Packet info
+ext.logger.state.filtered=Filtré
+
+ext.logger.element.timestamp=heure
+ext.logger.element.blocked=Blocké
+ext.logger.element.replaced=Remplacé
+ext.logger.element.direction.outgoing=Outgoing
+ext.logger.element.direction.incoming=Incoming
+ext.logger.element.skipped=packet skipped
+ext.logger.state.true=True
+ext.logger.state.false=False
diff --git a/G-Earth/src/main/resources/gearth/ui/translations/messages_it.properties b/G-Earth/src/main/resources/gearth/ui/translations/messages_it.properties
new file mode 100644
index 0000000..035be56
--- /dev/null
+++ b/G-Earth/src/main/resources/gearth/ui/translations/messages_it.properties
@@ -0,0 +1,326 @@
+# Italian (Translated by Kilt)
+
+## Tabs
+
+### Tab - Connection
+tab.connection=Connessione
+tab.connection.client=Tipo di client:
+tab.connection.client.flash=Flash / Air
+tab.connection.client.unity=Unity
+tab.connection.client.nitro=Nitro
+tab.connection.version=Versione Hotel:
+tab.connection.state=Stato connessione:
+tab.connection.state.notconnected=Non connesso
+tab.connection.state.connected=Connesso
+tab.connection.state.waiting=In attesa di connessione
+tab.connection.port=Porta:
+tab.connection.host=Host:
+tab.connection.button.connect=Connetti
+tab.connection.button.abort=Interrompi
+tab.connection.autodetect=Auto-detect
+
+### Tab - Injection
+tab.injection=Iniezione
+tab.injection.corrupted=isCorrupted
+tab.injection.corrupted.true=True
+tab.injection.corrupted.false=False
+tab.injection.description.header=header
+tab.injection.description.packets=packets
+tab.injection.description.id=id
+tab.injection.description.length=lunghezza
+tab.injection.send.toserver=Manda al server
+tab.injection.send.toclient=Manda al client
+tab.injection.history=Cronologia:
+tab.injection.history.clear=Cancella
+tab.injection.history.tooltip=Doppioclicca il packet per ripristinarlo
+tab.injection.log.packetwithid=Packet con id
+
+### Tab - Tools
+tab.tools=Strumenti
+tab.tools.button.encode=Codifica
+tab.tools.button.decode=Decodifica
+tab.tools.type.integer=Integer
+tab.tools.type.ushort=Ushort
+tab.tools.encoding=Encoding
+tab.tools.decoding=Decoding
+tab.tools.packet=Packet
+tab.tools.expression=Expression
+### Tab - Scheduler
+tab.scheduler=Pianificazione
+tab.scheduler.table.index=Index
+tab.scheduler.table.packet=Packet
+tab.scheduler.table.interval=Interval
+tab.scheduler.table.destination=Destinazione
+tab.scheduler.table.edit=Modifica
+tab.scheduler.setup.packet=Packet
+tab.scheduler.setup.interval=Intervallo
+tab.scheduler.button.clear=Cancella
+tab.scheduler.button.clear.tooltip=Cancella tutti gli items
+tab.scheduler.button.save=S
+tab.scheduler.button.save.tooltip=Salva su file
+tab.scheduler.button.save.windowtitle=Salva File Pianificato
+tab.scheduler.button.load=C
+tab.scheduler.button.load.tooltip=Carica da file
+tab.scheduler.button.load.windowtitle=Carica File Pianificato
+tab.scheduler.button.add=Aggiungi
+tab.scheduler.button.edit=Modifica
+tab.scheduler.direction.in=In
+tab.scheduler.direction.out=Out
+tab.scheduler.hotkeys=Attiva hotkeys (Ctrl+Shift+Index)
+tab.scheduler.filetype=File Pianificati (*.sched)
+
+### Tab - Extensions
+tab.extensions=Estensioni
+tab.extensions.table.title=Titolo
+tab.extensions.table.description=Descrizione
+tab.extensions.table.author=Autore
+tab.extensions.table.version=Versione
+tab.extensions.table.edit=Modifica
+tab.extensions.table.edit.delete.tooltip=Chiudi la connessione con questa estensione
+tab.extensions.table.edit.restart.tooltip=Riavvia questa estensione
+tab.extensions.table.edit.uninstall.tooltip=Disinstalla questa estensione
+tab.extensions.table.edit.uninstall.confirmation=Sei sicuro di voler disinstallare questa estensione?
+tab.extensions.port=Porta
+tab.extensions.button.pythonshell=G-Python shell
+tab.extensions.button.pythonshell.windowtitle=Scripting shell
+tab.extensions.button.install=Installa
+tab.extensions.button.install.windowtitle=Installa estensione
+tab.extensions.button.install.filetype=Estensioni di G-Earth
+tab.extensions.button.logs=Guarda logs
+tab.extensions.button.logs.windowtitle=Console Estensione
+
+### Tab - Extra
+tab.extra=Extra
+tab.extra.notepad=Notepad
+tab.extra.troubleshooting=Risoluzione dei problemi
+tab.extra.options.alwaysontop=Sempre in primo piano
+tab.extra.options.staffpermissions=Permessi staff client-side
+tab.extra.options.pythonscripting=G-Python scripting
+tab.extra.options.pythonscripting.alert.title=Installazione di G-Python
+tab.extra.options.pythonscripting.alert.content=Prima di usare G-Python, installare i pacchetti giusti usando pip!
+tab.extra.options.pythonscripting.alert.moreinformation=Maggiori informazion qui:
+tab.extra.options.advanced=Avanzato
+tab.extra.options.advanced.socks=Usa Proxy SOCKS
+tab.extra.options.advanced.proxy.ip=Proxy IP
+tab.extra.options.advanced.proxy.port=Proxy port
+tab.extra.options.advanced.disabledecryption=Disattiva decrittazione
+tab.extra.options.advanced.debugstdout=Debug to stdout
+
+### Tab - Info
+tab.info=Info
+tab.info.description=Manipolatore di Habbo packet per Linux, Windows & Mac
+tab.info.donate=Dona BTC
+tab.info.donate.alert.title=Dona Bitcoins
+tab.info.donate.alert.content=Indirizzo pubblico Bitcoin:
+tab.info.createdby=Creato da
+tab.info.links=Links
+tab.info.contributors=Contributori
+
+
+## Alert
+
+### Alert - Confirmation
+alert.confirmation.windowtitle=Dialogo di conferma
+alert.confirmation.button.donotaskagain=Non lo chiedere di nuovo
+alert.confirmation.button.remember=Ricorda la mia scelta
+
+### Alert - AdminValidator
+alert.adminvalidator.content=G-Earth ha bisogno dei permessi di amministratore per poter funzionare su Flash,\n\
+ riavvia G-Earth con i permessi di amministratore a meno che\n\
+ tu non stia usando Unity
+
+### Alert - Outdated
+alert.outdated.title=G-Earth non è aggiornato!
+alert.outdated.content.newversion=Una nuova versione di G-Earth è stata trovata
+alert.outdated.content.update=Aggiorna all'ultima versione
+
+### Alert - Invalid connection
+alert.invalidconnection.content=Hai inserito informazioni di connessione non valide, G-Earth non è stato in grado di connettersi
+
+### Alert - Nitro root certificate
+alert.rootcertificate.title=Installazione del Certificato Root
+alert.rootcertificate.remember=Ricorda la mia scelta
+alert.rootcertificate.content=G-Earth ha rilevato che non hai un certificato di autorizzazione root installato.\n\
+ Questo è richiesto per far funzionare Nitro, vuoi continuare?\n\
+ G-Earth ti chiederà i permessi di Amministratore se lo farai.
+
+### Alert - Already connected
+alert.alreadyconnected.content=G-Earth è già connesso a questo hotel.\n\
+ A causa delle attuali limitazioni, puoi connettere solo una sessione per hotel su G-Earth in Modalità Raw IP su Windows.\n\
+ \n\
+ Puoi bypassare questo usando un proxy SOCKS [Extra -> Avanzato -> SOCKS]
+
+### Alert - Something went wrong
+alert.somethingwentwrong.title=Qualcosa è andato storto!
+alert.somethingwentwrong.content=Qualcosa è andato storto!\n\
+ \n\
+ Vai sulla nostra pagina Risoluzione dei problemi per risolvere il problema:
+
+### Alert - Allow extension connection
+alert.extconnection.content=L'estensione "%s" sta provando a connettersi ma non è riconosciuto da G-Earth,\n\
+ accetti questa connessione?
+
+### Alert - G-Python error
+alert.gpythonerror.title=Errore G-Python
+alert.gpythonerror.content=Qualcosa è andato storto avviando il G-Python shell,\n\
+ sei sicuro di aver seguito la guida di installazione correttamente?\n\
+ \n\
+ Più informazioni qui:
+
+
+## Internal extension
+
+### Internal extension - G-ExtensionStore
+ext.store.elapsedtime.second.single=secondo
+ext.store.elapsedtime.second.multiple=secondi
+ext.store.elapsedtime.minute.single=minuto
+ext.store.elapsedtime.minute.multiple=minuti
+ext.store.elapsedtime.hour.single=ora
+ext.store.elapsedtime.hour.multiple=ore
+ext.store.elapsedtime.day.single=giorno
+ext.store.elapsedtime.day.multiple=giorni
+ext.store.elapsedtime.week.single=settimana
+ext.store.elapsedtime.week.multiple=settimane
+ext.store.elapsedtime.month.single=mese
+ext.store.elapsedtime.month.multiple=mesi
+ext.store.elapsedtime.year.single=anno
+ext.store.elapsedtime.year.multiple=anni
+
+ext.store.extension.version=Versione
+ext.store.extension.rating=Valutazione
+ext.store.extension.madeby=Di %s
+ext.store.extension.lastupdated=ultimo aggiornamento %s fa
+ext.store.extension.notinstore=Non trovato nel G-ExtensionStore
+
+ext.store.extension.details.description=Descrizione
+ext.store.extension.details.authors=Autore/i
+ext.store.extension.details.categories=Categorie
+ext.store.extension.details.technical_information=Informazioni tecniche
+ext.store.extension.details.click_here=Clicca qui
+ext.store.extension.details.releases=Rilasci
+ext.store.extension.details.language=Lingua
+ext.store.extension.details.source=Sorgente
+ext.store.extension.details.framework=Framework
+ext.store.extension.details.systems=Sistemi
+ext.store.extension.details.clients=Client compatibili
+ext.store.extension.details.screenshot=Screenshot
+
+ext.store.extension.author.reputation=reputazione
+ext.store.extension.author.releases=rilasci
+
+ext.store.extension.warning.requirement=Attenzione: è richiesto il framework --url:additional installations-
+! IMPORTANT: the previous line has to end with the --url component like the english version
+ext.store.extension.warning.unstable=Attenzione: questa estensione è stata marchiata instabile!
+
+ext.store.extension.status.await.install=Installa estensione
+ext.store.extension.status.await.install.message=Premi "OK" e aspetta mentre l'estensione viene installata
+ext.store.extension.status.await.update=Update extension
+ext.store.extension.status.await.update.message=Press "OK" e aspetta mentre l'estensione viene aggiornata
+ext.store.extension.status.success.install=Installazione completata
+ext.store.extension.status.success.install.message=L'installazione dell'estensione è stata completata con successo
+ext.store.extension.status.success.update=Aggiornamento completato
+ext.store.extension.status.success.update.message=L'aggiornamento dell'estensione è stato completato con successo
+ext.store.extension.status.error.install=Installazione fallita
+ext.store.extension.status.error.install.message=Installazione fallita con il seguente messaggio
+ext.store.extension.status.error.update=Aggiornamento fallito
+ext.store.extension.status.error.update.message=Aggiornamento fallito con il seguente messaggio
+
+ext.store.button.search=Cerca
+ext.store.button.install=Installa
+ext.store.button.installed=Installato
+ext.store.button.update=Aggiorna
+
+ext.store.search.title=Cerca
+ext.store.search.description=Trova l'estensione adatta alle tue esigenze
+ext.store.search.contenttitle=Cerca estensioni
+ext.store.search.bykeyword=Cerca per parola chiave
+ext.store.search.results=Cerca risultati
+ext.store.search.ordering=Ordinazione delle estensioni
+ext.store.search.ordering.bydate.title=Nuovi Rilasci
+ext.store.search.ordering.bydate.description=Estensioni aggiunti di recente sul G-ExtensionStore
+ext.store.search.ordering.bydate.contenttitle=Nuovi Rilasci
+ext.store.search.ordering.byrating.title=Estensioni Popolari
+ext.store.search.ordering.byrating.description=Estensioni ordinate per valutazione
+ext.store.search.ordering.byrating.contenttitle=Estensioni Popolari
+ext.store.search.ordering.byupdate.title=Aggiornate di Recente
+ext.store.search.ordering.byupdate.description=Estensioni aggiornate di recente
+ext.store.search.ordering.byupdate.contenttitle=Aggiornate di Recente
+ext.store.search.filter.clients=Clients
+ext.store.search.filter.categories=Categorie
+ext.store.search.filter.frameworks=Frameworks
+ext.store.search.info.automaticosfiltering=Info: stai filtrando automaticamente sul SO in uso
+
+ext.store.category=Categoria
+
+ext.store.overview.title=Estensioni Installate
+ext.store.overview.description=Estensioni che sono già installate in G-Earth
+ext.store.overview.contenttitle=Estensioni installate
+ext.store.overview.folder=Apri cartella
+
+ext.store.categories.title=Categorie
+ext.store.categories.description=Esplora i diversi tipi di estensioni che G-Earth ha da offrire
+ext.store.categories.contenttitle=Categorie
+
+ext.store.fail.unzip=Error while unzipping
+ext.store.fail.invalidurl=Invalid extension URL
+ext.store.fail.notavailable=Extension not available in repository
+ext.store.fail.alreadyexists=Something went wrong creating the extension directory, does the extension already exist?
+ext.store.fail.notfound=Extension wasn't found
+ext.store.fail.uninstall=Something went wrong with uninstalling the extension, make sure to disconnect the extension if it was still running.
+
+ext.store.ordering.rating=Rating
+ext.store.ordering.alphabetical=Alphabetical
+ext.store.ordering.lastupdated=Last updated
+ext.store.ordering.newreleases=New releases
+
+### Internal extension - Logger
+ext.logger.menu.window=Finestra
+ext.logger.menu.window.alwaysontop=Sempre in primo piano
+ext.logger.menu.window.onconnect=Alla connessione
+ext.logger.menu.window.onconnect.openwindow=Apri finestra
+ext.logger.menu.window.onconnect.reset=Resetta packetlogger
+ext.logger.menu.window.ondisconnect=Alla disconnessione
+ext.logger.menu.window.ondisconnect.hidewindow=Nascondi finestra
+ext.logger.menu.window.ondisconnect.reset=Resetta packetlogger
+
+ext.logger.menu.view=View
+ext.logger.menu.view.incoming=Mostra in arrivo
+ext.logger.menu.view.outgoing=Mostra in uscita
+ext.logger.menu.view.autoscroll=Autoscroll
+ext.logger.menu.view.cleartext=Cancella testo
+
+ext.logger.menu.packets=Packets
+ext.logger.menu.packets.displaydetails=Mostra dettagli
+ext.logger.menu.packets.displaydetails.byterep=Rappresentazione Byte
+ext.logger.menu.packets.displaydetails.byterep.legacy=Legacy
+ext.logger.menu.packets.displaydetails.byterep.hexdump=Hexdump
+ext.logger.menu.packets.displaydetails.byterep.rawhex=Raw hex
+ext.logger.menu.packets.displaydetails.byterep.none=Nulla
+ext.logger.menu.packets.displaydetails.message=Messaggio
+ext.logger.menu.packets.displaydetails.message.name=Nome
+ext.logger.menu.packets.displaydetails.message.hash=Hash
+ext.logger.menu.packets.displaydetails.message.id=Id
+ext.logger.menu.packets.displaydetails.structure=Struttura
+ext.logger.menu.packets.displaydetails.timestamp=Ora
+ext.logger.menu.packets.antispam=Filtro Anti-spam
+ext.logger.menu.packets.antispam.none=Nulla
+ext.logger.menu.packets.antispam.low=Basso
+ext.logger.menu.packets.antispam.med=Medio
+ext.logger.menu.packets.antispam.high=Alto
+ext.logger.menu.packets.antispam.ultra=Ultra
+ext.logger.menu.packets.skipbig=Salta grandi packets
+ext.logger.menu.packets.exportall=Esporta tutto
+ext.logger.menu.packets.exportall.windowtitle=Salva Packets
+ext.logger.menu.packets.exportall.filetype=File TXT
+
+ext.logger.state.packetinfo=Packet info
+ext.logger.state.filtered=Filtrato
+
+ext.logger.element.timestamp=ora
+ext.logger.element.blocked=Bloccato
+ext.logger.element.replaced=Rimpiazzato
+ext.logger.element.direction.outgoing=In uscita
+ext.logger.element.direction.incoming=In arrivo
+ext.logger.element.skipped=packet skipped
+ext.logger.state.true=True
+ext.logger.state.false=False
diff --git a/G-Earth/src/main/resources/gearth/ui/translations/messages_nl.properties b/G-Earth/src/main/resources/gearth/ui/translations/messages_nl.properties
new file mode 100644
index 0000000..a8ea4a4
--- /dev/null
+++ b/G-Earth/src/main/resources/gearth/ui/translations/messages_nl.properties
@@ -0,0 +1,324 @@
+# Dutch (Translated by WiredSpast)
+
+## Tabs
+
+### Tab - Connection
+tab.connection=Verbinding
+tab.connection.client=Client type:
+tab.connection.client.flash=Flash / Air
+tab.connection.client.unity=Unity
+tab.connection.client.nitro=Nitro
+tab.connection.version=Hotel versie:
+tab.connection.state=Verbindings status:
+tab.connection.state.notconnected=Niet verbonden
+tab.connection.state.connected=Verbonden
+tab.connection.state.waiting=Wachten op verbinding
+tab.connection.port=Port:
+tab.connection.host=Host:
+tab.connection.button.connect=Verbind
+tab.connection.button.abort=Stop
+tab.connection.autodetect=Auto-detectie
+
+### Tab - Injection
+tab.injection=Injectie
+tab.injection.corrupted=isCorrupt
+tab.injection.corrupted.true=True
+tab.injection.corrupted.false=False
+tab.injection.description.header=header
+tab.injection.description.packets=packets
+tab.injection.description.id=id
+tab.injection.description.length=lengte
+tab.injection.send.toserver=Stuur naar server
+tab.injection.send.toclient=Stuur naar client
+tab.injection.history=Geschiedenis:
+tab.injection.history.clear=Wis
+tab.injection.history.tooltip=Dubbelklik op een packet om deze op te vragen
+tab.injection.log.packetwithid=Packet met id
+
+### Tab - Tools
+tab.tools=Tools
+tab.tools.button.encode=Codeer
+tab.tools.button.decode=Decodeer
+tab.tools.type.integer=Integer
+tab.tools.type.ushort=Ushort
+tab.tools.encoding=Codering
+tab.tools.decoding=Decodering
+tab.tools.packet=Packet
+tab.tools.expression=Expressie
+### Tab - Scheduler
+tab.scheduler=Planner
+tab.scheduler.table.index=Index
+tab.scheduler.table.packet=Packet
+tab.scheduler.table.interval=Interval
+tab.scheduler.table.destination=Bestemming
+tab.scheduler.table.edit=Bewerk
+tab.scheduler.setup.packet=Packet
+tab.scheduler.setup.interval=Interval
+tab.scheduler.button.clear=Wis
+tab.scheduler.button.clear.tooltip=Wis alle items
+tab.scheduler.button.save=S
+tab.scheduler.button.save.tooltip=Bewaar naar een bestand
+tab.scheduler.button.save.windowtitle=Bewaar Schedule Bestand
+tab.scheduler.button.load=L
+tab.scheduler.button.load.tooltip=Laad vanuit een bestand
+tab.scheduler.button.load.windowtitle=Laad Schedule Bestand
+tab.scheduler.button.add=Voeg toe
+tab.scheduler.button.edit=Bewerk
+tab.scheduler.direction.in=In
+tab.scheduler.direction.out=Uit
+tab.scheduler.hotkeys=Sneltoetsen (Ctrl+Shift+Index)
+tab.scheduler.filetype=Schedule Bestanden (*.sched)
+
+### Tab - Extensions
+tab.extensions=Extensies
+tab.extensions.table.title=Titel
+tab.extensions.table.description=Beschrijving
+tab.extensions.table.author=Auteur
+tab.extensions.table.version=Versie
+tab.extensions.table.edit=Bewerk
+tab.extensions.table.edit.delete.tooltip=Verbreek verbinding met deze extensie
+tab.extensions.table.edit.restart.tooltip=Herstart deze extensie
+tab.extensions.table.edit.uninstall.tooltip=Verwijder deze extensie
+tab.extensions.table.edit.uninstall.confirmation=Ben je zeker dat je deze extensie wil verwijderen?
+tab.extensions.port=Port
+tab.extensions.button.pythonshell=G-Python shell
+tab.extensions.button.pythonshell.windowtitle=Scripting shell
+tab.extensions.button.install=Installeer
+tab.extensions.button.install.windowtitle=Installeer extensie
+tab.extensions.button.install.filetype=G-Earth extensies
+tab.extensions.button.logs=Bekijk logs
+tab.extensions.button.logs.windowtitle=Extensie Console
+
+### Tab - Extra
+tab.extra=Extra
+tab.extra.notepad=Kladblok
+tab.extra.troubleshooting=Troubleshooting
+tab.extra.options.alwaysontop=Altijd bovenop
+tab.extra.options.staffpermissions=Client-side staff machtigingen
+tab.extra.options.pythonscripting=G-Python scripting
+tab.extra.options.pythonscripting.alert.title=G-Python installatie
+tab.extra.options.pythonscripting.alert.content=Voordat je G-Python kan gebruiken moet je de juiste packages installeren!
+tab.extra.options.pythonscripting.alert.moreinformation=Meer informatie hier:
+tab.extra.options.advanced=Geavanceerd
+tab.extra.options.advanced.socks=Gebruik SOCKS proxy
+tab.extra.options.advanced.proxy.ip=Proxy IP
+tab.extra.options.advanced.proxy.port=Proxy port
+tab.extra.options.advanced.disabledecryption=Schakel decryptie uit
+tab.extra.options.advanced.debugstdout=Debug naar stdout
+
+### Tab - Info
+tab.info=Info
+tab.info.description=Habbo packet manipulator voor Linux, Windows & Mac
+tab.info.donate=Doneer BTC
+tab.info.donate.alert.title=Doneer Bitcoins
+tab.info.donate.alert.content=Bitcoin publiek address:
+tab.info.createdby=Gemaakt door
+tab.info.links=Links
+tab.info.contributors=Bijdragers
+
+
+## Alert
+
+### Alert - Confirmation
+alert.confirmation.windowtitle=Bevestigings Dialog
+alert.confirmation.button.donotaskagain=Vraag het me niet nog eens
+alert.confirmation.button.remember=Onthoud mijn keuze
+
+### Alert - AdminValidator
+alert.adminvalidator.content=G-Earth heeft beheerdersrechten nodig om op Flash te kunnen werken,\n\
+ herstart G-Earth met beheerdersrechten tenzij je Unity gebruikt.
+
+### Alert - Outdated
+alert.outdated.title=G-Earth is verouderd!
+alert.outdated.content.newversion=Er is een nieuwe versie van G-Earth gevonden
+alert.outdated.content.update=Update naar de nieuwste versie
+
+### Alert - Invalid connection
+alert.invalidconnection.content=Je hebt ongeldige connectie informatie opgegeven, G-Earth kon niet verbinden
+
+### Alert - Nitro root certificate
+alert.rootcertificate.title=Basiscertificaat installatie
+alert.rootcertificate.remember=Onthoud mijn keuze
+alert.rootcertificate.content=G-Earth kan geen geïnstalleerd basiscertificaat vinden.\n\
+ Dit is nodig om met Nitro te verbinden, wil je verder gaan?\n\
+ G-Earth zal je voor beheerdersrechten vragen indien je verder gaat.
+
+### Alert - Already connected
+alert.alreadyconnected.content=G-Earth is reeds verbonden met dit hotel.\n\
+ Vanwege de huidige limieten kan je maar met één sessie per hotel verbinden in Ruwe IP-modus op Windows.\n\
+ \n\
+ Je kan dit omzeilen door een SOCKS proxy te gebruiken [Extra -> Geavanceerd -> SOCKS]
+
+### Alert - Something went wrong
+alert.somethingwentwrong.title=Er ging iets mis!
+alert.somethingwentwrong.content=Er ging iets mis!\n\
+ \n\
+ Ga naar de Troubleshooting pagina om het probleem op te lossen:
+
+### Alert - Allow extension connection
+alert.extconnection.content=De extension "%s" probeert te verbinden, maar is onbekend voor G-Earth,\n\
+ accepteer je deze verbinding?
+
+### Alert - G-Python error
+alert.gpythonerror.title=G-Python error
+alert.gpythonerror.content=Er ging iets mis bij het openen van de G-Python shell,\n\
+ ben je zeker dat je de installatie gids correct gevolgd hebt?\n\
+ \n\
+ Meer informatie hier:
+
+
+## Internal extension
+
+### Internal extension - G-ExtensionStore
+ext.store.elapsedtime.second.single=seconde
+ext.store.elapsedtime.second.multiple=seconden
+ext.store.elapsedtime.minute.single=minuut
+ext.store.elapsedtime.minute.multiple=minuten
+ext.store.elapsedtime.hour.single=uur
+ext.store.elapsedtime.hour.multiple=uren
+ext.store.elapsedtime.day.single=dag
+ext.store.elapsedtime.day.multiple=dagen
+ext.store.elapsedtime.week.single=week
+ext.store.elapsedtime.week.multiple=weken
+ext.store.elapsedtime.month.single=maand
+ext.store.elapsedtime.month.multiple=maanden
+ext.store.elapsedtime.year.single=jaar
+ext.store.elapsedtime.year.multiple=jaaren
+
+ext.store.extension.version=Versie
+ext.store.extension.rating=Rating
+ext.store.extension.madeby=Door %s
+ext.store.extension.lastupdated=laatst geupdate %s geleden
+ext.store.extension.notinstore=Niet gevonden in de G-ExtensionStore
+
+ext.store.extension.details.description=Beschrijving
+ext.store.extension.details.authors=Auteur(s)
+ext.store.extension.details.categories=Categorieën
+ext.store.extension.details.technical_information=Technische informatie
+ext.store.extension.details.click_here=Klik hier
+ext.store.extension.details.releases=Releases
+ext.store.extension.details.language=Taal
+ext.store.extension.details.source=Bron
+ext.store.extension.details.framework=Framework
+ext.store.extension.details.systems=Systemen
+ext.store.extension.details.clients=Compatibele clients
+ext.store.extension.details.screenshot=Screenshot
+
+ext.store.extension.author.reputation=reputatie
+ext.store.extension.author.releases=releases
+
+ext.store.extension.warning.requirement=Waarschuwing: het framework heeft --url:aanvullende installaties nodig-
+! IMPORTANT: the previous line has to end with the --url component like the english version
+ext.store.extension.warning.unstable=Waarschuwing: Deze extensie is als onstabiel aangegeven!
+
+ext.store.extension.status.await.install=Installeer extensie
+ext.store.extension.status.await.install.message=Klik op "OK" en wacht terwijl de extensie geïnstalleerd wordt
+ext.store.extension.status.await.update=Update extensie
+ext.store.extension.status.await.update.message=Klik op "OK" en wacht terwijl de extensie geupdate wordt
+ext.store.extension.status.success.install=Installatie klaar
+ext.store.extension.status.success.install.message=Extensie installatie succesvol afgerond
+ext.store.extension.status.success.update=Update klaar
+ext.store.extension.status.success.update.message=Extensie update succesvol afgerond
+ext.store.extension.status.error.install=Installatie misgelopen
+ext.store.extension.status.error.install.message=Installatie is misgelopen met de volgende melding:
+ext.store.extension.status.error.update=Update misgelopen
+ext.store.extension.status.error.update.message=Update is misgelopen met de volgende melding:
+
+ext.store.button.search=Zoek
+ext.store.button.install=Installeer
+ext.store.button.installed=Geïnstalleerd
+ext.store.button.update=Update
+
+ext.store.search.title=Zoek
+ext.store.search.description=Vind de extensie die je nodig hebt
+ext.store.search.contenttitle=Zoek extensies
+ext.store.search.bykeyword=Zoek met sleutelwoord
+ext.store.search.results=Zoekresultaten
+ext.store.search.ordering=Extensie ordening
+ext.store.search.ordering.bydate.title=Nieuwe releases
+ext.store.search.ordering.bydate.description=Extensies die recent aan de G-ExtensionStore zijn toegevoegd
+ext.store.search.ordering.bydate.contenttitle=Nieuwe Releases
+ext.store.search.ordering.byrating.title=Populaire Extensies
+ext.store.search.ordering.byrating.description=Extensies gesorteerd op rating
+ext.store.search.ordering.byrating.contenttitle=Populaire Extensies
+ext.store.search.ordering.byupdate.title=Recent Geupdate
+ext.store.search.ordering.byupdate.description=Extensies die recent geupdate zijn
+ext.store.search.ordering.byupdate.contenttitle=Recent Geupdate
+ext.store.search.filter.clients=Clients
+ext.store.search.filter.categories=Categorieën
+ext.store.search.filter.frameworks=Frameworks
+ext.store.search.info.automaticosfiltering=Info: er wordt automatisch gefilterd op je besturingssysteem
+
+ext.store.category=Categorie
+
+ext.store.overview.title=Geïnstalleerde Extensies
+ext.store.overview.description=Extensies die reeds in G-Earth geïnstalleerd zijn
+ext.store.overview.contenttitle=Geïnstalleerde extensies
+ext.store.overview.folder=Open map
+
+ext.store.categories.title=Categorieën
+ext.store.categories.description=Doorzoek de verschillende soorten extensies die G-Earth aan te bieden heeft
+ext.store.categories.contenttitle=Categorieën
+ext.store.fail.unzip=Error bij het unzippen
+ext.store.fail.invalidurl=Ongeldige extensie URL
+ext.store.fail.notavailable=Extensie is niet beschikbaar in de repository
+ext.store.fail.alreadyexists=Er ging iets mis bij het aanmaken van de map, bestaat de extensie al?
+ext.store.fail.notfound=Extension kon niet worden gevonden
+ext.store.fail.uninstall=Er ging iets mis met het deinstalleren van de extensie, zorg dat de je eerst de extensie's verbinding verbreekt indien deze nog aan stond.
+
+ext.store.ordering.rating=Rating
+ext.store.ordering.alphabetical=Alfabetisch
+ext.store.ordering.lastupdated=Laatst geüpdatet
+ext.store.ordering.newreleases=Nieuwe releases
+
+### Internal extension - Logger
+ext.logger.menu.window=Venster
+ext.logger.menu.window.alwaysontop=Altijd bovenop
+ext.logger.menu.window.onconnect=Bij verbinding
+ext.logger.menu.window.onconnect.openwindow=Open venster
+ext.logger.menu.window.onconnect.reset=Reset packetlogger
+ext.logger.menu.window.ondisconnect=Bij verbinding verbroken
+ext.logger.menu.window.ondisconnect.hidewindow=Verberg venster
+ext.logger.menu.window.ondisconnect.reset=Reset packetlogger
+
+ext.logger.menu.view=Weergave
+ext.logger.menu.view.incoming=Geef binnenkomend weer
+ext.logger.menu.view.outgoing=Geef uitgaand weer
+ext.logger.menu.view.autoscroll=Autoscroll
+ext.logger.menu.view.cleartext=Wis tekst
+
+ext.logger.menu.packets=Packets
+ext.logger.menu.packets.displaydetails=Geef details weer
+ext.logger.menu.packets.displaydetails.byterep=Byte voorstelling
+ext.logger.menu.packets.displaydetails.byterep.legacy=Legacy
+ext.logger.menu.packets.displaydetails.byterep.hexdump=Hexdump
+ext.logger.menu.packets.displaydetails.byterep.rawhex=Raw hex
+ext.logger.menu.packets.displaydetails.byterep.none=Geen
+ext.logger.menu.packets.displaydetails.message=Message
+ext.logger.menu.packets.displaydetails.message.name=Naam
+ext.logger.menu.packets.displaydetails.message.hash=Hash
+ext.logger.menu.packets.displaydetails.message.id=Id
+ext.logger.menu.packets.displaydetails.structure=Structuur
+ext.logger.menu.packets.displaydetails.timestamp=Tijdstempel
+ext.logger.menu.packets.antispam=Anti-spam filter
+ext.logger.menu.packets.antispam.none=Geen
+ext.logger.menu.packets.antispam.low=Laag
+ext.logger.menu.packets.antispam.med=Medium
+ext.logger.menu.packets.antispam.high=Hoog
+ext.logger.menu.packets.antispam.ultra=Ultra
+ext.logger.menu.packets.skipbig=Grote packets overslaan
+ext.logger.menu.packets.exportall=Exporteer alles
+ext.logger.menu.packets.exportall.windowtitle=Bewaar Packets
+ext.logger.menu.packets.exportall.filetype=TXT bestanden
+
+ext.logger.state.packetinfo=Packet info
+ext.logger.state.filtered=Gefilterd
+
+ext.logger.element.timestamp=tijdstempel
+ext.logger.element.blocked=Geblokkeerd
+ext.logger.element.replaced=Vervangen
+ext.logger.element.direction.outgoing=Binnenkomend
+ext.logger.element.direction.incoming=Uitgaand
+ext.logger.element.skipped=packet overgeslagen
+ext.logger.state.true=True
+ext.logger.state.false=False
\ No newline at end of file
diff --git a/G-Earth/src/main/resources/gearth/ui/translations/messages_pt.properties b/G-Earth/src/main/resources/gearth/ui/translations/messages_pt.properties
new file mode 100644
index 0000000..9be4b67
--- /dev/null
+++ b/G-Earth/src/main/resources/gearth/ui/translations/messages_pt.properties
@@ -0,0 +1,325 @@
+# Portuguese (Translated by Alynva)
+
+## Tabs
+
+### Tab - Connection
+tab.connection=Conexão
+tab.connection.client=Tipo do cliente:
+tab.connection.client.flash=Flash / Air
+tab.connection.client.unity=Unity
+tab.connection.client.nitro=Nitro
+tab.connection.version=Versão do Hotel:
+tab.connection.state=Estado da conexão:
+tab.connection.state.notconnected=Não conectado
+tab.connection.state.connected=Conectado
+tab.connection.state.waiting=Esperando conexão
+tab.connection.port=Porta:
+tab.connection.host=Host:
+tab.connection.button.connect=Conectar
+tab.connection.button.abort=Abortar
+tab.connection.autodetect=Autodetectar
+
+### Tab - Injection
+tab.injection=Injeção
+tab.injection.corrupted=estaCorrompido
+tab.injection.corrupted.true=Verdadeiro
+tab.injection.corrupted.false=Falso
+tab.injection.description.header=cabeçalho
+tab.injection.description.packets=pacotes
+tab.injection.description.id=id
+tab.injection.description.length=comprimento
+tab.injection.send.toserver=Enviar para o servidor
+tab.injection.send.toclient=Enviar para o cliente
+tab.injection.history=Histórico:
+tab.injection.history.clear=Limpar
+tab.injection.history.tooltip=Clique duas vezes em um pacote para restaurá-lo
+tab.injection.log.packetwithid=Pacote com id
+
+### Tab - Tools
+tab.tools=Ferramentas
+tab.tools.button.encode=Codificar
+tab.tools.button.decode=Decodificar
+tab.tools.type.integer=Inteiro
+tab.tools.type.ushort=Ushort
+tab.tools.encoding=Codificando
+tab.tools.decoding=Decodificando
+tab.tools.packet=Pacote
+tab.tools.expression=Expressão
+### Tab - Scheduler
+tab.scheduler=Agendador
+tab.scheduler.table.index=Índice
+tab.scheduler.table.packet=Pacote
+tab.scheduler.table.interval=Intervalo
+tab.scheduler.table.destination=Destino
+tab.scheduler.table.edit=Editar
+tab.scheduler.setup.packet=Pacote
+tab.scheduler.setup.interval=Intervalo
+tab.scheduler.button.clear=Limpar
+tab.scheduler.button.clear.tooltip=Limpar todos os itens
+tab.scheduler.button.save=S
+tab.scheduler.button.save.tooltip=Salvar para arquivo
+tab.scheduler.button.save.windowtitle=Salvar arquivo do Agendador
+tab.scheduler.button.load=C
+tab.scheduler.button.load.tooltip=Carregar de um arquivo
+tab.scheduler.button.load.windowtitle=Carregar arquivo do Agendador
+tab.scheduler.button.add=Adc
+tab.scheduler.button.edit=Editar
+tab.scheduler.direction.in=Chegando
+tab.scheduler.direction.out=Saindo
+tab.scheduler.hotkeys=Habilitar atalhos (Ctrl+Shift+Index)
+tab.scheduler.filetype=Arquivos do Agendador (*.sched)
+
+### Tab - Extensions
+tab.extensions=Extensões
+tab.extensions.table.title=Título
+tab.extensions.table.description=Descrição
+tab.extensions.table.author=Autor
+tab.extensions.table.version=Versão
+tab.extensions.table.edit=Editar
+tab.extensions.table.edit.delete.tooltip=Fechar conexão com esta extensão
+tab.extensions.table.edit.restart.tooltip=Reiniciar esta extensão
+tab.extensions.table.edit.uninstall.tooltip=Desinstalar esta extensão
+tab.extensions.table.edit.uninstall.confirmation=Você tem certeza que deseja desinstalar esta extensão?
+tab.extensions.port=Porta
+tab.extensions.button.pythonshell=Terminal G-Python
+tab.extensions.button.pythonshell.windowtitle=Terminal Scripting
+tab.extensions.button.install=Instalar
+tab.extensions.button.install.windowtitle=Instalar extensão
+tab.extensions.button.install.filetype=Extensões G-Earth
+tab.extensions.button.logs=Ver registros
+tab.extensions.button.logs.windowtitle=Console de Extensões
+
+### Tab - Extra
+tab.extra=Extra
+tab.extra.notepad=Anotações
+tab.extra.troubleshooting=Resolução de problemas
+tab.extra.options.alwaysontop=Manter no topo
+tab.extra.options.staffpermissions=Permissões de staff no Cliente
+tab.extra.options.pythonscripting=G-Python scripting
+tab.extra.options.pythonscripting.alert.title=Instalação do G-Python
+tab.extra.options.pythonscripting.alert.content=Antes de usar G-Python, instale os pacotes corretos usando pip!
+tab.extra.options.pythonscripting.alert.moreinformation=Mais informações aqui:
+tab.extra.options.advanced=Avançado
+tab.extra.options.advanced.socks=Usar proxy SOCKS
+tab.extra.options.advanced.proxy.ip=IP do proxy
+tab.extra.options.advanced.proxy.port=Porta do proxy
+tab.extra.options.advanced.disabledecryption=Desabilitar descriptografia
+tab.extra.options.advanced.debugstdout=Debugar para stdout
+
+### Tab - Info
+tab.info=Info
+tab.info.description=Manipulador de pacotes do Habbo para Linux, Windows e Mac
+tab.info.donate=Doar BTC
+tab.info.donate.alert.title=Doar Bitcoins
+tab.info.donate.alert.content=Endereço público Bitcoin:
+tab.info.createdby=Criado por
+tab.info.links=Links
+tab.info.contributors=Contribuidores
+
+
+## Alert
+
+### Alert - Confirmation
+alert.confirmation.windowtitle=Aviso de confirmação
+alert.confirmation.button.donotaskagain=Não pergunte novamente
+alert.confirmation.button.remember=Lembrar minha escolha
+
+### Alert - AdminValidator
+alert.adminvalidator.content=G-Earth requer privilégios de administrador para funcionar no Flash,\n\
+ por favor reinicie o G-Earth com permissões de administrador a não ser que\n\
+ você esteja usando Unity
+
+### Alert - Outdated
+alert.outdated.title=G-Earth está desatualizado!
+alert.outdated.content.newversion=Uma nova versão do G-Earth foi encontrada
+alert.outdated.content.update=Atualizar para a versão mais recente
+
+### Alert - Invalid connection
+alert.invalidconnection.content=Você entrou com inforções de conexão inválidas, o G-Earth não conseguiu se conectar
+
+### Alert - Nitro root certificate
+alert.rootcertificate.title=Instalação de certificado do root
+alert.rootcertificate.remember=Lembrar minha escolha
+alert.rootcertificate.content=G-Earth detectou que você não possui o certificado de autoridade do root instalado.\n\
+ Isso é necessário para o Nitro funcionar, você deseja continuar?\n\
+ G-Earth vai te pedir pela permissão de Administrador se você fizer isso.
+
+### Alert - Already connected
+alert.alreadyconnected.content=G-Earth já está conectado com este hotel.\n\
+ Devido a limitações atuais você só consegue se conectar a uma sessão por hotel no G-Earth em modo IP Bruto no Windows.\n\
+ \n\
+ Você pode contornar isso utilizando um proxy SOCKS [Extra -> Avançado -> SOCKS]
+
+### Alert - Something went wrong
+alert.somethingwentwrong.title=Algo inesperado aconteceu!
+alert.somethingwentwrong.content=Algo inesperado aconteceu!\n\
+ \n\
+ Vá para nossa página de Solução de problemas para resolver o ocorrido:
+
+### Alert - Allow extension connection
+alert.extconnection.content=Exntesão "%s" tentou se conectar mas é desconcida pelo G-Earth,\n\
+ aceitar essa conexão?
+
+### Alert - G-Python error
+alert.gpythonerror.title=Erro G-Python
+alert.gpythonerror.content=Algo inesperado aconteceu executando o terminal G-Python,\n\
+ você tem certeza que seguiu o guia de instalação corretamente?\n\
+ \n\
+ Mais informações aqui:
+
+
+## Internal extension
+
+### Internal extension - G-ExtensionStore
+ext.store.elapsedtime.second.single=secondo
+ext.store.elapsedtime.second.multiple=secondos
+ext.store.elapsedtime.minute.single=minuto
+ext.store.elapsedtime.minute.multiple=minutos
+ext.store.elapsedtime.hour.single=hora
+ext.store.elapsedtime.hour.multiple=horas
+ext.store.elapsedtime.day.single=dia
+ext.store.elapsedtime.day.multiple=dias
+ext.store.elapsedtime.week.single=semana
+ext.store.elapsedtime.week.multiple=semanas
+ext.store.elapsedtime.month.single=mês
+ext.store.elapsedtime.month.multiple=meses
+ext.store.elapsedtime.year.single=ano
+ext.store.elapsedtime.year.multiple=anos
+
+ext.store.extension.version=Versão
+ext.store.extension.rating=Avaliação
+ext.store.extension.madeby=Por %s
+ext.store.extension.lastupdated=última atualização %s atrás
+ext.store.extension.notinstore=Não encontrado na G-ExtensionStore
+ext.store.extension.details.description=Descrição
+ext.store.extension.details.authors=Autor(es)
+ext.store.extension.details.categories=Categorias
+ext.store.extension.details.technical_information=Informação técnica
+ext.store.extension.details.click_here=Clique aqui
+ext.store.extension.details.releases=Lançamentos
+ext.store.extension.details.language=Linguagem
+ext.store.extension.details.source=Origem
+ext.store.extension.details.framework=Framework
+ext.store.extension.details.systems=Sistemas
+ext.store.extension.details.clients=Clientes compatíveis
+ext.store.extension.details.screenshot=Captura de tela
+
+ext.store.extension.author.reputation=reputação
+ext.store.extension.author.releases=lançamentos
+
+ext.store.extension.warning.requirement=Aviso: o framework requer --url:instalações adicionais-
+! IMPORTANT: the previous line has to end with the --url component like the english version
+ext.store.extension.warning.unstable=Aviso: esta extensão foi marcada como instável!
+
+ext.store.extension.status.await.install=Instalar extensão
+ext.store.extension.status.await.install.message=Pressione "OK" e espere enquanto a extensão é instalada
+ext.store.extension.status.await.update=Atualizar extensão
+ext.store.extension.status.await.update.message=Pressione "OK" e espere enquanto a extensão é atualizada
+ext.store.extension.status.success.install=Instalação completa
+ext.store.extension.status.success.install.message=Instalação da extensão completa com sussesso
+ext.store.extension.status.success.update=Atualização completa
+ext.store.extension.status.success.update.message=Instalação da extensão completa com sucesso
+ext.store.extension.status.error.install=Instalação falhou
+ext.store.extension.status.error.install.message=Instalação falhou com a seguinte mensagem
+ext.store.extension.status.error.update=Atualização falhou
+ext.store.extension.status.error.update.message=Atualização falhou com a seguinte mensagem
+
+ext.store.button.search=Buscar
+ext.store.button.install=Instalar
+ext.store.button.installed=Instalado
+ext.store.button.update=Atualizar
+
+ext.store.search.title=Buscar
+ext.store.search.description=Encontre a extensão que se adequa às suas necessidades
+ext.store.search.contenttitle=Buscar extensões
+ext.store.search.bykeyword=Buscar por palavra-chave
+ext.store.search.results=Resultados da busca
+ext.store.search.ordering=Ordenação das extensões
+ext.store.search.ordering.bydate.title=Novos lançamentos
+ext.store.search.ordering.bydate.description=Extensões que foram recentemente adicionadas à G-ExtensionStore
+ext.store.search.ordering.bydate.contenttitle=Novos lançamentos
+ext.store.search.ordering.byrating.title=Extensões populares
+ext.store.search.ordering.byrating.description=Extensões ordenadas pela avaliação
+ext.store.search.ordering.byrating.contenttitle=Extensões populares
+ext.store.search.ordering.byupdate.title=Recentemente atualizadas
+ext.store.search.ordering.byupdate.description=Extensões que foram atualizadas recentemente
+ext.store.search.ordering.byupdate.contenttitle=Recentemente atualizadas
+ext.store.search.filter.clients=Clientes
+ext.store.search.filter.categories=Categorias
+ext.store.search.filter.frameworks=Frameworks
+ext.store.search.info.automaticosfiltering=Info: você é automaticamente filtrado pelo SO que você usa
+
+ext.store.category=Categoria
+
+ext.store.overview.title=Extensões instaladas
+ext.store.overview.description=Extensões que já estão instaladas no G-Earth
+ext.store.overview.contenttitle=Extensões instaladas
+ext.store.overview.folder=Abrir pasta
+
+ext.store.categories.title=Categorias
+ext.store.categories.description=Explore os diferentes tipos de extensões que o G-Earth tem a oferecer
+ext.store.categories.contenttitle=Categorias
+
+ext.store.fail.unzip=Error while unzipping
+ext.store.fail.invalidurl=Invalid extension URL
+ext.store.fail.notavailable=Extension not available in repository
+ext.store.fail.alreadyexists=Something went wrong creating the extension directory, does the extension already exist?
+ext.store.fail.notfound=Extension wasn't found
+ext.store.fail.uninstall=Something went wrong with uninstalling the extension, make sure to disconnect the extension if it was still running.
+
+ext.store.ordering.rating=Rating
+ext.store.ordering.alphabetical=Alphabetical
+ext.store.ordering.lastupdated=Last updated
+ext.store.ordering.newreleases=New releases
+
+### Internal extension - Logger
+ext.logger.menu.window=Janela
+ext.logger.menu.window.alwaysontop=Sempre no topo
+ext.logger.menu.window.onconnect=Quando conectar
+ext.logger.menu.window.onconnect.openwindow=Abrir janela
+ext.logger.menu.window.onconnect.reset=Redefinir registro de pacotes
+ext.logger.menu.window.ondisconnect=Quando desconectar
+ext.logger.menu.window.ondisconnect.hidewindow=Ocultar janela
+ext.logger.menu.window.ondisconnect.reset=Redefinir registro de pacotes
+
+ext.logger.menu.view=Ver
+ext.logger.menu.view.incoming=Ver chegando
+ext.logger.menu.view.outgoing=Ver saindo
+ext.logger.menu.view.autoscroll=Rolagem automática
+ext.logger.menu.view.cleartext=Limpar texto
+
+ext.logger.menu.packets=Pacotes
+ext.logger.menu.packets.displaydetails=Detalhes de exibição
+ext.logger.menu.packets.displaydetails.byterep=Representação em byte
+ext.logger.menu.packets.displaydetails.byterep.legacy=Legado
+ext.logger.menu.packets.displaydetails.byterep.hexdump=Hexdump
+ext.logger.menu.packets.displaydetails.byterep.rawhex=Hex cru
+ext.logger.menu.packets.displaydetails.byterep.none=Nenhum
+ext.logger.menu.packets.displaydetails.message=Menssagem
+ext.logger.menu.packets.displaydetails.message.name=Nome
+ext.logger.menu.packets.displaydetails.message.hash=Hash
+ext.logger.menu.packets.displaydetails.message.id=Id
+ext.logger.menu.packets.displaydetails.structure=Estrutura
+ext.logger.menu.packets.displaydetails.timestamp=Momento
+ext.logger.menu.packets.antispam=Filtro anti-spam
+ext.logger.menu.packets.antispam.none=Nenhum
+ext.logger.menu.packets.antispam.low=Baixo
+ext.logger.menu.packets.antispam.med=Médio
+ext.logger.menu.packets.antispam.high=Alto
+ext.logger.menu.packets.antispam.ultra=Ultra
+ext.logger.menu.packets.skipbig=Pular pacotes grandes
+ext.logger.menu.packets.exportall=Exportar todos
+ext.logger.menu.packets.exportall.windowtitle=Salvar Pacotes
+ext.logger.menu.packets.exportall.filetype=Arquivos TXT
+
+ext.logger.state.packetinfo=Informação do pacote
+ext.logger.state.filtered=Filtrado
+
+ext.logger.element.timestamp=momento
+ext.logger.element.blocked=Bloqueado
+ext.logger.element.replaced=Substituído
+ext.logger.element.direction.outgoing=Saindo
+ext.logger.element.direction.incoming=Chegando
+ext.logger.element.skipped=pacote pulado
+ext.logger.state.true=True
+ext.logger.state.false=False
diff --git a/G-Earth/src/main/resources/gearth/ui/translations/messages_tr.properties b/G-Earth/src/main/resources/gearth/ui/translations/messages_tr.properties
new file mode 100644
index 0000000..e848109
--- /dev/null
+++ b/G-Earth/src/main/resources/gearth/ui/translations/messages_tr.properties
@@ -0,0 +1,326 @@
+# Turkish (Translated by Curly!.)
+
+## Tabs
+
+### Tab - Connection
+tab.connection =Bağlantı
+tab.connection.client =Sunucu Türü:
+tab.connection.client.flash =Flash / Air
+tab.connection.client.unity =Unity
+tab.connection.client.nitro =Nitro
+tab.connection.version =Hotel Türü:
+tab.connection.state =Bağlantı Durumu:
+tab.connection.state.notconnected =Bağlı değil
+tab.connection.state.connected=Bağlandı
+tab.connection.state.waiting=Bağlantı bekleniyor
+tab.connection.port=Port:
+tab.connection.host=Host:
+tab.connection.button.connect=Bağlan
+tab.connection.button.abort=İptal
+tab.connection.autodetect=Otomatik Tespit Et
+
+### Tab - Injection
+tab.injection=Enjeksiyon
+tab.injection.corrupted=Bozulmuş
+tab.injection.corrupted.true=Doğru
+tab.injection.corrupted.false=Yanlış
+tab.injection.description.header=header
+tab.injection.description.packets=paketler
+tab.injection.description.id=id
+tab.injection.description.length=uzunluk
+tab.injection.send.toserver=Server a yolla
+tab.injection.send.toclient=Client a yolla
+tab.injection.history=Geçmiş:
+tab.injection.history.clear=Temizle
+tab.injection.history.tooltip=Bir paketi geri yüklemek için çift tıklayın
+tab.injection.log.packetwithid=ID'li paket
+
+### Tab - Tools
+tab.tools=Araçlar
+tab.tools.button.encode=Kodlamak
+tab.tools.button.decode=Kodu çözmek
+tab.tools.type.integer=Tamsayı
+tab.tools.type.ushort=Kısa
+tab.tools.encoding=Kodlamak
+tab.tools.decoding=Kodu çözmek
+tab.tools.packet=Paket
+tab.tools.expression=Anlatım
+
+### Tab - Scheduler
+tab.scheduler=Zamanlayıcı
+tab.scheduler.table.index=Indeks
+tab.scheduler.table.packet=Paket
+tab.scheduler.table.interval=Aralık
+tab.scheduler.table.destination=Mesafe
+tab.scheduler.table.edit=Edit
+tab.scheduler.setup.packet=Paket
+tab.scheduler.setup.interval=Aralık
+tab.scheduler.button.clear=Temizle
+tab.scheduler.button.clear.tooltip=Tüm itemleri temizle
+tab.scheduler.button.save=S
+tab.scheduler.button.save.tooltip=Dosyayı kaydetmek için
+tab.scheduler.button.save.windowtitle=Programlı dosyayı kaydet
+tab.scheduler.button.load=L
+tab.scheduler.button.load.tooltip=Dosya dan yükle
+tab.scheduler.button.load.windowtitle=Program Dosyasını Yükle
+tab.scheduler.button.add=Ekle
+tab.scheduler.button.edit=Editle
+tab.scheduler.direction.in=İçeri
+tab.scheduler.direction.out=Dışarı
+tab.scheduler.hotkeys=Kısayol tuşlarını etkinleştir (Ctrl+Shift+Index)
+tab.scheduler.filetype =Dosyaları planla(*.sched)
+
+### Tab - Extensions
+tab.extensions =Uzantılar
+tab.extensions.table.title =Başlık
+tab.extensions.table.description =Açıklama
+tab.extensions.table.author =Yazar
+tab.extensions.table.version =Versiyon
+tab.extensions.table.edit =Editle
+tab.extensions.table.edit.delete.tooltip =Bu uzantı ile olan bağlantıyı kes
+tab.extensions.table.edit.restart.tooltip=Bu uzantıyı yeniden başlat
+tab.extensions.table.edit.uninstall.tooltip=Bu uzantıyı kaldır
+tab.extensions.table.edit.uninstall.confirmation=Bu uzantıyı kaldırmak istediğinizden emin misiniz?
+tab.extensions.port=Port
+tab.extensions.button.pythonshell=G-Python kabuğu
+tab.extensions.button.pythonshell.windowtitle=Komut dosyası kabuğu
+tab.extensions.button.install=İndir
+tab.extensions.button.install.windowtitle=Uzantıyı indir
+tab.extensions.button.install.filetype=G-Earth Uzantıları
+tab.extensions.button.logs=Logları görüntüle
+tab.extensions.button.logs.windowtitle=Uzantı konsolu
+
+### Tab - Extra
+tab.extra=Ekstra
+tab.extra.notepad=Not dosyası
+tab.extra.troubleshooting=Sorun giderme
+tab.extra.options.alwaysontop=Her zaman üstte
+tab.extra.options.staffpermissions=İstemci tarafı personel izinleri
+tab.extra.options.pythonscripting=G-Python scripting
+tab.extra.options.pythonscripting.alert.title=G-Python Kurulum
+tab.extra.options.pythonscripting.alert.content=G-Python'u kullanmadan önce pip kullanarak doğru paketleri kurun!
+tab.extra.options.pythonscripting.alert.moreinformation =Daha fazla bilgi için:
+tab.extra.options.advanced =İleri
+tab.extra.options.advanced.socks =SOCKS proxy kullanın
+tab.extra.options.advanced.proxy.ip=Proxy IP
+tab.extra.options.advanced.proxy.port=Proxy port
+tab.extra.options.advanced.disabledecryption=Şifre çözmeyi devre dışı bırak
+tab.extra.options.advanced.debugstdout=stdout'ta hata ayıklama
+
+### Tab - Info
+tab.info=Bilgi
+tab.info.description=Linux, Windows ve Mac için Habbo paket manipülatörü
+tab.info.donate=BTC ile bağış yapın
+tab.info.donate.alert.title=Bitcoin bağışlayın
+tab.info.donate.alert.content=Bitcoin bağış adresi:
+tab.info.createdby=Kurucu
+tab.info.links=Linkler
+tab.info.contributors=Katkıda bulunanlar
+
+
+## Alert
+
+### Alert - Onayla
+alert.confirmation.windowtitle=Diyaloğu onayla
+alert.confirmation.button.donotaskagain=Tekrar sorma
+alert.confirmation.button.remember=Tercihimi hatırla
+
+### Alert - AdminValidator
+alert.adminvalidator.content=G-Earth'ün Flash üzerinde çalışabilmesi için yönetici ayrıcalıklarına ihtiyacı var,\n\
+ lütfen G-Earth'i yönetici izinleriyle yeniden başlatın, aksi takdirde\n\
+ Unity'yi kullanıyorsun
+
+### Alert - Eski versiyon
+alert.outdated.title=G-Earth Eski versiyon!
+alert.outdated.content.newversion=G-Earth için yeni bir versiyon bulundu
+alert.outdated.content.update=Son versiyona güncelle
+
+### Alert - Geçersiz bağlantı
+alert.invalidconnection.content=Geçersiz bağlantı bilgisi girdiniz, G-Earth bağlanamadı
+
+### Alert - Nitro root certificate
+alert.rootcertificate.title=Kök sertifika kurulumu
+alert.rootcertificate.remember=Tercihimi hatırla
+alert.rootcertificate.content=G-Earth, kök sertifika yetkilinizin kurulu olmadığını tespit etti.\n\
+ Nitro'nun çalışması için bu gerekli, devam etmek istiyor musunuz?\n\
+ Bunu yaparsanız G-Earth sizden Yönetici izni isteyecektir.
+
+### Alert - Zaten bağlı
+alert.alreadyconnected.content=G-Earth bu otele zaten bağlı.\n\
+ Mevcut sınırlamalar nedeniyle, Windows'ta Ham IP modunda G-Earth'e otel başına yalnızca bir oturum bağlayabilirsiniz.\n\
+ \n\
+ Bunu bir SOCKS proxy'si kullanarak atlayabilirsiniz.[Extra->Advanced->SOCKS]
+
+### Alert - Something went wrong
+alert.somethingwentwrong.title =Bir şeyler yanlış gitti!
+alert.somethingwentwrong.content=Bir şeyler yanlış!\n\
+ \n\
+ Sorunu çözmek için Sorun Giderme sayfamıza gidin:
+
+### Alert - Uzantı bağlantısına izin ver
+alert.extconnection.content =%s" uzantısı bağlanmaya çalışıyor ancak G-Earth tarafından bilinmiyor,\n\
+ Bu bağlantıyı kabul ediyor musunuz?
+
+### Alert - G-Python error
+alert.gpythonerror.title=G-Python hata
+alert.gpythonerror.content=Python kabuğu başlatılırken bir şeyler ters gitti,\n\
+ kurulum kılavuzunu doğru izlediğinizden emin misiniz?\n\
+ \n\
+ Daha fazla bilgi burada:
+
+
+## Internal extension
+
+### Internal extension - G-ExtensionStore
+ext.store.elapsedtime.second.single =saniye
+ext.store.elapsedtime.second.multiple =saniyeler
+ext.store.elapsedtime.minute.single =dakika
+ext.store.elapsedtime.minute.multiple =dakikalar
+ext.store.elapsedtime.hour.single =saat
+ext.store.elapsedtime.hour.multiple =saatler
+ext.store.elapsedtime.day.single =gün
+ext.store.elapsedtime.day.multiple =günler
+ext.store.elapsedtime.week.single =hafta
+ext.store.elapsedtime.week.multiple =haftalar
+ext.store.elapsedtime.month.single =ay
+ext.store.elapsedtime.month.multiple =aylar
+ext.store.elapsedtime.year.single =yıl
+ext.store.elapsedtime.year.multiple =yıllar
+
+ext.store.extension.version =Versiyon
+ext.store.extension.rating =Değerlendirme
+ext.store.extension.madeby =%s ile
+ext.store.extension.lastupdated =en son %s önce güncellendi
+ext.store.extension.notinstore=G-ExtensionStore da bulunamadı
+
+ext.store.extension.details.description=Açıklama
+ext.store.extension.details.authors=Yazar(lar)
+ext.store.extension.details.categories=Kategoriler
+ext.store.extension.details.technical_information=Teknik Bilgiler
+ext.store.extension.details.click_here=Buraya tıkla
+ext.store.extension.details.releases=Çıkanlar
+ext.store.extension.details.language=Dil
+ext.store.extension.details.source=Kaynak
+ext.store.extension.details.framework=Çerçeve
+ext.store.extension.details.systems=Sistemler
+ext.store.extension.details.clients=Uyumlu istemciler
+ext.store.extension.details.screenshot=Ekran Görüntüsü
+
+ext.store.extension.author.reputation=itibar
+ext.store.extension.author.releases=çıkanlar
+
+ext.store.extension.warning.requirement=Uyarı: çerçeve --url:ek kurulumlar gerektirir-
+! ÖNEMLİ: Bir önceki satırın ingilizce versiyonunda olduğu gibi --url bileşeni ile bitmesi gerekir.
+ext.store.extension.warning.unstable=Uyarı: bu uzantı kararsız olarak işaretlendi!
+
+ext.store.extension.status.await.install=Uzantıyı indir
+ext.store.extension.status.await.install.message="Tamam" a basın ve uzantı kurulurken bekleyin
+ext.store.extension.status.await.update=Uzantıyı güncelle
+ext.store.extension.status.await.update.message="Tamam" a basın ve uzantı güncellenmeye başlarken bekleyin
+ext.store.extension.status.success.install=İndirme tamamlandı
+ext.store.extension.status.success.install.message=Uzantı yüklemesi başarıyla tamamlandı
+ext.store.extension.status.success.update=Güncelleme tamamlandı
+ext.store.extension.status.success.update.message=Uzantı güncellemesi başarıyla tamamlandı
+ext.store.extension.status.error.install=Yükleme başarısız
+ext.store.extension.status.error.install.message=Yükleme aşağıdaki mesajla başarısız oldu
+ext.store.extension.status.error.update=Güncelleme başarısız
+ext.store.extension.status.error.update.message=Güncelleme aşağıdaki mesajla başarısız oldu
+
+ext.store.button.search=Ara
+ext.store.button.install=Yükle
+ext.store.button.installed=Yüklendi
+ext.store.button.update=Güncelle
+
+ext.store.search.title=Ara
+ext.store.search.description=İhtiyaçlarınıza uyan uzantıyı bulun
+ext.store.search.contenttitle=Uzantı Ara
+ext.store.search.bykeyword=Anahtar kelime ile ara
+ext.store.search.results=Sonuçları görüntüle
+ext.store.search.ordering=Uzantı alma
+ext.store.search.ordering.bydate.title=Yeni çıkanlar
+ext.store.search.ordering.bydate.description=G-ExtensionStore'a yakın zamanda eklenen uzantılar
+ext.store.search.ordering.bydate.contenttitle=Yeni çıkanlar
+ext.store.search.ordering.byrating.title=Popüler uzantılar
+ext.store.search.ordering.byrating.description=Derecelendirmeye göre sıralanmış uzantılar
+ext.store.search.ordering.byrating.contenttitle=Popüler Uzantılar
+ext.store.search.ordering.byupdate.title=Yeni Güncellenmiş
+ext.store.search.ordering.byupdate.description=Yakın zamanda güncellenen uzantılar
+ext.store.search.ordering.byupdate.contenttitle=Yeni Güncellenmiş
+ext.store.search.filter.clients=Client\\'ler
+ext.store.search.filter.categories=Kategoriler
+ext.store.search.filter.frameworks=Çerçeveler
+ext.store.search.info.automaticosfiltering=Bilgi: kullandığınız işletim sistemine otomatik olarak filtre uyguluyorsunuz
+
+ext.store.category=Category
+
+ext.store.overview.title=Yüklenmiş Uzantılar
+ext.store.overview.description=G-Earth'te zaten yüklü olan uzantılar
+ext.store.overview.contenttitle=Yüklenmiş Uzantılar
+ext.store.overview.folder=Dosyayı aç
+
+ext.store.categories.title=Kategoriler
+ext.store.categories.description=G-Earth'ün sunduğu farklı uzantı türlerini keşfedin
+ext.store.categories.contenttitle=Kategoriler
+
+ext.store.fail.unzip=Açılırken hata oluştu
+ext.store.fail.invalidurl=Geçersiz uzantı URL'si
+ext.store.fail.notavailable=Uzantı depoda mevcut değil
+ext.store.fail.alreadyexists=Uzantı dizini oluşturulurken bir şeyler ters gitti, uzantı zaten mevcut mu?
+ext.store.fail.notfound=Uzantı bulunamadı
+ext.store.fail.uninstall=Uzantıyı kaldırırken bir şeyler ters gitti, hala çalışıyorsa uzantının bağlantısını kestiğinizden emin olun.
+
+ext.store.ordering.rating=Değerlendirme
+ext.store.ordering.alphabetical=Alfabetik
+ext.store.ordering.lastupdated=Son güncellenmiş
+ext.store.ordering.newreleases=Yeni çıkanlar
+
+### Internal extension - Logger
+ext.logger.menu.window=Pencere
+ext.logger.menu.window.alwaysontop=Her zaman yukarıda
+ext.logger.menu.window.onconnect=Bağlantıda
+ext.logger.menu.window.onconnect.openwindow=Pencereyi aç
+ext.logger.menu.window.onconnect.reset=Paket kaydediciyi sıfırla
+ext.logger.menu.window.ondisconnect=Bağlantı kesildiğinde
+ext.logger.menu.window.ondisconnect.hidewindow=Pencereyi gizle
+ext.logger.menu.window.ondisconnect.reset=Paket kaydediciyi sıfırla
+
+ext.logger.menu.view=Göster
+ext.logger.menu.view.incoming=Gelenleri görüntüle
+ext.logger.menu.view.outgoing=Gidenleri görüntüle
+ext.logger.menu.view.autoscroll=Otomatik kaydırma
+ext.logger.menu.view.cleartext=Metni temizle
+
+ext.logger.menu.packets=Paketler
+ext.logger.menu.packets.displaydetails=Ayrıntıları görüntüle
+ext.logger.menu.packets.displaydetails.byterep=bayt temsili
+ext.logger.menu.packets.displaydetails.byterep.legacy=Kalıt
+ext.logger.menu.packets.displaydetails.byterep.hexdump=altılı döküm
+ext.logger.menu.packets.displaydetails.byterep.rawhex=ham altıgen
+ext.logger.menu.packets.displaydetails.byterep.none=Hiçbiri
+ext.logger.menu.packets.displaydetails.message=Mesaj
+ext.logger.menu.packets.displaydetails.message.name=İsim
+ext.logger.menu.packets.displaydetails.message.hash=Doğramak
+ext.logger.menu.packets.displaydetails.message.id=Id
+ext.logger.menu.packets.displaydetails.structure=Yapı
+ext.logger.menu.packets.displaydetails.timestamp=Zaman damgası
+ext.logger.menu.packets.antispam=Anti-spam filtresi
+ext.logger.menu.packets.antispam.none=Hiçbiri
+ext.logger.menu.packets.antispam.low=Düşük
+ext.logger.menu.packets.antispam.med=Orta
+ext.logger.menu.packets.antispam.high=Yüksek
+ext.logger.menu.packets.antispam.ultra=Ultra Yüksek
+ext.logger.menu.packets.skipbig=Büyük paketleri es geç
+ext.logger.menu.packets.exportall=Tümünü dışa aktar
+ext.logger.menu.packets.exportall.windowtitle=Paketleri Kaydet
+ext.logger.menu.packets.exportall.filetype=TXT dosyaları
+
+ext.logger.state.packetinfo=Paket bilgisi
+ext.logger.state.filtered=Filtrelendi
+ext.logger.element.timestamp=zaman damgası
+ext.logger.element.blocked=Engellendi
+ext.logger.element.replaced=Yeniden yerleştirildi
+ext.logger.element.direction.outgoing=Dışarı çıkan
+ext.logger.element.direction.incoming=İçeri giren
+ext.logger.element.skipped=Paket es geçildi
+ext.logger.state.true=Doğru
+ext.logger.state.false=Yanlış
\ No newline at end of file
Info: you are automatically filtering on the OS you use
") + .append("").append(LanguageBundle.get("ext.store.search.info.automaticosfiltering")).append("
") .append("