基于java模块的项目中的JavaFX对话框国际化

问题描述 投票:0回答:1

我想寻求有关 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 国际化与自定义语言

java javafx dialog internationalization
1个回答
0
投票

我不能百分百确定我理解,但如果我理解正确的话,这里有一个解决方法。

这很乏味:使用

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

}

输出

© www.soinside.com 2019 - 2024. All rights reserved.