Você está na página 1de 31

Buscar

cdigofonte

comentrios

postfavorito(4)

.netMagazine120ndice

ASP.NET MVC Criando uma


aplicao multi-idiomas
Veremos nesse artigo como adequar sistemas .NET aos
diferentes idiomas e criar aplicaes multi-idiomas,
oferendo ao usurio uma experincia sempre adequada
sua realidade e preferncia.

Gostei(0)

(0)

Fiquepordentro

Curtir

Aquestodalocalizaoemaplicaes.NETtudosobrearepresentao
utilizadadentrodosoftware.Aideiaqueousuriotenhafamiliaridadecomo
queestsendomostrado.NoBrasil,nogostaramosdeterumadatadotipo
mm/dd/aaaa,comocomumnosEUA,porexemplo.
disso,emuitomais,queoconceitodelocalizaodentrodo.NETtrata:como
lidarcomacriaodeaplicaesglobais.Aolongodesseartigoveremosem
detalhesonamespaceSystem.Globalization,quetrazoconceitodeCultures,
queirocontrolarquasetodososaspectosdessetipodedesenvolvimento.

Hojeemdia,temosexemplosmuitoclarosdoquesoaplicaesglobais.Aslojas
deaplicaescomoaWindowsStorepermitemqueasaplicaesdisponibilizadas
sejamdistribudasemdiferentespases,comdiferentesculturaselinguagens.O
problemadessaabordagemque,normalmente,odesenvolvimentofeitotendo
emmenteumacultura,queenxergaosdiferenteselementosdentrodeuma
aplicaodeumaforma,apenas.
Pensandonisso,temosoconceitodelocalizaoem.NET,quepermitequea
culturadaaplicaosejaalteradaduranteaexecuo,mudandoaformade
enxergarhorrios,datas,representaesmonetrias,textos,entreoutros,
permitindoqueosoftwaresejamostradodeumaformanaturalparaousurio.
Aolongodesseartigo,vamosentendercomoo.NEToperanessetipodecenrio.A
ideiaquetenhamosacapacidadedecriarumapginadeconfiguraoemqueo
usurioirescolheraquelaculturaquemaislhedeixaconfortvel,oqueiralterar
todososaspectoscitadosnaaplicao.
Outraformadeoperao,maiscomumultimamente,autilizaodaculturado
sistemaoperacionalemquesto,semanecessidadedacriaodeumapgina
especficaparaconfigurao.
Avantagemdaprimeiraabordagemestnaliberdadequepermiteaumusuriodo
Brasil,porexemplo,utilizaraaplicaoeminglsamericano,sejaparaquestesde
treinamentodalnguainglesaouapenasporgostopessoal,eporissolidaremos
comela.Osconceitos,entretanto,sofacilmenteaplicveisaoutrasconfiguraes
dogostodoleitor.

EntendendoaLocalizaoem.NET
Cadalinguagemfalada,emqualquerlugardomundo,possuisuasregrasde
formatao.Ns,comodesenvolvedores,precisamossercapazesdecapturar
essasregrasecoloclasparatrabalharanossofavordentrodoprodutode
software.
Setivssemosquecriarumconjuntoderegras,iramosentenderoquocomplexo
isso.Mas,paranossasorte,o.NETFrameworkimplementaessasregraseso
queprecisamosfazerutilizlas.Vamosentendercomoessasregrasso
implementameoquefazerparautilizlasnessaseoeaolongodoartigo.
O.NET,emuitosoutrosframeworkselinguagensdeprogramao,costumam
utilizarumconceitochamadodecultureparaarepresentaodalinguagemalvo
daaplicao.Esseconceitoconsisteemumcdigosimples,quecontmumastring
comdoiscaracterespararepresentaralinguagemedoisparaopas,separados
porumavrgulaouhfen,comoemptBR,querepresentaalnguaportuguesa
faladanoBrasil.
interessantenotarmosqueessanomenclaturanodizrespeitoapenas
linguagemescritadaaplicao,esimatudoqueenvolveamesma.Campos
numricos,monetrios,datas,horriosetc.sotodoscontroladosporessecdigo
dacultura.
O.NET,especificamente,trazumconceitoconhecidocomoneutralculture,ou
culturaneutra,queutilizadoparaformataralinguagemdeumaformamais
genrica,semespecificaropas.Porexemplo,paraformataraaplicaoem
portugus,semespecificaroportugusbrasileiro,bastariautilizarmosastringpt.
Outroconceitoimportanteaculturainvariante(invariantculture),queirser
importanteseformosguardarinformaescomostrings.Esseconceitofazcomque
aaplicaoformateasstringscomoasescrevemosnocdigo.
Agoraquetemosumaideiageraldecomofeitaaimplementaodosistemade
localizaoem.NET,vamosentraremmaisdetalhesarespeitodecomoutilizar
essaimplementao.OnamespaceSystem.Globalizationtrazumaclassechamada
CultureInfo,queircontrolarquasetodososaspectosdaculturadaaplicao.

Essaclasseutilizadaparaalteraraculturadaaplicaoentreumasriede
opesquepodemservistasemNLSAPIReference,naseoLinks.Esselink
trazinformaesatoWindows7,masosWindows8e8.1podemutilizaressa
referncianormalmente.
Aindapossvelacriaodenossasprpriasculturas,atravsdaclasse
CultureAndRegionInfoBuilder,masdificilmenteissosertil.
Comoestamoslidandocomculturas,precisamosentendercomonossaaplicao
iroperlasinternamente.OC#possuiumconceitochamadodemultithreading
(BOX1),queemtermosbsicosirpermitiracriaodediversosprocessosda
mesmaaplicaonosistemaoperacional.
Cadaaplicaoirpossuiraomenosumathread,eessathreadqueircontrolar
aculturadenossaaplicao.O.NETFrameworktrazduasdiferentesculturas:uma
paraaaplicaoemgeral,internamente,eoutraparaainterfacedeusurio.
Aprimeiracontrolaaformacomonmeros,datas,horriosetc.somostradosea
segundacontrolaalinguagemqueainterfacedeusuriosermostradaparao
usurio.

