[Python] "Localização" e mais sobre "internacionalização"
por
em 01-09-2009 às 17:36 (6493 Visualizações)
Quando comecei a desenvolver para a comunidade GNU/Linux eu desenvolvia tudo em inglês e pensava: "Assim está bom, inglês se tornou uma linguagem universal". Eu tinha essa atitude por dois motivos, eu era iniciante e achava que "internacionalizar" uma aplicação era algo muito difícil.
Quando começei a utilizar os stock icons da biblioteca GTK começaram a ocorer algumas bagunças na interface. Partes estavam traduzidas (por utilizar os stock icons) e o restante estava em inglês (texto estático do código fonte). A partir daí comecei a perceber o problema que eu estava gerando e resolvi então estudar sobre "internacionalização", com isso criei dois posts aqui na under:
Fiz isso porque a internacionalização é algo muito mais simples que eu imaginava, mas quando falei sobre internacionalização esqueci de citar como esse processo geralmente é chamada: i18n. Isso é um acrónimo para a palavra inglesa Internacionalization, mais informações aqui.
Eu só esqueci de um detalhe, não é só a i18n que é importante, mas também a "localização". "Localização" é uma tradução pobre para Localization ou L10n, uma melhor adaptação seria "regionalização". Qual a diferença entre as duas?! Uma trata da tradução de textos propriamente (i10n) enquanto o outro trata da formatação de números, datas, horas e moedas. Ok, vamos a alguns exemplo para entendermos melhor como isso funciona!
O seguinte exemplo em python mostra a data, um número e um valor em moeda:
Código :[FONT=Courier New][COLOR=DimGray]>>>import time >>> >>> numero = 154623.56 >>> valor = 1123.5 >>> print numero 154623.56 >>> print valor 1123.5 >>> print time.strftime(\"%a, %d %b %Y\") Tue, 01 Sep 2009 >>>[/COLOR][/FONT]
Agora vamos ver essa mesma saída utilizando L10n:
Código :[FONT=Courier New][COLOR=DimGray]>>> import locale >>> locale.setlocale(locale.LC_ALL, '') 'Portuguese_Brazil.1252' >>> numero = 154623.56 >>> valor = 1123.5 >>> >>> print locale.format('%.2f', numero, True) 154.623,56 >>> print locale.currency(numero, grouping=True) R$ 154.623,56 >>> print time.strftime(\"%a, %d %b %Y\") ter, 01 set 2009 >>>[/COLOR][/FONT]
Pronto, a saída está formatada de acordo com o padrão da região configurada no meu SO. agora vamos ver como seriam essas saídas em um SO de um americano e de um alemão :
Estou fazendo esses exemplo no Windows do meu trabalho, no Linux isso tem algumas diferenças e também alguns problemas. De acordo com o que eu pesquisei, no Linux os arquivos de "locale" do Brasil no Linux foram feitos por um dinamarquês (Keld Simonsen) e pelo visto ele cometeu alguns erros como ausência de separador da casa de milhar. Para contorná-los estou fazendo o seguinte:Código :[FONT=Courier New][COLOR=DimGray]>>> import locale >>> >>> numero = 154623.56 >>> valor = 1123.5 >>> >>> locale.setlocale(locale.LC_ALL, 'en') 'English_United States.1252' >>> print locale.format('%.2f', numero, True) 154,623.56 >>> print locale.currency(numero, grouping=True) $154,623.56 >>> print time.strftime(\"%a, %d %b %Y\") Tue, 01 Sep 2009 >>> >>> >>> locale.setlocale(locale.LC_ALL, 'deu_deu') 'German_Germany.1252' >>> print locale.format('%.2f', numero, True) 154.623,56 >>> print locale.currency(numero, grouping=True) 154.623,56 Ç >>> print time.strftime(\"%a, %d %b %Y\") Di, 01 Sep 2009 >>>[/COLOR][/FONT]
Como diria o Zen of Python: "Better simple then complex"!Código :[FONT=Courier New][COLOR=DimGray]>>> import locale >>> >>> lang_code = locale.setlocale(locale.LC_ALL, '') >>> if 'pt_BR' in lang_code: >>> locale._override_localeconv['thousands_sep'] = '.' >>> locale._override_localeconv['grouping'] = [3,3,0] >>> >>> [/COLOR][/FONT][FONT=Courier New][COLOR=DimGray]>>> numero = 154623.56 >>> valor = 1123.5 >>> [/COLOR][/FONT][FONT=Courier New][COLOR=DimGray] >>> print locale.format('%.2f', numero, True) 154.623,56 >>> print locale.currency(numero, grouping=True) R$ 154.623,56 >>> print time.strftime(\"%a, %d %b %Y\") Ter, 01 Set 2009[/COLOR][/FONT]
Até mais...
Comentários
+ Enviar Comentário