Atualizando minhas strings em java em tempo real
Estou criando um programa desktop em java, dentro deste programa existe um JOptionPane para selecionar qual idioma o usuário deseja utilizar, porém quando o usuário seleciona uma das opções, os textos dos meus componentes não são atualizados em tempo real.
Eu uso arquivos .properties para os idiomas disponíveis nas opções de idioma por exemplo:
en.properties
selectOptions=Select one of the options below:
startButton=START
optionsButton=SETTINGS
jp.properties
selectOptions=以下のオプションから選択してください:
startButton=スタート
optionsButton=設定
Na minha classe LanguageManager configuro o get das minhas chaves, e tenho o método updateLanguage, porém quando uso meu método updateLanguage, ele muda meu idioma mas os textos não são alterados.
Pelo que pesquisei, a forma mais comum de realizar a atualização seria criar um método que atualize o texto dos meus componentes, mas como tenho vários componentes teria que passar vários parâmetros para o meu método, seria algo como o exemplo abaixo:
Mas dessa forma acho que não seria muito eficiente.
Abaixo estão minhas aulas e como estou tentando implementar esta atualização ao selecionar outro idioma.
Main screen class:
Class que eu abro as configurações de idioma:
Class responsável pelos idiomas:
Eu uso arquivos .properties para os idiomas disponíveis nas opções de idioma por exemplo:
en.properties
selectOptions=Select one of the options below:
startButton=START
optionsButton=SETTINGS
jp.properties
selectOptions=以下のオプションから選択してください:
startButton=スタート
optionsButton=設定
Na minha classe LanguageManager configuro o get das minhas chaves, e tenho o método updateLanguage, porém quando uso meu método updateLanguage, ele muda meu idioma mas os textos não são alterados.
public void updateLanguage(String selectedLang, String selectedLocale) { lang = selectedLang; locale = selectedLocale; setLanguage(lang, locale); }
Pelo que pesquisei, a forma mais comum de realizar a atualização seria criar um método que atualize o texto dos meus componentes, mas como tenho vários componentes teria que passar vários parâmetros para o meu método, seria algo como o exemplo abaixo:
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")) }
Mas dessa forma acho que não seria muito eficiente.
Abaixo estão minhas aulas e como estou tentando implementar esta atualização ao selecionar outro idioma.
Main screen class:
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)); }
Class que eu abro as configurações de idioma:
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); } }
Class responsável pelos idiomas:
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"); }
Kauan
Curtidas 0
Melhor post
Arthur Heinrich
13/04/2023
Você pode criar os seus componentes através de uma rotina sua, que vincule o componente ao texto que deve ser armazenado.
Por exemplo, ao invés de chamar:
startButton = new JButton(languageManager.getStartButton());
Você poderia chamar:
startButton = languageManager.CreateJButton("startButton");
Sua rotina seria mais ou menos assim:
public JButton CreateJButton(String Title) {
JButton B = new JButton(messages.getString(Title));
... Salve a tupla (B, Title) em uma lista de componentes
return B;
}
Sempre que você alterar a língua, chame uma rotina que faça a varredura na lista, trocando a mensagem de todos os componentes, baseado na classe e título original armazenados.
Por exemplo, ao invés de chamar:
startButton = new JButton(languageManager.getStartButton());
Você poderia chamar:
startButton = languageManager.CreateJButton("startButton");
Sua rotina seria mais ou menos assim:
public JButton CreateJButton(String Title) {
JButton B = new JButton(messages.getString(Title));
... Salve a tupla (B, Title) em uma lista de componentes
return B;
}
Sempre que você alterar a língua, chame uma rotina que faça a varredura na lista, trocando a mensagem de todos os componentes, baseado na classe e título original armazenados.
GOSTEI 1