BOX1.Multithreading
Oconceitodemultithreadingmuitoutilizadonaslinguagensdealtonvel
maisavanadas.Tratasedahabilidadedecontrolarmltiplasexecuesdo
mesmousuriosemcriarvriascpiasdosmesmosprogramas.
Essetipodeprocessopodeauxiliarnodesenvolvimentodeaplicaes
paralelas,quetendemafuncionarmaisrapidamente,aomenosquandobem
desenvolvidas.Joprincipalpontonegativodessaabordagemqueas
threadspodeminterferirumasnasoutras,especialmentequandoambas
acessamamemriaconstantemente.

OutraclasseinteressantedentrodonamespaceSystem.Globalizationaclasse
RegionInfo.Essaclasse,comoonomesugere,trazinformaesdaregiosendo
utilizada.Essasinformaespodemserutilizadasdentrodocdigooumesmona

interfacedeusurio.
Asinformaessomuitovariadas,comoseosistemamtricoutilizadona
culturaatualoumesmoqualosmbolomonetrionaquelacultura.Aolongodo
artigo,tambmautilizaodessaclasseficarmaisclaraparaoleitor.
Comisso,podemosnotarqueosistemadelocalizaodo.NETFramework
bastantecompleto.Eletraz,baseadoemalgunsconceitosessenciais,achancede
odesenvolvedorcriaraplicaesrealmenteglobalizadas,capazesdeseadaptara
diferentespases.
PodemosapontaroutraAPIsimilar,queestpresentenopluginGlobalizepara
JavaScript.Essepluginmaisutilizadoemaplicaesweb,etrazumaideiamuito
similaraoqueveremosparao.NETFramework.

Recursosdetextonaaplicao
Umdosprincipaispontosquepensamosquandotemosemmenteaglobalizaoda
aplicaoaalteraodalinguagemdainterfacedeusurio.Issorequeruma
alteraoemcadaumdostextosutilizados,oquepodegeraralgumadorde
cabeasenoplanejamostudocorretamente.
Entretanto,issonotudo.Inicialmente,podemospensarquesalvartextosem
diferenteslinguagensparaseremutilizadospodemresolveroproblema.Entretanto,
muitasvezesprecisamoslidarcomdiferentesalfabetos,caracteresespeciais,entre
outros.
Essasdiferenaspodemgerarproblemasemvriospontos,comocomparaes
entrestringseaprpriacodificaodoscaracteres(oalfabetocomooconhecemos
codificadoemASCII,quenocontmmuitosdoscaracteresdeoutras
linguagens).
Aquestodacomparaodestring,no.NET,podeserfeitautilizandoalgumas
propriedadesdaclasseStringComparison.Essaclassepodeutilizarelementos
genricosparaacomparao,queirofuncionaremqualquercultura,ou
elementosespecficosdacultura,quepodemgerarproblemas.
Jaquestodacodificaopodeserresolvidacomautilizaodealgunsmtodos

epropriedadesdaclasseEncoding.Nessecaso,entretanto,precisamosteralguma
noodosdiferentespadres,especialmenteoUTF8eoASCII.
Essasquestesdevemserutilizadascomumrecursodasaplicaes.NET:os
resourcefiles,ouarquivosderecursos.Essesarquivosseroutilizadospara
guardarasdiferentesstringsutilizadasdentrodaaplicao,desdeomaissimples
OlMundo!utilizadonapginainicialatotextomaisobscurodeumapgina
quenemseracessada.
Osistemado.NETpermiteacriaodevriosarquivosdessetipo,etodoseles
teroomesmonome,comumaressalva:onomedoarquivoserseguidopela
culturautilizada,algocomoRecursos.resxparaopadro(portugusdoBrasil)e
Recursos.enUS.resx,parainglsamericano,porexemplo.Esseselementos
seriamacessadosdiretamentedocdigoatravsdonomedessearquivode
recursos.
Porexemplo,setivssemosumastringcomonomedeOlemnossoarquivo.resx,
iramosacesslaporRecursos.Ol.Issoficarmaisclaroquandolidarmoscom
arquivosderecursos.
Aquestodessesarquivostambmestsujeitaaoutrosconceitosdentrodas
aplicaes.Porexemplo,hoconceitodelocalidadeeglobalidadederecursos.O
primeirosestardisponvelparaumadeterminadagamadepginas(oujanelas)
eooutro,comonomesugere,serglobal,paratodaaaplicao.
Aideiadosrecursosdetextoclara:tornaromaisclaroeperfeitopossvela
alteraodaculturadaaplicao.Oidealqueaaplicaosejacapazdese
adaptaraosmaisdiferentescenrios,podendofuncionaremdiferentesalfabetos,
comcaracteresespeciais,comooquevemosempasescomoSucia,Turquiaou
Japo.
Aolongodenossoartigo,vamosobservarcomolidarcomessasculturasque
diferemmaisdanossa,eevitarqueessasdiferenasnoscaracterestravema
aplicaooufaamamesmadarumresultadodiferentedoesperado.

Criandoumaaplicaobsica
Nessemomento,temosumaideiageraldecomoosistemadelocalizaodo.NET

Frameworkfunciona.Aideiaquecoloquemosessasideiasemprticaevejamos
comoasaplicaesirosecomportarcomdiferentesconfiguraesdeculturas.
Conformecomentamos,essetipodeabordagemparacriaodeaplicaesmuito
comumespecialmentenasaplicaesWindowsStoreeWindowsPhone,quepodem
estardisponveisemtodosospasesdomundo.
Porm,comoosconceitostambmsoutilizveisemoutrastecnologias,
estaremoscriandoumexemplobaseadoemumaaplicaodotipoConsole,amais
simplesqueh.Aadaptaodessesconceitosaoutrastecnologias.NETbastante
simples.
VamosutilizarotemplatecomumdeaplicaesConsole,comomostraaFigura1.
Acriaobastantesimples:estaremoschamandonossaaplicaode
ExemploLocalizacaoNET.Comisso,temosnossoprojetoprontoparaser
configuradodeformaautilizarosconceitosdelocalizaoem.NET.

