i18nAntes de comenzar este tutorial que es bastante práctico y fácil quiero resaltar algunos conceptos básicos para entender mejor para que sirve la internacionalización i18N. Parto de una premisa:
i18n No ES sólo presentar contenido en varios idiomas.

¿Que es la Internacionalización?

La Web se ha convertido en la principal herramienta de difusión de información para una audiencia variada y de gran tamaño que requiere de un procesamiento de información sencillo. La información que se muestra al usuario está compuesta de partes diferentes que han de trabajar en conjunto de forma coordinada para que la información sea accesible y universal, es decir, estas partes que integran la Web han de funcionar bajo cualquier circunstancia, en cualquier país, con cualquier idioma y cultura. Por este motivo la internacionalización podría definirse como un proceso a través del cual se van a diseñar sitios Web adaptables a diferentes idiomas y regiones sin necesidad de realizar cambios en el código. La utilización de formatos y protocolos que no establezcan barreras a los diferentes idiomas, sistemas de escritura, códigos y otras convenciones locales, es esencial para hablar de internacionalización en un sitio Web.

La Internacionalización también es conocida como I18N, que es la abreviatura de Internacionalización porque hay 18 letras entre la i y la n. Fuente.

Otro aspecto importante es saber como funciona la internacionalización.

Norma N. 1 – TODO EN UTF-8: editor, archivos, BD, tablas, campos, es decir todo, esto soluciona el 90% de los problemas de i18n.

Recordar que este ejemplo esta adaptado para KumbiaPHP, aunque la generación de los catalogos es igual en cualquier caso, la recomendación es usar Gettex fácil de usar y estándar, hay un tutorial en la Wiki de KumbiaPHP (KumbiaPHP y Gettext)el cual explica como generar los catalogos con Poedit y donde ubicarlos dentro de la estructura de directorio de la versión 1.0 Beta1

El autor del blog Matando Tigres ha creado su receta que como comente es bastante simple y funcional, yo traigo otra alternativa tan igual de fácil como esa ;).

Es sumamente importante generar los catalogos tal como se explica en el tutorial KumbiaPHP y Gettex ya que la intención de este tutorial es como mediante las URL’s sabemos el idioma y aplicarlo a nuestra aplicación para que se hagan las traducciones necesarias.

Lo Primero

Lo que deseamos es tener una URL como esta http://dominio.com/$lang/controller/action/, donde el $lang puede tener tantos idiomas como se hayan considerado.

Siguiendo, hay que editar el archivo app/public/.htaccess hay muchos que ignoran el gran potencial que se cuenta con la reescrituras de URL (mod_rewrite) y para efecto de este tutorial quiero sacar provecho de las reglas de reescritura.

... AQUI ESTA EL DEMAS CONTENIDO...
    # Para peticiones que no son archivos ni directorios
    # Reescribe a index.php?_url=URL
    RewriteRule ^(es|en)/(.*)$ index.php?url=/$2&lang=$1 [QSA,L]

Como se aprecia solo hemos cambiado la última regla para agregar el idioma y este luego es enviado como un parámetro GET['lang'] y como se mencionó la URL tendra este aspecto http://dominio.com/es/controller/action/ para efecto del ejemplo solo se han colocado 2 idiomas es (español) y en (ingles) pueden estar todos los que se necesiten.

Lo Segundo

Adecuar todos los enlaces, esto lo hacemos editando el FrontController de KumbiaPHP app/public/index.php en la definición de la constante URL_PATH que es la constante que se colocan en los link, form, etc. generados por los helpers.

La definición de esta constante esta aprox. por la línea 75.
define(‘URL_PATH’, PUBLIC_PATH.$_GET['lang'].’/');

Como se aprecia solo hemos agregando el valor del parámetro $_GET['lang'] que se definió en el .htaccess con esto ya todos nuestros enlaces tienen el idioma en la URL.

Por último…

Ahora solo queda asignar el valor del lenguaje solicitado para que la aplicación lo cargue y aplique las traducciones necesarias, ¿recuerdan lo que escribí hace un tiempo de aprovechar el método initialize()? para este caso también aplica :).

class ApplicationController extends Controller
{
    /**
     * Array con los idiomas disponibles
     */
    private $_langs = array('es' => 'es_VE', 'en' => 'en_US');
    public function initialize()
    {
        $lang = $_GET['lang'];
        //verifica que el lenguaje sea soportado, sino existe tomamos uno por defecto 'es_VE'
        if(!array_key_exists($lang, $this->_langs){
            //idioma por defecto
            $lang = 'es_VE';
        }else{
            $lang = $this->_langs[$lang];
        }
        putenv("LC_ALL=$lang");
        setlocale(LC_ALL, $lang);
        bindtextdomain("messages", APP_PATH . 'locale');
        textdomain("messages");
    }
}

Con esto ya deben funcionar las traducciones de nuestra aplicación, los código de idiomas sale del ISO 631-1

Conclusiones…

i18n es mas que una traducción de texto a un idioma hay que tomar en cuenta las culturas de las traducciones, monedas, fechas, montos, etc. hay muchas cosas por tomar en cuenta que no mencione en este tutorial sin embargo con ir al sitio oficial de Internacionalización (ingles) de la W3C encontraran bastante insumos para comprender este tema.

Haciendo una pequeña comparación respecto al ejemplo que publico el autor del blog Matando Tigres es que en este caso no utilizo el routes.ini obviamente esto se traduce en un tema de performance y reducción de trabajo, porque tantas rutas estaticas tenga en mi sistema debo definirla para el idioma.

Como siempre digo es una opción que seguro irá mejorando a medida que ustedes den un feedback, espero sus comentarios.

  • Share/Bookmark