Como vimos hace un tiempo traducir themes de WordPress era una tarea bastante sencilla, principalmente porque todas las funciones necesarias ya las incorporaba el núcleo de WP, solo necesitábamos llamar la función load_theme_textdomain(); para cargar el fichero de idiomas y encapsular el texto con las funciones __() y _e().
Pero qué sucede si lo que queremos traducir son ficheros .php que nada tienen que ver con WP, de una web que nos hemos hecho por ejemplo?
Cómo hacemos para poder usar las funciones __() y _e() y los ficheros .mo que contienen las traducciones para cada idioma, es mas, cómo sabemos cual de los ficheros debemos de cargar para mostrarle la traducción correcta al visitante?
Pues lo cierto es que también es algo sencillo de hacer, para ello hay varias soluciones. La primera que me encontré fue usando la funcion de php llamada gettext(), sin embargo es bastante engorrosa de usar por ello busque otra alternativa, y esta fue PHP-gettext, un paquete que usan muchas aplicaciones, incluido WP, y que es muy sencillo de usar.
Lo primero que vamos a necesitar es bajarnos dicho paquete desde la web enlazada. Necesitaremos los ficheros streams.php y gettext.php.
Para realizar las pruebas nos crearemos un proyecto de pruebas, este proyecto tiene la siguiente estructura:
1 2 3 4 5 6 7 8 9 10 11 |
/ │ index.php │ ├───languages │ es_ES.mo │ es_ES.po │ └───plugin └───php-gettext gettext.php streams.php |
Los ficheros es_ES.mo y es_ES.po los creamos como en la entrada de traducción de themes de WordPress, es decir con la aplicación Poedit.
En el fichero index.php, que contiene nuestra página web a traducir, le vamos a añadir lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<?php // Primero se han de incluir los ficheros del paquete php-gettext: require_once( 'plugin/php-gettext/streams.php' ); require_once( 'plugin/php-gettext/gettext.php' ); // Después debemos de obtener el idioma del navegador que esta usando el usuario: // Sabiendo el idioma podremos cargar la traducción para él o ofrecerle la de por defecto. switch( substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) ) { case 'en': $idioma = 'en_GB'; break; default: $idioma = 'es_ES'; break; } // Después se carga el fichero de idioma: if( file_exists('languages/'. $idioma .'.mo') ) { $gettext_tables = new gettext_reader( new CachedFileReader('languages/'. $idioma .'.mo') ); $gettext_tables->load_tables(); } // Disponemos de dos funciones para obtener la traducción de cada texto almacenada en el catalogo. // La función __() recibe un texto y devuelve la traducción, o el texto original si no existe, por valor: function __($texto) { global $gettext_tables; if (is_null($gettext_tables)) return $texto; else return $gettext_tables->translate($texto); } // En el caso de la función _e() se recibe el texto y se imprime la traducción, o el original si no existe. function _e($texto) { global $gettext_tables; if (is_null($gettext_tables)) echo $texto; else echo $gettext_tables->translate($texto); } ?> |
Por ultimo solo nos quedara usar las funciones __() y _e() para traducir el texto.
Como vemos es algo realmente sencillo de hacer y nos permitirá que cada visitante vea la página en su idioma 🙂
[notification type=»alert-info» close=»false» ]Actualización 2014/10/31[/notification]Adjunto un ejemplo para traducir una página de login, el idioma de los textos sera o bien en español o en ingles dependiendo del idioma en el que este configurado el navegador de internet, cambiando de idioma se cambiara también el de la página al recargarla.