NOTA:AsaplicaesparaaslojasdoWindowsestoaindamaissimplesde
seremdesenvolvidas.AMicrosoftdisponibilizourecentementeotemplate
universaldeaplicaes,quepermiteacriaodesoftwareparaWindows8.1e
WindowsPhone8.1baseadosemumsprojeto.
Essetipodeaplicaomuitointeressanteparaserutilizadocomosconceitos
delocalizao,criandoumaaplicaoqueirabrangerumareamuitogrande,
comgrandespossibilidadesdeaumentodoganhododesenvolvedor.

Oconceitodeaplicaesuniversaistemganhadomuitaforanodesenvolvimento
.NET.AMicrosofttemanunciadovriasaesparatornaro.NETFrameworkmais
aberto,capazfuncionaremdiferentesplataformas.
Nocasodessasaplicaesuniversais,otemplatedoVisualStudioircriaruma
soluobaseadaemtrsprojetos:umprojetodeaplicaoWindowsStore,outro
paraWindowsPhoneeumprojetocompartilhadoentreosdemais.
Aideiaque,devidoproximidadedasplataformas(WindowseWindowsPhone
8.1),osrecursosdaaplicaosejamsalvosemapenasumprojeto,aumentandoo

reusodecdigoetambmautilizaodaslojasdeaplicativosdaMicrosoft.

abririmagememnovajanela
Figura1.CriandoprojetoWindowsStore
Nessemomento,emnossaaplicaoexemplo,vamoscriarumainterface
extremamentebsica,comalgunstextossimples.Almdisso,criaremostambm
ummenudeconfigurao,queirpermitiraousurioescolheraculturadesejada
posteriormente.
Aideiaque,inicialmente,tenhamosumainterfacequereflitaasalteraesnas
culturasqueomenudeconfiguraoirproporcionaraplicao.Essasalteraes
serovistasnotextoinicialdeboasvindasenadatasendomostradanotopoda
aplicao,comomostraaFigura2.Oprimeiroitemdemenudizrespeito
atualizaodosdadosparaverificarmossehouvealgumaalteraonacultura.
Issonoacontecer(anoserquehajaalgumproblemaouqueaculturaseja
alteradanoprprioWindows),apenasumaformadeatualizarapginaeas
informaesnelacontidas.importantenotarmosaquestodoformatodedatas
naFigura2.

EsseformatodotipoAAAAMMDD,comohorrioem12horas,oquecondizcom
aculturainicialdenossaaplicao.EssaculturaaenCA,ouinglscanadense.
Nocasodoleitor,essaculturadeveestarcomoptBR,umavezqueaaplicao
irutilizaraculturadoSistemaOperacionalparaformataroselementosdentrodo
software.

Figura2.Pginainicial
Agoraquetemosnossomenuinicial,vamoscriarummenudeconfigurao.A
aplicaoestesperandoumaopoqueirlevaramesmaparaumapginade
configuraes.Aestruturadomenudeconfiguraesbastantesimples:
estaremosadicionandoaslinguagensPortugusdoBrasil,InglsAmericanoe
EspanholdaEspanha.
Essasvariaesreferentesaopastrazemaindaoutrasinformaes,quefazem
comqueaaplicaosecomportecomoosusuriosdessespasesesperam.Note
queapenasoformatodainterfacedeusurioestpronto,comocomportamento
internoaindaporserdefinido.
Assim,temosnossaaplicaopreparadaparaautilizaodosistemade
localizaoem.NET.Nasprximasetapasdenossoartigo,iremostrazerem
detalhescomolidarcomessaAPIeutilizaraspginasqueacabamosdecriarpara
termosumaaplicaoverdadeiramenteglobalizada.

Entendendoousodascultures
Conformecomentamos,aaplicaoutilizaaculturadoSistemaOperacionalpor
padro.Essaculturairdefinircomoainterfacedeusurioirsecomportar.
Entretanto,elanoanica.OWindowspermiteaalteraodeumaculturade
formatao,quenoirafetarainterfacedeusurio,apenasaformacomodatas,
horrios,valoresnumricosemonetrios,entreoutros,seromostradosnoSO.
Issocondizcomaformadeprogramaoquecomentamos,ondehdoistiposde
culturasdentrodenossaaplicao:aculturadaaplicaoemsi,utilizada
internamente(CurrentCulture)eaculturadainterfacedeusurio
(CurrentUICulture).Essaprimeiraaqueseralteradasealterarmosapreferncia
deformataonaFigura3.Entretanto,comopodemosnotar,oWindowsmesmo
recomendaquenoalteremosessapropriedade,mantendoopadro,quea
mesmalinguagemdeinterfacedoWindows.

Figura3.AlterandoformataodoSO
Essaformatao,mesmoquealteremososeuvalor,noirafetaruma

