Mudar idioma em tempo real

14 respostas
Q

Existe algum padrão de projeto ou metodologia para poder, usando as facildiades de internacionalização do Java, mudar o idioma de uma aplicação em tempo real?

Por exemplo, eu quero colocar um item de menu onde o usuário poderia escolher os idiomas disponíveis e aí a aplicação seria toda traduzida na hora. É possível fazer isso? Alguém tem alguma dica?

14 Respostas

C

Ola, seu sistema é web ou desktop? Se for web, usando struts por exemplo, isso é tranquilamente possível.

Q

É desktop mesmo, com Swing.

C

Cara, da uma olhada no spring, pq houvi comentários que ele tem um mvc para apps desktop, swing. Ai vc obterá o que precisa.

C

qwerty,

Não sei se tem alguma coisa que facilite isso para Swing. De qualquer forma, o procedimento é simples. Basta você manter os textos em arquivos de propriedades e alterar o arquivo de acordo com um click do usuário.

A

carneiro:
qwerty,

Não sei se tem alguma coisa que facilite isso para Swing. De qualquer forma, o procedimento é simples. Basta você manter os textos em arquivos de propriedades e alterar o arquivo de acordo com um click do usuário.

Concordo, e mais, procure por i18n.

Flws!
Schmidt

M

o mvc dele é só para web.

Q

schmidt:
carneiro:
qwerty,

Não sei se tem alguma coisa que facilite isso para Swing. De qualquer forma, o procedimento é simples. Basta você manter os textos em arquivos de propriedades e alterar o arquivo de acordo com um click do usuário.

Concordo, e mais, procure por i18n.

Flws!
Schmidt

Eu já andei dando uma olhada no i18n e conheço o esquema de armazenamento em arquivos de propriedades. Mas o problema é que quero fazer a tradução da aplicação em tempo real, ou seja, assim que o usuário selecionar a nova linguagem toda a aplicação (janelas já construídas…) serão traduzidas. Usando o esquema dos properties com ResourceBundles apenas as novas janelas e mensagens seriam alteradas, não?

Eu estou interssado em algo que me facilite o trabalho de recarregar/alterar os textos do componentes que já estão sendo exibidos na tela.

Vou dar uma procurada por Spring.

A

qwerty,

Yep, é isso mesmo.
Não posso falar por apps swing. = /

Em projetos web, eu uso isso com JSF, fica muito feroz. De acordo com o idioma do navegador (hj já pre-configurado de acordo com o idioma do local onde se está fazendo o acesso), o site já faz um load no arquivo .properties específico daquele idioma. Dá até pra ficar brincando, trocar o idioma do Firefox e dar F5! :smiley:

Flws!
Schmidt

C

qwerty,

Bem, basta você setar novamente os valores… a classe JLabel, por exemplo, tem o setText(String text).

Ou redesenhar a tela, talvez funcione.

N

eu fiz ja isso numa aplicação pra facul…utilizei com arquivos properties e tive o ms problema, mas consegui contornalo, mas me diga vc esta trabalhando em cima do Eclipse?? mais uma pergunta vc utiliza métodos gets para criar os componentes??

Q

Estou trabalhando em cima do Eclipse sim. Como ainda não sei direito como organizar o projeto pra atender essa necessidade ainda não comecei a codificar, então não estou usando métodos gets para criar os componentes.

N

então não sei se vão considerar isso como POG mas…
eu uso dessa forma

private JLabel getLblText() { if (lblText == null) { lblFunction = new JLabel(); } // if lblText .setText("Text:"); // no texto do componente vc usará o properties return lblFunction; }
este modo funciona mais ou menos assim
quando vc for adicionar este JLabel em algum lugar vc utiliza o método get, pois se vc estiver pela primeira vez chamando o label ele o criará,
se for no momento da troca de idioma ele simplesmente apenas executará o setText com o novo idioma.

bem basicamente seria isso, se isso te ajudar blz, se não continua postando que agente arruma outro jeito.

Obs: como citei não sei se isso é considerado POG, mas ta valendo 8)

Q

Neohacker valeu, eu estava pensando em algo parecido com o que você postou.

Mas como são diversos componentes, (internal frames, com vários labels, buttons, etc…) a grande dificuldade seria como a partir de um um único ponto (um item de menu) sair disparanda/chamando novamente o getLabelText de cada um desses componentes.

Estou pensando então em dotar cada “componente principal” de inteligencia para reescrever os seus textos e de seus subcomponentes. Aí em uma especie de camada de gerencia do idioma eu iria armazenando esses componentes em um pool de componentes. Quando o usuario clicar no botao para trocar a linguagem os componentes do pool vao sendo recuperados um a um e solicitados a se reescreverem.

Acho que vou acabar fazendo assim.

N

então qwerty no meu caso acabou acontecendo um efeito cascata q deu td certo (tem alguns BUGs mas num eh problema :stuck_out_tongue: ) assim
por exemplo o meu começa num JFrame com setTitle, depois ele começa a criar os menus então por exemplo getMnFile() então ele vai mudar de “File” para “Arquivo”, depois ele vai chamar o getMniExit() logo ele mudará o setText para “Sair”… e assim por diante faiz certinho kra…

bem como minha explicação não foi muito boa…(eu msm percebi isso) vou tentar colocar alguns códigos aki de exemplos

private JFrame getJFrame() {
		if (jFrame == null) {
			jFrame = new JFrame();
			jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		} // if

		jFrame.setTitle(Messages.getString("Language.13"));
		jFrame.setJMenuBar(getJJMenuBar());

		return jFrame;

	} // getJFrame
.
.
.
private JMenuBar getJJMenuBar() {
		if (jJMenuBar == null) {
			jJMenuBar = new JMenuBar();
		} // if

		jJMenuBar.add(getFileMenu());
		jJMenuBar.add(getEditMenu());
		jJMenuBar.add(getMnTools()); // Generated
		jJMenuBar.add(getHelpMenu());

		return jJMenuBar;
	} // getJJMenuBar
.
.
.
private JMenu getFileMenu() {
		if (fileMenu == null) {
			fileMenu = new JMenu();

		} // if

		fileMenu.setText(Messages.getString("Language.10")); 
		fileMenu.add(getMnNew()); // Generated
		fileMenu.add(getSaveMenuItem());
		fileMenu.add(getExitMenuItem());

		return fileMenu;
	} // getFileMenu
.
.
.

private JMenuItem getSaveMenuItem() {
		if (saveMenuItem == null) {
			saveMenuItem = new JMenuItem();
		} // if

		saveMenuItem.setText(Messages.getString("Language.25")); 

		return saveMenuItem;
}

espero q vc tenha entendido a lógica, pode ser q se vc precisar alterar isso fique complicado, mas se vc ja ir desenvolvendo assim vc vai ver q acaba ficando mtu fácil, bem eu achei né…
mas dai vc ver o q vai ficar melhor pra vc…

tamo ai se precisar 8)

Criado 18 de abril de 2007
Ultima resposta 18 de abr. de 2007
Respostas 14
Participantes 6