PHP:como crear una pagina de varios idiomas

De Foros del Web


-- lobo_php 17 Sept 2009

Compañeros, aqui les va un pequeño manual donde puede cambiarl el idioma a sus paginas, es mas que todo usado en formularios, pero puede servir para otras cosas. En este caso he tomado como ejemplo las politicas de foros del web y solo dos idiomas: Español e Ingles.

Primero que todo, debemos crear un script donde podemos crear nuestros idiomas, las frases que usaremos y en los dos idiomas (o en los que prefieran) Aqui crearemos una clase donde tenga una variable publica llamada "$idioma", cuyo contenido es un array, q tiene dentro dos arrays, espanol e ingles. cada uno tendra su clave y su contenido. como podran observar:

idiomas.php

<?php
class idiomas{
    public $idioma;
    function  __construct() {
        $this->idioma =
        array(
            espanol => array(
                0=>"Pol&iacute;ticas de Foros del Web",
                1=>"Como toda comunidad, tenemos algunas normas que en aras de una mejor convivencia y con el objeto de respetar una igualdad de derechos y deberes, todos debemos cumplir.",
                2=>"Es nuestro interés promover la libertad de conocimiento y expresión, por lo que no censuraremos mensajes basados en las opiniones expresadas y publicadas en dichos mensajes, pero haremos cumplir las normas y políticas descritas tanto aquí mismo como en cualquier otro lugar de Foros del Web.",
                3=>"Normas generales",
                4=>"El hecho de ignorar o desconocer las normas y políticas de Foros del Web, no exime a ningún usuario de su cumplimiento. Es obligación de todos los usuarios leer y adherirse a las normas aquí descritas y a las especificadas en cualquier otro foro, tema o categoría de Foros del Web.",
                5=>"Nos reservamos el derecho de mover, borrar, editar o cerrar temas o mensajes que incumplan las normas y políticas establecidas en Foros del Web o por cuestiones administrativas, a nuestra discreción y sin explicación previa o posterior.",
                6=>"El idioma de preferencia en Foros del Web es el español (castellano), por lo que agradecemos el uso moderado de cualquier otro lenguaje.",
                7=>"Los usuarios de Foros del Web sólo podrán tener una cuenta por persona, y cada cuenta podrá ser manejada por una persona únicamente. Las cuentas adicionales podrán ser suspendidas (baneadas) sin aviso previo o posterior al usuario.",
                8=>"El incumplimiento de las normas y políticas de Foros del Web, así como cualquier ofensa, agresión o expresión de insulto dirigida a cualquier usuario de Foros del Web, podrá resultar en la expulsión inmediata del usuario agresor y en la eliminación de todos sus mensajes.",
                9=>"Normas de los foros y categorías",
                10=>"Las siguientes normas aplican a todos los foros y categorías:",
                11=>"Los usuarios de Foros del Web no pueden publicar en el cuerpo de los mensajes productos, servicios, enlaces, contenidos o cualquier otro tipo de información que haga referencia a la empresa o sitio web con la que están relacionados directa o indirectamente, con clara intención o propósito publicitario, compra/venta, comercial o de autopromoción. Esto incluye sugerir sus propios servicios y los servicios de asociados, clientes y empleadores.",
                12=>"Está prohibido publicar enlaces (links o URL) que incluyan algún sistema de comisiones, afiliados, referidos o cualquier otro sistema del tipo pago por clic (pay per click), tanto en el cuerpo de los mensajes como en el espacio destinado a la firma de usuario.",
                13=>"Los usuarios no pueden publicar mensajes para insinuar o instruir a otro(s) miembro(s) para que revisen su cuenta de correo electrónico, su buzón de mensajes privados, o para indicarles de alguna manera que tienen un nuevo mensaje privado o de correo electrónico, con el objeto de solicitar u ofrecer una respuesta con respecto al tema en cuestión. Tampoco está permitido enviar publicidad u ofertas de servicios no solicitados a través de mensajes privados y/o correo electrónico a otros usuarios de Foros del Web.",
                14=>"No está permitido iniciar dos o más temas con respecto al mismo tópico o asunto, ni publicar dos o más mensajes cuyos contenidos coincidan dentro de un mismo tema en un mismo foro o en vários foros. Dichos temas o mensajes publicados podrán ser eliminados o unidos sin aviso previo o posterior.",
                15=>"Los usuarios no pueden publicar mensajes en nombre o representación de usuarios suspendidos (baneados).",
                16=>"No está permitido publicar palabras, enlaces o cualquier otro contenido que haya sido censurado en Foros del Web. Tampoco está permitido eludir la censura añadiendo espacios o cualquier otro caracter, substituyendo caracteres, o utilizando cualquier otro método para evitarla. Algunas personas y empresas han solicitado expresamente a Foros del Web que no desean que sus enlaces (link o URL) sean mencionados en los temas y mensajes que eventualmente pueden llegar a publicar los usuarios de Foros del Web.",
                17=>"Los usuarios deben publicar al menos treinta (30) mensajes para tener la capacidad de incluir cualquier enlace (link o URL) o dirección de correo electrónico en el cuerpo de sus mensajes o en sus firmas de usuario y para poder usar el sistema de mensajes privados.",
                18=>"Los usuarios no pueden revivir o reactivar temas publicando información inútil o sin sentido, o llevando a cabo cualquier otra acción para deliberadamente mantener arriba en el índice del foro dicho tema.",
                19=>"Los usuarios no pueden usar los temas o discusiones para promover, recomendar, alabar o desacreditar otros productos, servicios, empresas o sitios web, sin tener experiencia directa o de primera mano con esos productos, servicios, empresas o sitios web.",
                20=>"Los usuarios no pueden publicar, solicitar ni difundir información que promueva el plagio, la piratería, la divulgación de números de serie, crack o similares, o copias no autorizadas de material protegido por derechos de autor.",
                21=>"Los usuarios deben usar un lenguaje cortés, respetuoso y gentil. Ningún usuario puede publicar material o contenido que sea conocidamente falso, difamatorio, insultante, acosatorio, vulgar, hostil, obsceno, profano, de orientación sexual, amenazante, racista o que fomente cualquier tipo de odio, ilegal en algún país o región, invasivo de la privacidad de alguna persona o que vulnere alguna ley o derechos de autor.",
                22=>"Los usuarios no pueden publicar, solicitar ni difundir información que promueva la realización de ningun ilícito en su jurisdicción, incluyendo pero no limitado a: fraudes electrónicos, SPAM, Phishing, Spoofing, Forgery y cualquier otro tipo de conducta que sea considerada un acto ilegal.",
                23=>"Uso de las firmas de usuario",
                24=>"La firma de usuario debe establecerse desde el panel de control de usuario. No está permitido insertar la firma de usuario manualmente en el cuerpo de los mensajes. El usuario deberá utilizar la opción Editar Firma para tal efecto.",
                25=>"La firma de usuario no puede contener ofertas de productos o servicios, ni precios, planes o especificaciones comerciales, ni enlaces (links o URL) que incluyan algún sistema de comisiones, afiliados, referidos o cualquier otro sistema del tipo pago por clic (pay per click).",
                26=>"Al editar las firmas, el sistema del foro automáticamente validará el código BB permitido para aplicarles formato. Entre las principales restricciones, la firma solo podrá tener 200 caracteres, 4 líneas y no podrán aplicarse colores.",
                27=>"La firma podrá contener únicamente 2 enlaces.",
                28=>"Normas de los Contenidos y su licencia",
                29=>"Desde el 1 de Julio del 2007 se entiende que todos los contenidos que los usuarios publican a partir de dicha fecha son otorgados bajo <a onclick=\"pageTracker._trackPageview ('/outgoing/http_creativecommons_org_licenses_by_nc_sa_3_0_deed_es');\" href=\"http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es\" target=\"_blank\">licencia Creative Commons BY-NC-SA</a>, salvo que el autor exprese lo contrario en cada mensaje que publique.",
                30=>"Esta regla aplica únicamente para los contenidos originales que cada usuario envíe al foro, no así a imágenes que provengan de servidores externos o cualquier otro contenido protegido por leyes de propiedad intelectual utilizados en el marco legal.",
                31=>"El cumplimiento de las normas aquí expuestas nos beneficia a todos. Gracias por vuestra cooperación.",
                32=>"Atentamente,",
                33=>"El equipo de Foros del Web"
            ),
            ingles => array(
                0=>"Policies of Forums of the Web ",
                1=>"Like any community, we have some rules for the sake of better living and in order to respect equal rights and duties, all must comply.",
                2=>"It is our interest to promote freedom of knowledge and expression, so do not censor messages based on the views expressed and published in such messages, but we will enforce the rules and policies outlined both here and elsewhere on the Web Forums.",
                3=>"General rules",
                4=>"The fact of ignoring or disregarding the rules and policies Forum Web, does not exempt any user compliance. It is the duty of all users read and adhere to standards described herein and those specified in any other forum, topic or category of Web Forums.",
                5=>"We reserve the right to move, delete, edit, or close topics or posts that violate established rules and policies on Web Forums or administrative matters, at our discretion and without prior or subsequent explanation.",
                6=>"The preferred language on the Web Forums is the Spanish (Castilian), and we appreciate the moderate use of any other language.",
                7=>"The Web Forums users may only have one account per person, and each account can be operated by one person only. Additional accounts may be suspended (baneadas) without notice or later users.",
                8=>"The breach of the rules and policies of Web Forums and any offense, assault or insult directed expression to anyone on the Web Forums, may result in immediate expulsion from the user aggressor and the elimination of all your messages.",
                9=>"Rules of forums and categories",
                10=>"The following rules apply to all forums and categories:",
                11=>"The Forum's Web users can not publish in the message body products, services, links, content or any other information that refers to the business or website with which they are related directly or indirectly, with the clear intention or serve advertising, purchase / sale, commercial or self promotion. This includes suggesting your own services and those of partners, clients and employers.",
                12=>"is prohibited from posting links (links or URLs) that include some form of commissions, affiliates, referrals or any other system like pay per click (pay per click), both in the body of messages as in the space for signature user.",
                13=>"users can not post messages to suggest or instruct other (s) Member (s) to review their e-mail account, your private voicemail, or indicate somehow that they have a new private message or email mail, in order to request or provide a response on the issue in question. Nor is it allowed to send advertising or unsolicited offers of services through private messages and / or e-mail to other users of the Web Forums.",
                14=>"Not allowed to start two or more items from the same topic or issue, or publish two or more messages that coincide within the same topic in one forum or in various fora. These themes or messages published may be removed or attached without notice or later.",
                15=>"users can not post messages for or on behalf of users suspended (banned).",
                16=>"It is allowed to publish words, links or other content that has been censored in the Web Forums. You also may not circumvent censorship by adding spaces or any other character, replacing characters, or using any other method to prevent it. Some people and companies have expressly requested Forums website not want their link (link or URL) are mentioned in the themes and messages that can eventually reach users publish Web Forums.",
                17=>"Users must publish at least thirty (30) messages to be able to include any link (link or URL) or email address in the body of their messages in their signatures or user and to use the messaging system private.",
                18=>"users can not revive or restore items publishing information useless or meaningless, or performing any other action to deliberately keep up on the board index that theme.",
                19=>"The users can not use themes or discussions to promote, recommend, praise or disparage other products, services, companies or websites, without having direct experience or first-hand with these products, services, companies or websites.",
                20=>"Users may not publish, seek or disseminate information promoting plagiarism, piracy, dissemination of serial numbers, crack or the like, or unauthorized copies of material protected by copyright.",
                21=>"Users must use a language polite, respectful and kind. No user can post material or content that is knowingly false, defamatory, abusive, acosatorio, vulgar, harassing, obscene, profane, sexually oriented, threatening, racist or advocating any kind of hatred, illegal in some country or region, invasive the privacy of any person or that violates any law or copyright.",
                22=>"Users may not publish, seek or disseminate information that promotes unlawful conduct of any jurisdiction, including but not limited to: phishing, spam, phishing, spoofing, forgery and any other conduct that is considered an illegal act .",
                23=>"Using user signatures",
                24=>"The user signature must be established from the user control panel. It is not allowed user to insert the signature manually into the body of messages. The user must use the Edit Signature for that purpose.",
                25=>"The user signature can not contain offers of products or services, pricing, business plans or specifications, or links (links or URLs) that include some form of commissions, affiliates, referrals or any other system like pay per click (pay per click).",
                26=>"At the edit signatures, the system automatically validates Forum BB Code allowed for formatting. Among the major constraints, the firm may only be 200 characters, 4 lines and colors may not be applied.",
                27=>"The signature may only contain 2 links.",
                28=>"Rules of the Content and its license",
                29=>"From the July 1, 2007 means that all content that users post after that date are granted under <a onclick=\"pageTracker._trackPageview ('/outgoing/http_creativecommons_org_licenses_by_nc_sa_3_0_deed_es');\" href=\"http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es\" target=\"_blank\">license Creative Commons BY-NC-SA</a>, unless the author specifically designated otherwise on each message you post.",
                30=>"This rule applies only to the original content that each user submits to the forum, but not to images coming from external servers or any other content protected by intellectual property laws used in the legal framework.",
                31=>"Compliance with the standards presented here benefits us all. Thank you for your cooperation.",
                32=>"Sincerely,",
                33=>"The team of Foros del Web"
            )
        );
        return $this->idioma;
    }
}
?>

