Clase traductora sencilla con arrays PHP

Esta semana algunos suscriptores del curso PHP guay habéis planteado que os gustaría solucionar algún problema concreto de la vida real, por ejemplo, traducir el texto HTML de vuestras páginas web en varios idiomas.



Pues bien, hoy vamos a complicar un poco las cosas y vamos a solucionar este problema que ciertamente suele presentarse muy a menudo en el desarrollo de apps. No os agobiéis los que todavía no tengáis asimilados los fundamentos de PHP, que los veremos en próximas entregas 😉

Vamos a desarrollar una sencilla clase traductora que funciona con arrays PHP. Los componentes de traducción como el que vamos a hacer hoy suelen trabajar con varios formatos para las traducciones: .csv, .txt, .mo, .xml, etc.

De momento, por simplicidad y por motivos didácticos, nosotros trabajamos con un solo formato: los arrays PHP.

Diccionarios en varios idiomas

Puedes utilizar esta clase sencilla en tus apps siempre que tengas claro que puedes usar arrays PHP para traducir tus textos. De no ser así, deberías contar con otra clase traductora que de cobertura a tu formato, o con un componente que proporcione una verdadera capa de abstracción, dando solución a todos los formatos, por ejemplo, Zend_Translate de Zend Framework.

Dicho esto, adjunto a continuación el código del componente SimpleTranslation, que también está disponible en este repositorio SVN de Google Code.

<?php
namespace SimpleTranslation;
/**
 * Translate class
 * 
 * A simple translation class using PHP arrays.
 * 
 * @author      Jordi Bassagañas <info@programarivm.com>
 * @copyright   2014 Jordi Bassagañas
 * @link        http://programarivm.com
 */
class Translate 
{
    /**
     * @var stdClass Config object
     */
    protected static $conf;
    /**
     * Init method
     * @param string $locale Target language
     * @param string $path Dictionary path
     */
    static function init($locale=null, $path=null)
    {
        self::$conf = new \stdClass;
        self::setLocale($locale);
        self::setDictionary($path);
    }
    /**
    * Sets the current locale
    * @param string $locale
    */
    private static function setLocale($locale=null)
    {
        isset($locale) 
            ? self::$conf->locale = $locale 
            : self::$conf->locale = null;
    }
    /**
     * Sets the dictionary path
     * @param string $path
     */
    private static function setDictionary($path=null)
    {
        isset($path) 
            ? self::$conf->dictionary = include $path 
            : self::$conf->dictionary = null;
    }
    /**
    * Returns the translated phrase
    * @param string $phrase The original phrase
    * @return string The translated phrase
    */
    static function __($phrase) 
    {
        if(isset(self::$conf->locale) && isset(self::$conf->dictionary))
        {
            return self::$conf->dictionary[$phrase];
        } 
        else return $phrase; 
    }
}

El archivo README.md explica (en formato markdown, en inglés) cómo utilizar SimpleTranslation. En primer lugar, hay que poner los diccionarios PHP en alguna carpeta de la aplicación.

lang/es.php:

return array(
    'home' => 'inicio',
    'about' => 'sobre nosotros',
    'contact' => 'contacto'
);

lang/fr.php:

return array(
    'home' => 'accueil',
    'about' => 'à propos',
    'contact' => 'contact'
);

Luego tienes que incluir la clase \SimpleTranslation\Translate.php e inicializarla con los parámetros locale y dictionary:

include_once 'SimpleTranslation/Translate.php';
use \SimpleTranslation\Translate;
Translate::init('es', __DIR__ . "/lang/es.php");

Con lo anterior ya podemos traducir los textos:

echo Translate::__('home');
echo Translate::__('about');

La clase Translate.php trabaja estos aspectos de PHP:

  • Programación orientada a objectos (OOP)
  • Namespaces
  • Propiedades estáticas
  • El operador ternario
  • La clase stdClass de PHP

Esto es todo por hoy. ¡Gracias y saludos! 😉