Rss Feed
Tweeter button
Technorati button
Reddit button
Linkedin button
Webonews button
Delicious button
Stumbleupon button
Newsvine button
Imprimir Post Imprimir Post

Aplicación multiidioma con GNU Gettext

Viernes, 5 de Marzo de 2010

He probado algunos sistema de traducción para programas Delphi, entre ellos multiidioma2he de destacar los componentes de TsiLang Component Suite , que me parecen muy buenos y completos.

Estos días necesitaba un paquete gratuíto y revisando páginas y foros he llegado a GNU Gettext for Delphi and C++ Builder. Me parece un paquete muy sencillo de utilizar y por lo que he probado hasta ahora, cómodo y eficaz.

En esta entrada voy a explicar desde cero los pasos que he seguido para conseguir una aplicación multiidioma.

PREPARATIVOS

(1) GNU Gettext

Descargar desde la página “GNU Gettext for Delphi and C++ Builder” el programa de instalación. También se puede encontrar la última versión en SourceForge.

Una vez descargado el ficchero e instalado tendremos lo necesario para generar nuestros ficheros de traducción e integrarlos en el programa.

NOTA: Hay una versión especial compatible con Delphi 2009 que podemos descargar desde aquí, si estamos utilizando esta versión de Delphi..

Si se ha instalado correctamente, nos pedirá reiniciar el sistema.
Una vez instalado, si desde el explorador de Windows pulsamos Click derecho con el ratón sobre una carpeta, nos debería aparecer una nueva opción “Extract Translations to Template“.
generar_traducciones

(2) Poedit for Windows

Necesitaremos una herramienta para poder traducir (ya seamos nosotros o una tercera persona) los ficheros de traducción a los diferentes idiomas. Esto está pensado para que esa posible tercera persona (que puede no tener Dephi instalado)  pueda traducir un fichero sólo con esta herramienta (y el fichero .po como veremos después).

