Fórum Atualizando minhas strings em java em tempo real #619828
13/04/2023
0
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
Curtir tópico
+ 0
Responder
Post mais votado
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.
Arthur Heinrich
Responder
Gostei + 1
Clique aqui para fazer login e interagir na Comunidade :)