Recuperando configurações regionais com o PowerBuilder

Recuperando configurações regionais com o PowerBuilder

Overview

Olá, amigos do desenvolvimento! No post de hoje, vamos mergulhar no mundo do PowerBuilder, mostrando um passo a passo bem explicadinho de como acessar aquelas informações regionalizadas do Sistema Operacional que às vezes dão um nó na cabeça. Sim, estou falando de formatos de data, moeda, fuso horário e idioma. Sem usar funções nativas, mas com um pouco de mágica de funções externas, você vai ver que não é um bicho de sete cabeças. Preparados para tornar seus aplicativos mais amigáveis a qualquer localidade? Vem comigo!

Dependendo da aplicação, as vezes precisamos saber o formato da data, da moeda, fuso horário, idioma e outras informações do Sistema Operacional onde nosso software está rodando. Neste post, mostro como recuperar estas informações com o PowerBuilder.

Como você já deve ter imaginado, não existe uma função nativa para isso, ou seja, vamos utilizar funções externas. Sendo assim, o primeiro passo é declarar as tais funções externas:

//Funções externas para pegar Regional Settings.
FUNCTION int GetLocaleInfoA(ulong locale,ulong lctype,REF string data,int size) LIBRARY "kernel32.dll"
FUNCTION ulong GetSystemDefaultLCID() LIBRARY "kernel32.dll"

O próximo passo é declarar uma série de variáveis de instancia (ou globais… ou mesmo locais, se preferir) com as flags:

