Page 1 of 2

El nuevo strings API de FiveWin

Posted: Sun Aug 04, 2013 8:12 pm
by Antonio Linares
Estamos trabajando para remover completanmente la necesidad de usar la DLL del preview :-)

Asi que hemos implementado un API de strings de FiveWin, que tambien podeis usar en vuestras aplicaciones
para soportar multiples lenguajes!

Las funciones del strings API son:

1. FWSetLanguage( nNewLanguage ) // Establece el lenguaje a mostrar en tiempo de ejecuión

2. FWString( "my string" ) // busca la traducción de "my string" y la devuelve

3. FWMissingStrings() // genera el código fuente de los strings que faltan por traducir

Por defecto se usa el 1 (inglés). Si quereis usar Español entonces haceis: FWSetLanguage( 2 ). Necesitamos ayuda para Frnaces, Alemán, etc.

Re: El nuevo strings API de FiveWin

Posted: Sun Aug 04, 2013 8:14 pm
by Antonio Linares
Aqui teneis el código fuente por si quereis probarlo, o si quereis proponer mejoras, cambios, etc, gracias :-)

Code: Select all

// FWH strings multiple languages support

#include "FiveWin.ch"

static nLanguage := 1 // 1 English
                      // 2 Spanish
                      // 3 French ?
                      // 4 ??? 

static aStrings := { { "Attention", "Atención" },;
       { "PDF Plugin Error", "Error del plugin de PDF" },;
       { "PDF not saved to send Email", "No se ha guardado el PDF a enviar por email" },;
       { "MS Word not installed", "MS Word no está instalado" },;
       { "Failed to Create Word Document", "No se ha podido crear el documento de Word" },;
       { "There is no output for export", "No hay nada que exportar" },;
       { "No .Doc file manipulation software installed", "No hay instalado software para usar ficheros .Doc" },;
       { "not found, imposible to continue", "no se ha encontrado, no se puede continuar" },;
       { "Printing Error", , "Error de impresión" },;
       { "View", "¿ Visualizar" },;
       { "Excel not installed", "Excel no está instalado" },;
       { "Report width is greater than page width", "El ancho del reporte es mayor que el ancho de la página" },;
       { "Export to Excel is available only", "Solo está disponible exportar a Excel" },;
       { "for Reports with ::bInit defined", "para reportes con ::bInit definido" },;
       { "Printing Preview", "Previsualización de Impresión" },;
       { "&File", "&Fichero" },;
       { "&Print", "&Imprimir" },;
       { "Print actual page", "Imprimir la página actual" },;
       { "&Exit", "&Salir" },;
       { "Exit from preview", "Salir de la previsualización" },;
       { "Page", "Página" },;
       { "&First", "&Primera" },;
       { "Go to first page", "Ir a la primera página" },;
       { "&Previous", "&Anterior" },;
       { "Go to previous page", "Ir a la página anterior" },;
       { "&Next", "&Siguiente" },;
       { "Go to next page", "Ir a la siguiente página" },;
       { "&Last", "&Ultima" },;
       { "Go to last page", "Ir a la última página" },;
       { "&Zoom", "&Zoom" },;
       { "Page zoom", "zoom de página" },;
       { "&Normal", "&Normal" },;
       { "Page unzoom", "Página normal" },;
       { "&Factor", "&Factor" },;
       { "Zoom factor", "Factor de zoom" },;
       { "Factor", "Factor" },;
       { "&Two pages", "&Dos páginas" },;
       { "Preview on two pages", "Previsualización en dos páginas" },;
       { "One &page", "Una &página" },;
       { "Preview on one page", "Previsualización en una página" },;
       { "Page number:", "Número de página:" },;
       { "Go to first page", "Ir a la primera página" },;
       { "First", "Primera" },;
       { "&Page", "&Página" },;
       { "Preview on one page", "Previsualización en una página" },;
       { "Previous", "Anterior" },;
       { "Next", "Siguiente" },;
       { "Last", "Ultima" },;
       { "Zoom", "Aumentar" },;
       { "Two pages", "Dos páginas" },;
       { "Print", "Imprimir" },;
       { "Save to DOC/PDF", "Guardar como DOC/PDF" },;
       { "DOC Format", "Formato DOC" },;
       { "PDF Format", "Formato PDF" },;
       { "Export to PDF", "Exportar a PDF" },;
       { "Send by email as PDF", "Enviar por email como PDF" },;
       { "Export to MS Word", "Exportar a MS Word" },;  
       { "Export to Excel", "Exportar a Excel" },;
       { "Exit", "Salir" },;
       { "Preview", "Previsualización" } }

