He estado luchando con esta pregunta durante algunos meses, pero no he estado en una situación en la que necesite 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.
Permítanme primero esbozar la situación que estoy buscando.
Estoy a punto de actualizar / volver a desarrollar un sistema de gestió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 usaba ningún framework, pero voy a usar Laraval4 para el próximo proyecto. Laravel parece la mejor opción de una forma más limpia de codificar PHP. Sidenote: Laraval4 should be no factor in your answer
. Estoy buscando formas generales de traducción que sean independientes de la plataforma / marco.
Lo que debe traducirse
Como el sistema que busco debe ser lo más fácil de usar posible, 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 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 crear tablas adicionales.
¿Qué se me ocurrió?
Como ya he estado buscando, leyendo y probando cosas yo mismo. Hay un par de opciones que tengo. Pero todavía no siento que haya alcanzado un método de mejores prácticas para lo que realmente estoy buscando. En este momento, esto es lo que se me ocurrió, pero este método también tiene efectos secundarios.
- Plantillas analizadas en PHP: PHP debe analizar el sistema de plantillas. 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 analizadas de PHP 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.
- Basada en la base de datos : tal vez no necesito mencionar esto nuevamente. Pero la solución debe ser impulsada por la base de datos. El CMS está destinado a ser orientado a objetos y MVC, por lo que necesitaría pensar en una estructura de datos lógica para las cadenas. Como mis plantillas se estructurarán: Plantillas / Controlador / view.php quizá Esta estructura tendría más sentido:
Controller.View.parameter
. La tabla de la base de datos tendría estos campos largos con unvalue
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
. Esta parece una buena manera de hacerlo, porque los parámetros como: nombre son fáciles de entender por el editor. - Carga baja de la base de datos : por supuesto, el sistema anterior provocaría cargas de carga de la base de datos si estas cadenas se cargan sobre la marcha. Por lo tanto, necesitaría un sistema de almacenamiento en caché que vuelva a procesar los archivos de idioma tan pronto como se editen / guarden en el entorno de administración. Debido a que se generan archivos, también se necesita un buen diseño del sistema de archivos. Creo que podemos ir con
languages/en_EN/Controller/View.php
o .ini, lo que más te convenga. Quizás un .ini incluso se analice más rápido al final. Esto 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 deben cargarse en una vista específica y no en un ámbito global para evitar que los parámetros se sobrescriban entre sí. - Traducción de la tabla de base de datos : 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. Tener dos tablas para cada módulo (por ejemplo
News
yNews_translations
) es una opción, pero se siente mucho trabajo para obtener un buen sistema. Una de las cosas que se me ocurrió se basa 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 del elemento News con ID = 1). Pero hay dos grandes desventajas en 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 un trabajo tremendo usar esta configuración para buscar en la tabla. Por ejemplo, buscar la babosa 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 profesional sobrepase los contras. - Trabajo front-end : también el front-end necesitaría algo de reflexión. Por supuesto, almacenaríamos los idiomas disponibles en una base de datos y (des) activaría 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. todavía, 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 útil 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? ¿Deberíamos hacer esto o no? y de que manera
Entonces ... si tengo esta url: http://www.domain.com/about-us
y el inglés es mi idioma predeterminado. ¿Debería traducirse esta URL http://www.domain.com/over-ons
cuando elijo holandés como mi idioma? ¿O deberíamos 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 múltiples versiones de la misma URL, esta indexación del contenido fallará de la manera correcta.
Otra opción está usando en su http://www.domain.com/nl/about-us
lugar. Esto genera al menos una URL única para cada contenido. Además, 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. Con esta opción, ¿qué hacemos con los idiomas predeterminados? ¿Debería el idioma predeterminado eliminar el idioma seleccionado por defecto? Entonces, redirigir http://www.domain.com/en/about-us
a http://www.domain.com/about-us
... En mi opinión, esta es la mejor solución, porque cuando el CMS está configurado 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 el "idioma-identificación-menos" -URL ( http://www.domain.com/about-us
) para el idioma principal. Y use una URL con una babosa SEO traducida para sublenguajes: http://www.domain.com/nl/over-ons
&http://www.domain.com/de/uber-uns
Espero que mi pregunta haga que se te quiebren las cabezas, ¡seguro que me hicieron 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 de 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 donde el texto predeterminado se carga cuando aún no hay traducciones disponibles. Si falta la traducción, debe insertarse o el archivo de traducción debe regenerarse.