



Se você quiser que seu aplicativo Delphi esteja preparado para lidar com vários locais, então você precisa internacionalizá-lo. Há três aspectos comuns que devem ser abordados:
* Recursos
* Conversões de unidades
* Mensagens dinâmicas
Nós vamos cobrir os três com um exemplo de forma muito simples.
Considere o seguinte código recortado para a localidade en-US (inglês dos Estados Unidos da América).
Código padrão
1 2 3 4 | procedure TForm1.DefineFever; begin ShowMessage('If the body temperature rises above 99°F the person is considered to have a fever.'); end; |
Resourcing é o processo de remoção de strings codificadas do código, tornando-as resourcestrings. O código acima não é localizável porque o procedimento ShowMessage está tomando uma seqüência de caracteres codificada.
O que fazes? Dê uma olhada: Definimos strFeverDefinition como um resourcestring e o usamos como um parâmetro para o procedimento ShowMessage.
A funcionalidade permanece a mesma, mas a função é agora localizável.
Início de preparação para código
1 2 3 4 5 6 | procedure TForm1.DefineFever; resourcestring strFeverDefinition = 'If the body temperature rises above 99°F the person is considered to have a fever.'; begin ShowMessage(strFeverDefinition); end; |
Conversão de Unidades: Em alguns países (como Estados Unidos e Belize) a temperatura é medida em escala Fahrenheit, mas em muitos outros geralmente é em escala Celsius. Uma forma de internacionalizar pode ser está:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function GetFeverTemperature: string; var LangID: LangID; begin //By default Result:= '37.2°C'; {read current system locale} LangID := GetSystemDefaultLangID; //Assuming that only the United States and Belize use the Fahrenheit scale if (LangID = {English - United States} 1033) or (LangID = {English - Belize} 10249) then Result:= '99°F'; end; procedure TForm1.DefineFever; begin ShowMessage('If the body temperature rises above ' + GetFeverTemperature + ' the person is considered to have a fever'); end; |
Note que já no exemplo da temperatura, nem todas as linguagem seguem a mesma estrutura. logo o exemplo não é muito bom!
Mensagens Dinâmicas: Consideramos o ShowMessage acima como sendo uma mensagem dinâmica , porque o parâmetro depende da função GetFeverTemperature , que obviamente pode variar.
Para resolver a armadilha acima, podemos refatorar a função DefineFever da seguinte forma: Estamos apenas usando uma string de formato ( resourcestring ) que podemos formatar usando a rotina Format .
1 2 3 4 5 6 | procedure TForm1.DefineFever; resourcestring strFeverDefinition = 'If the body temperature rises above %0:s the person is considered to have a fever.'; begin ShowMessage(Format(strFeverDefinition, [GetFeverTemperature])); end; |
Isso permite o fornecimento e o tratamento da mensagem dinâmica de uma só vez. A coisa sobre mensagens dinâmicas vai além. Em espanhol, por exemplo, a mensagem dinâmica teria sido codificada da seguinte maneira: Observe que a GetFeverTemperature está no final do ShowMesssage.
1 | ShowMessage('Se considera que la persona tiene fiebre si la temperatura corporal es superior a ' + GetFeverTemperature); |
Observe que o parâmetro GetFeverTemperature está no final da mensagem, que é o oposto da implementação em Inglês, onde fica no meio. Não há como localizar algo assim se você não o internacionalizar primeiro.
Portanto, as regras básicas para a internacionalização em Delphi são Resourcing, Conversões de Unidades e Mensagens Dinâmicas, lembrando que o
uso da função GetSystemDefaultLangID que permite que possamos avaliar o idioma informado no sistema operacional.
Baseado no post: http://www.yanniel.info/2011/11/internationalization-tips-delphi.html
Dúvidas ou sugestões? Deixe o seu comentário!