static aMissing := {}       

//----------------------------------------------------------------------------//

function FWString( cString )

   local nAt

   If ( nAt := AScan( aStrings, { | aString | aString[ 1 ] == cString } ) ) != 0
      return aStrings[ nAt ][ nLanguage ] 
   else
      MsgInfo( 'The string: "' + cString + '"' + CRLF + ;
               "defined from: " + ProcName( 1 ) + " line " + ;
               AllTrim( Str( ProcLine( 1 ) ) ) + " in " + ProcFile( 1 ) + CRLF + ;
               "is not defined in FWH strings" + CRLF + ;
               "Please add it to FWH\source\function\strings.prg" )
      AAdd( aMissing, cString )          
   endif

return cString

//----------------------------------------------------------------------------//

function FWSetLanguage( nNewLanguage )

   local nOldLanguage := nLanguage

   nLanguage = nNewLanguage

return nOldLanguage 

//----------------------------------------------------------------------------//

function FWMissingStrings()

   local cResult := ""
   
   AEval( aMissing, { | cString | cResult += Space( 7 ) + '{ "' + cString + ;
                                  '", "" },;' + CRLF } )
   if ! Empty( cResult )
      MemoEdit( cResult, "Copy and paste in FWH\source\function\strings.prg" )
   endif
   
return cResult

//----------------------------------------------------------------------------//   

Re: El nuevo strings API de FiveWin

Posted: Mon Aug 05, 2013 7:13 am
by Carles
Hola,

Como alternativa me parece buena, pero este sistema hara crecer las aplicaciones proporcionalmente en funcion del numero de lenguajes q tenga. Para mi es mejor las dll, que ademas si cambias algo en el diseño o texto envias solo la dll y listos, no hace falta enviar todo el exe.

A nivel strings los grandes productos de software acostumbran a tener todos los textos en tablas del propio sistema, descargando tambien al propio exe, y permitiendo modificar facilmente sin tener que tocar la aplicacion.

En todo caso es una buena solucion para segun que tipo de aplicaciones.

Re: El nuevo strings API de FiveWin

Posted: Mon Aug 05, 2013 8:11 am
by elvira
Antonio,

A mi la solución me parece fantástica, porque te olvidas de tener que redistribuir y actualizar un .dll. De esta forma, nuestras aplicaciones ya SÓLO NECESITAN UN ÚNICO .EXE. Esto es estupendo y ¿qué otros lenguajes lo pueden ofrecer?. Cada vez que algún programa necesita las librerías .NET o el Visual Basic runtime, la instalación dura una eternidad.


Carles,

No creo para nada que aumente de forma significativa el tamaño del .exe. Y para actualizaciones, ¿no es mejor siempre enviar un único fichero, el .exe, que varios incluyendo .dlls?. El .exe lo vas a tener que enviar sí o si siempre si has añadido nuevas funciones. Ahora con esta funcionalidad de Fivewin te olvidas de los problemas del preview.

Antonio, Enhorabuena :D :D :D :D

Re: El nuevo strings API de FiveWin

Posted: Mon Aug 05, 2013 9:55 am
by Antonio Linares
Como idea adicional comentar que este sistema permite añadir vuestras propias cadenas, es decir, podeis hacer vuestra aplicación multilenguaje simplemente haciendo:

FWAddString( { "Hello", "Hola", ... } )

y desde vuestro código:

FWString( "Hello" )

y ya está :-)

Re: El nuevo strings API de FiveWin

Posted: Mon Aug 05, 2013 12:35 pm
by D.Fernandez
Excelente Maestro.

Saludos

Ruben Dario Fernandez

Re: El nuevo strings API de FiveWin