propriedadeimportantedentrodonamespaceSystem.Globalization,emespecialna
classeCultureInfo.Essapropriedade,InstalledUICultureirretornaraculturaqueo
SOfoiinstalado,oquepodefacilitararecuperaodeumpadroinicialporparte
daaplicao,senecessrio.
Notequeessevalornorefleteaculturasendoutilizadanomomento(nomeu
caso,inglscanadense(enCA))esimaqueoSistemaOperacionalfoiinstalada
(nomeucaso,inglsamericano(enUS)).Essasligeirasalteraesnosconceitos
necessitamdeumentendimentoparaquenohajaconfusonahorado
desenvolvimento.
Osistemadelocalizaoem.NETpermiteautilizaodedoistiposespeciaisde
culturas:aculturaneutra(neutralculture)eaculturainvariante(invariant
culture).Essesdoistipospossuemsuasutilizaesepodemsermuitoteisem
vrioscasos.Vamoscomearpelaculturaneutra.Relembrando,essetipode
culturanoidentificaopasdeorigem,apenasalnguaescolhida.
Nocaso,vamosestartrabalhandoapenascomptouenaoinvsdeptBRou
enUS(ouenCA).Essetipodecolocaopodesermuitotil,especialmente
quandoestamosutilizandoumaformafixadeformataodedadosdedatase
horrios,porexemplo.Autilizaodessaculturaneutrapodeservisualizadana
Listagem1enaFigura4.Podemosnotarquealteramosaculturadenossa
aplicaoparaumaculturaneutra,semadefiniodepas.Tambmpodemos
observarqueoformatodedatasehorriosestdiferente,respeitandooquea
culturaptdiz.
Oleitorpodenotarque,setentarmosacessarapropriedadeCurrentUICultureda
Thread,elanotersidoalterada.Issomostradeformaaindamaisclaraqueno
humacorrespondnciaentreosdoistiposdecultura.Ainda,sealterssemosessa
segundacultura(CurrentUICulture),nohaverianenhumaalteraonoformatodas
datassendomostradasemnossaaplicao.
Listagem1.Utilizaodeneutralculture
Thread.CurrentThread.CurrentCulture=newCultureInfo("pt");
Console.WriteLine("Culturaatual:"+Thread.CurrentThread.CurrentCulture);
Console.WriteLine(DateTime.Now);

Figura4.Culturaneutra(pt)
Autilizaodaculturainvariante(invariantculture)aindamaissimples.Essetipo
deculturadefinidoatravsdeumapropriedadenaclasseCultureInfo,chamada
InvariantCulture.Autilizaodessapropriedadefeitadiretamentenoelemento
quequeremosmostrar,comomostraaListagem2.Nohnenhumaalteraoda
culturadaaplicaoapenasaplicamosessetipodeculturainvariantelocalmente.
Nessecaso,oresultadoonmerosendomostradoexatamentecomolidamos
comelenocdigo(1.78).CasoutilizssemosumaculturacomoaptBR,por
exemplo,teramosonmero1,78,sendomostrado.Autilizaodesseelemento
podesertilemalgunscasos,masmaisparaquestesdedepuraodecdigo.
Listagem2.Utilizaodeinvariantculture
varnum=1.78;
num.ToString(CultureInfo.InvariantCulture);
Console.WriteLine(num);

Comopodemosnotar,aclasseCultureInforesponsvelpelocontroledequase
tudoquedizrespeitoglobalizaodentrodonamespaceSystem.Globalization.
Essaclassetraztodososelementosnecessriosparaalteraoeobtenoda
culturasendoutilizadapeloSistemaOperacional,oquefacilitaavidado

desenvolvedornoacessoaessasinformaes.
Almdisso,autilizaodosdoistiposespeciaisdeculturas(neutraeinvariante),
permitemumaliberdadeaindamaiornoquedizrespeitoformataodedados.
Issoporquemostramosquenoprecisamosestarpresosemapenasumacultura,
ouformatodedados,dentrodaaplicao.

PordentrodaclasseRegionInfo
PudemosnotarqueaclasseCultureInfoaresponsvelporquasetudoquediz
respeitoglobalizaoem.NET.Entretanto,elanoanicaclassecom
importncianessemeio.AclasseRegionInfooutraquetrazdiversoselementos
muitoteisparaodesenvolvimento.
essaclassequeirnosinformar,porexemplo,searegiooupasemquesto
(definidonaCurrentCulture)utilizaosistemamtrico,nomeesmbolodamoedada
regio,entreoutrasinformaesteis.Autilizaodasegunda,emespecial,
muitoimportanteemumaaplicaoglobalizada.Issoporquedificilmente
estaremoslidandocomdlaressemoramosnoBrasil,oureaissemoramosem
outropasqualquer,porexemplo.
VamosobservarqueaTabela1trazasprincipaispropriedadesdaclasse
RegionInfo.Reparequeexistemdiversasinformaesteis,dependendodotipode
aplicaosendodesenvolvida.Dequalquerforma,soinformaesquepodemser
utilizadasemdiversassituaesparagarantirqueaglobalizaosejarespeitada.
Valeressaltarqueessaspropriedadesnosoestticas,ouseja,noesto
vinculadasclasseRegionInfoesimaumobjetoRegionInfo.Esseobjeto,
normalmente,oCurrentRegion,quecontmasinformaesdaregiodacultura
atual.

Nome

CurrencyNativeName

Descrio

Nomenativodamoedalocal

CurrencyEnglishName

Nome,eminglsdamoedalocal

CurrencySymbol

Smbolodamoedalocal

IsMetric

Booleanoqueindicasearegiooupasutilizaosistema
mtrico

ISOCurrencySymbol

Smbolodamoedalocalemtrsletrasconformeanorma
ISO4217

ThreeLetterISORegionName

Cdigodopasouregioemtrsletras,conformeanorma
ISO3166

NativeName

Nome,nalinguagemnativa,nopasouregio

Tabela1.PrincipaisPropriedadesdeRegionInfo
Comofoipossvelnotarmos,aclasseRegionInfopossuidiversaspropriedades
interessantes.Vamosanalisaralgumasdelasnaprticaeverificarmossecondizem
comoqueesperamosemnossopas.
EstaremosutilizandoocdigodaListagem3.Notequeestamosutilizandoo
smbolomonetriodosreais(linha02)equeelecondizcomoesperadoparao
Real.Entretanto,paraumaquestodeglobalizao,essecdigopodeno
funcionar.Issoporque,paraalgunspases,osmbolodamoedalocalcostuma
aparecerapsovalordigitado.
Comoissonomuitocomum,umcdigoassimirfuncionarnamaiorpartedos
lugares.Umcdigocomoodalinha03podefuncionarmelhormundialmente,coma
ressalvadequeoresultadosedarnosingular,independentementedovalor
escolhido.
Nalinha04podemosnotarqueainformaopassadaestcorreta:oBrasilutilizao

