2010-03-23 26 views
23

encuentro 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 sitios web multilingües, desafortunadamente . Los documentos cubren el tema de la traducción de mensajes cortos, pero no mantienen el contenido multilingüe ...Yii: sitio web multilingüe: mejores prácticas

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 forma extensiva con elementos comunes (como archivos de video incrustados).

Necesito evitar la duplicación de esos bienes 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), entonces 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 comillas dobles "" y es un inconveniente en general ...).

Entonces, ¿cuál es la mejor manera de mantener esos párrafos cortos? ¿Debo guardarlos en DB like (id | msg_id | language | content) y luego seleccionarlos por msg_id & language? Eso todavía me obliga a crear algunos msg_id's e incrustarlos en el archivo de visualización ...

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

Gracias, m.

método

Respuesta

17

aplicación A Yii por defecto usa yü :: t() para la traducción de mensajes de texto y hay 3 tipos diferentes de fuentes de mensajes:

  1. CPhpMessageSource: Traducciones se almacenan como pares de valores clave en un PHP formación.
  2. CGettextMessageSource: Las traducciones se almacenan como archivos Gettext de GNU. (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 acerca de la traducción y i18n con yii en este official documentation page.

+0

Problema con GetText IMO es que son difíciles de mantener y mantenerse actualizados, también puede encontrarse con problemas atómicos. Mi método preferido es la base de datos para que pueda actualizar los mensajes sobre la marcha. Si realmente deseas velocidad, GetText es más rápido; de lo contrario, DB es el camino a seguir. – Atherion

+0

NOTA: Recomiendo no usar GettextMessageSource sin caché.El rendimiento puro de PHP gettext es mucho más lento que php array (yii2 mismo usa matrices php) porque lee los archivos repetidamente, sin embargo usar php gettext extension (versus gettext pure php code) es un poco más rápido que php array pero usar php ext requiere reiniciar el servidor por cada cambio http://mel.melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/ – Alix

1

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 ello.

Reviso la publicación en FlexicaCMS sobre la traducción de contenido dinámico en la base de datos, bueno, en última instancia será el siguiente después de resolver 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.

19

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.

Como estaba configurando un sitio de alto volumen y alta transacción, el rendimiento no fue 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.

La base de datos 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 

que modifica entonces la herramienta de comandos CLI yiic 'mensaje' para volcar los hilos recogidos en la base de datos.

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

Una vez en la base de datos, un simple CMS puede ser configurado para proporcionar traductores una manera fácil de traducir y, al mismo tiempo que proporciona la información de versiones, volviendo a las versiones anteriores, la comprobación de la calidad de los traductores, etc ..

Otra secuencia de comandos, también modificada de yiic, toma la información de base de datos 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 era tan simple como ubicarlas en carpetas con el lenguaje adecuado y obtener el idioma de la aplicación al vincularlas.

<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 a quitarse el país de la cadena de idioma, 'en_US' debe ser 'es'.

0

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 para cargar estos archivos mediante php código puro (incluyendo yü \ i18n \ GettextMessageSource) (es tan lento que PHP matriz IDX): http://mel.melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/

Sin embargo php ext gettext para los archivos de MO se encuentra a pocos más rápido que php traducción array porque usa caché pero el punto negativo es: cada cambio en MO requiere 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 comprueban MO fecha de modificación en cada carga para comparar con el caché, en lugar borrar la caché cuando se cambian los archivos MO o PO (que puede ser un calendario).

Cuestiones relacionadas