¿Cómo hacer cadenas de plantillas traducibles en todas las páginas que aparecen?

14

Tengo algunas llamadas a t()archivos * .tpl.php. Por el bien de ejemplo, digamos que estoy hablando de productos y archivo product.tpl.php.

Las cadenas en las plantillas no se reconocen hasta la primera vez que se usan realmente. Había un hilo en Drupal.org sobre eso y encontré que era preciso. Lamentablemente, si voy a, digamos, http://example.com/pl/product/200 , esa cadena se guardará en la {locales_source}tabla con el locationcampo establecido en /pl/product/200.

Necesito que mis usuarios puedan traducir utilizando la herramienta de traducción en el sitio del módulo de cliente de localización , para que puedan ver realmente lo que están traduciendo y tenerlo en el contexto adecuado. Con la ubicación de origen establecida en /pl/product/200, el producto con ID 200 es el único en el que se muestra que la cadena se traduce. Y lo que es peor, si puedo obligar a los usuarios a traducir en ese producto en particular, también necesito que puedan traducir al ruso, y no hay ningún producto con la ubicación establecida /ru/product/PID.

¿Hay alguna forma de volver a formatear la cadena de ubicación en la base de datos, para hacer que todas las cadenas sean visibles en todos los productos, todos los idiomas en la herramienta l10n_client?

Traté de configurarlo para:

  • ; sites/default/themes/mytheme/product.tpl.php,
  • sites/default/themes/mytheme/product.tpl.php,
  • sites/default/modules/mymodule/mymodule.module (módulo que genera datos temáticos)

Pero solo los hizo invisibles para la herramienta de traducción.

Estoy bastante seguro de que no es un error en el cliente de localización , muestra la cadena donde se dice que ocurrió esta cadena. Y parece que también es "exactamente como funciona" para el sistema de traducción Drupal 7, ya se discutió y se informó, y nada cambió. Así que este no es un informe de error, solo pregunto cómo trabajar con lo que tenemos que trabajar.


Estoy hablando de textos que no tienen nada que ver con el funcionamiento del módulo de datos . No quiero traducir productos, solo cadenas de plantillas que no tienen nada que ver con el producto en sí, como Anterior - Siguiente en la plantilla de la galería de imágenes del producto.

Por ejemplo, el módulo devuelve 15 miniaturas, y el trabajo de un tema es mostrar 5 a la vez. Y las necesidades alty titleatributos de enlaces anteriores / siguientes . Traducido. Pero mi módulo no lo sabe. Y nunca debería necesitarlo.

Mołot
fuente
No estoy seguro de haber entendido completamente lo que quieres, pero ¿sería suficiente rastrear el sitio en todos los idiomas? Podrías usar, por ejemplo. xmlsitemap para generar los enlaces en varios idiomas y luego usar wgeto lo que sea. Hackish, pero dijiste que estaba permitido (:
Andy
@Andy Localization Client permite a los usuarios abrir una barra en la parte inferior de una página y traducir los textos que aparecen en esa página directamente, cuando los ven. Puedo exportar todos los textos correctamente, pero ese no es exactamente el punto.
Mołot
1
Recuerdo de drupal_set_message () y dpm (), que estos mensajes se pondrán en cola para la próxima solicitud, si se llama, por ejemplo, desde page.tpl.php. Esto se debe a que las plantillas generalmente se procesan bastante tarde en una solicitud, después de que se procesan los mensajes. Algo similar podría ser el caso con t () y el cliente de localización.
donquixote
Buena pregunta. Buen problema
barista aficionado
Solo una sugerencia ... si desea que sus usuarios puedan traducir sus cadenas tpl t () en cualquier momento en cualquier idioma, puede extraer estas cadenas con el Extractor de plantillas de traducción ( drupal.org/project/potx ) y darles el .po original, que podrían traducir con una herramienta como Poedit? ( poedit.net ). Al presentar estas cadenas como unas pocas estáticas, cada traductor haría el trabajo a la vez ...
Kojo

Respuestas:

5

Su requisito:
para que mi sitio funcione en varios idiomas
como usuario autenticado
, necesito poder traducir de inmediato todas y cada una de las llamadas de traducción encontradas en la base de código de mi sitio que se realizaron con la función t ().

¿Es esa descripción del requisito incluso cercana a lo que está pidiendo?


Rastreadores

Como alguien dijo, un rastreador teóricamente podría recorrer todo el sitio para forzar el registro de todas las llamadas t (). Pero 1) el rastreador no sabe qué páginas rastrear; 2) por lo tanto, no buscamos mantener una lista de páginas para rastrear; 3) no queremos usar un rastreador, punto. Eww. Solo, eww. ¿Derecho?


