Traducir una web a varios idiomas

Lengua

Descripción de cómo hacer una web multiidioma con PHP utilizando las funciones gettext.

Características

  • Si falta la traducción la página web mostrará el texto en el idioma de la clave utilizada
  • Se pueden añadir sobre la marcha más textos a traducir sin que afecte a los que ya estaban traducidos
  • Se separa la tarea de crear la página web de la tarea de traducir
  • Se puede añadir en cualquier momento un nuevo idioma a traducir

Código fuente

Flujo de archivos

  1. Crea los ficheros php usando claves en los textos a traducir
  2. Reune todas las claves de todos los ficheros php en el archivo messages.pot
  3. Crea a partir del archivo messages.pot un archivo po por cada idioma
  4. Realiza la traducción en los archivos po. Por ejemplo: en.po, es.po y ca.po
  5. Compila las traducciones po en archivos mo
  6. En la web selecciona el idioma deseado según las preferencias del usuario

Estructura de carpetas y archivos del sitio web

Estructura inicial

  ├── *.php — Archivos PHP con los textos a traducir
  └── locale  — Carpeta de las traducciones
      ├── init.sh — Script para iniciar el sistema de traducción
      ├── addlang.sh — Script para añadir un nuevo lenguaje a traducir
      ├── prepare.sh — Script que prepara los archivos a ser traducidos
      └── compile.sh — Script que compila los archivos ya traducidos
  

Estructura final

  ├── *.php — Archivos PHP con los textos a traducir
  └── locale — Carpeta de las traducciones
      ├── ca_ES
      │   └── LC_MESSAGES
      │       └── messages.mo — Archivo compilado con la traducción al catalán
      ├── en_US
      │   └── LC_MESSAGES
      │       └── messages.mo — Archivo compilado con la traducción al inglés
      ├── es_ES
      │   └── LC_MESSAGES
      │       └── messages.mo — Archivo compilado con la traducción al español
      ├── ca.po — Traducción de la web al catalán
      ├── en.po — Traducción de la web al inglés
      ├── es.po — Traducción de la web al español
      └── messages.pot — Plantilla con todas las claves a traducir
  

Pasos a seguir para traducir la web

Todos los comandos se han de realizar desde la carpeta locale del sitio web

$ cd web/locale

  1. Instalación de los comandos de gettext

    $ sudo apt-get install gettext

    Podemos echar un vistazo a los idiomas ya incluidos en el sistema operativo

    $ locale -a
    en_US.utf8
    es_ES.utf8

  2. Inicia el sistema de traducción con init.sh

    Se trata de crear la primera versión de la plantilla messages.pot que contendrá todas las claves de traducción que se encuentren en los archivos .php

    $ ./init.sh

  3. Agrega los idiomas a traducir con addlang.sh

    Hay que indicar el código del idioma y el código del país.

    $ ./addlang.sh en_US El inglés de Estados Unidos
    $ ./addlang.sh es_ES El español de España
    $ ./addlang.sh ca_ES El catalán de España

    Esto creará los archivos a traducir: en.po, es.po y ca.po

  4. Prepara los archivos a traducir con prepare.sh

    $ ./prepare.sh

    Esto actualizará los archivos en.po, es.po y ca.po para que contengan las nuevas claves de traducción que pudiesen haber en los archivos .php

  5. Realiza las traducciones

    Podemos realizar las traducciones manualmente con un editor de textos cualquiera:

    $ nano en.po
    $ nano es.po
    $ nano ca.po

    O podemos usar algún sistema de traducción existente:

    • Poedit — Gettext translations editor
    • Simple PO — Aplicación web para traduccir archivos .po
    • Loco — Translation Management for Developers
  6. Compila los archivos ya traducidos con compile.sh

    $ ./compile.sh

    Esto creará los archivos compilados .mo a partir de los archivos .po

    • en.po —> en_US/LC_MESSAGES/messages.mo
    • es.po —> es_ES/LC_MESSAGES/messages.mo
    • ca.po —> ca_ES/LC_MESSAGES/messages.mo
  7. Comprueba que todo funciona correctamente

    Ves con el navegador a tu sitio web y constata que al seleccionar un idioma cambia la traducción

Código PHP

  • Cómo traducir un archivo PHP

    Cada texto a traducir hay que pasarlo por una de las funciones gettext:
    gettext, ngettext, dcgettext, etc.

    Para una traducción básica podemos usar la función gettext abreviada a un guion bajo:

    <?php echo _('Hello World!'); ?>
    <?php echo _('Another day in paradise'); ?>
    <?php echo _('Another one bites the dust'); ?>

    En el ejemplo anterior el idioma base para las claves de traducción es el inglés

  • Cómo cambiar de idioma en PHP

    Crea una lista de enlaces con los idiomas disponibles:

    <ul>
      <li><a href="?lang=en">English</a></li>
      <li><a href="?lang=es">Español</a></li>
      <li><a href="?lang=ca">Català</a></li>
    </ul>

    Cambia el idioma según el parámetro indicado:

    <?php
    $languages = array(
      'en'=> "en_US.utf8",
      'es'=> "es_ES.utf8",
      'ca'=> "ca_ES.utf8",
    );

    $lang = isset($_REQUEST['lang'])? $_REQUEST['lang']: 'en';
    $locale = $languages[$lang];
    putenv("LC_ALL=$locale");
    setlocale(LC_ALL, $locale);

    $domain = "messages";
    bindtextdomain($domain, "./locale");
    bind_textdomain_codeset($domain, 'utf8');
    textdomain($domain);
    ?>

  • Cómo cambiar de idioma en PHP (versión mejorada)

    <?php
    require_once "locale.php";
    Locale::set();
    ?>

    Selecciona el idioma según los siguientes criterios de más a menos prioritario:

    • Parámetro lang en el GET o POST
    • Parámetro lang en SESSION
    • Idiomas preferidos en el navegador web
    • Idioma predeterminado

    Una vez seleccionado el idioma lo almacena en una variable de SESSION

Referencias

Comentarios

Proinf.net, ©2003-2017 ci 3.1.6 (CC) Esta obra está bajo una licencia de Creative Commons Este software está sujeto a la CC-GNU GPL