How to send POST variables using command line

When you are developing using PHP or another technology, you can use the POST variables to send values from the client to the server page.

Now, for debug and application, you can use the UNIX command line to send POST variables. It is much more easy, because you won’t need a complete HTML form or AJAX script or other complex way.

To send the variables we are going to use the CURL command line utility.
After install this application use the next commands to send the POST variables:

Send a simple variable:

curl -d 'name=value' http://localhost/index.php

Send multiple variables:

curl -d 'first=value&second=value' http://localhost/index.php

This tool give you another interesting options, too see them all run:

curl --help

“¡Quiero escribir código PHP traducible!”

Como hispanohablante, estoy muy acostumbrado a escribir software en mi lengua materna. Pero luego me doy cuenta que mis aplicaciones llegan a un público diferente, gente de habla Inglesa.

He terminado escribiendo software en Español o en Inglés (podes usar condicional XOR). En este caso, sin importar el lenguaje de programación utilizado.
Este no es un buen habito porque luego es muy difícil de traducirla a un idioma diferente. Debido a esta situación he comenzado a investigar cómo escribir código que luego pueda ser fácilmente traducido.

Ahora explicare todos los pasos, desde el código PHP a los archivos traducibles y herramientas importantes.
Abreviando, deberás escribir el código PHP, extraer las impresiones (outputs) en un archivo PO, traducirlo y compilarlo en un archivo MO y listo! (no es todo pero casi)

Antes que nada te aviso que he utilizado GNU/Linux para esto. Si tú no estas en dicho ambiente, lo lamento.. Continuando:

PASO 1: ¿Cómo escribir código PHP traducible?

El archivo PHP deberá estar escrito en el idioma por defecto, en este caso Inglés.
El archivo PHP deberá cargar el idioma deseado desde los archivos traducidos y compilados, en este caso Español.

Cada salida tendrá un código especial, permitiéndonos que esta sea extraída en un archivo separado para ser traducido luego. El software que he utilizado para esta tarea es Gettext.
Las salidas serán como esta:

echo gettext("Hello world!")

Tu puedes ejecutar tu código, el resultado sera el string pero sin traducir. No te desanimes, la traducción no es automática. Esto nos ayudara a extraer la linea en un archivo separado.

PASO 2: ¿Cómo obtener el archivo PO desde el código PHP?

Previamente dicho, yo utilice Gettext, por lo que se utilizara el comando xgettext para producir el archivo PO. Aquí hay un ejemplo:

xgettext
-f /var/www/locale/FILES
-p /var/www/locale/PO
-L PHP
--from-code=UTF-8
--copyright-holder=Me
--package-name=MyApp
--package-version=0.1
--msgid-bugs-address=user@server.org
  • El parámetro -f esta apuntando a un archivo de texto plano que tendra las rutas de todos los archivos PHP que serán traducidos. He subido este archivo como ejemplo.
  • El parámetro -p es un directorio, en este se guardará el archivo PO.

Los otros parámetros hablan por sí mismos.

Ahora que tienes el archivo PO, puedes traducirlo. Utiliza un editor de texto plano, o inclusive mejor Poedit u otra herramienta. Eres libre

PASO 3: ¿Qué hacer con el archivo PO traducido?

Ahora el archivo PO que ya ha sido traducido deberá ser compilado (sí, compilado) en un archivo MO.

¿Porqué? Porque este archivo MO (también conocido como tablas de traducción) será cargado por el archivo PHP! PHP no leerá un archivo de texto plano con cualquier formato.

Para compilar el archivo PO, he utilizado el comando msgfmt. Aquí hay un ejemplo:

msgfmt -cv -o /path/to/output.mo /path/to/input.po

Ahora se deberá indicar al script PHP la ubicación de las tablas de traducción y el idioma apropiado.

En el archivo PHP, inserta las siguientes lineas en el tope:

$ABSPATH = "/var/www/";
// Especificar la ruta de las traducciones
bindtextdomain('messages', $ABSPATH.'/locale/');
textdomain('messages');
$codeset = "UTF8"; // Sí, sin el guión '-'
$lang = "es_ES";
// Definir el lenguaje que se utilizara
setlocale(LC_ALL, $lang.'.'.$codeset);

Ahora PHP esta apuntando el archivo MO en el directorio utilizado /var/www/locale/es_ES/LC_MESSAGES/messages.mo

He subido un proyecto en GitHub, así podrás ver todos los archivos completos: https://github.com/lucio-martinez/PHP-Translator

Fuentes:

https://en.wikipedia.org/wiki/Gettext

http://www.php.net/manual/en/function.gettext.php

http://www.php.net/manual/en/function.setlocale.php#89076

http://php.net/manual/en/function.textdomain.php

http://stackoverflow.com/q/5257519/1505348

http://stackoverflow.com/a/8809762/1505348

“I want to write internationalized PHP code!”

As a Spanish-speaker, I’m very used to write software in my native language. But then, I found that my applications will reach a different audience, English-speaking people.