sistemamtrico.OresultadodessecdigopodeservistonaFigura5.
Listagem3.UtilizandoclasseRegionInfo
01varinfoRegiao=newRegionInfo("ptBR");
02Console.WriteLine("Temos"+infoRegiao.CurrencySymbol+"27,45");
03Console.WriteLine("Temos27,45"+infoRegiao.CurrencyNativeName);
04Console.WriteLine("Utilizasistemamtrico:"+infoRegiao.IsMetric);

Figura5.RegionInfonaprtica
Asinformaesdesseexemploestoapenassendomostradasparans.Oideal
queelassejamutilizadasparaalgumtipodeconfiguraodentrodaaplicao.
Nocasodobooleanoqueindicaseosistemamtricoutilizado,especialmente,
possvelutilizarmosalgumtipodeclusulaifparavalidarumainformaode
comprimentoentradapelousurio,porexemplo.
Precisamosnotarqueasinformaesestolparaseremutilizadas,eprecisamos
sabercomotirarproveitodelas.

Representaesdedata,horrios,valores
numricosemonetrios
Aformacomoosdadossorepresentadosdentrodaaplicaoumadasprincipais
vantagensdautilizaodosistemadelocalizaodo.NET.Asrepresentaesde
data,horrios,valoresnumricosemonetriosumadasquestesquemais
trazemproblemasquandotratamosdeumououtrotipo.
Porsorte,osistemadelocalizaopodecontrolaressesfatoresparans.Como
observamos,asdatasehorriossoautomaticamentealteradasquandoalteramos
aculturadenossaaplicao.Omesmovlidoparaosvaloresnumricose

monetrios.
Comocomentamos,autilizaodaculturanecessriaparagarantirquetudo
dentrodaaplicaosejanaturalparaousurio,independentementedopasem
queelevive.
Vamoscomearfalandodedatasehorrios.Oformatopadrodessesdois
elementosemaplicaesatravsdeumtipodedadochamadodeDateTime.
Essetipodedadopossuiumarepresentaoparaadataseguidaporuma
representaodohorrio.
Essarepresentaoirvariarconformeaculturaestipulada.Porm,oformato
padrodetempoedatasegueoISO8601,queespecificaumformatodedatae
horaemqueaordemdeveserdomaissignificanteparaomenos:AAAAMMDD
paradataeHH:MM:SSparahora.
Essetipodeformatoutilizadoemalgunspases,enquantooutrospreferemoutros
formatos.NocasodoBrasil,temosoformatodedatadiferentedessepadro,
utilizandoopadroDD/MM/AAAA.
ObserveocdigodaListagem4enotequeestamosutilizandoavarivelagora
pararepresentaradataehoraatual(DateTime.Now).Aquestotodaestnos
mtodosToString().
Repareaslinhas02a04:primeiramente,estamostrazendoadataehoradeforma
conjunta,eentoapenasadataeporfimapenasotempo.Comonoestamos
realizandonenhumtipodedefinioexplcitadacultura,adataehoraestsendo
mostradanoformatodaculturaatualdaThread.
Porm,nalinha06estamosrealizandoessadefiniodeformaexplcita.Estamos
indicandoquedesejamosseguiroformatodedataehorautilizadonaculturapt
BR,queestamosacostumados.Comoocomentriodalinha05indica,essetipode
definioexplcitaerrado,umavezquequebrariacompletamenteoconceitode
globalizaodaformacomoo.NETFrameworkoprope.
Aideiasemprepermitirqueadataehoradaaplicaosejamcontroladospela
propriedadeCurrentCulturedathreadatual.

Listagem4.Representaodedataehora
01varagora=DateTime.Now;
02Console.WriteLine(agora.ToString());
03Console.WriteLine(agora.ToShortDateString());
04Console.WriteLine(agora.ToShortTimeString());
05//Errado
06Console.WriteLine(agora.ToString(newCultureInfo("ptBR")));

Naquestodedataehora,podemosressaltaralgunsformatadoresquepodemser
utilizados.UmdelesoformatadorR,quepodeserutilizadocomomostradona
Listagem5.Esseformatadoriralteraroformatodedataehoraparaummais
completo,deacordocomoformatoRFC1123(<dia_da_semana>,<dia_do_ms>
de<ms>de<ano><horrio><fuso_horrio>porexemplo,SextaFeira,16de
janeirode201510:00:00GMT).Existemoutrosformatadoresqueacabamno
vindoaocasonessemomento,umavezqueaquestodadatacompletaoque
temosdemaiscomumemtermosdeutilizao.
Listagem5.FormatadorR
Console.WriteLine(agora.ToString("R"));

Outropontoquerequeratenooparsingdedatas.Comoexistemdiversos
formatos,umadatacomo02/01/2015podeserinterpretadatantocomo2de
janeirocomo1defevereiro,dependendodaculturaemquesto.Issopode
levaraproblemasinternosnaaplicao.
Umaformadeevitaressesproblemasautilizaodomtodo
DateTime.ParseExact(),queirrecebercomoparmetrosadata,opadroaser
formatadoeaculturaemquesto,comomostraaListagem6.interessantea
utilizaodessemtododentrodeblocostry/catch,umavezqueachangede
problemasduranteoparsingdedatasgrande.
Listagem6.UtilizaodomtodoParseExact()
vardata=DateTime.ParseExact("02/01/2015",
newCultureInfo("enUS").DateTimeFormat.ShortDatePattern,

newCultureInfo("enUS"));
Console.WriteLine(data);