El problema

  1. No tenemos una lista de todas las cadenas de traducción.
  2. Drupal / PHP es un lenguaje dinámico a diferencia de C que se compila. Por lo tanto, no podemos ir y decir, por ejemplo: compilar toda esta base de código, luego encontrarme todas las instancias de esta función t(), luego registrar esas instancias en la base de datos, luego traducir todas esas instancias registradas de t()una vez. No creo que sea una opción que tengamos en nuestra mesa.
  3. Una herramienta de análisis de código estático sería inútil por la misma razón que un rastreador sería inútil. Encontré esto t()en este archivo. ¡Excelente! ¿En qué URL se usa? ¿Cuál es el contexto?

Atacar el problema con las herramientas actuales (Drupal y algunos módulos contrib) y con las restricciones actuales (confiando en llamadas de tema en tiempo real -> archivos de plantilla -> t()llamadas), parece un callejón sin salida aquí. Es posible que debamos pensar un poco fuera de la caja.


Lo que necesitamos

  1. Necesitamos una fuente de datos, un modelo, que me diga qué cadenas de traducción actuales tenemos y cuál es su contexto.
  2. Modelo de datos proactivo. El modelo de datos actual es reactivo (el modelo se actualiza cada vez que t()ocurre una llamada ). Necesitamos un modelo de datos proactivo, uno en el que la aplicación se encargue de buscar t()instancias antes de que el cliente las ejecute realmente.
  3. Necesitamos contexto. t()solo no es suficiente, porque no sabemos que estamos traduciendo 'foo', pero el idioma de destino al que estamos traduciendo depende de la URL de dónde t()ocurre. Incluso si pudiéramos codificar el idioma de destino en la t()llamada, digamos, usando una llamada envolvente, no funcionaría para sus propósitos.

He identificado algunas de las herramientas que, si las tuviéramos, ayudarían a nuestro problema. Con estas herramientas podríamos entrar en el modelo de datos y decir: dame todas las cadenas envueltas t()que aún no se han poblado. Ahora inserte estas traducciones. Gracias.

Y la próxima vez que venga el cliente, las traducciones estarán ahí.

¿Cómo podríamos ... construir estas herramientas?


Restricciones

  1. El idioma de destino no puede estar en la plantilla, eso lo decide la URL. Suponiendo que la cadena debe admitir cualquier idioma.
  2. La cadena traducida no puede estar en la plantilla. La traducción residirá en una base de datos.

Ahora que he pensado más en el problema e identificado algunos desafíos y limitaciones, puedo pensar en buscar cualquier solución disponible, o en hacer soluciones personalizadas.

Lluvia de ideas sobre soluciones

Necesito algo que vincule "todo". ¿Qué pasa con ... una entidad?

  • Una entidad puede mantener el producto que necesita ser traducido.
  • Las entidades pueden proporcionar la relación, el pegamento, entre el producto que necesita ser traducido y su contexto.
  • La entidad puede especificar, por ejemplo, en un campo, la ubicación de URL predeterminada del producto.
  • Los tokens se pueden usar para especificar ubicaciones alternativas (¿idiomas?) En las que aparecerá el producto.
  • Las entidades nos proporcionan el modelo de datos proactivo que necesitamos y su contexto. Lo que a su vez nos permite hacer cosas como: ir a la base de datos, tomar todas las entidades del producto y, si no tienen una cadena de traducción para los campos X, Y y Z, crear esas cadenas de traducción.

Cuando el cliente luego toma /pl/product/200, usted viaja a la base de datos, busca el producto 200 y toma la pltraducción ya existente . ¿También tiene un campo de título y título para ese producto? Las traducciones también deberían estar allí.

Tenga en cuenta que estoy siendo muy vago y genérico aquí en términos de qué módulo de traducción está utilizando. Muy bien podría terminar usando su propio módulo de traducción, lo más probable es que este sea el caso. Todos los modelos de traducción que he visto en Drupal hasta ahora (a partir de D7, todavía no he visto D8) son reactivos, no proactivos.

