Best practice multi language website

He estado luchando con esta pregunta durante algunos meses, pero no he estado en una situación en la que necesitaba explorar todas las opciones posibles antes. En este momento, siento que es hora de conocer las posibilidades y crear mi propia preferencia personal para usar en mis próximos proyectos.

Déjame primero esbozar la situación que estoy buscando

Estoy a punto de actualizar / volver a desarrollar un sistema de administración de contenido que he estado usando durante bastante tiempo. Sin embargo, siento que el lenguaje múltiple es una gran mejora para este sistema. Antes no usé ningún framework, pero usaré Laraval4 para el próximo proyecto. Laravel parece ser la mejor opción de una forma más limpia para codificar PHP.Sidenote: Laraval4 should be no factor in your answer. Estoy buscando formas generales de traducción que sean plataformas / marcos independientes.

Lo que debería traducirse

Como el sistema que busco debe ser lo más fácil para el usuario, el método de gestión de la traducción debe estar dentro del CMS. No debería ser necesario iniciar una conexión FTP para modificar los archivos de traducción o cualquier plantilla analizada html / php.

Además, estoy buscando la forma más fácil de traducir varias tablas de bases de datos, quizás sin la necesidad de hacer tablas adicionales.

¿Qué se me ocurrió?

Como ya he estado buscando, leyendo y probando cosas. Hay un par de opciones que tengo. Pero todavía no siento que haya alcanzado un método de mejor práctica para lo que realmente estoy buscando. En este momento, esto es lo que he encontrado, pero este método también tiene sus efectos secundarios.

Plantillas PHP analizadas: el sistema de plantillas debe ser analizado por PHP. De esta manera puedo insertar los parámetros traducidos en el HTML sin tener que abrir las plantillas y modificarlas. Además de eso, las plantillas PHP analizadas me dan la posibilidad de tener 1 plantilla para el sitio web completo en lugar de tener una subcarpeta para cada idioma (que he tenido antes). El método para alcanzar este objetivo puede ser Smarty, TemplatePower, Laravel's Blade o cualquier otro analizador de plantillas. Como dije, esto debería ser independiente de la solución escrita.Base de datos impulsada: tal vez no necesito mencionar esto otra vez. Pero la solución debe ser basada en la base de datos. El CMS está orientado a objetos y MVC, por lo que necesitaría pensar en una estructura de datos lógica para las cadenas. Como mis plantillas estarían estructuradas: templates / Controller / View.php quizás esta estructura tendría más sentido:Controller.View.parameter. La tabla de la base de datos tendría estos campos un largo con unavalue campo. Dentro de las plantillas podríamos usar algún método de clasificación comoecho __('Controller.View.welcome', array('name', 'Joshua')) y el parámetro contieneWelcome, :name. Así, el resultado esWelcome, Joshua. Esto parece ser una buena forma de hacerlo, ya que el editor puede entender fácilmente los parámetros como: nombre.Carga de base de datos baja: Por supuesto, el sistema anterior causaría cargas de carga de base de datos si estas cadenas se cargan sobre la marcha. Por lo tanto, necesitaría un sistema de almacenamiento en caché que reproduzca los archivos de idioma tan pronto como se editan / guardan en el entorno de administración. Debido a que los archivos se generan, también se necesita un buen diseño del sistema de archivos. Supongo que podemos ir conlanguages/en_EN/Controller/View.php o .ini, lo que más te convenga. Tal vez un .ini se analiza incluso más rápido al final. Esta forma debe contener los datos en elformat parameter=value; . Supongo que esta es la mejor manera de hacerlo, ya que cada vista que se representa puede incluir su propio archivo de idioma, si existe. Los parámetros de idioma se deben cargar en una vista específica y no en un ámbito global para evitar que los parámetros se sobrescriban entre sí.Base de datos de traducción de tablas: De hecho, esto es lo que más me preocupa. Estoy buscando una manera de crear traducciones de Noticias / Páginas / etc. lo más rápido posible. Teniendo dos tablas para cada módulo (por ejemploNews yNews_translations) es una opción pero se siente como mucho trabajo para obtener un buen sistema. Una de las cosas que se me ocurrió está basada en undata versioning Sistema que escribí: hay un nombre de tabla de base de datosTranslations, esta tabla tiene una combinación única delanguage, tablename yprimarykey. Por ejemplo: en_En / News / 1 (refiriéndose a la versión en inglés de la noticia con ID = 1). Pero hay 2 grandes desventajas de este método: en primer lugar, esta tabla tiende a ser bastante larga con una gran cantidad de datos en la base de datos y, en segundo lugar, sería una tarea tremenda usar esta configuración para buscar en la tabla. P.ej. la búsqueda del slug SEO del elemento sería una búsqueda de texto completo, lo cual es bastante tonto. Pero, por otro lado, es una forma rápida de crear contenido traducible en cada tabla muy rápido, pero no creo que este pro sobrepase a las estafas.Trabajo de front-end: También el front-end necesitaría pensar un poco. Por supuesto, almacenaríamos los idiomas disponibles en una base de datos y (des) activar los que necesitamos. De esta manera, el script puede generar un menú desplegable para seleccionar un idioma y el back-end puede decidir automáticamente qué traducciones se pueden hacer usando el CMS. El idioma elegido (por ejemplo, en_EN) se usaría al obtener el archivo de idioma para una vista o para obtener la traducción correcta para un elemento de contenido en el sitio web.