luego vamos al index donde llamaremos las frases, por asi llamarlo, de los arrays creados, pero primero necesitamos otras configuraciones, tendremos una variable de sesion quien sera la que controle el idioma que estabamos viendo. por tal motivo primero iniciaremos las sesiones, si no hay ninguna sesion iniciada pues la creamos poniendole el idioma principal de la web, en este caso español, luego hacemos un require al script idiomas.php y definimos una variable "$palabra" de la clase "idiomas". Luego ponemos un combo donde estaran nuestros dos idiomas, noten que hay insersion de codigo php ahi, esto es para controlar que quede seleccionado el siempre el idioma "español" y se quede seleccionado el idioma que se ha escojido antes, esto es por que la pagina se recarga al realizar seleccionar el idioma que queremos para nuestra pagina. Al final vemos que entre codigo html insertarmos el codigo php, llamado a la variable "$palabra" y escojiendo la variable "idioma" que creamos en el anterior script (idiomas.php) y seleccionando dos cosas, la primera es el array que esta dentro de el array (recuerdan que dije que dentro del array "idioma" hay dos arrays: espanol e ingles) y luego escojemos la clave, para que nos sea trayendo su contenido/valor/descripcion, como deseen llamarlo.


<?php
    session_start();
    if(!isset($_SESSION['idioma'])){
        $_SESSION['idioma']="espanol";
    }
    require 'idiomas.php';
    $palabra = new idiomas();