Descargamos el programa desde la página (http://www.poedit.net/) y lo nstalaremos.

Una vez realizados estos dos pasos previos, crearemos un pequeño proyecto de ejemplo donde realizar las pruebas.

Para ello, desde Delphi comenzamos una nueva aplicación y en el formulario generaremos algo similar a esto:

formulario_de_ejemplo1

TRADUCCIÓN

(a) Preparar el  proyecto.

Una vez tenemos nuestra aplicación funcionando debemos preparnos para comentar lo necesario para traducción.
(1) Lo primero es añadir la unit gnugettext.pas a nuestro proyecto. Las units que usesn traducciones deberán tenerla en el uses.

NOTA: Si habéis realizado la instalación estandard debería estar en:
“c:\Archivos de programa\dxgettext\gnugettext.pas”

(2) Añadir al OnCreate de nuestros formularios el siguiente código:

1
2
// Traducir el formulario
TranslateComponent(Self);

(3) Preparar la estructura de directorios para organizar las traducciones. Dentro del directorio de la aplicación crearemos una carpeta llamada locale y dentro de ella un árbol de directorios similar al que se ve en la imagen.

directorios1

En este ejemplos, yo voy a utilizar 4 idiomas (es, en, fr, ca); Contando que el original va a ser el Español(es) debemos crear la estructura para los otros 3 (inglés, francés y catalán). Nos quedará un arbol de directorios como este:

directorios2

(b) Generar fichero de traducciones (.po)

(1) Para generar el fichero de traducciones del proyecto se debe extraer todas las cadena “traducibles” y almacenarlas en un fichero; Para ello basta con que, desde el explorador de Windows, pulsemos Click derecho sobre la carpeta del proyecto y seleccionemos la opción “Extract Translations to template”.
Esto generará un fichero default.po en el directorio de la aplicación.

generar_traducciones

(2) Copiaremos este fichero dentro de los directorios LC_MESSAGES; Tantas copias como directorios tengamos. Después de eso tendremos varios ficheros .po; Uno en el directorio de la aplicación y uno dentro de cada carpeta de traducción:

appdir/appTest.exe
appdir/default.po
appdir/locale/en/LC_MESSAGES/default.po (Traducciones al inglés)
appdir/locale/fr/LC_MESSAGES/default.po (Traducciones al francés)
appdir/locale/ca/LC_MESSAGES/default.po (Traducciones al catalán)

(c) Traducir los ficheros.

En este punto ya se pueden abrir cada uno de los ficheros .po y traducirlo utilizando poedit. Una vez abierto el fichero con poedit, veremos una pantalla como esta:

traducir_poedit
Una vez finalizada la traducción de palabras y cerrado el programa veremos que en cada directorio aparecen 2 ficheros; El  default.po (original) y el de traducción llamado default.mo.
Repetimos esto con todos los ficheros de traducción.

(d) Cómo utilizar las traducciones en nuestro programa

Una vez los ficheros de traducción estén generados, para utilizarlos desde la aplicación añadirenmos el siguiente código a los botones de activación de los idiomas.

botones_idiomas

1
2
3
4
5
6
7
8
// para el catalán
UseLanguage('ca');
RetranslateComponent(Self);
 
// para el inglés
UseLanguage('en');
RetranslateComponent(Self);
...

Si ejecutamos la aplicación veremos que al pulsar los botones cambia es aspecto del formulario.

Para finalizar, aun nos queda un detalle, que es, que la cadena que aparece al pulsar el botón “Hola Mundo!”  no aparece traducida.

Para ello utilizaremos la función de traducción  _().
La llamada que actualmente está así:

1
MessageDlg('Hola', mtInformation, [mbOK], 0);

Pasará a colocarse así:

1
MessageDlg(_('Hola'), mtInformation, [mbOK], 0);

PASOS FINALES

Con eso nuestro programa debería quedar traducido completamente. Si movemos el EXE y la carpeta locale a cualquier otro sitio veremos que el programa funciona correctamente. Si sólo movemos el EXE, el efecto es que no aparace nada traducido.

Queda un último detalle, que es integrar las traducciones en el EXE, para que todo quede en el ejecutable y no debamos preocuparnos del directorio locale.

integrar_traducciones

Basta con pulsar click derecho sobre el EXE de nuestra aplicación desde el explorador de Windows, Seleccionar la opción “Embeb Translations” y seleccionar los ficheros de traducción que queremos integrar.

integrar_traducciones2

Con esto debería ser todo.

Espero que haya sido útil.

Espero comentarios, sugerencias, errores,… y demás.

Neftalí Delphi, Multiidioma , , ,

Imprimir Post Imprimir Post

CÓMO MONTAR UN NEGOCIO Y GANAR PASTA DESDE CERO

Martes, 2 de Marzo de 2010

Otros posibles títulos que he barajado para esta reflexión han sido:

  • “Cómo convertir lo gratuito en negocio y forrarte con ello”
  • “Cómo ganar una pasta con el trabajo de otros”
  • “Cómo ser un buitre profesional”
  • “¡A tomar pol culo!” (este era para desfogarme…)
  • “Así es como se hace negocio en España”

Antes de empezar, he de decir que no soy ningún fan de Google, tienen sus cosas buenas y sus cosas malas (como todos), pero hay que reconocerles que durante los últimos años han trabajado duro. Han innovado y han apostado por un modelo de negocio muy particular (diferente al de otras empresas) y por lo que se ve no les está iendo mal.cc

Desde el punto de vista del usuario “de a pie” Google ofrece una serie de servicios “gratuitos” entre ellos su buscador (al igual que otras empresas); Me centro en este, porque seguramente es el más utilizado. Y cuando hablo de gratuito me refiero a nivel estrictamente “monetario”. Si yo quiero buscar la página de “Coca-Cola”, la del “Museo del Prado” o la de “Delphi Prism” puedo hacerlo usando Google, Yahoo, Bing,… y me sale gratis(1).

(1) He aquí donde empieza todo. Google a día de hoy gana mucho dinero, esto lo sabe todo el mundo, y a los usuarios estos servicios no nos cuestan dinero (hablo del buscador, pero podemos generalizar esto con muchos otros servicios y con otras empresas similares).

A alguien se le ha ocurrido que esto no puede ser, unos no pagan y otros ganan mucho. Nooooooorrrr.

¡¡Estos son los buitres y ahí está el negocio!!

No puede ser que unos estén obteniendo cosas GRATIS y otros se estén FORRANDO, hay que conseguir sacar “tajada”.

Pasos a seguir a partir de este momento:

(ACTO-1)
________________________________________

Como resulta que Google ha montado un buen negocio y ganan mucha pasta, los buitres-chupópteros(2) están buscando la forma de conseguir dinero fácil beneficiándose, no de su trajabo, sino del que han realizado otros.

(2): Los buitres-chupópteros-carroñeros son esas compañías que aquí, dan un servicio pésimo, cobran mucho por sus ADSL, dan un nivel inferior al de otros países europeos y tienen unas compañías de móvil donde lo único que les preocupa es adquirir clientes de cualquier forma (publicidad engañosa, dudosos contratos por teléfono, horrorosos servicios de atención al cliente,…). Sí, esas, las compañías de teléfonía.

Estos “elementos” (según ha dicho el “presi” de Telefónica) lo que quieren hacer es cobrar a los buscadores por utilizar sus líneas ?¿?¿?¿:

Telefónica abre fuego contra los buscadores

Eso, eso, que los de Google vayan “currando” y nosotros a ver si, sin “pegar ni chapa” pillamos algo (¿no os recuerda al modelo de negocio de las SGAE?).

(ACTO-2)
________________________________________

Al ministro de Industria (un tal Sebastián), que debe salir del mismo sitio que la ministra de cultura (la “Sinde”), si esa que va dando coba a los de las SGAE, no se le ha ocurrido otra cosa que decir que es viable:

Sebastián afirma que es “una opción posible” que las operadoras cobren a Google

(ACTO-3)
________________________________________

¡Ya está! ¡Se abrió la veda!

Visto lo visto (y si el ministro “Sebas” lo dice), pues los demás “buitres” allá que han ido de cabeza (y los que se apuntarán…).

Vodafone se abona a la propuesta de cobrar a Google por usar la red

(ACTO-4)
________________________________________

El ministro “Sebas”, “erre que erre”, a lo suyo; Yo creo que como ha visto que su propuesta ha tenido éxito (sobre todo entre los “buitres”) pues se ha “envalentonao” e insiste:

El ministro Sebastián defiende cobrar una tasa a los buscadores

(ACTO-FINAL)
________________________________________

Por último, como no, en una reunión de “buitres” no podían faltar ellos. Los innombrables. Yo creo que ya pronto cobrarán por su modelo de negocio (que debería estar patentado aquí en España -con la venia y aprobación de la “Sinde”-):

  • El de cobrar por no hacer nada.
  • El de cobrar por todo.
  • El de “cobrar por si…”    Por si copias, por si bajas, por si compartes…
  • El de cobrar por ver, oír y escuchar.

Lo lógico es que Telefónica cobre de Google y nos pague a nosotros

¡Pues ya estamos todos!

.
.
.

¡¡Así es como se monta un negocio en España!!

No se dónde acabará todo eso; Yo creo que como Google “LOS VA A MANDAR A TOMAR POL CULO A TODOS” “les va a decir que no”, lo que más me temo de esto, es que lo mismo nos dicen (con “Sebas” y la “Sinde” a la cabeza):

-Bueno, pues vamos a cobrarles a los usuarios, que al final son los que usan Google, que es quien usa nuestras redes de telefonía, que nosotros “somos quienes lo hacemos todo”… (3)

(3) Palabras del director de telefónica (César Alierta)

“Las redes las ponemos nosotros, el peering lo hacemos nosotros, los sistemas los hacemos nosotros, el customer care lo hacemos nosotros, el servicio post-venta lo hacemos nosotros, el servicio de instalación lo hacemos nosotros… lo hacemos todo. Quiero decir, ellos tienen algoritmos y contenidos…”

Pobrecitos, mira que son malos esos “aprovechados” de Google…

¡¡Así es como se monta un negocio en España!!
AÑADIDO(02/03/2010): Os coloco el link del video con la conferencia. Los comentarios no tienen desperdicio.

Telefónica quiere cobrar a los buscadores


Neftalí Humor, Offtopic , , ,

Imprimir Post Imprimir Post

GlibWMI 1.8beta liberada (Sourceforge)

Miércoles, 24 de Febrero de 2010

Acabo de cerrar la versión 1.8b de la librería GLibWMI.

Nuevos componentes y algunas correciones a errores referentes a propiedades y “leaks” de memoria (los más importantes).

La librería está accesible completa en SourceForge (GLibWMI).

SourceForge

Podéis descargar los fuentes vía SVN desde:

http://glibwmi.svn.sourceforge.net/svnroot/glibwmi/

O también podéis descargar los ficheros desde aquí.

Neftalí Componentes, Código, Delphi, GLibWMI, WMI , , , , ,

Imprimir Post Imprimir Post

Guardar configuración de Base de Datos

Miércoles, 27 de Enero de 2010

Es una cosa que en multitud de ocasiones hemos necesitado hacer; Ya sea con la configuración del acceso a Base de Datos, con la configuración de propiedades, guardar estado del programa, posición,…

En este caso en concreto (a raiz de este hilo en Clubdelphi) se trata de guardar la configuración de Base de Datos. El contenido importante de la propiedad ConnectionString.

Podemos almacenada TODO el contenido de la propiedad en un sólo elemento o guardar los elemtos relevantes de la conexión (Servidor, usuario, Base de Datos y password); En mi caso he preferido el segundo.

Para ello lo más sencillo es utilizar la clase TIniFile que provee Delphi.

Para guardar los valores utilizamos WriteString:

// Grabar
ini.WriteString(CONFIG_SECTION, 'User', edtUser.Text);
ini.WriteString(CONFIG_SECTION, 'password', edtPassword.Text);
ini.WriteString(CONFIG_SECTION, 'Server', edtServer.Text);
ini.WriteString(CONFIG_SECTION, 'BaseDatos', cbBD.Text);

Y para recuperarlos el equivalente ReadString:

// Cargar datos
edtUSer.Text := ini.ReadString(CONFIG_SECTION, 'User', STR_EMPTY);
edtPassword.Text := ini.ReadString(CONFIG_SECTION, 'password', STR_EMPTY);
edtServer.Text := ini.ReadString(CONFIG_SECTION, 'Server', STR_EMPTY);
cbBD.Text := ini.ReadString(CONFIG_SECTION, 'BaseDatos', STR_EMPTY);

Una vez tenemos los datos podemos montar la conexión y activarla.

const
STR_CONN = 'Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;' +
'User ID=%s;Initial Catalog=%s;Data Source=%s';
 
...
 
// Intentar conectar
ADOConnection1.ConnectionObject.ConnectionString :=
Format(STR_CONN, [edtPassword.Text, edtUser.Text, cbBD.Text, edtServer.Text]);

En este ejemplo además se utiliza otra conexión con casi los mismos parámetros introducidos, pero accediendo a la tabla master, para preguntar al servidor SQL por las Bases de Datos disponibles y así mostrarlas al usuario:

SELECT * FROM SysDataBases

Adjunto el ejemplo coon el código.

<DESCARGAR EJEMPLO>

En este caso, la conexión es con SQL Server mediante OLEDB. En general, para esta y otras conexiones os recomiendo una web creada específicamente al respecto:

ConnectionString.com

Neftalí Bases de Datos, Ejemplos, Trucos , , , , ,

Imprimir Post Imprimir Post

Resultados de la encuesta sobre SGBD’s

Lunes, 25 de Enero de 2010

Hoy se ha cerrado la encuesta que había en el Blog referente al SGBD que la gente usa en sus programas.

Me ha servido un poco, para probar el plugin de encuestas, pero también (aunque los votantes no han sido muchos en esta “prueba piloto”) me ha sorprendido un poco el resultado.

Sinceramente no pensé que SQL Server apareciera tan arriba. Personalmente trabajo con ella y me gusta mucho, pero la gente suele ser reacia en los foros a utilizarla (o eso me parecía a mi desprender de los comentarios que leía).

También creo que es una solución más a nivel profesional, mientras que me da la impresión que Firebird, puede ser más una elección personal. Eso explicaría que la gente la use, aunque no les acabe de gustar (por obligación) ;-D

Un saludo.

Neftalí Bases de Datos, Encuesta , ,

Imprimir Post Imprimir Post

GlibWMI 1.6beta liberada (Sourceforge)

Viernes, 22 de Enero de 2010

Acabo de cerrar la versión 1.6 beta.

He subido la versión completa a Sourceforge.  A partir de ahora estará disponible allí completa (fuentes incluídos) con licencia GNU.

En esta última versión se han añadido nuevos componentes, nuevos métodos y corrección de algunos errores.

También se pueden descargar los ficheros desde aquí.

Por supuesto (y como siempre), se aceptan cualquier tipo de comentarios, dudas, sugerencias, críticas,…

ACTUALIZACIÓN: A partir de este momento se pueden descargar los fuentes vía SVN desde:

http://glibwmi.svn.sourceforge.net/svnroot/glibwmi/

Un saludo.

Neftalí Componentes, Código, Delphi, WMI , , ,

Imprimir Post Imprimir Post

EProgrammerNotFound Exception…

Miércoles, 20 de Enero de 2010

EProgrammerNotFound :-)

