Internacionalizando seu aplicativo em Delphi
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; |
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; |
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; |
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; |
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); |
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!
-
Giovani Da Cruz
-
2.398 views
- 0 comentários
- 28 de março de 2019
Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!
Posts Relacionados - Continue Aprendendo