?>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="idiomas.js"></script>
        <title>Pagina de idiomas</title>
    </head>
    <body>
        Ver esta pagina en otros idiomas&nbsp;
        <select id="select_idioma" name="select_idioma" onchange="cambio_idioma()">
            <option <?php if($_SESSION['idioma']=="espanol") echo "selected='selected'" ?> value="espanol">Espa&ntilde;ol</option>
            <option <?php if($_SESSION['idioma']=="ingles") echo "selected='selected'" ?> value="ingles">English</option>
        </select>
        <center><h1><?php
            echo $palabra->idioma[$_SESSION['idioma']][0]; ?></h1></center>
        <br>
 
<font color="Navy"><b><?php echo $palabra->idioma[$_SESSION['idioma']][1]; ?></b></font><br>
 <br><?php echo $palabra->idioma[$_SESSION['idioma']][2]; ?><br>
 <br>
 <b>1. <?php echo $palabra->idioma[$_SESSION['idioma']][3]; ?></b><br>
 <br>
 
<b> 1.1</b><?php echo $palabra->idioma[$_SESSION['idioma']][4]; ?><br>
 <br>
<b> 1.2</b><?php echo $palabra->idioma[$_SESSION['idioma']][5]; ?><br>
 <br>
<b> 1.3</b><?php echo $palabra->idioma[$_SESSION['idioma']][6]; ?><br>
 
 <br>