Es el error que muchas veces pienso que debería haber “saltado” en la aplicación, cuando reviso cierto código que debí escribir un día de esos en que mi cabeza está “nublada” (como los días de invierno…).

Pues Voilà!
A partir de la versión 2009 de Delphi ya está disponible y prometo usarla de aquí en adelante en mis nuevos desarrollos… ;-)

¿Que no os lo creéis? Basta con revisar la unit SysUtils.pas

Una imagen para los incrédulos:

Leído en el Blog de Marco Cantù.

Neftalí Código, Delphi, Humor, Programación , , ,

Imprimir Post Imprimir Post

Terremoto Haití: Donaciones CRUZ ROJA

Viernes, 15 de Enero de 2010

Supongo que a estas alturas todos estamos al corriente de lo que ha pasado.
Os animos desde aquí ha realizar una donación a través de la Cruz Roja (o cualquier otra entidad). Lo que para nosotros puede ser poco, allí puede ayudar mucho.

Se puede donar por cuenta, tarjeta, teléfono,… ¡hasta utilizando el móvil! así que no hay excusa. ;-) ¡Animaros!

Neftalí Otros , ,

Imprimir Post Imprimir Post

GLibWMI Versión 1.3 (beta)

Lunes, 11 de Enero de 2010

Acabo de empaquetar la versión 1.3 (beta) de la librería de componentes GLibWMI, basados en la WMI de Windows.