En una palabra

En teoría, las herramientas para construir lo que necesita están allí, siendo las entidades el componente clave que uniría todo: - datos (cadena de traducción), - idiomas de destino. No tiene que estar en la Entidad misma, preferiblemente un vocabulario de taxonomía, digamos para los idiomas de los productos. o tal vez una taxonomía genérica para otras entidades también. - Contexto. La URL en la que aparece la entidad. La URL contendría un token, y el token a su vez haría referencia a la taxonomía del idioma de destino.

Con esos tres ingredientes puede decir: Tome todas las productentidades, vaya al URL aliascampo, obtenga el token de taxonomía, recorra todas las combinaciones de términos posibles, presente todas las combinaciones al usuario actual usando una forma fea muy grande, o AJAX, y formularios de varios pasos (algo así), y como el usuario actualmente conectado traduce los distintos idiomas para el producto 200, guárdelos en algún lugar de la base de datos

En algún lugar de la base de datos podría haber un campo de API de campo en la entidad, el campo de configuración que pertenece a cada entidad (no es exactamente la API de campo, pero aún puede contener datos), o una tabla separada que use para esto. Creo que guardar los datos en la Entidad mantendría el código y los datos más ordenados y fáciles.


Construyéndolo: posibles soluciones

  • D8MI (Iniciativa multilingüe Drupal 8)
  • Código personalizado: traducciones "indexadas" disponibles en plantillas por t () mediante consultas programáticas y renderizando paquetes disponibles y sus implementaciones de enlaces de temas relacionados.

Pseudocódigo

Para cada entidad (de tipo x),
encuentre todos los idiomas (taxonomía o lenguaje central asociado con el producto),
renderice la entidad,
para detectar sus cadenas de traducción t ()
, renderice el tema de llamadas (), que maneja la capa de presentación multilingüe de el producto, no el modelo de datos del producto en sí.

Resultado:
- La primera llamada para representar la plantilla de entidad en cada idioma devuelve la implementación del idioma predeterminado para cada llamada.
- Los parámetros t () en la plantilla ahora se almacenan en caché en Drupal y están listos para la traducción (para cada instancia de idioma, no para cada instancia de producto).
- El usuario con el rol de "traductor" ahora puede ir a la interfaz de traducción y traducir todos los parámetros t () disponibles, para cada idioma.
- El propietario del sitio no necesita esperar a que los clientes visiten cada página de producto, o visitar cada página de producto manualmente, ya que esto se hizo mediante programación para él.

Preguntas abiertas:
- ¿Cuál es el contexto? Si hago una llamada programática a theme () para cada paquete de entidad "producto", ¿registra la ubicación desde la que se realizó la llamada? ¿Registra la URL del nodo? ¿Se puede alterar el "contexto"? ¿Dónde se registra el contexto? ¿Qué sucede cuando tiene plantillas "dinámicas", es decir, cuando tiene más de una plantilla por producto y cómo detecta esas variaciones?

Como siempre, teorizar y seudocódigo solo es bueno para una lluvia de ideas. Pero en el desarrollo apenas sabremos a qué nos enfrentamos realmente hasta que empecemos a crear prototipos. Entonces, habiendo elaborado un par de restricciones, posibles soluciones y posibles problemas o preguntas, ahora puedo proceder a implementar una prueba de concepto o un prototipo de trabajo. Algunas de las preguntas abiertas anteriores solo se pueden responder de esta manera, y cuanto antes creamos prototipos (independientemente del éxito o el fracaso), podemos comenzar a responder algunas de esas preguntas, o cambiar el enfoque por completo. Estén atentos ~

barista aficionado
fuente
1
Incluso sin leer toda la publicación, ese tipo de respuesta merece un voto positivo
Oleg Videnov
El punto es que la herramienta que dice que está haciendo exactamente lo que necesito para Drupal 7 ya existe. Es solo un problema con Drupal guardar estas cadenas con metadatos incorrectos. Pero puedo cambiar dichos metadatos en db una vez que se recopilan las cadenas, no hay problema. Solo necesito saber en qué configurarlos, para que la herramienta pueda verlo. O al menos creía que era lo que necesitaba. Y lo más importante: no quiero traducir productos, solo cadenas de plantillas que no tienen nada que ver con el producto en sí, como Anterior - Siguiente en la plantilla de la galería de imágenes del producto.
Mołot
2

