Página 1 de 1

Traduzir CAPTION dos objetos

Enviado: 28 Mar 2009 20:52
por Luciano Bonfim
Caros,

vou colocar meu sistema para ser multi-idiomas, ou seja, vou ter que traduzir todas as palavras e expressöes do meu sistema. Primeiro pensei em criar um funcäo chamada translate que receberia como parametro a palavra em português iria até uma tabela traduziria e retornaria a palavra traduzida, achei uma ótima soluçäo mas para fazer iss teria que entrar em todos os meus fontes e alterar onde tiver alguma coisa escrita colocar essa funçäo antes,

Por exemplo: @ SAY "Codigo" para @ SAY translate("Codigo")

vai dar muito trabalho, ai pensei em colocar uma funcäo no ON INIT dos meus forms que iria varrer todos os objetos SAY, BUTTON, etc... e pegar seus CAPTIONs traduzir e modificá-los automaticamente.

Achei uma boa idéia, mas näo sei como varrer todos os objetos de um FORM

Como fazer isso?

Muito Obrigado

Re: Traduzir CAPTION dos objetos

Enviado: 29 Mar 2009 17:05
por sygecom
Olá Luciano,
Não seria melhor você colocar essa sua função direto na 'guilib.ch', a final tudo vai passar por ali, quando for passar você traduz e retorna já linguagem que você quer. Ficaria mais ou menos assim:

Código: Selecionar todos

#xcommand @ <x>,<y> SAY [ <oSay> CAPTION ] <caption> ;
             [ OF <oWnd> ]              ;
             [ ID <nId> ]               ;
             [ SIZE <width>, <height> ] ;
             [ COLOR <color> ]          ;
             [ BACKCOLOR <bcolor> ]     ;
             [<lTransp: TRANSPARENT>]   ;
             [ ON INIT <bInit> ]        ;
             [ ON SIZE <bSize> ]        ;
             [ ON PAINT <bDraw> ]       ;
             [ ON CLICK <bClick> ]      ;
             [ ON DBLCLICK <bDblClick> ];
             [[ON OTHER MESSAGES <bOther>][ON OTHERMESSAGES <bOther>]] ;
             [ STYLE <nStyle> ]         ;
             [ FONT <oFont> ]           ;
             [ TOOLTIP <ctoolt> ]       ;
          => ;
          [<oSay> := ] HStatic():New( <oWnd>,<nId>,<nStyle>,<x>,<y>,<width>, ;
             <height>,translate(<caption>),<oFont>,<bInit>,<bSize>,<bDraw>,<ctoolt>, ;  // aqui sua função
             <color>,<bcolor>,<.lTransp.>,<bClick>,<bDblClick>,<bOther> );;
          [ <oSay>:name := <(oSay)> ]
E faria claro em todas as outras como ButtonEx, Radio,ChwckBox e etc...
Unico problema que quando houver alterações na CVS dessa GUILIB.CH, você vai ter que alterar no seu também.

Re: Traduzir CAPTION dos objetos

Enviado: 29 Mar 2009 19:45
por Luciano Bonfim
boa idéia essa sua, o único problema é este lance da atualizaçäo mesmo.. vou pensar nisso...

Muito Obrigado

Re: Traduzir CAPTION dos objetos

Enviado: 29 Mar 2009 22:06
por esbasso
Veja se isso te serve

FUNCTION TranslateCaption( oDlg )
Local nlen , i
nlen := LEN(oDlg:aControls)
FOR i = 1 to nLen
IF __ObjHasMsg(oDlg:aControls[ i ],"CAPTION")
oDlg:aControls[ i ]:caption := xTranslate( oDlg:aControls[ i ]:caption )
ENDIF
IF LEN(oDlg:aControls[ i ]:aControls) > 0
TranslateCaption(oDlg:aControls[ i ])
ENDIF
NEXT
RETURN .T.

exemplo

INIT WINDOW oWin MDICHILD TITLE "Database" ;
AT 183,138 SIZE 575,368 ;
FONT HFont():Add( 'Verdana',0,-13,400,,,) ;
STYLE WS_CHILD+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_SIZEBOX;
ON INIT {|oDlg| TranslateCaption( oDlg ) }

