问题描述
在学习了基础知识之后,我才开始编写我的第一个JavaFX 2应用程序,并希望对其进行国际化.
I've just started writing my first JavaFX 2 application after learning the basics and would like to internationalize it.
我注意到在JavaFX 1.x中,脚本语言允许非常简单的字符串国际化. JavaFX 2中有任何类似的功能吗?
I notice that in JavaFX 1.x, the scripting language allowed for very simple internationalization of strings. Are there any similar features in JavaFX 2?
基本上:国际化JavaFX 2应用程序的最佳实践是什么?
Basically: what is the best practice for internationalizing a JavaFX 2 application?
推荐答案
java应用程序国际化的基本步骤(其中包括)是Locale
lizing和资源捆绑.在JavaFX中,您可以将FXMLLoader#setResources()
用于此目的.这里是一个SSCCE演示来演示它.这些代码具有自我描述性.
演示包结构:
The basic steps (among others) of a java app internationalizing, are Locale
lizing and resource bundling. In JavaFX, you can use FXMLLoader#setResources()
for that purposes. Here a SSCCE demo to demonstrate it. The codes are self-descriptive.
Demo package structure:
bundledemo
|------ BundleDemo.java
|------ MyController.java
|------ MyView.fxml
bundles
|------ MyBundle_en.properties
|------ MyBundle_kg.properties
MyBundle_zh.properties
MyBundle_en.properties
key1=Name Surname
key2=How are you?
MyBundle_kg.properties
MyBundle_kg.properties
key1=Aты Жөнү
key2=Кандайсың?
MyView.fxml
MyView.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.*?>
<BorderPane fx:controller="bundledemo.MyController" xmlns:fx="http://javafx.com/fxml">
<top>
<!-- This label's text will be set by the controller -->
<Label fx:id="lblTextByController"/>
</top>
<center>
<!-- This label's text will be taken from the bundle automatically -->
<Label text="%key2"/>
</center>
</BorderPane>
MyController.java
MyController.java
package bundledemo;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
public class MyController implements Initializable {
@FXML private Label lblTextByController;
private ResourceBundle bundle;
@Override
public void initialize(URL location, ResourceBundle resources) {
bundle = resources;
lblTextByController.setText(bundle.getString("key1"));
}
}
BundleDemo.java
BundleDemo.java
package bundledemo;
// imports are ignored.
public class BundleDemo extends Application {
private Stage stage;
@Override
public void start(Stage primaryStage) {
stage = primaryStage;
Button btnEN = new Button();
btnEN.setText("English");
btnEN.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
loadView(new Locale("en", "EN"));
}
});
Button btnKG = new Button();
btnKG.setText("Kyrgyz");
btnKG.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
loadView(new Locale("kg", "KG"));
}
});
VBox root = new VBox(20);
root.getChildren().add(HBoxBuilder.create().spacing(10).style("-fx-background-color: gray").padding(new Insets(5)).children(btnEN, btnKG).build());
root.getChildren().add(new StackPane());
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
private void loadView(Locale locale) {
try {
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setResources(ResourceBundle.getBundle("bundles.MyBundle", locale));
Pane pane = (BorderPane) fxmlLoader.load(this.getClass().getResource("MyView.fxml").openStream());
// replace the content
StackPane content = (StackPane) ((VBox) stage.getScene().getRoot()).getChildren().get(1);
content.getChildren().clear();
content.getChildren().add(pane);
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
屏幕截图:
这篇关于JavaFX 2和国际化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!