roskenet / springboot-javafx-support

SpringBoot / JavaFX8 Integration
MIT License
422 stars 139 forks source link

How to set the locale for the whole application ? #73

Open PolkovnikMedved opened 6 years ago

PolkovnikMedved commented 6 years ago

Hello,

First of all, thank you for your lib :)

I saw the part 4 of your example project and I see how to create ResourceBundle files, I see that I can give a bundle to my FXMLView and I know how to translate a label (the is a lot of I118N classes on the web + your DefaultAwesomeActionService in part_4).

But I can't find a way to choose a language in a first view and let the corresponding locale for the whole application. Is that possible ?

Thaks,

Blackdread commented 6 years ago

Just do that and reload your views or set the locale before the launch Locale.setDefault(Locale.FRENCH);

mtbadi39 commented 6 years ago

duplicate of #67

PolkovnikMedved commented 6 years ago

Hello @Blackdread, @mtbadi39 ,

Thank you for your answers.

I've already saw that I can choose the language for the whole application like this:

`@SpringBootApplication
@Import({CoreCommonsAppComponent.class})
public class Application extends AbstractJavaFxApplicationSupport {

    public static void main(String[] args) {
        Locale.setDefault(Locale.GERMAN);
        launch(Application.class, LoginView.class, new SplashScreenGROUPS(), args);
    }
}`

But this way, I compile the jar with an already defined language and the user can't change it.

Second way: I118N class with something like this in the controller:

`    public void changeLanguageToEN() {
        this.changeLanguage(Locale.ENGLISH);
    }
public void changeLanguage(Locale lang) {
        I18N.setLocale(lang);
        nameTableColumn.setText(I18N.get("name"));
        userLanguageLabel.setText(I18N.get("label"));
        reference.setText(I18N.get("reference"));
        category.setText(I18N.get("category"));
        sensitivity.setText(I18N.get("sensitivity"));
        retentionDuration.setText(I18N.get("retentionDuration"));
}
`

But this way I have to change static things (like labels, button labels...) manually (if I just let text="%category" it doesn't work anymore).

Just for your understanding, a horrible workaround to do what I need would be:

`@SpringBootApplication
@Import({CoreCommonsAppComponent.class})
public class Application extends AbstractJavaFxApplicationSupport {

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setUndecorated(true);
        frame.setTitle("Choose language");
        frame.setSize(400, 400);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();

        Locale[] possibleLocales = {Locale.FRENCH, Locale.forLanguageTag("nl"), Locale.ENGLISH, Locale.GERMAN};
        JComboBox<Locale> locales = new JComboBox<>(possibleLocales);

        panel.add(locales);

        JButton button = new JButton("Go");
        button.addActionListener(e -> {
            if(locales.getSelectedItem() != null){
                Locale.setDefault((Locale)locales.getSelectedItem());
                frame.dispose();
                launch(Application.class, LoginView.class, new SplashScreenGROUPS(), args);
            }
        });

        panel.add(button);

        frame.setContentPane(panel);
        frame.setVisible(true);
    }
}`

The user is asked for a language and then the application starts with the right one....

@Blackdread How do you reload the view ? Just by calling Application.showView(LoginView.class) ?