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 location
campo 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 alt
y title
atributos de enlaces anteriores / siguientes . Traducido. Pero mi módulo no lo sabe. Y nunca debería necesitarlo.
wget
o lo que sea. Hackish, pero dijiste que estaba permitido (:Respuestas:
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
t()
, luego registrar esas instancias en la base de datos, luego traducir todas esas instancias registradas det()
una vez. No creo que sea una opción que tengamos en nuestra mesa.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
t()
ocurre una llamada ). Necesitamos un modelo de datos proactivo, uno en el que la aplicación se encargue de buscart()
instancias antes de que el cliente las ejecute realmente.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óndet()
ocurre. Incluso si pudiéramos codificar el idioma de destino en lat()
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
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?
Cuando el cliente luego toma
/pl/product/200
, usted viaja a la base de datos, busca el producto 200 y toma lapl
traducció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
product
entidades, vaya alURL alias
campo, 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 datosEn 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
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 ~
fuente
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:
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.
La cadena está disponible en el cliente de localización para el primer idioma que visite para el mismo nodo
Aquí hay un ejemplo:
fuente
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
en preproceso.
y el archivo .tpl.php será
fuente
title
textos 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 necesidadesalt
ytitle
, 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.AFAIK con el extractor de plantillas de Traducción puede extraer la cadena dentro de todas sus llamadas a la
t()
función.Lea esto ¿Cómo traducir un módulo?
fuente