我想寻求有关 JavaFX 内置对话框中按钮国际化的帮助。
按钮的翻译可在 https://github.com/openjdk/jfx/tree/master/modules/javafx.controls/src/main/resources/com/sun/javafx/scene/control/skin/resources 还有一些其他国家/地区也可以使用英语变体。
从代码 POV 翻译由此类加载:https://github.com/openjdk/jfx/blob/master/modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/皮肤/资源/ControlResources.java
public final class ControlResources {
// Translatable properties
private static final String BASE_NAME = "com/sun/javafx/scene/control/skin/resources/controls";
public static String getString(String key) {
return ResourceBundle.getBundle(BASE_NAME).getString(key);
}
}
要添加自定义翻译,我将在以下包下的应用程序资源中创建新的 controls_xx.properties 文件:com/sun/javafx/scene/control/skin/resources/controls。
问题是“java-modules”不允许一个包包含在多个模块中。
为 JavaFX 对话框加载自定义翻译有哪些可能性?
注意:禁用“java-modules”不是一个选项。
谢谢你
编辑:我知道这个线程:Javafx 国际化与自定义语言
我不能百分百确定我理解,但如果我理解正确的话,这里有一个解决方法。
这很乏味:使用
lookupButton
找到按钮。
示例
import java.util.Locale;
import java.util.Optional;
import java.util.ResourceBundle;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
/**
* JavaFX App
*/
public class App extends Application {
@Override
public void start(Stage stage) {
Locale defaultLocale = Locale.getDefault();
System.out.println("default Locale: " + defaultLocale.toLanguageTag());
ResourceBundle resourceBundle = ResourceBundle.getBundle("sed.work.internationalizationexample.resourcebundle.main", defaultLocale);
Button btnAlert = new Button("Press for alert!");
btnAlert.setOnAction((t) -> {
Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle(resourceBundle.getString("alertTitle"));
alert.setHeaderText(resourceBundle.getString("alertHeaderText"));
alert.setContentText(resourceBundle.getString("alertContentText"));
Button okButton = (Button)alert.getDialogPane().lookupButton(ButtonType.OK);
okButton.setText(resourceBundle.getString("alertOkBtnText"));
Button cancelButton = (Button)alert.getDialogPane().lookupButton(ButtonType.CANCEL);
cancelButton.setText(resourceBundle.getString("alertCancelBtnText"));
Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK){
// ... user chose OK
} else {
// ... user chose CANCEL or closed the dialog
}
});
//var label = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
var scene = new Scene(new StackPane(btnAlert), 640, 480);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
输出