Múltiple idioma con PHP: Ejemplo completo
Múltiple idioma con PHP. Existen páginas web que ofrecen servicios en todo el mundo, algunos de habla inglesa, otros española y en tales sitios hay una necesidad de contenido en varios idiomas. Una de las soluciones seria de crear diferentes sitios para cada idioma, pero esto pronto puede llegar a ser incontrolable e inconsistente.
Múltiple idioma con PHP: Soluciones
Existen varias formas para dar solución a este problema y a continuación daremos solución y responderemos preguntas frecuentes.
¿Cuál es la mejor solución para un sitio multi-idioma?
La mejor manera es utilizar los archivos de idioma que tienen todo el contenido de los sitios almacenado en los archivos PHP de idioma y luego utilizar el idioma de acuerdo a una petición o detección de IP por país.
Este articulo realizaremos un pequeño ejemplo que le mostrará cómo hacer precisamente eso. Por lo tanto, simplemente crearemos archivos de idioma y llamar a un idioma específico a través de una petición petición o idioma por defecto.
Solución: Múltiple idioma con PHP
a) Creación de carpeta «LANG»
Primero crearemos una carpeta llamada ‘lang‘ en esta carpeta está allí todos los idiomas que deseamos implementar serán almacenados en esta carpeta.
b) Archivos de idiomas
Crea un nuevo archivo en la carpeta lang uno para cada idioma, por ejemplo eng.php para el inglés, fre.php para francés, ger.php para alemán, esp.php para español y así sucesivamente hasta culminar los lenguajes aceptados.
c) Cambiador de idiomas
Para el cambiador de idioma que he decidido usar banderas como allí inmediatamente reconocible, he creado una carpeta llamada flags y tengo una marca para el idioma que voy a usar.
Múltiple idioma con PHP: Descripción
En la página que desea utilizar el cambiador de idioma (index.php) coloque el siguiente código por encima del doctype:
<?php session_start(); if(isset($_GET['la'])){ $_SESSION['la'] = $_GET['la']; header('Location:'.$_SERVER['PHP_SELF']); exit(); } if(isset($_SESSION['la'])) { switch($_SESSION['la']){ case "eng": require('lang/eng.php'); break; case "fre": require('lang/fre.php'); break; case "ger": require('lang/ger.php'); break; case "esp": require('lang/esp.php'); break; default: require('lang/esp.php'); } }else{ require('lang/esp.php'); } ?>
Explicación del código anterior
Esto activa las sesiones (session_start()) y luego se realiza una instrucción if, si $_GET['la']
significa que, si se ha solicitado la variable GET la, a continuación, agréguela a la sesión y vuelva a cargar la página.
A continuación, se realiza una instrucción switch que mira la sesión, si es igual a uno de los casos que se cargará en el archivo de idioma solicitado si ninguno de ellos coincide, entonces se cargará un archivo de idioma predeterminado (require('lang/esp.php')
).
Si la sesión contenía ‘esp‘ entonces el idioma español se cargará.
Estos archivos de idioma contienen el contenido de la página una vez cargado el contenido estará disponible para la página, Esto funciona haciendo referencia a una matriz $lang
, a continuación, especificar qué parte se desea.
Por ejemplo, para el título de la página en PHP llamamos a la matriz lang y luego especificamos que la sección index-title es lo que buscamos.
<title><?php echo $lang['index-title'];?></title>
El index-title hace referencia a un elemento de matriz dentro del archivo de idioma, aquí está el contenido completo del archivo de idioma inglés.
//Español lang //Menu $lang['lang-eng'] = 'English'; $lang['lang-fre'] = 'French'; $lang['lang-ger'] = 'German'; //index $lang['index-title'] = 'Idioma Demo'; $lang['index-welcome'] = 'Bienvenida a la demo del idioma'; $lang['index-text-1'] = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard."; $lang['demo'] = 'Volver al tutorial';
Como puede ver $lang['index-title']
á ‘Language Demo’; almacena el título de la página en un archivo de idioma francés el título es el mismo sólo su en francés de esta manera se puede tener fácilmente varios idiomas.
Uso de Prefijos
La forma de prefijar las partes de idioma de la matriz no es importante, siempre y cuando no utilice el mismo nombre dos veces en un único archivo de idioma, me gusta prefijar los elementos con la página para la que están destinados a indexar y luego algún nombre ‘$lang['index-welcome']
‘ Esto hace que sea mucho más fácil realizar un seguimiento de las cosas.
Así que cambiar el idioma necesitamos alguna forma de fácilmente ser capaz de invocar un nuevo idioma, Como dije anteriormente he elegido usar imágenes iconos de banderas para representar los diferentes idiomas.
Enlace Metodo GET
Se ha creado un enlace para cada idioma, los enlaces de ruta de enlace a index.php y luego paso el idioma solicitado al enlace con «?la-eng» para el uso en francés «?la-fre» dentro del enlace son los indicadores de las etiquetas alt y title son llamadas para obtener contenido del idioma cargado. Sin embargo, por lo que si las imágenes no se pueden mostrar por qué razón el usuario todavía sabrá qué enlace representa qué idioma.
<div id="langSelect"> <a href="index.php?la=eng"><img src="flags/eng.png" alt="<?=$lang['lang-eng'];?>" title="<?=$lang['lang-eng'];?>" /></a> <a href="index.php?la=fre"><img src="flags/fra.png" alt="<?=$lang['lang-fre'];?>" title="<?=$lang['lang-fre'];?>" /></a> <a href="index.php?la=ger"><img src="flags/ger.png" alt="<?=$lang['lang-ger'];?>" title="<?=$lang['lang-ger'];?>" /></a> </div>
Archivo index.php completo:
Aquí les muestro el código completo del fichero index.php
<?php session_start(); if(isset($_GET['la'])){ $_SESSION['la'] = $_GET['la']; header('Location:'.$_SERVER['PHP_SELF']); exit(); } if(isset($_SESSION['la'])) { switch($_SESSION['la']){ case "eng": require('lang/eng.php'); break; case "fre": require('lang/fre.php'); break; case "ger": require('lang/ger.php'); break; case "esp": require('lang/esp.php'); break; default: require('lang/esp.php'); } }else{ require('lang/esp.php'); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title><?php echo $lang['index-title'];?></title> <link href="style/style.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="wrapper"> <div id="langSelect"> <a href="index.php?la=eng"><img src="flags/eng.png" alt="<?=$lang['lang-eng'];?>" title="<?=$lang['lang-eng'];?>" /></a> <a href="index.php?la=fre"><img src="flags/fra.png" alt="<?=$lang['lang-fre'];?>" title="<?=$lang['lang-fre'];?>" /></a> <a href="index.php?la=ger"><img src="flags/ger.png" alt="<?=$lang['lang-ger'];?>" title="<?=$lang['lang-ger'];?>" /></a> <a href="index.php?la=esp"><img src="flags/esp.png" alt="<?=$lang['lang-esp'];?>" title="<?=$lang['lang-esp'];?>" /></a> </div> <div id="cont"> <p><?=$lang['index-welcome'];?></p> <p><?=$lang['index-text-1'];?></p> <p><a href=" https://www.baulphp.com/multiple-idioma-con-php-ejemplo-completo/"><?=$lang['demo'];?></a></p> </div> </div> </body> </html>
CONCLUSION
En este artículo hemos dado solución al problema de los multi-idiomas en los sitios web. Además, la misma lógica se podría aplicar a los sistemas web.
Se usó iconos de países con vínculos usando método GET para iniciar una sesión y mantener la selección de idiomas.
La validación de idiomas se está usando el ciclo switch para corroborar si el usuario final elige un idioma o en caso que el usuario no elija ninguno, se mostrara un idioma por defecto.
Eso es todo, espero que veas lo simple que es este método para dar soluciones a tus proyectos web.
Hola,
y para configurar el htaccess haciendo que podamos navegar usando «dominio.com/EN» ¿cómo podemos hacerlo?
yo he probado de todo y no lo he conseguido.
Hola Nestor,
De antemano, muchas gracias por todo lo que enseñas y aportas a gente como yo, que no tenemos muchos conocimientos en PHP. Me podrías ayudar como terminar de configurar para que la url sea por ejemplo midominio.com/es y midominio.com/es/contacto en caso de que sea en español.
Estoy atrancado aquí y no soy capaz de hacerlo funcionar, te mando el código que utilizo.
Muchas gracias por toda la ayuda que nos aportas.
Un saludo.
Hola Xavi,
¿conseguiste solucionar esto?
yo estoy con en el mismo problema y no soy capaz de hacerlo funcionar.
¿cómo lo has hecho?
gracias
gracias por el codigo y la explicacion, lo implementare en mi pequeno sitio, feliz dia