"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Wagtail cria tradução de página programaticamente

Wagtail cria tradução de página programaticamente

Publicado em 2024-11-08
Navegar:125

Wagtail programmatically create page translation

Não consigo encontrar nenhuma interface programática para criar tradução de páginas. Toda a lógica parece estar sendo implementada em SubmitTranslationView em wagtail.contrib.simple_translation.views.

Portanto, a única maneira de acessá-los programaticamente é simulando a solicitação de acesso às visualizações. Envolvi isso em uma função chamada translate_page(). Para traduzir uma página, podemos chamar esta função como:-

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

Ou podemos passar o parâmetro opcional include_subtree:-

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

E a função é definida 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

Eu tenho outra função chamada translate_snippet(). A única diferença é apenas o URL a ser enviado e nenhum parâmetro include_subtree.

Dicas sobre a árvore de páginas

Para todos os nossos sites, temos um script de configuração que preencherá automaticamente algumas postagens e sua tradução para que o desenvolvedor possa começar a trabalhar imediatamente, em vez de ter que criar páginas de amostra manualmente.

Nossa estrutura de página é assim:-

HomePage ==> BlogIndexPage ==> BlogPage

E o script de configuração fará o seguinte:-

  • Crie o usuário administrador root, vamos chamá-lo de usuário Um.
  • Criar instância da HomePage
  • Anexar HomePage como nova página raiz
  • Criar tradução japonesa da página inicial
  • Criar instância de BlogIndexPage
  • Preencher BlogPage com postagens de exemplo e anexe-as em BlogIndexPage
  • Traduzir BlogIndexPage com include_subtree=True

Tudo isso funciona bem até definirmos um novo site onde a estrutura da página é:-

BlogIndexPage ==> BlogPage

Então omitimos a HomePage (que acho uma má ideia agora, mas vamos guardá-la para outro tópico) já que este site é principalmente um blog. A primeira coisa que noto depois de executar o script de configuração é que nenhuma tradução das postagens do blog foi criada, apesar de já termos passado include_subtree ao traduzir BlogIndexPage.

Minha primeira reação instintiva foi que poderia haver algumas mudanças nas novas versões da alvéola. A maioria dos nossos sites foi criada há alguns anos e ainda está no wagtail 5, mas para este novo site, começaremos com o wagtail 6, pois é o mais recente.

Mas olhando os logs de commit do wagtail para simple_translation views.py, as últimas alterações no código foram há três anos. E podemos ver o código basicamente o mesmo entre a alvéola 5 e 6.

O problema com a função translate_page acima é que ela não verifica se há erros. Porque capturar erros significa que você precisa analisar a resposta da solicitação em busca de alguma string de erro. Mas rastrear o fluxo do código me leva a um estágio em que posso ver que o código não foi executado porque o formulário não foi validado.

A impressão de form.errors mostrou mensagens de erro relacionadas à localidade inválida. Isso é estranho porque podemos ver na função translate_page acima que estamos criando o locale se ele ainda não existir.

E imprimindo o self.fields["locales"].choices do formulário, o local está lá na escolha durante a primeira chamada de translate_page() ao traduzir a página raiz, mas as opções estavam vazias ao chamá-lo pela segunda vez para traduzir BlogIndexPage.

Lendo o código do formulário, as escolhas do campo locales são definidas dinamicamente no método __init__, onde será removido o locale da página que já foi traduzida. Esse pode ser o motivo pelo qual o código do idioma estava vazio na segunda chamada. Mas a página ainda não foi traduzida!

Vamos relembrar o processo:-

  • Criar páginaBlogIndex
  • Anexar BlogIndexPage à página raiz
  • Traduzir página raiz para ja
  • Preencher BlogPage e anexe-os a BlogIndexPage
  • Traduzir BlogIndexPage para ja

E foi aí que a lâmpada (?) entrou, depois de horas de depuração. No script original, estamos traduzindo HomePage para ja primeiro e depois para BlogIndexPage com todos os seus filhos. Mas neste novo script, a página raiz é BlogIndexPage. Então BlogIndexPage já foi traduzido pela segunda vez que chamamos de translate_page!

Então é por isso que as opções de localidade ficam vazias.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/k4ml/wagtail-programmaticamente-create-page-translation-2814?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3