27/02/2021
Código php para páginas en diferentes idiomas o dirigidas a distintas regiones

Ya es algo normal que los clientes nos exijan que las páginas de sus sitios web se puedan establecer correctamente en diferentes idiomas o que vayan dirigidas a distintas regiones, y la razón de ello es poder mostrar ciertos mensajes en las páginas que de acuerdo a la configuración regional del equipo que manejan los usuarios, estos puedan comprender enteramente el contenido que se les presenta.
Supongamos que un cliente establecido en la ciudad de Miami quiere un sitio web que se pueda mostrar en los idiomas inglés y español, y dependiendo de la versión que elijan los usuarios que visiten su negocio online se pueda mostrar la descripción de los productos que ofrecen en el idioma que puedan comprender. Es por ello que he creado un código en php que permite cumplir a cabalidad dicha funcionalidad.
Esto se puede lograr sin muchas complicaciones mediante el uso de una sesión y de un parámetro que ha de pasarse a través de la URL del navegador, y así mostrar la lógica y el funcionamiento del código que necesitamos implementar para satisfacer dicho requerimiento.
Para comprender el código es necesario conocer lo siguiente:
- Se requieren conocimientos básicos de HTML y php.
- El código implementado fue probado en la versión 7.3 de php y un entorno de prueba de Apache
El recurso consta principalmente de un archivo llamado «language.class.php», el cual contiene la clase «language» que se extiende de una clase genérica llamada «general».
Puede comprobar el resultado a través de una demostración en vivo.
Así debe ir nuestro archivo «language.class.php»
<?php
/////////////////////////
// language.class.php //
/////////////////////////
/**
* Clase que crea o mantiene una sesión con el idioma ("en", "es", "fr", "pt") de la página web
*
* @class language
* @constructor
* @extends general
* @methods language_session_start
* @variables public $hl
*/
class language extends general {
public $hl = '';
/**
* @resume constructor que llama función o método language_session_start( $lang )
*/
public function __construct( $lang = 'es' ) {
$this->hl = $this->language_session_start( $lang );
}
/**
* @resume establece el lenguaje de la sesión del usuario en el navegador
* @param $lang
* @return $_SESSION['hl']
* @variables array $optlang
*/
public function language_session_start( $lang = 'es' ) {
// Inicializar la sesión del usuario si no está activa
if ( session_id() == '' && !isset( $_SESSION ) ) { session_start(); }
// $optlang almacena las opciones de los lenguajes admitidos
$optlang = array( 'en' => 'en', 'es' => 'es', 'fr' => 'fr', 'pt' => 'pt' );
// Si se recibe una opción no existente en $optlang
// Entonces se asume la opción predeterminada en el parámetro $lang
if( in_array( $lang, array_keys( $optlang ) ) ) $default = $optlang[$lang];
// Controla el valor de la sesión según la variable ?hl pasada por la URL
if( empty( $_SESSION['hl'] ) ) {
// Si la variable ?hl no está definida y validada correctamente
// Entonces se asume el valor del parámetro $lang
// En caso contrario se asigna el valor de $lang a la $_SESSION['hl']
if( !$this->get_g_vars( 'hl' ) || !$this->validates( 'twoLetters', $this->get_g_vars( 'hl' ) ) ) {
$_SESSION['hl'] = $default; // Asignando el valor del parámetro $lang
} else {
if( in_array( $this->get_g_vars( 'hl' ), array_keys( $optlang ) ) ) {
$_SESSION['hl'] = $optlang[$this->get_g_vars( 'hl' )]; // Asignando ?hl a $_SESSION['hl']
} else {
$_SESSION['hl'] = $default; // Asignando el valor del parámetro $lang
}
}
} else {
// Si la sesión $_SESSION['hl'] está activa
// Y no ha cambiado el valor de ?hl a través de la URL
// Entonces se mantiene, de lo contrario, se limpia la sesión
// Se verifica el nuevo valor de ?hl
// Se asigna el nuevo valor a $_SESSION['hl'] o
// Se asume el valor predeterminado de $lang
if( $this->get_g_vars( 'hl' ) && $this->validates( 'twoLetters', $this->get_g_vars( 'hl' ) ) ) {
if( $_SESSION['hl'] !== $this->get_g_vars( 'hl' ) ) {
unset( $_SESSION['hl'] ); // Limpia la sesión
if( in_array( $this->get_g_vars( 'hl' ), array_keys( $optlang ) ) ) {
$_SESSION['hl'] = $optlang[$this->get_g_vars( 'hl' )]; // Asignando ?hl a $_SESSION['hl']
} else {
$_SESSION['hl'] = $default; // Asignando el valor del parámetro $lang
}
}
} else {
if( empty( $_SESSION['hl'] ) ) $_SESSION['hl'] = $default; // Asignando el valor del parámetro $lang
}
}
return mb_strtolower( $_SESSION['hl'], 'UTF-8' ); // Retorna el valor de $_SESSION['hl']
}
}
/**
* Clase de uso genérico con las funciones o métodos que necesitamos
* @class general
* @methods define_g_vars, get_g_vars, validates
* @variables private $gvars
*/
class general {
private $gvars = array();
protected function define_g_vars(){
if( isset( $_REQUEST ) ) {
foreach( $_REQUEST as $key => $val ) {
$this->gvars[$key] = $val;
}
}
}
protected function get_g_vars( $key ) {
$this->define_g_vars();
return ( isset( $this->gvars[$key] ) ) ? $this->gvars[$key] : false;
}
protected function validates( $type, $string, $is_nullable = 'NO' ) {
$empty = '';
if( !isset( $type ) || !isset( $string ) || !isset( $is_nullable ) ) return;
if( $is_nullable == 'YES' && empty( $string ) ) return true;
if( ($is_nullable == 'YES' && !empty( $string ) ) OR ( $is_nullable == 'NO' ) ) $empty = ( !empty( $string ) );
switch( $type ) {
case 'twoLetters':
if( $empty
&& isset( $string )
&& preg_match_all( '/^[a-z]{2}$/i',$string, $coin ) ) {
/* print_r($coin); */
return true;
} else { return false; }
}
}
}
?>
/////////////////////////
// language.class.php //
/////////////////////////
/**
* Clase que crea o mantiene una sesión con el idioma ("en", "es", "fr", "pt") de la página web
*
* @class language
* @constructor
* @extends general
* @methods language_session_start
* @variables public $hl
*/
class language extends general {
public $hl = '';
/**
* @resume constructor que llama función o método language_session_start( $lang )
*/
public function __construct( $lang = 'es' ) {
$this->hl = $this->language_session_start( $lang );
}
/**
* @resume establece el lenguaje de la sesión del usuario en el navegador
* @param $lang
* @return $_SESSION['hl']
* @variables array $optlang
*/
public function language_session_start( $lang = 'es' ) {
// Inicializar la sesión del usuario si no está activa
if ( session_id() == '' && !isset( $_SESSION ) ) { session_start(); }
// $optlang almacena las opciones de los lenguajes admitidos
$optlang = array( 'en' => 'en', 'es' => 'es', 'fr' => 'fr', 'pt' => 'pt' );
// Si se recibe una opción no existente en $optlang
// Entonces se asume la opción predeterminada en el parámetro $lang
if( in_array( $lang, array_keys( $optlang ) ) ) $default = $optlang[$lang];
// Controla el valor de la sesión según la variable ?hl pasada por la URL
if( empty( $_SESSION['hl'] ) ) {
// Si la variable ?hl no está definida y validada correctamente
// Entonces se asume el valor del parámetro $lang
// En caso contrario se asigna el valor de $lang a la $_SESSION['hl']
if( !$this->get_g_vars( 'hl' ) || !$this->validates( 'twoLetters', $this->get_g_vars( 'hl' ) ) ) {
$_SESSION['hl'] = $default; // Asignando el valor del parámetro $lang
} else {
if( in_array( $this->get_g_vars( 'hl' ), array_keys( $optlang ) ) ) {
$_SESSION['hl'] = $optlang[$this->get_g_vars( 'hl' )]; // Asignando ?hl a $_SESSION['hl']
} else {
$_SESSION['hl'] = $default; // Asignando el valor del parámetro $lang
}
}
} else {
// Si la sesión $_SESSION['hl'] está activa
// Y no ha cambiado el valor de ?hl a través de la URL
// Entonces se mantiene, de lo contrario, se limpia la sesión
// Se verifica el nuevo valor de ?hl
// Se asigna el nuevo valor a $_SESSION['hl'] o
// Se asume el valor predeterminado de $lang
if( $this->get_g_vars( 'hl' ) && $this->validates( 'twoLetters', $this->get_g_vars( 'hl' ) ) ) {
if( $_SESSION['hl'] !== $this->get_g_vars( 'hl' ) ) {
unset( $_SESSION['hl'] ); // Limpia la sesión
if( in_array( $this->get_g_vars( 'hl' ), array_keys( $optlang ) ) ) {
$_SESSION['hl'] = $optlang[$this->get_g_vars( 'hl' )]; // Asignando ?hl a $_SESSION['hl']
} else {
$_SESSION['hl'] = $default; // Asignando el valor del parámetro $lang
}
}
} else {
if( empty( $_SESSION['hl'] ) ) $_SESSION['hl'] = $default; // Asignando el valor del parámetro $lang
}
}
return mb_strtolower( $_SESSION['hl'], 'UTF-8' ); // Retorna el valor de $_SESSION['hl']
}
}
/**
* Clase de uso genérico con las funciones o métodos que necesitamos
* @class general
* @methods define_g_vars, get_g_vars, validates
* @variables private $gvars
*/
class general {
private $gvars = array();
protected function define_g_vars(){
if( isset( $_REQUEST ) ) {
foreach( $_REQUEST as $key => $val ) {
$this->gvars[$key] = $val;
}
}
}
protected function get_g_vars( $key ) {
$this->define_g_vars();
return ( isset( $this->gvars[$key] ) ) ? $this->gvars[$key] : false;
}
protected function validates( $type, $string, $is_nullable = 'NO' ) {
$empty = '';
if( !isset( $type ) || !isset( $string ) || !isset( $is_nullable ) ) return;
if( $is_nullable == 'YES' && empty( $string ) ) return true;
if( ($is_nullable == 'YES' && !empty( $string ) ) OR ( $is_nullable == 'NO' ) ) $empty = ( !empty( $string ) );
switch( $type ) {
case 'twoLetters':
if( $empty
&& isset( $string )
&& preg_match_all( '/^[a-z]{2}$/i',$string, $coin ) ) {
/* print_r($coin); */
return true;
} else { return false; }
}
}
}
?>
Ahora que ya tenemos creado el archivo con las clases, procedemos a crear dos archivos adicionales en php para poner a prueba la funcionalidad de nuestro recurso a través del navegador web.
Así deben ir nuestros dos archivos php (ej, archivo1.php y archivo2.php):
<?php
require_once( "./language.class.php" );
$lang = new language( 'en' );
$hl = $lang->hl;
var_dump( $_SESSION['hl'] );
echo "<br /><br />";
echo ( ( $hl == "es" )
? "Lenguaje del sitio establecido para español"
: ( ( $hl == "en" )
? "Site language set for english"
: ( ( $hl == "fr" )
? "Langue du site définie pour le français"
: ( ( $hl == "pt" )
? "Idioma do site definido para português"
: "No definido" ) ) ) );
echo "<br /><br />";
?>
require_once( "./language.class.php" );
$lang = new language( 'en' );
$hl = $lang->hl;
var_dump( $_SESSION['hl'] );
echo "<br /><br />";
echo ( ( $hl == "es" )
? "Lenguaje del sitio establecido para español"
: ( ( $hl == "en" )
? "Site language set for english"
: ( ( $hl == "fr" )
? "Langue du site définie pour le français"
: ( ( $hl == "pt" )
? "Idioma do site definido para português"
: "No definido" ) ) ) );
echo "<br /><br />";
?>
Explicación de nuestros archivos de navegación php.
Los dos archivos php creados deben contener un objeto inicializado con el valor de la clase «language», no sin antes invocar el recurso principal «language.class.php».
require_once( "./language.class.php" );
Esta línea llama el archivo donde está ubicada nuestra clase.$lang = new language( 'en' );
Inicializamos nuestro objeto.$hl = $lang->hl;
Asignamos el valor de $lang->hl (propiedad de nuestro objeto) a la variable $hl.Con archivo1.php y archivo2.php lo que buscamos es evaluar el valor de la sesión cuando pasemos de un archivo a otro; en el navegador podemos hacer uso de la variable «hl» de la siguiente manera: archivo.php?hl=en o archivo.php?hl=es o archivo.php?hl=fr o archivo.php?hl=pt.
Consulta Lo+ Top de Lenguajes De Programación