Básicamente he añadido nuevos componentes y he corregido algunos errores que incluía la demo general. Además he testado la librería en Delphi 2009 sin ningun problema a la hora de compilar. Doy por supesto que en todas las intermedias entre D7 y D2009 fucionará sin problemas.

Los componentes nuevos son:

  • CProcessInfo:  Información acerca de los procesos que hay ejecutándose en el sistema..
  • CServiceInfo:   Información detalleda de los servicios que hay instalados en el sistema..
  • CDesktopMonitorInfo:   Información detallada sobre el monitor o dispositivo de visualización que hay en el sistema.
  • CComputerSystemInfo:   Información acerca del sistema en General.
  • CStartupCommandInfo:    Información acerca de los procesos que se ejecutan automáticamente cuando el usuario hace el Login en el sistema.

<Ver más detalles>

Neftalí Componentes, Código, Delphi, WMI , , , ,

Imprimir Post Imprimir Post

Componentes GLibWMI

Viernes, 8 de Enero de 2010

GLibWMI es una librería/biblioteca de componentes enfocados a la Administración de Sistemas Windows.
Están basados en la WMI de Windows (Windows Management Instrumentation). Podéis conocer algo más sobre WMI en la entrada del blog titulada “WMI – Introducción“.

_________________________________________________________

