本地化JavaFx控件

use*_*946 5 java localization javafx

我正在尝试为JavaFx控件添加我的语言的ResourceBundle,但我没有这样做.

我试图在类路径中添加controls_fi_FI.properties ..并希望它可以工作,但没有.

然后我查看了JavaFx的ControlResources类,它负责本地化控件,我注意到bundle的基本名称是"com\sun\javafx\scene\control\skin\resources\controls".

如何将我的属性文件添加到此捆绑包中?我觉得奇怪的是,几乎没有关于如何做到这一点的任何信息?

Jam*_*s_D 4

我只能通过相当大规模的黑客攻击才能让它工作,这甚至不能远程移植。然而,也许它会给你足够的空间来创建一个可行的解决方案。(这适用于 Java 8。)

我创建了一个包com.sun.javafx.scene.control.skin.resources,并用单行在其中创建了一个controls_fi_FI.properties 文件

ProgressIndicator.doneString=Valmis
Run Code Online (Sandbox Code Playgroud)

我使用以下内容创建了一个测试应用程序:

import java.util.Locale;
import java.util.ResourceBundle;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.BorderPane;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
            System.out.println(ResourceBundle.getBundle("com/sun/javafx/scene/control/skin/resources/controls").getString("ProgressIndicator.doneString"));

            BorderPane root = new BorderPane();
            ProgressIndicator progressIndicator = new ProgressIndicator(1);
            root.setCenter(progressIndicator);
            Scene scene = new Scene(root,400,400);
            primaryStage.setScene(scene);
            primaryStage.show();
    }

    public static void main(String[] args) {
        Locale.setDefault(new Locale("fi", "FI"));
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

运行此应用程序的大多数方式都无法按预期工作:虽然会System.out.println(...)产生正确的结果,但进度指示器中显示的文本是错误的。

但是,如果我捆绑com/sun/javafx/control/skin/resources/controls_fi_FI.properties一个 jar 文件,并将该 jar 文件移动到jre/lib/ext我的 JDK 安装的子目录(即与 相同的位置jfxrt.jar),它会按要求运行(至少在我的简单测试中;正如我所说,我不做声称这是任何一种稳健的解决方案)。

问题似乎是ControlsResources由扩展类加载器加载,并且使用相同的类加载器加载资源包。

凭借比我更好的类加载器知识,您也许能够将其塑造成一个合理的解决方案......