php - texto - string strip_tags
El enfoque más eficiente para un sitio web PHP multilingüe (3)
Algunas consideraciones:
1. Traducciones
¿Quién hará las traducciones? ¿Personas que también están conectadas al sitio? ¿Una agencia de traducción? Cuando utilice Gettext, trabajará con archivos ''pot'' (.po). Estos archivos contienen el ID de mensaje y la cadena de mensaje (la traducción). Ejemplo:
msgid "A string to be translated would go here"
msgstr ""
Ahora, esto se ve bien y es comprensible para cualquiera que necesite traducir esto. Pero, ¿qué sucede cuando usa palabras clave, como sugiere Mike, en lugar de oraciones completas? Si alguien necesita traducir un msgid llamado "address_home", él o ella no tiene idea de si debe ser un encabezado "Home address" o si es una oración completa. En este caso, asegúrese de agregar comentarios al archivo justo antes de llamar a la función gettext, así:
/// This is a comment that will be included in the pot file for the translators
gettext("ready_for_lost_episode");
El uso de xgettext --add-comments=///
al crear los archivos .po agregará estos comentarios. Sin embargo, no creo que Gettext sea usado de esta manera. Además, si necesita agregar comentarios con cada texto que desea mostrar, a) probablemente cometerá un error en algún momento, b) de todos modos, el script completo se completará con los textos, solo en forma de comentarios, c) los comentarios deben colocarse directamente sobre la función Gettext, que no siempre es conveniente, dependiendo de la posición de la función en su código.
2. Mantenimiento
Una vez que su sitio crezca (aún más) y sus archivos de idioma junto con él, puede ser bastante difícil mantener todas las diferentes traducciones de esta manera. Cada vez que agrega un texto, necesita crear nuevos archivos, enviar los archivos a los traductores, recibir los archivos nuevamente, asegurarse de que la estructura esté intacta (los traductores ansiosos siempre están felices de traducir la sintaxis, haciendo que todo el archivo inutilizable :)), y termina con la importación de las nuevas traducciones. Es factible, claro, pero tenga en cuenta los posibles problemas en este extremo con sitios grandes y muchos idiomas diferentes.
Personalmente, me parece más útil administrar la traducción utilizando un CMS (simple), manteniendo las variables y las traducciones en una base de datos y exportando los textos relevantes a los archivos de idioma usted mismo:
- agregar variables a la base de datos (por ejemplo: id, página, variable);
- agregue traducciones a estas variables (por ejemplo: id, varId, idioma, traducción);
- Seleccione variables relevantes y traducciones, escríbalas en un archivo;
- incluya el archivo de idioma relevante en su sitio;
- crea tu propia función para mostrar un texto de variables:
text(''var'');
o tal vez algo como __(''faq'',''register'',''lost_password_text'');
El punto 3 puede ser tan simple como seleccionar todas las variables relevantes y las traducciones de la base de datos, ubicándolas en una matriz y escribiendo la matriz serializada en un archivo.
Ventajas:
Mantenimiento. Mantener los textos puede ser mucho más fácil para grandes proyectos. Puede agrupar variables por página, secciones u otras partes dentro de su sitio, simplemente agregando una columna a su base de datos que defina a qué parte del sitio pertenece esta variable. De esa manera, puede obtener rápidamente una lista de todas las variables utilizadas en, por ejemplo, la página de preguntas frecuentes.
Traductorio. Puede visualizar la variable con todas las traducciones de todos los diferentes idiomas en una sola página. Esto podría ser útil para las personas que pueden traducir textos a múltiples idiomas al mismo tiempo. Y podría ser útil ver otras traducciones para tener una idea del contexto para que la traducción sea lo mejor posible. También puede consultar la base de datos para averiguar qué se ha traducido y qué no. Tal vez agregue marcas de tiempo para realizar un seguimiento de posibles traducciones obsoletas.
Acceso. Esto depende de quién va a traducir. Puede envolver el CMS con un inicio de sesión simple para otorgar acceso a personas de una agencia de traducción, si es necesario, y solo permitirles cambiar ciertos idiomas o incluso ciertas partes del sitio. Si esta no es una opción, aún puede enviar los datos a un archivo que se puede traducir manualmente e importarlos más tarde (aunque esto podría tener los mismos problemas que se mencionaron anteriormente). Puede agregar una de las traducciones que ya está allí (inglés u otro idioma principal) como contexto para el traductor.
En general, creo que encontrará que tendrá mucho más control sobre las traducciones de esta manera, especialmente a largo plazo. No puedo decirle nada sobre la velocidad o la eficiencia de este enfoque en comparación con la función nativa de obtención de texto. Pero, dependiendo del tamaño de los archivos de idioma, no creo que sea una gran diferencia. Si agrupa las variables por página o sección, siempre puede incluir solo las partes requeridas.
Estoy trabajando en un gran sitio web multilingüe y estoy considerando diferentes enfoques para hacerlo multilingüe. Las posibles alternativas que se me ocurren son:
- Las funciones de Gettext con la generación de archivos .po
- Una tabla MySQL con las traducciones y una ID de cadena única para cada texto
- Archivos PHP con matrices que contienen las diferentes traducciones con ID de cadena únicas
Por lo que he entendido, las funciones Gettext deberían ser las más eficientes, pero mi requisito es que debería ser posible cambiar una cadena de texto en el idioma de referencia original (inglés) sin que las otras traducciones de esa cadena vuelvan automáticamente al inglés solo porque Un par de palabras cambiaron. ¿Es esto posible con Gettext?
¿Cuál es la solución que menos recursos requiere?
¿Es el uso de las funciones de Gettext o los archivos PHP con arreglos más o menos igualmente exigentes de recursos?
¿Alguna otra sugerencia para soluciones más eficientes?
Después de algunas pruebas, finalmente decidí ir más o menos con las líneas de la combinación de Alecs de la segunda y tercera alternativa.
Problema de gettext
Traté de configurar todo el sistema Gettext primero para probarlo, pero resultó ser mucho más complicado de lo que pensé. El problema es que los sistemas Windows y Unix usan nombres abreviados de idiomas diferentes para setlocale() . Por el momento estoy ejecutando mi servidor dev en Windows con Wamp , mientras que el sitio final se ejecutará en Linux. Después de revisar un par de dozen guides , forums , questions , etc., y reiniciar el servidor después de cada modificación. No pude configurarlo correctamente de la manera que parecía. Además, gettext no es seguro para subprocesos. Para actualizar el archivo de idioma, el servidor debe reiniciarse o debe utilizarse un truco . No hay una manera fácil de manejar diferentes versiones de archivos de idioma o manejar el texto original en inglés sin modificar la fuente o usar Mikes. Sugerencia, que como señaló Alec no es óptima.
Solución
Así que terminé con la que creo que es la mejor solución basada en la respuesta de Alecs:
- Guarda todas las traducciones en un DB con los campos; idioma, página, var_key, versión, revisión y last_modified_time - donde la versión corresponde a las versiones de la traducción original (inglés), mientras que la revisión permite al traductor modificar / corregir las traducciones finalizadas dentro de una versión.
- Use un tipo de CMS para la traducción, que está conectado a la base de datos y maneja diferentes versiones y permite una visión general fácil de qué idiomas están traducidos, en qué versión y qué tan completas están las traducciones.
- Cuando se finaliza una revisión de una versión, se generan archivos de caché: cada archivo contiene una matriz con solo la var_key y la traducción de texto para un idioma y una página y se nombran con los nombres ISO 639-1 de los idiomas y el nombre de la página like: lang / en_index.php Estos archivos de idioma se incluyen simplemente y se envuelven en una función t ($ var_key) que permite usar la base de datos durante el desarrollo, mientras que luego se cambian para usar solo los archivos de caché.
Actuación
Nunca llegué a probar gettext, pero según el enlace, Mike publicó la diferencia de rendimiento entre usar una matriz y gettext es totalmente aceptable para mí por los beneficios que ofrece un sistema personalizado como se describe anteriormente. Sin embargo, comparé el uso de una matriz con 20 cadenas de texto traducidas en una matriz en comparación con la recuperación de las mismas 20 cadenas de texto de una base de datos MySQL . Resultó que usar una matriz incluida desde un archivo era 6 veces más rápido que recuperar las 20 cadenas al mismo tiempo desde la base de datos MySQL. Realmente no fue un punto de referencia científico y los resultados pueden variar en diferentes sistemas y configuraciones, pero claramente muestra exactamente lo que esperaba, que sería mucho más lento usar una base de datos que usar una matriz directamente, por lo que elijo generar caché -archivos para la matriz en lugar de utilizar la base de datos.
Como comparación, también probé la rapidez con la que solo se generaron ecos simples con el mismo texto. Resultó ser aproximadamente 20 veces más rápido que usar arreglos de un archivo incluido, pero bueno, entonces no es posible traducir sin tener diferentes versiones de la página para diferentes idiomas, lo que desafía el propósito de las páginas dinámicas. Entonces es mejor usar también un buen sistema de caché .
Archivos fuente de prueba de rendimiento:
PHP: http://pastie.org/964082
Tabla de MySQL: http://pastie.org/964115
Seguramente no es perfecto, pero al menos crea una idea sobre las diferencias de rendimiento.
En lugar de tener que usar el texto en inglés como las claves, podría hacerlo de manera arbitraria, pero también proporcionar traducciones en inglés, es decir
La clave de gettext es ''hola''
A continuación, tiene las traducciones de varios idiomas de este y una traducción al inglés que también es ''hola''; luego, si desea actualizar la versión en inglés de la cadena, puede dejar la tecla sola y solo actualizar la traducción en inglés.