Aquestodonmerodassemanasoutranecessitadeateno.Comoemalguns
pasesasemanacomeanodomingoeemoutrosnasegundafeira,issopode
causarerrosnonmerodasemanaseoanocomeouemumdessesdoisdias.Por
exemplo,oanode2012comeouemumdomingo.
Issofazcomquepasesemqueasemanacomeanasegundafeiratenham
diferentesnmerosdesemanaaolongodoano.Porexemplo,noBrasilasemana
comeanodomingo.Issofariacomqueosnmerosdesemanafossemdiferentes
dosvistosnaSucia,ondeasemanacomeanasegundafeira.
Valeressaltarqueessaquestoapenasinternadosistemadeglobalizaodo
.NET,enodizrespeitoaosnmerosreaisdassemanas.Emoutraspalavras,a
primeirasemanadoanoamesmanoBrasilenaSucia.
Quantoaosvaloresnumricosemonetrios,tambmnecessriaalgumaateno.
Autilizaodaculturainvariante(invariantculture),comovimosanteriormente,
eliminaproblemasdeformatao,utilizandoosmesmosnmerosqueutilizamos
paraaprogramao.
Entretanto,muitasvezesissonointeressanteparaousurio,umavezqueele
esperaenxergarosvaloresdeumaformacomaqualestacostumado.Pensando
nisso,precisamosentenderquaissoasalteraesqueacontecemnosvalores
numricosemonetriosaoutilizarmososistemadeglobalizaodo.NET.
Vamosutilizar,comomostraaListagem6,onmero2.456.000,57(doismilhes
quatrocentosecinquentaeseismilvrgulacinquentaesete).Reparequeo
formatocomqueestamosacostumadosseparaascentenasdosmilhares,os
milharesdosmilhesetc.utilizandoo..
Jascasasdecimaissoseparadasatravsdavrgula.Emoutrasculturas,como
nosEstadosUnidos,ascasasdecimaissoseparadasatravsdoponto.,como
vemosemtodasaslinguagensdeprogramao(aomenosasqueeuconheo),e
ascentenasdosmilhares,milharesdosmilhesetc.,soseparadasatravsde
vrgula.Outrasaindacostumamsepararascentenasdosmilhares,eassim

sucessivamente,atravsdeumespaosimples.
AListagem6aindatrazumoutroelemento,oparmetroNnachamadado
mtodoToString().Esseparmetroutilizadoparaindicarquesetratadeum
valornumrico,paraqueelesejaformatadodeacordo.Outrosparmetrospodem
serutilizadosparadiferentessituaes,comoemcasosdevaloresmonetrios.
EssesparmetrospodemserconferidosnaseoLinks.ReparenaFigura6a
amostragemdessaquesto.
Listagem6.Cdigoparaformataonumrica
varnum=2456000.57;
Console.WriteLine(num.ToString("N",newCultureInfo("enUS")));
Console.WriteLine(num.ToString("N",newCultureInfo("ptBR")));

Figura6.Amostragemdevaloresnumricos
QuandofalamosdaclasseRegionInfo,mencionamososmbolomonetrioda
regio.Autilizaodadatinhaumproblema,umavezqueosmbolopodevirtanto
nafrentedovalorcomoatrs,dependendodaculturautilizada.Pararesolveresse
problema,oidealqueutilizemosomtodoToString()comoparmetroC(de
Currency)esuasvariaes.
Issofarcomqueovalormonetriosejaformatadocomoesperadonacultura
emquesto.Porexemplo,se,aoinvsdoNnocdigodaListagem6
tivssemosoC2,teramosumresultadosimilaraomostradonaFigura7.O
nmeroapsoparmetroCindicaonmerodecasasdecimaisaserem
mostradas.Seutilizssemosaculturasueca(svSE),porexemplo,teramoso

resultadomostradonaterceiralinhadevaloresnafigura.
Autilizaodessaculturasedpelofatodeoindicadordamoedavirdepoisnela.

Figura7.Valoresmonetrios
Comopodemosnotar,existemdiversasconfiguraespossveisparavalores
numricos,monetrios,dedataouhora.Aideiaqueodesenvolvedortenha
liberdadeparalidarcomessesvaloresdaformacomquedesejar.
claroqueprecisoatenoparanoquebrarautilizadadosistemade
globalizaoqueo.NETnosoferece.Masoselementostrazemelementos
interessantssimosparaacriaodeumainterfacedeusuriomaisprximadoque
eleesperaeestacostumadonodiaadia.

Desenvolvendoomenudeconfigurao
Comooleitorpodeterreparado,acabamosdeixandonossaaplicaoexemplo
meiodeladoparaexemplificaroselementosimportantesdosistemadelocalizao
do.NET.Agoraqueconhecemososconceitosecomoelesoperam,aideiaaplic
losdeformaacriarumaaplicaosimples,masglobalizada,capazdefuncionar
utilizandoasculturasamericana,brasileiraeespanhola.
Aestruturadomesmojestprontaprecisamosapenasfazercomqueaescolha
queousuriofazimporte,ouseja,comqueaculturasejaalteradaumavezqueo
usurioescolhaumadiferentecultura.
Vamoscomeardefinindoaculturapadrodenossaaplicao.Essaculturaser
definidaemnossoarquivoApp.config,comumcdigocomoodaListagem7.
Podemosnotarquedemosumnomeparaessaculturae,emboraessenomeseja
similaraoutilizadopelaThread,elesnosovinculadosdiretamente.Precisaremos
realizaressavinculaoposteriormente,deformamanual.
Issoquefoidefinidoaquiumaconfiguraodaaplicao,comoatag

<appSettings>sugere.NotemligaodiretanenhumacomaclasseCultureInfo
ouqualqueroutrainformaosobrelocalizaodo.NET.
Listagem7.CulturapadroemApp.config
<appSettings>
<addkey="DefaultCulture"value="ptBR"/>
</appSettings>

