varios una página presentaría poner para pagina multilenguaje lenguajes idiomas idioma declarar cómo contenido con como codigo cambiar php mysql internationalization multilanguage

php - una - Cómo hacer un sitio web multilenguaje



declarar idioma php (5)

Ahora estoy diseñando un CMS muy pequeño que debe ser multilenguaje.

Una de las características que más me preocupa, es que el cliente puede decidir agregar o eliminar un idioma de forma espontánea.

Por esta razón, no estoy apuntando el diseño agregando sufijos a las tablas de la base de datos, no puedo (y no quiero) modificar los nombres de las tablas o acceder a ellos usando nombres dinámicos, ni agregar o eliminar campos cada vez que se define o elimina un idioma .

Tampoco usaría archivos, solo porque me gustan las bases de datos y son fáciles de mantener.

Y por último, creo que en dos tipos de traducción:

  1. El texto de la web.
  2. El contenido del texto.

Por lo tanto, mi diseño apunta a:

  • lenguajes Una tabla con los idiomas definidos.
  • Traducciones Una sola tabla que tendrá todos los mensajes, de la siguiente manera:
    • [pk] nombre_tabla el nombre de la tabla a la que se traducirá el contenido.
    • [pk] nombre_campo el nombre del campo al que se traducirá el contenido.
    • [pk] row_id el identificador de fila para el elemento que se traducirá.
    • [pk] idioma el idioma al que se traduce el texto.
    • texto el texto traducido.

Eso significa que las tablas cuyos campos tendrán contenido en un escenario de un solo idioma, ahora tendrán su contenido nulo, porque siempre estará en la tabla de traducciones.

Eso aumentará la complejidad de las consultas de SQL, pero me permite desarrollar herramientas para mantener las traducciones de una manera fácil. Además, la complejidad del sql existirá solo una vez, solo cuando se implementa la solución. Si esa implementación está diseñada adecuadamente, el mantenimiento / la extensibilidad del sitio no tiene por qué ser un problema importante.

Editar :

Después de una conversación con amigos desarrolladores, creo que la solución que estoy abordando aquí tiene demasiada carga en una sola tabla.

Otro enfoque que estudiaré a partir de ahora es crear una tabla adicional para cada "tabla traducible" de la siguiente manera:

  • any_translatable_table: la tabla que necesita traducir cualquiera de sus campos
  • any_translatable_table_translations: la tabla donde se almacenarán las traducciones.
    • [pk] nombre_campo el nombre del campo al que se traducirá el contenido.
    • [pk] row_id el identificador de fila para el elemento que se traducirá.
    • [pk] idioma el idioma al que se traduce el texto.
    • texto el texto traducido.

Este esquema hereda los conceptos del primero, pero separa su contenido por tablas. Esta solución alternativa puede aumentar el rendimiento y aislar los problemas (como problemas de índices).

La tabla de traducción adicional por "tabla traducible" se creará al mismo tiempo que la original.

Y sobre las consultas SQL, la complejidad sigue siendo la misma: el primer enfoque necesita el nombre de la tabla para buscar en la tabla de traducciones, pero el segundo solo agrega el sufijo "_translations" en el nombre de la tabla.

¿Puede alguien decirme cómo hacer un sitio web dinámico en varios idiomas en PHP y MySQL? No tengo idea de ello. Busqué en Google y no encontré ninguna buena solución.

¿Puede alguien proporcionarme una guía paso a paso? Si es posible, haga una demostración de un sitio web en varios idiomas. O por favor remítame a cualquier enlace donde explique los detalles al respecto.



La solución que siempre uso es crear una tabla de base de datos, con todos los mensajes posibles. Para cada mensaje utilizo un código (abreviatura) para buscarlo. Así por ejemplo:

lang id message en login Login en lostpass Lost your password? de login Anmelden de lostpass Paswort vergessen? nl login Aanmelden nl lostpass Wachtwoord vergeten?

La búsqueda de las traducciones suele ser lo suficientemente rápida utilizando una consulta de MySQL, pero también puede colocar todos los mensajes en una matriz y cargarlos en la memoria cuando se carga el script. Los usuarios siempre deben poder configurar el idioma que prefieran, no confíe ciegamente en el encabezado de idioma establecido por el navegador web.


Puede usar el lenguaje más fácil PHP Multi Language Class - LangQuery

Puede guardar sus datos de idioma en archivos .ini en lugar de llamarlo por

include("LangQuery.php"); $L=new LangQuery(); // Write Hello World echo($L(''hello_world'')); // Write Hello World Easier - In-line Echo Feature // You don''t have to write echo. Just add ''>'' $L(''>hello_world''); // Use in Strings echo("Hello Universe. {$L(''hello_world'')} Hello Europe"); // Write my age with parameter $L(">my_age",25); // Write my name and age with parameters $L(">my_name_age","Recep",25);


Respuesta corta: no hay una respuesta corta, ya que hay muchas variables a considerar y mucho trabajo por hacer. Asi que...

Respuesta larga: lo desglosaré lo mejor que pueda, pero no hay una respuesta "buena para todos" a una pregunta tan amplia como la suya.

