我目前正在开发应用程序中的内部化功能。
我创建了2个文件,2种可用语言的捆绑包文件夹:
messages_pl.properties and messages_en.properties.
在主fxml文件(也包含menuBar)中,为每个控件设置内部化资源。
这段代码非常适合我,我可以从“ en”切换为“ pl”
public void start(Stage primaryStage) throws Exception {
Locale.setDefault(new Locale("en"));
Pane borderPane = FxmlUtils.fxmlLoader(BORDER_PANE_MAIN_FXML);
Scene scene = new Scene(borderPane);
primaryStage.setScene(scene);
primaryStage.setTitle(FxmlUtils.getResourceBundle().getString("tittle.application"));
primaryStage.show();
问题是我不想操纵代码,每次需要更改语言时都从en切换到pl。
如果我选择RadioMenuItem“波兰语”或RadioMenutItem“英语”,我希望动态地使用它。
您知道如何修改我的源代码吗?
答案 0 :(得分:0)
我找到了一个解决方案,它不是最漂亮的,但它可以起作用:
Controller
:
public class Controller implements Initializable {
@FXML
private MenuItem en;
@FXML
private MenuItem de;
Runnable changeLanguage; // add setter
@Override
public void initialize(URL location, ResourceBundle resources) {
en.setOnAction(event -> {
Locale.setDefault(Locale.ENGLISH);
reload();
});
de.setOnAction(event -> {
Locale.setDefault(Locale.GERMAN);
reload();
});
}
private void reload() {
changeLanguage.run();
}
}
Main
:
public class Main extends Application {
private Stage primary;
@Override
public void start(Stage primaryStage) throws Exception {
this.primary = primaryStage;
load();
primaryStage.show();
}
private void load() throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
loader.setResources(ResourceBundle.getBundle("stackoverflow/language/language", Locale.getDefault())); // the main package is stackoverflow which contains language
primary.setScene(new Scene(loader.load(), 400, 600));
Controller controller = loader.getController();
controller.changeLanguage = () -> {
try {
load();
} catch (IOException e) {
e.printStackTrace();
}
};
}
public static void main(String[] args) {
Locale.setDefault(Locale.ENGLISH);
launch(args);
}
}
和View.fxml
:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuItem?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="stackoverflow.language.Controller">
<MenuBar>
<Menu text="%language">
<MenuItem fx:id="en" text="%en"/>
<MenuItem fx:id="de" text="%de"/>
</Menu>
</MenuBar>
</AnchorPane>
这是类的方式: