1.00: 03/01/2002: Primer producto AsfLocalize.
1.01: 03/06/2002: Resuelto un problema en Win NT "Access Violation in Ntdll.dll".
1.02: 03/18/2002:
Se removieron variables no usadas en 1.01; Se agregó Notification para resolver
un access violation al hacer destroy con la referencia al server; El Destroy
del componente producía un access violation ahora resuelto.
1.03: 05/18/2002: Se creó AsfComponents donde se ha incluido AsfLocalize.
El objetivo de estos componentes es permitir de forma sencilla la internacionalización, globalización o localización de aplicaciones realizadas con Delphi.
Permite la traducción de los “Caption”, Textos, etc. según un lenguaje elegido y que puede producir el desarrollador como el usuario final.
Incluye un editor de lenguajes y permite el cambio de lenguaje en runtime (on fly).
Se basa en los string y no en los componentes individuales por lo que requiere muy poco trabajo para definir nuevos valores para cada lenguaje a usar.
Trabaja con Forms, QuickReport y FastReport.
Traduce mensajes, listas, columnas en grillas, reportes, etc..
Los recursos propios de Delphi no son traducidos, pero para ello Delphi cuenta con las herramientas necesarias.
2. TAsfTimer.
AsfTimer es un thread timer de múltiples propósitos.
3. TAsfKeyPad.
AsfKeyPad permite crear un teclado visible con diferentes Layouts (Teléfono, Calculadora Normal, Calculadora Administrativa, PC KeyBoard). AsfKeyPad genera un evento cuando una tecla es presionada, devolviendo los datos necesarios como para identificar la misma.
4. TAsfDigit.
AsfDigit es un componente visual que muestra un dígito de leds.
5. TAsfDigitPanel.
AsfDigitPanel es un componente visual que muestra un panel de dígitos (TAsfDigit) con características especiales que permiten enviarle datos directos a mostrar.
6. TAsfTapeDisplay.
AsfTapeDisplay representa una pequeña impresora de tira de papel (del tipo utilizado en calculadoras administrativas).
7. TAsfCalcUnit.
AsfCalcUnit es un componente no visual que se ocupa de resolver operaciones de acuerdo al modo elegido. Fue pensado principalmente para resolver operaciones matemáticas a partir de la entrada de caracteres sueltos. Posee salidas para diferentes tipos de componentes.
8. TAsfCalculator.
AsfCalculator es un componente no visual que al llamar al método Execute, levanta una calculadora que puede ser administrativa o normal (de acuerdo a una propiedad). Este componente devuelve el valor final que se muestra en el display.
Probado con:
Delphi 6 Enterprise Update 2.
Este sistema está basado en dos componentes no visuales AsfLocalizeServer y AsfLocalizeClient.
Un único Server bastará para toda una aplicación que trabaje íntegra bajo un mismo lenguaje, sin embargo, es posible utilizar varios de ellos si se pretendiera trabajar con diferentes lenguajes según la parte de la aplicación.
Lo primero que hay que hacer es pegar un Server en un Form o DataModule de la aplicación (preferentemente el main).
Luego, se pegará un Client en cada Form, DataModule, etc que se utilice en la aplicación. No importa si el Form, por ejemplo, se crea en forma automática o mediante código.
A cada Client se le define la propiedad LocalizeServer apuntando al Server antes colocado. Cuando un Client está en una unidad diferente que el Server, habrá que colocar la unidad principal en uses.
Cuando todo está listo y si el Server tiene la propiedad Active en True y Language en “Default”, entonces al llamar al método SetGetAllProperties en un Client se tomarán todos los string visuales de los componentes en el Form, por ejemplo, donde se encuentre pegado Client. Estos string se escribirán en sendos archivos de diccionario del estilo ini pero con la extensión lng. Para cada tipo de string se utiliza una sección diferente del archivo (Caption, Text, Hint, etc). Inicialmente el sistema creará un Diccionario “Default”, pero con la ayuda del editor incluido, Usted podrá crear los diccionarios que desee. Cuando se agregue un nuevo componente en el Form se creará la entrada para sus string en forma automática en todos los diccionarios registrados.
Los lenguajes existentes se registran en Windows Registry y el editor incluido permite hacerlo. Además hay un método para ello.
El paso siguiente es que Usted defina que desea que aparezca como string para cada elemento visual (según el que antes tenía, no dependiendo del componente sino del string). Para ello utilice el editor de lenguajes incluido.
Importante:
Cuando se elige un lenguaje en el editor incluido y/o una carpeta de lenguajes se deja una marca en la Registry que luego el sistema utiliza para arrancar las aplicaciones con esos parámetros. Si Usted hace una aplicación que permite al usuario cambiar el lenguaje en forma dinámica, el último utilizado será el lenguaje de arranque.
Recuerde que estos datos, como así también los registros de lenguajes existentes serán válidos para todas las aplicaciones que corran en esa PC y utilicen los componentes ASFLocalize.
Propiedades
|
Descripción
|
Active: Boolean |
Define si el Servidor de localización grabará y/o leerá datos en o de los diccionarios. Si Active = false aunque llame a métodos de traducción no tendrán efecto. |
DicPath: String |
Camino (Path) a la carpeta donde se encuentran los diccionarios de lenguajes. Sin la \ (slash) en el final. El Path utilizado queda grabado en la Registry por lo que no necesita cargarse cada vez. Puede cambiarse con el Editor Incluido. |
Language: String |
Aquí se elige entre los lenguajes registrados. Cuando se llame a un método de traducción se utilizará el lenguaje aquí seleccionado. En la medida que Usted agregue más diccionarios al sistema, los correspondientes lenguajes estarán disponibles para ser elegidos. Recuerde que para cargar automáticamente los datos iniciales en los diccionarios Language deberá estar en “Default” y Active en true. Cuando se cambia el lenguaje, automáticamente se reflejarán los cambios en la aplicación. |
Languages: TStringList
|
Propiedad no publicada (pero pública) que representa una lista de los lenguajes registrados. |
|
|
Procedimientos
|
|
PutListProperty(List,
ViewList: TStringList)
|
Es solo para uso interno. |
RegisterClient(AClient: TComponent)
|
Es sólo para uso interno. |
UnRegisterClient(AClient: TComponent)
|
Es sólo para uso interno. |
CreateLanguageMenu(Item:
TMenuItem; Default, BitMaps: Boolean)
|
En Item se pasa un TmenuItem que Usted creó, habitualmente dentro del menú principal, por ejemplo, “Idiomas”. Este procedimiento creará un sub menú con los lenguajes disponibles para permitir que el Usuario Final elija el que prefiera. Si Default es true, implica que en el menú se podrá seleccionar Default como idioma. Si BitMaps es true se verán los BitMaps en el menú, de lo contrario no serán visibles. |
SetNewLanguage(Lang:
String; Image: TBitMap)
|
Genera un nuevo conjunto de archivos de lenguaje *.lng y *.bmp. Lang será el nombre del lenguaje (automáticamente convierte a mayúscula la primera letra y a minúscula el resto). Image debe ser un bmp que se utilizará para crear por ejemplo banderas en el menú automático de lenguajes. Los nombre de archivos creados son generados por un método especial para evitar problemas con el sistema operativo y ayudar a impedir que el usuario final edite los mismos. El nuevo lenguaje se incorpora a la Registry. |
RegisterLanguages
|
Registra en la Registry todos los lenguajes que encuentra en la carpeta indicada en DicPath. |
DeleteLanguage(Lang:
String)
|
Borra por completo un lenguaje dado, tanto los archivos como la entrada en la Registry. |
SetItem(Section,
Item, Value: String)
|
Coloca el valor
para la Sección e ítem elegidos para el lenguaje actual. |
SetImage(Image:
TBitMap)
|
Coloca la imagen
para el lenguaje actual Image. Esta imagen se utiliza en los menú de idiomas. |
AddToDictionaries(Section,
Item, Value: ShortString)
|
Agrega la sección, ítem y valor a todos los lenguajes. Si se define un ítem existente no se le cambiará el valor con este procedimiento. Use para ello SetItem(). Si la sección o el ítem ya existen no se agregan nuevamente. Por defecto, un nuevo ítem tomará el valor igual al ítem. |
DeleteDictionaryItem(Section,
Item: String)
|
Borra un determinado ítem de la sección indicada para todos los lenguajes. |
DeleteDictionarySection(Section:
String)
|
Borra una determinada sección de todos los lenguajes. |
SetGetAllProperties(Sender:
Tobject; Lang: String; Write: Boolean; NoLocalize: TStrings)
|
Este procedimiento en realidad no debe utilizarse directamente. Es llamado internamente por el Client. |
|
|
Funciones
|
|
Msg(Message: String;
Values: Array of String): String
|
Esta función devuelve un string que se forma con Message y donde Message tiene variables serán reemplazadas por Values. Ej. Mensaje := Msg(‘Today is “%1” at “%2”
hours’, [DateToStr(Date), TimeToStr(Time)]); Si Language fue preparado así: Ahora son las “%2” del “%1”, entonces la función devolverá el mensaje final con los parámetros invertidos. |
GetLanguageFileName(Language:
String): String |
Esta función devuelve el nombre y Path del archivo del lenguaje indicado. |
GetString(Section,
Item: String): String
|
Devuelve el string que representa el valor de una propiedad para la sección e ítem indicados. Esto ocurre para el lenguaje actual. |
GetClients: TStringList
|
Devuelve los Clients conectados a este Server. |
GetSections(List:
TStrings): Boolean
|
Trae en List todos los nombres de las secciones que forman un diccionario de lenguajes (Captions, Text, etc.). Devuelve true si pudo leer la lista y false si falló. |
GetActualImage(Image:
TBitMap): Boolean
|
Trae en Image la imagen bmp para el lenguaje actual. Si encuentra la imagen adecuada devuelve true. Si no hay una imagen definida o no la encuentra traerá una imagen vacía y devuelve false. |
GetItem(Section,
Item: String): String
|
Devuelve el valor (string) correspondiente a la Section e Item enviados. Si no es encontrado el valor devuelve un string vacío. |
GetItems(Section:
String; List: TStrings): Boolean
|
Trae en List todos los ítem para una sección dada. Devuelve True si lo logró o False si falló. |
|
|
Eventos
|
|
OnLanguageChange:
TNotifyEvent
|
Ocurre cuando se cambia de lenguaje durante la ejecución de la aplicación. |
OnLanguageMenuClick:
TNotifyEvent
|
Ocurre cuando el Usuario Final hace click en una opción del sub menú de idiomas. Para ello, debe haberse llamado a CreateLanguageMenu() con anterioridad, habitualmente en el comienzo de OnFormShow. Si hace TmenuItem(Sender).Caption dentro de este evento obtendrá el lenguaje elegido por el Usuario. |
Propiedad
|
Descripción
|
LocalizeServer |
Elija aquí el Server al cual conectará el Client. |
NoLocalize |
Aquí se define una lista de componentes (nombres) en este Form cuyos string no deben ser traducidos (Excepciones). |
|
|
Procedimientos
|
|
SetGetAllProperties
|
Escribe todos los string en los diccionarios si Server.Active es True y Server.Language es Default. Lee y carga los string desde el Lenguaje seleccionado a los componentes (Traduce). Este procedimiento habitualmente se coloca en OnShow para Forms, BeforePrint en el caso de QuickReport. No se suele usar en DataModules. Un DataModule no muestra nada pero puede utilizar la función msg para traducir mensajes. Si se cambia el lenguaje utilizado “on fly” entonces no hará falta llamar a este método para los Forms ya creados. Al cambiar el lenguaje, automáticamente se produce un barrido de todos los Clients y se llama a este procedimiento en forma automática. |
PutListProperty(List,
ViewList: TStringList)
|
Este procedimiento permite traducir listas como en el caso de los memos de FastReport. Por ejemplo, en el caso de FastReport se puede utilizar en OnBeforePrint donde List = Memo y ViewList = View.Memo. |
|
|
Funciones
|
|
Msg(Message: String;
Values: Array of String): String
|
Esta función devuelve un string que se forma con Message y donde Message tiene variables serán reemplazadas por Values. Ej. Mensaje := Msg(‘Today is “%1” at “%2”
hours’, [DateToStr(Date), TimeToStr(Time)]); Si Language fue preparado así: Ahora son las “%2” del “%1”, entonces la función devolverá el mensaje final con los parámetros invertidos. |
GetString(Section,
Item: String): String
|
Dada una sección de los diccionarios (Caption, Text, etc) y un Ítem (Por ejemplo: Button1) devolverá la traducción para el lenguaje actual. |
Para instalar este paquete en Delphi 6, siga los siguientes pasos:
Descomprima el .zip del paquete en una
carpeta.
Abra Delphi.
Elija la opción del menú: Tools | Environment
Options | Library y agregue en Library Path el Path a la carpeta que ha creado
para Localize.
Haga File | Open y elija ASFLocalize.dpk.
Haga Click en Compile y luego en Install.
Aparecerán dos advertencias. Esto es porque el
paquete instala en forma implícita dos unidades. No se preocupe.
Ya puede comenzar a utilizar ASFLocalize.
Recuerde que hay cinco carpetas que se han
creado donde Usted instaló ASFLocalize que son de mucha ayuda. En Demo
encontrará un proyecto que permite ver como trabaja ASFLocalize y en Editor
encontrará un editor de lenguajes, que además de ayudar a entender como se
utilizan los métodos y propiedades funciona para editar. En Help podrá acceder
a toda la ayuda en inglés y español. En Languages encontrará que están los
archivos de lenguaje para la demo. En Images encontrará algunas banderas para
utilizar.
Cuando tiene todo instalado, comience por
llamar al editor y definir la carpeta de lenguajes a Languages para que luego
pueda funcionar la demo. Haga luego Languages | Refresh Languages, esto
registra los lenguajes encontrados. También puede seguir los tres pasos
indicados en la demo (esto es lo más fácil para comenzar).
Nota: Esperamos que nos comunique cualquier tipo de problema que encuentre en AsfLocalizer. También esperamos ansiosos sus propuestas para mejorar nuestros componentes.
Licencia
Lea con cuidado el
archivo Readme.txt que acompaña nuestro paquete.
Email: Shareware@asfcompu.com