Ok, pasé más tiempo con el módulo de traducción de entidad y cliente de localización para reproducir el mismo escenario. Dado que esta respuesta es totalmente diferente de la anterior, agregue como comentario separado:

  1. La traducción agregada para un idioma en un / primer nodo está disponible para todos los nodos.

    Aquí hay un ejemplo:

    • Si agrego un nuevo producto del mismo tipo que nid 200 y visito la traducción pl del nuevo nodo (digamos pl / product / 204), vería la misma cadena de traducción en pl / product / 200.

    • La única diferencia es que no aparece en el cliente de localización. Podemos solicitar esta función en la cola de problemas del módulo, sin embargo, introduciría más confusión ya que la traducción no es específica de la página actual y afectaría a todas las páginas (es decir, tanto pl / product / 200 como pl / product / 204).

    • Si los dos nodos creados por dos personas diferentes, y el último quiere cambiar la traducción, entonces tienen que usar la traducción de la interfaz.

  2. La cadena está disponible en el cliente de localización para el primer idioma que visite para el mismo nodo

    Aquí hay un ejemplo:

    • Si agrego el nuevo producto nid 199 y creo la traducción para el lenguaje 'pl' (nid 200) y la traducción para el lenguaje 'rs' (nid 201), puede ver la cadena solo en la página 'pl', no en la página 'rs'. Nuevamente, esto parece una restricción en el módulo del cliente de localización.
vijaycs85
fuente
1

Su enfoque para agregar la cadena de traducción en el nivel de plantilla o archivo de módulo puede funcionar para la interfaz de usuario de traducción de interfaz, pero no para el cliente de localización.

Obviamente, cuando tenga la versión rusa del producto 200, será un nuevo nodo, por ejemplo / ru / product / 201, donde podrá traducir utilizando el cliente de localización.

Solo un pensamiento: busque una cadena que se pueda traducir para todos los idiomas en la interfaz de usuario de traducción de interfaz y solicite al cliente que traduzca el nivel del producto cuando sea realmente necesario. Aquí hay un ejemplo:

"Este es el producto de la barra de categoría"

y si estamos seguros de que además de 'foo' y 'bar' pueden ser comunes, podemos agregar

$vars['product_title'] = t('This is product @product of category @category')

en preproceso.

y el archivo .tpl.php será

<?php t($product_title, array('@product' => t('foo'),  '@category' => t('bar')); ?>
vijaycs85
fuente
Se trata más de titletextos para flechas en rotador de imágenes. A mi módulo no le importa cómo el tema mostrará 15 imágenes. Y el tema se muestran 5 a la vez, con flechas "siguiente" "anterior" y que las necesidades alty title, necesidades y traducirlas. Es posible modificar el módulo cada vez que cambie mi front-end, pero ciertamente no debería ser necesario. Estas cadenas no tienen nada que ver con el módulo en sí. Por último, pero no menos importante, es posible que simplemente no esté al tanto de las cadenas en el tema cambiado. O no está disponible para migrarlos al módulo.
Mołot
En mi humilde opinión, este caso debe manejarse en la interfaz de usuario de traducción en lugar de cliente de localización.
vijaycs85
El cliente de localización tiene como objetivo "corregir las traducciones en su sitio a medida que vea los problemas". - ¿Por qué no debería aplicarse a los archivos de plantilla? Las cadenas en tpl son aún más sensibles al contexto que aparecen, si acaso.
Mołot
1

AFAIK con el extractor de plantillas de Traducción puede extraer la cadena dentro de todas sus llamadas a la t()función.

El extractor de plantillas de traducción proporciona una interfaz de extractor de plantillas de traducción Gettext basada en web y de línea de comandos para Drupal, así como una API reutilizable para buscar cadenas traducibles y errores de traducibilidad. Esta herramienta se utiliza bajo el capó en http://localize.drupal.org/ también para servir como una máquina de análisis para los lanzamientos de proyectos de Drupal.org.

Lea esto ¿Cómo traducir un módulo?

Adrian Cid Almaguer
fuente