ACTUALIZACIÓN:  23/02/2010.

Liberada la Versión 1.8b.

Nuevos componentes añadidos y corrección de algunos bugs; Correción en la recuperación de propiedades y algunas pérdidas de memoria.

Actualizadas las demos con los nuevos componentes.

Como la anterior verión, los últimos cambios están subidos en Sourceforge (GLibWMI).

<Descargar librería completa;  Sources+Bin>

<Descargar demos; Sources+Bin>

<Descargar demos; Bin>

_________________________________________________________

ACTUALIZACIÓN:  22/01/2010.

Versión 1.6b.

He subido el proyecto a Sourceforge (GLibWMI). La ultima versión estará disponible allí para su descarga.

Se distribuye con licencia GNU y todos los ficheros (incluídos los fuentes se pueden descargar).

Descargar ficheros:

<GLibWMI completa 1.6b>
<GLibWMI demos 1.6b>
<GLibWMI EXE demos 1.6b>

_________________________________________________________

La librería está en fase beta y se puede usar de forma libre y gratuíta.

Las versiones actuales están disponibles (ficheros compilados) para D6, D7 y D2009.

Se pueden descargar diferentes paquetes:

<GLibWMI>
<GLibWMI para Delphi 6>
<GLibWMI para Delphi 7>
<GLibWMI para Delphi 2009>
<Demos compiladas>>

Funciona sin problemas en sistemas basados en Windows 2000 y posteriores.
Para más información consultar:
Operating System Availability of WMI Components

Como bien he dicho, están en fase beta, así que se aditen sugerencias, errores, comentarios,…

Un saludo.

Neftalí Componentes, Delphi, GLibWMI, Programación, WMI , , , ,