Archived
0

- add localization support

- add english language
This commit is contained in:
iMoHax
2014-08-27 14:43:27 +04:00
parent c011ea05d5
commit 9d58026568
22 changed files with 502 additions and 142 deletions

View File

@@ -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")));

View File

@@ -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()){

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;
}
}