CONSTANT long LOCALE_ILANGUAGE = 1         //	LANGID  in hexadecimal digits
CONSTANT long LOCALE_SLANGUAGE = 2         //	Full localized name of the language
CONSTANT long LOCALE_SENGLANGUAGE = 4097   //	Full English U.S. name of the language ISO Standard 639
CONSTANT long LOCALE_SABBREVLANGNAME = 3   //	Abbreviated name of the language, ISO Standard 639
CONSTANT long LOCALE_SNATIVELANGNAME = 4   //	Native name of the language
CONSTANT long LOCALE_ICOUNTRY = 5          //	Country code, based on international phone codes
CONSTANT long LOCALE_SCOUNTRY = 6          //	The full localized name of the country.
CONSTANT long LOCALE_SENGCOUNTRY = 4098    //	The full English U.S. name of the country.
CONSTANT long LOCALE_SABBREVCTRYNAME = 7   //	Abbreviated name of the country ISO Standard 3166.
CONSTANT long LOCALE_SNATIVECTRYNAME = 8   //	Native name of the country.
CONSTANT long LOCALE_IDEFAULTLANGUAGE = 9  //	LANGID for the principal language spoken in this locale.
CONSTANT long LOCALE_IDEFAULTCOUNTRY = 10  //	Country code for the principal country in this locale.
CONSTANT long LOCALE_IDEFAULTCODEPAGE = 11 //	OEM code page associated with the country.
CONSTANT long LOCALE_SLIST = 12            //	Characters used to separate list items.
CONSTANT long LOCALE_IMEASURE = 13         //	0 for metric system (S.I.) and 1 for the U.S.
CONSTANT long LOCALE_SDECIMAL = 14         //	decimal separator
CONSTANT long LOCALE_STHOUSAND = 15        //	thousand separator
CONSTANT long LOCALE_SGROUPING = 16        //	Sizes for each group of digits to the left of the decimal.
CONSTANT long LOCALE_IDIGITS = 17          //	number of fractional digits
CONSTANT long LOCALE_ILZERO = 18           //	0 means use no leading zeros; 1 means use leading zeros.
CONSTANT long LOCALE_SNATIVEDIGITS = 19    //	Ten characters equivalent of the ASCII 0-9.
CONSTANT long LOCALE_SCURRENCY = 20        //	local monetary symbol
CONSTANT long LOCALE_SINTLSYMBOL = 21      //	International monetary symbol ISO 4217.
CONSTANT long LOCALE_SMONDECIMALSEP = 22   //	monetary decimal separator
CONSTANT long LOCALE_SMONTHOUSANDSEP = 23  //	monetary thousand separator
CONSTANT long LOCALE_SMONGROUPING = 24     //	monetary grouping
CONSTANT long LOCALE_ICURRDIGITS = 25      //	# local monetary digits
CONSTANT long LOCALE_IINTLCURRDIGITS = 26  //	# intl monetary digits
CONSTANT long LOCALE_ICURRENCY = 27        //	positive currency mode
CONSTANT long LOCALE_INEGCURR = 28         //	negative currency mode
CONSTANT long LOCALE_SDATE = 29            //	date separator
CONSTANT long LOCALE_STIME = 30            //	time separator
CONSTANT long LOCALE_SSHORTDATE = 31       //	short date format string
CONSTANT long LOCALE_SLONGDATE = 32        //	long date format string
CONSTANT long LOCALE_STIMEFORMAT = 4099    //	time format string
CONSTANT long LOCALE_IDATE = 33            //	short date format, 0 M縫忘,1 D邦忘r,2 Y邦縫
CONSTANT long LOCALE_ILDATE = 34           //	long date format, 0 M縫忘,1 D邦忘,2 Y邦縫
CONSTANT long LOCALE_ITIME = 35            //	time format, 0 AM/PM 12-hr format, 1 24-hr format
CONSTANT long LOCALE_ICENTURY = 36         //	Use full 4-digit century, 0 Two digit.1 Full century
CONSTANT long LOCALE_ITLZERO = 37          //	leading zeros in time field, 0 No , 1 yes
CONSTANT long LOCALE_IDAYLZERO = 38        //	leading zeros in day field, 0 No , 1 yes
CONSTANT long LOCALE_IMONLZERO = 39        //	leading zeros in month field, 0 No , 1 yes
CONSTANT long LOCALE_S1159 = 40            //	AM designator
CONSTANT long LOCALE_S2359 = 41            //	PM designator
CONSTANT long LOCALE_SDAYNAME1 = 42        //	long name for Monday
CONSTANT long LOCALE_SDAYNAME2 = 43        //	long name for Tuesday
CONSTANT long LOCALE_SDAYNAME3 = 44        //	long name for Wednesday
CONSTANT long LOCALE_SDAYNAME4 = 45        //	long name for Thursday
CONSTANT long LOCALE_SDAYNAME5 = 46        //	long name for Friday
CONSTANT long LOCALE_SDAYNAME6 = 47        //	long name for Saturday
CONSTANT long LOCALE_SDAYNAME7 = 48        //	long name for Sunday
CONSTANT long LOCALE_SABBREVDAYNAME1 = 49  //	abbreviated name for Monday
CONSTANT long LOCALE_SABBREVDAYNAME2 = 51  //	abbreviated name for Tuesday
CONSTANT long LOCALE_SABBREVDAYNAME3 = 52  //	abbreviated name for Wednesday
CONSTANT long LOCALE_SABBREVDAYNAME4 = 53  //	abbreviated name for Thursday
CONSTANT long LOCALE_SABBREVDAYNAME5 = 54  //	abbreviated name for Friday
CONSTANT long LOCALE_SABBREVDAYNAME6 = 55  //	abbreviated name for Saturday
CONSTANT long LOCALE_SABBREVDAYNAME7 = 56  //	abbreviated name for Sunday
CONSTANT long LOCALE_SMONTHNAME1 = 57      //	long name for January
CONSTANT long LOCALE_SMONTHNAME2 = 58      //	long name for February
CONSTANT long LOCALE_SMONTHNAME3 = 59      //	long name for March
CONSTANT long LOCALE_SMONTHNAME4 = 60      //	long name for April
CONSTANT long LOCALE_SMONTHNAME5 = 61      //	long name for May
CONSTANT long LOCALE_SMONTHNAME6 = 62      //	long name for June
CONSTANT long LOCALE_SMONTHNAME7 = 63      //	long name for July
CONSTANT long LOCALE_SMONTHNAME8 = 64      //	long name for August
CONSTANT long LOCALE_SMONTHNAME9 = 65      //	long name for September
CONSTANT long LOCALE_SMONTHNAME10 = 66     //	long name for October
CONSTANT long LOCALE_SMONTHNAME11 = 67     //	long name for November
CONSTANT long LOCALE_SMONTHNAME12 = 68     //	long name for December
CONSTANT long LOCALE_SABBREVMONTHNAME1 = 69 //	abbreviated name for January
CONSTANT long LOCALE_SABBREVMONTHNAME2 = 70 //	abbreviated name for February
CONSTANT long LOCALE_SABBREVMONTHNAME3 = 71 //	abbreviated name for March
CONSTANT long LOCALE_SABBREVMONTHNAME4 = 72 //	abbreviated name for April
CONSTANT long LOCALE_SABBREVMONTHNAME5 = 73 //	abbreviated name for May
CONSTANT long LOCALE_SABBREVMONTHNAME6 = 74 //	abbreviated name for June
CONSTANT long LOCALE_SABBREVMONTHNAME7 = 75 //	abbreviated name for July
CONSTANT long LOCALE_SABBREVMONTHNAME8 = 76 //	abbreviated name for August
CONSTANT long LOCALE_SABBREVMONTHNAME9 = 77 //	abbreviated name for September
CONSTANT long LOCALE_SABBREVMONTHNAME10 = 78 //	abbreviated name for October
CONSTANT long LOCALE_SABBREVMONTHNAME11 = 79 //	abbreviated name for November
CONSTANT long LOCALE_SABBREVMONTHNAME12 = 80 //	abbreviated name for December
CONSTANT long LOCALE_SABBREVMONTHNAME13 = 4111 // Native abbreviated name for 13th month, if it exists.

Note que alguns destes valores podem não estar disponíveis em versões “mais antigas” do Windows.

A utilização é bem simples. Dentre as flags que declaramos no passo anterior, escolha o item que você quer recuperar e utilize a função GetLocaleInfoA. No exemplo abaixo, vamos recuperar o nome abreviado para o mês de Janeiro (LOCALE_SABBREVMONTHNAME1):

string ls_buffer
ulong lul_size

string ls_str
ls_str = space(128)
GetLocaleInfoA( GetSystemDefaultLCID(), LOCALE_SABBREVMONTHNAME1, ls_str,128)
MessageBox("Resultado", "Nome abreviado para Janeiro: " + ls_str)

Caso queira, pode abrir este painel de configuração, executando o comando abaixo:

run("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4")

Espero ter ajudado.