Mais um com nome comprido ;-)
A idéia aqui é fazer programas que possam ser facilmente traduzidos para qualquer idioma, sem que você tenta que necessariamente "botar a mão" no código.
Mas o que seria exatamente traduzir um programa? Ora, não seria necessário aqui traduzir o código, mas somente aquilo que é visível ao usuário, ou seja, a interface.
Inicialmente pensei em simplesmente transformar cara string (texto de interface) numa variável, mas percebi que não funcionaria.
Acompanhe meu exemplo:
MENSAGEMHELLOWORLD="Olá, esta é uma mensagem de Hello Wold".
Escreva "$MENSAGEMHELLOWORLD"
Até agora funcionaria bem, pois a mensagem é bem simples.
Mas vamos supor que quisesse escrever uma mensagem que envolvesse alguma outra variável, que pudesse ter seu valor modificado:
ANO=2007
MENSAGEMDEANO="Olá, nós estamos no ano de $ANO. Daqui há um ano será $((ANO+1))."
ANO="1997"
Escreva "$MENSAGEMDEANO"
Ele provavelmente exibiria algo como:
"Olá, nós estamos no ano de 2007. Daqui há um ano será 2008."
E não...
"Olá, nós estamos no ano de 1997. Daqui há um ano será 1998."
... que é o que queremos.
Como resolver isso? Queremos que as variáveis da mensagem sejam definidos no exato momento da chamada da mensagem, e não na sua declaração. Alguma idéia?
Sim! Vamos usar funções! Eu adoro funções. Você não? ;-)
Vamos declarar a mensagem de uma maneira diferente:
MENSAGEMDEANO() { echo "Olá, nós estamos no ano de $ANO. Daqui há um ano será $((ANO+1))."; }
Assim, podemos chamar a função Escreva da seguinte forma:
Escreva $(MENSAGEMDEANO)
Ou a chamada da função pode aparecer no meio de outra string:
Escreva "Esta é uma mensagem: \"$(MENSAGEMDEANO)\", entendeu?"
Que funcionará muito bem, embora seja ruim do ponto-de-vista de desempenho.
Agora a primeira pergunta: Porque escrever a função da mensagem em uma linha?
A resposta é: Assim fica muito mais fácil para alguém que for traduzir o programa para outro idioma ver que aquilo é uma mensagem, e não precisa saber que se trata de uma função!
O que você fazer? Colocar todas as declarações das mensagens num arquivo em separado, que teria o seu conteúdo da seguinte forma:
# Tradução do programa tal-tal-tal para emuxês
# "Deseja formatar o computador $COMPUTERNUM?"
MSGFORMATE() { echo "Disejah FOrMaTaH u kOmpUTAdor $COMPUTERNUM???"; }
# "A instalação foi abortada. Por favor verifique o arquivo $LOGFILE para mais informações"
MSGABORTINSTAL() { echo "A instALAXXaUM FoI AbOrtaDEenhah...... poR FaVor vEriFIKe u ARkIVu $LOGFILE prAH + InfORmAXXoexXx"; }
# Créditos das mensagens ao Aurélio e seu Miguxeitor: http://aurelio.net/web/miguxeitor.html ;-)
Assim, a pessoa que traduzisse seu programa precisaria somente modificar o que está entre aspas!
E, no início do seu programa haveria algo como:
LANGUAGE=emuxes_pt_BR
source languages/${LANGUAGE}.sh
Só acrescentando uma informação: Procurei utilizar aqui somente ferramentas nativas do bash, embora seja possível utilizar a ferramenta gettext para criar programas internacionalizáveis em shell-script também. Mas acredito que isto seja assunto para outro artigo. Quem sabe o próximo?