gpt4 book ai didi

internationalization - JavaFX 2 和国际化

转载 作者:行者123 更新时间:2023-12-03 05:15:08 26 4
gpt4 key购买 nike

在学习基础知识后,我刚刚开始编写我的第一个 JavaFX 2 应用程序,并希望将其国际化。

我注意到在 JavaFX 1.x 中,脚本语言允许非常简单的字符串国际化。 JavaFX 2 中是否有类似的功能?

基本上:国际化 JavaFX 2 应用程序的最佳实践是什么?

最佳答案

Java 应用程序国际化的基本步骤(除其他外)是区域设置化和资源捆绑。在 JavaFX 中,您可以使用 FXMLLoader#setResources() 来实现此目的。这里有一个 SSCCE 演示来演示它。这些代码是 self 描述的。
演示包结构:

bundledemo
|------ BundleDemo.java
|------ MyController.java
|------ MyView.fxml
bundles
|------ MyBundle_en.properties
|------ MyBundle_kg.properties

MyBundle_en.properties

key1=Name Surname
key2=How are you?

MyBundle_kg.properties

key1=Aты Жөнү
key2=Кандайсың?

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

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

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

屏幕截图:

enter image description here

<小时/>

如果您的国际化文本需要以用户目标系统上可能存在的字体呈现,那么您可以:

  1. 将字体嵌入到您的应用程序中:

或者

  • Use web(Google) fonts in JavaFX .
  • 如果所需的字体不可用,则国际化文本可能会显示为难以理解的乱码,即使有关设置的其他一切都很好。

    关于internationalization - JavaFX 2 和国际化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10143392/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com