- add localization support
- add english language
This commit is contained in:
@@ -9,6 +9,7 @@ import org.controlsfx.dialog.*;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import ru.trader.controllers.Screeners;
|
||||
import ru.trader.view.support.Localization;
|
||||
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
import java.io.File;
|
||||
@@ -17,28 +18,16 @@ import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Locale;
|
||||
|
||||
public class Main extends Application {
|
||||
private final static Logger LOG = LoggerFactory.getLogger(Main.class);
|
||||
private static Stage primaryStage;
|
||||
|
||||
@Override
|
||||
public void start(Stage primaryStage) throws Exception {
|
||||
primaryStage.setTitle("Trader");
|
||||
primaryStage.setMinHeight(590);
|
||||
primaryStage.setScene(new Scene(Screeners.newScreeners(Main.class.getResource("/view/main.fxml"),getUrl("style.css").toExternalForm())));
|
||||
primaryStage.setOnCloseRequest((we)->{
|
||||
try {
|
||||
if (World.getMarket().isChange()){
|
||||
Action res = Screeners.showConfirm("Изменения не были сохранены, сохранить?");
|
||||
if (res == Dialog.Actions.YES) World.save();
|
||||
else if (res == Dialog.Actions.CANCEL) we.consume();
|
||||
}
|
||||
Screeners.closeAll();
|
||||
} catch (FileNotFoundException | UnsupportedEncodingException | XMLStreamException e) {
|
||||
LOG.error("Ошибка при сохранении",e);
|
||||
Screeners.showException(e);
|
||||
}
|
||||
});
|
||||
Main.primaryStage = primaryStage;
|
||||
loadMainScene();
|
||||
loadResources();
|
||||
primaryStage.show();
|
||||
}
|
||||
@@ -61,6 +50,34 @@ public class Main extends Application {
|
||||
}
|
||||
|
||||
|
||||
public static void changeLocale(Locale locale) throws IOException {
|
||||
Localization.setLocale(locale);
|
||||
primaryStage.hide();
|
||||
loadMainScene();
|
||||
loadResources();
|
||||
primaryStage.show();
|
||||
}
|
||||
|
||||
private static void loadMainScene() throws IOException {
|
||||
primaryStage.setTitle(Localization.getString("main.title"));
|
||||
primaryStage.setMinHeight(590);
|
||||
primaryStage.setScene(new Scene(Screeners.newScreeners(Main.class.getResource("/view/main.fxml"),getUrl("style.css").toExternalForm())));
|
||||
primaryStage.setOnCloseRequest((we)->{
|
||||
try {
|
||||
if (World.getMarket().isChange()){
|
||||
Action res = Screeners.showConfirm(Localization.getString("dialogs.save"));
|
||||
if (res == Dialog.Actions.YES) World.save();
|
||||
else if (res == Dialog.Actions.CANCEL) we.consume();
|
||||
}
|
||||
Screeners.closeAll();
|
||||
} catch (FileNotFoundException | UnsupportedEncodingException | XMLStreamException e) {
|
||||
LOG.error("Ошибка при сохранении",e);
|
||||
Screeners.showException(e);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private static void loadResources() throws IOException {
|
||||
Screeners.loadItemDescStage(getUrl(("itemDesc.fxml")));
|
||||
Screeners.loadVEditorStage(getUrl(("vEditor.fxml")));
|
||||
|
||||
@@ -3,22 +3,29 @@ package ru.trader.controllers;
|
||||
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.Menu;
|
||||
import javafx.scene.control.RadioMenuItem;
|
||||
import javafx.scene.control.ToggleGroup;
|
||||
import javafx.scene.layout.BorderPane;
|
||||
import javafx.stage.FileChooser;
|
||||
import org.controlsfx.dialog.Dialogs;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.xml.sax.SAXException;
|
||||
import ru.trader.Main;
|
||||
import ru.trader.World;
|
||||
import ru.trader.model.ItemModel;
|
||||
import ru.trader.model.MarketModel;
|
||||
import ru.trader.view.support.Localization;
|
||||
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.Locale;
|
||||
import java.util.Optional;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class MainController {
|
||||
private final static Logger LOG = LoggerFactory.getLogger(MainController.class);
|
||||
@@ -30,11 +37,43 @@ public class MainController {
|
||||
@FXML
|
||||
private BorderPane mainPane;
|
||||
|
||||
@FXML
|
||||
private Menu langs;
|
||||
|
||||
@FXML
|
||||
private OffersController offersController;
|
||||
@FXML
|
||||
private ItemsController itemsController;
|
||||
|
||||
|
||||
|
||||
@FXML
|
||||
private void initialize() {
|
||||
fillLangs();
|
||||
}
|
||||
|
||||
private void fillLangs() {
|
||||
ToggleGroup toggleGroup = new ToggleGroup();
|
||||
for (Locale locale : Localization.getLocales()) {
|
||||
ResourceBundle rb = Localization.getResources(locale);
|
||||
RadioMenuItem mi = new RadioMenuItem(rb.getString("main.menu.file.language.item"));
|
||||
mi.setToggleGroup(toggleGroup);
|
||||
mi.setUserData(locale);
|
||||
if (locale.equals(Localization.getCurrentLocale())) mi.setSelected(true);
|
||||
langs.getItems().add(mi);
|
||||
}
|
||||
toggleGroup.selectedToggleProperty().addListener((cb, o, n) -> {
|
||||
try {
|
||||
if (n!=null)
|
||||
Main.changeLocale((Locale) n.getUserData());
|
||||
} catch (IOException e) {
|
||||
LOG.error("Error on change locale to {}", n.getUserData());
|
||||
LOG.error("",e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public OffersController getOffersController() {
|
||||
return offersController;
|
||||
}
|
||||
@@ -83,8 +122,8 @@ public class MainController {
|
||||
|
||||
public Optional<ItemModel> addItem(){
|
||||
Optional<String> res = Dialogs.create()
|
||||
.title("Добавление нового товара")
|
||||
.message("Введите название товара")
|
||||
.title(Localization.getString("dialogs.addItem.title"))
|
||||
.message(Localization.getString("dialogs.addItem.message"))
|
||||
.showTextInput();
|
||||
ItemModel item = null;
|
||||
if (res.isPresent()){
|
||||
|
||||
@@ -17,6 +17,7 @@ import ru.trader.model.OfferDescModel;
|
||||
import ru.trader.model.OfferModel;
|
||||
import ru.trader.model.OrderModel;
|
||||
import ru.trader.model.support.BindingsHelper;
|
||||
import ru.trader.view.support.Localization;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
@@ -75,7 +76,7 @@ public class OrdersController {
|
||||
|
||||
init(offers, balance, max);
|
||||
|
||||
Dialog dlg = new Dialog(parent, "Создание заказов");
|
||||
Dialog dlg = new Dialog(parent, Localization.getString("orders.title"));
|
||||
dlg.setContent(content);
|
||||
dlg.getActions().addAll(OK, Dialog.Actions.CANCEL);
|
||||
dlg.setResizable(false);
|
||||
|
||||
@@ -10,6 +10,7 @@ import org.controlsfx.control.action.AbstractAction;
|
||||
import org.controlsfx.control.action.Action;
|
||||
import org.controlsfx.dialog.Dialog;
|
||||
import ru.trader.model.PathRouteModel;
|
||||
import ru.trader.view.support.Localization;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
@@ -41,7 +42,7 @@ public class PathsController {
|
||||
|
||||
init(paths);
|
||||
|
||||
Dialog dlg = new Dialog(parent, String.format("Доступные маршруты"));
|
||||
Dialog dlg = new Dialog(parent, Localization.getString("paths.title"));
|
||||
dlg.setContent(content);
|
||||
dlg.getActions().addAll(OK, Dialog.Actions.CANCEL);
|
||||
dlg.setResizable(false);
|
||||
|
||||
@@ -14,7 +14,7 @@ import ru.trader.view.support.NumberField;
|
||||
import ru.trader.view.support.RouteNode;
|
||||
|
||||
|
||||
public class RoutersController {
|
||||
public class RouterController {
|
||||
|
||||
@FXML
|
||||
private NumberField balance;
|
||||
@@ -10,6 +10,7 @@ import org.controlsfx.control.action.Action;
|
||||
import org.controlsfx.dialog.Dialogs;
|
||||
import ru.trader.model.*;
|
||||
import ru.trader.view.support.CustomBuilderFactory;
|
||||
import ru.trader.view.support.Localization;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
@@ -35,7 +36,7 @@ public class Screeners {
|
||||
private static PathsController pathsController;
|
||||
|
||||
private static FXMLLoader initLoader(URL url){
|
||||
FXMLLoader loader = new FXMLLoader(url);
|
||||
FXMLLoader loader = new FXMLLoader(url, Localization.getResources());
|
||||
loader.setBuilderFactory(new CustomBuilderFactory());
|
||||
return loader;
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import org.controlsfx.control.action.AbstractAction;
|
||||
import org.controlsfx.control.action.Action;
|
||||
import org.controlsfx.dialog.Dialog;
|
||||
import ru.trader.model.OrderModel;
|
||||
import ru.trader.view.support.Localization;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
@@ -49,7 +50,7 @@ public class TopOrdersController {
|
||||
|
||||
init(orders);
|
||||
|
||||
Dialog dlg = new Dialog(parent, "TOP заказов");
|
||||
Dialog dlg = new Dialog(parent, Localization.getString("topOrders.title"));
|
||||
dlg.setContent(content);
|
||||
dlg.getActions().addAll(OK, Dialog.Actions.CANCEL);
|
||||
dlg.setResizable(false);
|
||||
|
||||
@@ -9,7 +9,6 @@ import javafx.scene.Parent;
|
||||
import javafx.scene.control.TableColumn;
|
||||
import javafx.scene.control.TableView;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.util.converter.DoubleStringConverter;
|
||||
import org.controlsfx.control.ButtonBar;
|
||||
import org.controlsfx.control.action.AbstractAction;
|
||||
import org.controlsfx.control.action.Action;
|
||||
@@ -19,6 +18,7 @@ import org.slf4j.LoggerFactory;
|
||||
import ru.trader.core.OFFER_TYPE;
|
||||
import ru.trader.model.*;
|
||||
import ru.trader.model.support.BindingsHelper;
|
||||
import ru.trader.view.support.Localization;
|
||||
import ru.trader.view.support.NumberField;
|
||||
import ru.trader.view.support.PriceStringConverter;
|
||||
import ru.trader.view.support.ViewUtils;
|
||||
@@ -32,7 +32,7 @@ public class VendorEditorController {
|
||||
|
||||
private VendorModel vendor;
|
||||
|
||||
private final Action actSave = new AbstractAction("Сохранить") {
|
||||
private final Action actSave = new AbstractAction(Localization.getString("vEditor.save")) {
|
||||
{
|
||||
ButtonBar.setType(this, ButtonBar.ButtonType.OK_DONE);
|
||||
}
|
||||
@@ -85,7 +85,7 @@ public class VendorEditorController {
|
||||
if (vendor != null) {
|
||||
fill();
|
||||
}
|
||||
Dialog dlg = new Dialog(parent, vendor == null ? "Добавление станции" : "Редактирование станции");
|
||||
Dialog dlg = new Dialog(parent, Localization.getString(vendor == null ? "vEditor.title.add" : "vEditor.title.edit"));
|
||||
dlg.setContent(content);
|
||||
dlg.getActions().addAll(actSave, Dialog.Actions.CANCEL);
|
||||
dlg.setResizable(false);
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
package ru.trader.view.support;
|
||||
|
||||
import ru.trader.Main;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Locale;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class Localization {
|
||||
private static final Locale DEFAULT = new Locale("ru", "RU");
|
||||
private static final ClassLoader loader = getLoader();
|
||||
private static final Locale[] supportedLocales = {
|
||||
DEFAULT,
|
||||
new Locale("en", "US")
|
||||
};
|
||||
|
||||
private static ResourceBundle rb = ResourceBundle.getBundle("locale", DEFAULT, loader);
|
||||
private static Locale locale = DEFAULT;
|
||||
|
||||
|
||||
static {
|
||||
setLocale(Locale.getDefault());
|
||||
}
|
||||
|
||||
private static Locale getSupported(Locale locale){
|
||||
for (Locale l : supportedLocales) {
|
||||
if (l.getLanguage().equals(locale.getLanguage()))
|
||||
return l;
|
||||
}
|
||||
return DEFAULT;
|
||||
}
|
||||
|
||||
private static ClassLoader getLoader() {
|
||||
try {
|
||||
URL url = Main.class.getResource("/lang/");
|
||||
File file = new File("lang");
|
||||
if (file.exists() && file.isDirectory())
|
||||
url = file.toURI().toURL();
|
||||
return new URLClassLoader(new URL[]{url});
|
||||
} catch (MalformedURLException e) {
|
||||
return ClassLoader.getSystemClassLoader();
|
||||
}
|
||||
}
|
||||
|
||||
public static void setLocale(Locale locale){
|
||||
Locale.setDefault(locale);
|
||||
Localization.locale = locale;
|
||||
rb = getResources(locale);
|
||||
}
|
||||
|
||||
public static ResourceBundle getResources(Locale locale){
|
||||
return ResourceBundle.getBundle("locale", getSupported(locale), loader);
|
||||
}
|
||||
|
||||
public static ResourceBundle getResources(){
|
||||
return rb;
|
||||
}
|
||||
|
||||
public static Collection<Locale> getLocales(){
|
||||
return Arrays.asList(supportedLocales);
|
||||
}
|
||||
|
||||
public static String getString(String key){
|
||||
return rb.getString(key);
|
||||
}
|
||||
|
||||
public static Locale getCurrentLocale() {
|
||||
return locale;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user