Mudar idioma em tempo real

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?

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

É desktop mesmo, com Swing.

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.

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.

[quote=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.[/quote]

Concordo, e mais, procure por i18n.

Flws!
Schmidt

o mvc dele é só para web.

[quote=schmidt][quote=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.[/quote]

Concordo, e mais, procure por i18n.

Flws!
Schmidt[/quote]

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.

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

qwerty,

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

Ou redesenhar a tela, talvez funcione.

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??

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.

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)

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.

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)