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