pagina idiomas idioma cambiar php internationalization yii

idiomas - cambiar idioma pagina web php



Yii: sitio web multilingüe: mejores prácticas (4)

Encuentro a Yii great framework, y el sitio web de ejemplo creado con yiic shell es un buen punto para comenzar ... sin embargo, no cubre el tema de los sitios web en varios idiomas, desafortunadamente. Los documentos cubren el tema de la traducción de mensajes cortos, pero no mantienen el contenido multilingüe ...

Estoy a punto de comenzar a trabajar en un sitio web que debe estar en al menos dos idiomas, y me pregunto cuál es la mejor manera de mantener el contenido para eso ... El problema es que el contenido se mezcla de manera exhaustiva con elementos comunes (como archivos de video incrustados).

Necesito evitar la duplicación de esos recursos comunes ... hasta ahora solía tener una matriz de matrices que contenían textos (por lo general, no más de 1-2 párrafos cortos), y luego el archivo de vista simplemente representaba el texto de una matriz.

Ahora me gustaría evitar mantenerlo en matrices (lo que requiere un poco de atención al poner citas dobles "" y es un inconveniente en general ...).

Entonces, ¿cuál es la mejor manera de mantener esos párrafos cortos? ¿Debo guardarlos en DB como (id | msg_id | idioma | contenido) y luego seleccionarlos por msg_id & language? Eso todavía requiere que cree algunos msg_id y los incruste en el archivo de vista ...

¿Hay algún paradigma recomendado para el cual Yii tenga algunas soluciones?

Gracias.


Bueno, creo que lo que aquí interesa es cómo traducir texto / mensajes estáticos en la página y Yii lo resuelve bastante bien usando Yii: t () y la respuesta de Edigu es por eso.

Compruebo la publicación en FlexicaCMS sobre la traducción de contenido dinámico en la base de datos, y finalmente será la siguiente después de que resuelvas el problema de texto / mensaje estático, y ese es un enfoque realmente bueno usando el comportamiento de Yii. No estoy seguro si los autores de FlexicaCMS son demasiado ambiciosos para apoyar la traducción de esa manera, ya que haría que la traducción de contenido fuera algo sin preocupaciones, realmente genial.

Una cosa que no mencionan es la url de la página traducida. Por ejemplo, your.site.com/fr/translated_article_title.html. Me refiero a que la url debe tener / language_id / part en ella, así que puede ayudar con el SEO.


Gettext es bueno para su facilidad de traducción, pero la implementación predeterminada de PHP no es segura para subprocesos. Por lo tanto, Yii usa su propio desempaquetador, lo que aumenta drásticamente el tiempo de procesamiento en comparación con las matrices php.

Dado que estaba configurando un sitio de alto volumen y alta transacción, el impacto en el rendimiento no era aceptable. Además, al usar APC, podríamos almacenar en caché la traducción de PHP para aumentar aún más el rendimiento.

Mi enfoque era, por lo tanto, utilizar matrices PHP, pero mantener las traducciones en un DB para facilitar la traducción, generando los archivos necesarios cuando se cambian las traducciones.

El DB es similar a esto:

TABLE Message // stores source language, updated by script id INT UNSIGNED category VARCHAR(20) // first argument to Yii::t() key TEXT // second argument to Yii::t() occurences TINYINT UNSIGNED // number of times found in sources TABLE MessageTranslation // stores target language, translated by human id INT UNSIGNED language VARCHAR(3) // ISO 639-1 or 639-3, as used by Yii messageId INT UNSIGNED // foreign key on Message table value TEXT version VARCHAR(15) creationTime TIMESTAMP DEFAULT NOW() lastModifiedTime TIMESTAMP DEFAULT NULL lastModifiedUserId INT UNSIGNED

Luego modifiqué el comando yiic ''message'' de la herramienta CLI para volcar las cadenas recopiladas en el DB.

http://www.yiiframework.com/wiki/41/how-to-extend-yiic-shell-commands/

Una vez en el DB, se puede configurar un CMS simple para proporcionar a los traductores una forma fácil de traducir y, al mismo tiempo, proporcionar información de versiones, volver a versiones anteriores, verificar la calidad de los traductores, etc.

Otro script, también modificado de yiic, luego toma la información de DB y la compila en matrices de PHP. Básicamente un JOIN de las dos tablas para cada idioma, luego crea una matriz usando ''Mensaje''. ''Clave'' y ''MessageTranslation''. ''Value'' como (¿qué más?) Key => value ... guardando en el archivo llamado from '' Mensaje ''.'' Categoría ''en la carpeta especificada por idioma.

Los archivos generados se cargan normalmente por Yii CPhpMessageSource.

Para las imágenes, esto fue tan simple como ubicarlas en carpetas con el lenguaje adecuado y obtener el idioma de la aplicación al enlazar.

<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">

Tenga en cuenta que en la vida real, escribí un pequeño método de ayuda para quitar el país de la cadena de idioma, ''en_us'' debe ser ''en''.


Una aplicación Yii utiliza de manera predeterminada el método yii :: t () para traducir mensajes de texto y hay 3 tipos diferentes para las fuentes de mensajes:

  1. CPhpMessageSource : las traducciones se almacenan como pares clave-valor en una matriz de PHP.
  2. CGettextMessageSource : Las traducciones se almacenan como archivos GNU Gettext. (Archivos PO)
  3. CDbMessageSource : las traducciones de mensajes se almacenan en tablas de la base de datos.

Si no entiendo mal, está utilizando matrices clásicas para las traducciones. Te recomiendo usar archivos GetText y PO con Yii para operaciones de traducción.

Puede encontrar mucha información sobre traducción e i18n con yii en esta página de documentación oficial .


En Yii1 y Yii2 yii / i18n / GettextMessageSource no utiliza el motor de caché perfecto Yii de todos modos (consulte la fuente) para mejorar la carga de los archivos PO o MO. No se recomienda cargar estos archivos mediante el uso de código puro php (incluido yii / i18n / GettextMessageSource) (es mucho más lento que php array idx): http://mel.melaxis.com/devblog/2006/04/10/benchmarking- php-localización-es-gettext-rápido-suficiente /

Sin embargo, php gettext ext para archivos MO es un poco más rápido que la traducción php array porque usa caché, pero el punto negativo es: cada cambio en MO requiere el reinicio del servidor.

Creo que la mejor solución sería extender yii / i18n / GettextMessageSource en su propia biblioteca de códigos y agregar la capacidad de caché a GettextMessageSource para mejorar su rendimiento y usar su versión extendida como componente.

protected function loadMessages($category, $language);

Simplemente no verifique la fecha de modificación de MO en cada carga para compararla con la memoria caché, en su lugar borre la caché cuando se modifiquen los archivos MO o PO (puede ser una programación).