"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Wagtail crea traducción de página mediante programación

Wagtail crea traducción de página mediante programación

Publicado el 2024-11-08
Navegar:350

Wagtail programmatically create page translation

No puedo encontrar ninguna interfaz programática para crear la traducción de la página. Todas las lógicas parecen estar implementadas en SubmitTranslationView en wagtail.contrib.simple_translation.views.

Entonces, la única forma de acceder a ellos mediante programación es simulando la solicitud para acceder a las vistas. Envolví esto en una función llamada Translate_page(). Para traducir una página, podemos llamar a esta función como:-

page_ja = translate_page(user, page, "ja")

O podemos pasar el parámetro opcional include_subtree:-

page_ja = translate_page(user, page, "ja", include_subtree=True)

Y la función se define como:-

def translate_page(user, page, lang, include_subtree=False):
    locale, created = Locale.objects.get_or_create(language_code=lang)
    data = {"locales": [locale.id], "include_subtree": include_subtree}
    url = reverse(
        "simple_translation:submit_page_translation", kwargs={"page_id": page.id}
    )
    factory = RequestFactory()
    request = factory.post(url)
    request.POST = data
    request.user = user
    get_response = lambda request: None
    middleware = SessionMiddleware(get_response)
    middleware.process_request(request)
    request.session.save()
    messages = FallbackStorage(request)
    setattr(request, "_messages", messages)

    SubmitPageTranslationView.model = type(page)
    SubmitPageTranslationView.as_view()(request, page_id=page.pk)
    page_translated = page.get_translations()[0].specific
    return page_translated

Tengo otra función llamada Translate_snippet(). La única diferencia es solo la URL para enviar y ningún parámetro include_subtree.

Errores del árbol de páginas

Para todos nuestros sitios, tenemos un script de configuración que completará automáticamente algunas publicaciones y su traducción para que el desarrollador pueda comenzar a trabajar de inmediato en lugar de tener que crear páginas de muestra manualmente.

La estructura de nuestra página es así:-

HomePage ==> BlogIndexPage ==> BlogPage

Y el script de configuración hará lo siguiente:-

  • Cree el usuario administrador raíz, llamémoslo usuario uno.
  • Crear instancia de página de inicio
  • Adjuntar página de inicio como nueva página raíz
  • Crear traducción japonesa de la página de inicio
  • Crear instancia de BlogIndexPage
  • Completa la página de blog con publicaciones de muestra y adjúntalas en BlogIndexPage
  • Traducir BlogIndexPage con include_subtree=True

Todo esto funciona bien hasta que configuremos un nuevo sitio donde esté la estructura de la página:-

BlogIndexPage ==> BlogPage

Así que omitimos la página de inicio (que ahora creo que es una mala idea, pero guardémosla para otro tema) ya que este sitio es principalmente un blog. Lo primero que noto después de ejecutar el script de configuración es que no se creó ninguna traducción de las publicaciones del blog, a pesar de que ya pasamos include_subtree al traducir BlogIndexPage.

Mi primera reacción visceral fue que podrían haber algunos cambios en las nuevas versiones de lavandera. La mayoría de nuestros sitios se crearon hace unos años y todavía están en lavandera 5, pero para este nuevo sitio, comenzaremos con lavandera 6 ya que es la última.

Pero al observar los registros de confirmación de lavandera para simple_translation views.py, los últimos cambios en el código fueron hace tres años. Y podemos ver el código básicamente el mismo entre la lavandera 5 y 6.

El problema con la función Translate_page anterior es que no busca ningún error. Porque detectar errores significa que debe analizar la respuesta de la solicitud en busca de alguna cadena de error. Pero rastrear el flujo del código me lleva a una etapa en la que puedo ver que el código no se ejecuta porque el formulario no está validado.

Los errores de formulario de impresión mostraron mensajes de error relacionados con una configuración regional no válida. Esto es extraño porque podemos ver en la función Translate_page anterior que estamos creando la configuración regional si aún no existe.

E imprimiendo las opciones self.fields["locales"] del formulario. Puedo ver que la configuración regional está ahí en la elección durante la primera llamada de Translate_page() al traducir la página raíz, pero las opciones estaban vacías al llamarla por segunda vez. traducir BlogIndexPage.

Al leer el código del formulario, las opciones del campo local se configuran dinámicamente en el método __init__, donde se eliminará la configuración regional de la página que ya se tradujo. Esta podría ser la razón por la que el local quedó vacío en la segunda convocatoria. ¡Pero la página aún no está traducida!

Recordemos el proceso:-

  • Crear página de índice de blog
  • Adjuntar BlogIndexPage a la página raíz
  • Traducir página raíz a ja
  • Rellene BlogPage y adjúntelos a BlogIndexPage
  • Traducir BlogIndexPage a ja

Y aquí es donde entró la bombilla (?), después de horas de depuración. En el script original, primero traducimos HomePage a ja y luego a BlogIndexPage con todos sus elementos secundarios. Pero en este nuevo script, la página raíz es BlogIndexPage. ¡Así que BlogIndexPage ya se tradujo la segunda vez que llamamos a Translate_page!

Esa es la razón por la que las opciones locales quedan vacías.

Declaración de liberación Este artículo se reproduce en: https://dev.to/k4ml/wagtail-programmatically-create-page-translation-2814?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3