Обновление языка в режиме реального времени — Java

Я создаю настольную программу на java, внутри этой программы есть JOptionPane для выбора языка, который хочет использовать пользователь, однако, когда пользователь выбирает один из вариантов, тексты моих компонентов не обновляются в режиме реального времени.

Я использую файлы .properties для языков, доступных, например, в параметрах языка:

en.properties

selectOptions=Select one of the options below:
startButton=START
optionsButton=SETTINGS

jp.properties

selectOptions=以下のオプションから選択してください:
startButton=スタート
optionsButton=設定

В моем классе LanguageManager я настраиваю получение своих ключей, и у меня есть метод updateLanguage, однако, когда я использую свой метод updateLanguage, он меняет мой язык, но тексты не меняются.

public void updateLanguage(String selectedLang, String selectedLocale) {
        lang = selectedLang;
        locale = selectedLocale;
        setLanguage(lang, locale);
    }

Из того, что я исследовал, наиболее распространенным способом выполнения обновления было бы создание метода, который обновляет текст моих компонентов, но, поскольку у меня есть несколько компонентов, мне пришлось бы передать несколько параметров в мой метод, это будет что-то вроде пример ниже:

public void updateTexts(JButton button1, JButton button2, JLabel label1, JLabel label2){
      button1.setText(languagerManager.getButton1("button1"))
      button2.setText(languagerManager.getButton2("button2"))
      label1.setText(languagerManager.getButton1("label1"))
      label2.setText(languagerManager.getButton1("label2"))
}

Но в этом случае я думаю, что это будет не очень эффективно.

Ниже приведены мои классы и то, как я пытаюсь реализовать это обновление при выборе другого языка.

Класс основного экрана:

private LanguageManager languageManager;


 public MainScreen() {

   languageManager = LanguageManager.getInstance();

   startButton   = new JButton(languageManager.getStartButton());
   rankingButton = new JButton(languageManager.getRankingButton());
   optionsButton = new JButton(languageManager.getOptionsButton());
   exitButton    = new JButton(languageManager.getExitButton());

   optionsButton.addActionListener(e -> Buttons.optionsButton(e));
}

Класс, что я открываю настройки языка:

public class Buttons {

   static public void optionsButton(ActionEvent e) {

        LanguageManager languageManager = new LanguageManager();

        String[] languages = {"Português", "English", "Español", "日本"};

        JComboBox<String> comboBox = new JComboBox<>(languages);

        JPanel panel = new JPanel();
        panel.add(comboBox);

        int result = JOptionPane.showConfirmDialog(null, panel, "Selecione uma linguagem", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

        if (result == JOptionPane.OK_OPTION){

            String selectedLang = "";
            String selectedLocale = "";

            switch(comboBox.getSelectedIndex()) {
                case 0: // Português
                    selectedLang = "pt";
                    selectedLocale = "pt_BR";
                    break;
                case 1: // English
                    selectedLang = "en";
                    selectedLocale = "en";
                    break;
                case 2: // Español
                    selectedLang = "es";
                    selectedLocale = "es";
                    break;
                case 3: // 日本
                    selectedLang = "jp";
                    selectedLocale = "jp";
                    break;
            } 

            languageManager.updateLanguage(selectedLang, selectedLocale);

        }

    }

}

Класс, отвечающий за языки:

public class LanguageManager {  

    private static LanguageManager instance;

    private ResourceBundle messages;

    private String lang, locale;
    
    public LanguageManager() {

        setLanguage("en","en");

    }

    public static LanguageManager getInstance() {
        if (instance == null) {
            instance = new LanguageManager();
        }
        return instance;
    }

    public void updateLanguage(String selectedLang, String selectedLocale) {
        lang = selectedLang;
        locale = selectedLocale;
        setLanguage(lang, locale);
    }

    public void setLanguage(String messageFile, String languageCode) {
        messages = ResourceBundle.getBundle("ApsProject.src.Languages." + messageFile, new Locale(languageCode));
    }


    public String getTitleAps() {
        return messages.getString("titleAps");
    }
    
    public String getSelectOptions() {
        return messages.getString("selectOptions");
    }

    public String getNumberOfParticipants() {
        return messages.getString("numberOfParticipants");
    }

    public String getNameOfParticipantes() {
        return messages.getString("nameOfParticipantes");
    }
    
    public String getStartButton() {
        return messages.getString("startButton");
    }

    public String getMatchButton() {
        return messages.getString("matchButton");
    }

    public String getOptionsButton() {
        return messages.getString("optionsButton");
    }

    public String getSimulationButton() {
        return messages.getString("simulationButton");
    }
    
    public String getSaveButton() {
        return messages.getString("saveButton");
    }

    public String getRankingButton() {
        return messages.getString("rankingButton");
    }

    public String getBackButton() {
        return messages.getString("backButton");
    }

    public String getExitButton() {
        return messages.getString("exitButton");
    }

    public String getUserOption() {
        return messages.getString("userOption");
    }

    public String getAutoOption() {
        return messages.getString("autoOption");
    }

    public String getPlayer1() {
        return messages.getString("player1");
    }

    public String getPlayer2() {
        return messages.getString("player2");
    }

    public String getPlayer3() {
        return messages.getString("player3");
    }

    public String getPlayer4() {
        return messages.getString("player4");
    }