FUNCTION xTranslate(caption)
IF caption != Nil
return upper( caption )
endif
return caption

Re: Traduzir CAPTION dos objetos

Enviado: 30 Mar 2009 10:01
por Luciano Bonfim
Obrigado Basso, mas deu erro no GET COMBOBOX

Error BASE/1082 Erro nos parƒmetros: -
Called from hcombo.prg->HCOMBOBOX:SETITEM(361)
Called from hcombo.prg->HCOMBOBOX:SETVALUE(382)
Called from hcwindow.prg->HCOMBOBOX:SETTEXTCLASS(297)
Called from hcwindow.prg->(b)HCUSTOMWINDOW:HCUSTOMWINDOW(51)
Called from ->HCOMBOBOX:_CAPTION(0)
Called from obras.prg->TRANSLATECAPTION(663)
Called from obras.prg->(b)FORMOBRAS(111)
Called from hdialog.prg->INITMODALDLG(296)
Called from hdialog.prg->(b)(_INITSTATICS00003)(0)
Called from hdialog.prg->HDIALOG:ONEVENT(218)
Called from ->HWG_DLGBOXINDIRECT(0)
Called from hdialog.prg->HDIALOG:ACTIVATE(173)
Called from obras.prg->FORMOBRAS(207)
Called from obras.prg->(b)OBRAS(39)
Called from hdialog.prg->DLGCOMMAND(450)
Called from hdialog.prg->(b)(_INITSTATICS00003)(0)
Called from hdialog.prg->HDIALOG:ONEVENT(218)
Called from ->HWG_DLGBOXINDIRECT(0)
Called from hdialog.prg->HDIALOG:ACTIVATE(173)
Called from obras.prg->OBRAS(47)
Called from generica.prg->EXECUTAHWGUI(293)
Called from toolbar.prg->NMENUCHECKER(76)
Called from toolbar.prg->NAFTERINKEY(51)
Called from principal.prg->(b)GERAMENU(533)
Called from ->INKEY(0)
Called from principal.prg->MAIN(137)

Re: Traduzir CAPTION dos objetos

Enviado: 30 Mar 2009 10:35
por esbasso
deixei o erro de proposito

sem erro

FUNCTION TranslateCaption( oDlg )
Local nlen , i
nlen := LEN(oDlg:aControls)
FOR i = 1 to nLen
IF __ObjHasMsg(oDlg:aControls[ i ],"CAPTION")
IF oDlg:aControls[ i ]:caption != Nil
oDlg:aControls[ i ]:caption := xTranslate( oDlg:aControls[ i ]:caption )
ENDIF
ENDIF
IF LEN(oDlg:aControls[ i ]:aControls) > 0
TranslateCaption(oDlg:aControls[ i ])
ENDIF
NEXT
RETURN .T.

FUNCTION xTranslate(caption)
return upper( caption )

Re: Traduzir CAPTION dos objetos

Enviado: 30 Mar 2009 17:46
por Luciano Bonfim
funcionou que é uma beleza, agora basta só traduzir 7894 palavras e frases rsrsrsrsrs

uma curiosidade: pq a funçäo UPPER näo coloca as vogais acentuadas em maiúsculo?

Re: Traduzir CAPTION dos objetos

Enviado: 30 Mar 2009 19:06
por Luciano Bonfim
car basso,

juro que tentei de tudo aqui pra nao te perturbar mais, mas essa funcao ta alterando os caption dos GETS e dos GETS eu nao queria, qual a propriedade que uso pra testar se o objeto é GET ou nao... tentei type, name, entre outras da hdialog.prg mas nao obtive exito

Muito Obrigado

Re: Traduzir CAPTION dos objetos

Enviado: 30 Mar 2009 19:52
por esbasso
testa a classe

IF __ObjHasMsg(oDlg:aControls[ i ],"CAPTION") .AND. oDlg:aControls[ i ]:classname $ "HSTATICHBUTTONHCHECKBUTTONRADIOBUTTON" // ETC