En primer lugar, las variables de la tarea en cuestión:

  1. Lista de idiomas: ¿estará su sitio en un conjunto predefinido de idiomas, o será variado / heterogéneo? Por ejemplo, un sitio puede ser completamente bilingüe en dos idiomas bien definidos (o, para poner otro ejemplo, tengo un sitio en inglés / catalán / español); o diferentes secciones podrían estar disponibles en diferentes conjuntos de idiomas (por ejemplo, consulte los sitios de MS: en su mayoría son homogéneos, pero elementos como blogs, artículos de KB y algunos documentos están disponibles en un subconjunto de los idiomas supuestamente compatibles).

  2. Fuente de las traducciones: ¿el contenido lo proporciona usted o algún colaborador en cada idioma relevante? ¿O algunas versiones se ejecutan a través de un software de traducción de un solo idioma "base"? El primer enfoque requiere mucho trabajo adicional para producir los contenidos, pero produce resultados de mayor calidad que el segundo.

  3. Idiomas en sí mismos: una vez que haya respondido 1) y 2), deberá saber exactamente con qué idiomas está trabajando. Tenga en cuenta que en el caso de que incluya dialectos (por ejemplo, inglés de EE. UU. + Inglés de Reino Unido, o español de España + español de España), puede encontrar algunos problemas de "contenido duplicado" en los motores de búsqueda, pero los detalles son demasiado erróneos aquí mencionando por lo que son conscientes de los problemas potenciales).

  4. ¿Está apuntando a los idiomas en el resumen? (Por ejemplo, mi sitio ofrece los tres idiomas sin importarles dónde está el visitante: eso es lo que tengo, así que elija lo que prefiera); ¿O más bien apuntando a diferentes regiones / países? En el último caso, las cosas pueden volverse más complejas, ya que es posible que deba preocuparse por otras cosas además de los idiomas (como zonas horarias, monedas o convenciones de formato de fecha y hora, por nombrar algunas), pero obtiene la ventaja de poder usarlas. TLD específicos del país.

Una vez que tenga lo anterior bien definido, comencemos a trabajar. Estas son las tareas más importantes que deberías realizar:

  1. Detección de idioma: el enfoque más razonable es usar un parámetro GET (algo como? Lang = en-us en la URL). Además, puede usar alguna cookie y / o geolocalización de IP para retroceder cuando se solicite una URL sin argumento de idioma. Además, si tiene los medios, considere el tema del embellecimiento de URL (¿qué se ve mejor: example.com/index.php?lang=en-us o example.com/en-us/home ?). Personalmente, me encanta el poder que otorga ModRewrite a mi archivo .htaccess, pero eso solo funcionará en servidores con Apache.

  2. Administración de contenido: independientemente de si está obteniendo contenido de una base de datos (como el contenido del artículo), incluye archivos (típicos para las migas de pan, menús, encabezados de todo el sitio, etc.) o cualquier otro medio, necesitará alguna forma de separar cada versión (Idioma) del contenido. Aquí hay algunos ejemplos de cómo se puede hacer:

    • Para el contenido de DB, mi mejor consejo es crear un patrón de denominación de campo sólido y atenerse a él. Por ejemplo, _en , _es o _ca a todos los campos dependientes del idioma de mi base de datos. De esta manera, puedo acceder al contenido correcto con expresiones como $row["title_$lang"] .
    • Para incluir archivos, una vez más, una convención de nomenclatura de archivos es el enfoque más sensato. En mi caso, tengo nombres de archivo que terminan con .en.php , .ca.htm , etc. Mis llamadas de inclusión luego parecen include("some-filename.$lang.php) .
    • De vez en cuando, escupirá pequeños trozos de texto directamente de su código PHP (por ejemplo, al etiquetar los encabezados de una tabla). Puede usar un archivo de inclusión por idioma que defina una matriz de "fragmentos" con las mismas claves, o una tabla de base de datos como sugirió Geert. El primer enfoque requiere menos trabajo para desarrollarse, el último debería tener menos trabajo para mantener (especialmente si no está trabajando solo).
  3. Selección de idioma: bastante esencial, debe proporcionar a sus usuarios una forma de elegir su propio idioma, además de ajustar los argumentos GET en la propia URL. Para algunos idiomas, las "banderas" a menudo funcionan muy bien, ya que pueden entenderse incluso si la página inicialmente ha recurrido a un idioma que el usuario no conoce en absoluto. Para más idiomas, un menú desplegable parece más eficiente (en términos de espacio de la ventana gráfica), pero debe asegurarse de agregar algunas sugerencias visuales (es decir, no textuales). Algunos sitios lo obligan a elegir un idioma al ingresar, y solo tienen enlaces a la página de inicio en cada idioma. Personalmente, tengo mis tres banderas destacadas en la parte superior del menú de mi sitio, y cada una apunta a la dirección actual con solo el argumento de idioma cambiado. Un código como este puede funcionar bastante bien:

function translatedURI($new_lang) { return str_replace("lang=$lang", "lang=$new_lang", "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; }

  1. Ajuste de CMS: si su sitio (o parte de él) está utilizando algún tipo de CMS, panel de discusión, etc., las cosas pueden ser bastante complicadas. Hablando desde mi propia experiencia, tengo un foro phpBB en mi sitio dividido en tres categorías principales (una por idioma), de manera que se parecen a tres foros independientes (pero los usuarios solo necesitan iniciar sesión / registrarse en uno de ellos para obtener acceso a todos los idiomas, ya que de hecho son solo categorías del mismo tablero). Los ajustes que tuve que hacer para que esto funcionara sin problemas amenazaron los últimos restos de cordura que aún conservo: S. Para estos casos, le aconsejo que busque los documentos y las funciones de soporte del software específico que está utilizando.

Bueno, eso es todo lo que puedo sacar por ahora. Creo que deberías tener suficiente para levantarte las mangas y empezar a trabajar. Luego, si golpea un muro en su camino, regrese con preguntas específicas y estoy seguro de que obtendrá respuestas más específicas.

Espero que esto ayude.