Como hacer una web multilenguaje en PHP

Hacer una web multilenguaje es algo a lo que más tarde o más temprano cualquier programador va a tener que enfrentarse. Realmente no es nada complejo. Veamos una forma sencilla de hacerlo usando PHP.

Empecemos por un ejemplo. Vamos a hacer una web que tendrá un menú en castellano e inglés. El código html inicial es:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"></head>
<body>
<nav>
<a href="#">About us</a>
<a href="#">What we do?</a>
<a href="#">Where we are?</a>
<a href="#">Contact</a>
</nav>
</body>
</html>

Como punto de partida los textos en inglés. Para que los textos sean dinámicos usaremos una función php, que llamaremos __(). Esta función estará en el fichero languages.php. La declaración inicial es:

<?php
function __($str, $lang = null){	
   return $str;
}	
?>

La función recibe dos parámetros. El texto a traducir y el lenguaje a usar. Este segundo parámetro es opcional. Si no se especifica el idioma usaremos uno por defecto. En nuestro ejemplo el idioma por defecto será el inglés

Si modificamos nuestro fichero html para que use esta función nos quedará de la siguiente forma:

<?php require('languages.php') ?>
<!DOCTYPE html>
<html>
	<head><meta charset="utf-8"></head>
	<body>
		<nav>
			<a href="#"><?php echo __('About us') ?></a>
			<a href="#"><?php echo __('What we do?') ?></a>
			<a href="#"><?php echo __('Where we are?') ?></a>
			<a href="#"><?php echo __('Contact') ?></a>
		</nav>			
	</body>
</html>

Ahora necesitaremos crear un fichero con las traducciones. Ya he comentado que el idioma por defecto será el inglés, así que crearemos unicamente un fichero con los textos en castellano. Este texto se llamará language_es.php y tendrá un array con las traducciones. Lo vemos a continuación:

<?php
$texts = array(
	'About us' => 'Sobre nosotros',
	'What we do?' => '¿Qué hacemos?',
	'Where we are?' => '¿Dóde estamos?',
	'Contact' => 'Contacto'
);
?>

Ahora modificaremos nuestra anterior función para leer este fichero. Lo que haremos será lo siguiente. Si recibimos el idioma por defecto, devolveremos el texto sin traducir. Si recibimos el parámetro de idioma, buscaremos el fichero de traducciones correspondiente. En caso de existir, buscaremos en el array la traducción. Si existe, devolveremos el texto traducido. En cualquier otro caso, devolveremos el texto por defecto.

Nuestra función quedará así:

<?php

	function __($str, $lang = null){

		if ( $lang != null ){

			if ( file_exists('language_'.$lang.'.php') ){

				include('language_'.$lang.'.php');
				if ( isset($texts[$str]) ){
					$str = $texts[$str];
				}
			}
		}

		return $str;
	}

?>

Ya solo nos falta modificar nuestro fichero inicial para mostrar los textos en función del idioma recibido. Vamos a suponer que el idioma se pasa como parámetro en la url. Es decir, index.php mostrará los textos en inglés, mientras que index.php?lang=es mostrará los textos en castellano. Cualquier otro valor del parámetro lang mostrará los textos en ingles, el idioma por defecto. Nuestro código quedará así:

<?php 
	require('languages.php'); 

	$lang = null;
	if ( isset($_GET['lang']) ){
		$lang = $_GET['lang'];
	}
?>
<!DOCTYPE html>
<html>
	<head><meta charset="utf-8"></head>
	<body>
		<nav>
			<a href="#"><?php echo __('About us', $lang) ?></a>
			<a href="#"><?php echo __('What we do?', $lang) ?></a>
			<a href="#"><?php echo __('Where we are?', $lang) ?></a>
			<a href="#"><?php echo __('Contact', $lang) ?></a>
		</nav>			
	</body>
</html>

Y esto es todo. Si más adelante necesitamos añadir un tercer o un cuarto idioma, lo único que necesitaremos hacer es añadir el fichero de idiomas correspondiente. Si necesitáramos traducir la página al francés, tendremos que crear el fichero language_fr.php, si necesitáramos una versión en catalán, language_cat.php, etc.

Puedes ver un ejemplo en funcionamiento aquí: Ver ejemplo.
También puedes descargar el código.

¿Necesitas a alguien que te haga una web en varios idiomas? Puedes contactar conmigo en el siguiente formulario:

[contact-form-7 id=”157″ title=”Formulario de contacto 1″]