Incluir opção de idioma em sistema

Boa tarde colegas !

Qual a melhor estratégia para se implementar uma opção de idioma em um sistema ?

Estou me referindo somente a interface com o usuário, ou seja, conforme a opção feita pelo usuario, os labels, botoes, textos, menus, etc… seria traduzidos para o idioma um idioma escolhido.

Os idiomas possíveis seriam pré-definidos.

Estou com dúvida quanto a melhor forma de implementar essa funcionalidade, independente de linguaguem.

Pensei em uma tabela ou arquivo com as traduções, mas não sei se é a melhor forma.

Sendo assim se alguém tiver alguma opinião ou se já passou por essa necessidade e puder me ajudar, ficarei muito agradecido.

Obrigado a todos.

Um abraço.

Bem que eu conheça e que já usei seria por arquivos .properties, mas realmente não sei se é a melhor forma de fazer a famosa Internacionalização

Como disse gostaria de saber uma estratégia independente de linguagem.

Me falaram que em Java existe alguma coisa chamada multilinguagem, mas ainda não achei nada.

De qualquer forma, como disse, não quero me prender a linguagem…

Pensei em usar arquivos XML, o que acha ?

Já ví usarem bastante um .properties.
Ex:

home.msg.top="Welcome !"
home.msg.bottom="All rights reserved..."

Se for mudar de idioma é só olhar pro outro poperties, ex:

home.msg.top="Bem-Vindo!"
home.msg.bottom="Todos os direitos..."

Dá uma procurada por i18n, de preferência especificamente para a plataforma que você for usar, assim dá pra achar soluções mais específicas.

[]´s

Use arquivos properties…eles são bastante populares como padrão de tradução…seu cliente precisará apenas alterarar o valor das chaves do arquivo…a grande vantagem é traduzir o sistema sem precisar alterar o fonte…Por tabela do banco de dados já não ficaria legal…tráfego na rede…

Só uma questão.

Não sei exatamente qual o seu problema, mas normalmente junto com internacionalização, vem um conceito bem próximo que é localização ou seja, por exemplo os números em en_US usarão o padrão americano que seria algo como 999,999,999.99 e a data seria algo como MM/DD/YYYY.

Existem muito exemplos de software internacionalizavel, mas vejo que a maioria deles não são localizaveis.

Mudar apenas os texto não quer dizer que seus software está apto a rodar em qualquer lugar.

Coisas às quais você precisa prestar atenção na hora de incluir suporte a vários idiomas.

  • Mensagens (Bem-Vindo / Welcome)
  • Help (são textos grandes…)
  • Formato de moeda, data, número (R$ 1.000,00 / $ 1,000.00 / ? 1.000,00 / ¥ 1,000.00; 14/07/2007 / 07-14-2007 / 2007.07.14)
  • Botões feitos com imagens com texto (veja o botão “novo tópico” aqui no GUJ para ter uma idéia… - acho que havia um tempo em que se usava um botão do phpBB que era em inglês mesmo.)
  • Tamanho dos títulos e espaçamentos nos layouts das telas (pode ser que a mensagem seja bem mais comprida em alemão que em inglês)
  • Você pode ter o azar de ter de internacionalizar o seu programa ou site para uma língua onde se escreve da DIREITA para a ESQUERDA, como o árabe ou o hebraico*. Nesse caso o layout das páginas e dos menus é espelhado em relação ao layout tradicional.
    (* E o mais esquisito nessas línguas é que o cursor se move da direita para a esquerda quando você digita em um textbox, mas se você começa a digitar letras latinas (A-Z) ou números (0-9), o cursor passa a se mover da esquerda para a direita. Muito esquisito.)

Boa noite colegas !

Obrigado a todos pelas dicas !

Meu problema não é tão complexo, porque resume a portugues e espanhol.

Muitas dicas foram no sentido de usar o properties, sei que o foco aqui é sempre Java, mas nesse problema estou trabalhando com VB.

Mesmo assim como pretendo migrar para Java me interessei bastante pelas idéias dada, valeu !

Aproveitando… eu nunca usei um arquivo properties, alguem tem um exemplo de como fazer isso ? Nesse caso pode ser em Java mesmo.

Abraços a todos.

VB 6.0 != VB.NET
O VB.NET tem suporte completo a internacionalização, se não me engano. Leia a documentação do MSDN, e use as APIs corretas.

Portuguese.properties

Language.0=Copiar Language.1=Recortar Language.2=Editar Language.3=Sair Language.4=Arquivo Language.5=Ajuda

Spanish.properties

Language.0=Copiar Language.1=Cortar Language.2=Edición Language.3=Salir Language.4=Archivo Language.5=Ayuda

OBS: Não fui eu quem fez a tradução! E não entendo nada de Espanhol, por isso peço desculpas se estiver errado.

neohacker:

Eu teria dois arquivos: Portuguese.properties e Spanish.properties ?

Mas como acessar dentro do Java ?
Como acessar cada linha ? (“Language.0 = Copiar”, “Language.1 = Recortar”, etc ).

Obrigado pela dica.

thingol:

O sistema em questão é em VB 6.

Isso. Tem que usar a classe Properties. É mais ou menos assim:

String arquivoProp = (escolha do usuário);
Properties p = new Properties();
p.load(arquivoProp);
String copiar = p.getProperty("Language.0"); // colocar um nome mais significativo

http://www.i18nwithvb.com/
http://www.codeguru.com/forum/archive/index.php/t-339702.html

Quando você precisar colocar a String você utiliza assim por exemplo:

JLabel.setText(Messages.getString("Language.1"));

Para alterar o Idioma:

Messages.setLanguage("pt");

Class Messages:

[code]
import java.util.MissingResourceException;
import java.util.ResourceBundle;

/**

  • Classe responsável pela Internacionalização do Sistema
  • @author Gustavo Silva

*/
public class Messages {
//Aqui você coloca o caminho para o arquivo
private static final String PORTUGUESE = “Languages.Portuguese”;

private static final String ENGLISH = "Languages.English";

private static final String SPANISH = "Languages.Spanish";

public static ResourceBundle LANGUAGE = ResourceBundle.getBundle(ENGLISH);

private Messages() {
}

/**
 * Método que altera o idioma da aplicação
 * 
 * @param String
 *            language
 */
public static void setLanguage(String language) {

	if (language.equalsIgnoreCase("pt")) {
		Messages.LANGUAGE = ResourceBundle.getBundle(PORTUGUESE);
	} else if (language.equalsIgnoreCase("eng")) {
		Messages.LANGUAGE = ResourceBundle.getBundle(ENGLISH);
	} else if (language.equalsIgnoreCase("spa")) {
		Messages.LANGUAGE = ResourceBundle.getBundle(SPANISH);
	} // if

} // setLanguage

public static String getString(String key) {
	try {
		return LANGUAGE.getString(key);
	} catch (MissingResourceException mre) {
		return '!' + key + '!';
	}
}

}[/code]

Qualquer dúvida pode gritar ai kra
Essa parte da classe você pode implementar em outras linguagens acredito eu (não conheço outras somente um pouquinho de VB 6 que eu trabalho)
sendo que o importante da mensagens eu outros idiomas ficam em arquivos.