Posted: Thu Feb 12, 2015 6:24 pm
by karinha
Master, FWSetLanguage( nNewLanguage ) // Establece el lenguaje a mostrar en tiempo de ejecuión

En português ya está funcionando? Cual és el número?

Code: Select all

Unresolved external '_HB_FUN_FWSETLANGUAGE' referenced from
 
Que me falta?

Gracias, saludos.

Re: El nuevo strings API de FiveWin

Posted: Fri Feb 13, 2015 11:33 am
by Antonio Linares
João,

Si, esta funcionando. Portugues es el numero 4 :-)

Que versión de FWH estás usando ?

Re: El nuevo strings API de FiveWin

Posted: Fri Feb 13, 2015 11:42 am
by karinha
Master, FWH1306 for xHarbour.

Saludos.

Re: El nuevo strings API de FiveWin

Posted: Fri Feb 13, 2015 12:10 pm
by Antonio Linares
João,

Se implementó en FWH 13.07

Re: El nuevo strings API de FiveWin

Posted: Fri Feb 13, 2015 12:13 pm
by karinha
Ok. thanks master.

Que lástima. jejejejejeje.

Saludos.

Re: El nuevo strings API de FiveWin

Posted: Fri Feb 13, 2015 12:41 pm
by Antonio Linares
João,

Cuando termine de solucionar lo que le falta a Fivedit con tu ayuda, tendrás un FWH 15.01 de regalo ;-)

Re: El nuevo strings API de FiveWin

Posted: Fri Feb 13, 2015 12:46 pm
by karinha
Antonio Linares wrote:João,

Cuando termine de solucionar lo que le falta a Fivedit con tu ayuda, tendrás un FWH 15.01 de regalo ;-)

Maestro, qué noticia maravillosa.

No tengo palabras para expresar mi alegría.

I Love FiveWin. Y yo estoy disponible para hacer fivedit.exe ser perfecto.

Mil gracias, saludos.

:D :D :D :D :D :P :P :P :P :P

Re: El nuevo strings API de FiveWin

Posted: Sat Feb 14, 2015 9:19 am
by xmanuel
Hola Antonio.
Por poner un "pero" yo diría que los mensajes por pantalla se deberían eliminar.
Estas son funciones de proceso por lo que el acoplamiento con con la vista nunca es buena.
Por ejemplo esta:

Code: Select all

    //----------------------------------------------------------------------------//

    function FWMissingStrings()

       local cResult := ""
       
       AEval( aMissing, { | cString | cResult += Space( 7 ) + '{ "' + cString + ;
                                      '", "" },;' + CRLF } )
       if ! Empty( cResult )
          MemoEdit( cResult, "Copy and paste in FWH\source\function\strings.prg" )
       endif
       
    return cResult

    //----------------------------------------------------------------------------//   

 
debería ser:

Code: Select all

    //----------------------------------------------------------------------------//

    function FWMissingStrings()

       local cResult := ""
       
       AEval( aMissing, { | cString | cResult += Space( 7 ) + '{ "' + cString + ;
                                      '", "" },;' + CRLF } )
       
    return cResult

    //----------------------------------------------------------------------------//   

 
y desde el programa donde se use:

Code: Select all

cMiString := FWMissingStrings()
if empty( cMiString )
   MsgInfo(  "Copy and paste in FWH\source\function\strings.prg" )
// Si estoy en un país hispano parlante:
   MsgInfo(  "Copia y pega en FWH\source\function\strings.prg" )
endif
 
En estos años en los que he estudiado java y PHP todos los "profes" me han inculcado evitar al máximo el "acoplamiento".
O sea poner en práctica el patrón de arquitectura Modelo Vista Controlador (MVC) :oops:

Re: El nuevo strings API de FiveWin

Posted: Sat Feb 14, 2015 10:15 am
by Antonio Linares
Manu,

Si lo que se trata es de no mostrar mensajes al usuario, en mi opinión, un MsgInfo() ó un MemoEdit() son basicamente lo mismo.

Pero gracias a tu mensaje he descubierto una pendiente :-)
http://forums.fivetechsupport.com/viewt ... 94#p172494

Gracias!

p.d. No hay mejor "profe" que uno mismo ;-)