I’d always end up writing dedicated software in Spanish OR English (you can use XOR there). And in this case scenario, it doesn’t matter the programming language.
This is a not very good habit because it was very hard to translate it into a different language. Due to this situation I started to research how to write code that could be easily translated later.

Now I will explain you all the steps, from the PHP code to the translatable files and the powerful tools.
In broad terms you have to write the PHP code, extract the outputs into a PO file, translate it and compile into a MO file and done! (is not all but bear with me)

First of all you should notice that I used GNU/Linux for this. If you aren’t in such environment, sorry for you.. Continuing:

STEP 1: How to write internationalized PHP code?

The PHP file shall be written in the default language, in this case English.
The PHP file will load the desire language from the translated and compiled files, in this case Spanish.

Every output will have a special code, allowing us to extract every line into a separate file, to be translated later. The software that I used to accomplish the previous task is Gettext.
So the outputs will be writing like this:

echo gettext("Hello world!");

You could run it and it will print the string but not translated. Don’t be disappointed, it is not automatic. This will help us to extract the line in a separated file.

STEP 2: How to get the PO file from PHP code?

I already mentioned that I used Gettext, so you will use the xgettext command line utility to produce the PO file. Here is an example:

xgettext
-f /var/www/locale/FILES
-p /var/www/locale/PO
-L PHP
--from-code=UTF-8
--copyright-holder=Me
--package-name=MyApp
--package-version=0.1
--msgid-bugs-address=user@server.org
  • The -f parameter is pointing to a plain text file that will contain the paths of all the PHP files that have to be translated. I uploaded this example file.
  • The -p parameter is a directory where the PO file will be saved.

And the others parameters speak for themselves.
Put this command in one line and maybe write your own script if you have big projects.

Now that you have the PO file you can translate it. Use a plain text editor or even better Poedit or another tool. You are free

STEP 3: What to do with the translated PO file?

Now the PO file that has been translated shall be compiled (yes, compiled) into a MO file.
Why? Because this MO file (aka translated tables) will be loaded by the PHP code! PHP won’t read a text plain file with whatever format.

To compile the PO file, I used the msgfmt command line utility. Here is an example:

msgfmt -cv -o /path/to/output.mo /path/to/input.po

Well, if you try to see if this is working by now, then you don’t know me. This is not all.
Now you need to tell to the PHP script the location of the translation tables and the proper language.

In the PHP file, insert the following lines at the top:

$ABSPATH = "/var/www/";
// Specify location of translation tables
bindtextdomain('messages', $ABSPATH.'/locale/');
textdomain('messages');
$codeset = "UTF8"; // Yes, without the dash '-'
$lang = "es_ES";
// Set the language that would be used
setlocale(LC_ALL, $lang.'.'.$codeset);

Now PHP is looking the MO file in the called directory: /var/www/locale/es_ES/LC_MESSAGES/messages.mo

I uploaded a small project into GitHub, so you can see the complete files there: https://github.com/lucio-martinez/PHP-Translator

Sources:

https://en.wikipedia.org/wiki/Gettext

http://www.php.net/manual/en/function.gettext.php

http://www.php.net/manual/en/function.setlocale.php#89076

http://php.net/manual/en/function.textdomain.php

http://stackoverflow.com/q/5257519/1505348

http://stackoverflow.com/a/8809762/1505348

Programming languages of users in GitHub

Introduction

In GitHub, almost every user have a list with programming languages (PL). See this picture:

Image

As you can see there is my user with the C# language.

At the begging I didn’t know why I have that PL, because I did never set it.

Question

So the question is, how does that languages are set if no one can change them manually? Yes, there is no option to activate it, or change your PL.

Answer

The list with programming languages (PL again) change automatically after upload a repository, adding any new PL to the list, but it also depends on the directory structure.

Explanation

If you uploaded a repository and the primary language used doesn’t appear in the list (it happened to my) is due to the directory structure.That is right. If you have all your folders with the source code inside one folder, then no language will be added.
This example is like I used to have one of my projects

New_Project: (container folder)
JavaScript (folder with source code)
    Images
    PHP (folder with source code)
    More folders

With the above structure, my user still has C# as the only PL that I used, and that wasn’t true. To let GitHub recognize all the languages, I removed the the container folder.
After such changes the PL were added to my user, just like this: C#, JavaScript, PHP.

Conclusion

This could be considered as a bug. It is not a normal behavior, or at least, what any user could expect..

Side note

The list is limited to 3 programming languages.

Develop an application in 4 hours

As the final test of this semester, me and my partners of the University had to develop a completely functional Windows application in no more than four hours.

As anyone can imagine, this application was related with commercial needs. The premise was the following:

An small company that needs a system to register and technicians solving their problems with electrical components

The experience of this challenge was great for several issues, few of them are:

    • Recognize our abilities and limitations
    • Get professional capabilities
    • Create good comments before and while coding
    • Give more importance to concepts than tests