Entonces, ahí están. Mis ideas hasta ahora. Ni siquiera incluyen opciones de localización para fechas, etc., pero como mi servidor admite PHP5.3.2 +, la mejor opción es usar la extensión intl como se explica aquí:http://devzone.zend.com/1500/internationalization-in-php-53/ - Pero esto sería de utilidad en cualquier estadio posterior de desarrollo. Por ahora, el problema principal es cómo tener las mejores prácticas de traducción del contenido en un sitio web.

Además de todo lo que expliqué aquí, todavía tengo otra cosa que aún no he decidido, parece una pregunta simple, pero de hecho me ha estado dando dolores de cabeza:

Traducción de URL? ¿Debemos hacer esto o no? y de que manera

Así que ... si tengo esta url:http://www.domain.com/about-us y el inglés es mi idioma por defecto. Si esta URL se traduce ahttp://www.domain.com/over-ons ¿Cuando elijo el holandés como mi idioma? O debemos ir por el camino fácil y simplemente cambiar el contenido de la página visible en/about. Lo último no parece una opción válida porque eso generaría varias versiones de la misma URL, lo que indizará el contenido fallará de la manera correcta.

Otra opción es usarhttp://www.domain.com/nl/about-us en lugar. Esto genera al menos una URL única para cada contenido. También sería más fácil ir a otro idioma, por ejemplo.http://www.domain.com/en/about-us y la URL proporcionada es más fácil de entender tanto para los visitantes de Google como para los humanos. Usando esta opción, ¿qué hacemos con los idiomas predeterminados? ¿Debería el idioma predeterminado eliminar el idioma seleccionado por defecto? Tan redireccionandohttp://www.domain.com/en/about-us ahttp://www.domain.com/about-us ... En mi opinión, esta es la mejor solución, porque cuando el CMS se configura para un solo idioma, no es necesario tener esta identificación de idioma en la URL.

Y una tercera opción es una combinación de ambas opciones: usar la opción "language-identification-less" -URL (http://www.domain.com/about-us) para el idioma principal. Y use una URL con un slug de SEO traducido para los sublenguajes:http://www.domain.com/nl/over-ons & http://www.domain.com/de/uber-uns

Espero que mi pregunta te rompa la cabeza, ¡seguro que me rompieron la mía! Ya me ayudó a resolver las cosas como una pregunta aquí. Me dio la posibilidad de revisar los métodos que he usado antes y la idea que tengo para mi próximo CMS.

¡Me gustaría agradecerle por tomarse el tiempo para leer este montón de texto!

// Edit #1:

Olvidé mencionar: la función __ () es un alias para traducir una cadena dada. Dentro de este método, obviamente debería haber algún tipo de método alternativo en el que se cargue el texto predeterminado cuando aún no haya traducciones disponibles. Si falta la traducción, debe insertarse o el archivo de traducción debe regenerarse.

Respuestas a la pregunta(13)

Su respuesta a la pregunta