Я создаю настольную программу на 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");
}
}
Если кто-нибудь знает, что я могу сделать, я был бы признателен.
Обновляйте язык в режиме реального времени.
После нескольких попыток у меня получилось. вот обновленный код:
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).