Agoraquetemosovalordefinido,vamosutilizloemnossaaplicao.Oideal,
independentementedotipodeaplicao,realizaressadefinioantesda
inicializaodoscomponentes.NocasodeumaaplicaoConsole,issofeitono
comeodomtodoMain().Paraisso,precisamosbuscarovalordeDefaultCulture
nasconfiguraesdasaplicaes.
Paraisso,bastaacionarmosoConfigurationSettings.AppSettings,comomostraa
Listagem8.AinformaoqueoConfigurationSettingsestobsoletoequeo
idealautilizaodoConfigurationManager.Entretanto,vocpodeutilizar
qualquerumdosdoissemproblemanenhum,aomenosporenquanto.Aseguir,a
culturaobtidaestsendoutilizadaparaosvaloresdeCurrentCulturee
CurrentUICulture.
Listagem8.Definiodaculturapadro
//Definiodaculturapadro

CultureInfodefaultCulture=newCultureInfo(ConfigurationSettings.AppSettings["DefaultCul
Thread.CurrentThread.CurrentCulture=defaultCulture;
Thread.CurrentThread.CurrentUICulture=defaultCulture;

NOTA:Adefiniodaculturapadropodenosernecessriaemalgunscasos
emqueaculturadoWindowsaptBR.Entretanto,comonosabemosde
antemo(teoricamente)ondenossaaplicaoirrodar,interessante
definirmosexplicitamente.

Oprximopassoautilizaodomenudeconfiguraescriadoparaalteraressa

culturadeacordocomoquefoiproposto.Paraisso,temosumcdigocomooda
Listagem9.Reparequeestamosutilizandoumblocoswitch/caseparaasopes
de1a3,equeparaqualqueroutraopoeleirinformarqueaopoinvlida.
Paracadaumadaslnguas,estamosresetandoasculturasdaUIeaculturada
aplicaoemgeral.Quandoexecutamos,podemosnotarqueaculturaalterada.
Entretanto,nonotamosmuitasdiferenasnainterface,apenasquando
observamosadataeahora,queestosendomostradas.
Listagem9.Configuraodomenudeconfiguraes
Console.WriteLine("Menudeconfiguraes:");

Console.WriteLine("1PortugusdoBrasil\n2InglsAmericano\n3EspanholdaEspanha"
inty=int.Parse(Console.ReadLine());
CultureInfoculture;
switch(y)
{
case1:
culture=newCultureInfo("ptBR");
Thread.CurrentThread.CurrentCulture=culture;
Thread.CurrentThread.CurrentUICulture=culture;
break;
case2:
culture=newCultureInfo("enUS");
Thread.CurrentThread.CurrentCulture=culture;
Thread.CurrentThread.CurrentUICulture=culture;
break;
case3:
culture=newCultureInfo("esES");
Thread.CurrentThread.CurrentCulture=culture;
Thread.CurrentThread.CurrentUICulture=culture;
break;
default:
Console.WriteLine("Opoinvlida!");
break;
}

Notamosqueaconfiguraodomenuparaalteraodaculturadaaplicao
bastantesimples.Bastaqueutilizemosoconceitojdiscutidoanteriormentee
definiranovaCurrentCulturedathreadatual.

Aformacomoaaplicaoestdefinidafazcomqueomenusejamostrado
constantemente,permitindoaalteraodacultura,apenasparaverificaodos
elementos.
Valenotarmosquenohumarestrioquantoaonmerodelnguas(ouculturas)
queumaaplicaopodesuportar.Oidealquetenhamosomximopossvel,
dentrodeumalimitaonaturaldeespaoemdiscoparaarmazenamentoeescopo
damesma.

CriandoarquivoderecursosparaaUI
Umdospassosmaisimportantesparaacriaodeumaaplicaorealmente
globalizadaestnosarquivosderecursos.Essesarquivossoutilizadospara
salvarasstringsdainterfacedeusuriodaaplicaonasvriaslinguagensquea
mesmautiliza.
Valenotarmosqueessaideianoexclusivaparaglobalizao:mesmoem
aplicaescomumaculturapodemtirarproveitodamelhororganizaoqueos
arquivos.resxtrazem.
Atualmente,nossoarquivoexemplopossuialgumasstringsdeinterfacedeusurio.
Soasstringsdomenuinicial,asstringsdomenudeconfiguraoeasstringsde
boasvindas.Iremosadicionaressasstrings,queatualmenteestonocdigo,aum
arquivo.resx.
Vamoscomearcomumarquivoinicial,chamadoStrings.Paraisso,clicamoscom
obotodireitosobreoprojeto,eentoemAdd>NewItem.Nessajanela,basta
escolherotipoResourcesFile,comomostraaFigura8.Comisso,temosa
criaodeumarquivoqueesperaalgunsdetalhesdasstringsdenossaaplicao.

abririmagememnovajanela
Figura8.Criandoarquivoderecursos
Aideiaadicionarmostodosostextosdenossaaplicaoaessearquivode
recursos.Onomedelesnomuitoimportante,masprecisoquesaibamosquais
soparautilizaodentrodocdigo.NaFigura9,oarquivoStrings.resxcompleto,
comtodasasstringsqueiremosutilizar.Notequeesseoarquivopadro:ele
serutilizadoquandonohouverumarquivoespecficoparaaculturaatual
(CurrentUICulture).
Notequeaquantidadederecursosbastantealtacomrelaoacomplexidadeda
aplicao.Issoporqueexistemvriostextosdentrodaaplicao,pormenorque
elaseja.Emumaaplicaocomplexa,essesarquivosderecursosserobastante
extensos,oqueaumentaanecessidadedecomearmosadesenvolverpensando
neles,enoinserilosemumaetapaposterior.
Aindanamesmafigura,notamosquepodemosadicionarcomentriosarespeito
doselementos.Issopodeserinteressanteemaplicaesmaiores,paraque
tenhamosumamelhorideiadeaondeestamosutilizandoorecursoemquesto.

abririmagememnovajanela
Figura9.ArquivoStrings.resx
Oprximopassoacriaodosarquivosderecursosespecficosdecadaumadas
culturasdefinidas.Paraisso,umaregradenomeaoprecisaserrespeitada:o
nomedeveseromesmo(Strings)doarquivopadro,comosufixo(lngua,como
.ptBR).
Aaplicaoirentenderqueessesufixoindicaqueoarquivoderecursospara
aquelaculturaesse.NotenaFigura10queosnomesdosarquivoscriados.Aqui,
valeummacete:interessantesimplesmentecopiarecolaroarquivoderecursos
criadoinicialmentequantasvezesfornecessrioeorenomear.
Issogarantequeoidentificadordasstrings(Name)continuaromesmo,bastando
quealteremosocontedodosmesmos.

Figura10.Nomenclaturadosarquivos.resx
Agoraquetemososarquivosderecursosprontos,precisamosutilizlosdentrode
nossocdigo.Podemosnotarquebastantesimplesessautilizao:eles
funcionamcomoclasses,ecadaumdoselementossocomoaspropriedades.
ComopodemosnotarnotrechodaListagem10,estamosutilizandoastring
BoasVindaspararepresentarafrasedeboasvindasdenossaaplicao:Bem
vindolocalizaoem.NET!.
Almdisso,estamosmostrandoomenuprincipaldenossaaplicao.Asdemais
stringspodemserutilizadasdamesmaforma:<Nome_do_arquivo_resx>.
<Name>,comoporexemploStrings.MenuConfigsCabecalho.
Listagem10.UtilizaodosrecursosdoarquivoStrings

Console.WriteLine(Strings.BoasVindas);
Console.WriteLine(Strings.MenuPrincipalAtualizar);
Console.WriteLine(Strings.MenuPrincipalConfigs);
Console.WriteLine(Strings.MenuPrincipalSair);

Temosasstringsdefinidascomosendonossosrecursos.Vamosanalisaroque
aconteceemnossaaplicaoquandoalteramosaculturadomesmo.Lembrese
que,inicialmente,temosaculturaptBRsendoutilizada.AFigura11mostraas
execuesdaaplicaonasculturasptBReenUS.possvelnotarmosquea
dataehoratambmforamalteradasdeacordocomaculturadefinida.

Figura11.Execuoemdiferentesculturas
Comisso,temosqueacriaodeaplicaescapazesdeexecutaremdiferentes
culturasnospossvelcomo,decertaforma,simples.Agrandesacadaque
precisamosconhecerumpoucodaculturadospasesalvo,demodoanotermos
surpresasquepodemcomprometeraqualidadedenossaaplicao.
Nocasodosarquivosderecursos,bastantesimplesacriaodevriosdeles.
Porm,precisamoslevaremconsideraoaquestodomaiorespaoemdiscoque
umaaplicaocomvriosdessesarquivosirocupar,especialmenteemaplicaes

paradispositivosmveis.
AolongodesseartigotrouxemosemdetalhesonamespaceSystem.Globalization,
do.NETFramework.Aideiafoitrazerparaoleitoraspossibilidadesqueesse
namespacenostraz,emtermosdeglobalizaodaaplicao.
Comoadventodaslojasdeaplicativos,essetipodeabordagemmuito
interessante,porquepermiteans,desenvolvedores,ummercadoalvomais
amplo,oqueaumentarnossorendimento.
Otipodeabordagemmostradoaolongodoartigo,criandoaplicaesglobais,
especialmentecomumemdispositivosmveis.Agora,comoWindows8e8.1,a
ideiadessetipodeaplicaotendeaganharespao.
Almdisso,aalteraodaculturadaaplicao,modificandolinguagemeoformato
doselementosnumricosededataehora,especialmenteimportanteem
website.Osconceitosmostradospodemserutilizadosemtodasessasplataformas.
Porfim,nopoderamosdeixardemencionaropluginGlobalizeparaJavaScript.
EsseelementobastantesimilaraonamespaceSystem.Globalization,maspode
serutilizadoemvriostiposdeaplicaes,sendomaisvoltadoparao
desenvolvimentoweb.
EssepluginpodeserutilizadopelocabealhoHTML<script
src="http://ajax.aspnetcdn.com/ajax/globalize/0.1.1/globalize.min.js"/>.O
conceitodeculturareregiesmuitosimilaraoquevimosaolongodoartigo,com
algumasalteraes.Paramaisinformaesarespeito,chequeaseoLinks.

Links
NLSAPIReference
http://msdn.microsoft.com/enus/goglobal/bb896001.aspx
Padrodeformatosnumricosdestring
http://msdn.microsoft.com/ptbr/library/
dwhawy9k%28v=vs.110%29.aspx

PluginGlobalize
https://github.com/jquery/globalize

HenriqueMachadoGasparotto
EstudantedeEngenhariadeComputaonaUniversidadeFederaldeSantaMariaUFSMeTcnicoem
InformticapeloSENACSantaMaria.ExperinciaemprogramaoC#.NETeJava,almdeaplicaes
mobile(AndroideWindowsPhone)e[...]

Oquevocachoudestepost?
Gostei(0)

(0)

Comentrio|Tiresuadvida

Servios
Incluaumcomentrio
AdicionaraosFavoritos
Marcarcomolido/assistido
Incluiranotaopessoal

Versoparaimpresso

+.net

Mais posts
Revista

Revista .net Magazine 120


Artigo

DDD ASP.NET: Criando um repositrio de dados - Parte 3


Artigo

Entity Framework: Aplicando o padro de projeto MVVM


Artigo

Conhea o Azure WebJobs


Artigo

Criando um carrinho de compras com KnockoutJS e SignalR


Artigo

ASP.NET MVC Mobile Modos de visualizao e


performance Parte 2
Video aula

Profile - Curso bsico de ASP .NET - Aula 67

Video aula

Cache - Curso bsico de ASP .NET - Aula 66


Video aula

Session - Curso bsico de ASP .NET - Aula 65


Listar mais contedo

Anuncie | Loja | Publique | Assine | Faleconosco

DevMedia
Curtir Voccurtiuisso.
Voceoutras54.323pessoascurtiramDevMedia.

PluginsocialdoFacebook

HospedagemwebporPorta80WebHosting

Você também pode gostar