<b> 1.4</b><?php echo $palabra->idioma[$_SESSION['idioma']][7]; ?><br>
 <br>
<b> 1.5</b><?php echo $palabra->idioma[$_SESSION['idioma']][8]; ?><br>
 <br>
<b> 2. <?php echo $palabra->idioma[$_SESSION['idioma']][9]; ?> </b><br>
 
 <br>
 <?php echo $palabra->idioma[$_SESSION['idioma']][10]; ?><br>
 <br>
<b> 2.1</b> <?php echo $palabra->idioma[$_SESSION['idioma']][11]; ?><br>
 <br>
<b> 2.2</b> <?php echo $palabra->idioma[$_SESSION['idioma']][12]; ?><br>
 
 <br>
<b> 2.3</b><?php echo $palabra->idioma[$_SESSION['idioma']][13]; ?><br>
 <br>
<b> 2.4</b><?php echo $palabra->idioma[$_SESSION['idioma']][14]; ?><br>
 <br>
<b> 2.5</b><?php echo $palabra->idioma[$_SESSION['idioma']][15]; ?><br>
 
 <br>
<b> 2.6</b><?php echo $palabra->idioma[$_SESSION['idioma']][16]; ?><br>
 <br>
<b> 2.7</b><?php echo $palabra->idioma[$_SESSION['idioma']][17]; ?><br>
 <br>