    public String getPlayer5() {
        return messages.getString("player5");
    }

    public String getTeam1() {
        return messages.getString("team1");
    }

    public String getTeam2() {
        return messages.getString("team2");
    }

    public String getTeam3() {
        return messages.getString("team3");
    }

    public String getTeam4() {
        return messages.getString("team4");
    }

    public String getTeam5() {
        return messages.getString("team5");
    }

    public String getLap1Player1() {
        return messages.getString("lap1Player1");
    }
    
    public String getLap1Player2() {
        return messages.getString("lap1Player2");
    }

    public String getLap1Player3() {
        return messages.getString("lap1Player3");
    }

    public String getLap1Player4() {
        return messages.getString("lap1Player4");
    }

    public String getLap1Player5() {
        return messages.getString("lap1Player5");
    }

    public String getLap2Player1() {
        return messages.getString("lap2Player1");
    }

    public String getLap2Player2() {
        return messages.getString("lap2Player2");
    }

    public String getLap2Player3() {
        return messages.getString("lap2Player3");
    }

    public String getLap2Player4() {
        return messages.getString("lap2Player4");
    }

    public String getLap2Player5() {
        return messages.getString("lap2Player5");
    }

    public String getTotalTimeP1() {
        return messages.getString("totalTimeP1");
    }

    public String getTotalTimeP2() {
        return messages.getString("totalTimeP2");
    }

    public String getTotalTimeP3() {
        return messages.getString("totalTimeP3");
    }

    public String getTotalTimeP4() {
        return messages.getString("totalTimeP4");
    }

    public String getTotalTimeP5() {
        return messages.getString("totalTimeP5");
    }

    public String getPlayer() {
        return messages.getString("Player");
    }

}

Если кто-нибудь знает, что я могу сделать, я был бы признателен.

Обновляйте язык в режиме реального времени.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После нескольких попыток у меня получилось. вот обновленный код:

Class `Language Manager`: 

    public class LanguageManager {  

    private static LanguageManager instance;

    private ResourceBundle messages;

    private String lang, locale;
    
    public LanguageManager() {

        setLanguage("en","en");

    }

    public static LanguageManager getInstance() {
        if (instance == null) {
            instance = new LanguageManager();
        }
        return instance;
    }

    public void updateLanguage(String selectedLang, String selectedLocale) {

        lang = selectedLang;
        locale = selectedLocale;
        setLanguage(lang, locale);
    }

    public void setLanguage(String messageFile, String languageCode) {
        messages = ResourceBundle.getBundle("ApsProject.src.Languages." + messageFile, new Locale(languageCode));
    }

    public String getString(String key) {
        return messages.getString(key);
    }
}

Класс Buttons:

static public void optionsButton(ActionEvent e, JButton sB, JButton rB, JButton oB, JButton eB) {

        LanguageManager languageManager = LanguageManager.getInstance();

        String[] languages = {"日本", "English", "Español", "Português"};

        JComboBox<String> comboBox = new JComboBox<>(languages);

        JPanel panel = new JPanel();
        panel.add(comboBox);

        String okText = languageManager.getString("langOptionOk");
        String cancelText = languageManager.getString("langOptionCancel");

        UIManager.put("OptionPane.okButtonText", okText);
        UIManager.put("OptionPane.cancelButtonText", cancelText);


        int result = JOptionPane.showConfirmDialog(null, panel, languageManager.getString("languageOption"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
        
        if (result == JOptionPane.OK_OPTION){

            String selectedLang = "en";
            String selectedLocale = "en";

            switch(comboBox.getSelectedIndex()) {
                case 0: // 日本
                    selectedLang = "jp";
                    selectedLocale = "jp";
                    break;
                case 1: // English
                    selectedLang = "en";
                    selectedLocale = "en";
                    break;
                case 2: // Español
                    selectedLang = "es";
                    selectedLocale = "es";
                    break;
                case 3: // Português
                    selectedLang = "br";
                    selectedLocale = "pt_BR";
                    break;
            } 
            
            languageManager.updateLanguage(selectedLang, selectedLocale);;
            sB.setText(languageManager.getString("startButton"));
            rB.setText(languageManager.getString("rankingButton"));
            oB.setText(languageManager.getString("optionsButton"));
            eB.setText(languageManager.getString("exitButton"));
        }

    }

Как мне вызвать метод optionsButton и как определить тексты в моем MainScreen:

        languageManager = LanguageManager.getInstance();
        startButton   = new JButton(languageManager.getString("startButton"));
        rankingButton = new JButton(languageManager.getString("rankingButton"));
        optionsButton = new JButton(languageManager.getString("optionsButton"));
        exitButton    = new JButton(languageManager.getString("exitButton"));
        optionsButton.addActionListener(e -> Buttons.optionsButton(e, startButton, rankingButton, optionsButton, exitButton));

Так как в моем методе updateLanguage я обновляю язык, мои новые экраны уже будут созданы с выбранным языком, мне нужно было обновить язык моего MainScreen, потому что он уже был открыт и с загруженными строками

JavaFX как графический интерфейс превосходит здесь, поскольку вы можете иметь текстовую привязку к изменению локали (через StringProper/ChangeListener).

Joop Eggen 17.04.2023 13:28

Другие вопросы по теме