我正在尝试使用Afterburner.fx(https://github.com/AdamBien/afterburner.fx/)在JavaFX中创建多语言软件。我无法理解是否有一种方法可以设置或注入Afterburner视图使用的资源束,也没有一种方法可以将不同的资源束应用于不同的视图并在运行时更改资源束。

在纯javafx中,可以为fxml视图设置资源束,如下面的示例所示,但是如何使用afterburner来做到这一点?

private void loadView(Locale locale) {
try {
  FXMLLoader fxmlLoader = new FXMLLoader();

  // Here, just the resource bundles name is mentioned. You can add support for more languages
  // by adding more properties-files with language-specific endings like
  // "E_13_Internationalization_fr.properties".
  fxmlLoader.setResources(ResourceBundle.getBundle("E_13_Internationalization", locale));

  Pane pane = (BorderPane) fxmlLoader.load(this.getClass().getResource("/E_13_Internationalization.fxml").openStream());
  borderPane.setCenter(pane);
} catch (IOException ex) {
  ex.printStackTrace();
}


}

最佳答案

要加载ResourceBundle,afterburner.fx将根据您的视图类的包名+名称来构建bundleName。 :

packagename.ExampleView -> packagename.example //('View' at the ending gets removed)
packagename.ExampleApp -> packagename.exampleapp


用于ResourceBundle.getBundle(name)

遵循该约定,您必须为每个视图创建一个单独的resourceBundle,并将其放置在相应的视图包中。

如果要对所有视图使用不同的命名模式或单个resourceBundle,则可以在调用exampleView.getView()之前设置resourceBundle,这将随后使用更新的resourceBundle初始化FMXLLoader

public abstract class BaseView extends FXMLView {

    public static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("bundleName");

    public BaseView() {
        this.bundle = RESOURCE_BUNDLE;
    }

    public BaseView(ResourceBundle bundle) {
        this.bundle = bundle;
    }

}


https://github.com/AdamBien/afterburner.fx/blob/master/src/main/java/com/airhacks/afterburner/views/FXMLView.java

10-05 17:56