<b> 2.8</b><?php echo $palabra->idioma[$_SESSION['idioma']][18]; ?><br>
 
 <br>
<b> 2.9</b><?php echo $palabra->idioma[$_SESSION['idioma']][19]; ?><br>
 <br>
<b> 2.10</b><?php echo $palabra->idioma[$_SESSION['idioma']][20]; ?><br>
 <br>
<b> 2.11</b><?php echo $palabra->idioma[$_SESSION['idioma']][21]; ?><br>
 
<br>
<b>2.12</b><?php echo $palabra->idioma[$_SESSION['idioma']][22]; ?><br>
 <br>
<b> 3. <?php echo $palabra->idioma[$_SESSION['idioma']][23]; ?></b><br>
 <br>
<b> 3.1</b><?php echo $palabra->idioma[$_SESSION['idioma']][24]; ?><br>
 
 <br>
 <b>3.2</b><?php echo $palabra->idioma[$_SESSION['idioma']][25]; ?><br>
 <br>
 <b>3.3</b><?php echo $palabra->idioma[$_SESSION['idioma']][26]; ?><br>
<br>
 <b>3.4</b><?php echo $palabra->idioma[$_SESSION['idioma']][27]; ?><br>
 
 <br>
<b> 4. <?php echo $palabra->idioma[$_SESSION['idioma']][28]; ?></b><br>
<br>
<b> 4.1</b><?php echo $palabra->idioma[$_SESSION['idioma']][29]; ?><br>
<br>
<b> 4.2</b><?php echo $palabra->idioma[$_SESSION['idioma']][30]; ?><br>
 
<br>
 <font color="Navy"><b><i><?php echo $palabra->idioma[$_SESSION['idioma']][31]; ?></i></b></font><br>
 <br>
 <?php echo $palabra->idioma[$_SESSION['idioma']][32]; ?><br>
 <b><br>
 <?php echo $palabra->idioma[$_SESSION['idioma']][33]; ?></b>
    </body>
</html>

bueno como veran hay algunas cosas que faltan, como el script que hemos llamado de "idiomas.js" Que tenemos aca? primero definimos un ajax para podernos comunicar con otro script de php. por que? por que en la funcion "cambio_idioma" (que llamamos en el evento onChange del select) tomamos el valor que tiene su respectiva opcion y se la mandamos a un script de php q toma una variable via get, llamada idioma, cuando el hace lo que tiene que hacer, termina recargando la pagina, pero no es precisamente un reload, sino que abre la direccion que esta abierta, jeje es como un reload XD

idiomas.js

//usamos ajax
function nuevoAjax()
{
	/* Crea el objeto AJAX. Esta funcion es generica para cualquier utilidad de este tipo, por
	lo que se puede copiar tal como esta aqui */
	var xmlhttp=false;
	try
	{
		// Creacion del objeto AJAX para navegadores no IE
		xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch(e)
	{
		try
		{
			// Creacion del objeto AJAX para IE
			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(E) { xmlhttp=false; }
	}
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp=new XMLHttpRequest(); }
 
	return xmlhttp;
}
 
//creamos la funcion que toma el idioma elegido
function cambio_idioma(){
    var idioma=document.getElementById("select_idioma").value;
    var ajax=nuevoAjax();
    ajax.open("GET", "cambia_idioma.php?idioma="+idioma, true);
    ajax.onreadystatechange=function(){
        if (ajax.readyState==4){
            document.location.href = document.location.href;
        }
    }
    ajax.send(null);
}


cuando llamamos al script de php por medio de ajax, lo que hacemos es muy sencillo, iniciamos las sesiones que esten abiertas, tomamos la variable que se nos fue enviada por metodo get desde el ajax y posteriormente cambiamos el valor de la sesion "idioma" por el valor que traia. por tal razon este es el script que permite cambiar el idioma :D no lo hago diferente por que ahora no me tengo espacio en mi cabeza para nuevas ideas locas XD y se me olvido como es que se manejan las sesiones por javascript :(

cambia_idioma.php

<?php
    session_start();
    $idioma_nuevo = $_GET['idioma'];
    $_SESSION['idioma']=$idioma_nuevo;
?>


espero que sea util esta informacion, como dije, es mas usado en formularios por que no tienen tanta informacion como esta, sin embargo se puede hacer, con frases, con parrafos, con palabras, como quieran.


saludos compañeros.

Este artículo es parte de las FAQs de PHP y el Manual de PHP.

Herramientas personales